diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/sun4/io/px/px_fm.c | 8 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/px/px_err.c | 123 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/px/px_err_impl.h | 7 | ||||
-rw-r--r-- | usr/src/uts/sun4v/io/px/px_err.c | 38 |
4 files changed, 130 insertions, 46 deletions
diff --git a/usr/src/uts/sun4/io/px/px_fm.c b/usr/src/uts/sun4/io/px/px_fm.c index ad9497e914..987649b781 100644 --- a/usr/src/uts/sun4/io/px/px_fm.c +++ b/usr/src/uts/sun4/io/px/px_fm.c @@ -250,12 +250,16 @@ int px_handle_lookup(dev_info_t *dip, int type, uint64_t fme_ena, void *afar) { uint32_t cap = ((px_t *)DIP_TO_STATE(dip))->px_fm_cap; + int ret = DDI_FM_FATAL; + int (*f)() = type == DMA_HANDLE ? (DDI_FM_DMA_ERR_CAP(cap) ? px_dma_check : NULL) : (DDI_FM_ACC_ERR_CAP(cap) ? px_acc_check : NULL); - return (f ? ndi_fmc_error(dip, NULL, type, f, fme_ena, afar) : - DDI_FM_UNKNOWN); + if (f) + ret = ndi_fmc_error(dip, NULL, type, f, fme_ena, afar); + + return (ret == DDI_FM_UNKNOWN ? DDI_FM_FATAL : ret); } /* diff --git a/usr/src/uts/sun4u/io/px/px_err.c b/usr/src/uts/sun4u/io/px/px_err.c index 59bb8611d2..b2300df153 100644 --- a/usr/src/uts/sun4u/io/px/px_err.c +++ b/usr/src/uts/sun4u/io/px/px_err.c @@ -54,6 +54,11 @@ 0, \ PX_ERR_BIT_HANDLE(hdl), \ PX_ERPT_SEND(erpt), \ + PX_ERR_JBC_CLASS(bit) }, \ + { JBC_INTERRUPT_STATUS_ ## bit ## _S, \ + 0, \ + PX_ERR_BIT_HANDLE(hdl), \ + PX_ERPT_SEND(erpt), \ PX_ERR_JBC_CLASS(bit) px_err_bit_desc_t px_err_cb_tbl[] = { /* JBC FATAL - see io erpt doc, section 1.1 */ @@ -112,6 +117,11 @@ px_err_bit_desc_t px_err_cb_tbl[] = { 0, \ PX_ERR_BIT_HANDLE(hdl), \ PX_ERPT_SEND(erpt), \ + PX_ERR_DMC_CLASS(bit) }, \ + { IMU_INTERRUPT_STATUS_ ## bit ## _S, \ + 0, \ + PX_ERR_BIT_HANDLE(hdl), \ + PX_ERPT_SEND(erpt), \ PX_ERR_DMC_CLASS(bit) px_err_bit_desc_t px_err_imu_tbl[] = { /* DMC IMU RDS - see io erpt doc, section 2.1 */ @@ -139,6 +149,11 @@ px_err_bit_desc_t px_err_imu_tbl[] = { 0, \ PX_ERR_BIT_HANDLE(hdl), \ PX_ERPT_SEND(erpt), \ + PX_ERR_DMC_CLASS(bit) }, \ + { MMU_INTERRUPT_STATUS_ ## bit ## _S, \ + 0, \ + PX_ERR_BIT_HANDLE(hdl), \ + PX_ERPT_SEND(erpt), \ PX_ERR_DMC_CLASS(bit) px_err_bit_desc_t px_err_mmu_tbl[] = { /* DMC MMU TFAR/TFSR - see io erpt doc, section 2.4 */ @@ -167,6 +182,11 @@ px_err_bit_desc_t px_err_mmu_tbl[] = { 0, \ PX_ERR_BIT_HANDLE(hdl), \ PX_ERPT_SEND(erpt), \ + PX_ERR_PEC_CLASS(bit) }, \ + { ILU_INTERRUPT_STATUS_ ## bit ## _S, \ + 0, \ + PX_ERR_BIT_HANDLE(hdl), \ + PX_ERPT_SEND(erpt), \ PX_ERR_PEC_CLASS(bit) px_err_bit_desc_t px_err_ilu_tbl[] = { /* PEC ILU none - see io erpt doc, section 3.1 */ @@ -248,6 +268,11 @@ px_err_bit_desc_t px_err_tlu_ce_tbl[] = { 0, \ PX_ERR_BIT_HANDLE(hdl), \ PX_ERPT_SEND(erpt), \ + PX_ERR_PEC_CLASS(bit) }, \ + { TLU_OTHER_EVENT_STATUS_CLEAR_ ## bit ## _S, \ + 0, \ + PX_ERR_BIT_HANDLE(hdl), \ + PX_ERPT_SEND(erpt), \ PX_ERR_PEC_CLASS(bit) px_err_bit_desc_t px_err_tlu_oe_tbl[] = { /* @@ -852,6 +877,7 @@ px_err_erpt_and_clr(px_t *px_p, ddi_fm_error_t *derr, px_err_ss_t *ss) csr_base, ss_reg, derr, + err_bit_desc->bit, err_bit_desc->class_name); } } @@ -1003,11 +1029,12 @@ PX_ERPT_SEND_DEC(do_not) PX_ERPT_SEND_DEC(jbc_fatal) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1029,11 +1056,12 @@ PX_ERPT_SEND_DEC(jbc_fatal) PX_ERPT_SEND_DEC(jbc_merge) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1060,9 +1088,13 @@ px_err_jbc_merge_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t paddr; int ret; + if (!pri) + return (PX_FATAL_GOS); + paddr = CSR_XR(csr_base, MERGE_TRANSACTION_ERROR_LOG); paddr &= MERGE_TRANSACTION_ERROR_LOG_ADDRESS_MASK; @@ -1076,11 +1108,12 @@ px_err_jbc_merge_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(jbc_in) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1116,9 +1149,13 @@ px_err_jbc_jbusint_in_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t paddr; int ret; + if (!pri) + return (PX_FATAL_GOS); + paddr = CSR_XR(csr_base, JBCINT_IN_TRANSACTION_ERROR_LOG); paddr &= JBCINT_IN_TRANSACTION_ERROR_LOG_ADDRESS_MASK; @@ -1133,11 +1170,12 @@ px_err_jbc_jbusint_in_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(jbc_out) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1159,11 +1197,12 @@ PX_ERPT_SEND_DEC(jbc_out) PX_ERPT_SEND_DEC(jbc_odcd) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1193,9 +1232,13 @@ px_err_jbc_dmcint_odcd_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t paddr; int ret; + if (!pri) + return (PX_FATAL_GOS); + paddr = CSR_XR(csr_base, DMCINT_ODCD_ERROR_LOG); paddr &= DMCINT_ODCD_ERROR_LOG_ADDRESS_MASK; @@ -1209,11 +1252,12 @@ px_err_jbc_dmcint_odcd_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(jbc_idc) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1233,11 +1277,12 @@ PX_ERPT_SEND_DEC(jbc_idc) PX_ERPT_SEND_DEC(jbc_csr) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_JBC_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, JBC_ERROR_LOG_ENABLE), FIRE_JBC_IE, DATA_TYPE_UINT64, @@ -1263,9 +1308,13 @@ px_err_jbc_csr_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t paddr; int ret; + if (!pri) + return (PX_FATAL_GOS); + paddr = CSR_XR(csr_base, CSR_ERROR_LOG); paddr &= CSR_ERROR_LOG_ADDRESS_MASK; @@ -1281,11 +1330,12 @@ px_err_jbc_csr_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(imu_rds) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_IMU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, IMU_ERROR_LOG_ENABLE), FIRE_IMU_IE, DATA_TYPE_UINT64, @@ -1377,11 +1427,12 @@ px_err_imu_eq_ovfl_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(imu_scs) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_IMU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, IMU_ERROR_LOG_ENABLE), FIRE_IMU_IE, DATA_TYPE_UINT64, @@ -1401,11 +1452,12 @@ PX_ERPT_SEND_DEC(imu_scs) PX_ERPT_SEND_DEC(imu) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_IMU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, IMU_ERROR_LOG_ENABLE), FIRE_IMU_IE, DATA_TYPE_UINT64, @@ -1423,11 +1475,12 @@ PX_ERPT_SEND_DEC(imu) PX_ERPT_SEND_DEC(mmu_tfar_tfsr) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_MMU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, MMU_ERROR_LOG_ENABLE), FIRE_MMU_IE, DATA_TYPE_UINT64, @@ -1449,11 +1502,12 @@ PX_ERPT_SEND_DEC(mmu_tfar_tfsr) PX_ERPT_SEND_DEC(mmu) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_MMU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, MMU_ERROR_LOG_ENABLE), FIRE_MMU_IE, DATA_TYPE_UINT64, @@ -1473,6 +1527,7 @@ px_err_mmu_rbne_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t mmu_log_enable, mmu_intr_enable; uint64_t mask = BITMASK(err_bit_descr->bit); uint64_t mmu_tfa, mmu_ctrl; @@ -1506,6 +1561,9 @@ px_err_mmu_rbne_handle(dev_info_t *rpdip, caddr_t csr_base, (mmu_ctrl & mmu_enable_bit)) { err = PX_FATAL_SW; } else { + if (!pri) + return (PX_FATAL_GOS); + ret = px_handle_lookup( rpdip, DMA_HANDLE, derr->fme_ena, (void *)mmu_tfa); err = (ret == DDI_FM_FATAL) ? PX_FATAL_GOS : PX_NONFATAL; @@ -1533,9 +1591,13 @@ px_err_mmu_tfa_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t mmu_tfa; uint_t ret; + if (!pri) + return (PX_FATAL_GOS); + mmu_tfa = CSR_XR(csr_base, MMU_TRANSLATION_FAULT_ADDRESS); ret = px_handle_lookup( rpdip, DMA_HANDLE, derr->fme_ena, (void *)mmu_tfa); @@ -1550,9 +1612,13 @@ px_err_mmu_tblwlk_handle(dev_info_t *rpdip, caddr_t csr_base, ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr, px_err_bit_desc_t *err_bit_descr) { + boolean_t pri = PX_ERR_IS_PRI(err_bit_descr->bit); uint64_t mmu_tfa; uint_t ret; + if (!pri) + return (PX_FATAL_GOS); + mmu_tfa = CSR_XR(csr_base, MMU_TRANSLATION_FAULT_ADDRESS); ret = px_handle_lookup( rpdip, DMA_HANDLE, derr->fme_ena, (void *)mmu_tfa); @@ -1594,11 +1660,12 @@ px_err_tlu_lup_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(pec_ilu) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_ILU_ELE, DATA_TYPE_UINT64, CSR_XR(csr_base, ILU_ERROR_LOG_ENABLE), FIRE_ILU_IE, DATA_TYPE_UINT64, @@ -1630,11 +1697,12 @@ px_err_pciex_ue_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(pciex_rx_ue) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_UELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_UNCORRECTABLE_ERROR_LOG_ENABLE), FIRE_TLU_UIE, DATA_TYPE_UINT64, @@ -1656,11 +1724,12 @@ PX_ERPT_SEND_DEC(pciex_rx_ue) PX_ERPT_SEND_DEC(pciex_tx_ue) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_UELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_UNCORRECTABLE_ERROR_LOG_ENABLE), FIRE_TLU_UIE, DATA_TYPE_UINT64, @@ -1682,11 +1751,12 @@ PX_ERPT_SEND_DEC(pciex_tx_ue) PX_ERPT_SEND_DEC(pciex_rx_tx_ue) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_UELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_UNCORRECTABLE_ERROR_LOG_ENABLE), FIRE_TLU_UIE, DATA_TYPE_UINT64, @@ -1712,11 +1782,12 @@ PX_ERPT_SEND_DEC(pciex_rx_tx_ue) PX_ERPT_SEND_DEC(pciex_ue) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_UELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_UNCORRECTABLE_ERROR_LOG_ENABLE), FIRE_TLU_UIE, DATA_TYPE_UINT64, @@ -1748,11 +1819,12 @@ px_err_pciex_ce_handle(dev_info_t *rpdip, caddr_t csr_base, PX_ERPT_SEND_DEC(pciex_ce) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_CELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_CORRECTABLE_ERROR_LOG_ENABLE), FIRE_TLU_CIE, DATA_TYPE_UINT64, @@ -1770,11 +1842,12 @@ PX_ERPT_SEND_DEC(pciex_ce) PX_ERPT_SEND_DEC(pciex_rx_oe) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_OEELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_OTHER_EVENT_LOG_ENABLE), FIRE_TLU_OEIE, DATA_TYPE_UINT64, @@ -1796,11 +1869,12 @@ PX_ERPT_SEND_DEC(pciex_rx_oe) PX_ERPT_SEND_DEC(pciex_rx_tx_oe) { char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_OEELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_OTHER_EVENT_LOG_ENABLE), FIRE_TLU_OEIE, DATA_TYPE_UINT64, @@ -1825,12 +1899,13 @@ PX_ERPT_SEND_DEC(pciex_rx_tx_oe) /* TLU Other Event - see io erpt doc, section 3.9 */ PX_ERPT_SEND_DEC(pciex_oe) { - char buf[FM_MAX_CLASS]; + char buf[FM_MAX_CLASS]; + boolean_t pri = PX_ERR_IS_PRI(bit); (void) snprintf(buf, FM_MAX_CLASS, "%s", class_name); ddi_fm_ereport_post(rpdip, buf, derr->fme_ena, DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0, - FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, B_TRUE, + FIRE_PRIMARY, DATA_TYPE_BOOLEAN_VALUE, pri, FIRE_TLU_OEELE, DATA_TYPE_UINT64, CSR_XR(csr_base, TLU_OTHER_EVENT_LOG_ENABLE), FIRE_TLU_OEIE, DATA_TYPE_UINT64, @@ -1858,7 +1933,7 @@ PX_ERPT_SEND_DEC(pciex_ldn) return (PX_OK); } return (PX_ERPT_SEND(pciex_oe)(rpdip, csr_base, ss_reg, derr, - class_name)); + bit, class_name)); } @@ -1877,5 +1952,5 @@ PX_ERPT_SEND_DEC(pciex_lup) } return (PX_ERPT_SEND(pciex_oe)(rpdip, csr_base, ss_reg, derr, - class_name)); + bit, class_name)); } diff --git a/usr/src/uts/sun4u/io/px/px_err_impl.h b/usr/src/uts/sun4u/io/px/px_err_impl.h index 9722383502..4f32d7a2ce 100644 --- a/usr/src/uts/sun4u/io/px/px_err_impl.h +++ b/usr/src/uts/sun4u/io/px/px_err_impl.h @@ -101,10 +101,15 @@ typedef struct px_err_reg_desc { */ #define PX_ERPT_SEND_DEC(n) int px_err_ ## n ## _send_ereport\ (dev_info_t *rpdip, caddr_t csr_base, uint64_t ss_reg, \ - ddi_fm_error_t *derr, char *class_name) + ddi_fm_error_t *derr, uint_t bit, char *class_name) #define PX_ERPT_SEND(n) px_err_ ## n ## _send_ereport /* + * Macro to test for primary vs secondary + */ +#define PX_ERR_IS_PRI(bit) (bit < 32) + +/* * Predefined error handling functions. */ int px_err_fatal_hw_handle(dev_info_t *rpdip, caddr_t csr_base, diff --git a/usr/src/uts/sun4v/io/px/px_err.c b/usr/src/uts/sun4v/io/px/px_err.c index ca6b5070ed..e7ee2fc9df 100644 --- a/usr/src/uts/sun4v/io/px/px_err.c +++ b/usr/src/uts/sun4v/io/px/px_err.c @@ -233,59 +233,60 @@ px_cb_check_errors(dev_info_t *dip, ddi_fm_error_t *derr, /* block/op/phase/cond/dir/flag... */ switch (epkt->rc_descr.op) { case OP_PIO: - err |= PX_NONFATAL; - + err = PX_NONFATAL; /* check handle if affected memory address is captured */ if (epkt->rc_descr.M != 0) { ret = px_handle_lookup(dip, ACC_HANDLE, derr->fme_ena, (void *)epkt->addr); } if (ret == DDI_FM_FATAL) - err |= PX_FATAL_SW; + err |= PX_FATAL_GOS; break; case OP_DMA: switch (epkt->rc_descr.phase) { case PH_ADDR: - err |= PX_FATAL_GOS; + err = PX_FATAL_GOS; break; case PH_DATA: if (epkt->rc_descr.cond == CND_UE) { - err |= PX_FATAL_GOS; + err = PX_FATAL_GOS; break; } - err |= PX_NONFATAL; + err = PX_NONFATAL; if (epkt->rc_descr.M == 1) { ret = px_handle_lookup(dip, DMA_HANDLE, derr->fme_ena, (void *)epkt->addr); if (ret == DDI_FM_FATAL) - err |= PX_FATAL_SW; + err |= PX_FATAL_GOS; } break; default: DBG(DBG_ERR_INTR, dip, "Unexpected epkt"); - err |= PX_ERR_UNKNOWN; + err = PX_FATAL_GOS; break; } break; case OP_UNKNOWN: - err |= PX_NONFATAL; + err = PX_NONFATAL; if (epkt->rc_descr.M == 1) { int ret1, ret2; + ret1 = px_handle_lookup(dip, DMA_HANDLE, derr->fme_ena, (void *)epkt->addr); ret2 = px_handle_lookup(dip, ACC_HANDLE, derr->fme_ena, (void *)epkt->addr); - if ((ret1 == DDI_FM_FATAL) || (ret2 == DDI_FM_FATAL)) - err |= PX_FATAL_SW; + + if (ret1 == DDI_FM_FATAL || ret2 == DDI_FM_FATAL) + err |= PX_FATAL_GOS; } break; case OP_RESERVED: default: DBG(DBG_ERR_INTR, NULL, "Unrecognized JBC error."); - err |= PX_ERR_UNKNOWN; + err = PX_FATAL_GOS; break; } @@ -317,7 +318,6 @@ px_mmu_check_errors(dev_info_t *dip, ddi_fm_error_t *derr, case OP_TBW: /* nonfatal, stuck-fatal */ err = PX_NONFATAL; break; - default: err = PX_ERR_UNKNOWN; break; @@ -326,12 +326,12 @@ px_mmu_check_errors(dev_info_t *dip, ddi_fm_error_t *derr, if ((epkt->rc_descr.D != 0) || (epkt->rc_descr.M != 0)) { ret = px_handle_lookup(dip, DMA_HANDLE, derr->fme_ena, (void *)epkt->addr); - } - - if (ret == DDI_FM_FATAL) - err = PX_FATAL_SW; - else if ((ret == DDI_FM_NONFATAL) && (err = PX_ERR_UNKNOWN)) - err = PX_NONFATAL; + if (ret == DDI_FM_FATAL) + err |= PX_FATAL_GOS; + else + err |= PX_NONFATAL; + } else + err |= PX_NONFATAL; return (err); } |