Добрый день.
Ноутбук 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(®s) != 0);
}
/* end of file */