changeset 260:06b73b853c1f

6302652 Fire bypass access and translation access error handling in sun4u is wrong. 6302807 Some Fire FMA ereports are wrong 6303405 Minor code cleanup for pcie model
author et142600
date Fri, 29 Jul 2005 10:42:05 -0700
parents 0612b6e1662d
children f2dfbad0c46b
files usr/src/uts/common/io/pcie.c usr/src/uts/sun4u/io/px/px_err.c
diffstat 2 files changed, 28 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/pcie.c	Fri Jul 29 09:36:18 2005 -0700
+++ b/usr/src/uts/common/io/pcie.c	Fri Jul 29 10:42:05 2005 -0700
@@ -368,15 +368,12 @@
 			break;
 		}
 
-/* 		reg = pci_config_get32(config_handle, caps_ptr); */
-/* 		cap = reg & 0xFF; */
 		cap = pci_config_get8(config_handle, caps_ptr);
 
 		if (cap == cap_id) {
 			break;
 		}
 
-/* 		caps_ptr = (reg >> 8) & 0xFF; */
 		caps_ptr = P2ALIGN(pci_config_get8(config_handle,
 				(caps_ptr + PCI_CAP_NEXT_PTR)), 4);
 	}
--- a/usr/src/uts/sun4u/io/px/px_err.c	Fri Jul 29 09:36:18 2005 -0700
+++ b/usr/src/uts/sun4u/io/px/px_err.c	Fri Jul 29 10:42:05 2005 -0700
@@ -1450,8 +1450,10 @@
 	ddi_fm_error_t *derr, px_err_reg_desc_t *err_reg_descr,
 	px_err_bit_desc_t *err_bit_descr)
 {
-	uint64_t	mmu_log_enable, mmu_intr_enable, mmu_tfa;
+	uint64_t	mmu_log_enable, mmu_intr_enable;
 	uint64_t	mask = BITMASK(err_bit_descr->bit);
+	uint64_t	mmu_tfa, mmu_ctrl;
+	uint64_t	mmu_enable_bit = 0;
 	int		err = PX_NONFATAL;
 	int		ret;
 
@@ -1459,8 +1461,26 @@
 	mmu_intr_enable = CSR_XR(csr_base, err_reg_descr->enable_addr);
 
 	mmu_tfa = CSR_XR(csr_base, MMU_TRANSLATION_FAULT_ADDRESS);
+	mmu_ctrl = CSR_XR(csr_base, MMU_CONTROL_AND_STATUS);
 
-	if (mmu_log_enable & mmu_intr_enable & mask) {
+	switch (err_bit_descr->bit) {
+	case MMU_INTERRUPT_STATUS_BYP_ERR_P:
+		mmu_enable_bit = BITMASK(MMU_CONTROL_AND_STATUS_BE);
+		break;
+	case MMU_INTERRUPT_STATUS_TRN_ERR_P:
+		mmu_enable_bit = BITMASK(MMU_CONTROL_AND_STATUS_TE);
+		break;
+	default:
+		mmu_enable_bit = 0;
+		break;
+	}
+
+	/*
+	 * If the interrupts are enabled and Translation/Bypass Enable bit
+	 * was set, then panic.  This error should not have occured.
+	 */
+	if (mmu_log_enable & mmu_intr_enable &
+	    (mmu_ctrl & mmu_enable_bit)) {
 		err = PX_FATAL_SW;
 	} else {
 		ret = px_handle_lookup(
@@ -1474,6 +1494,10 @@
 		/* enable error & intr reporting for this bit */
 		CSR_XS(csr_base, MMU_ERROR_LOG_ENABLE, mmu_log_enable | mask);
 		CSR_XS(csr_base, MMU_INTERRUPT_ENABLE, mmu_intr_enable | mask);
+
+		/* enable translation access/bypass enable */
+		CSR_XS(csr_base, MMU_CONTROL_AND_STATUS,
+		    mmu_ctrl | mmu_enable_bit);
 	}
 
 	return (err);
@@ -1606,7 +1630,7 @@
 	    CSR_XR(csr_base, TLU_OTHER_EVENT_STATUS_SET),
 	    FIRE_TLU_RUEH1L, DATA_TYPE_UINT64,
 	    CSR_XR(csr_base, TLU_RECEIVE_OTHER_EVENT_HEADER1_LOG),
-	    FIRE_TLU_RUEH1L, DATA_TYPE_UINT64,
+	    FIRE_TLU_RUEH2L, DATA_TYPE_UINT64,
 	    CSR_XR(csr_base, TLU_RECEIVE_OTHER_EVENT_HEADER2_LOG),
 	    NULL);
 
@@ -1636,7 +1660,7 @@
 	    CSR_XR(csr_base, TLU_RECEIVE_OTHER_EVENT_HEADER2_LOG),
 	    FIRE_TLU_TOEEH1L, DATA_TYPE_UINT64,
 	    CSR_XR(csr_base, TLU_TRANSMIT_OTHER_EVENT_HEADER1_LOG),
-	    FIRE_TLU_TOEEH1L, DATA_TYPE_UINT64,
+	    FIRE_TLU_TOEEH2L, DATA_TYPE_UINT64,
 	    CSR_XR(csr_base, TLU_TRANSMIT_OTHER_EVENT_HEADER2_LOG),
 	    NULL);