diff options
author | Matt Derksen <v2cibmd@us.ibm.com> | 2016-11-11 09:23:34 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-11-28 17:00:05 -0500 |
commit | 2f193c6b29f2c3bcbdeff7fd8c590fb12ddfaa4c (patch) | |
tree | cf84f6169768722f3f7a14f72b421061472acaf2 /src/usr/hwas/test | |
parent | eaa6695c507e306f20f659ccdcc49e59191b7d31 (diff) | |
download | talos-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.H | 93 |
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: |