summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/fapi2/plat_hwp_invoker.H1
-rw-r--r--src/usr/fapi2/plat_hw_access.C65
-rw-r--r--src/usr/fapi2/test/fapi2HwAccessTest.H17
-rw-r--r--src/usr/fapi2/test/p9_hwtests.C58
-rw-r--r--src/usr/fapi2/test/p9_hwtests.H4
-rw-r--r--src/usr/scom/scom.C17
-rw-r--r--src/usr/scom/scom.H4
-rw-r--r--src/usr/scom/scomtrans.C3
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
OpenPOWER on IntegriCloud