diff options
author | Missy Connell <missyc@us.ibm.com> | 2012-12-10 14:27:10 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-12-17 20:02:48 -0600 |
commit | b75c353365d02d84026c7867080d1816f4199821 (patch) | |
tree | 19c7ff36702a73bbe8fdc53c6db905187e5e76bf /src/usr/scan | |
parent | 15c04b02e1bd184cc32138b1b95274770d8b548d (diff) | |
download | talos-hostboot-b75c353365d02d84026c7867080d1816f4199821.tar.gz talos-hostboot-b75c353365d02d84026c7867080d1816f4199821.zip |
Scan support in Simics. Scandd testcases enabled.
RTC:46643
Change-Id: I9e546c1d753ae42f5dc662f88c91f00d9a32e2db
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2705
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/scan')
-rw-r--r-- | src/usr/scan/scandd.C | 31 | ||||
-rw-r--r-- | src/usr/scan/test/scantest.H | 102 |
2 files changed, 82 insertions, 51 deletions
diff --git a/src/usr/scan/scandd.C b/src/usr/scan/scandd.C index a96ddfeda..4ea77d0e0 100644 --- a/src/usr/scan/scandd.C +++ b/src/usr/scan/scandd.C @@ -227,7 +227,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, do { - TRACDCOMP( g_trac_scandd,"SCAN::scanDoScan> Start::: i_ring=%.8X, i_ringLength=%d, i_flag=%.8X, i_opType=%.8X",i_ring, i_ringlength, i_flag, i_opType); + TRACFCOMP( g_trac_scandd,"SCAN::scanDoScan> Start::: i_ring=%lX, i_ringLength=%d, i_flag=%lX, i_opType=%.8X",i_ring, i_ringlength, i_flag, i_opType); // To get the remaining bits of data // If not on a 32bit boundary need to know how many bits to shift. @@ -278,13 +278,13 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, op_size, DEVICE_SCOM_ADDRESS(l_scanTypeAddr)); - TRACDCOMP( g_trac_scandd,"SCAN: ScanSelect PUTSCOM %.8x = %.8x, %.8x", l_scanTypeAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: ScanSelect PUTSCOM %lX = %.8x, %.8x", l_scanTypeAddr , l_buffer[0], l_buffer[1]); if(l_err) { TRACFCOMP( g_trac_scandd, ERR_MRK - "SCAN::scanDoScan> SCOM Write to scan select register failed. i_ring=%.8X, scanTypeData=%llX,scanTypeAddr=%.8X, target =%.8X", i_ring, l_scanTypeData,l_scanTypeAddr, TARGETING::get_huid(i_target) ); + "SCAN::scanDoScan> SCOM Write to scan select register failed. i_ring=%lX, scanTypeData=%lX,scanTypeAddr=%lX, target =%.8X", i_ring, l_scanTypeData,l_scanTypeAddr, TARGETING::get_huid(i_target) ); // TODO: Add usrDetails break; @@ -329,7 +329,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, op_size, DEVICE_SCOM_ADDRESS(l_headerDataAddr)); - TRACDCOMP( g_trac_scandd,"SCAN:(Cent Headr) GETSCOM %.8x = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN:(Cent Headr) GETSCOM %lX = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); if(l_err) { @@ -427,7 +427,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // and there are no additional bits left.. // then set bit 18 if ((l_wordCnt == l_wordsInChain-1) && (l_setPulse) && - (l_lastDataBits == 0)) + (l_lastDataBits == 0) && (!l_isCentaur)) { l_scanDataAddr |= 0x00002000; l_setPulse = 0; @@ -435,7 +435,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, l_buffer[0] = *temp_buffer; - TRACDCOMP( g_trac_scandd,"SCAN: Word PUTSCOM %.8x = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: Word PUTSCOM %lX = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); } @@ -463,7 +463,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // the buffer we will return *temp_buffer = l_buffer[0]; - TRACDCOMP( g_trac_scandd,"SCAN: Word GETSCOM %.8x = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: Word GETSCOM %lX = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); } @@ -518,7 +518,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // TRACDCOMP( g_trac_scandd,"SCAN::scanDoScan: Last Bits WRITE> scanTypeDataAddr=%.8X, l_lastDataBits=%d, bytes copied %d,",l_scanDataAddr, l_lastDataBits, ((l_lastDataBits-1)/8 + 1)); - TRACDCOMP( g_trac_scandd,"SCAN: <32Bits PUTSCOM %.8x = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: <32Bits PUTSCOM %lX = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); } // read/write remaining bits and shift @@ -539,6 +539,11 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // If this was a read operation. if( DeviceFW::READ == i_opType ) { + + // Need to shift the data bits to have the data bits be left + // justified + l_buffer[0] = l_buffer[0]<<(32-l_lastDataBits); + // Need to copy the last data bits read in by scom back into // the buffer we will return // subtracting 1 from the bits before dividing by 8 to insure @@ -547,7 +552,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, //TRACDCOMP( g_trac_scandd, "SCAN::scanDoScan: Last Bits READ> scanTypeDataAddr=%.8X, l_lastDataBits=%d, bytes copied = %d",l_scanDataAddr, l_lastDataBits, ((l_lastDataBits-1)/8 + 1)); - TRACDCOMP( g_trac_scandd,"SCAN: <32bits GETSCOM %.8x = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: <32bits GETSCOM %lX = %.8x %.8x",l_scanDataAddr , l_buffer[0], l_buffer[1]); } } @@ -589,7 +594,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // then set bit 18 if (l_setPulse) { - l_scanDataAddr |= 0x00002000; + l_headerDataAddr |= 0x00002000; l_setPulse = 0; } } @@ -602,7 +607,7 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, op_size, DEVICE_SCOM_ADDRESS(l_headerDataAddr)); - TRACDCOMP( g_trac_scandd,"SCAN: Headr GETSCOM %.8x = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); + TRACDCOMP( g_trac_scandd,"SCAN: Headr GETSCOM %lX = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); if(l_err) { @@ -618,9 +623,9 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, // If the header data did not match.. if ((l_buffer[0] != HEADER_CHECK_DATA)) { - TRACFCOMP( g_trac_scandd,"SCAN::scanDoScan> Header Check expect deadbeef.. i_ring=%.8X, i_opType=%.8X , ring data=%.8X, i_flag=%.8X,", i_ring, i_opType, l_buffer[0], i_flag ); + TRACDCOMP( g_trac_scandd,"SCAN::scanDoScan> Header Check Failed expect deadbeef.. i_ring=%.8X, i_opType=%.8X , ring data=%.8X, i_flag=%.8X,", i_ring, i_opType, l_buffer[0], i_flag ); - TRACFCOMP( g_trac_scandd,"SCAN: HEADER DATA FAILED%.8x = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); + TRACFCOMP( g_trac_scandd,"SCAN: HEADER DATA FAILED!! %.8x = %.8x %.8x",l_headerDataAddr , l_buffer[0], l_buffer[1]); /*@ * @errortype diff --git a/src/usr/scan/test/scantest.H b/src/usr/scan/test/scantest.H index 666dcd590..0b15a677a 100644 --- a/src/usr/scan/test/scantest.H +++ b/src/usr/scan/test/scantest.H @@ -48,17 +48,7 @@ public: * */ - void test_SCANreadWrite_proc(void) - { - - - } - -// Skipping the real scan test for now because the SCOM regs are not defined and simics -// is broken for the actions required. - - void skip_SCANreadWrite_proc(void) -// void test_SCANreadWrite_proc(void) + void test_SCANreadWrite_proc(void) { TRACFCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> Start" ); @@ -70,7 +60,7 @@ public: // Setup some targets to use enum { myPROC0, - centaur0, + memBuf0, NUM_TARGETS }; TARGETING::Target* scan_targets[NUM_TARGETS]; @@ -87,8 +77,22 @@ public: scan_targets[myPROC0] = TARGETING::targetService().toTarget(epath); epath.removeLast(); - epath.addLast(TARGETING::TYPE_MEMBUF,0); - scan_targets[centaur0] = TARGETING::targetService().toTarget(epath); + // target membuf 0 + epath.addLast(TARGETING::TYPE_MEMBUF,4); + scan_targets[memBuf0] = TARGETING::targetService().toTarget(epath); + + //printk("Scan Proc target functional state %X present %X \n", + //scan_targets[myPROC0]->getAttr<TARGETING::ATTR_HWAS_STATE>().functional,scan_targets[myPROC0]->getAttr<TARGETING::ATTR_HWAS_STATE>().present ); + + TARGETING::HwasState l_hwasState; + l_hwasState = scan_targets[myPROC0]->getAttr<TARGETING::ATTR_HWAS_STATE>(); + + l_hwasState.functional = true; + scan_targets[myPROC0]->setAttr<TARGETING::ATTR_HWAS_STATE>(l_hwasState); + + //printk("Scan Proc target functional state after updating is %X present %X \n", + //scan_targets[myPROC0]->getAttr<TARGETING::ATTR_HWAS_STATE>().functional,scan_targets[myPROC0]->getAttr<TARGETING::ATTR_HWAS_STATE>().present ); + for( uint64_t x = 0; x < NUM_TARGETS; x++ ) { @@ -96,32 +100,38 @@ public: if(scan_targets[x] == NULL) { TRACFCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> scan target is null %d", x ); + scan_targets[x] = NULL; //remove from our list continue; } -/* else if (scan_targets[x]->getAttr<TARGETING::ATTR_HWAS_STATE>().functional != true) + else if ((scan_targets[x]->getAttr<TARGETING::ATTR_SCOM_SWITCHES>().useXscom == 0) && + (scan_targets[x]->getAttr<TARGETING::ATTR_SCOM_SWITCHES>().useFsiScom== 0)) { - TRACFCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> Target %d is not functional", x ); + TRACFCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> Target %lX cannot use FSI or Xscom", TARGETING::get_huid(scan_targets[x])); scan_targets[x] = NULL; //remove from our list - } */ + + } + else if (scan_targets[x]->getAttr<TARGETING::ATTR_HWAS_STATE>().functional != true) + { + TRACFCOMP( g_trac_scandd,"scanTest::test_SCANreadWrite_proc> Target %lX is not functional\n",TARGETING::get_huid(scan_targets[x]) ); + scan_targets[x] = NULL; //remove from our list + } } - // scratch data to use - //@fixme: Need to either fabricate some fake registers to use or save off data before modifying scans to avoid - // corrupting the HW. + // Scan data .. struct { TARGETING::Target* target; - uint64_t data; + uint32_t data[8]; uint64_t ring; uint64_t length; - uint64_t flag; // Set to zero now until simics works or the header will fail + uint64_t flag; // used for header check.. } test_data[] = { - { scan_targets[myPROC0], 0x1234123456785678, 0x1103400A, 96, 0x0}, - { scan_targets[centaur0], 0xaaaaaaaaaaaaaaaa, 0x00030088, 436, 0x0}, + { scan_targets[myPROC0], {0x12121212, 0x12341234, 0x12341234, 0x12341234, 0x12341234, 0x12341234, 0x10000000, 0x00000000}, 0x14030803, 197, 0x0}, + { scan_targets[memBuf0], {0x34343434, 0xaaaaaaaa, 0xbbbbbbbb, 0xb0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 0x01034001, 100, 0x2}, }; const uint64_t NUM_ADDRS = sizeof(test_data)/sizeof(test_data[0]); // allocate space for read data - uint64_t read_data[NUM_ADDRS]; + uint32_t read_data[8]; // write all the test registers for( uint64_t x = 0; x < NUM_ADDRS; x++ ) @@ -130,12 +140,12 @@ public: if(test_data[x].target == NULL) { TRACDCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> TARGEt does not exist 2 %d", x ); - continue; } size_t op_size = test_data[x].length; + //printk("Before a write for TARGET %X\n", TARGETING::get_huid(test_data[x].target)); TRACDCOMP( g_trac_scandd, "scanTest::test_SCANreadWrite_proc> Before Device Write 2>>> " ); total++; l_err = deviceWrite( test_data[x].target, @@ -154,9 +164,16 @@ public: } } - // read all the test registers + + + // read all the scan data for( uint64_t x = 0; x < NUM_ADDRS; x++ ) { + for (int j = 0; j<8;j++) + { + read_data[j] = 0; + } + //only run if the target exists if(test_data[x].target == NULL) { @@ -167,9 +184,12 @@ public: total++; l_err = deviceRead( test_data[x].target, - &(read_data[x]), + &(read_data), op_size, - DEVICE_SCAN_ADDRESS(test_data[x].ring, test_data[x].length,test_data[x].flag) ); + DEVICE_SCAN_ADDRESS(test_data[x].ring, + test_data[x].length, + test_data[x].flag) ); + if( l_err ) { TRACFCOMP(g_trac_scandd, "scanTest::SCANreadWrite_proc> [%d] Read: Error from device : ring=0x%X, RC=%X", x, test_data[x].ring, l_err->reasonCode() ); @@ -177,12 +197,22 @@ public: fails++; errlCommit(l_err,SCAN_COMP_ID); } -// NOTE:: currently expect fails - else if(read_data[x] != test_data[x].data) + else // read and verify each word read back from the scan read. { - TRACFCOMP(g_trac_scandd, "scanTest::test_SCANreadWrite_proc> [%d] Read: EXPECTED Data miss-match : ring=0x%X, read_data=0x%llx, write_data=0x%llx", x, test_data[x].ring, read_data[x], test_data[x].data); - //TS_FAIL( "scanTest::test_SCANreadWrite_proc> ERROR : Data miss-match between read and expected data" ); - //fails++; + // dont need to check the first word.. that is the header. + for (uint64_t y=1;y < (test_data[x].length/32 + 1);y++) + { + + //printk("scanTest::test_SCANreadWrite_proc> [%ld] Read: Data : ring=0x%lX, read_data=0x%.8x, //write_data=0x%.8x\n", x, test_data[x].ring, read_data[y], test_data[x].data[y]); + + if(read_data[y] != test_data[x].data[y]) + { + TRACFCOMP(g_trac_scandd, + "scanTest::test_SCANreadWrite_proc> [%d] Read: EXPECTED Data miss-match : ring=0x%X, read_data=0x%.8x, write_data=0x%llx", x, test_data[x].ring, read_data[y], test_data[x].data[y]); + TS_FAIL("scanTest::test_SCANreadWrite_proc> ERROR : Data miss-match between read and expected data" ); + fails++; + } + } } } @@ -191,10 +221,6 @@ public: } - - - - }; #endif |