diff options
-rw-r--r-- | pm/HOWTO.hooks | 7 | ||||
-rw-r--r-- | pm/functions.in | 19 | ||||
-rwxr-xr-x | pm/sleep.d/20video | 67 | ||||
-rwxr-xr-x | pm/sleep.d/94cpufreq | 15 | ||||
-rwxr-xr-x | pm/sleep.d/99video | 110 | ||||
-rw-r--r-- | pm/sleep.d/Makefile.am | 1 | ||||
-rw-r--r-- | src/pm-action.in | 58 |
7 files changed, 124 insertions, 153 deletions
diff --git a/pm/HOWTO.hooks b/pm/HOWTO.hooks index 43fe40d..0ce10de 100644 --- a/pm/HOWTO.hooks +++ b/pm/HOWTO.hooks @@ -6,12 +6,19 @@ A pm-utils hook is simply an executable file that accepts a single parameter. For hooks in sleep.d, the potential values of that parameter are: suspend -- The hook MUST perform whatever action is appropriate when the system is preparing for S3 sleep (or its equivalent). +suspend_hybrid -- The hook MUST perform whatever action is appropriate + when entering suspend mode. The hook SHOULD also save + any state it may need to bring the system back from + hibernate mode. resume -- The hook MUST perform whatever action is appropriate when the system is coming out of suspend. hibernate -- The hook MUST perform whatever action is appropriate when the system is preparing for suspend-to-disk. thaw -- The hook MUST perform whatever action is appropriate when the system is coming out of suspend-to-disk. +help -- If your hook parses the PM_CMDLINE environment variable for switches, + this function SHOULD output text describing the parameters it parses + in a format easily understandable by an end-user. For hooks in power.d, the potential values of that parameter are: true -- the hook MUST perform whatever action is appropriate when the system diff --git a/pm/functions.in b/pm/functions.in index 82ff157..c9ce8fc 100644 --- a/pm/functions.in +++ b/pm/functions.in @@ -6,7 +6,6 @@ # for great debugging! [ "${PM_DEBUG}" = "true" ] && set -x - # try to take the lock. Fail if we cannot get it. try_lock() { @@ -80,7 +79,7 @@ _rmmod() touch "${STORAGEDIR}/module:$1" return 0 else - echo "# could not unload '$1', usage count was $2" + log "# could not unload '$1', usage count was $2" return 1 fi } @@ -136,7 +135,7 @@ if ! command_exists service; then shift "/etc/init.d/$svc" "$@" else - echo "$1" $": unrecognized service" 1>&2 + log "$1" $": unrecognized service" 1>&2 return 1 fi } @@ -162,10 +161,20 @@ disablehook() savestate() { - echo "$2" > "${STORAGEDIR}/state:$1" + if [ -n "$2" ]; then + echo "$2" > "${STORAGEDIR}/state:$1" + else + cat > "${STORAGEDIR}/state:$1" + fi } +state_exists() +{ + [ -O "${STORAGEDIR}/state:$1" ] +} + + restorestate() { - [ -O "${STORAGEDIR}/state:${1}" ] && cat "${STORAGEDIR}/state:${1}" + state_exists "$1" && cat "${STORAGEDIR}/state:$1" } diff --git a/pm/sleep.d/20video b/pm/sleep.d/20video deleted file mode 100755 index 668b519..0000000 --- a/pm/sleep.d/20video +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -# -# Copyright 2006-2007 Richard Hughes <richard@hughsie.com> -# Copyright 2007 Peter Jones <pjones@redhat.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of version 2 of the GNU General Public License as -# published by the Free Software Foundation. - -. "${PM_FUNCTIONS}" - -if command_exists vbetool; then - vbe() { vbetool "$@"; } -else - vbe() { echo "vbetool not found" 1>&2; return 1; } -fi - -if command_exists radeontool; then - radeon() { radeontool "$@"; } -else - radeon() { echo "radeontool not found" 1>&2; return 1; } -fi - -suspend_video() -{ - # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both - if [ "${DISPLAY_QUIRK_S3_BIOS}" = "true" -a \ - "${DISPLAY_QUIRK_S3_MODE}" = "true" ]; then - sysctl -w kernel.acpi_video_flags=3 - elif [ "${DISPLAY_QUIRK_S3_BIOS}" = "true" ]; then - sysctl -w kernel.acpi_video_flags=1 - elif [ "${DISPLAY_QUIRK_S3_MODE}" = "true" ]; then - sysctl -w kernel.acpi_video_flags=2 - else - sysctl -w kernel.acpi_video_flags=0 - fi - - # We might need to do one or many of these quirks - if [ "${DISPLAY_QUIRK_RADEON_OFF}" = "true" ]; then - radeon dac off - radeon light off - fi - if [ "${DISPLAY_QUIRK_VBESTATE_RESTORE}" = "true" ]; then - vbe vbestate save > /var/run/vbestate - fi - if [ "${DISPLAY_QUIRK_VBEMODE_RESTORE}" = "true" ]; then - vbe vbemode get > /var/run/vbemode - fi - if [ "${DISPLAY_QUIRK_VGA_MODE_3}" = "true" ]; then - vbe vbemode set 3 - fi - if [ "${DISPLAY_QUIRK_DPMS_SUSPEND}" = "true" ]; then - vbe dpms suspend - fi -} - - -case "$1" in - suspend*) - suspend_video - ;; - hibernate) - if [ "$HIBERNATE_RESUME_POST_VIDEO" = "yes" ]; then - suspend_video - fi - ;; -esac diff --git a/pm/sleep.d/94cpufreq b/pm/sleep.d/94cpufreq index 9157fb4..cfb0c60 100755 --- a/pm/sleep.d/94cpufreq +++ b/pm/sleep.d/94cpufreq @@ -7,12 +7,17 @@ hibernate_cpufreq() { ( cd /sys/devices/system/cpu/ - for x in cpu[0-9]*/cpufreq/scaling_governor ; do - [ -f "$x" ] || continue + for x in cpu[0-9]*; do + # if cpufreq is a symlink, it is handled by another cpu. Skip. + [ -L "$x/cpufreq" ] && continue + gov="$x/cpufreq/scaling_governor" + # if we do not have a scaling_governor file, skip. + [ -f "$gov" ] || continue + # if our temporary governor is not available, skip. grep -q "$TEMPORARY_CPUFREQ_GOVERNOR" \ - "${x%/*}/scaling_available_governors" || continue - savestate "${x%%/*}_governor" $(cat "$x") - echo "$TEMPORARY_CPUFREQ_GOVERNOR" > "$x" + "$x/cpufreq/scaling_available_governors" || continue + savestate "${x}_governor" $(cat "$gov") + echo "$TEMPORARY_CPUFREQ_GOVERNOR" > "$gov" done ) } diff --git a/pm/sleep.d/99video b/pm/sleep.d/99video index cdf2bc8..1dc88bd 100755 --- a/pm/sleep.d/99video +++ b/pm/sleep.d/99video @@ -9,6 +9,26 @@ . "${PM_FUNCTIONS}" +for opt in $PM_CMDLINE; do + [ "${opt#--quirk-}" = "$opt" ] && continue # not one we care about. + case "${1##--quirk-}" in # just quirks, please + dpms-on) QUIRK_DPMS_ON="true" ;; + dpms-suspend) QUIRK_DPMS_SUSPEND="true" ;; + radeon-off) QUIRK_RADEON_OFF="true" ;; + reset-brightness) QUIRK_RESET_BRIGHTNESS="true" ;; + s3-bios) QUIRK_S3_BIOS="true" ;; + s3-mode) QUIRK_S3_MODE="true" ;; + vbe-post) QUIRK_VBE_POST="true" ;; + vbemode-restore) QUIRK_VBEMODE_RESTORE="true" ;; + vbestate-restore) QUIRK_VBESTATE_RESTORE="true" ;; + vga-mode3) QUIRK_VGA_MODE_3="true" ;; + none) QUIRK_NONE="true" ;; + *) continue ;; + esac + shift +done + + reset_brightness() { for bl in /sys/class/backlight/* ; do @@ -49,44 +69,80 @@ resume_fbcon() done } +# Some tiny helper functions for quirk handling +quirk() { [ "$1" = "true" ] && [ -z $QUIRK_NONE ]; } + +# save/restore vbe state +vbe_savestate() { vbe vbestate save |savestate vbestate; } +vbe_restorestate() { restorestate vbestate |vbe vbestate restore; } + +# save/restore the vbe mode +vbe_savemode() { vbe vbemode get |savestate vbemode; } +vbe_restoremode() { vbe vbemode get |savestate vbemode; } + +# post the video card +vbe_post() { vbe post; sleep 0.1; } + +# turn critical bits of radeon cards off/on +radeon_off() { radeon dac off; radeon light off; } +radeon_on() { radeon dac on; radeon light on; } + +suspend_video() +{ + # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both + local acpi_flag=0 + [ "${QUIRK_S3_BIOS}" = "true" ] && acpi_flag=$(($acpi_flag + 1)) + [ "${QUIRK_S3_MODE}" = "true" ] && acpi_flag=$(($acpi_flag + 2)) + sysctl -w kernel.acpi_video_flags=$acpi_flag + + quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_savestate + quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_savemode + quirk "${QUIRK_RADEON_OFF}" && radeon_off + quirk "${QUIRK_VGA_MODE_3}" && vbe vbemode set 3 + quirk "${QUIRK_DPMS_SUSPEND}" && vbe dpms suspend + save_fbcon # there should be a quirk, but HAL does not pass it. +} resume_video() { - if [ "${DISPLAY_QUIRK_RADEON_OFF}" = "true" ]; then - radeon dac on - radeon light on - fi # We might need to do one or many of these quirks - if [ "${DISPLAY_QUIRK_VBE_POST}" = "true" ]; then - vbe post - sleep 0.1 - fi - if [ "${DISPLAY_QUIRK_VBESTATE_RESTORE}" = "true" ]; then - vbe vbestate restore < /var/run/vbestate - fi - if [ "${DISPLAY_QUIRK_VBEMODE_RESTORE}" = "true" ]; then - vbe vbemode set "$(cat /var/run/vbemode)" - fi - # based on data from s2ram - resume_fbcon - if [ "${DISPLAY_QUIRK_DPMS_ON}" = "true" ]; then - vbe dpms on - fi - if [ "${DISPLAY_QUIRK_RESET_BRIGHTNESS}" = "true" ]; then - reset_brightness - fi + quirk "${QUIRK_VBE_POST}" && vbe_post + quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_restorestate + quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_restoremode + resume_fbcon # also should be handled by a quirk. + quirk "${QUIRK_RADEON_OFF}" && radeon_on + quirk "${QUIRK_DPMS_ON}" && vbe dpms on + quirk "${QUIRK_RESET_BRIGHTNESS}" && reset_brightness } +help() { + echo # first echo makes it look nicer. + echo "Video quirk handler options:" + echo + echo " --quirk-dpms-on" + echo " --quirk-dpms-suspend" + echo " --quirk-radeon-off" + echo " --quirk-reset-brightness" + echo " --quirk-s3-bios" + echo " --quirk-s3-mode" + echo " --quirk-vbe-post" + echo " --quirk-vbemode-restore" + echo " --quirk-vbestate-restore" + echo " --quirk-vga-mode3" + echo " --quirk-none" +} case "$1" in - suspend*) - save_fbcon - ;; - resume) - resume_video + suspend*) suspend_video ;; + hibernate) + if [ "$HIBERNATE_RESUME_POST_VIDEO" = "yes" ]; then + suspend_video + fi ;; + resume) resume_video ;; thaw) if [ "${HIBERNATE_RESUME_POST_VIDEO}" = "yes" ]; then resume_video fi ;; + help) help ;; esac diff --git a/pm/sleep.d/Makefile.am b/pm/sleep.d/Makefile.am index 256ee0b..7efbc81 100644 --- a/pm/sleep.d/Makefile.am +++ b/pm/sleep.d/Makefile.am @@ -5,7 +5,6 @@ sleep_SCRIPTS = \ 01grub \ 05led \ 10NetworkManager \ - 20video \ 49bluetooth \ 50modules \ 55battery \ diff --git a/src/pm-action.in b/src/pm-action.in index 32525c8..3359a1b 100644 --- a/src/pm-action.in +++ b/src/pm-action.in @@ -26,25 +26,17 @@ # The rule here? Simplicity. -help_options() +. "@PM-UTILS-LIBDIR@/pm-functions" + +# save the command line parameters for the hooks. +export PM_CMDLINE="$*" +help() { echo "${0##*/} [options]" echo - echo "Options can change how the supend or hibernate is done." - echo - echo "Possible actions are:" - echo - echo " --quirk-dpms-on" - echo " --quirk-dpms-suspend" - echo " --quirk-radeon-off" - echo " --quirk-reset-brightness" - echo " --quirk-s3-bios" - echo " --quirk-s3-mode" - echo " --quirk-vbe-post" - echo " --quirk-vbemode-restore" - echo " --quirk-vbestate-restore" - echo " --quirk-vga-mode3" - echo + echo "Options can change how suspend or hibernate is done." + run_hooks sleep help + exit 0 } if [ -n "$EUID" -a "$EUID" != "0" ]; then @@ -52,41 +44,13 @@ if [ -n "$EUID" -a "$EUID" != "0" ]; then exit 1 fi -# Get the command line options +# Save the command line options for the hooks while [ $# -gt 0 ] do - case "$1" in - --quirk-dpms-on) - export DISPLAY_QUIRK_DPMS_ON="true" ;; - --quirk-dpms-suspend) - export DISPLAY_QUIRK_DPMS_SUSPEND="true" ;; - --quirk-radeon-off) - export DISPLAY_QUIRK_RADEON_OFF="true" ;; - --quirk-reset-brightness) - export DISPLAY_QUIRK_RESET_BRIGHTNESS="true" ;; - --quirk-s3-bios) - export DISPLAY_QUIRK_S3_BIOS="true" ;; - --quirk-s3-mode) - export DISPLAY_QUIRK_S3_MODE="true" ;; - --quirk-vbe-post) - export DISPLAY_QUIRK_VBE_POST="true" ;; - --quirk-vbemode-restore) - export DISPLAY_QUIRK_VBEMODE_RESTORE="true" ;; - --quirk-vbestate-restore) - export DISPLAY_QUIRK_VBESTATE_RESTORE="true" ;; - --quirk-vga-mode3) - export DISPLAY_QUIRK_VGA_MODE_3="true" ;; - --help) - help_options - exit 0 ;; - *) - break ;; # terminate while loop - esac + [ "$1" = "--help" ] && help shift done -. "@PM-UTILS-LIBDIR@/pm-functions" - ACTION="$(echo ${0##*pm-} |tr - _)" case "$ACTION" in @@ -97,8 +61,6 @@ case "$ACTION" in exit 1 ;; esac -export PM_CMDLINE="$@" - "check_$ACTION" || { echo "System does not support $ACTION sleep."; exit 1; } take_suspend_lock || exit 1 |