diff options
| author | Brian Horton <brianh@linux.ibm.com> | 2012-05-09 12:07:17 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-06-26 14:46:40 -0500 |
| commit | 200cabc160d825b9097f234f25270b398c5339b6 (patch) | |
| tree | 1594a5d53ccc08f21a753c72f0bf2c0d049a6e97 /src/usr/errl/test | |
| parent | 49b5391b8c1e20623ffde799bc17a75efb20e187 (diff) | |
| download | talos-hostboot-200cabc160d825b9097f234f25270b398c5339b6.tar.gz talos-hostboot-200cabc160d825b9097f234f25270b398c5339b6.zip | |
Errlog User Details : Hardware Register
Add support for new User Details error log class that will log a
hardware register. Developer can read the data and then call the
errlog function to have it dumped, or can just call the errlog
function to do the deviceRead go get the data.
Also, fix bugs in a couple of device read functions that were too
strict in their size check - input buffer size just needs to be >=
size required, not ==.
Change-Id: I05ba42ecd13b3fc963c56bb706d855c9c89412a3
RTC: 38497
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Tested-by: Jenkins Server
Diffstat (limited to 'src/usr/errl/test')
| -rw-r--r-- | src/usr/errl/test/errluserdetailtest.H | 243 |
1 files changed, 220 insertions, 23 deletions
diff --git a/src/usr/errl/test/errluserdetailtest.H b/src/usr/errl/test/errluserdetailtest.H index a4a507692..2adeefd86 100644 --- a/src/usr/errl/test/errluserdetailtest.H +++ b/src/usr/errl/test/errluserdetailtest.H @@ -1,25 +1,26 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/usr/errl/test/errluserdetailtest.H $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// p1 -// -// Object Code Only (OCO) source materials -// Licensed Internal Code Source Materials -// IBM HostBoot Licensed Internal Code -// -// The source code for this program is not published or other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG + * This is an automatically generated prolog. + * + * $Source: src/usr/errl/test/errluserdetailtest.H $ + * + * IBM CONFIDENTIAL + * + * COPYRIGHT International Business Machines Corp. 2011-2012 + * + * p1 + * + * Object Code Only (OCO) source materials + * Licensed Internal Code Source Materials + * IBM HostBoot Licensed Internal Code + * + * The source code for this program is not published or other- + * wise divested of its trade secrets, irrespective of what has + * been deposited with the U.S. Copyright Office. + * + * Origin: 30 + * + * IBM_PROLOG_END_TAG + */ #ifndef __TEST_ERRLUSERDETAILSTEST_H #define __TEST_USERUSERDETAILSTEST_H @@ -37,12 +38,15 @@ #include <errl/errludstring.H> #include <errl/errludbacktrace.H> #include <errl/errludtarget.H> +#include <errl/errludlogregister.H> #include <errludattribute.H> #include <targeting/common/targetservice.H> #include <targeting/common/iterators/rangefilter.H> #include <targeting/common/predicates/predicates.H> #include <targeting/common/util.H> +#include <devicefw/driverif.H> + using namespace ERRORLOG; class UtilErrlUsrDataTest: public CxxTest::TestSuite @@ -246,8 +250,201 @@ public: // commit the errorlog errlCommit(errl, CXXTEST_COMP_ID); TS_TRACE( "testAttribute done"); - } + } // testAttribute + + /** + * @test testLogRegister - Capture a register in an error log + */ + void testLogRegister(void) + { + errlHndl_t errl = NULL; + + TS_TRACE( "testLogRegister errorlog user detail data"); + /*@ + * @errortype + * @severity ERRORLOG_SEV_INFORMATIONAL + * @moduleid HBERRL_USERDATA_TEST_MOD_ID + * @reasoncode HBERRL_TEST_LOGREGISTER_UD + * @userdata1 Test data 1 + * @userdata2 Test data 2 + * @devdesc User Details unit test - create log register user detail data + */ + errl = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_INFORMATIONAL, + HBERRL_USERDATA_TEST_MOD_ID, + HBERRL_TEST_LOGREGISTER_UD, + 0x008900AB00CD00EF, // user1 + 0x0001002300450067 ); // user2 + + using namespace TARGETING; + ErrlUserDetailsString("LogRegister test").addToLog(errl); + + // find a proc target + PredicateCTM procChipFilter(CLASS_CHIP,TYPE_PROC); + TargetRangeFilter pProc( + targetService().begin(), targetService().end(), + &procChipFilter); + + // find a membuf target + PredicateCTM membufChipFilter(CLASS_CHIP,TYPE_MEMBUF); + TargetRangeFilter pMembuf( + targetService().begin(), targetService().end(), + &membufChipFilter); + + // find a dimm target + PredicateCTM dimmChipFilter(CLASS_NA,TYPE_DIMM); + TargetRangeFilter pDimm( + targetService().begin(), targetService().end(), + &dimmChipFilter); + + Target* c_target; + // first do a test w/ the special MASTER SENTINAL constant + c_target = MASTER_PROCESSOR_CHIP_TARGET_SENTINEL; + ErrlUserDetailsTarget(c_target).addToLog(errl); + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addData(DEVICE_XSCOM_ADDRESS(0x000F000Full)); + eudlr.addData(DEVICE_SCOM_ADDRESS(0x000F000Full)); + eudlr.addToLog(errl); + } + + c_target = *pProc; + ErrlUserDetailsTarget(c_target).addToLog(errl); + + // 1-shot way first - each will have HUID before register data + ErrlUserDetailsLogRegister(c_target, + DEVICE_SCOM_ADDRESS(0x000F000Full)).addToLog(errl); + ErrlUserDetailsLogRegister(c_target, + DEVICE_MVPD_ADDRESS(3,0)).addToLog(errl); + // error: + ErrlUserDetailsLogRegister(c_target, + DEVICE_FSI_ADDRESS(0x01028)).addToLog(errl); + // can't do this - use the addData methodology for driverif.H addresses + //ErrlUserDetailsLogRegister(c_target, + //DEVICE_FSISCOM_ADDRESS(0x000F000Full)).addToLog(errl); + + // more efficient - HUID then each register + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addData(DEVICE_SCOM_ADDRESS(0x000F000Full)); + eudlr.addData(DEVICE_MVPD_ADDRESS(3,0)); + // error: + eudlr.addData(DEVICE_FSI_ADDRESS(0x01028)); + eudlr.addToLog(errl); + } + + // do the read first, then capture the data + // this mirrors the previous set of LogRegister calls at the + // top of this function, so the results should match.. + ErrlUserDetailsTarget(c_target).addToLog(errl); + errlHndl_t errl_deviceRead; + + uint64_t reg1_data = 0; + size_t reg1_size = sizeof(reg1_data); + errl_deviceRead = DeviceFW::deviceRead(c_target, + ®1_data, reg1_size, + DEVICE_SCOM_ADDRESS(0x000F000Full)); + + if (errl_deviceRead != NULL) + { + TS_TRACE( "testLogRegister deviceRead return errl; deleting;"); + delete errl_deviceRead; + reg1_size = 0; + } + ErrlUserDetailsLogRegister(c_target, ®1_data, reg1_size, + DEVICE_SCOM_ADDRESS(0x000F000Full)).addToLog(errl); + + uint64_t reg2_data = 0; + size_t reg2_size = sizeof(reg2_data); + errl_deviceRead = DeviceFW::deviceRead(c_target, + ®2_data, reg2_size, + DEVICE_MVPD_ADDRESS(3,0)); + + if (errl_deviceRead != NULL) + { + TS_TRACE( "testLogRegister deviceRead return errl; deleting;"); + delete errl_deviceRead; + reg2_size = 0; + } + ErrlUserDetailsLogRegister(c_target, ®2_data, reg2_size, + DEVICE_MVPD_ADDRESS(3,0)).addToLog(errl); + + uint64_t reg3_data = 0; + size_t reg3_size = sizeof(reg3_data); + errl_deviceRead = DeviceFW::deviceRead(c_target, + ®3_data, reg3_size, + DEVICE_FSI_ADDRESS(0x01028)); + + if (errl_deviceRead != NULL) + { + TS_TRACE( "testLogRegister deviceRead return errl; deleting;"); + delete errl_deviceRead; + reg3_size = 0; + } + else + { // we expect an error here + TS_TRACE( "testLogRegister deviceRead DIDNT return errl!"); + } + ErrlUserDetailsLogRegister(c_target, ®3_data, reg3_size, + DEVICE_FSI_ADDRESS(0x01028)).addToLog(errl); + + // more efficient - HUID then each register + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addDataBuffer(®1_data, reg1_size, + DEVICE_SCOM_ADDRESS(0x000F000Full)); + eudlr.addDataBuffer(®2_data, reg2_size, + DEVICE_MVPD_ADDRESS(3,0)); + eudlr.addDataBuffer(®3_data, reg3_size, + DEVICE_FSI_ADDRESS(0x01028)); + eudlr.addToLog(errl); + } + + // send some that aren't logged: + ErrlUserDetailsLogRegister(c_target, + DEVICE_PRESENT_ADDRESS()).addToLog(errl); + ErrlUserDetailsLogRegister(c_target, + DEVICE_PNOR_ADDRESS(0, 0)).addToLog(errl); + ErrlUserDetailsLogRegister(c_target, + DEVICE_MBOX_ADDRESS(0)).addToLog(errl); + + c_target = *pMembuf; + ErrlUserDetailsTarget(c_target).addToLog(errl); + + // HUID then each register + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addData(DEVICE_FSI_ADDRESS(0x01028)); + eudlr.addData(DEVICE_SCOM_ADDRESS(0x000F000Full)); + eudlr.addToLog(errl); + } + + c_target = *pDimm; + ErrlUserDetailsTarget(c_target).addToLog(errl); + + // HUID then each register + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addData(DEVICE_SPD_ADDRESS(0)); + eudlr.addData(DEVICE_FSI_ADDRESS(0x01028)); + eudlr.addData(DEVICE_SCOM_ADDRESS(0x000F000Full)); + eudlr.addToLog(errl); + } + + { + ErrlUserDetailsLogRegister eudlr(c_target); + eudlr.addData(DEVICE_FSISCOM_ADDRESS(0x01028)); + eudlr.addData(DEVICE_XSCOM_ADDRESS(0x000F000Full)); + eudlr.addData(DEVICE_I2C_ADDRESS(0,0,0x50)); + eudlr.addData(DEVICE_EEPROM_ADDRESS(0x1111,0)); + eudlr.addToLog(errl); + } + + // commit the errorlog + errlCommit(errl, CXXTEST_COMP_ID); + TS_TRACE( "testLogRegister errorlog user detail data - complete"); + } // testLogRegister }; #endif |

