xref: /OK3568_Linux_fs/buildroot/package/pm-utils/0001-pm-sleep.d-remove-unused-sleep-hooks.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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