summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2019-10-10 14:09:23 -0500
committerWilliam G Hoffa <wghoffa@us.ibm.com>2019-10-30 09:45:38 -0500
commit38949a9bbbbba1cb0e23f9eb19473937446a9269 (patch)
treef4d666367c37623c26ed872132d3f37837d9780a /src/usr
parent5dd26a01eed5ee4c177c83fe0d811ffbde902a37 (diff)
downloadtalos-hostboot-38949a9bbbbba1cb0e23f9eb19473937446a9269.tar.gz
talos-hostboot-38949a9bbbbba1cb0e23f9eb19473937446a9269.zip
Do not crash if we have no functional nodes
We hit a case where i2c errors caused the node target to get marked as non-present. This led to an assert crashing Hostboot because it assumed we would always have a functional node0. The change here is to allow this case to flow through so that we end up with more recognizable error handling for the real failures during boot. Change-Id: Iaaaa4e531b677bda442da892cfbd6094e0897beb Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/85169 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: Matt Derksen <mderkse1@us.ibm.com> Reviewed-by: Corey V Swenson <cswenson@us.ibm.com> Reviewed-by: William G Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/ipmiext/ipmisensor.C93
1 files changed, 50 insertions, 43 deletions
diff --git a/src/usr/ipmiext/ipmisensor.C b/src/usr/ipmiext/ipmisensor.C
index 5dd428d06..ae6032353 100644
--- a/src/usr/ipmiext/ipmisensor.C
+++ b/src/usr/ipmiext/ipmisensor.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2014,2018 */
+/* Contributors Listed Below - COPYRIGHT 2014,2019 */
/* [+] Google Inc. */
/* [+] International Business Machines Corp. */
/* */
@@ -1363,7 +1363,7 @@ namespace SENSOR
TARGETING::targetService().getTopLevelTarget(sys);
assert(sys != NULL);
getChildAffinityTargets(nodes, sys, TARGETING::CLASS_ENC,
- TARGETING::TYPE_NODE);
+ TARGETING::TYPE_NODE, false);
assert(!nodes.empty());
//Backplane sensor ID
@@ -1390,8 +1390,13 @@ namespace SENSOR
static uint16_t L_NV_bits = 0;
errlHndl_t l_err = nullptr;
- if (L_NV_bits == 0)
- {
+ do {
+ // only do the lookup once
+ if (L_NV_bits != 0)
+ {
+ break;
+ }
+
// grab system enclosure node
TARGETING::TargetHandle_t l_sys = NULL;
TARGETING::TargetHandleList l_nodeTargets;
@@ -1399,61 +1404,63 @@ namespace SENSOR
assert(l_sys != NULL);
getChildAffinityTargets(l_nodeTargets, l_sys, TARGETING::CLASS_ENC,
TARGETING::TYPE_NODE);
- assert(!l_nodeTargets.empty());
+ if(l_nodeTargets.empty())
+ {
+ TRACFCOMP(g_trac_ipmi,"getNVCfgIDBit(): No functional nodes - forcing invalid config");
+ break;
+ }
// get keyword size first
PVPD::pvpdRecord l_Record = PVPD::VNDR;
PVPD::pvpdKeyword l_KeyWord = PVPD::NV;
size_t l_nvKwdSize = 0;
l_err = deviceRead(l_nodeTargets[0],NULL,l_nvKwdSize,
- DEVICE_PVPD_ADDRESS(l_Record,l_KeyWord));
- if (!l_err)
+ DEVICE_PVPD_ADDRESS(l_Record,l_KeyWord));
+ if (l_err)
{
- if (l_nvKwdSize == sizeof(HDAT::hdatNVKwdStruct_t))
+ TRACFCOMP(g_trac_ipmi,"getNVCfgIDBit(): Error getting VNDR:NV size");
+ break;
+ }
+
+ if (l_nvKwdSize != sizeof(HDAT::hdatNVKwdStruct_t))
+ {
+ TRACFCOMP(g_trac_ipmi,"Invalid NV keyword size: %d, expected %d",l_nvKwdSize,sizeof(HDAT::hdatNVKwdStruct_t));
+ break;
+ }
+
+ uint8_t l_kwd[l_nvKwdSize] = {0};
+ // now read the keyword
+ l_err = deviceRead(l_nodeTargets[0],l_kwd,l_nvKwdSize,
+ DEVICE_PVPD_ADDRESS(l_Record,l_KeyWord));
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_ipmi,"getNVCfgIDBit(): Error reading VNDR:NV");
+ break;
+ }
+
+ HDAT::hdatNVKwdStruct_t * NVptr =
+ reinterpret_cast<HDAT::hdatNVKwdStruct_t*>(l_kwd);
+
+ // Valid NV keyword config has NV00 as magic header
+ if ( !memcmp((char*)&(NVptr->magic),"NV00", 4) )
+ {
+ uint8_t cfgID = NVptr->config;
+ if (cfgID < 16) // maximum setting (bits 0-15)
{
- uint8_t l_kwd[l_nvKwdSize] = {0};
- // now read the keyword
- l_err = deviceRead(l_nodeTargets[0],l_kwd,l_nvKwdSize,
- DEVICE_PVPD_ADDRESS(l_Record,l_KeyWord));
- if (!l_err)
- {
- HDAT::hdatNVKwdStruct_t * NVptr =
- reinterpret_cast<HDAT::hdatNVKwdStruct_t*>(l_kwd);
-
- // Valid NV keyword config has NV00 as magic header
- if ( !memcmp((char*)&(NVptr->magic),"NV00", 4) )
- {
- uint8_t cfgID = NVptr->config;
- if (cfgID < 16) // maximum setting (bits 0-15)
- {
- L_NV_bits = 0x0001 << cfgID;
- }
- else
- {
- TRACFCOMP(g_trac_ipmi,"getNVCfgIDBit(): Invalid NV config 0x%02X", cfgID);
- }
- }
- else
- {
- TRACFCOMP(g_trac_ipmi, "Invalid NV magic header: 0x%.8X", NVptr->magic);
- TRACFBIN(g_trac_ipmi, "NV KEYWORD", l_kwd, l_nvKwdSize);
- }
- }
- else
- {
- TRACFCOMP(g_trac_ipmi,ERR_MRK"%.8X Error getting VNDR record data",l_err->eid());
- }
+ L_NV_bits = 0x0001 << cfgID;
}
else
{
- TRACFCOMP(g_trac_ipmi,"Invalid NV keyword size: %d, expected %d",l_nvKwdSize,sizeof(HDAT::hdatNVKwdStruct_t));
+ TRACFCOMP(g_trac_ipmi,"getNVCfgIDBit(): Invalid NV config 0x%02X", cfgID);
+ break;
}
}
else
{
- TRACFCOMP(g_trac_ipmi,ERR_MRK"%.8X Error getting VNDR record size",l_err->eid());
+ TRACFCOMP(g_trac_ipmi, "Invalid NV magic header: 0x%.8X", NVptr->magic);
+ TRACFBIN(g_trac_ipmi, "NV KEYWORD", l_kwd, l_nvKwdSize);
}
- }
+ } while(0);
o_cfgID_bitwise = L_NV_bits;
OpenPOWER on IntegriCloud