diff options
| author | Christian Geddes <crgeddes@us.ibm.com> | 2019-04-25 13:04:51 -0500 |
|---|---|---|
| committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2019-05-14 14:54:03 -0500 |
| commit | b95951684667a2d77a76e589505e4250a0f02751 (patch) | |
| tree | 45117e7be05d6b04787717bcb95b818d0f3d8a75 /src/usr | |
| parent | 7ddeb4b85db8f85f1ddffcda0943efeba58e20f9 (diff) | |
| download | talos-hostboot-b95951684667a2d77a76e589505e4250a0f02751.tar.gz talos-hostboot-b95951684667a2d77a76e589505e4250a0f02751.zip | |
Force Axone simics to read all VPD from HW with config flags
This commit will set the config flags to always read from HW
rather than the old VPD cache in PNOR. Until this point in Axone
we were still using an old copy of MVPD that we write into PNOR
during the startup simics scripts. From this commit onward we will
use the actual VPD simics provides. To handle this, some updates
we needed to the PG rules for Axone.
Change-Id: Ie06cefe1aec37edfc4c379ee1173bc51fc6bbe1f
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/76519
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt Derksen <mderkse1@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr')
| -rw-r--r-- | src/usr/fapi2/test/fapi2MvpdTestCxx.H | 6 | ||||
| -rw-r--r-- | src/usr/hwas/common/hwas.C | 15 | ||||
| -rw-r--r-- | src/usr/hwas/common/pgLogic.C | 3 | ||||
| -rw-r--r-- | src/usr/hwas/test/hwas1test.H | 259 | ||||
| -rw-r--r-- | src/usr/vpd/ipvpd.C | 18 | ||||
| -rw-r--r-- | src/usr/vpd/pvpd.C | 3 |
6 files changed, 262 insertions, 42 deletions
diff --git a/src/usr/fapi2/test/fapi2MvpdTestCxx.H b/src/usr/fapi2/test/fapi2MvpdTestCxx.H index 224879070..92d791908 100644 --- a/src/usr/fapi2/test/fapi2MvpdTestCxx.H +++ b/src/usr/fapi2/test/fapi2MvpdTestCxx.H @@ -326,7 +326,8 @@ public: #ifdef CONFIG_EARLY_TESTCASES // Requires some prereqs of step7 - FAPI_INF("Skipping poundv tests"); + FAPI_INF("Skipping poundv tests due to CONFIG_EARLY_TESTCASES"); + #else fapi2::ReturnCode l_rc; @@ -421,7 +422,8 @@ public: #ifdef CONFIG_EARLY_TESTCASES // Requires some prereqs of step7 - FAPI_INF("Skipping poundv tests"); + FAPI_INF("Skipping poundw tests due to CONFIG_EARLY_TESTCASES"); + #else fapi2::ReturnCode l_rc; diff --git a/src/usr/hwas/common/hwas.C b/src/usr/hwas/common/hwas.C index f0ce3ed04..580d6ef60 100644 --- a/src/usr/hwas/common/hwas.C +++ b/src/usr/hwas/common/hwas.C @@ -970,6 +970,13 @@ bool isChipFunctional(const TARGETING::TargetHandle_t &i_target, uint16_t l_xbus = (l_model == MODEL_NIMBUS) ? VPD_CP00_PG_XBUS_GOOD_NIMBUS : VPD_CP00_PG_XBUS_GOOD_CUMULUS; + uint16_t l_perv = (l_model == MODEL_AXONE) ? + VPD_CP00_PG_PERVASIVE_GOOD_AXONE : VPD_CP00_PG_PERVASIVE_GOOD; + + uint16_t l_n2 = (l_model == MODEL_AXONE) ? + VPD_CP00_PG_N2_GOOD_AXONE : VPD_CP00_PG_N2_GOOD; + + // Check all bits in FSI entry if (i_pgData[VPD_CP00_PG_FSI_INDEX] != VPD_CP00_PG_FSI_GOOD) @@ -985,14 +992,14 @@ bool isChipFunctional(const TARGETING::TargetHandle_t &i_target, else // Check all bits in PRV entry if (i_pgData[VPD_CP00_PG_PERVASIVE_INDEX] != - VPD_CP00_PG_PERVASIVE_GOOD) + l_perv) { HWAS_INF("pTarget %.8X - Pervasive pgData[%d]: " "actual 0x%04X, expected 0x%04X - bad", i_target->getAttr<ATTR_HUID>(), VPD_CP00_PG_PERVASIVE_INDEX, i_pgData[VPD_CP00_PG_PERVASIVE_INDEX], - VPD_CP00_PG_PERVASIVE_GOOD); + l_perv); l_chipFunctional = false; } else @@ -1022,14 +1029,14 @@ bool isChipFunctional(const TARGETING::TargetHandle_t &i_target, } else // Check all bits in N2 entry - if (i_pgData[VPD_CP00_PG_N2_INDEX] != VPD_CP00_PG_N2_GOOD) + if (i_pgData[VPD_CP00_PG_N2_INDEX] != l_n2) { HWAS_INF("pTarget %.8X - N2 pgData[%d]: " "actual 0x%04X, expected 0x%04X - bad", i_target->getAttr<ATTR_HUID>(), VPD_CP00_PG_N2_INDEX, i_pgData[VPD_CP00_PG_N2_INDEX], - VPD_CP00_PG_N2_GOOD); + l_n2); l_chipFunctional = false; } else diff --git a/src/usr/hwas/common/pgLogic.C b/src/usr/hwas/common/pgLogic.C index 2cc30944f..edcb41b9a 100644 --- a/src/usr/hwas/common/pgLogic.C +++ b/src/usr/hwas/common/pgLogic.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2018 */ +/* Contributors Listed Below - COPYRIGHT 2018,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -134,6 +134,7 @@ namespace PARTIAL_GOOD // MC // PG/AG Masks const uint16_t MC_R1_AG_MASK = 0xE0FD; + const uint16_t MC_R1_AG_MASK_AXONE = 0xE03D; const uint16_t MC_R2_PG_MASK = 0x0040; const uint16_t MC_R3_PG_MASK = 0x0020; diff --git a/src/usr/hwas/test/hwas1test.H b/src/usr/hwas/test/hwas1test.H index 6784d4408..759ad7ad7 100644 --- a/src/usr/hwas/test/hwas1test.H +++ b/src/usr/hwas/test/hwas1test.H @@ -48,8 +48,74 @@ #include <targeting/common/commontargeting.H> #include <targeting/common/utilFilter.H> +const uint16_t pgDataAllGoodAxone[HWAS::VPD_CP00_PG_DATA_ENTRIES] = + {(uint16_t)HWAS::VPD_CP00_PG_FSI_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_PERVASIVE_GOOD_AXONE, + (uint16_t)HWAS::VPD_CP00_PG_N0_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_N1_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_N2_GOOD_AXONE, + (uint16_t)HWAS::VPD_CP00_PG_N3_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_XBUS_GOOD_CUMULUS, + (uint16_t)HWAS::VPD_CP00_PG_MCxx_GOOD_AXONE, + (uint16_t)HWAS::VPD_CP00_PG_MCxx_GOOD_AXONE, + (uint16_t)HWAS::VPD_CP00_PG_OBUS_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_OBUS_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_OBUS_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_OBUS_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_PCIx_GOOD[0], + (uint16_t)HWAS::VPD_CP00_PG_PCIx_GOOD[1], + (uint16_t)HWAS::VPD_CP00_PG_PCIx_GOOD[2], + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_EPx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_ECxx_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD, + (uint16_t)HWAS::VPD_CP00_PG_RESERVED_GOOD}; + // Buffer with all good data (CUMULUS chip) -const uint16_t pgDataAllGood[HWAS::VPD_CP00_PG_DATA_ENTRIES] = +const uint16_t pgDataAllGoodCumulus[HWAS::VPD_CP00_PG_DATA_ENTRIES] = {(uint16_t)HWAS::VPD_CP00_PG_FSI_GOOD, (uint16_t)HWAS::VPD_CP00_PG_PERVASIVE_GOOD, (uint16_t)HWAS::VPD_CP00_PG_N0_GOOD, @@ -371,9 +437,20 @@ public: ? (uint16_t)VPD_CP00_PG_RESERVED_GOOD : (uint16_t)VPD_CP00_PG_OBUS_GOOD; uint16_t pgData[VPD_CP00_PG_DATA_ENTRIES]; - memcpy(pgData, - pgDataAllGood, - VPD_CP00_PG_DATA_LENGTH); + + if(MODEL_AXONE == l_model) + { + memcpy(pgData, + pgDataAllGoodAxone, + VPD_CP00_PG_DATA_LENGTH); + } + else + { + memcpy(pgData, + pgDataAllGoodCumulus, + VPD_CP00_PG_DATA_LENGTH); + } + pgData[VPD_CP00_PG_XBUS_INDEX] = l_xbus; pgData[VPD_CP00_PG_OB0_INDEX + 1] = l_obus12; pgData[VPD_CP00_PG_OB0_INDEX + 2] = l_obus12; @@ -460,9 +537,18 @@ public: l_mask); } - // Restore the "all good" data - pgData[VPD_CP00_PG_PERVASIVE_INDEX] = - (uint16_t)VPD_CP00_PG_PERVASIVE_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_PERVASIVE_INDEX] = + (uint16_t)VPD_CP00_PG_PERVASIVE_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_PERVASIVE_INDEX] = + (uint16_t)VPD_CP00_PG_PERVASIVE_GOOD; + } } TS_INFO( "testHWASisChipFunctional: N0 is not functional"); @@ -562,6 +648,19 @@ public: // Restore the "all good" data pgData[VPD_CP00_PG_N2_INDEX] = (uint16_t)VPD_CP00_PG_N2_GOOD; + + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_N2_INDEX] = + (uint16_t)VPD_CP00_PG_N2_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_N2_INDEX] = + (uint16_t)VPD_CP00_PG_N2_GOOD; + } } TS_INFO( "testHWASisChipFunctional: N3 is not functional"); @@ -686,9 +785,20 @@ public: ? (uint16_t)VPD_CP00_PG_RESERVED_GOOD : (uint16_t)VPD_CP00_PG_OBUS_GOOD; uint16_t pgData[VPD_CP00_PG_DATA_ENTRIES]; - memcpy(pgData, - pgDataAllGood, - VPD_CP00_PG_DATA_LENGTH); + + if(MODEL_AXONE == l_model) + { + memcpy(pgData, + pgDataAllGoodAxone, + VPD_CP00_PG_DATA_LENGTH); + } + else + { + memcpy(pgData, + pgDataAllGoodCumulus, + VPD_CP00_PG_DATA_LENGTH); + } + pgData[VPD_CP00_PG_XBUS_INDEX] = l_xbus; pgData[VPD_CP00_PG_OB0_INDEX + 1] = l_obus12; pgData[VPD_CP00_PG_OB0_INDEX + 2] = l_obus12; @@ -1107,9 +1217,19 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[l_indexMC] = VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } break; @@ -1208,8 +1328,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[l_indexMC] = VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } break; @@ -1307,8 +1437,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[l_indexMC] = VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } break; @@ -1406,8 +1546,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[l_indexMC] = VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } break; @@ -1506,8 +1656,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[l_indexMC] = VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[l_indexMC] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } break; @@ -1871,9 +2031,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = - (uint16_t)VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } @@ -1987,9 +2156,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - // Restore the "all good" data - pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit]] = - (uint16_t)VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } } // TEST WITH BAD MAGIC PORT (MCA0 or MCA4) @@ -2038,8 +2216,18 @@ public: pDesc->getAttr<ATTR_HUID>()); } - pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit / 2]] = - (uint16_t)VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit / 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit / 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } // Try bad MCA Port setting for MCA2/3 & MCA6/7 if ( VPD_CP00_PG_MCxx_IOMyy[l_chipUnit / 2] != @@ -2147,8 +2335,19 @@ public: } // Restore the "all good" data - pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = - (uint16_t)VPD_CP00_PG_MCxx_GOOD; + if(MODEL_AXONE == l_model) + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD_AXONE; + } + else + { + // Restore the "all good" data + pgData[VPD_CP00_PG_MCxx_INDEX[l_chipUnit * 2]] = + (uint16_t)VPD_CP00_PG_MCxx_GOOD; + } + } diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C index 168bc5d36..2195ab3c3 100644 --- a/src/usr/vpd/ipvpd.C +++ b/src/usr/vpd/ipvpd.C @@ -1896,21 +1896,31 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName, offset, i_recordName ); + // convert data for SRC display + uint32_t exp_rec; + memcpy( &exp_rec, i_recordName, RECORD_BYTE_SIZE ); + uint32_t act_rec; + memcpy( &act_rec, record, RECORD_BYTE_SIZE ); + /*@ * @errortype * @reasoncode VPD::VPD_RECORD_MISMATCH * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE * @moduleid VPD::VPD_IPVPD_FIND_KEYWORD_ADDR - * @userdata1 Current offset into VPD - * @userdata2 Start of Record offset + * @userdata1[00:31] Current offset into VPD + * @userdata1[32:63] Start of Record offset + * @userdata2[00:31] Expected record name + * @userdata2[32:63] Found record name * @devdesc Record name does not match value expected for * offset read. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, VPD::VPD_IPVPD_FIND_KEYWORD_ADDR, VPD::VPD_RECORD_MISMATCH, - offset, - i_offset ); + TWO_UINT32_TO_UINT64(offset, + i_offset ), + TWO_UINT32_TO_UINT64(exp_rec, + act_rec) ); // Could be the VPD of the target wasn't set up properly // -- DECONFIG so that we can possibly keep booting diff --git a/src/usr/vpd/pvpd.C b/src/usr/vpd/pvpd.C index 371a87deb..8d33a24af 100644 --- a/src/usr/vpd/pvpd.C +++ b/src/usr/vpd/pvpd.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -42,6 +42,7 @@ #include <config.h> #include "pvpd.H" #include "cvpd.H" +#include "dvpd.H" #include "vpd.H" #include <initservice/initserviceif.H> |

