Difference between revisions of "How to make ACPI work"

From ThinkWiki
Jump to: navigation, search
(using SoftwareSuspend2)
(using swsusp)
Line 82: Line 82:
 
To suspend you can either do a simple {{cmdroot|echo -n 4 > /proc/acpi/sleep}} (recommended) or use the [http://softwaresuspend.berlios.de/old-site/swsusp/sysvinit-2.76-v2-for_swsusp-v5.tar.gz patched SysVInit] and call {{cmdroot|swsusp}} or {{cmdroot|shutdown -z now}}.
 
To suspend you can either do a simple {{cmdroot|echo -n 4 > /proc/acpi/sleep}} (recommended) or use the [http://softwaresuspend.berlios.de/old-site/swsusp/sysvinit-2.76-v2-for_swsusp-v5.tar.gz patched SysVInit] and call {{cmdroot|swsusp}} or {{cmdroot|shutdown -z now}}.
  
Ideally you would do this from a script like <tt>/etc/acpi/actions/hibernate.sh</tt>. It has proven to be a good idea to shutdown the following processes/drivers within the script before you do the actual suspend.
+
Ideally you would do this from a script like {{path|/etc/acpi/actions/hibernate.sh}}. It has proven to be a good idea to shutdown the following processes/drivers within the script before you do the actual suspend.
 
*any running mysql server
 
*any running mysql server
 
*the linuxant driver may require stopping in a acpi script as well. {{cmdroot|dldrstop}} does the trick.
 
*the linuxant driver may require stopping in a acpi script as well. {{cmdroot|dldrstop}} does the trick.

Revision as of 09:58, 20 July 2005

general

Kernel configuration

First of all you'll have to enable ACPI support in your kernel (if your distro doesn't already have an ACPI enabled kernel). To do this open your kernel config, go to Power management options, enable Power Management support, go to ACPI and enable the needed options. You'd most likely want to enable Sleep States, AC Adapter, Battery, Fan, Processor and Thermal Zone. Then recompile your kernel.

If you prefer editing your .config file directly, you should set at least the following variables:

CONFIG_PM=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_SLEEP_PROC_FS=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_BUS=y
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y

IBM specific ACPI driver

Unfortunately, special drivers for ACPI on ThinkPads were not included with kernels prior 2.6.10.
So you'll have to compile one yourself or get it as precompiled module for your kernel.
You have the choice between thinkpad-acpi and ibm-acpi, with the latter being the recommended one.
If you use a post-2.6.10 kernel and you want to use ibm-acpi, it is recommended to look on its projects page for a possibly newer version.
In general it is a good idea to read the README included with the driver.

ACPI daemon

Also you'll need to install acpid, if it isn't present on your system. acpid is a daemon that handles the ACPI events generated by the system. Read How to configure acpid.

Screen blanking (Standby)

Make sure you have

Option "DPMS"

in the Monitor section of your XF86Config/xorg.conf.

Running {{{2}}} xset +dpms and then {{{2}}} xset dpms force off will turn off the backlight on a laptop screen.

Note that this may not work in combination with {{{2}}} echo -n "mem" > /sys/power/state because switching to console causes the backlight to come back on before sleeping.

Suspend to RAM (Sleep)

ACPI Sleep/suspend-to-ram with recent 2.6.x kernels usually works fine. Have a look at the acpid configuration HOWTO. It includes a specific example for going to sleep on lid close.

The following glitches may or may not occur in relation to suspending to RAM:

  • With a 2.6.9 or 2.6.10 kernel, when resuming from a suspend-to-ram the display might remain black (the system is still rebootable via ctrl-alt-del). This can be fixed by adding acpi_sleep=s3_bios to the kernel boot parameters. It seems this problem is solved in 2.6.11-rc1.
  • When your system is equiped with a Radeon Mobility graphic controller your LCD backlight may not turn off automatically. Use radeontool to switch off your backlight prior suspend in your sleep action script.
  • Also, you might want to take note of the Problem with high power drain in ACPI sleep.
  • You may experience problems when using # echo standby > /sys/power/state (machine goes to sleep and wakes up immediately). This can be avoided by using # echo -n 3 >/proc/acpi/sleep to get it to sleep. This can be also happen if hotplug daemon is still running.
  • Problems with the serial port of the port replicator after the wake up from ram have also been experienced.
  • Crash on resume
    • ...when using ATI proprietary drivers can be solved by using vbetool.
    • ...might be solved by disabling APIC (@Processor type and features) in the kernel configuration
  • If your suspend is failing, and a tail of /var/log/acpid shows "Permission denied" errors, be sure that your new ACPI event and action scripts have the appropriate permissions
  • Due to the fact that Sonoma chipset based laptops (T43, T43p) utilize the SATA layer for disk access and SATA does not have power-management support yet Suspend to RAM does not work on these machines. However, Jens Axboe's patch ([1] LKML posting) provides SATA power-management support and makes Suspend to RAM work on the T43 at least. (Tested on 2.6.12rc6 which the patch applies to with some offsets. T43p not tested but should work as well. X41: reboot after wake up.)

Suspend to disk (Hibernate)

There are two drivers for this available:

  • swsusp, which is in the kernel and
  • SoftwareSuspend2 which is more feature rich, but not yet in the kernel, so you have to patch it in yourself

Both are reported to work fine as long as you use open-source graphic drivers. A comparison of the features can be found on this page.

Just in case you are in doubt...yes, it is safe in both cases to use the same swap partition as active swap and as suspend partition.

using swsusp

Software Suspend (swsusp) is included in the 2.6 kernel series. It seems like no patches for 2.4 kernels are available.

To enable it, go to Power management options and enable Power management support and Software Suspend in the kernel config menu. You'll also want to give the swap partition to suspend to in Default resume partition.

In case you prefer to edit your config file directly, you should have the following three entries look like here...

CONFIG_PM=y
CONFIG_SOFTWARE_SUSPEND=y
CONFIG_PM_STD_PARTITION="/dev/resume_partition"

...where /dev/resume_partition needs to be replaced by the swap partition you want to use for suspending. (Use # fdisk -l /dev/hda if unsure.)

You can override the default resume partition anytime by giving resume=/dev/resume_partition as kernel boot parameter. Also, in case you suspended, but want to boot up normally (without resuming from the saved image - loosing all data that was unsaved at suspend time), you can give the noresume kernel boot parameter.

To suspend you can either do a simple # echo -n 4 > /proc/acpi/sleep (recommended) or use the patched SysVInit and call # swsusp or # shutdown -z now.

Ideally you would do this from a script like /etc/acpi/actions/hibernate.sh. It has proven to be a good idea to shutdown the following processes/drivers within the script before you do the actual suspend.

  • any running mysql server
  • the linuxant driver may require stopping in a acpi script as well. # dldrstop does the trick.

Afterwards you might want to enable them again, as well as run a script that does necessary configurations according to the ac power state. Furthermore, the system clock is not readjusted automatically, so you will probably also want the do that from that script (i.e. by restarting your systemclock bootup script).

If the sound output is silent after resume, these commands might help to get sound to work again without reloading any modules:

amixer set Master mute >/dev/null 2>&1
amixer set PCM mute >/dev/null 2>&1
amixer set Master unmute >/dev/null 2>&1
amixer set PCM unmute >/dev/null 2>&1

Finally you should take note that swsusp does not set the ACPI S4 state. Instead it goes to S5. This means that the machine itself doesn't know that it was suspend rather than shutdown. Hence you can i.e. boot a parallel installed other operating system and resume your linux session later, as long as you don't touch the swap partition the image was saved to.

using SoftwareSuspend2

First apply Software Suspend 2 patches from http://softwaresuspend.berlios.de/ if they are not already in your kernel. I am running 2.6.11-rc4-nitro in a Thinkpad T30 2366.

Be sure to also read the http://softwaresuspend.berlios.de/HOWTO.html

These are the options for the kernel. You can change the /dev/hda5 to your swap partition

# Software Suspend 2
CONFIG_SOFTWARE_SUSPEND2=y
CONFIG_SOFTWARE_SUSPEND2_BUILTIN=y
CONFIG_SOFTWARE_SUSPEND_SWAPWRITER=y
CONFIG_SOFTWARE_SUSPEND_LZF_COMPRESSION=y
CONFIG_SOFTWARE_SUSPEND_TEXT_MODE=y
CONFIG_SOFTWARE_SUSPEND_DEFAULT_RESUME2="/dev/hda5"
# CONFIG_SOFTWARE_SUSPEND_KEEP_IMAGE is not set
CONFIG_SOFTWARE_SUSPEND_CHECK_RESUME_SAFE=y
# CONFIG_SOFTWARE_SUSPEND_DEBUG is not set
# CONFIG_SOFTWARE_SUSPEND_DEVELOPER is not set

Next, compile and install the kernel

In the meantime, add the following to the kernel parameters resume2=swap:/dev/hda5. Again change /dev/hda5 to your swap partition.

Install the hibernation script

For Gentoo users: emerge hibernate-script
For Fedora Core users: kernel and hibernate RPMs are available at http://mhensler.de/swsusp/
For all other users, check the home page for packages (deb, i386 rpm, tgz, and source rpm) from http://softwaresuspend.berlios.de/

Debian users using initrd image, make sure you copy swsusp-initrd.sh script to your /etc/mkinitrd/scripts directory before creating initrd image.

Restart using the new kernel and run the script to test it out. /usr/sbin/hibernate