2011-02-28

ACPI - DSDT

Extract from

在霧裡欣賞 BIOS 裡的 ACPI Description Table
http://fred-zone.blogspot.com/2008/10/bios-acpi-description-table.html

[..]
這意味著,ACPI 會依照不同作業系統而有不同的行為,可能有些功能在 Linux 下就會被關掉,亦或是因為會對記憶體位址做特殊存取,雖不會造成 Windows 任何影響,但卻可能剛好破壞掉 Linux Kernel 的運作,導致 boot/reboot 或 S3/S4 時會 hangs 或 crash。有時候缺少正確的 Return 值,也會造成 S3/S4 resume 的失敗。以下就是一個實際缺少 Return 導致 resume 不正常的例子,但我自行修正並補上正確的回傳值:

Method (_WAK, 1, NotSerialized)
{
...
...
Return(Package(0x02){0x00, 0x00})
}



如此遺漏而產生出來的 ACPI bugs 有非常多,在此也不便一一列舉,日後有時間再慢慢彙出來。不過,既然我們已經得到 DSDT,意味著只要有心,都可在此改寫並修正一些 ACPI 的問題。雖然我們並不能將修正過後的 DSDT 寫回 BIOS,但 Linux Kernel 編譯時若有開啟『CONFIG_ACPI_CUSTOM_DSDT』,就可以使用自定的 DSDT 取代原本機器上的 table,只要將檔案放到 /boot 下即可(在 Debian Lenny/Sid 上的 Kernel 似乎沒有開啟這項功能)。

將改好的 dsdt.dsl 重新 compile:

iasl -tc dsdt.dsl



此外若你是在 Ubuntu 下,請直接將編譯好的 dsdt.aml 放到 /etc/initramfs-tools 之下,再 update initrd:

sudo update-initramfs -c -k all



然後重開機後,便可使用自訂的 DSDT 來控制 ACPI 的行為。

[..]