参见 linux 版面文章,多谢 loseweigh
下面是解决的结果,也是给华硕技术支持的信:
希望华硕修正 BIOS (ACPI DSDT) 中的一个问题。
您好,我是一位华硕 M2Ne 笔记本用户,同时也是一个 Linux 用户,发现近期此笔记本的温度传感器工作不很正常,确切地说是 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 来说,不是一个常见问题,新的更灵活的地址确定方式更适应驱动的发展 (Intel ICH 早期 SMBus 总线控制器地址空间为 8 字节,随后从 ICH4 开始为 16 字节,将来可能会有更新发展),而地址长度固定写在代码里被摒弃是驱动程序发展的趋势,驱动程序向后退化是不可能的。因此修改 DSDT 是比修改内核代码更为合理的解决方法。
我已经将自己修改过的对应 0204 版本 BIOS 的 DSDT 上传至 Linux ACPI 网站 [6],不过,加载定制 DSDT 对于初学用户并不是一个容易做到的工作,需要为内核打补丁并重新配置、编译,并且,也不是所有用户都可以根据温度传感器问题找到这个 DSDT 并使用,更方便的方法还是华硕公司可以更新 BIOS,修正 DSDT。
谢谢
[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