summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatt Derksen <mderkse1@us.ibm.com>2019-06-04 08:33:49 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-06-24 10:34:29 -0500
commit164e8bc5fc070dfcffb7ce86077161259f01af93 (patch)
treef66a916bb1c3dfc9e799ca886f297d44392a6887 /src
parent3b05c7a782f6b61c7ba1bddc5f0d4f000f9e06c0 (diff)
downloadtalos-hostboot-164e8bc5fc070dfcffb7ce86077161259f01af93.tar.gz
talos-hostboot-164e8bc5fc070dfcffb7ce86077161259f01af93.zip
Add planar vpd support to Axone simics
Simics support was added so now we can read directly from hardware. Change-Id: I161a847377c7271d14bf94b2e1fa7c3c63c2530c RTC:209309 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/78305 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Reviewed-by: Roland Veloz <rveloz@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/build/configs/simics_axone.config11
-rw-r--r--src/usr/vpd/errlud_vpd.C10
-rw-r--r--src/usr/vpd/ipvpd.C16
-rw-r--r--src/usr/vpd/pvpd.C2
-rwxr-xr-xsrc/usr/vpd/vpd.C136
5 files changed, 78 insertions, 97 deletions
diff --git a/src/build/configs/simics_axone.config b/src/build/configs/simics_axone.config
index d5d2e71b9..5e4e3fe4b 100644
--- a/src/build/configs/simics_axone.config
+++ b/src/build/configs/simics_axone.config
@@ -17,6 +17,15 @@ set MVPD_WRITE_TO_HW
unset MVPD_READ_FROM_PNOR
unset MVPD_WRITE_TO_PNOR
+# Force PVPD read/write to use EEPROM layer instead of old-style VPD cache
+set PVPD_READ_FROM_HW
+set PVPD_WRITE_TO_HW
+unset PVPD_READ_FROM_PNOR
+unset PVPD_WRITE_TO_PNOR
+
+# Have Planar VPD
+set HAVE_PVPD
+
#set to run cxx testcases during boot
unset EARLY_TESTCASES
@@ -34,4 +43,4 @@ set AXONE
# Enable Console
set CONSOLE
-unset CONSOLE_OUTPUT_ERRORDISPLAY \ No newline at end of file
+unset CONSOLE_OUTPUT_ERRORDISPLAY
diff --git a/src/usr/vpd/errlud_vpd.C b/src/usr/vpd/errlud_vpd.C
index f24a5a030..8030e134c 100644
--- a/src/usr/vpd/errlud_vpd.C
+++ b/src/usr/vpd/errlud_vpd.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2014 */
+/* Contributors Listed Below - COPYRIGHT 2014,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -61,8 +61,8 @@ UdVpdParms::UdVpdParms( TARGETING::Target * i_target,
reallocUsrBuf(sizeof(uint8_t)
+sizeof(uint32_t)
+sizeof(uint64_t)*3));
- uint32_t tmp64 = 0;
- uint16_t tmp32 = 0;
+ uint64_t tmp64 = 0;
+ uint32_t tmp32 = 0;
uint8_t tmp8 = 0;
tmp8 = read_notWrite;
@@ -124,8 +124,8 @@ UdConfigParms::UdConfigParms( TARGETING::Target * i_target,
char * l_pBuf = reinterpret_cast<char *>(
reallocUsrBuf(sizeof(uint32_t)
+sizeof(uint64_t)*7));
- uint32_t tmp64 = 0;
- uint16_t tmp32 = 0;
+ uint64_t tmp64 = 0;
+ uint32_t tmp32 = 0;
tmp32 = TARGETING::get_huid(i_target);
memcpy(l_pBuf, &tmp32, sizeof(tmp32));
diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
index 0469c0250..3348c7a54 100644
--- a/src/usr/vpd/ipvpd.C
+++ b/src/usr/vpd/ipvpd.C
@@ -988,8 +988,12 @@ errlHndl_t IpVpdFacade::findRecordOffset ( const char * i_record,
return err;
}
- TRACFCOMP( g_trac_vpd, INFO_MRK" Record %s for target 0x%.8X exists at %p in PNOR",
+ // Don't trace that record exists in PNOR if it does not
+ if (l_overridePtr != nullptr)
+ {
+ TRACFCOMP( g_trac_vpd, INFO_MRK" Record %s for target 0x%.8X exists at %p in PNOR",
i_record, get_huid(i_target), l_overridePtr );
+ }
}
// If we have an override, the record is already pointed at directly
@@ -1283,7 +1287,7 @@ errlHndl_t IpVpdFacade::findRecordOffsetSeeprom ( const char * i_record,
TARGETING::Target * i_target,
input_args_t i_args )
{
- errlHndl_t err = NULL;
+ errlHndl_t err = nullptr;
char l_buffer[256] = { 0 };
uint16_t offset = 0x0;
@@ -1351,6 +1355,12 @@ errlHndl_t IpVpdFacade::findRecordOffsetSeeprom ( const char * i_record,
err = retrieveKeyword( "PT", "VTOC", offset, index, i_target, l_buffer,
pt_len, i_args );
if ( err ) {
+ // There may be only one PT record
+ if (index != 0)
+ {
+ delete err;
+ err = nullptr;
+ }
break;
}
@@ -1374,7 +1384,7 @@ errlHndl_t IpVpdFacade::findRecordOffsetSeeprom ( const char * i_record,
}
}
- if ( !found && err == NULL ) {
+ if ( !found && err == nullptr ) {
TRACFCOMP( g_trac_vpd,
ERR_MRK"IpVpdFacade::findRecordOffsetSeeprom: "
"No matching Record (%s) found in VTOC!", i_record );
diff --git a/src/usr/vpd/pvpd.C b/src/usr/vpd/pvpd.C
index 8d33a24af..c5d85d827 100644
--- a/src/usr/vpd/pvpd.C
+++ b/src/usr/vpd/pvpd.C
@@ -246,7 +246,7 @@ errlHndl_t nodePresenceDetect(DeviceFW::OperationType i_opType,
}
pvpd_present = VPD::pvpdPresent( i_target );
-#if(defined( CONFIG_PVPD_READ_FROM_HW ) && !defined( __HOSTBOOT_RUNTIME) )
+#if(defined( CONFIG_PVPD_READ_FROM_HW ) && !defined( __HOSTBOOT_RUNTIME) && defined(CONFIG_PVPD_READ_FROM_PNOR))
if( pvpd_present )
{
// Check if the VPD data in the PNOR matches the SEEPROM
diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
index aa85a3ed6..a749ff9ec 100755
--- a/src/usr/vpd/vpd.C
+++ b/src/usr/vpd/vpd.C
@@ -475,55 +475,55 @@ void setPartAndSerialNumberAttributes( TARGETING::Target * i_target )
void updateSerialNumberFromBMC( TARGETING::Target * i_nodetarget )
{
#ifdef CONFIG_UPDATE_SN_FROM_BMC
- errlHndl_t l_errl = NULL;
- size_t l_vpdSize = 0;
-
- //Get Product Serial Number from Backplane
- char* l_sn_prod = NULL;
- l_sn_prod = IPMIFRUINV::getProductSN(0);
- if (l_sn_prod != NULL)
- {
- TRACFCOMP(g_trac_vpd, "Got system serial number from BMC.");
- TRACFCOMP(g_trac_vpd, "SN from BMC is: %s", l_sn_prod);
-
- l_errl = deviceRead(i_nodetarget, NULL, l_vpdSize,
- DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
-
- if(l_errl == NULL)
- {
- uint8_t l_vpddata[l_vpdSize];
-
- l_errl = deviceRead(i_nodetarget, l_vpddata, l_vpdSize,
- DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
-
- if(l_errl == NULL)
- {
- TRACFCOMP(g_trac_vpd, "SN in PVPD::OSYS:SS: %s, size: %d", l_vpddata, l_vpdSize);
-
- if (strncmp(l_sn_prod, l_vpddata, l_vpdSize) != 0)
- {
- l_errl = deviceWrite(i_nodetarget, l_sn_prod, l_vpdSize,
- DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
- CONSOLE::displayf(NULL, "updated SN from BMC into PVPD.");
- CONSOLE::flush();
- CONSOLE::displayf(NULL, "Need a reboot.");
- CONSOLE::flush();
- INITSERVICE::requestReboot();
- }
- }
- }
-
- if(l_errl)
- {
- ERRORLOG::errlCommit(l_errl,VPD_COMP_ID);
- }
-
- //getProductSN requires the caller to delete the char array
- delete[] l_sn_prod;
- l_sn_prod = NULL;
-
- TRACFCOMP(g_trac_vpd, "End updateSerialNumberFromBMC.");
- }
+ errlHndl_t l_errl = NULL;
+ size_t l_vpdSize = 0;
+
+ //Get Product Serial Number from Backplane
+ char* l_sn_prod = NULL;
+ l_sn_prod = IPMIFRUINV::getProductSN(0);
+ if (l_sn_prod != NULL)
+ {
+ TRACFCOMP(g_trac_vpd, "Got system serial number from BMC.");
+ TRACFCOMP(g_trac_vpd, "SN from BMC is: %s", l_sn_prod);
+
+ l_errl = deviceRead(i_nodetarget, NULL, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+
+ if(l_errl == NULL)
+ {
+ uint8_t l_vpddata[l_vpdSize];
+
+ l_errl = deviceRead(i_nodetarget, l_vpddata, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+
+ if(l_errl == NULL)
+ {
+ TRACFCOMP(g_trac_vpd, "SN in PVPD::OSYS:SS: %s, size: %d", l_vpddata, l_vpdSize);
+
+ if (strncmp(l_sn_prod, l_vpddata, l_vpdSize) != 0)
+ {
+ l_errl = deviceWrite(i_nodetarget, l_sn_prod, l_vpdSize,
+ DEVICE_PVPD_ADDRESS( PVPD::OSYS, PVPD::SS ));
+ CONSOLE::displayf(NULL, "updated SN from BMC into PVPD.");
+ CONSOLE::flush();
+ CONSOLE::displayf(NULL, "Need a reboot.");
+ CONSOLE::flush();
+ INITSERVICE::requestReboot();
+ }
+ }
+ }
+
+ if(l_errl)
+ {
+ ERRORLOG::errlCommit(l_errl,VPD_COMP_ID);
+ }
+
+ //getProductSN requires the caller to delete the char array
+ delete[] l_sn_prod;
+ l_sn_prod = NULL;
+
+ TRACFCOMP(g_trac_vpd, "End updateSerialNumberFromBMC.");
+ }
#endif
}
@@ -600,47 +600,9 @@ errlHndl_t getPnAndSnRecordAndKeywords( TARGETING::Target * i_target,
}
else if( i_type == TARGETING::TYPE_NODE )
{
-#if defined(CONFIG_PVPD_READ_FROM_HW) && defined(CONFIG_PVPD_READ_FROM_PNOR)
- IpVpdFacade* l_ipvpd = &(Singleton<PvpdFacade>::instance());
io_record = PVPD::OPFR;
io_keywordPN = PVPD::VP;
io_keywordSN = PVPD::VS;
-
- bool l_zeroPN;
- l_err = l_ipvpd->cmpSeepromToZero( i_target,
- io_record,
- io_keywordPN,
- l_zeroPN );
- if (l_err)
- {
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::getPnAndSnRecordAndKeywords: Error checking if OPFR:VP == 0");
- break;
- }
-
- bool l_zeroSN;
- l_err = l_ipvpd->cmpSeepromToZero( i_target,
- io_record,
- io_keywordSN,
- l_zeroSN );
- if (l_err)
- {
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::getPnAndSnRecordAndKeywords: Error checking if OPFR:VS == 0");
- break;
- }
-
- // If VP and VS are zero, use VINI instead
- if( l_zeroPN && l_zeroSN )
- {
- TRACFCOMP(g_trac_vpd, "setting cvpd to VINI PN SN");
- io_record = PVPD::VINI;
- io_keywordPN = PVPD::PN;
- io_keywordSN = PVPD::SN;
- }
-#else
- io_record = PVPD::VINI;
- io_keywordPN = PVPD::PN;
- io_keywordSN = PVPD::SN;
-#endif
}
else if( i_type == TARGETING::TYPE_MCS )
{
OpenPOWER on IntegriCloud