LINUX.ORG.RU

Вентилятор i8k убивается чем-то

 ,


0

1

Добрый день.

Ноутбук Dell Vostro 1540, Debian 8. При попытках контролировать вращения вентилятора через i8k изменение скорости вращения длится очень недолго (пара секунд ориентировочно), в dmesg ничего нового не пишет при этом. На Debian 7 повышение оборотов кулера было стабильным.

Решение из https://bugs.launchpad.net/i8kutils/ bug/410596 (запустите какую-то дикую прогу на асме, которая сделает что-то с вашим биосом) меня очень стремает. Зная, что на Debian 7 подобной проблемы не было, я вот думаю что какое-то решение должно быть.

Вывод sensors:

acpitz-virtual-0
Adapter: Virtual device
temp1:        +50.5°C  (crit = +87.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +50.0°C  (high = +80.0°C, crit = +90.0°C)
Core 2:       +49.0°C  (high = +80.0°C, crit = +90.0°C)

i8k-virtual-0
Adapter: Virtual device
Right Fan:      0 RPM
CPU:          +50.0°C  
temp2:        +52.0°C  
temp3:        +44.0°C  
temp4:        +16.0°C  

Вывод pwmconfig:

Found the following devices:
   hwmon0 is acpitz
   hwmon1 is coretemp
   hwmon2 is i8k

Found the following PWM controls:
   hwmon2/pwm2           current value: 0

Конфиг /etc/fancontrol

Common settings:
  INTERVAL=1

Settings for hwmon2/pwm2:
  Depends on hwmon2/temp2_input
  Controls hwmon2/fan2_input
  MINTEMP=20
  MAXTEMP=40
  MINSTART=255
  MINSTOP=0
  MINPWM=0
  MAXPWM=255

и вот собственно та программулина которую рекомендуют запустить (лежит в сорсах i8k)

/*
 * smm.c -- Utility to test SMM BIOS calls on Inspiron 8000 laptops
 *
 * Copyright (C) 2001  Massimo Dal Zotto <dz@debian.org>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * WARNING!!! READ CAREFULLY BEFORE USING THIS PROGRAM!!!
 *
 * THIS PROGRAM IS VERY DANGEROUS. IT CAN CRASH YOUR COMPUTER, DESTROY DATA
 * ON THE HARDISK, CORRUPT THE BIOS, PHYSICALLY DAMAGE YOUR HARDWARE AND
 * MAKE YOUR COMPUTER TOTALLY UNUSABLE.
 *
 * DON'T USE THIS PROGRAM UNLESS YOU REALLY KNOW WHAT YOU ARE DOING. I WILL
 * NOT BE RESPONSIBLE FOR ANY DIRECT OR INDIRECT DAMAGE CAUSED BY USING THIS
 * PROGRAM.
 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/io.h>

typedef struct {
        unsigned int eax;
        unsigned int ebx __attribute__ ((packed));
        unsigned int ecx __attribute__ ((packed));
        unsigned int edx __attribute__ ((packed));
        unsigned int esi __attribute__ ((packed));
        unsigned int edi __attribute__ ((packed));
} SMMRegisters;

static int
i8k_smm(SMMRegisters *regs)
{
    int rc;
    int eax = regs->eax;

    printf("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n",
	   regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi);

    asm("pushl %%eax\n\t" \
	"movl 0(%%eax),%%edx\n\t" \
	"push %%edx\n\t" \
	"movl 4(%%eax),%%ebx\n\t" \
	"movl 8(%%eax),%%ecx\n\t" \
	"movl 12(%%eax),%%edx\n\t" \
	"movl 16(%%eax),%%esi\n\t" \
	"movl 20(%%eax),%%edi\n\t" \
	"popl %%eax\n\t" \
	"out %%al,$0xb2\n\t" \
	"out %%al,$0x84\n\t" \
	"xchgl %%eax,(%%esp)\n\t"
	"movl %%ebx,4(%%eax)\n\t" \
	"movl %%ecx,8(%%eax)\n\t" \
	"movl %%edx,12(%%eax)\n\t" \
	"movl %%esi,16(%%eax)\n\t" \
	"movl %%edi,20(%%eax)\n\t" \
	"popl %%edx\n\t" \
	"movl %%edx,0(%%eax)\n\t" \
	"lahf\n\t" \
	"shrl $8,%%eax\n\t" \
	"andl $1,%%eax\n" \
	: "=a" (rc)
	: "a" (regs)
	: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");

    printf("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x %d\n\n",
	   regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi,
	   rc);

    if ((rc != 0) || ((regs->eax & 0xffff) == 0xffff) || (regs->eax == eax)) {
	return -EINVAL;
    }

    return 0;
}

int
main(int argc, char **argv)
{
    SMMRegisters regs = { 0, 0, 0, 0, 0, 0 };

    if (argc < 2) {
	fprintf(stderr, "Usage:  %s eax ebx ecx edx esi edi\n", argv[0]);
	exit(1);
    }

    if (argc > 1) regs.eax = strtol(argv[1],NULL,16);
    if (argc > 2) regs.ebx = strtol(argv[2],NULL,16);
    if (argc > 3) regs.ecx = strtol(argv[3],NULL,16);
    if (argc > 4) regs.edx = strtol(argv[4],NULL,16);
    if (argc > 5) regs.esi = strtol(argv[5],NULL,16);
    if (argc > 6) regs.edi = strtol(argv[6],NULL,16);

    ioperm(0x84, 1, 1);
    ioperm(0xb2, 1, 1);

    return (i8k_smm(&regs) != 0);
}

/* end of file */



Последнее исправление: ambivalentno (всего исправлений: 1)

Наверное, i8kmon из i8kutils работает и тоже устанавливает скорости вращения. Выключи его:

# insserv -r i8kmon
# service i8kmon stop
или
# systemctl disable i8kmon
# systemctl stop i8kmon

В ядре 3.2 из Debian Wheezy ещё не было поддержки интерфейсам pwm, поэтому fancontrol не работал.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

да, таки есть такое что без i8k плохо (после выключения сервиса i8kmon): пытаюсь запустить fancontrol:

Device name of hwmon2 has changed
Configuration appears to be outdated, please run pwmconfig again
запускаю pwmconfig:
/usr/sbin/pwmconfig: There are no pwm-capable sensor modules installed

может есть какой-то метод оставить i8k и убрать то говно, которое ему мешает работать?

ambivalentno
() автор топика
Ответ на: комментарий от ambivalentno

fancontrol все равно через ту же фигню контролировал что и i8kmon. так что ничего не получилось. все та же неровность (включения-выключения)

ambivalentno
() автор топика
Ответ на: комментарий от i-rinat
lsmod | grep i8k
i8k                    12913  0 

i8kmon в процессах нет сейчас, так как если есть - то возникает проблема, которую я и пытаюсь решить (прерывистый ритм вращения вентилятора).

ambivalentno
() автор топика
Ответ на: комментарий от ambivalentno

У тебя файл /etc/i8kmon.conf есть? Если нет, создай, запиши туда

set config(0) {{- 0} -1 45 -1 45}
set config(1) {{- 1} 40 65 40 65}
set config(2) {{- 2} 60 128 60 128}

«Соль, перец по вкусу». И запусти i8kmon снова.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Заменяю

set config(0)   {{-1 0}  -1  40  -1  40}
set config(1)   {{-1 1}  40  60  40  60}
set config(3)   {{-1 2}  60  128  60  128}

на вышеуказанное. никакой разниицы.

ambivalentno
() автор топика
Ответ на: комментарий от ambivalentno

Заменяю

Я думал, может у тебя совсем этого файла нет. Он же не создаётся при установке. Тогда без понятия, что происходит.

а в чем смысл делать пересекающиеся температурные зоны?

Чтобы гистерезис был. Допустим, у тебя температура увеличилась до 61⁰C. Включается вентилятор, охлаждает до 59°C, затем отключается. Нагрузка никуда не делась, поэтому процессор снова нагревается до 61°C, цикл повторяется до отвращения. С перекрывающимися зонами вентилятор включится только по достижении 65°C, а выключится, когда процессор охладится до 60°C.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Тут же проблема ключевая в том, чем вентилятор может контролироваться кроме i8k, и почему оно контролируется активнее чем в debian 7 :)

ambivalentno
() автор топика
Ответ на: комментарий от i-rinat

о. спасибо, не знал про эту штуку. буду прикручивать.

ambivalentno
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.