PCI_EREPORT_SETUP(9F) Kernel Functions for Drivers PCI_EREPORT_SETUP(9F)

NAME


pci_ereport_setup, pci_ereport_teardown, pci_ereport_post - post error
reports for the generic PCI errors logged in the PCI Configuration Status
register.

SYNOPSIS


#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);


INTERFACE LEVEL


illumos DDI specific (illumos DDI)

PARAMETERS


dip
Pointer to the dev_info structure of the devices


dep
Pointer to DDI error status


status
Pointer to status bit storage location


DESCRIPTION


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:

o Detected Parity Error

o Master Data Parity Error

o Target Abort

o Master Abort

o System Error

o Discard Timeout


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()
Any errors discovered are unexpected.


DDI_FM_ERR_EXPECTED()
Errors discovered were the result of a
DDI_ACC_CAUTIOUS operation.


DDI_FM_ERR_POKE()
Errors discovered are the result of a
ddi_poke(9F) operation.


DDI_FM_ERR_PEEK()
Errors discovered are the result of a
ddi_peek(9F) operation.


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
No errors were detected which might affect this device
instance.


DDI_FM_FATAL
An error which is considered fatal to the operational
state of the system was detected.


DDI_FM_NONFATAL
An error which is not considered fatal to the
operational state of the system was detected. The
fme_acc_handle or fme_dma_handle fields in the
returned ddi_fm_error_t structure will typically
reference a handle that belongs to the device instance
that has been affected.


DDI_FM_UNKNOWN
An error was detected, but the call was unable to
determine the impact of the error on the operational
state of the system. This is treated the same way as
DDI_FM_FATAL unless some other device is able to
evaluate the fault to be DDI_FM_NONFATAL.


CONTEXT


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.

EXAMPLES


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);

}


ATTRIBUTES


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


+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Committed |
+--------------------+-----------------+

SEE ALSO


attributes(7), fmd(8), ddi_fm_handler_register(9F), ddi_fm_init(9F),
ddi_peek(9F), ddi_poke(9F), ddi_fm_error(9S)

illumos March 27, 2016 PCI_EREPORT_SETUP(9F)