diff options
-rw-r--r-- | src/usr/scom/runtime/test/testscom_rt.H | 35 | ||||
-rw-r--r-- | src/usr/scom/scom.C | 26 | ||||
-rw-r--r-- | src/usr/scom/scom.H | 8 | ||||
-rw-r--r-- | src/usr/scom/scomtrans.C | 4 |
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; } |