PCI_EREPORT_SETUP(9F) | Kernel Functions for Drivers | PCI_EREPORT_SETUP(9F) |
pci_ereport_setup, pci_ereport_teardown, pci_ereport_post - post error reports for the generic PCI errors logged in the PCI Configuration Status register.
#include <sys/sunddi.h> void pci_ereport_setup(dev_info_t *dip);
void pci_ereport_teardown(dev_info_t *dip);
void pci_ereport_post(dev_info_t *dip, ddi_fm_error_t *dep,
uin16_t *status);
illumos DDI specific (illumos DDI)
dip
dep
status
The pci_ereport_setup() function initializes support for error report generation and sets up the resources for subsequent access to PCI, PCI/X or PCI Express Configuration space. The caller must have established a fault management capability level of at least DDI_FM_EREPORT_CAPABLE with a previous call to ddi_fm_init() for dip.
The pci_ereport_teardown() function releases any resources allocated and set up by pci_ereport_setup() and associated with dip.
The pci_ereport_post() function is called to scan for and post any PCI, PCI/X or PCI Express Bus errors. On a PCI bus, for example, the errors detected include:
The pci_ereport_post() function must be called only from a driver's error handler callback function. See ddi_fm_handler_register(9F). The error_status argument to the error handler callback function should be passed through as the dep argument to pci_ereport_post() as it may contain bus specific information that might be useful for handling any errors that are discovered.
The fme_flag in the error_status argument to the error handler callback function will contain one of the following:
DDI_FM_ERR_UNEXPECTED()
DDI_FM_ERR_EXPECTED()
DDI_FM_ERR_POKE()
DDI_FM_ERR_PEEK()
Error report events are generated automatically if fme_flag is set to DDI_FM_ERR_UNEXPECTED and the corresponding error bits are set in the various PCI, PCI/X or PCI Express Bus error registers of the device associated with dip. The generated error report events are posted to the illumos Fault Manager, fmd(8), for diagnosis.
If the status argument is non-null, pci_ereport_post() saves the contents of the PCI Configuration Status Register to *status. If it is not possible to read the PCI Configuration Status Register, -1 is returned in *status instead.
On return from the call to pci_ereport_post(), the ddi_fm_error_t structure pointed at by dep will have been updated, and the fme_status field contains one of the following values:
DDI_FM_OK
DDI_FM_FATAL
DDI_FM_NONFATAL
DDI_FM_UNKNOWN
The pci_ereport_setup() and pci_ereport_teardown() functions must be called from user or kernel context.
The pci_ereport_post() function can be called in any context.
int xxx_fmcap = DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE; xxx_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) {
ddi_fm_init(dip, &xxx_fmcap, &xxx_ibc);
if (xxx_fmcap & DDI_FM_ERRCB_CAPABLE)
ddi_fm_handler_register(dip, xxx_err_cb);
if (xxx_fmcap & DDI_FM_EREPORT_CAPABLE)
pci_ereport_setup(dip); } xxx_err_cb(dev_info_t *dip, ddi_fm_error_t *errp) {
uint16_t status;
pci_ereport_post(dip, errp, &status);
return (errp->fme_status); } xxx_detach(dev_info_t *dip, ddi_attach_cmd_t cmd) {
if (xxx_fmcap & DDI_FM_EREPORT_CAPABLE)
pci_ereport_teardown(dip);
if (xxx_fmcap & DDI_FM_ERRCB_CAPABLE)
ddi_fm_handler_unregister(dip);
ddi_fm_fini(dip); }
See attributes(7) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Interface Stability | Committed |
attributes(7), fmd(8), ddi_fm_handler_register(9F), ddi_fm_init(9F), ddi_peek(9F), ddi_poke(9F), ddi_fm_error(9S)
March 27, 2016 | OmniOS |