diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2019-10-10 14:09:23 -0500 |
---|---|---|
committer | William G Hoffa <wghoffa@us.ibm.com> | 2019-10-30 09:45:38 -0500 |
commit | 38949a9bbbbba1cb0e23f9eb19473937446a9269 (patch) | |
tree | f4d666367c37623c26ed872132d3f37837d9780a /src/usr | |
parent | 5dd26a01eed5ee4c177c83fe0d811ffbde902a37 (diff) | |
download | talos-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.C | 93 |
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; |