1*4882a593SmuzhiyunFrom 338c2cab495d3d3d62cb7094b7dad78aea7f53eb Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Yu YongZhen <yuyz@rock-chips.com> 3*4882a593SmuzhiyunDate: Wed, 25 Apr 2018 09:25:18 +0800 4*4882a593SmuzhiyunSubject: [PATCH] pm:sleep.d: remove unused sleep hooks 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun--- 7*4882a593Smuzhiyun pm/sleep.d/00powersave | 13 -- 8*4882a593Smuzhiyun pm/sleep.d/01grub | 34 --- 9*4882a593Smuzhiyun pm/sleep.d/49bluetooth | 35 --- 10*4882a593Smuzhiyun pm/sleep.d/55NetworkManager | 42 ---- 11*4882a593Smuzhiyun pm/sleep.d/75modules | 31 --- 12*4882a593Smuzhiyun pm/sleep.d/90clock | 27 --- 13*4882a593Smuzhiyun pm/sleep.d/94cpufreq | 46 ---- 14*4882a593Smuzhiyun pm/sleep.d/95led | 16 -- 15*4882a593Smuzhiyun pm/sleep.d/98video-quirk-db-handler | 450 ------------------------------------ 16*4882a593Smuzhiyun pm/sleep.d/99video | 219 ------------------ 17*4882a593Smuzhiyun pm/sleep.d/Makefile.am | 12 +- 18*4882a593Smuzhiyun pm/sleep.d/Makefile.in | 12 +- 19*4882a593Smuzhiyun 12 files changed, 2 insertions(+), 935 deletions(-) 20*4882a593Smuzhiyun delete mode 100644 pm/sleep.d/00powersave 21*4882a593Smuzhiyun delete mode 100644 pm/sleep.d/01grub 22*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/49bluetooth 23*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/55NetworkManager 24*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/75modules 25*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/90clock 26*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/94cpufreq 27*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/95led 28*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/98video-quirk-db-handler 29*4882a593Smuzhiyun delete mode 100755 pm/sleep.d/99video 30*4882a593Smuzhiyun 31*4882a593Smuzhiyundiff --git a/pm/sleep.d/00powersave b/pm/sleep.d/00powersave 32*4882a593Smuzhiyundeleted file mode 100644 33*4882a593Smuzhiyunindex bf0f98b..0000000 34*4882a593Smuzhiyun--- a/pm/sleep.d/00powersave 35*4882a593Smuzhiyun+++ /dev/null 36*4882a593Smuzhiyun@@ -1,13 +0,0 @@ 37*4882a593Smuzhiyun-#!/bin/sh 38*4882a593Smuzhiyun- 39*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 40*4882a593Smuzhiyun- 41*4882a593Smuzhiyun-command_exists pm-powersave || exit $NA 42*4882a593Smuzhiyun- 43*4882a593Smuzhiyun-case $1 in 44*4882a593Smuzhiyun- suspend|hibernate) pm-powersave false ;; 45*4882a593Smuzhiyun- resume|thaw) pm-powersave ;; 46*4882a593Smuzhiyun- *) exit $NA ;; 47*4882a593Smuzhiyun-esac 48*4882a593Smuzhiyun-exit 0 49*4882a593Smuzhiyun- 50*4882a593Smuzhiyun\ No newline at end of file 51*4882a593Smuzhiyundiff --git a/pm/sleep.d/01grub b/pm/sleep.d/01grub 52*4882a593Smuzhiyundeleted file mode 100644 53*4882a593Smuzhiyunindex db1d53b..0000000 54*4882a593Smuzhiyun--- a/pm/sleep.d/01grub 55*4882a593Smuzhiyun+++ /dev/null 56*4882a593Smuzhiyun@@ -1,34 +0,0 @@ 57*4882a593Smuzhiyun-#!/bin/sh 58*4882a593Smuzhiyun-# Ensure grub will load the correct kernel on resume from hibernate, 59*4882a593Smuzhiyun-# TODO: This is rather redhat specific, and very grub specific. 60*4882a593Smuzhiyun- 61*4882a593Smuzhiyun-default_resume_kernel() 62*4882a593Smuzhiyun-{ 63*4882a593Smuzhiyun- [ "$1" = "suspend" ] && return $NA 64*4882a593Smuzhiyun- case $(uname -m) in 65*4882a593Smuzhiyun- i?86|x86_64|athlon) 66*4882a593Smuzhiyun- ;; 67*4882a593Smuzhiyun- *) # this is only valid for x86 and x86_64 68*4882a593Smuzhiyun- return $NA 69*4882a593Smuzhiyun- ;; 70*4882a593Smuzhiyun- esac 71*4882a593Smuzhiyun- 72*4882a593Smuzhiyun- [ -x /sbin/grubby -a -x /sbin/grub ] || return $NA 73*4882a593Smuzhiyun- [ -e "/boot/vmlinuz-$(uname -r)" ] || return 1 74*4882a593Smuzhiyun- out=$(/sbin/grubby --info /boot/vmlinuz-$(uname -r) |grep index) 75*4882a593Smuzhiyun- [ -n "${out}" ] || return 1 76*4882a593Smuzhiyun- current=${out#index=} 77*4882a593Smuzhiyun- echo "savedefault --default=${current} --once" | \ 78*4882a593Smuzhiyun- /sbin/grub --device-map=/boot/grub/device.map \ 79*4882a593Smuzhiyun- --batch --no-floppy --no-curses >/dev/null 80*4882a593Smuzhiyun- 81*4882a593Smuzhiyun- return 0 82*4882a593Smuzhiyun-} 83*4882a593Smuzhiyun- 84*4882a593Smuzhiyun-case "$1" in 85*4882a593Smuzhiyun- hibernate|suspend) 86*4882a593Smuzhiyun- default_resume_kernel $2 87*4882a593Smuzhiyun- ;; 88*4882a593Smuzhiyun- *) exit $NA 89*4882a593Smuzhiyun- ;; 90*4882a593Smuzhiyun-esac 91*4882a593Smuzhiyundiff --git a/pm/sleep.d/49bluetooth b/pm/sleep.d/49bluetooth 92*4882a593Smuzhiyundeleted file mode 100755 93*4882a593Smuzhiyunindex d46ba49..0000000 94*4882a593Smuzhiyun--- a/pm/sleep.d/49bluetooth 95*4882a593Smuzhiyun+++ /dev/null 96*4882a593Smuzhiyun@@ -1,35 +0,0 @@ 97*4882a593Smuzhiyun-#!/bin/sh 98*4882a593Smuzhiyun-# IBM specific hack to disable/enable bluetooth. 99*4882a593Smuzhiyun-# TODO: Doesn't the working USB suspend/resume functionality 100*4882a593Smuzhiyun-# make this code more or less obsolete? 101*4882a593Smuzhiyun- 102*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 103*4882a593Smuzhiyun- 104*4882a593Smuzhiyun-[ -f /proc/acpi/ibm/bluetooth ] || exit $NA 105*4882a593Smuzhiyun- 106*4882a593Smuzhiyun-suspend_bluetooth() 107*4882a593Smuzhiyun-{ 108*4882a593Smuzhiyun- if grep -q enabled /proc/acpi/ibm/bluetooth; then 109*4882a593Smuzhiyun- savestate ibm_bluetooth enable 110*4882a593Smuzhiyun- echo disable > /proc/acpi/ibm/bluetooth 111*4882a593Smuzhiyun- else 112*4882a593Smuzhiyun- savestate ibm_bluetooth disable 113*4882a593Smuzhiyun- fi 114*4882a593Smuzhiyun-} 115*4882a593Smuzhiyun- 116*4882a593Smuzhiyun-resume_bluetooth() 117*4882a593Smuzhiyun-{ 118*4882a593Smuzhiyun- state_exists ibm_bluetooth || return 119*4882a593Smuzhiyun- restorestate ibm_bluetooth > /proc/acpi/ibm/bluetooth 120*4882a593Smuzhiyun-} 121*4882a593Smuzhiyun- 122*4882a593Smuzhiyun-case "$1" in 123*4882a593Smuzhiyun- hibernate|suspend) 124*4882a593Smuzhiyun- suspend_bluetooth 125*4882a593Smuzhiyun- ;; 126*4882a593Smuzhiyun- thaw|resume) 127*4882a593Smuzhiyun- resume_bluetooth 128*4882a593Smuzhiyun- ;; 129*4882a593Smuzhiyun- *) exit $NA 130*4882a593Smuzhiyun- ;; 131*4882a593Smuzhiyun-esac 132*4882a593Smuzhiyundiff --git a/pm/sleep.d/55NetworkManager b/pm/sleep.d/55NetworkManager 133*4882a593Smuzhiyundeleted file mode 100755 134*4882a593Smuzhiyunindex f3c6df5..0000000 135*4882a593Smuzhiyun--- a/pm/sleep.d/55NetworkManager 136*4882a593Smuzhiyun+++ /dev/null 137*4882a593Smuzhiyun@@ -1,42 +0,0 @@ 138*4882a593Smuzhiyun-#!/bin/sh 139*4882a593Smuzhiyun-# If we are running NetworkManager, tell it we are going to sleep. 140*4882a593Smuzhiyun-# TODO: Make NetworkManager smarter about how to handle sleep/resume 141*4882a593Smuzhiyun-# If we are asleep for less time than it takes for TCP to reset a 142*4882a593Smuzhiyun-# connection, and we are assigned the same IP on resume, we should 143*4882a593Smuzhiyun-# not break established connections. Apple can do this, and it is 144*4882a593Smuzhiyun-# rather nifty. 145*4882a593Smuzhiyun- 146*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 147*4882a593Smuzhiyun- 148*4882a593Smuzhiyun-suspend_nm() 149*4882a593Smuzhiyun-{ 150*4882a593Smuzhiyun- # Tell NetworkManager to shut down networking 151*4882a593Smuzhiyun- printf "Having NetworkManager put all interaces to sleep..." 152*4882a593Smuzhiyun- dbus_send --system \ 153*4882a593Smuzhiyun- --dest=org.freedesktop.NetworkManager \ 154*4882a593Smuzhiyun- /org/freedesktop/NetworkManager \ 155*4882a593Smuzhiyun- org.freedesktop.NetworkManager.sleep && \ 156*4882a593Smuzhiyun- echo Done. || echo Failed. 157*4882a593Smuzhiyun-} 158*4882a593Smuzhiyun- 159*4882a593Smuzhiyun-resume_nm() 160*4882a593Smuzhiyun-{ 161*4882a593Smuzhiyun- # Wake up NetworkManager and make it do a new connection 162*4882a593Smuzhiyun- printf "Having NetworkManager wake interfaces back up..." 163*4882a593Smuzhiyun- dbus_send --system \ 164*4882a593Smuzhiyun- --dest=org.freedesktop.NetworkManager \ 165*4882a593Smuzhiyun- /org/freedesktop/NetworkManager \ 166*4882a593Smuzhiyun- org.freedesktop.NetworkManager.wake && \ 167*4882a593Smuzhiyun- echo Done. || echo Failed. 168*4882a593Smuzhiyun-} 169*4882a593Smuzhiyun- 170*4882a593Smuzhiyun-case "$1" in 171*4882a593Smuzhiyun- hibernate|suspend) 172*4882a593Smuzhiyun- suspend_nm 173*4882a593Smuzhiyun- ;; 174*4882a593Smuzhiyun- thaw|resume) 175*4882a593Smuzhiyun- resume_nm 176*4882a593Smuzhiyun- ;; 177*4882a593Smuzhiyun- *) exit $NA 178*4882a593Smuzhiyun- ;; 179*4882a593Smuzhiyun-esac 180*4882a593Smuzhiyundiff --git a/pm/sleep.d/75modules b/pm/sleep.d/75modules 181*4882a593Smuzhiyundeleted file mode 100755 182*4882a593Smuzhiyunindex 261e70d..0000000 183*4882a593Smuzhiyun--- a/pm/sleep.d/75modules 184*4882a593Smuzhiyun+++ /dev/null 185*4882a593Smuzhiyun@@ -1,31 +0,0 @@ 186*4882a593Smuzhiyun-#!/bin/sh 187*4882a593Smuzhiyun-# Unload requested modules. 188*4882a593Smuzhiyun- 189*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 190*4882a593Smuzhiyun- 191*4882a593Smuzhiyun-suspend_modules() 192*4882a593Smuzhiyun-{ 193*4882a593Smuzhiyun- [ -z "$SUSPEND_MODULES" ] && return $NA 194*4882a593Smuzhiyun- for x in $SUSPEND_MODULES ; do 195*4882a593Smuzhiyun- printf "Unloading kernel module %s..." "$x" 196*4882a593Smuzhiyun- modunload $x && echo Done. || echo Failed. 197*4882a593Smuzhiyun- done 198*4882a593Smuzhiyun- return 0 199*4882a593Smuzhiyun-} 200*4882a593Smuzhiyun- 201*4882a593Smuzhiyun-resume_modules() 202*4882a593Smuzhiyun-{ 203*4882a593Smuzhiyun- modreload 204*4882a593Smuzhiyun- echo "Reloaded unloaded modules." 205*4882a593Smuzhiyun-} 206*4882a593Smuzhiyun- 207*4882a593Smuzhiyun-case "$1" in 208*4882a593Smuzhiyun- hibernate|suspend) 209*4882a593Smuzhiyun- suspend_modules 210*4882a593Smuzhiyun- ;; 211*4882a593Smuzhiyun- thaw|resume) 212*4882a593Smuzhiyun- resume_modules 213*4882a593Smuzhiyun- ;; 214*4882a593Smuzhiyun- *) exit $NA 215*4882a593Smuzhiyun- ;; 216*4882a593Smuzhiyun-esac 217*4882a593Smuzhiyundiff --git a/pm/sleep.d/90clock b/pm/sleep.d/90clock 218*4882a593Smuzhiyundeleted file mode 100755 219*4882a593Smuzhiyunindex d81e2a6..0000000 220*4882a593Smuzhiyun--- a/pm/sleep.d/90clock 221*4882a593Smuzhiyun+++ /dev/null 222*4882a593Smuzhiyun@@ -1,27 +0,0 @@ 223*4882a593Smuzhiyun-#!/bin/sh 224*4882a593Smuzhiyun-# Synchronize system time with hardware time. 225*4882a593Smuzhiyun-# Modern kernels handle this correctly so we skip this hook by default. 226*4882a593Smuzhiyun- 227*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 228*4882a593Smuzhiyun- 229*4882a593Smuzhiyun-suspend_clock() 230*4882a593Smuzhiyun-{ 231*4882a593Smuzhiyun- printf "Saving system time to hardware clock..." 232*4882a593Smuzhiyun- /sbin/hwclock --systohc >/dev/null 2>&1 0<&1 && echo Done. || \ 233*4882a593Smuzhiyun- echo Failed. 234*4882a593Smuzhiyun-} 235*4882a593Smuzhiyun- 236*4882a593Smuzhiyun-resume_clock() 237*4882a593Smuzhiyun-{ 238*4882a593Smuzhiyun- printf "Loading system time from hardware clock..." 239*4882a593Smuzhiyun- /sbin/hwclock --hctosys >/dev/null 2>&1 0<&1 && echo Done. || \ 240*4882a593Smuzhiyun- echo Failed. 241*4882a593Smuzhiyun-} 242*4882a593Smuzhiyun- 243*4882a593Smuzhiyun-is_set "$NEED_CLOCK_SYNC" || exit $NA 244*4882a593Smuzhiyun- 245*4882a593Smuzhiyun-case "$1" in 246*4882a593Smuzhiyun- hibernate|suspend) suspend_clock ;; 247*4882a593Smuzhiyun- thaw|resume) resume_clock ;; 248*4882a593Smuzhiyun- *) exit $NA ;; 249*4882a593Smuzhiyun-esac 250*4882a593Smuzhiyundiff --git a/pm/sleep.d/94cpufreq b/pm/sleep.d/94cpufreq 251*4882a593Smuzhiyundeleted file mode 100755 252*4882a593Smuzhiyunindex 6807681..0000000 253*4882a593Smuzhiyun--- a/pm/sleep.d/94cpufreq 254*4882a593Smuzhiyun+++ /dev/null 255*4882a593Smuzhiyun@@ -1,46 +0,0 @@ 256*4882a593Smuzhiyun-#!/bin/sh 257*4882a593Smuzhiyun-# Ensure cpu governor is set to something sane. 258*4882a593Smuzhiyun-# TODO: Which of the cpu governors is still insane? File bugs against 259*4882a593Smuzhiyun-# those that are. 260*4882a593Smuzhiyun- 261*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 262*4882a593Smuzhiyun- 263*4882a593Smuzhiyun-[ -d /sys/devices/system/cpu/ ] || exit $NA 264*4882a593Smuzhiyun- 265*4882a593Smuzhiyun-hibernate_cpufreq() 266*4882a593Smuzhiyun-{ 267*4882a593Smuzhiyun- ( cd /sys/devices/system/cpu/ 268*4882a593Smuzhiyun- for x in cpu[0-9]*; do 269*4882a593Smuzhiyun- # if cpufreq is a symlink, it is handled by another cpu. Skip. 270*4882a593Smuzhiyun- [ -L "$x/cpufreq" ] && continue 271*4882a593Smuzhiyun- gov="$x/cpufreq/scaling_governor" 272*4882a593Smuzhiyun- # if we do not have a scaling_governor file, skip. 273*4882a593Smuzhiyun- [ -f "$gov" ] || continue 274*4882a593Smuzhiyun- # if our temporary governor is not available, skip. 275*4882a593Smuzhiyun- grep -q "$TEMPORARY_CPUFREQ_GOVERNOR" \ 276*4882a593Smuzhiyun- "$x/cpufreq/scaling_available_governors" || continue 277*4882a593Smuzhiyun- savestate "${x}_governor" < "$gov" 278*4882a593Smuzhiyun- echo "$TEMPORARY_CPUFREQ_GOVERNOR" > "$gov" 279*4882a593Smuzhiyun- done ) 280*4882a593Smuzhiyun-} 281*4882a593Smuzhiyun- 282*4882a593Smuzhiyun-thaw_cpufreq() 283*4882a593Smuzhiyun-{ 284*4882a593Smuzhiyun- ( cd /sys/devices/system/cpu/ 285*4882a593Smuzhiyun- for x in cpu[0-9]*/cpufreq/scaling_governor ; do 286*4882a593Smuzhiyun- [ -f "$x" ] || continue 287*4882a593Smuzhiyun- state_exists "${x%%/*}_governor" || continue 288*4882a593Smuzhiyun- restorestate "${x%%/*}_governor" > "$x" 289*4882a593Smuzhiyun- done ) 290*4882a593Smuzhiyun-} 291*4882a593Smuzhiyun- 292*4882a593Smuzhiyun-case "$1" in 293*4882a593Smuzhiyun- suspend|hibernate) 294*4882a593Smuzhiyun- hibernate_cpufreq 295*4882a593Smuzhiyun- ;; 296*4882a593Smuzhiyun- resume|thaw) 297*4882a593Smuzhiyun- thaw_cpufreq 298*4882a593Smuzhiyun- ;; 299*4882a593Smuzhiyun- *) exit $NA 300*4882a593Smuzhiyun- ;; 301*4882a593Smuzhiyun-esac 302*4882a593Smuzhiyundiff --git a/pm/sleep.d/95led b/pm/sleep.d/95led 303*4882a593Smuzhiyundeleted file mode 100755 304*4882a593Smuzhiyunindex b4bb970..0000000 305*4882a593Smuzhiyun--- a/pm/sleep.d/95led 306*4882a593Smuzhiyun+++ /dev/null 307*4882a593Smuzhiyun@@ -1,16 +0,0 @@ 308*4882a593Smuzhiyun-#!/bin/sh 309*4882a593Smuzhiyun-# On an IBM system. make the suspend LED blink. 310*4882a593Smuzhiyun-# TODO: Merge with 95led? Should be trivial. 311*4882a593Smuzhiyun- 312*4882a593Smuzhiyun-[ -f /proc/acpi/ibm/led ] || exit $NA 313*4882a593Smuzhiyun- 314*4882a593Smuzhiyun-case "$1" in 315*4882a593Smuzhiyun- hibernate|suspend) 316*4882a593Smuzhiyun- echo "7 blink" >/proc/acpi/ibm/led 317*4882a593Smuzhiyun- ;; 318*4882a593Smuzhiyun- thaw|resume) 319*4882a593Smuzhiyun- echo "7 off" >/proc/acpi/ibm/led 320*4882a593Smuzhiyun- ;; 321*4882a593Smuzhiyun- *) exit $NA 322*4882a593Smuzhiyun- ;; 323*4882a593Smuzhiyun-esac 324*4882a593Smuzhiyundiff --git a/pm/sleep.d/98video-quirk-db-handler b/pm/sleep.d/98video-quirk-db-handler 325*4882a593Smuzhiyundeleted file mode 100755 326*4882a593Smuzhiyunindex e9ea3ca..0000000 327*4882a593Smuzhiyun--- a/pm/sleep.d/98video-quirk-db-handler 328*4882a593Smuzhiyun+++ /dev/null 329*4882a593Smuzhiyun@@ -1,450 +0,0 @@ 330*4882a593Smuzhiyun-#!/bin/bash 331*4882a593Smuzhiyun-# Prototype video quirk database handler that does not rely on HAL. 332*4882a593Smuzhiyun- 333*4882a593Smuzhiyun-shopt -s extglob 334*4882a593Smuzhiyun- 335*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 336*4882a593Smuzhiyun- 337*4882a593Smuzhiyun-[[ $PM_DEBUG ]] && { 338*4882a593Smuzhiyun- export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): '; 339*4882a593Smuzhiyun- set -x 340*4882a593Smuzhiyun-} 341*4882a593Smuzhiyun- 342*4882a593Smuzhiyun-possible_video_quirks=" --quirk-dpms-on 343*4882a593Smuzhiyun- --quirk-dpms-suspend 344*4882a593Smuzhiyun- --quirk-s3-mode 345*4882a593Smuzhiyun- --quirk-s3-bios 346*4882a593Smuzhiyun- --quirk-vbe-post 347*4882a593Smuzhiyun- --quirk-vbe-post 348*4882a593Smuzhiyun- --quirk-vga-mode-3 349*4882a593Smuzhiyun- --quirk-vbemode-restore 350*4882a593Smuzhiyun- --quirk-vbestate-restore 351*4882a593Smuzhiyun- --quirk-reset-brightness 352*4882a593Smuzhiyun- --quirk-radeon-off 353*4882a593Smuzhiyun- --quirk-no-fb 354*4882a593Smuzhiyun- --quirk-save-pci" 355*4882a593Smuzhiyun- 356*4882a593Smuzhiyun-possible_system_properties="system.firmware.version 357*4882a593Smuzhiyun- system.firmware.vendor 358*4882a593Smuzhiyun- system.firmware.release_date 359*4882a593Smuzhiyun- system.hardware.vendor 360*4882a593Smuzhiyun- system.hardware.product 361*4882a593Smuzhiyun- system.hardware.version 362*4882a593Smuzhiyun- system.board.product 363*4882a593Smuzhiyun- system.board.version 364*4882a593Smuzhiyun- system.board.vendor 365*4882a593Smuzhiyun- system.hardware.primary_video.vendor 366*4882a593Smuzhiyun- system.hardware.primary_video.product 367*4882a593Smuzhiyun- system.hardware.primary_video.driver 368*4882a593Smuzhiyun- system.hardware.primary_video.using_kms 369*4882a593Smuzhiyun- system.kernel.version" 370*4882a593Smuzhiyun- 371*4882a593Smuzhiyun-has_video_parameters() { 372*4882a593Smuzhiyun- local p params=$(get_parameters) 373*4882a593Smuzhiyun- [[ $params ]] || return 1 374*4882a593Smuzhiyun- for p in $params; do 375*4882a593Smuzhiyun- [[ $possible_video_quirks = *$p* ]] && return 376*4882a593Smuzhiyun- done 377*4882a593Smuzhiyun- return 1 378*4882a593Smuzhiyun-} 379*4882a593Smuzhiyun- 380*4882a593Smuzhiyun-# video specific helper functions. 381*4882a593Smuzhiyun- 382*4882a593Smuzhiyun-# Are we using the nVidia binary driver? 383*4882a593Smuzhiyun-using_nvidia() { [[ -d /sys/module/nvidia ]]; } 384*4882a593Smuzhiyun- 385*4882a593Smuzhiyun-# How about the ATI one? 386*4882a593Smuzhiyun-using_fglrx() { [[ -d /sys/module/fglrx ]]; } 387*4882a593Smuzhiyun- 388*4882a593Smuzhiyun-# OK, what about a driver that is using kernel modesetting? 389*4882a593Smuzhiyun-using_kms() { grep -q -E '(nouveau|drm)fb' /proc/fb; } 390*4882a593Smuzhiyun- 391*4882a593Smuzhiyun-# Get some video related values when HAL has not gotten them for us, or 392*4882a593Smuzhiyun-# HAL is not available. 393*4882a593Smuzhiyun-videoget() { 394*4882a593Smuzhiyun- local dev pci 395*4882a593Smuzhiyun- pci="/sys/bus/pci/devices" 396*4882a593Smuzhiyun- for dev in "$pci"/*; do 397*4882a593Smuzhiyun- [[ -f "${dev}/class" ]] || continue 398*4882a593Smuzhiyun- [[ "$(cat "${dev}/class")" = "0x030000" ]] || continue 399*4882a593Smuzhiyun- case $1 in 400*4882a593Smuzhiyun- vendor) RES="$(cat "${dev}/vendor")" ;; 401*4882a593Smuzhiyun- device) RES="$(cat "${dev}/device")" ;; 402*4882a593Smuzhiyun- driver) 403*4882a593Smuzhiyun- if [[ -L ${dev}/driver ]]; then 404*4882a593Smuzhiyun- RES="$(readlink "${dev}/driver")" 405*4882a593Smuzhiyun- RES="${RES##*/}" 406*4882a593Smuzhiyun- elif using_nvidia; then 407*4882a593Smuzhiyun- RES=nvidia 408*4882a593Smuzhiyun- elif using_fglrx; then 409*4882a593Smuzhiyun- RES=fglrx 410*4882a593Smuzhiyun- fi 411*4882a593Smuzhiyun- ;; 412*4882a593Smuzhiyun- using_kms) 413*4882a593Smuzhiyun- if using_kms; then 414*4882a593Smuzhiyun- RES=true 415*4882a593Smuzhiyun- else 416*4882a593Smuzhiyun- RES=false 417*4882a593Smuzhiyun- fi 418*4882a593Smuzhiyun- ;; 419*4882a593Smuzhiyun- esac 420*4882a593Smuzhiyun- break 421*4882a593Smuzhiyun- done 422*4882a593Smuzhiyun-} 423*4882a593Smuzhiyun- 424*4882a593Smuzhiyun-# Get some important information about this system. 425*4882a593Smuzhiyun- 426*4882a593Smuzhiyun-# If we have /sys/class/dmi/id, life is easy, and we do not need to 427*4882a593Smuzhiyun-# depend on HAL or dmidecode. 428*4882a593Smuzhiyun-_dmisysget() { 429*4882a593Smuzhiyun- [[ -r /sys/class/dmi/id/$1 ]] || RES="" 430*4882a593Smuzhiyun- read RES < "/sys/class/dmi/id/$1" 431*4882a593Smuzhiyun-} 432*4882a593Smuzhiyun- 433*4882a593Smuzhiyun-dmisysget() { 434*4882a593Smuzhiyun- case $1 in 435*4882a593Smuzhiyun- system.firmware.vendor) _dmisysget bios_vendor ;; 436*4882a593Smuzhiyun- system.firmware.version) _dmisysget bios_version ;; 437*4882a593Smuzhiyun- system.firmware.release_date) _dmisysget bios_date ;; 438*4882a593Smuzhiyun- system.hardware.vendor) _dmisysget sys_vendor ;; 439*4882a593Smuzhiyun- system.hardware.product) _dmisysget product_name ;; 440*4882a593Smuzhiyun- system.hardware.version) _dmisysget product_version ;; 441*4882a593Smuzhiyun- system.board.product) _dmisysget board_name ;; 442*4882a593Smuzhiyun- system.board.version) _dmisysget board_version ;; 443*4882a593Smuzhiyun- system.board.vendor) _dmisysget board_vendor ;; 444*4882a593Smuzhiyun- system.hardware.primary_video.vendor) videoget vendor ;; 445*4882a593Smuzhiyun- system.hardware.primary_video.product) videoget device ;; 446*4882a593Smuzhiyun- system.hardware.primary_video.driver) videoget driver ;; 447*4882a593Smuzhiyun- system.hardware.primary_video.using_kms) videoget using_kms ;; 448*4882a593Smuzhiyun- system.kernel.version) RES=$(uname -r) ;; 449*4882a593Smuzhiyun- *) return 1 450*4882a593Smuzhiyun- esac 451*4882a593Smuzhiyun-} 452*4882a593Smuzhiyun- 453*4882a593Smuzhiyun-# Get system information using dmidecode. Slow and ugly, but 454*4882a593Smuzhiyun-# should be supported just about everywhere. 455*4882a593Smuzhiyun-_dmidecodeget() { 456*4882a593Smuzhiyun- RES=$(dmidecode -s $1) 457*4882a593Smuzhiyun-} 458*4882a593Smuzhiyun- 459*4882a593Smuzhiyun-dmidecodeget() { 460*4882a593Smuzhiyun- case $1 in 461*4882a593Smuzhiyun- system.firmware.vendor) _dmidecodeget bios-vendor ;; 462*4882a593Smuzhiyun- system.firmware.version) _dmidecodeget bios-version ;; 463*4882a593Smuzhiyun- system.firmware.release_date) _dmidecodeget bios-release-date;; 464*4882a593Smuzhiyun- system.hardware.vendor) _dmidecodeget system-manufacturer;; 465*4882a593Smuzhiyun- system.hardware.product) _dmidecodeget system-product-name;; 466*4882a593Smuzhiyun- system.hardware.version) _dmidecodeget system-version;; 467*4882a593Smuzhiyun- system.board.product) _dmidecodeget baseboard-product-name;; 468*4882a593Smuzhiyun- system.board.version) _dmidecodeget baseboard-version;; 469*4882a593Smuzhiyun- system.board.vendor) _dmidecodeget baseboard-manufacturer;; 470*4882a593Smuzhiyun- *) return 1 471*4882a593Smuzhiyun- esac 472*4882a593Smuzhiyun-} 473*4882a593Smuzhiyun- 474*4882a593Smuzhiyun-# If we have HAL, it has already done most of the work for us. 475*4882a593Smuzhiyun-halget() { 476*4882a593Smuzhiyun- local hgp="hal-get-property --udi /org/freedesktop/Hal/devices/computer --key" 477*4882a593Smuzhiyun- case $1 in 478*4882a593Smuzhiyun- system.firmware.version) RES=$($hgp "$1") ;; 479*4882a593Smuzhiyun- system.firmware.vendor) RES=$($hgp "$1") ;; 480*4882a593Smuzhiyun- system.firmware.release_date) RES=$($hgp "$1") ;; 481*4882a593Smuzhiyun- system.hardware.vendor) RES=$($hgp "$1") ;; 482*4882a593Smuzhiyun- system.hardware.product) RES=$($hgp "$1") ;; 483*4882a593Smuzhiyun- system.hardware.version) RES=$($hgp "$1") ;; 484*4882a593Smuzhiyun- system.board.product) RES=$($hgp "$1") ;; 485*4882a593Smuzhiyun- system.board.version) RES=$($hgp "$1") ;; 486*4882a593Smuzhiyun- system.board.vendor) RES=$($hgp "$1") ;; 487*4882a593Smuzhiyun- *) return 1 488*4882a593Smuzhiyun- esac 489*4882a593Smuzhiyun-} 490*4882a593Smuzhiyun- 491*4882a593Smuzhiyun-canonicalize_dmivar() { 492*4882a593Smuzhiyun- [[ $1 =~ ^[a-z._-]+$ && $possible_system_properties = *$1* ]] || return 1 493*4882a593Smuzhiyun- echo "${1//[-.]/_}" 494*4882a593Smuzhiyun-} 495*4882a593Smuzhiyun- 496*4882a593Smuzhiyun-# Precache the DMI and other information we will need as shell variables. 497*4882a593Smuzhiyun-# This will make things easier when we start running for real. 498*4882a593Smuzhiyun-precache_dmivars() { 499*4882a593Smuzhiyun- local p q f 500*4882a593Smuzhiyun- for q in $possible_system_properties; do 501*4882a593Smuzhiyun- p=$(canonicalize_dmivar $q) || return 1 502*4882a593Smuzhiyun- RES="" 503*4882a593Smuzhiyun- for f in dmisysget halget dmidecodeget; do 504*4882a593Smuzhiyun- "$f" "$q" && break || continue 2 505*4882a593Smuzhiyun- done 506*4882a593Smuzhiyun- RES="${RES##+( )}" 507*4882a593Smuzhiyun- RES="${RES%%+( )}" 508*4882a593Smuzhiyun- read "$p" <<<$RES 509*4882a593Smuzhiyun- done 510*4882a593Smuzhiyun- RES="" 511*4882a593Smuzhiyun-} 512*4882a593Smuzhiyun- 513*4882a593Smuzhiyun-# Use bash variable indirection to set RES to the actual parameter 514*4882a593Smuzhiyun-# we are looking for. Sanity check the variable we were passed to 515*4882a593Smuzhiyun-# keep things sane. 516*4882a593Smuzhiyun-getprop() { 517*4882a593Smuzhiyun- RES="" 518*4882a593Smuzhiyun- local p 519*4882a593Smuzhiyun- if ! p=$(canonicalize_dmivar $1); then 520*4882a593Smuzhiyun- echo "Unable to obtain DMI information for $1" >&2 521*4882a593Smuzhiyun- exit 1 522*4882a593Smuzhiyun- fi 523*4882a593Smuzhiyun- RES="${!p}" 524*4882a593Smuzhiyun-} 525*4882a593Smuzhiyun- 526*4882a593Smuzhiyun-# test to see if the parameter passed is a decimal or hexidecimal number 527*4882a593Smuzhiyun-# Note the complete lack of floating point support. 528*4882a593Smuzhiyun-isnum() { 529*4882a593Smuzhiyun- [[ $1 =~ ^[0-9]+\$ || $1 =~ ^0[xX][0-9a-fA-F]+\$ ]] 530*4882a593Smuzhiyun-} 531*4882a593Smuzhiyun- 532*4882a593Smuzhiyun-# for all the matching functions, 533*4882a593Smuzhiyun-# $2 = the given constant (or regular expression), 534*4882a593Smuzhiyun-# $1 = the raw data grabbed from HAL or dmidecode or wherever 535*4882a593Smuzhiyun- 536*4882a593Smuzhiyun-regex() { [[ $1 =~ ${2//;/|} ]]; } 537*4882a593Smuzhiyun- 538*4882a593Smuzhiyun-regex_ncase() { 539*4882a593Smuzhiyun- local r 540*4882a593Smuzhiyun- shopt -s nocasematch 541*4882a593Smuzhiyun- regex "$1" "$2" 542*4882a593Smuzhiyun- r=$? 543*4882a593Smuzhiyun- shopt -u nocasematch 544*4882a593Smuzhiyun- return $r 545*4882a593Smuzhiyun-} 546*4882a593Smuzhiyun- 547*4882a593Smuzhiyun-regex_inverse() { ! regex "$1" "$2"; } 548*4882a593Smuzhiyun-compare_eq() { [[ $1 = $2 ]]; } 549*4882a593Smuzhiyun-compare_ne() { [[ $1 != $2 ]]; } 550*4882a593Smuzhiyun-compare_gt() { [[ $1 > $2 ]]; } 551*4882a593Smuzhiyun-compare_ge() { compare_eq "$@" || compare_gt "$@"; } 552*4882a593Smuzhiyun-compare_lt() { [[ $1 < $2 ]]; } 553*4882a593Smuzhiyun-compare_le() { compare_eq "$@" || compare_lt "$@"; } 554*4882a593Smuzhiyun-numeric_compare_eq() { (( $1 == $2 )); } 555*4882a593Smuzhiyun-numeric_compare_ne() { (( $1 != $2 )); } 556*4882a593Smuzhiyun-numeric_compare_gt() { (( $1 > $2 )); } 557*4882a593Smuzhiyun-numeric_compare_ge() { (( $1 >= $2 )); } 558*4882a593Smuzhiyun-numeric_compare_lt() { (( $1 < $2 )); } 559*4882a593Smuzhiyun-numeric_compare_le() { (( $1 <= $2 )); } 560*4882a593Smuzhiyun-numeric_compare_eq_list() { 561*4882a593Smuzhiyun- local key val 562*4882a593Smuzhiyun- # $1 = key val to compare 563*4882a593Smuzhiyun- # $2 = list to compare to 564*4882a593Smuzhiyun- key=$1 565*4882a593Smuzhiyun- val="${2//;/ }" 566*4882a593Smuzhiyun- for x in $val; do 567*4882a593Smuzhiyun- (( $key == $x )) && return 0 568*4882a593Smuzhiyun- done 569*4882a593Smuzhiyun- return 1 570*4882a593Smuzhiyun-} 571*4882a593Smuzhiyun- 572*4882a593Smuzhiyun-# Helper function for nVidia g80 gpus. They require extra special handling 573*4882a593Smuzhiyun-# when not using the nVidia binary driver. 574*4882a593Smuzhiyun-have_nvidia_g80() { 575*4882a593Smuzhiyun- numeric_compare_eq $system_hardware_primary_video_vendor 0x10de || return 576*4882a593Smuzhiyun- numeric_compare_eq_list $system_hardware_primary_video_product \ 577*4882a593Smuzhiyun- '0x190;0x191;0x192;0x193;0x194;0x195;0x196;0x197;0x198;0x199;0x19a;0x19b;0x19c;0x19d;0x19e;0x19f;0x400;0x401;0x402;0x403;0x404;0x405;0x406;0x407;0x408;0x409;0x40a;0x40b;0x40c;0x40d;0x40e;0x40f;0x420;0x421;0x422;0x423;0x424;0x425;0x426;0x427;0x428;0x429;0x42a;0x42b;0x42c;0x42d;0x42e;0x42f' || return 578*4882a593Smuzhiyun-} 579*4882a593Smuzhiyun- 580*4882a593Smuzhiyun-# Helper function for recent Intel framebuffer drivers. 581*4882a593Smuzhiyun-have_smart_intel() { 582*4882a593Smuzhiyun- local kernel_rev=$system_kernel_revision 583*4882a593Smuzhiyun- local driver=$system_hardware_primary_video_driver 584*4882a593Smuzhiyun- # currently, intel kernel modesetting is not quite smart enough 585*4882a593Smuzhiyun- # we still need acpi s3 kernel modesetting hooks, so don't remove those 586*4882a593Smuzhiyun- # options if they were passed. 587*4882a593Smuzhiyun- [[ $driver = i915 && ( $kernel_rev > 2.6.26 || $kernel_rev = 2.6.26 ) ]] 588*4882a593Smuzhiyun-} 589*4882a593Smuzhiyun- 590*4882a593Smuzhiyun-# find the appropriate quirks for this system using the native-format 591*4882a593Smuzhiyun-# quirks database. Since the database is tree-ish, we use some stupid 592*4882a593Smuzhiyun-# recursion tricks. 593*4882a593Smuzhiyun- 594*4882a593Smuzhiyun-# $1 = whether to ignore what we are reading 595*4882a593Smuzhiyun-_find_native() { 596*4882a593Smuzhiyun- local action key matcher regex 597*4882a593Smuzhiyun- while read action key matcher regex; do 598*4882a593Smuzhiyun- [[ $action && ${action:0:1} != '#' ]] || continue 599*4882a593Smuzhiyun- case $action in 600*4882a593Smuzhiyun- match) 601*4882a593Smuzhiyun- if [[ $1 = ignore ]]; then 602*4882a593Smuzhiyun- _find_native $1 603*4882a593Smuzhiyun- else 604*4882a593Smuzhiyun- getprop "$key" 605*4882a593Smuzhiyun- [[ $matcher && $regex ]] || find_native ignore 606*4882a593Smuzhiyun- # if this matcher matches, look at nodes farther out. 607*4882a593Smuzhiyun- if $matcher "$RES" "$regex"; then 608*4882a593Smuzhiyun- _find_native work 609*4882a593Smuzhiyun- else 610*4882a593Smuzhiyun- _find_native ignore 611*4882a593Smuzhiyun- fi 612*4882a593Smuzhiyun- fi 613*4882a593Smuzhiyun- ;; 614*4882a593Smuzhiyun- endmatch) 615*4882a593Smuzhiyun- [[ $found ]] && return 0 || return 1 ;; 616*4882a593Smuzhiyun- addquirk) [[ $1 = ignore ]] && continue 617*4882a593Smuzhiyun- found=true 618*4882a593Smuzhiyun- add_parameters "$key" 619*4882a593Smuzhiyun- ;; 620*4882a593Smuzhiyun- delquirk) [[ $1 = ignore ]]&& continue 621*4882a593Smuzhiyun- found=true 622*4882a593Smuzhiyun- remove_parameters "$key" 623*4882a593Smuzhiyun- ;; 624*4882a593Smuzhiyun- esac 625*4882a593Smuzhiyun- done 626*4882a593Smuzhiyun-} 627*4882a593Smuzhiyun- 628*4882a593Smuzhiyun-find_native() ( 629*4882a593Smuzhiyun- [[ -f $1 ]] || return 1 630*4882a593Smuzhiyun- exec <"$1" 631*4882a593Smuzhiyun- _find_native work 632*4882a593Smuzhiyun- res=$? 633*4882a593Smuzhiyun- get_parameters 634*4882a593Smuzhiyun- return $res 635*4882a593Smuzhiyun-) 636*4882a593Smuzhiyun- 637*4882a593Smuzhiyun-# If we resumed, write out the quirks we used as our last known 638*4882a593Smuzhiyun-# working ones for this hardware, kernel, driver, and KMS setting. 639*4882a593Smuzhiyun-write_last_known_working() ( 640*4882a593Smuzhiyun- local matcher quirk 641*4882a593Smuzhiyun- precache_dmivars 642*4882a593Smuzhiyun- exec >"$PM_LKW_QUIRKS" 643*4882a593Smuzhiyun- for prop in system.firmware.version system.firmware.vendor \ 644*4882a593Smuzhiyun- system.firmware.release_date system.hardware.vendor \ 645*4882a593Smuzhiyun- system.hardware.product system.hardware.version \ 646*4882a593Smuzhiyun- system.board.product system.board.version system.board.vendor \ 647*4882a593Smuzhiyun- system.hardware.primary_video.vendor \ 648*4882a593Smuzhiyun- system.hardware.primary_video.product \ 649*4882a593Smuzhiyun- system.hardware.primary_video.driver \ 650*4882a593Smuzhiyun- system.hardware.primary_video.using_kms \ 651*4882a593Smuzhiyun- system.kernel.version; do 652*4882a593Smuzhiyun- getprop "$prop" 653*4882a593Smuzhiyun- if isnum "$RES"; then 654*4882a593Smuzhiyun- matcher=numeric_compare_eq 655*4882a593Smuzhiyun- else 656*4882a593Smuzhiyun- matcher=compare_eq 657*4882a593Smuzhiyun- fi 658*4882a593Smuzhiyun- echo "match $prop $matcher ${RES}" 659*4882a593Smuzhiyun- done 660*4882a593Smuzhiyun- if [[ $QUIRKS ]]; then 661*4882a593Smuzhiyun- for quirk in $QUIRKS; do 662*4882a593Smuzhiyun- echo "addquirk $quirk" 663*4882a593Smuzhiyun- done 664*4882a593Smuzhiyun- else 665*4882a593Smuzhiyun- echo "addquirk --quirk-none" 666*4882a593Smuzhiyun- fi 667*4882a593Smuzhiyun- for ((x=1; x<14; x++)); do 668*4882a593Smuzhiyun- echo endmatch 669*4882a593Smuzhiyun- done 670*4882a593Smuzhiyun-) 671*4882a593Smuzhiyun- 672*4882a593Smuzhiyun-case $1 in 673*4882a593Smuzhiyun- suspend|hibernate) 674*4882a593Smuzhiyun- # Aaand.... GO 675*4882a593Smuzhiyun- # cache all the properties we will need. 676*4882a593Smuzhiyun- precache_dmivars 677*4882a593Smuzhiyun- 678*4882a593Smuzhiyun- # This logic can also be expressed using entries in the quirkdb, 679*4882a593Smuzhiyun- # but I am too lazy to do that until a final quirk database is 680*4882a593Smuzhiyun- # formalized. 681*4882a593Smuzhiyun- if has_parameter --quirk-test && has_video_parameters; then 682*4882a593Smuzhiyun- # The user is explicitly testing video parameters. 683*4882a593Smuzhiyun- # Use them without the usual filtering. This may cause the system 684*4882a593Smuzhiyun- # to blow up, but they explicitly asked for it. 685*4882a593Smuzhiyun- remove_parameters --quirk-test 686*4882a593Smuzhiyun- echo "Quirk testing mode enabled." 687*4882a593Smuzhiyun- elif using_kms; then 688*4882a593Smuzhiyun- # Using kernel modesetting? No quirks, and do not change vts. 689*4882a593Smuzhiyun- remove_parameters $possible_video_quirks 690*4882a593Smuzhiyun- add_parameters --quirk-no-chvt 691*4882a593Smuzhiyun- echo "Kernel modesetting video driver detected, not using quirks." 692*4882a593Smuzhiyun- elif using_nvidia; then 693*4882a593Smuzhiyun- # Ditto for nVidia binary drivers 694*4882a593Smuzhiyun- remove_parameters $possible_video_quirks 695*4882a593Smuzhiyun- echo "nVidia binary video drive detected, not using quirks." 696*4882a593Smuzhiyun- elif using_fglrx; then 697*4882a593Smuzhiyun- # fglrx may or may not have to change vts, reports one 698*4882a593Smuzhiyun- # way or the other welcome. 699*4882a593Smuzhiyun- remove_parameters $possible_video_quirks 700*4882a593Smuzhiyun- add_parameters --quirk-none 701*4882a593Smuzhiyun- echo "ATI Catalyst driver detected, not using quirks." 702*4882a593Smuzhiyun- elif have_nvidia_g80; then 703*4882a593Smuzhiyun- # nVidia G80 GPUs require special handling when not using nvidia 704*4882a593Smuzhiyun- # binary drivers. I do not know if noveau requires help or not. 705*4882a593Smuzhiyun- remove_parameters $possible_video_quirks 706*4882a593Smuzhiyun- add_parameters --quirk-vbe-post 707*4882a593Smuzhiyun- echo "nVidia g80 series card detected." 708*4882a593Smuzhiyun- else 709*4882a593Smuzhiyun- # Go ahead and get our quirks. 710*4882a593Smuzhiyun- if has_video_parameters; then 711*4882a593Smuzhiyun- # Parameters from the command line take precedence 712*4882a593Smuzhiyun- # over the database, so do not query it. 713*4882a593Smuzhiyun- echo "Using quirks passed as parameters." 714*4882a593Smuzhiyun- elif [[ $PM_QUIRKS ]]; then 715*4882a593Smuzhiyun- # If we have $PM_QUIRKS. use it instead of the quirk database 716*4882a593Smuzhiyun- add_parameters $PM_QUIRKS 717*4882a593Smuzhiyun- echo "Using PM_QUIRKS environment variable for quirks." 718*4882a593Smuzhiyun- # If we were not passed any quirks on the command line, 719*4882a593Smuzhiyun- # get them from the database. 720*4882a593Smuzhiyun- elif QUIRKS=$(find_native "$PM_LKW_QUIRKS"); then 721*4882a593Smuzhiyun- # Known working quirks from our last run are still valid. 722*4882a593Smuzhiyun- # Use them. 723*4882a593Smuzhiyun- add_parameters $QUIRKS 724*4882a593Smuzhiyun- echo "Using last known working set of quirks." 725*4882a593Smuzhiyun- else 726*4882a593Smuzhiyun- # Our known working quirks from the last run are either 727*4882a593Smuzhiyun- # nonexistent or invalid. Either way, start over. 728*4882a593Smuzhiyun- rm "$PM_LKW_QUIRKS" >/dev/null 2>&1 729*4882a593Smuzhiyun- for f in "$PM_QUIRKDB"/*.quirkdb 730*4882a593Smuzhiyun- do 731*4882a593Smuzhiyun- QUIRKS=$(find_native "$f") && break 732*4882a593Smuzhiyun- done 733*4882a593Smuzhiyun- # some default quirks if we did not get any. 734*4882a593Smuzhiyun- if [[ -z $QUIRKS ]]; then 735*4882a593Smuzhiyun- QUIRKS="--quirk-vbe-post --quirk-dpms-on 736*4882a593Smuzhiyun- --quirk-dpms-suspend --quirk-vbestate-restore 737*4882a593Smuzhiyun- --quirk-vbemode-restore --quirk-vga-mode-3" 738*4882a593Smuzhiyun- echo "No quirk database entry for this system, using default." 739*4882a593Smuzhiyun- else 740*4882a593Smuzhiyun- echo "Using quirks for this system from quirk database." 741*4882a593Smuzhiyun- fi 742*4882a593Smuzhiyun- add_parameters $QUIRKS 743*4882a593Smuzhiyun- savestate video_quirks "$QUIRKS" 744*4882a593Smuzhiyun- fi 745*4882a593Smuzhiyun- if have_smart_intel; then 746*4882a593Smuzhiyun- # Intel without KMS does not require most quirks, no matter 747*4882a593Smuzhiyun- # what anything else says. The only ones that seem to 748*4882a593Smuzhiyun- # matter are the --quirk-s3 ones, so remove everything else. 749*4882a593Smuzhiyun- remove_parameters --quirk-dpms-on \ 750*4882a593Smuzhiyun- --quirk-dpms-suspend \ 751*4882a593Smuzhiyun- --quirk-vbe-post \ 752*4882a593Smuzhiyun- --quirk-vbe-post \ 753*4882a593Smuzhiyun- --quirk-vga-mode-3 \ 754*4882a593Smuzhiyun- --quirk-vbemode-restore \ 755*4882a593Smuzhiyun- --quirk-vbestate-restore \ 756*4882a593Smuzhiyun- --quirk-reset-brightness \ 757*4882a593Smuzhiyun- --quirk-radeon-off \ 758*4882a593Smuzhiyun- --quirk-no-fb \ 759*4882a593Smuzhiyun- --quirk-save-pci 760*4882a593Smuzhiyun- echo "Cleaning up quirks not needed by Intel video cards." 761*4882a593Smuzhiyun- fi 762*4882a593Smuzhiyun- fi 763*4882a593Smuzhiyun- ;; 764*4882a593Smuzhiyun- thaw|resume) 765*4882a593Smuzhiyun- if state_exists video_quirks; then 766*4882a593Smuzhiyun- QUIRKS=$(restorestate video_quirks); 767*4882a593Smuzhiyun- write_last_known_working 768*4882a593Smuzhiyun- echo "Saving last known working quirks: $QUIRKS" 769*4882a593Smuzhiyun- elif has_parameter --store-quirks-as-lkw; then 770*4882a593Smuzhiyun- for x in $(get_parameters); do 771*4882a593Smuzhiyun- for y in $possible_video_quirks; do 772*4882a593Smuzhiyun- [[ $x = $y ]] && QUIRKS=" $QUIRKS $x" 773*4882a593Smuzhiyun- done 774*4882a593Smuzhiyun- done 775*4882a593Smuzhiyun- write_last_known_working 776*4882a593Smuzhiyun- echo "Saving last known working quirks: $QUIRKS" 777*4882a593Smuzhiyun- fi 778*4882a593Smuzhiyun- ;; 779*4882a593Smuzhiyun-esac 780*4882a593Smuzhiyundiff --git a/pm/sleep.d/99video b/pm/sleep.d/99video 781*4882a593Smuzhiyundeleted file mode 100755 782*4882a593Smuzhiyunindex 452a88a..0000000 783*4882a593Smuzhiyun--- a/pm/sleep.d/99video 784*4882a593Smuzhiyun+++ /dev/null 785*4882a593Smuzhiyun@@ -1,219 +0,0 @@ 786*4882a593Smuzhiyun-#!/bin/sh 787*4882a593Smuzhiyun-# 788*4882a593Smuzhiyun-# Copyright 2006-2007 Richard Hughes <richard@hughsie.com> 789*4882a593Smuzhiyun-# Copyright 2007 Peter Jones <pjones@redhat.com> 790*4882a593Smuzhiyun-# 791*4882a593Smuzhiyun-# This program is free software; you can redistribute it and/or modify 792*4882a593Smuzhiyun-# it under the terms of version 2 of the GNU General Public License as 793*4882a593Smuzhiyun-# published by the Free Software Foundation. 794*4882a593Smuzhiyun- 795*4882a593Smuzhiyun-# Handle video quirks. If you are having suspend/resume issues, 796*4882a593Smuzhiyun-# troubleshooting using this hook is probably the best place to start. 797*4882a593Smuzhiyun-# If it weren't for video card quirks, suspend/resume on Linux would be 798*4882a593Smuzhiyun-# a whole lot more stable. 799*4882a593Smuzhiyun- 800*4882a593Smuzhiyun-. "${PM_FUNCTIONS}" 801*4882a593Smuzhiyun- 802*4882a593Smuzhiyun-for opt in $PM_CMDLINE; do 803*4882a593Smuzhiyun- case "${opt##--quirk-}" in # just quirks, please 804*4882a593Smuzhiyun- dpms-on) QUIRK_DPMS_ON="true" ;; 805*4882a593Smuzhiyun- dpms-suspend) QUIRK_DPMS_SUSPEND="true" ;; 806*4882a593Smuzhiyun- radeon-off) QUIRK_RADEON_OFF="true" ;; 807*4882a593Smuzhiyun- reset-brightness) QUIRK_RESET_BRIGHTNESS="true" ;; 808*4882a593Smuzhiyun- s3-bios) QUIRK_S3_BIOS="true" ;; 809*4882a593Smuzhiyun- s3-mode) QUIRK_S3_MODE="true" ;; 810*4882a593Smuzhiyun- vbe-post) QUIRK_VBE_POST="true" ;; 811*4882a593Smuzhiyun- vbemode-restore) QUIRK_VBEMODE_RESTORE="true" ;; 812*4882a593Smuzhiyun- vbestate-restore) QUIRK_VBESTATE_RESTORE="true" ;; 813*4882a593Smuzhiyun- vga-mode-3) QUIRK_VGA_MODE_3="true" ;; 814*4882a593Smuzhiyun- no-fb) QUIRK_NOFB="true" ;; 815*4882a593Smuzhiyun- save-pci) QUIRK_SAVE_PCI="true" ;; 816*4882a593Smuzhiyun- no-chvt) QUIRK_NO_CHVT="true" ;; 817*4882a593Smuzhiyun- none) QUIRK_NONE="true" ;; 818*4882a593Smuzhiyun- *) continue ;; 819*4882a593Smuzhiyun- esac 820*4882a593Smuzhiyun-done 821*4882a593Smuzhiyun- 822*4882a593Smuzhiyun-reset_brightness() 823*4882a593Smuzhiyun-{ 824*4882a593Smuzhiyun- for bl in /sys/class/backlight/* ; do 825*4882a593Smuzhiyun- [ -f "$bl/brightness" ] || continue 826*4882a593Smuzhiyun- BR="$(cat $bl/brightness)" 827*4882a593Smuzhiyun- echo 0 > "$bl/brightness" 828*4882a593Smuzhiyun- echo "$BR" > "$bl/brightness" 829*4882a593Smuzhiyun- done 830*4882a593Smuzhiyun-} 831*4882a593Smuzhiyun- 832*4882a593Smuzhiyun-if command_exists vbetool; then 833*4882a593Smuzhiyun- vbe() { vbetool "$@"; } 834*4882a593Smuzhiyun-else 835*4882a593Smuzhiyun- vbe() { echo "vbetool not installed!" 1>&2; return 1; } 836*4882a593Smuzhiyun-fi 837*4882a593Smuzhiyun- 838*4882a593Smuzhiyun-if command_exists radeontool; then 839*4882a593Smuzhiyun- radeon() { radeontool "$@"; } 840*4882a593Smuzhiyun-else 841*4882a593Smuzhiyun- radeon() { echo "radeontool not found" 1>&2; return 1; } 842*4882a593Smuzhiyun-fi 843*4882a593Smuzhiyun- 844*4882a593Smuzhiyun-die_if_framebuffer() 845*4882a593Smuzhiyun-{ 846*4882a593Smuzhiyun- [ -d "/sys/class/graphics/fb0" ] || return 847*4882a593Smuzhiyun- echo "--quirk-no-fb passed, but system is using a framebuffer." 848*4882a593Smuzhiyun- echo "Aborting." 849*4882a593Smuzhiyun- exit 1 850*4882a593Smuzhiyun-} 851*4882a593Smuzhiyun- 852*4882a593Smuzhiyun- 853*4882a593Smuzhiyun-save_fbcon() 854*4882a593Smuzhiyun-{ 855*4882a593Smuzhiyun- local con 856*4882a593Smuzhiyun- for con in /sys/class/graphics/*/state; do 857*4882a593Smuzhiyun- [ -f $con ] || continue 858*4882a593Smuzhiyun- echo 1 >"${con}" 859*4882a593Smuzhiyun- done 860*4882a593Smuzhiyun-} 861*4882a593Smuzhiyun- 862*4882a593Smuzhiyun-resume_fbcon() 863*4882a593Smuzhiyun-{ 864*4882a593Smuzhiyun- local con 865*4882a593Smuzhiyun- for con in /sys/class/graphics/*/state; do 866*4882a593Smuzhiyun- [ -f $con ] || continue 867*4882a593Smuzhiyun- echo 0 >"${con}" 868*4882a593Smuzhiyun- done 869*4882a593Smuzhiyun-} 870*4882a593Smuzhiyun- 871*4882a593Smuzhiyun-maybe_chvt() 872*4882a593Smuzhiyun-{ 873*4882a593Smuzhiyun- is_set "$QUIRK_NO_CHVT" && return 874*4882a593Smuzhiyun- fgconsole |savestate console 875*4882a593Smuzhiyun- chvt 63 876*4882a593Smuzhiyun-} 877*4882a593Smuzhiyun- 878*4882a593Smuzhiyun-maybe_deallocvt() 879*4882a593Smuzhiyun-{ 880*4882a593Smuzhiyun- state_exists console || return 0 881*4882a593Smuzhiyun- chvt $(restorestate console) 882*4882a593Smuzhiyun- deallocvt 63 883*4882a593Smuzhiyun-} 884*4882a593Smuzhiyun- 885*4882a593Smuzhiyun-# Some tiny helper functions for quirk handling 886*4882a593Smuzhiyun-quirk() { is_set "$1" && [ -z $QUIRK_NONE ]; } 887*4882a593Smuzhiyun- 888*4882a593Smuzhiyun-# save/restore vbe state 889*4882a593Smuzhiyun-vbe_savestate() { vbe vbestate save |savestate vbestate; } 890*4882a593Smuzhiyun-vbe_restorestate() { restorestate vbestate |vbe vbestate restore; } 891*4882a593Smuzhiyun- 892*4882a593Smuzhiyun-# save/restore the vbe mode 893*4882a593Smuzhiyun-vbe_savemode() { vbe vbemode get |savestate vbemode; } 894*4882a593Smuzhiyun-vbe_restoremode() 895*4882a593Smuzhiyun-{ 896*4882a593Smuzhiyun- # this is a little mode complicated to handle special-casing mode 3. 897*4882a593Smuzhiyun- local vbemode=$(restorestate vbemode) 898*4882a593Smuzhiyun- if [ "$vbemode" = "3" ]; then 899*4882a593Smuzhiyun- vbe vgamode set $vbemode 900*4882a593Smuzhiyun- else 901*4882a593Smuzhiyun- vbe vbemode set $vbemode 902*4882a593Smuzhiyun- fi 903*4882a593Smuzhiyun-} 904*4882a593Smuzhiyun- 905*4882a593Smuzhiyun-# post the video card 906*4882a593Smuzhiyun-vbe_post() 907*4882a593Smuzhiyun-{ 908*4882a593Smuzhiyun- local rom="/var/run/video.rom" 909*4882a593Smuzhiyun- # if we do not have a romfile, do not post with it. 910*4882a593Smuzhiyun- [ -f "$rom" ] || unset rom 911*4882a593Smuzhiyun- vbe post $rom 912*4882a593Smuzhiyun- sleep 0.1 913*4882a593Smuzhiyun-} 914*4882a593Smuzhiyun- 915*4882a593Smuzhiyun-# turn critical bits of radeon cards off/on 916*4882a593Smuzhiyun-radeon_off() { radeon dac off; radeon light off; } 917*4882a593Smuzhiyun-radeon_on() { radeon dac on; radeon light on; } 918*4882a593Smuzhiyun- 919*4882a593Smuzhiyun-# save and restore video card PCI config state 920*4882a593Smuzhiyun-save_pci() 921*4882a593Smuzhiyun-{ 922*4882a593Smuzhiyun- local pci="/sys/bus/pci/devices" 923*4882a593Smuzhiyun- for dev in "${pci}"/*; do 924*4882a593Smuzhiyun- [ -f "${dev}/class" ] || continue 925*4882a593Smuzhiyun- [ $(cat "${dev}/class") = "0x030000" ] || continue 926*4882a593Smuzhiyun- [ -f "${dev}/config" ] || continue 927*4882a593Smuzhiyun- # it is a video card, it has a configuration. Save it. 928*4882a593Smuzhiyun- savestate "pci_video_${dev##*/}" <${dev}/config 929*4882a593Smuzhiyun- done 930*4882a593Smuzhiyun-} 931*4882a593Smuzhiyun- 932*4882a593Smuzhiyun-restore_pci() 933*4882a593Smuzhiyun-{ 934*4882a593Smuzhiyun- local pci="/sys/bus/pci/devices" 935*4882a593Smuzhiyun- for dev in "${pci}"/*; do 936*4882a593Smuzhiyun- state_exists "pci_video_${dev##*/}" || continue 937*4882a593Smuzhiyun- restorestate "pci_video_${dev##*/}" > "${dev}/config" 938*4882a593Smuzhiyun- done 939*4882a593Smuzhiyun-} 940*4882a593Smuzhiyun- 941*4882a593Smuzhiyun-suspend_video() 942*4882a593Smuzhiyun-{ 943*4882a593Smuzhiyun- # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both 944*4882a593Smuzhiyun- local acpi_flag=0 945*4882a593Smuzhiyun- quirk "${QUIRK_S3_BIOS}" && acpi_flag=$(($acpi_flag + 1)) 946*4882a593Smuzhiyun- quirk "${QUIRK_S3_MODE}" && acpi_flag=$(($acpi_flag + 2)) 947*4882a593Smuzhiyun- sysctl -w kernel.acpi_video_flags=$acpi_flag 948*4882a593Smuzhiyun- 949*4882a593Smuzhiyun- quirk "${QUIRK_NOFB}" && die_if_framebuffer 950*4882a593Smuzhiyun- quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_savestate 951*4882a593Smuzhiyun- quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_savemode 952*4882a593Smuzhiyun- quirk "${QUIRK_RADEON_OFF}" && radeon_off 953*4882a593Smuzhiyun- quirk "${QUIRK_SAVE_PCI}" && save_pci 954*4882a593Smuzhiyun- quirk "${QUIRK_VGA_MODE_3}" && vbe vbemode set 3 955*4882a593Smuzhiyun- quirk "${QUIRK_DPMS_SUSPEND}" && vbe dpms suspend 956*4882a593Smuzhiyun- save_fbcon 957*4882a593Smuzhiyun-} 958*4882a593Smuzhiyun-resume_video() 959*4882a593Smuzhiyun-{ 960*4882a593Smuzhiyun- # We might need to do one or many of these quirks 961*4882a593Smuzhiyun- quirk "${QUIRK_SAVE_PCI}" && restore_pci 962*4882a593Smuzhiyun- quirk "${QUIRK_VBE_POST}" && vbe_post 963*4882a593Smuzhiyun- quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_restorestate 964*4882a593Smuzhiyun- quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_restoremode 965*4882a593Smuzhiyun- resume_fbcon # also should be handled by a quirk. 966*4882a593Smuzhiyun- quirk "${QUIRK_RADEON_OFF}" && radeon_on 967*4882a593Smuzhiyun- quirk "${QUIRK_DPMS_ON}" && vbe dpms on 968*4882a593Smuzhiyun- quirk "${QUIRK_RESET_BRIGHTNESS}" && reset_brightness 969*4882a593Smuzhiyun- return 0 # avoid spurious hook exit failure message. 970*4882a593Smuzhiyun-} 971*4882a593Smuzhiyun- 972*4882a593Smuzhiyun-help() { 973*4882a593Smuzhiyun- echo # first echo makes it look nicer. 974*4882a593Smuzhiyun- echo "Video quirk handler options:" 975*4882a593Smuzhiyun- echo 976*4882a593Smuzhiyun- echo " --quirk-dpms-on" 977*4882a593Smuzhiyun- echo " --quirk-dpms-suspend" 978*4882a593Smuzhiyun- echo " --quirk-radeon-off" 979*4882a593Smuzhiyun- echo " --quirk-reset-brightness" 980*4882a593Smuzhiyun- echo " --quirk-s3-bios" 981*4882a593Smuzhiyun- echo " --quirk-s3-mode" 982*4882a593Smuzhiyun- echo " --quirk-vbe-post" 983*4882a593Smuzhiyun- echo " --quirk-vbemode-restore" 984*4882a593Smuzhiyun- echo " --quirk-vbestate-restore" 985*4882a593Smuzhiyun- echo " --quirk-vga-mode-3" 986*4882a593Smuzhiyun- echo " --quirk-none" 987*4882a593Smuzhiyun-} 988*4882a593Smuzhiyun- 989*4882a593Smuzhiyun-case "$1" in 990*4882a593Smuzhiyun- suspend) maybe_chvt; suspend_video ;; 991*4882a593Smuzhiyun- hibernate) maybe_chvt 992*4882a593Smuzhiyun- if is_set "$HIBERNATE_RESUME_POST_VIDEO"; then 993*4882a593Smuzhiyun- suspend_video 994*4882a593Smuzhiyun- fi 995*4882a593Smuzhiyun- ;; 996*4882a593Smuzhiyun- resume) resume_video; maybe_deallocvt;; 997*4882a593Smuzhiyun- thaw) 998*4882a593Smuzhiyun- if is_set "${HIBERNATE_RESUME_POST_VIDEO}"; then 999*4882a593Smuzhiyun- resume_video 1000*4882a593Smuzhiyun- fi 1001*4882a593Smuzhiyun- maybe_deallocvt 1002*4882a593Smuzhiyun- ;; 1003*4882a593Smuzhiyun- help) help ;; 1004*4882a593Smuzhiyun-esac 1005*4882a593Smuzhiyundiff --git a/pm/sleep.d/Makefile.am b/pm/sleep.d/Makefile.am 1006*4882a593Smuzhiyunindex 2350825..1d7e0fa 100644 1007*4882a593Smuzhiyun--- a/pm/sleep.d/Makefile.am 1008*4882a593Smuzhiyun+++ b/pm/sleep.d/Makefile.am 1009*4882a593Smuzhiyun@@ -1,17 +1,7 @@ 1010*4882a593Smuzhiyun sleepdir = $(libdir)/pm-utils/sleep.d 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyun sleep_SCRIPTS = \ 1013*4882a593Smuzhiyun- 00logging \ 1014*4882a593Smuzhiyun- 00powersave \ 1015*4882a593Smuzhiyun- 01grub \ 1016*4882a593Smuzhiyun- 49bluetooth \ 1017*4882a593Smuzhiyun- 55NetworkManager \ 1018*4882a593Smuzhiyun- 75modules \ 1019*4882a593Smuzhiyun- 90clock \ 1020*4882a593Smuzhiyun- 94cpufreq \ 1021*4882a593Smuzhiyun- 95led \ 1022*4882a593Smuzhiyun- 98video-quirk-db-handler \ 1023*4882a593Smuzhiyun- 99video 1024*4882a593Smuzhiyun+ 00logging 1025*4882a593Smuzhiyun 1026*4882a593Smuzhiyun EXTRA_DIST=$(sleep_SCRIPTS) 1027*4882a593Smuzhiyun 1028*4882a593Smuzhiyundiff --git a/pm/sleep.d/Makefile.in b/pm/sleep.d/Makefile.in 1029*4882a593Smuzhiyunindex d5a9243..c929d17 100644 1030*4882a593Smuzhiyun--- a/pm/sleep.d/Makefile.in 1031*4882a593Smuzhiyun+++ b/pm/sleep.d/Makefile.in 1032*4882a593Smuzhiyun@@ -155,17 +155,7 @@ top_builddir = @top_builddir@ 1033*4882a593Smuzhiyun top_srcdir = @top_srcdir@ 1034*4882a593Smuzhiyun sleepdir = $(libdir)/pm-utils/sleep.d 1035*4882a593Smuzhiyun sleep_SCRIPTS = \ 1036*4882a593Smuzhiyun- 00logging \ 1037*4882a593Smuzhiyun- 00powersave \ 1038*4882a593Smuzhiyun- 01grub \ 1039*4882a593Smuzhiyun- 49bluetooth \ 1040*4882a593Smuzhiyun- 55NetworkManager \ 1041*4882a593Smuzhiyun- 75modules \ 1042*4882a593Smuzhiyun- 90clock \ 1043*4882a593Smuzhiyun- 94cpufreq \ 1044*4882a593Smuzhiyun- 95led \ 1045*4882a593Smuzhiyun- 98video-quirk-db-handler \ 1046*4882a593Smuzhiyun- 99video 1047*4882a593Smuzhiyun+ 00logging 1048*4882a593Smuzhiyun 1049*4882a593Smuzhiyun EXTRA_DIST = $(sleep_SCRIPTS) 1050*4882a593Smuzhiyun all: all-am 1051*4882a593Smuzhiyun-- 1052*4882a593Smuzhiyun1.9.1 1053*4882a593Smuzhiyun 1054