               Linux Power Management Support

This document briefly describes how to use power management with your
Linux system and how to add power management support to Linux drivers.

APM or ACPI?
------------
If you have a relatively recent x86 mobile, desktop, or server system,
odds are it supports either Advanced Power Management (APM) or
Advanced Configuration and Power Interface (ACPI).  ACPI is the newer
of the two technologies and puts power management in the hands of the
operating system, allowing for more intelligent power management than
is possible with BIOS controlled APM.

The best way to determine which, if either, your system supports is to
build a kernel with both ACPI and APM enabled (as of 2.3.x ACPI is
enabled by default).  If a working ACPI implementation is found, the
ACPI driver will override and disable APM, otherwise the APM driver
will be used.

No, sorry, you cannot have both ACPI and APM enabled and running at
once.  Some people with broken ACPI or broken APM implementations
would like to use both to get a full set of working features, but you
simply cannot mix and match the two.  Only one power management
interface can be in control of the machine at once.  Think about it..

User-space Daemons
------------------
Both APM and ACPI rely on user-space daemons, apmd and acpid
respectively, to be completely functional.  Obtain both of these
daemons from your Linux distribution or from the Internet (see below)
and be sure that they are started sometime in the system boot process.
Go ahead and start both.  If ACPI or APM is not available on your
system the associated daemon will exit gracefully.

  apmd:   http://worldvisions.ca/~apenwarr/apmd/
  acpid:  http://acpid.sf.net/

Driver Interface -- OBSOLETE, DO NOT USE!
----------------*************************

Note: pm_register(), pm_access(), pm_dev_idle() and friends are
obsolete. Please do not use them. Instead you should properly hook
your driver into the driver model, and use its suspend()/resume()
callbacks to do this kind of stuff.

If you are writing a new driver or maintaining an old driver, it
should include power management support.  Without power management
support, a single driver may prevent a system with power management
capabilities from ever being able to suspend (safely).

Overview:
1) Register each instance of a device with "pm_register"
2) Call "pm_access" before accessing the hardware.
   (this will ensure that the hardware is awake and ready)
3) Your "pm_callback" is called before going into a
   suspend state (ACPI D1-D3) or after resuming (ACPI D0)
   from a suspend.
4) Call "pm_dev_idle" when the device is not being used
   (optional but will improve device idle detection)
5) When unloaded, unregister the device with "pm_unregister"

/*
 * Description: Register a device with the power-management subsystem
 *
 * Parameters:
 *   type - device type (PCI device, system device, ...)
 *   id - instance number or unique identifier
 *   cback - request handler callback (suspend, resume, ...)
 *
 * Returns: Registered PM device or NULL on error
 *
 * Examples:
 *   dev = pm_register(PM_SYS_DEV, PM_SYS_VGA, vga_callback);
 *
 *   struct pci_dev *pci_dev = pci_find_dev(...);
 *   dev = pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), callback);
 */
struct pm_dev *pm_register(pm_dev_t type, unsigned long id, pm_callback cback);

/*
 * Description: Unregister a device with the power management subsystem
 *
 * Parameters:
 *   dev - PM device previously returned from pm_register
 */
void pm_unregister(struct pm_dev *dev);

/*
 * Description: Unregister all devices with a matching callback function
 *
 * Parameters:
 *   cback - previously registered request callback
 *
 * Notes: Provided for easier porting from old APM interface
 */
void pm_unregister_all(pm_callback cback);

/*
 * Power management request callback
 *
 * Parameters:
 *   dev - PM device previously returned from pm_register
 *   rqst - request type
 *   data - data, if any, associated with the request
 *
 * Returns: 0 if the request is successful
 *          EINVAL if the request is not supported
 *          EBUSY if the device is now busy and cannot handle the request
 *          ENOMEM if the device was unable to handle the request due to memory
 *
 * Details: The device request callback will be called before the
 *          device/system enters a suspend state (ACPI D1-D3) or
 *          or after the device/system resumes from suspend (ACPI D0).
 *          For PM_SUSPEND, the ACPI D-state being entered is passed
 *          as the "data" argument to the callback.  The device
 *          driver should save (PM_SUSPEND) or restore (PM_RESUME)
 *          device context when the request callback is called.
 *
 *          Once a driver returns 0 (success) from a suspend
 *          request, it should not process any further requests or
 *          access the device hardware until a call to "pm_access" is made.
 */
typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);

Driver Details
--------------
This is just a quick Q&A as a stopgap until a real driver writers'
power management guide is available.

Q: When is a device suspended?

Devices can be suspended based on direct user request (eg. laptop lid
closes), system power policy (eg.  sleep after 30 minutes of console
inactivity), or device power policy (eg. power down device after 5
minutes of inactivity)

Q: Must a driver honor a suspend request?

No, a driver can return -EBUSY from a suspend request and this
will stop the system from suspending.  When a suspend request
fails, all suspended devices are resumed and the system continues
to run.  Suspend can be retried at a later time.

Q: Can the driver block suspend/resume requests?

Yes, a driver can delay its return from a suspend or resume
request until the device is ready to handle requests.  It
is advantageous to return as quickly as possible from a
request as suspend/resume are done serially.

Q: What context is a suspend/resume initiated from?

A suspend or resume is initiated from a kernel thread context.
It is safe to block, allocate memory, initiate requests
or anything else you can do within the kernel.

Q: Will requests continue to arrive after a suspend?

Possibly.  It is the driver's responsibility to queue(*),
fail, or drop any requests that arrive after returning
success to a suspend request.  It is important that the
driver not access its device until after it receives
a resume request as the device's bus may no longer
be active.

(*) If a driver queues requests for processing after
    resume be aware that the device, network, etc.
    might be in a different state than at suspend time.
    It's probably better to drop requests unless
    the driver is a storage device.

Q: Do I have to manage bus-specific power management registers

No.  It is the responsibility of the bus driver to manage
PCI, USB, etc. power management registers.  The bus driver
or the power management subsystem will also enable any
wake-on functionality that the device has.

Q: So, really, what do I need to do to support suspend/resume?

You need to save any device context that would
be lost if the device was powered off and then restore
it at resume time.  When ACPI is active, there are
three levels of device suspend states; D1, D2, and D3.
(The suspend state is passed as the "data" argument
to the device callback.)  With D3, the device is powered
off and loses all context, D1 and D2 are shallower power
states and require less device context to be saved.  To
play it safe, just save everything at suspend and restore
everything at resume.

Q: Where do I store device context for suspend?

Anywhere in memory, kmalloc a buffer or store it
in the device descriptor.  You are guaranteed that the
contents of memory will be restored and accessible
before resume, even when the system suspends to disk.

Q: What do I need to do for ACPI vs. APM vs. etc?

Drivers need not be aware of the specific power management
technology that is active.  They just need to be aware
of when the overlying power management system requests
that they suspend or resume.

Q: What about device dependencies?

When a driver registers a device, the power management
subsystem uses the information provided to build a
tree of device dependencies (eg. USB device X is on
USB controller Y which is on PCI bus Z)  When power
management wants to suspend a device, it first sends
a suspend request to its driver, then the bus driver,
and so on up to the system bus.  Device resumes
proceed in the opposite direction.

Q: Who do I contact for additional information about
   enabling power management for my specific driver/device?

ACPI Development mailing list: linux-acpi@vger.kernel.org

System Interface -- OBSOLETE, DO NOT USE!
----------------*************************
If you are providing new power management support to Linux (ie.
adding support for something like APM or ACPI), you should
communicate with drivers through the existing generic power
management interface.

/*
 * Send a request to all devices
 *
 * Parameters:
 *   rqst - request type
 *   data - data, if any, associated with the request
 *
 * Returns: 0 if the request is successful
 *          See "pm_callback" return for errors
 *
 * Details: Walk list of registered devices and call pm_send
 *          for each until complete or an error is encountered.
 *          If an error is encountered for a suspend request,
 *          return all devices to the state they were in before
 *          the suspend request.
 */
int pm_send_all(pm_request_t rqst, void *data);

/*
 * Find a matching device
 *
 * Parameters:
 *   type - device type (PCI device, system device, or 0 to match all devices)
 *   from - previous match or NULL to start from the beginning
 *
 * Returns: Matching device or NULL if none found
 */
struct pm_dev *pm_find(pm_dev_t type, struct pm_dev *from);
