summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/scom/runtime/test/testscom_rt.H35
-rw-r--r--src/usr/scom/scom.C26
-rw-r--r--src/usr/scom/scom.H8
-rw-r--r--src/usr/scom/scomtrans.C4
4 files changed, 56 insertions, 17 deletions
diff --git a/src/usr/scom/runtime/test/testscom_rt.H b/src/usr/scom/runtime/test/testscom_rt.H
index fbb15548f..1bc81884d 100644
--- a/src/usr/scom/runtime/test/testscom_rt.H
+++ b/src/usr/scom/runtime/test/testscom_rt.H
@@ -426,8 +426,8 @@ public:
{ scom_targets[myEX1], 0x000F0166, 0xabcdabcdabcdabcd, fapi2::NORMAL, true}, // invalid address range for target
{ scom_targets[myEX1], 0x21000000 ,0x7676767676767676, fapi2::IGNORE_HW_ERROR, false}, // pervasive addr does not req wakeup
{ scom_targets[myEX5], 0x20010A02, 0x9191919191919191, fapi2::IGNORE_HW_ERROR, false},
- { scom_targets[myEX5], 0x13040002, 0xabcdabcdabcdabcd, fapi2::IGNORE_HW_ERROR, true}, // invalid unit 0 address
- { scom_targets[myEX1], 0x000F0166, 0xabcdabcdabcdabcd, fapi2::IGNORE_HW_ERROR, true}, // invalid address range for target
+ { scom_targets[myEX5], 0x2E010010, 0xabcdabcdabcdabcd, fapi2::IGNORE_HW_ERROR, true}, // invalid unit 0 address
+ { scom_targets[myEX1], 0x2E010009, 0xabcdabcdabcdabcd, fapi2::IGNORE_HW_ERROR, true}, // invalid address range for target
{ scom_targets[myEX1], 0x21000000 ,0x7676767676767676, fapi2::DO_NOT_DO_WAKEUP, false}, // pervasive addr does not req wakeup
{ scom_targets[myEX5], 0x20010A02, 0x9191919191919191, fapi2::DO_NOT_DO_WAKEUP, false},
{ scom_targets[myEX5], 0x13040002, 0xabcdabcdabcdabcd, fapi2::DO_NOT_DO_WAKEUP, true}, // invalid unit 0 address
@@ -453,8 +453,16 @@ public:
TRACFCOMP( g_trac_scom, "ScomTest::test_opModes> Target %d is not functional", x );
continue;
}
-
-
+ if(test_data[x].expectErr)
+ {
+ TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> Writing 0x%X to the addr: 0x%X with opMode: 0x%X and an error is expected",
+ test_data[x].data,test_data[x].addr,test_data[x].mode);
+ }
+ else
+ {
+ TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> Writing 0x%X to the addr: 0x%X with opMode: 0x%X and an error is NOT expected",
+ test_data[x].data,test_data[x].addr,test_data[x].mode);
+ }
op_size = sizeof(uint64_t);
total++;
@@ -469,7 +477,7 @@ public:
if( l_err )
{
TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> [%d] Write: Error from device : addr=0x%X, RC=%X", x, test_data[x].addr, l_err->reasonCode() );
- TS_FAIL( "ScomTest::test_opModes> ERROR : Unexpected error log from write1" );
+ TS_FAIL( "ScomTest::test_opModes> ERROR : Unexpected error log from deviceWrite" );
fails++;
errlCommit(l_err,SCOM_COMP_ID);
}
@@ -482,8 +490,8 @@ public:
}
else
{
- TRACFCOMP( g_trac_scom, "ScomTest::test_opModes.. Expected Error log and did not get one for addr 0x%X " ,test_data[x].addr );
- TS_FAIL( "ScomTest::test_opModes> ERROR : Expected Error log and did not get one" );
+ TRACFCOMP( g_trac_scom, "ScomTest::test_opModes.. Expected an error log and did not get one for addr 0x%X " ,test_data[x].addr );
+ TS_FAIL( "ScomTest::test_opModes> ERROR : Expected an Error log and did not get one" );
fails++;
}
}
@@ -508,6 +516,17 @@ public:
op_size = sizeof(uint64_t);
+ if(test_data[x].expectErr)
+ {
+ TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> Reading from the addr: 0x%X with opMode: 0x%X and an error is expected",
+ test_data[x].data,test_data[x].addr, test_data[x].mode);
+ }
+ else
+ {
+ TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> Reading from the addr: 0x%X with opMode: 0x%X and an error is not expected",
+ test_data[x].data,test_data[x].addr, test_data[x].mode);
+ }
+
total++;
l_err = deviceRead( test_data[x].target,
&(read_data[x]),
@@ -518,7 +537,7 @@ public:
if( l_err )
{
TRACFCOMP(g_trac_scom, "ScomTest::test_opModes> [%d] Read: Error from device : addr=0x%X, RC=%X", x, test_data[x].addr, l_err->reasonCode() );
- TS_FAIL( "ScomTest::test_opModes> ERROR : Unexpected error log from write1" );
+ TS_FAIL( "ScomTest::test_opModes> ERROR : Unexpected error log from deviceRead" );
fails++;
errlCommit(l_err,SCOM_COMP_ID);
}
diff --git a/src/usr/scom/scom.C b/src/usr/scom/scom.C
index 25d3deb9d..619ff8c20 100644
--- a/src/usr/scom/scom.C
+++ b/src/usr/scom/scom.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2015 */
+/* Contributors Listed Below - COPYRIGHT 2011,2016 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -43,6 +43,7 @@
#include <xscom/piberror.H>
#include <errl/errludtarget.H>
#include <errl/errludlogregister.H>
+#include <hw_access_def.H>
// Trace definition
@@ -89,7 +90,9 @@ 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,
@@ -97,7 +100,8 @@ errlHndl_t scomPerformOp(DeviceFW::OperationType i_opType,
io_buffer,
io_buflen,
i_accessType,
- l_scomAddr);
+ l_scomAddr,
+ l_opMode);
return l_err;
}
@@ -115,7 +119,9 @@ 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,
@@ -123,7 +129,8 @@ errlHndl_t scomMemBufPerformOp(DeviceFW::OperationType i_opType,
io_buffer,
io_buflen,
i_accessType,
- l_scomAddr);
+ l_scomAddr,
+ l_opMode);
// Check for ATTR_CENTAUR_EC_ENABLE_RCE_WITH_OTHER_ERRORS_HW246685
// if ATTR set and MBSECCQ being read then set bit 16
@@ -167,7 +174,8 @@ 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_addr,
+ uint64_t i_opMode)
{
errlHndl_t l_err = NULL;
@@ -480,6 +488,12 @@ errlHndl_t checkIndirectAndDoScom(DeviceFW::OperationType i_opType,
#endif // __HOSTBOOT_RUNTIME
} while(0);
+ if(i_opMode & fapi2::IGNORE_HW_ERROR)
+ {
+ TRACFCOMP(g_trac_scom, "IGNORE_HW_ERROR opmode detected for scom, any errors are being deleted");
+ delete l_err;
+ }
+
if( need_unlock )
{
mutex_unlock(l_mutex);
diff --git a/src/usr/scom/scom.H b/src/usr/scom/scom.H
index 4d4d8a7c8..7b6729e54 100644
--- a/src/usr/scom/scom.H
+++ b/src/usr/scom/scom.H
@@ -5,7 +5,9 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2011,2014 */
+/* Contributors Listed Below - COPYRIGHT 2011,2016 */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -161,6 +163,7 @@ 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
*/
@@ -169,7 +172,8 @@ 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_addr,
+ uint64_t i_opMode);
}; // End namespace
diff --git a/src/usr/scom/scomtrans.C b/src/usr/scom/scomtrans.C
index 2c87dcea3..3c3c82588 100644
--- a/src/usr/scom/scomtrans.C
+++ b/src/usr/scom/scomtrans.C
@@ -195,7 +195,8 @@ errlHndl_t startScomProcess(DeviceFW::OperationType i_opType,
io_buffer,
io_buflen,
i_accessType,
- l_addr);
+ l_addr,
+ l_opMode);
}
// @todo RTC:124196 need to move this to a more general location so that
@@ -225,6 +226,7 @@ errlHndl_t startScomProcess(DeviceFW::OperationType i_opType,
g_wakeupInProgress = false;
}
#endif
+
return l_err;
}
OpenPOWER on IntegriCloud