summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/sun4/io/px/px_fm.c8
-rw-r--r--usr/src/uts/sun4u/io/px/px_err.c123
-rw-r--r--usr/src/uts/sun4u/io/px/px_err_impl.h7
-rw-r--r--usr/src/uts/sun4v/io/px/px_err.c38
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);
}