2010/10/26

resume from suspend to ram on MSI U123

之前聽了 Ubuntu hardware summit 裡面有個講師提到suspend/resume issue,想到我的netbook 一直也有類似的問題,不過跟大家遇到的都不太一樣,試了幾個方式雖然最後還是失敗,還是在此作個記錄算是記念一下第一次trace kernel 的經驗。

因為我沒聽到第一堂(殘念),不過看了一下他的diary,他的問題是有插SD card時suspend 不進去,跟我的不太一樣,我的問題是suspend 進得去,但再按power key resume 時,就會先開起來(電源燈從閃爍變長亮),然後再斷電(電源燈暗掉,硬碟停止轉動),再開起來(電源燈亮起,硬碟開始轉動),然後就是永無止盡的black screen,按鍵沒有任何反應。

接下來只能強制重開機(電源鍵長按關機,放掉後再按電源鍵開機), 而且非常奇怪,第二次開起來時,也是一樣會先通電起一下,又斷電,才又重新啟動,只是第二次可以正常開進去....@@。不管是那版Ubuntu 都是一樣的狀況,只是目前我是用Ubuntu 10.04。

網上有看到DebuggingKernelSuspend,它說可以透過開啟pm_trace(echo 1 > /sys/power/pm_trace) 可以在resume 後在dmesg看到 "hash matches drivers/base/power/resume.c:46" 的字眼,但沒看到,只有如下的message 比較可疑

[    1.201543] sd 0:0:0:0: [sda] Attached SCSI disk
[    1.201631] PM: Resume from partition 8:6
[    1.201635] PM: Checking hibernation image.
[    1.208265] PM: Error -22 checking image file
[    1.208273] PM: Resume from disk failed.
[    1.208327] registered taskstats version 1
[    1.208935]   Magic number: 14:606:650
[    1.209053] processor LNXCPU:03: hash matches

然後S2ram 這個tool 好像也不錯,它已經把網路上常見的work around 加進去,如果很幸運在它的white list 上面有你的機種,表示可以照著它的建議去修改,如果沒有在white list上面,它也有很多建議,可以試看看,不過還是賤念,上面的方式都沒用。

因為suspend/resume 的問題百百种,其中有一种就是resume 後black screen,但是除此之外一切正常,所以是graphics card driver的問題,ACPI Suspend debugging 這邊有教怎麼驗証,其利用修改grub,加個 "init=/bin/bash" 讓Ubuntu 開進command line,在suspend/resume 後利用"find ." 來驗証,但依然和我無緣~ =.=凸

接下來同事介紹了一個好東西,因為suspend/resume 的問題,很多都是BIOS 的ASL code 有問題,這個工具 acpidump 可以直接取代掉BIOS 的DSDT(這裡有說明),還滿神奇的~ 我dump出來,然後轉成的dsl code  在這裡,另外這個是執行 iasl -sa DSDT.dsl 時出的warning(無 error).

以上測試的work around 都無效時,只好試著從kernel 的source code 加message 去印message,看看可不可以看出什麼東西,用apt-get 就可以抓到kernel ,再看裡面的README有教如何build kernel,但跟wiki上教的不一樣,不過改一下grub,不用initrd還是可以跑起來。

因為 The_machine_immediately_shuts_down_after_resume. 裡面說可能是power key event 送出來兩次,後來應該是改到
linux/drivers/acpi/sleep.c  -> acpi_suspend_enter() -> acpi_disable_all_gpes()

裡面將event register 清空。

另外我發現在 acpi_disable_all_gpes() 裡面有 ACPI_FUNCTION_TRACE(acpi_disable_all_gpes);
是根据CONFIG_ACPI_DEBUG_FUNC_TRACE 決定要不要印出來
但我在.confg裡將其enable ,還是沒有在dmesg or messages or kern.log 看到任何蛛絲馬跡...@@

接下來,我在 acpi_suspend_enter() 裡加了一堆 printk(KERN_EMERG "[261]enter acpi_suspend_enter\n"); 想看到底有沒有跑到這個function ,還是沒有在dmesg or messages or kern.log 看到任何訊息,真是太奇怪了!!!!!!!

以上,目前是處於放棄狀態,看看有沒有什麼新的想法再說...@@...
不過綜合上面,看來起很有可能是suspend 時,不知為何跑到 hibernation 去了,有空再研究...

沒有留言: