diff options
Diffstat (limited to 'src/usr/ibscom/test/ibscomtest.H')
-rw-r--r-- | src/usr/ibscom/test/ibscomtest.H | 272 |
1 files changed, 243 insertions, 29 deletions
diff --git a/src/usr/ibscom/test/ibscomtest.H b/src/usr/ibscom/test/ibscomtest.H index 44e2d7e66..0e623c771 100644 --- a/src/usr/ibscom/test/ibscomtest.H +++ b/src/usr/ibscom/test/ibscomtest.H @@ -35,6 +35,7 @@ #include <devicefw/userif.H> #include <ibscom/ibscomreasoncodes.H> #include <devicefw/driverif.H> +#include <sys/time.h> extern trace_desc_t* g_trac_ibscom; @@ -86,26 +87,36 @@ class IBscomTest: public CxxTest::TestSuite return; } l_testTarget = *(centaur_list.begin()); + TRACFCOMP(g_trac_ibscom,"test_IBscom> Using target %.8X", TARGETING::get_huid(l_testTarget)); + + ScomSwitches l_switches = l_testTarget->getAttr<ATTR_SCOM_SWITCHES>(); + if( !l_switches.useInbandScom ) + { + TRACFCOMP(g_trac_ibscom,"Skipping test_IBscom because ibscom is not enabled"); + return; + } TRACDCOMP(g_trac_ibscom, - "IBscomTest::test_IBscom> Read orignal data from Centaur"); + "IBscomTest::test_IBscom> Read original data from Centaur"); - const uint64_t addrs[] = {0x0201164F, 0x0301069A}; + const uint64_t addrs[] = {0x02010803/*0:26*/, 0x03010403/*0:21*/}; uint64_t orig_data[2] = {0}; - uint64_t new_data[] = {0x1234567ABABABA00, 0xFEEDB0B0FEDCBA00}; + uint64_t new_data1[] = {0x123456E000000000, 0xFEEDB00000000000}; uint64_t read_data[2] = {0}; uint64_t read_data_fsi[2] = {0}; size_t op_size = sizeof(uint64_t); + const uint64_t junk = 0x1122334455667788; - //Save of initial register content + //Save off initial register content via FSI for(uint32_t i=0; i<2; i++) { op_size = sizeof(uint64_t); - l_err = deviceRead( l_testTarget, - &orig_data[i], - op_size, - DEVICE_SCOM_ADDRESS(addrs[i]) ); + l_err = deviceOp( DeviceFW::READ, + l_testTarget, + &orig_data[i], + op_size, + DEVICE_FSISCOM_ADDRESS(addrs[i]) ); if( l_err ) { TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Orig Read: Error from device : addr=0x%X, RC=%X", @@ -116,17 +127,54 @@ class IBscomTest: public CxxTest::TestSuite } total++; + // OR in the original data so we don't clear mask bits + new_data1[i] |= orig_data[i]; + } + + //Read the data with IBSCOM + for(uint32_t i=0; i<2; i++) + { + TRACDCOMP(g_trac_ibscom, + "IBscomTest::test_IBscom> Read data"); + + //reset size + op_size = sizeof(uint64_t); + read_data[i] = junk; + l_err = deviceOp( DeviceFW::READ, + l_testTarget, + &read_data[i], + op_size, + DEVICE_IBSCOM_ADDRESS(addrs[i]) ); + if( l_err ) + { + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Read: Error from device : addr=0x%X, RC=%X", + addrs[i], l_err->reasonCode() ); + TS_FAIL( "test_IBscom> ERROR : Error log from IBSCOM read" ); + fails++; + errlCommit(l_err,IBSCOM_COMP_ID); + } + + if(orig_data[i] != read_data[i]) + { + TS_FAIL( "test_IBscom> ERROR : Data miss-match on IBSCOM read check." ); + + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom>ERROR: addr=0x%.8x: Write data=0x%.16X, IBSCOM read data=0x%.16X", + addrs[i], new_data1[i], read_data[i]); + fails++; + } + + total++; } - //Write in some new data + //Write in some new data with IBSCOM for(uint32_t i=0; i<2; i++) { - TRACDCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Write new pattern: 0x%.16X", new_data[i]); + TRACDCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Write new pattern: 0x%.16X", new_data1[i]); op_size = sizeof(uint64_t); l_err = deviceOp( DeviceFW::WRITE, l_testTarget, - &new_data[i], + &new_data1[i], op_size, DEVICE_IBSCOM_ADDRESS(addrs[i]) ); if( l_err ) @@ -137,11 +185,12 @@ class IBscomTest: public CxxTest::TestSuite fails++; errlCommit(l_err,IBSCOM_COMP_ID); } + nanosleep( 0, 1000000 ); //sleep for 1ms total++; } - //Read the data back with IBSCOM + //Read the data back with FSISCOM for(uint32_t i=0; i<2; i++) { TRACDCOMP(g_trac_ibscom, @@ -151,31 +200,56 @@ class IBscomTest: public CxxTest::TestSuite op_size = sizeof(uint64_t); l_err = deviceOp( DeviceFW::READ, l_testTarget, - &read_data[i], + &read_data_fsi[i], op_size, - DEVICE_IBSCOM_ADDRESS(addrs[i]) ); + DEVICE_FSISCOM_ADDRESS(addrs[i]) ); if( l_err ) { - TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Read: Error from device : addr=0x%X, RC=%X", + TRACFCOMP(g_trac_ibscom, "IBscomTest::test_IBscom> Read: Error from device : addr=0x%X, RC=%X", addrs[i], l_err->reasonCode() ); - TS_FAIL( "test_IBscom> ERROR : Error log from IBSCOM read" ); + TS_FAIL( "test_IBscom> ERROR : Error log from FSI Read" ); fails++; errlCommit(l_err,IBSCOM_COMP_ID); } - if(new_data[i] != read_data[i]) + if(new_data1[i] != read_data_fsi[i]) { - TS_FAIL( "test_IBscom> ERROR : Data miss-match on IBSCOM read-back check." ); + TS_FAIL( "test_IBscom> ERROR : Data miss-match on FSI read-back check." ); - TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom>ERROR: addr=0x%.8x: Write data=0x%.16X, IBSCOM read data=0x%.16X", - addrs[i], new_data[i], read_data[i]); + TRACFCOMP(g_trac_ibscom, "IBscomTest::test_IBscom>ERROR: addr=0x%.8x: Write data=0x%.16X, FSI read data=0x%.16X", + addrs[i], new_data1[i], read_data_fsi[i]); + fails++; + } + total++; + } + + //Write in some new data with FSISCOM + uint64_t new_data2[] = {0xA5A5A50000000000/*0:26*/, + 0x1122000000000000/*0:21*/}; + for(uint32_t i=0; i<2; i++) + { + TRACDCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Write new pattern: 0x%.16X", new_data2[i]); + + op_size = sizeof(uint64_t); + l_err = deviceOp( DeviceFW::WRITE, + l_testTarget, + &new_data2[i], + op_size, + DEVICE_FSISCOM_ADDRESS(addrs[i]) ); + if( l_err ) + { + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Write: Error from device : addr=0x%X, RC=%X", + addrs[i], l_err->reasonCode() ); + TS_FAIL( "ScomTest::test_IBscom> ERROR : Error log from FSI Write" ); fails++; + errlCommit(l_err,IBSCOM_COMP_ID); } total++; } - //Read the data back with FSISCOM + + //Read the data back with IBSCOM for(uint32_t i=0; i<2; i++) { TRACDCOMP(g_trac_ibscom, @@ -185,26 +259,27 @@ class IBscomTest: public CxxTest::TestSuite op_size = sizeof(uint64_t); l_err = deviceOp( DeviceFW::READ, l_testTarget, - &read_data_fsi[i], + &read_data[i], op_size, - DEVICE_FSISCOM_ADDRESS(addrs[i]) ); + DEVICE_IBSCOM_ADDRESS(addrs[i]) ); if( l_err ) { - TRACFCOMP(g_trac_ibscom, "IBscomTest::test_IBscom> Read: Error from device : addr=0x%X, RC=%X", + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom> Read: Error from device : addr=0x%X, RC=%X", addrs[i], l_err->reasonCode() ); - TS_FAIL( "test_IBscom> ERROR : Error log from FSI Read" ); + TS_FAIL( "test_IBscom> ERROR : Error log from IBSCOM read" ); fails++; errlCommit(l_err,IBSCOM_COMP_ID); } - if(new_data[i] != read_data_fsi[i]) + if(new_data2[i] != read_data[i]) { - TS_FAIL( "test_IBscom> ERROR : Data miss-match on FSI read-back check." ); + TS_FAIL( "test_IBscom> ERROR : Data miss-match on IBSCOM read-back check." ); - TRACFCOMP(g_trac_ibscom, "IBscomTest::test_IBscom>ERROR: addr=0x%.8x: Write data=0x%.16X, FSI read data=0x%.16X", - addrs[i], new_data[i], read_data_fsi[i]); + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom>ERROR: addr=0x%.8x: Write data=0x%.16X, IBSCOM read data=0x%.16X", + addrs[i], new_data1[i], read_data[i]); fails++; } + total++; } @@ -237,7 +312,146 @@ class IBscomTest: public CxxTest::TestSuite //TODO RTC: 72594: Add error path test cases when simics support //is available + void test_IBscom_error(void) + { + TRACFCOMP(g_trac_ibscom,"Skipping test_IBscom_error because Simics is broken"); + return; + + uint64_t fails = 0; + uint64_t total = 0; + errlHndl_t l_err = NULL; + + TARGETING::Target* l_testTarget = NULL; + + // Target: Find a Centaur on the Master processor + TARGETING::Target* l_procTarget = NULL; + TARGETING::targetService().masterProcChipTargetHandle(l_procTarget); + assert(l_procTarget != NULL); + + TARGETING::PredicateCTM l_cent(TARGETING::CLASS_CHIP, + TARGETING::TYPE_MEMBUF, + TARGETING::MODEL_NA); + TARGETING::PredicatePostfixExpr cent_query; + cent_query.push(&l_cent); + + + TARGETING::TargetHandleList centaur_list; + TARGETING::targetService(). + getAssociated(centaur_list, + l_procTarget, + TARGETING::TargetService::CHILD_BY_AFFINITY, + TARGETING::TargetService::ALL, + ¢_query); + + if( centaur_list.size() < 1 ) + { + TS_FAIL( "test_IBscom_error> ERROR : Unable to find a Centaur chip" ); + return; + } + l_testTarget = *(centaur_list.begin()); + + ScomSwitches l_switches = l_testTarget->getAttr<ATTR_SCOM_SWITCHES>(); + if( !l_switches.useInbandScom ) + { + TRACFCOMP(g_trac_ibscom,"Skipping test_IBscom_error because ibscom is not enabled"); + return; + } + + + TRACDCOMP(g_trac_ibscom, "IBscomTest::test_IBscom_error> Read orignal data from Centaur"); + + + uint64_t new_data = 0x1234567ABABABA00; + uint64_t read_data = 0; + size_t op_size = sizeof(uint64_t); + + //Write a bad address + uint64_t bad_addr = 0x02123456; + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> Write bad address 0x%.16X", bad_addr); + op_size = sizeof(uint64_t); + l_err = deviceOp( DeviceFW::WRITE, + l_testTarget, + &new_data, + op_size, + DEVICE_IBSCOM_ADDRESS(bad_addr) ); + if( !l_err ) + { + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> No error on bad address write" ); + TS_FAIL( "ScomTest::test_IBscom_error> No error on bad address write" ); + fails++; + } + else + { + delete l_err; + } + total++; + nanosleep( 0, 1000000 ); //sleep for 1ms + + //Verify ibscom is still enabled, i.e. we didn't think it was a bus fail + l_switches = l_testTarget->getAttr<ATTR_SCOM_SWITCHES>(); + total++; + if( !l_switches.useInbandScom ) + { + TS_FAIL( "ScomTest::test_IBscom_error> IBSCOM was wrongly disabled after bad address write" ); + fails++; + } + + //Read a bad address + bad_addr = 0x02876543; + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> Write bad address 0x%.16X", bad_addr); + op_size = sizeof(uint64_t); + l_err = deviceOp( DeviceFW::READ, + l_testTarget, + &read_data, + op_size, + DEVICE_IBSCOM_ADDRESS(bad_addr) ); + if( !l_err ) + { + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> No error on bad address read" ); + TS_FAIL( "ScomTest::test_IBscom_error> No error on bad address read" ); + fails++; + } + else + { + delete l_err; + } + total++; + + //Verify ibscom is still enabled, i.e. we didn't think it was a bus fail + l_switches = l_testTarget->getAttr<ATTR_SCOM_SWITCHES>(); + total++; + if( !l_switches.useInbandScom ) + { + TS_FAIL( "ScomTest::test_IBscom_error> IBSCOM was wrongly disabled after bad address read" ); + fails++; + } + //Read a good address to prove things still work + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> Read good address 0x%.16X", 0x02010803); + op_size = sizeof(uint64_t); + l_err = deviceOp( DeviceFW::READ, + l_testTarget, + &read_data, + op_size, + DEVICE_IBSCOM_ADDRESS(0x02010803) ); + if( l_err ) + { + TRACFCOMP(g_trac_ibscom,"IBscomTest::test_IBscom_error> Error on read after fail" ); + TS_FAIL( "ScomTest::test_IBscom_error> Error on read after fail" ); + errlCommit(l_err,IBSCOM_COMP_ID); + fails++; + } + total++; + + TS_TRACE("test_IBscom_error runs successfully!"); + TRACFCOMP(g_trac_ibscom, + "IBscomTest::test_IBscom_error> %d/%d fails", + fails, total ); + + //TS_FAIL("FORCING ERROR TO STOP IPL"); + + return; + } }; #endif |