Suspend/Resume on a Lenovo T61 Running Ubuntu 8.04
As I've discussed before, I have a Lenovo T61 laptop with a Nvidia Nv140m video card running Ubuntu 8.04 (Hardy Heron). With the proprietary "nvidia" video driver, suspend/resume works fine. However, I use the open source "nv" driver as it supports xrandr which I need to hotdock my machine. The laptop fails to fully resume when running "nv": the screen is black; the keyboard and mouse are unresponsive.
The T61 thinkwiki pages for Ubuntu 8.04 and 7.10, the hal sleep quirk page and David Goodlad's post helped identify the root problem.
First, gnome-power-manager has taken over suspend/resume duty from acpid in 8.04 -- so the changes I had made to /etc/default/acpi-support are no longer used. Secondly, as David noted, the nv driver requires the s3_bios and vbemode_restore video quirk settings. However, my many attempts to edit /usr/share/hal/fdi/information/10freedesktop/20-video-quirk-pm-lenovo.fdi so that hal would set these particular quirks for my hardware failed. (The thinkwiki page has complaints from people who could not get hal to recognize their edits as well -- does anybody definitively know how to edit these files?) I resorted to adding these lines to my /etc/rc.local file:
hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.s3_bios --bool true hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.s3_mode --bool false hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.vbemode_restore --bool true
For the record, hal reports my hardware model as:
# hal-device | grep system.hardware ... system.hardware.vendor = 'LENOVO' (string) system.hardware.product = '6459CTO' (string) system.hardware.version = 'ThinkPad T61' (string)
And finally, now hal reports my quirk settings as:
# lshal | grep quirk power_management.quirk.s3_bios = true (bool) power_management.quirk.s3_mode = false (bool) power_management.quirk.save_pci = true (bool) power_management.quirk.vbemode_restore = true (bool)
Suspend/resume functionality has been resumed (ugh) for me.
As an aside, hibernate works now too. It did not work in 7.10. I don't know if these changes fixed it, or if the upgrade to 8.04 did the trick.
Update 2008/09/04: After reading the HAL spec, I discovered that the /etc/hal/fdi/information directory is where an administrator should drop custom device information for the system. Settings in this location will override the /usr/share/hal/fdi/information data. Looking there, I discovered Ubuntu had already created a lenovo.fdi file. Editing the file to look like below fixed suspend:
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<device>
<match key="system.hardware.vendor" string="LENOVO">
<!-- Ubuntu default settings: good for nvidia driver
<merge key="power_management.quirk.s3_mode" type="bool">true</merge>
<merge key="power_management.quirk.s3_bios" type="bool">false</merge>
<merge key="power_management.quirk.save_pci" type="bool">true</merge>
-->
<!-- My settings: good for the nv driver -->
<merge key="power_management.quirk.s3_bios" type="bool">true</merge>
<merge key="power_management.quirk.save_pci" type="bool">true</merge>
<merge key="power_management.quirk.vbemode_restore" type="bool">true</merge>
<merge key="power_management.quirk.s3_mode" type="bool">false</merge>
</match>
</device>
</deviceinfo>