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)                               March 27, 2016          PCI_EREPORT_SETUP(9F)