Go to main content

man pages section 9: DDI and DKI Kernel Functions

Exit Print View

Updated: July 2017
 
 

pci_save_config_regs(9F)

Name

pci_save_config_regs, pci_restore_config_regs - save and restore the PCI configuration registers

Synopsis

#include <sys/ddi.h>
#include <sys/sunddi.h>

int pci_save_config_regs(dev_info_t *dip);
int pci_restore_config_regs(dev_info_t *dip);

Interface Level

Solaris DDI-specific (Solaris DDI).

ARGUMENTS

dip

Pointer to the device's dev_info structure.

Description

pci_save_config_regs() saves the current configuration registers on persistent system memory. pci_restore_config_regs() restores configuration registers previously saved by pci_save_config_regs().

pci_save_config_regs() should be called by the driver's power() entry point before powering a device off (to PCI state D3). Likewise, pci_restore_config_regs() should be called after powering a device on (from PCI state D3), but before accessing the device. See power(9E).

Return Values

pci_save_config_regs() and pci_restore_config_regs() return:

DDI_SUCCESS

Operation completed successfully.

DDI_FAILURE

Operation failed to complete successfully.

Context

Both these functions can be called from user or kernel context.

Examples

Example 1 Invoking the save and restore functions
static int
xx_power(dev_info_t *dip, int component, int level) {
   struct xx *xx;
   int rval = DDI_SUCCESS;

   xx = ddi_get_soft_state(xx_softstate, ddi_get_instance(dip));
   if (xx == NULL) {
       return (DDI_FAILURE);
   }

   mutex_enter(&xx−>x_mutex);

   switch (level) {
   case PM_LEVEL_D0:
       XX_POWER_ON(xx);
       if (pci_restore_config_regs(dip) == DDI_FAILURE) {
           /*
            * appropriate error path handling here
            */
           ...
           rval = DDI_FAILURE;
           }
       break;

   case PM_LEVEL_D3:
       if (pci_save_config_regs(dip) == DDI_FAILURE) {
            /*
             * appropriate error path handling here
             */
            ...
            rval = DDI_FAILURE;
            } 
        else {
            XX_POWER_OFF(xx);
        }
        break;
       
    default:
          rval = DDI_FAILURE;
          break;
    }

    mutex_exit(&xx−>x_mutex);
    return (rval);
}

Attributes

See attributes(5) for descriptions of the following attributes:

ATTRIBUTE TYPE
ATTRIBUTE VALUE
Interface Stability
Committed

See Also

attributes(5), power(9E)

Writing Device Drivers for Oracle Solaris 11.3

PCI Bus Power Management Interface Specification Version 1.1

PCI Bus Specification Revision 2.1