summaryrefslogtreecommitdiffstats
path: root/src/usr/scan
diff options
context:
space:
mode:
authorMissy Connell <missyc@us.ibm.com>2012-12-10 14:27:10 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-12-17 20:02:48 -0600
commitb75c353365d02d84026c7867080d1816f4199821 (patch)
tree19c7ff36702a73bbe8fdc53c6db905187e5e76bf /src/usr/scan
parent15c04b02e1bd184cc32138b1b95274770d8b548d (diff)
downloadtalos-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.C31
-rw-r--r--src/usr/scan/test/scantest.H102
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
OpenPOWER on IntegriCloud