summaryrefslogtreecommitdiffstats
path: root/src/usr/hwas/test
diff options
context:
space:
mode:
authorMatt Derksen <v2cibmd@us.ibm.com>2016-11-11 09:23:34 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-11-28 17:00:05 -0500
commit2f193c6b29f2c3bcbdeff7fd8c590fb12ddfaa4c (patch)
treecf84f6169768722f3f7a14f72b421061472acaf2 /src/usr/hwas/test
parenteaa6695c507e306f20f659ccdcc49e59191b7d31 (diff)
downloadtalos-hostboot-2f193c6b29f2c3bcbdeff7fd8c590fb12ddfaa4c.tar.gz
talos-hostboot-2f193c6b29f2c3bcbdeff7fd8c590fb12ddfaa4c.zip
Rollup non-functional EC to EQ level while processing PG vpd
An EQ has 2 EXs which each have 2 ECs. If the ECs are all bad, roll that non-functional status up to the EQ level. Change-Id: I0ffcb1679bc00c435fcbd6c439cba84da0311472 RTC:163413 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32546 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Martin Gloff <mgloff@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/hwas/test')
-rw-r--r--src/usr/hwas/test/hwas1test.H93
1 files changed, 92 insertions, 1 deletions
diff --git a/src/usr/hwas/test/hwas1test.H b/src/usr/hwas/test/hwas1test.H
index a85324d62..667d03a46 100644
--- a/src/usr/hwas/test/hwas1test.H
+++ b/src/usr/hwas/test/hwas1test.H
@@ -639,6 +639,7 @@ public:
pDesc->getAttr<ATTR_CHIP_UNIT>();
char l_type_str[9];
char l_pgData[] = "";
+ uint8_t core_idx;
TS_INFO("testHWASisDescFunctional: descendant functional - "
"attr type 0x%04X, chip unit %d", l_type, l_chipUnit);
@@ -923,7 +924,7 @@ public:
// going through loop, thus creating and
// testing mismatched pairs.
if (pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] &
- l_mask)
+ l_mask)
{
// Turn off a bit that should be on
pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] &=
@@ -952,6 +953,70 @@ public:
pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] =
(uint16_t)VPD_CP00_PG_EPx_GOOD;
}
+
+ //////////////////////////////////////
+ // make children bad to check rollup
+ //////////////////////////////////////
+
+ // mark bad EX children
+ TS_INFO("testHWASisDescFunctional>"
+ "Mark EQ%d's EX chiplets bad", l_chipUnit);
+
+ // Choosing a single failure for each EX out of
+ // multiple possibilities
+
+ // Mark l3x, l2x, and/or refrx bad (x = 0 or 1)
+
+ // 1st EX bad: mark refr0 as bad
+ pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] |=
+ 0x0008;
+
+ // 2nd EX bad: mark L21 as bad too
+ pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] |=
+ 0x0040;
+
+ if (isDescFunctional(pDesc, pgData))
+ {
+ TS_FAIL("testHWASisDescFunctional>"
+ "functional = 0x%x, should be false. "
+ "EQ/EP%d = 0x%04x (expected 0x%04X), "
+ "EX children were marked bad ",
+ isDescFunctional(pDesc, pgData),
+ l_chipUnit,
+ pgData[VPD_CP00_PG_EP0_INDEX
+ + l_chipUnit],
+ VPD_CP00_PG_EPx_GOOD);
+ }
+
+ // Restore the "all good" data
+ pgData[VPD_CP00_PG_EP0_INDEX + l_chipUnit] =
+ (uint16_t)VPD_CP00_PG_EPx_GOOD;
+
+ // now try bad CORE rollup
+ core_idx = (uint8_t)l_chipUnit * 4;
+ TS_INFO("testHWASisDescFunctional>"
+ "Now try marking EQ%d cores EC%d - EC%d bad",
+ l_chipUnit, core_idx, core_idx+3);
+ for (int i = 0; i < 4; i++)
+ {
+ pgData[VPD_CP00_PG_EC00_INDEX + core_idx + i] |=
+ ~VPD_CP00_PG_ECxx_GOOD;
+ }
+ if (isDescFunctional(pDesc, pgData))
+ {
+ TS_FAIL("testHWASisDescFunctional>"
+ "EQ/EP%d functional = 0x%x, should be false. "
+ "All 4 EC children were marked bad",
+ l_chipUnit,
+ isDescFunctional(pDesc, pgData));
+ }
+ // Restore the "all good" core data
+ for (int i = 0; i < 4; i++)
+ {
+ pgData[VPD_CP00_PG_EC00_INDEX + core_idx + i] =
+ VPD_CP00_PG_ECxx_GOOD;
+ }
+
break;
case TYPE_EX:
@@ -973,6 +1038,32 @@ public:
pgData[VPD_CP00_PG_EP0_INDEX + (l_chipUnit / 2)] =
(uint16_t)VPD_CP00_PG_EPx_GOOD;
+
+ // Now mark its 2 EC cores as bad and check for rollup
+ core_idx = (uint8_t)l_chipUnit * 2;
+ TS_INFO("testHWASisDescFunctional>"
+ "Now try marking EX%d cores EC%d and EC%d bad",
+ l_chipUnit, core_idx, core_idx+1);
+ for (int i = 0; i < 2; i++)
+ {
+ pgData[VPD_CP00_PG_EC00_INDEX + core_idx + i] |=
+ ~VPD_CP00_PG_ECxx_GOOD;
+ }
+ if (isDescFunctional(pDesc, pgData))
+ {
+ TS_FAIL("testHWASisDescFunctional>"
+ "EX%d functional = 0x%x, should be false. "
+ "All 2 EC children were marked bad",
+ l_chipUnit,
+ isDescFunctional(pDesc, pgData));
+ }
+ // Restore the "all good" core data
+ for (int i = 0; i < 2; i++)
+ {
+ pgData[VPD_CP00_PG_EC00_INDEX + core_idx + i] =
+ VPD_CP00_PG_ECxx_GOOD;
+ }
+
break;
case TYPE_CORE:
OpenPOWER on IntegriCloud