/* * Function used to post PCI block module specific ereports. */ void pbm_ereport_post(dev_info_t *dip, uint64_t ena, pbm_errstate_t *pbm_err) { char buf[FM_MAX_CLASS]; (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", pbm_err->pbm_bridge_type, pbm_err->pbm_err_class); ena = ena ? ena : fm_ena_generate(0, FM_ENA_FMT1); ddi_fm_ereport_post(dip, buf, ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, PCI_CONFIG_STATUS, DATA_TYPE_UINT16, pbm_err->pbm_pci.pci_cfg_stat, PCI_CONFIG_COMMAND, DATA_TYPE_UINT16, pbm_err->pbm_pci.pci_cfg_comm, PCI_PBM_CSR, DATA_TYPE_UINT64, pbm_err->pbm_ctl_stat, PCI_PBM_AFSR, DATA_TYPE_UINT64, pbm_err->pbm_afsr, PCI_PBM_AFAR, DATA_TYPE_UINT64, pbm_err->pbm_afar, PCI_PBM_SLOT, DATA_TYPE_UINT64, pbm_err->pbm_err_sl, PCI_PBM_VALOG, DATA_TYPE_UINT64, pbm_err->pbm_va_log, NULL); }
int pcmu_cfg_report(dev_info_t *dip, ddi_fm_error_t *derr, pcmu_errstate_t *pcmu_err_p, int caller, uint32_t prierr) { int fatal = 0; int nonfatal = 0; int i; pcmu_t *pcmu_p; int instance = ddi_get_instance(dip); ASSERT(dip); pcmu_p = get_pcmu_soft_state(instance); derr->fme_ena = derr->fme_ena ? derr->fme_ena : fm_ena_generate(0, FM_ENA_FMT1); for (i = 0; pci_err_tbl[i].err_class != NULL; i++) { if (pcmu_err_p->pcmu_cfg_stat & pci_err_tbl[i].reg_bit) { char buf[FM_MAX_CLASS]; char *aux_msg = NULL; switch (pci_err_tbl[i].reg_bit) { case PCI_STAT_R_MAST_AB: aux_msg = "Recieved Master Abort"; /* LINTED fallthrough on case statement */ case PCI_STAT_R_TARG_AB: if (aux_msg != NULL) aux_msg = "Recieved Target Abort"; if (prierr) { /* * piow case are already handled in * pcmu_pbm_afsr_report() */ break; } if (caller != PCI_TRAP_CALL) { /* * if we haven't come from trap handler * we won't have an address */ fatal++; } break; default: /* * dpe on dma write or ta on dma */ nonfatal++; break; } (void) snprintf(buf, FM_MAX_CLASS, "%s %s: %s %s", (pcmu_p->pcmu_pcbm_p)->pcbm_nameinst_str, (pcmu_p->pcmu_pcbm_p)->pcbm_nameaddr_str, "PCI config space:", aux_msg); cmn_err(CE_WARN, "%s %s=0x%p", buf, "pbm-csr", (pcmu_p->pcmu_pcbm_p)->pcbm_ctrl_reg); } } if (fatal) return (DDI_FM_FATAL); else if (nonfatal) return (DDI_FM_NONFATAL); return (DDI_FM_OK); }