summaryrefslogtreecommitdiffstats
path: root/src/usr/scom
diff options
context:
space:
mode:
authorcrgeddes <crgeddes@us.ibm.com>2016-04-07 16:44:52 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-04-27 11:46:53 -0400
commit566ab6c4c49dd27220f26f76f19a72bf95ac00cc (patch)
treea202dcbbb57ffbac86b6e2fcee587325ca158985 /src/usr/scom
parent29319e3a075801a154e4b95434bd7d49797274ca (diff)
downloadtalos-hostboot-566ab6c4c49dd27220f26f76f19a72bf95ac00cc.tar.gz
talos-hostboot-566ab6c4c49dd27220f26f76f19a72bf95ac00cc.zip
Implement IGNORE_HW_ERROR opMode for Scom access
Some scoms will want to ignore HW errors from the various devices used to perform scoms. This new opMode provides an option to let the scom code know that errors from HW should be ignored Change-Id: I88ea9c7a64e1d09e68ee85225b15babb434a4813 RTC: 150453 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23041 Tested-by: Jenkins Server Reviewed-by: Martin Gloff <mgloff@us.ibm.com> Tested-by: FSP CI Jenkins Reviewed-by: Matthew A. Ploetz <maploetz@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/scom')
-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