summaryrefslogtreecommitdiffstats
path: root/src/usr/ipmiext/ipmisensor.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/ipmiext/ipmisensor.C')
-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