Esempio n. 1
0
/*
 * 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);
}
Esempio n. 2
0
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);
}