Saturday, May 05, 2007

忙里偷闲解决了一个笔记本温度传感器的问题

自从内核从 2.6.16 升级到 2.6.18 之后, 笔记本的温度传感器工作不很正常,无法检测到 I2C 总线上的传感器,确切地说是 SMBus 总线控制器无法正常工作 [1]

后经过检查,认定是 ACPI DSDT 中 SMBL 字段导致的问题 [2],PCI 总线分配的 SMBus IO 空间为 0xe800 - 0xe81f 共 32 字节,而 ACPI BIOS DSDT 表中却有
Name (SMBS, 0xE800)
Name (SMBL, 0x10)
的字段,即,SMBus IO 空间长度 16 字节,使用 Intel ASL 编译器 (IASL) [3] 修改 DSDT 中 SMBL 为 0x20 并使用此定制 DSDT 后,问题被解决。[2]

此 问题刚刚初现的原因是 [4] 中补丁进入 Linux 内核之前,驱动申请该该 IO 区域长度是固定为 16 字节的,无论 PCI 总线给予多大空间,这样尽管 DSDT 和 PCI 总线不一致,但没有暴露出冲突,不过,自从新的内核采用了更灵活的地址空间确定方式后,此问题被暴露出来 [5]。这对于一般 的 ACPI BIOS 来说,不是一个常见问题,所以没有其他人报告过。

我已经将自己修改过的对应华硕 M2Ne 笔记本(M2400Ne, Intel Dophin Pentium M CPU, 855GM/ICH4) 0204 版本 BIOS 的 DSDT 上传至 Linux ACPI 网站 [6]

[1] http://lists.lm-sensors.org/pipermail/i2c/2007-May/001118.html
[2] http://lists.lm-sensors.org/pipermail/i2c/2007-May/001129.html
[3] http://www.intel.com/technology/IAPC/acpi/downloads.htm
[4] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=6dcc19dfbc84b2ea5428711b7a47146b5b1788bb
[5] http://lists.lm-sensors.org/pipermail/i2c/2007-May/001134.html
[6] http://acpi.sourceforge.net/dsdt/view.php?id=787

No comments: