diff options
-rw-r--r-- | src/include/usr/fapi2/plat_hwp_invoker.H | 1 | ||||
-rw-r--r-- | src/usr/fapi2/plat_hw_access.C | 65 | ||||
-rw-r--r-- | src/usr/fapi2/test/fapi2HwAccessTest.H | 17 | ||||
-rw-r--r-- | src/usr/fapi2/test/p9_hwtests.C | 58 | ||||
-rw-r--r-- | src/usr/fapi2/test/p9_hwtests.H | 4 | ||||
-rw-r--r-- | src/usr/scom/scom.C | 17 | ||||
-rw-r--r-- | src/usr/scom/scom.H | 4 | ||||
-rw-r--r-- | src/usr/scom/scomtrans.C | 3 |
8 files changed, 135 insertions, 34 deletions
diff --git a/src/include/usr/fapi2/plat_hwp_invoker.H b/src/include/usr/fapi2/plat_hwp_invoker.H index 967ce45fd..92d8d7990 100644 --- a/src/include/usr/fapi2/plat_hwp_invoker.H +++ b/src/include/usr/fapi2/plat_hwp_invoker.H @@ -42,6 +42,7 @@ #define PLATHWPINVOKER_H_ #include <return_code.H> +#include <hw_access_def.H> #include <plat_utils.H> /** diff --git a/src/usr/fapi2/plat_hw_access.C b/src/usr/fapi2/plat_hw_access.C index 1f3192011..d9a7c0f0e 100644 --- a/src/usr/fapi2/plat_hw_access.C +++ b/src/usr/fapi2/plat_hw_access.C @@ -88,13 +88,24 @@ ReturnCode platGetScom(const Target<TARGET_TYPE_ALL>& i_target, l_err = deviceRead(l_target, &o_data(), l_size, - DEVICE_SCOM_ADDRESS(i_address)); + DEVICE_SCOM_ADDRESS(i_address, opMode)); + + //Todo RTC: 156704 Possible room for improvement detecting opMode + // err skips at lower level if (l_err) { - FAPI_ERR("platGetScom: deviceRead returns error!"); - FAPI_ERR("fapiGetScom failed - Target %s, Addr %.16llX", - l_targName, i_address); - l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + if(opMode & static_cast<uint8_t>(fapi2::IGNORE_HW_ERROR)) + { + delete l_err; + l_err = nullptr; + } + else + { + FAPI_ERR("platGetScom: deviceRead returns error!"); + FAPI_ERR("fapiGetScom failed - Target %s, Addr %.16llX", + l_targName, i_address); + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + } } if (l_traceit) @@ -137,13 +148,21 @@ ReturnCode platPutScom(const Target<TARGET_TYPE_ALL>& i_target, l_err = deviceWrite(l_target, &l_data, l_size, - DEVICE_SCOM_ADDRESS(i_address)); + DEVICE_SCOM_ADDRESS(i_address, opMode)); if (l_err) { - FAPI_ERR("platPutScom: deviceRead returns error!"); - FAPI_ERR("platPutScom failed - Target %s, Addr %.16llX", - l_targName, i_address); - l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + if(opMode & fapi2::IGNORE_HW_ERROR) + { + delete l_err; + l_err = nullptr; + } + else + { + FAPI_ERR("platPutScom: deviceRead returns error!"); + FAPI_ERR("platPutScom failed - Target %s, Addr %.16llX", + l_targName, i_address); + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + } } if (l_traceit) @@ -188,13 +207,19 @@ ReturnCode platPutScomUnderMask(const Target<TARGET_TYPE_ALL>& i_target, l_err = deviceRead(l_target, &l_data, l_size, - DEVICE_SCOM_ADDRESS(i_address)); - if (l_err) + DEVICE_SCOM_ADDRESS(i_address,opMode)); + if (l_err && !(opMode & fapi2::IGNORE_HW_ERROR)) { FAPI_ERR("platPutScomUnderMask: deviceRead returns error!"); l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); break; } + else if(l_err) + { + delete l_err; + l_err = nullptr; + break; + } // Calculate new value to write to reg uint64_t l_inMaskInverted = ~i_mask; // Write mask inverted @@ -210,13 +235,20 @@ ReturnCode platPutScomUnderMask(const Target<TARGET_TYPE_ALL>& i_target, l_err = deviceWrite(l_target, &l_data, l_size, - DEVICE_SCOM_ADDRESS(i_address)); - if (l_err) + DEVICE_SCOM_ADDRESS(i_address,opMode)); + if (l_err && !(opMode & fapi2::IGNORE_HW_ERROR)) { FAPI_ERR("platPutScomUnderMask: deviceWrite returns error!"); l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); break; } + else if (l_err) + { + delete l_err; + l_err = nullptr; + break; + + } } while (0); @@ -881,7 +913,10 @@ uint64_t platGetDDScanMode(const uint32_t i_ringMode) void platSetOpMode(const OpModes i_mode) { - opMode = i_mode; + FAPI_INF("Setting fapi2::opMode to be 0x%x", i_mode); + opMode = static_cast<OpModes>( + static_cast<uint8_t>(opMode) | static_cast<uint8_t>(i_mode) + ); return; } diff --git a/src/usr/fapi2/test/fapi2HwAccessTest.H b/src/usr/fapi2/test/fapi2HwAccessTest.H index dc1d4ff08..8fc3e7499 100644 --- a/src/usr/fapi2/test/fapi2HwAccessTest.H +++ b/src/usr/fapi2/test/fapi2HwAccessTest.H @@ -182,6 +182,23 @@ void test_fapi2HwAccess() // a false negative on the next case } + numTests++; + uint8_t failed = 0; + FAPI_INVOKE_HWP(l_errl, + p9_opmodetest_ignorehwerr, + fapi2_procTarget, + failed ); + + if(l_errl || failed) + { + TS_FAIL("p9_opmodetest_ignorehwerr returned an error!!"); + numFails++; + if(l_errl) + { + errlCommit(l_errl,FAPI2_COMP_ID); + } + } + #if 0 // TODO-RTC:151428 - need simics support for these to pass numTests++; diff --git a/src/usr/fapi2/test/p9_hwtests.C b/src/usr/fapi2/test/p9_hwtests.C index 55108755c..7222667c6 100644 --- a/src/usr/fapi2/test/p9_hwtests.C +++ b/src/usr/fapi2/test/p9_hwtests.C @@ -340,3 +340,61 @@ fapi2::ReturnCode p9_opmodetest_getsetopmode() return fapi2::current_err; } +fapi2::ReturnCode p9_opmodetest_ignorehwerr( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, + uint8_t o_fail) +{ + FAPI_INF("Entering p9_opmodetest_ignorehwerr..."); + //Count the number of scoms we do so we can tell that we ran all of them. + //Putting in this test so we know opMode isnt getting reset on FAPI_TRY + uint8_t scomCount = 0; + const uint8_t EXPECTED_NUMBER_OF_SCOMS = 4; + + do{ + FAPI_INF("Setting opMode to IGNORE_HW_ERROR (0x1)"); + + fapi2::setOpMode(fapi2::IGNORE_HW_ERROR); + fapi2::buffer<uint64_t> l_scomdata1 = 0xFF00FF00; + fapi2::buffer<uint64_t> l_scomdata2 = 0xFF00FF00; + + fapi2::buffer<uint64_t> l_scomresult1 = 0x0; + fapi2::buffer<uint64_t> l_scomresult2 = 0x0; + + + FAPI_INF("Attempting 1st putScom, this should fail but because of opMode we skip the err"); + FAPI_TRY(fapi2::putScom(i_target, + 0xDEADBEEF, + l_scomdata1)); + scomCount++; + + FAPI_INF("Attempting 2nd putScom this should fail but because of opMode we skip the err"); + FAPI_TRY(fapi2::getScom(i_target, + 0xCABBABEF, + l_scomdata2)); + scomCount++; + + FAPI_INF("Attempting 1st getScom, this should fail but because of opMode we skip the err"); + FAPI_TRY(fapi2::getScom(i_target, + 0xDEADBEEF, + l_scomresult1)); + scomCount++; + + FAPI_INF("Attempting 2nd getScom, this should fail but because of opMode we skip the err"); + FAPI_TRY(fapi2::getScom(i_target, + 0xCABBABEF, + l_scomresult2)); + scomCount++; + + }while(0); + +fapi_try_exit: + + if(scomCount != EXPECTED_NUMBER_OF_SCOMS) + { + o_fail = 1; + } + FAPI_INF("Exiting p9_opmodetest_ignorehwerr..."); + + return fapi2::current_err; +} + diff --git a/src/usr/fapi2/test/p9_hwtests.H b/src/usr/fapi2/test/p9_hwtests.H index 634c823fe..6f184d9bc 100644 --- a/src/usr/fapi2/test/p9_hwtests.H +++ b/src/usr/fapi2/test/p9_hwtests.H @@ -74,6 +74,10 @@ fapi2::ReturnCode p9_cfamtest_putcfam_pass( fapi2::ReturnCode p9_opmodetest_getsetopmode(); +fapi2::ReturnCode p9_opmodetest_ignorehwerr( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, + uint8_t fail); + ///////////// // // TODO-RTC:151428 - need simics support for these ring functions to pass diff --git a/src/usr/scom/scom.C b/src/usr/scom/scom.C index b0ac02519..231440dc8 100644 --- a/src/usr/scom/scom.C +++ b/src/usr/scom/scom.C @@ -90,18 +90,13 @@ errlHndl_t scomPerformOp(DeviceFW::OperationType i_opType, uint64_t l_scomAddr = va_arg(i_args,uint64_t); - // if opMode is not specified as an argument va_arg - // will return NULL which is 0 - uint64_t l_opMode = va_arg(i_args,uint64_t); - l_err = checkIndirectAndDoScom(i_opType, i_target, io_buffer, io_buflen, i_accessType, - l_scomAddr, - l_opMode); + l_scomAddr); return l_err; } @@ -119,18 +114,13 @@ errlHndl_t scomMemBufPerformOp(DeviceFW::OperationType i_opType, uint64_t l_scomAddr = va_arg(i_args,uint64_t); - // if opMode is not specified as an argument va_arg - // will return NULL which is 0 - uint64_t l_opMode = va_arg(i_args,uint64_t); - l_err = checkIndirectAndDoScom(i_opType, i_target, io_buffer, io_buflen, i_accessType, - l_scomAddr, - l_opMode); + l_scomAddr); // Check for ATTR_CENTAUR_EC_ENABLE_RCE_WITH_OTHER_ERRORS_HW246685 // if ATTR set and MBSECCQ being read then set bit 16 @@ -174,8 +164,7 @@ errlHndl_t checkIndirectAndDoScom(DeviceFW::OperationType i_opType, void* io_buffer, size_t& io_buflen, int64_t i_accessType, - uint64_t i_addr, - uint64_t i_opMode) + uint64_t i_addr) { errlHndl_t l_err = NULL; diff --git a/src/usr/scom/scom.H b/src/usr/scom/scom.H index 817c255ec..3cb8d6b5b 100644 --- a/src/usr/scom/scom.H +++ b/src/usr/scom/scom.H @@ -162,7 +162,6 @@ errlHndl_t doScomOp(DeviceFW::OperationType i_opType, * @param[in] i_accessType Select from DeviceFW::AccessType enum * @see usr/devicefw/userif.H * @param[in] i_addr Scom Address Value. - * @param[in] i_opMode the fapi2::OpMode for this scom operation * * @return errlHndl_t */ @@ -171,8 +170,7 @@ errlHndl_t checkIndirectAndDoScom(DeviceFW::OperationType i_opType, void* io_buffer, size_t& io_buflen, int64_t i_accessType, - uint64_t i_addr, - uint64_t i_opMode); + uint64_t i_addr); /** * @brief Performs a SCom operation diff --git a/src/usr/scom/scomtrans.C b/src/usr/scom/scomtrans.C index 3c3c82588..f0923ae43 100644 --- a/src/usr/scom/scomtrans.C +++ b/src/usr/scom/scomtrans.C @@ -195,8 +195,7 @@ errlHndl_t startScomProcess(DeviceFW::OperationType i_opType, io_buffer, io_buflen, i_accessType, - l_addr, - l_opMode); + l_addr); } // @todo RTC:124196 need to move this to a more general location so that |