pci.txt
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. PCI Power Management
  2. ~~~~~~~~~~~~~~~~~~~~
  3. An overview of the concepts and the related functions in the Linux kernel
  4. Patrick Mochel <mochel@transmeta.com>
  5. ---------------------------------------------------------------------------
  6. 1. Overview
  7. 2. How the PCI Subsystem Does Power Management
  8. 3. PCI Utility Functions
  9. 4. PCI Device Drivers
  10. 5. Resources
  11. 1. Overview
  12. ~~~~~~~~~~~
  13. The PCI Power Management Specification was introduced between the PCI 2.1 and
  14. PCI 2.2 Specifications. It a standard interface for controlling various 
  15. power management operations.
  16. Implementation of the PCI PM Spec is optional, as are several sub-components of
  17. it. If a device supports the PCI PM Spec, the device will have an 8 byte 
  18. capability field in its PCI configuration space. This field is used to describe
  19. and control the standard PCI power management features.
  20. The PCI PM spec defines 4 operating states for devices (D0 - D3) and for buses
  21. (B0 - B3). The higher the number, the less power the device consumes. However,
  22. the higher the number, the longer the latency is for the device to return to 
  23. an operational state (D0).
  24. Bus power management is not covered in this version of this document.
  25. Note that all PCI devices support D0 and D3 by default, regardless of whether or
  26. not they implement any of the PCI PM spec.
  27. The possible state transitions that a device can undergo are:
  28. +---------------------------+
  29. | Current State | New State |
  30. +---------------------------+
  31. | D0            | D1, D2, D3|
  32. +---------------------------+
  33. | D1            | D2, D3    |
  34. +---------------------------+
  35. | D2            | D3        |
  36. +---------------------------+
  37. | D1, D2, D3    | D0        |
  38. +---------------------------+
  39. Note that when the system is entering a global suspend state, all devices will be 
  40. placed into D3 and when resuming, all devices will be placed into D0. However, 
  41. when the system is running, other state transitions are possible.
  42. 2. How The PCI Subsystem Handles Power Management
  43. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  44. The PCI suspend/resume functionality is accessed indirectly via the Power Management 
  45. subsystem. At boot, the PCI driver registers a power management callback with that layer.
  46. Upon entering a suspend state, the PM layer iterates through all of its registered 
  47. callbacks. This currently takes place only during APM state transitions.
  48. Upon going to sleep, the PCI subsystem walks its device tree twice. Both times, it does
  49. a depth first walk of the device tree. The first walk saves each of the device's state 
  50. and checks for devices that will prevent the system from entering a global power state. 
  51. The next walk then places the devices in a low power state.
  52. The first walk allows a graceful recovery in the event of a failure, since none of the 
  53. devices have actually been powered down.
  54. In both walks, in particular the second, all children of a bridge are touched before the
  55. actual bridge itself. This allows the bridge to retain power while its children are being
  56. accessed.
  57. Upon resuming from sleep, just the opposite must be true: all bridges must be powered on
  58. and restored before their children are powered on. This is easily accomplished with a
  59. breadth-first walk of the PCI device tree.
  60. 3. PCI Utility Functions
  61. ~~~~~~~~~~~~~~~~~~~~~~~~
  62. These are helper functions designed to be called by individual device drivers.
  63. Assuming that a device behaves as advertised, these should be applicable in most
  64. cases. However, results may vary.
  65. Note that these functions are never implicitly called for the driver. The driver is always
  66. responsible for deciding when and if to call these.
  67. pci_save_state
  68. --------------
  69. Usage:
  70. pci_save_state(dev, buffer);
  71. Description:
  72. Save first 64 bytes of PCI config space. Buffer must be allocated by caller.
  73. pci_restore_state
  74. -----------------
  75. Usage:
  76. pci_restore_state(dev, buffer);
  77. Description:
  78. Restore previously saved config space. (First 64 bytes only);
  79. If buffer is NULL, then restore what information we know about the device
  80. from bootup: BARs and interrupt line.
  81. pci_set_power_state
  82. -------------------
  83. Usage:
  84. pci_set_power_state(dev, state);
  85. Description:
  86. Transition device to low power state using PCI PM Capabilities registers.
  87. Will fail under one of the following conditions:
  88. - If state is less than current state, but not D0 (illegal transition)
  89. - Device doesn't support PM Capabilities
  90. - Device does not support requested state
  91. pci_enable_wake
  92. ---------------
  93. Usage:
  94. pci_enable_wake(dev, state, enable);
  95. Description:
  96. Enable device to generate PME# during low power state using PCI PM 
  97. Capabilities.
  98. Checks whether if device supports generating PME# from requested state and fail
  99. if it does not, unless enable == 0 (request is to disable wake events, which
  100. is implicit if it doesn't even support it in the first place).
  101. Note that the PMC Register in the device's PM Capabilties has a bitmask of
  102. the states it supports generating PME# from. D3hot is bit 3 and D3cold is bit
  103. 4. So, while a value of 4 as the state may not seem semantically correct, it
  104. is. 
  105. 4. PCI Device Drivers
  106. ~~~~~~~~~~~~~~~~~~~~~
  107. These functions are intended for use by individual drivers, and are defined in 
  108. struct pci_driver:
  109.         int  (*save_state) (struct pci_dev *dev, u32 state);
  110.         int  (*suspend) (struct pci_dev *dev, u32 state);
  111.         int  (*resume) (struct pci_dev *dev);
  112.         int  (*enable_wake) (struct pci_dev *dev, u32 state, int enable);
  113. save_state
  114. ----------
  115. Usage:
  116. if (dev->driver && dev->driver->save_state)
  117. dev->driver->save_state(dev,state);
  118. The driver should use this callback to save device state. It should take into 
  119. account the current state of the device and the requested state in order to avoid
  120. any unnecessary operations.
  121. For example, a video card that supports all 4 states (D0-D3), all controller context
  122. is preserved when entering D1, but the screen is placed into a low power state
  123. (blanked). 
  124. The driver can also interpret this function as a notification that it may be entering
  125. a sleep state in the near future. If it knows that the device cannot enter the 
  126. requested state, either because of lack of support for it, or because the device is 
  127. middle of some critical operation, then it should fail.
  128. This function should not be used to set any state in the device or the driver because
  129. the device may not actually enter the sleep state (e.g. another driver later causes
  130. causes a global state transition to fail).
  131. Note that in intermediate low power states, a device's I/O and memory spaces may be
  132. disabled and may not be available in subsequent transitions to lower power states.
  133. suspend
  134. -------
  135. Usage:
  136. if (dev->driver && dev->driver->suspend)
  137. dev->driver->suspend(dev,state);
  138. A driver uses this function to actually transition the device into a low power 
  139. state. This may include disabling I/O, memory and bus-mastering, as well as physically
  140. transitioning the device to a lower power state.
  141. Bus mastering may be disabled by doing:
  142. pci_disable_device(dev);
  143. For devices that support the PCI PM Spec, this may be used to set the device's power 
  144. state:
  145. pci_set_power_state(dev,state);
  146. The driver is also responsible for disabling any other device-specific features
  147. (e.g blanking screen, turning off on-card memory, etc).
  148. The driver should be sure to track the current state of the device, as it may obviate
  149. the need for some operations.
  150. The driver should update the current_state field in its pci_dev structure in this 
  151. function.
  152. resume
  153. ------
  154. Usage:
  155. if (dev->driver && dev->driver->suspend)
  156. dev->driver->resume(dev)
  157. The resume callback may be called from any power state, and is always meant to 
  158. transition the device to the D0 state. 
  159. The driver is responsible for reenabling any features of the device that had 
  160. been disabled during previous suspend calls and restoring all state that was saved
  161. in previous save_state calls.
  162. If the device is currently in D3, it must be completely reinitialized, as it must be
  163. assumed that the device has lost all of its context (even that of its PCI config 
  164. space). For almost all current drivers, this means that the initialization code that
  165. the driver does at boot must be separated out and called again from the resume
  166. callback. Note that some values for the device may not have to be probed for this
  167. time around if they are saved before entering the low power state.
  168. If the device supports the PCI PM Spec, it can use this to physically transition the
  169. device to D0:
  170. pci_set_power_state(dev,0);
  171. Note that if the entire system is transitioning out of a global sleep state, all 
  172. devices will be placed in the D0 state, so this is not necessary. However, in the
  173. event that the device is placed in the D3 state during normal operation, this call
  174. is necessary. It is impossible to determine which of the two events is taking place
  175. in the driver, so it is always a good idea to make that call.
  176. The driver should take note of the state that it is resuming from in order to ensure
  177. correct (and speedy) operation.
  178. The driver should update the current_state field in its pci_dev structure in this 
  179. function.
  180. enable_wake
  181. -----------
  182. Usage:
  183. if (dev->driver && dev->driver->enable_wake)
  184. dev->driver->enable_wake(dev,state,enable);
  185. This callback is generally only relevant for devices that support the PCI PM
  186. spec and have the ability to generate a PME# (Power Management Event Signal)
  187. to wake the system up. (However, it is possible that a device may support 
  188. some non-standard way of generating a wake event on sleep.)
  189. Bits 15:11 of the PMC (Power Mgmt Capabilities) Register in a device's
  190. PM Capabilties describe what power states the device supports generating a 
  191. wake event from:
  192. +------------------+
  193. |  Bit  |  State   |
  194. +------------------+
  195. |  15   |   D0     |
  196. |  14   |   D1     |
  197. |  13   |   D2     |
  198. |  12   |   D3hot  |
  199. |  11   |   D3cold |
  200. +------------------+
  201. A device can use this to enable wake events:
  202.  pci_enable_wake(dev,state,enable);
  203. Note that to enable PME# from D3cold, a value of 4 should be passed to 
  204. pci_enable_wake (since it uses an index into a bitmask). If a driver gets
  205. a request to enable wake events from D3, two calls should be made to 
  206. pci_enable_wake (one for both D3hot and D3cold).
  207. 5. Resources
  208. ~~~~~~~~~~~~
  209. PCI Local Bus Specification 
  210. PCI Bus Power Management Interface Specification
  211.   http://pcisig.org