diff options
| -rw-r--r-- | Documentation/SubmittingDrivers | 15 | ||||
| -rw-r--r-- | Documentation/power/basic-pm-debugging.txt | 106 | ||||
| -rw-r--r-- | Documentation/power/drivers-testing.txt | 42 |
3 files changed, 163 insertions, 0 deletions
diff --git a/Documentation/SubmittingDrivers b/Documentation/SubmittingDrivers index 58bead05eabb..d7e26427e426 100644 --- a/Documentation/SubmittingDrivers +++ b/Documentation/SubmittingDrivers | |||
| @@ -87,6 +87,21 @@ Clarity: It helps if anyone can see how to fix the driver. It helps | |||
| 87 | driver that intentionally obfuscates how the hardware works | 87 | driver that intentionally obfuscates how the hardware works |
| 88 | it will go in the bitbucket. | 88 | it will go in the bitbucket. |
| 89 | 89 | ||
| 90 | PM support: Since Linux is used on many portable and desktop systems, your | ||
| 91 | driver is likely to be used on such a system and therefore it | ||
| 92 | should support basic power management by implementing, if | ||
| 93 | necessary, the .suspend and .resume methods used during the | ||
| 94 | system-wide suspend and resume transitions. You should verify | ||
| 95 | that your driver correctly handles the suspend and resume, but | ||
| 96 | if you are unable to ensure that, please at least define the | ||
| 97 | .suspend method returning the -ENOSYS ("Function not | ||
| 98 | implemented") error. You should also try to make sure that your | ||
| 99 | driver uses as little power as possible when it's not doing | ||
| 100 | anything. For the driver testing instructions see | ||
| 101 | Documentation/power/drivers-testing.txt and for a relatively | ||
| 102 | complete overview of the power management issues related to | ||
| 103 | drivers see Documentation/power/devices.txt . | ||
| 104 | |||
| 90 | Control: In general if there is active maintainance of a driver by | 105 | Control: In general if there is active maintainance of a driver by |
| 91 | the author then patches will be redirected to them unless | 106 | the author then patches will be redirected to them unless |
| 92 | they are totally obvious and without need of checking. | 107 | they are totally obvious and without need of checking. |
diff --git a/Documentation/power/basic-pm-debugging.txt b/Documentation/power/basic-pm-debugging.txt new file mode 100644 index 000000000000..1a85e2b964dc --- /dev/null +++ b/Documentation/power/basic-pm-debugging.txt | |||
| @@ -0,0 +1,106 @@ | |||
| 1 | Debugging suspend and resume | ||
| 2 | (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL | ||
| 3 | |||
| 4 | 1. Testing suspend to disk (STD) | ||
| 5 | |||
| 6 | To verify that the STD works, you can try to suspend in the "reboot" mode: | ||
| 7 | |||
| 8 | # echo reboot > /sys/power/disk | ||
| 9 | # echo disk > /sys/power/state | ||
| 10 | |||
| 11 | and the system should suspend, reboot, resume and get back to the command prompt | ||
| 12 | where you have started the transition. If that happens, the STD is most likely | ||
| 13 | to work correctly, but you need to repeat the test at least a couple of times in | ||
| 14 | a row for confidence. This is necessary, because some problems only show up on | ||
| 15 | a second attempt at suspending and resuming the system. You should also test | ||
| 16 | the "platform" and "shutdown" modes of suspend: | ||
| 17 | |||
| 18 | # echo platform > /sys/power/disk | ||
| 19 | # echo disk > /sys/power/state | ||
| 20 | |||
| 21 | or | ||
| 22 | |||
| 23 | # echo shutdown > /sys/power/disk | ||
| 24 | # echo disk > /sys/power/state | ||
| 25 | |||
| 26 | in which cases you will have to press the power button to make the system | ||
| 27 | resume. If that does not work, you will need to identify what goes wrong. | ||
| 28 | |||
| 29 | a) Test mode of STD | ||
| 30 | |||
| 31 | To verify if there are any drivers that cause problems you can run the STD | ||
| 32 | in the test mode: | ||
| 33 | |||
| 34 | # echo test > /sys/power/disk | ||
| 35 | # echo disk > /sys/power/state | ||
| 36 | |||
| 37 | in which case the system should freeze tasks, suspend devices, disable nonboot | ||
| 38 | CPUs (if any), wait for 5 seconds, enable nonboot CPUs, resume devices, thaw | ||
| 39 | tasks and return to your command prompt. If that fails, most likely there is | ||
| 40 | a driver that fails to either suspend or resume (in the latter case the system | ||
| 41 | may hang or be unstable after the test, so please take that into consideration). | ||
| 42 | To find this driver, you can carry out a binary search according to the rules: | ||
| 43 | - if the test fails, unload a half of the drivers currently loaded and repeat | ||
| 44 | (that would probably involve rebooting the system, so always note what drivers | ||
| 45 | have been loaded before the test), | ||
| 46 | - if the test succeeds, load a half of the drivers you have unloaded most | ||
| 47 | recently and repeat. | ||
| 48 | |||
| 49 | Once you have found the failing driver (there can be more than just one of | ||
| 50 | them), you have to unload it every time before the STD transition. In that case | ||
| 51 | please make sure to report the problem with the driver. | ||
| 52 | |||
| 53 | It is also possible that a cycle can still fail after you have unloaded | ||
| 54 | all modules. In that case, you would want to look in your kernel configuration | ||
| 55 | for the drivers that can be compiled as modules (testing again with them as | ||
| 56 | modules), and possibly also try boot time options such as "noapic" or "noacpi". | ||
| 57 | |||
| 58 | b) Testing minimal configuration | ||
| 59 | |||
| 60 | If the test mode of STD works, you can boot the system with "init=/bin/bash" | ||
| 61 | and attempt to suspend in the "reboot", "shutdown" and "platform" modes. If | ||
| 62 | that does not work, there probably is a problem with a driver statically | ||
| 63 | compiled into the kernel and you can try to compile more drivers as modules, | ||
| 64 | so that they can be tested individually. Otherwise, there is a problem with a | ||
| 65 | modular driver and you can find it by loading a half of the modules you normally | ||
| 66 | use and binary searching in accordance with the algorithm: | ||
| 67 | - if there are n modules loaded and the attempt to suspend and resume fails, | ||
| 68 | unload n/2 of the modules and try again (that would probably involve rebooting | ||
| 69 | the system), | ||
| 70 | - if there are n modules loaded and the attempt to suspend and resume succeeds, | ||
| 71 | load n/2 modules more and try again. | ||
| 72 | |||
| 73 | Again, if you find the offending module(s), it(they) must be unloaded every time | ||
| 74 | before the STD transition, and please report the problem with it(them). | ||
| 75 | |||
| 76 | c) Advanced debugging | ||
| 77 | |||
| 78 | In case the STD does not work on your system even in the minimal configuration | ||
| 79 | and compiling more drivers as modules is not practical or some modules cannot | ||
| 80 | be unloaded, you can use one of the more advanced debugging techniques to find | ||
| 81 | the problem. First, if there is a serial port in your box, you can set the | ||
| 82 | CONFIG_DISABLE_CONSOLE_SUSPEND kernel configuration option and try to log kernel | ||
| 83 | messages using the serial console. This may provide you with some information | ||
| 84 | about the reasons of the suspend (resume) failure. Alternatively, it may be | ||
| 85 | possible to use a FireWire port for debugging with firescope | ||
| 86 | (ftp://ftp.firstfloor.org/pub/ak/firescope/). On i386 it is also possible to | ||
| 87 | use the PM_TRACE mechanism documented in Documentation/s2ram.txt . | ||
| 88 | |||
| 89 | 2. Testing suspend to RAM (STR) | ||
| 90 | |||
| 91 | To verify that the STR works, it is generally more convenient to use the s2ram | ||
| 92 | tool available from http://suspend.sf.net and documented at | ||
| 93 | http://en.opensuse.org/s2ram . However, before doing that it is recommended to | ||
| 94 | carry out the procedure described in section 1. | ||
| 95 | |||
| 96 | Assume you have resolved the problems with the STD and you have found some | ||
| 97 | failing drivers. These drivers are also likely to fail during the STR or | ||
| 98 | during the resume, so it is better to unload them every time before the STR | ||
| 99 | transition. Now, you can follow the instructions at | ||
| 100 | http://en.opensuse.org/s2ram to test the system, but if it does not work | ||
| 101 | "out of the box", you may need to boot it with "init=/bin/bash" and test | ||
| 102 | s2ram in the minimal configuration. In that case, you may be able to search | ||
| 103 | for failing drivers by following the procedure analogous to the one described in | ||
| 104 | 1b). If you find some failing drivers, you will have to unload them every time | ||
| 105 | before the STR transition (ie. before you run s2ram), and please report the | ||
| 106 | problems with them. | ||
diff --git a/Documentation/power/drivers-testing.txt b/Documentation/power/drivers-testing.txt new file mode 100644 index 000000000000..33016c2f18dd --- /dev/null +++ b/Documentation/power/drivers-testing.txt | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | Testing suspend and resume support in device drivers | ||
| 2 | (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL | ||
| 3 | |||
| 4 | 1. Preparing the test system | ||
| 5 | |||
| 6 | Unfortunately, to effectively test the support for the system-wide suspend and | ||
| 7 | resume transitions in a driver, it is necessary to suspend and resume a fully | ||
| 8 | functional system with this driver loaded. Moreover, that should be done | ||
| 9 | several times, preferably several times in a row, and separately for the suspend | ||
| 10 | to disk (STD) and the suspend to RAM (STR) transitions, because each of these | ||
| 11 | cases involves different ordering of operations and different interactions with | ||
| 12 | the machine's BIOS. | ||
| 13 | |||
| 14 | Of course, for this purpose the test system has to be known to suspend and | ||
| 15 | resume without the driver being tested. Thus, if possible, you should first | ||
| 16 | resolve all suspend/resume-related problems in the test system before you start | ||
| 17 | testing the new driver. Please see Documents/power/basic-pm-debugging.txt for | ||
| 18 | more information about the debugging of suspend/resume functionality. | ||
| 19 | |||
| 20 | 2. Testing the driver | ||
| 21 | |||
| 22 | Once you have resolved the suspend/resume-related problems with your test system | ||
| 23 | without the new driver, you are ready to test it: | ||
| 24 | |||
| 25 | a) Build the driver as a module, load it and try the STD in the test mode (see: | ||
| 26 | Documents/power/basic-pm-debugging.txt, 1a)). | ||
| 27 | |||
| 28 | b) Load the driver and attempt to suspend to disk in the "reboot", "shutdown" | ||
| 29 | and "platform" modes (see: Documents/power/basic-pm-debugging.txt, 1). | ||
| 30 | |||
| 31 | c) Compile the driver directly into the kernel and try the STD in the test mode. | ||
| 32 | |||
| 33 | d) Attempt to suspend to disk with the driver compiled directly into the kernel | ||
| 34 | in the "reboot", "shutdown" and "platform" modes. | ||
| 35 | |||
| 36 | e) Attempt to suspend to RAM using the s2ram tool with the driver loaded (see: | ||
| 37 | Documents/power/basic-pm-debugging.txt, 2). As far as the STR tests are | ||
| 38 | concerned, it should not matter whether or not the driver is built as a module. | ||
| 39 | |||
| 40 | Each of the above tests should be repeated several times and the STD tests | ||
| 41 | should be mixed with the STR tests. If any of them fails, the driver cannot be | ||
| 42 | regarded as suspend/resume-safe. | ||
