summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.C231
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.H27
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_pba_errors.xml24
3 files changed, 271 insertions, 11 deletions
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.C b/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.C
index 4f1836c1..0f297ac2 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER sbe Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -41,6 +41,9 @@
#include <p9_pba_coherent_utils.H>
#include <p9_misc_scom_addresses.H>
#include <p9_quad_scom_addresses.H>
+#include <p9_misc_scom_addresses_fld.H>
+#include <p9_perv_scom_addresses_fld.H>
+#include <p9_perv_scom_addresses.H>
#include <p9_fbc_utils.H>
extern "C"
@@ -127,6 +130,7 @@ extern "C"
//OCB3_ADDRESS field/bit definitions
const uint32_t OCB3_ADDRESS_REG_ADDR_SHIFT = 32;
+ const uint32_t FSI2PIB_RESET_PIB_RESET_BIT = 0;
//---------------------------------------------------------------------------------
// Function definitions
//---------------------------------------------------------------------------------
@@ -376,13 +380,18 @@ extern "C"
}
fapi2::buffer<uint64_t> data(write_data);
- FAPI_TRY(fapi2::putScom(i_target, PU_OCB_PIB_OCBDR3, data),
- "Error writing to the PBA via the OCB");
+ rc = fapi2::putScom(i_target, PU_OCB_PIB_OCBDR3, data);
+
+ if (rc)
+ {
+ FAPI_ERR("Error writing to the PBA via the OCB");
+ rc = p9_pba_coherent_error_handling(i_target, rc);
+ break;
+ }
}
- fapi_try_exit:
FAPI_DBG("End");
- return fapi2::current_err;
+ return rc;
}
fapi2::ReturnCode p9_pba_coherent_pba_read(
@@ -390,6 +399,7 @@ extern "C"
const uint64_t i_address,
uint8_t o_read_data[])
{
+ fapi2::ReturnCode rc;
fapi2::buffer<uint64_t> data;
FAPI_DBG("Start");
@@ -397,8 +407,14 @@ extern "C"
//Perform a 128B read -- need to do 16 8B reads since it's in linear mode which can only do 8B...
for (int i = 0; i < 16; i++)
{
- FAPI_TRY(fapi2::getScom(i_target, PU_OCB_PIB_OCBDR3, data),
- "Error reading from the PBA via the OCB");
+ rc = fapi2::getScom(i_target, PU_OCB_PIB_OCBDR3, data);
+
+ if (rc)
+ {
+ FAPI_ERR("Error reading from the PBA via the OCB");
+ rc = p9_pba_coherent_error_handling(i_target, rc);
+ break;
+ }
for (int j = 0; j < 8; j++)
{
@@ -406,9 +422,8 @@ extern "C"
}
}
- fapi_try_exit:
FAPI_DBG("End");
- return fapi2::current_err;
+ return rc;
}
fapi2::ReturnCode p9_pba_coherent_cleanup_pba(
@@ -488,4 +503,202 @@ extern "C"
return fapi2::current_err;
}
+ // TODO RTC 167768: support pib abort condition on PPE platform
+#ifndef __PPE__
+ fapi2::ReturnCode p9_pba_coherent_check_ocb_status(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target)
+ {
+ fapi2::ReturnCode rc;
+ fapi2::buffer<uint64_t> l_ocb_csr_data;
+ bool l_expected_state;
+
+ // read OCB3 Status/Control register
+ FAPI_DBG("proc_pba_coherent_utils_check_ocb_status: Reading OCB3 Status/Control register");
+ FAPI_TRY(fapi2::getScom(i_target, PU_OCB_PIB_OCBCSR3_RO, l_ocb_csr_data),
+ "Error reading from OCB Control/Status Register");
+
+ // check for any bits set (outside of status/reserved fields)
+ l_expected_state =
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_PULL_READ_UNDERFLOW>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_PUSH_WRITE_OVERFLOW>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_OCI_TIMEOUT>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_OCI_READ_DATA_PARITY>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_OCI_SLAVE_ERROR>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_ADDR_PARITY_ERR>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_DATA_PARITY_ERR>() &&
+ !l_ocb_csr_data.getBit<PU_OCB_PIB_OCBCSR3_FSM_ERR>();
+
+ FAPI_ASSERT(!(l_expected_state), fapi2::P9_PBA_COHERENT_UTILS_OCB_STATUS_MISMATCH().set_TARGET(i_target).set_DATA(
+ l_ocb_csr_data));
+ fapi_try_exit:
+ FAPI_DBG("End");
+ return fapi2::current_err;
+ }
+
+ fapi2::ReturnCode p9_pba_coherent_check_pba_fir(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target)
+ {
+ fapi2::buffer<uint64_t> l_pba_fir_data;
+ bool l_expected_state;
+
+ // read PBA FIR register
+ FAPI_DBG("proc_pba_coherent_utils_check_pba_fir: Reading PBA FIR register");
+ FAPI_TRY(fapi2::getScom(i_target, PU_PBAFIR, l_pba_fir_data), "Error reading PBA Fir register");
+
+ // check for unexpected state
+ l_expected_state =
+ !l_pba_fir_data.getBit<PU_PBAFIR_OCI_APAR_ERR>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_RDADRERR_FW>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_RDDATATO_FW>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_OCI_SLAVE_INIT>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_OCI_WRPAR_ERR>() &&
+ //l_pba_fir_data.getBit<PBA_FIR_OCI_REREQTO_BIT>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_UNEXPCRESP>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_UNEXPDATA>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_PARITY_ERR>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_WRADRERR_FW>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_BADCRESP>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_PB_ACKDEAD_FW_RD>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_INTERNAL_ERR>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_ILLEGAL_CACHE_OP>() &&
+ !l_pba_fir_data.getBit<PU_PBAFIR_OCI_BAD_REG_ADDR>();
+ FAPI_ASSERT(!(l_expected_state), fapi2::P9_PBA_COHERENT_UTILS_PBA_FIR_ERR().set_TARGET(i_target).set_DATA(
+ l_pba_fir_data),
+ "Error in PBA FIR");
+ fapi_try_exit:
+ FAPI_DBG("End");
+ return fapi2::current_err;
+
+ }
+
+ fapi2::ReturnCode p9_pba_coherent_check_status_for_err_handling(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
+ i_target)
+ {
+ FAPI_TRY(p9_pba_coherent_status_check(i_target), "Error calling p9_pba_coherent_status_check");
+ FAPI_TRY(p9_pba_coherent_check_ocb_status(i_target), "Error calling p9_pba_coherent_check_ocb_status");
+ FAPI_TRY(p9_pba_coherent_check_pba_fir(i_target), "Error calling p9_pba_coherent_check_pba_fir");
+
+ fapi_try_exit:
+ FAPI_DBG("End");
+ return fapi2::current_err;
+ }
+
+
+ fapi2::ReturnCode p9_pba_utils_unlock_pib(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target)
+ {
+ fapi2::ReturnCode rc;
+ fapi2::buffer<uint32_t> l_cfam_data;
+ fapi2::buffer<uint64_t> l_pba_slv_rst_data;
+
+ FAPI_DBG("Start");
+ // unlock PIB :n case of HW229314
+ FAPI_DBG("Checking FSI2PIB Status Register");
+ rc = fapi2::getCfamRegister(i_target, PERV_FSI2PIB_STATUS_FSI, l_cfam_data);
+
+ if (rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ FAPI_ERR("getCfamRegister error");
+ return rc;
+ }
+
+ if (l_cfam_data.getBit(PERV_FSI2PIB_STATUS_PIB_ABORT))
+ {
+ FAPI_DBG("Performing PIB reset");
+
+ // reset PIB/OCB
+ l_cfam_data.flush<0>();
+ l_cfam_data.setBit(FSI2PIB_RESET_PIB_RESET_BIT);
+ const fapi2::buffer<uint32_t> l_const_cfam_data = l_cfam_data;
+ rc = fapi2::putCfamRegister(i_target, PERV_FSI2PIB_RESET_FSI, l_const_cfam_data);
+
+ if (rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ FAPI_ERR("Error resetting PIB/OCB");
+ return rc;
+ }
+
+ // ensure PBA region is unlocked, discard/ignore return code
+ (void) fapi2::getScom(i_target, PU_PBASLVRST_PIB, l_pba_slv_rst_data);
+
+ rc = fapi2::putCfamRegister(i_target, PERV_FSI2PIB_RESET_FSI, l_const_cfam_data);
+
+ if (rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ FAPI_ERR("Error ensuring PBA region is unlocked");
+ return rc;
+ }
+ }
+ else
+ {
+ // ensure PBA region is unlocked, discard/ignore return code
+ (void) fapi2::getScom(i_target, PU_PBASLVRST_PIB, l_pba_slv_rst_data);
+ }
+
+ return rc;
+ }
+#endif
+
+ fapi2::ReturnCode p9_pba_coherent_error_handling(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ fapi2::ReturnCode i_rc)
+ {
+ fapi2::ReturnCode l_return_rc;
+
+
+ FAPI_DBG("Start");
+
+ // TODO RTC 167768: support pib abort condition on PPE platform
+#ifndef __PPE__
+
+ // analyze failure, attempt to differentiate between SCOM failure due to faulty HW
+ // versus failure to return read data, which under some conditions can cause SCOM to fail as well
+ FAPI_ERR("Error from a read or write with the PBA");
+
+ // ensure that PIB abort condition (which may have occurred as a result of SCOM read
+ // failure) is cleared, so that analysis of HW state is possible
+ l_return_rc = p9_pba_utils_unlock_pib(i_target);
+
+ if (l_return_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ // if the chip is in a functional state, accesses to the cfam region
+ // should always succeed -- if a fail occurs, return the original return code
+ // (as this represents the first error encountered, and the analysis
+ // indicates a HW issue which the PBA operation did not functionally cause)
+ FAPI_ERR("Error from p9_pba_utils_unlock_pib, returning original SCOM fail rc");
+ l_return_rc = i_rc;
+ FAPI_DBG("End");
+ return l_return_rc;
+ }
+
+ // PIB is unlocked, analyze state of FIRs/state machines to see if the SCOM
+ // failure was a result of a read failure on the fabric launched by PBA
+ l_return_rc = p9_pba_coherent_check_status_for_err_handling(i_target);
+
+ if (l_return_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ // check for return codes that this routine can emit which indicate
+ // a functional failure in PBA that could result in the SCOM failure as a side-effect
+ if ((l_return_rc == (fapi2::ReturnCode) fapi2::RC_P9_PBA_COHERENT_UTILS_PBA_FIR_ERR) ||
+ (l_return_rc == (fapi2::ReturnCode) fapi2::RC_P9_PBA_COHERENT_UTILS_OCB_STATUS_MISMATCH) ||
+ (l_return_rc == (fapi2::ReturnCode) fapi2::RC_P9_PBA_STATUS_ERR))
+ {
+ FAPI_ERR("Error from p9_pba_coherent_check_status_for_err_handling, returning PBA rc");
+ }
+ // none of these match, return the original return code as it was the first error
+ else
+ {
+ FAPI_ERR("Error from p9_pba_coherent_check_status_for_err_handling, returning original SCOM fail rc");
+ l_return_rc = i_rc;
+ }
+
+ FAPI_DBG("End");
+ return l_return_rc;
+ }
+
+ // no sign of an error in PBA/OCB logic, just return the original return code for the SCOM fail
+ FAPI_ERR("No PBA error found, returning original SCOM fail rc");
+#endif
+ l_return_rc = i_rc;
+ FAPI_DBG("End");
+ return l_return_rc;
+
+ }
+
} //extern "C"
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.H b/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.H
index 049d19e2..bf6ff046 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.H
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_pba_coherent_utils.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER sbe Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -280,6 +280,31 @@ extern "C"
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
const uint64_t i_baseAddress);
+///@brief does extra error handling for if we hit a problem with a read or write
+///@param[in] i_target => P9 chip target
+///@param[in] i_rc => The current error that we are seeing from the read/write
+///@return the error that we got from the scom or a different error that points to a problem in the PBA
+ fapi2::ReturnCode p9_pba_coherent_error_handling(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ fapi2::ReturnCode i_rc);
+
+///@brief does error checking on the OCB side
+///@param[in] i_target => P9 chip target
+///@return FAPI_RC_SUCCESS if no errors are detected otherwise an error that contains what is in the OCB status registers
+ fapi2::ReturnCode p9_pba_coherent_check_ocb_status(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target);
+
+///@brief does error checking on the PBA Fir
+///@param[in] i_target => P9 chip target
+///@return FAPI_RC_SUCCESS if no errros are detected otherwise an error that has what error is in the PBA Fir
+ fapi2::ReturnCode p9_pba_coherent_check_pba_fir(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target);
+
+///@brief calls all of the error checking procedures (ocb_status, check_pba_fir, and status_check)
+///@param[in] i_target => P9 chip target
+///@return FAPI_RC_SUCCESS if no errors are detected on the PBA
+ fapi2::ReturnCode p9_pba_coherent_check_status_for_err_handling(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
+ i_target);
+
+
+
} //extern "C"
#endif //_P9_PBA_COHERENT_UTILS_H_
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_pba_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_pba_errors.xml
index 337ab26b..4781f12e 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_pba_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_pba_errors.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER sbe Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2015,2016 -->
+<!-- Contributors Listed Below - COPYRIGHT 2015,2017 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -74,5 +74,27 @@
<ffdc>RUNNING</ffdc>
</hwpError>
<!-- ******************************************************************** -->
+ <hwpError>
+ <sbeError/>
+ <rc>RC_P9_PBA_COHERENT_UTILS_OCB_STATUS_MISMATCH</rc>
+ <description>
+ Procedure: p9_pba_coherent_utils
+ Mismatch in expected state for OCB Status register
+ </description>
+ <ffdc>TARGET</ffdc>
+ <ffdc>DATA</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <sbeError/>
+ <rc>RC_P9_PBA_COHERENT_UTILS_PBA_FIR_ERR</rc>
+ <description>
+ Procedure: p9_pba_coherent_utils
+ PBA FIR bit active after transaction.
+ </description>
+ <ffdc>TARGET</ffdc>
+ <ffdc>DATA</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
</hwpErrors>
OpenPOWER on IntegriCloud