Add pci_save_state() and pci_restore_state() wrappers around

pci_cfg_save() and pci_cfg_restore() for device drivers to use when
saving and restoring state (e.g. to handle device-specific resets).

Reviewed by:	imp
MFC after:	2 weeks
This commit is contained in:
John Baldwin 2012-03-01 20:20:55 +00:00
parent 5c8d3de02b
commit 9415d1e0ac
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=232360
4 changed files with 49 additions and 0 deletions

View File

@ -980,6 +980,8 @@ MLINKS+=pci.9 pci_disable_busmaster.9 \
pci.9 pci_find_device.9 \
pci.9 pci_get_powerstate.9 \
pci.9 pci_read_config.9 \
pci.9 pci_restore_state.9 \
pci.9 pci_save_state.9 \
pci.9 pci_set_powerstate.9 \
pci.9 pci_write_config.9
MLINKS+=pfil.9 pfil_add_hook.9 \

View File

@ -38,6 +38,8 @@
.Nm pci_disable_io ,
.Nm pci_set_powerstate ,
.Nm pci_get_powerstate ,
.Nm pci_save_state ,
.Nm pci_restore_state ,
.Nm pci_find_bsf ,
.Nm pci_find_dbsf ,
.Nm pci_find_device
@ -63,6 +65,10 @@
.Fn pci_get_powerstate "device_t dev"
.Ft uint32_t
.Fn pci_read_config "device_t dev" "int reg" "int width"
.Ft void
.Fn pci_save_state "device_t dev"
.Ft void
.Fn pci_restore_state "device_t dev"
.Ft device_t
.Fn pci_find_bsf "uint8_t bus" "uint8_t slot" "uint8_t func"
.Ft device_t
@ -188,6 +194,26 @@ of
is set.
.Pp
The
.Fn pci_save_state
and
.Fn pci_restore_state
functions can be used by a device driver to save and restore standard PCI
config registers.
The
.Fn pci_save_state
function must be invoked while the device has valid state before
.Fn pci_restore_state
can be used.
If the device is not in the fully-powered state
.Pq Dv PCI_POWERSTATE_D0
when
.Fn pci_restore_state
is invoked,
then the device will be transitioned to
.Dv PCI_POWERSTATE_D0
before any config registers are restored.
.Pp
The
.Fn pci_find_bsf
function looks up the
.Vt device_t

View File

@ -4426,3 +4426,22 @@ pci_cfg_save(device_t dev, struct pci_devinfo *dinfo, int setstate)
if (pci_get_powerstate(dev) != PCI_POWERSTATE_D3)
pci_set_powerstate(dev, PCI_POWERSTATE_D3);
}
/* Wrapper APIs suitable for device driver use. */
void
pci_save_state(device_t dev)
{
struct pci_devinfo *dinfo;
dinfo = device_get_ivars(dev);
pci_cfg_save(dev, dinfo, 0);
}
void
pci_restore_state(device_t dev)
{
struct pci_devinfo *dinfo;
dinfo = device_get_ivars(dev);
pci_cfg_restore(dev, dinfo);
}

View File

@ -467,6 +467,8 @@ int pci_msi_device_blacklisted(device_t dev);
void pci_ht_map_msi(device_t dev, uint64_t addr);
int pci_get_max_read_req(device_t dev);
void pci_restore_state(device_t dev);
void pci_save_state(device_t dev);
int pci_set_max_read_req(device_t dev, int size);
#endif /* _SYS_BUS_H_ */