diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2017-08-15 16:44:36 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-09-01 09:38:11 -0400 |
commit | 3d4caf24f7e90f183f93cbcb915470f7205bb7f4 (patch) | |
tree | 2dfba534dc100960f8d4a40d9fbbfef9ff832b61 /src/usr/ipmi | |
parent | 7b2191a74ffc3b431c9ddb6c75b0fefc7f20d133 (diff) | |
download | blackbird-hostboot-3d4caf24f7e90f183f93cbcb915470f7205bb7f4.tar.gz blackbird-hostboot-3d4caf24f7e90f183f93cbcb915470f7205bb7f4.zip |
Added Error log support for new GPU sensors
Change-Id: I8a0de390516fd02df07860b960db506899b13f14
RTC:178218
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/45116
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/ipmi')
-rw-r--r-- | src/usr/ipmi/ipmiconfiglookup.C | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/usr/ipmi/ipmiconfiglookup.C b/src/usr/ipmi/ipmiconfiglookup.C index 0cea60a55..ee2eb85eb 100644 --- a/src/usr/ipmi/ipmiconfiglookup.C +++ b/src/usr/ipmi/ipmiconfiglookup.C @@ -92,6 +92,76 @@ bool IpmiConfigLookup::lookupIPMISensorInfo(TARGETING::Target * i_target, } +//----------------------------------------------------------------------------- +// Private method used to lookup sensor information from the GPU_SENSORS +// array attribute of the i_target parameter. +// +// Returns true if the sensor was found, false otherwise. +//----------------------------------------------------------------------------- +bool IpmiConfigLookup::lookupGPUSensorInfo(TARGETING::Target * i_target, + uint32_t i_sensorNumber, + uint8_t& o_sensorType, + uint8_t& o_entityId, + TARGETING::SENSOR_NAME& o_sensorName + ) +{ + using GPU_ARRAY_ELEMENT = uint16_t[7]; + bool l_result{false}; + + assert(nullptr != i_target); + assert(TARGETING::UTIL::INVALID_IPMI_SENSOR != i_sensorNumber); + + // Get the GPU_SENSORS array attribute from i_target + TARGETING::AttributeTraits<TARGETING::ATTR_GPU_SENSORS>::Type + l_sensorArray; + if(!i_target->tryGetAttr<TARGETING::ATTR_GPU_SENSORS>(l_sensorArray)) + { + return l_result; + } + + //Search the sensor array for the desired sensor + uint32_t elementCount = (sizeof(l_sensorArray)/sizeof(l_sensorArray[0])); + const GPU_ARRAY_ELEMENT * begin = &l_sensorArray[0]; + const GPU_ARRAY_ELEMENT * end = &l_sensorArray[elementCount]; + const GPU_ARRAY_ELEMENT * itr{nullptr}; + + itr = std::find_if(begin, + end, + [i_sensorNumber] (const GPU_ARRAY_ELEMENT& a) + { + return ( + (a[TARGETING::GPU_SENSOR_ARRAY_FUNC_ID_OFFSET] == i_sensorNumber) || + (a[TARGETING::GPU_SENSOR_ARRAY_TEMP_ID_OFFSET] == i_sensorNumber) || + (a[TARGETING::GPU_SENSOR_ARRAY_MEM_TEMP_ID_OFFSET] == i_sensorNumber)); + } + ); + + if(itr != end) + { + l_result = true; + uint16_t l_sensorName; + if (*itr[TARGETING::GPU_SENSOR_ARRAY_FUNC_ID_OFFSET] == i_sensorNumber) + { + l_sensorName = *itr[TARGETING::GPU_SENSOR_ARRAY_FUNC_OFFSET]; + } + else if + (*itr[TARGETING::GPU_SENSOR_ARRAY_TEMP_ID_OFFSET] == i_sensorNumber) + { + l_sensorName = *itr[TARGETING::GPU_SENSOR_ARRAY_TEMP_ID_OFFSET]; + } + else + { + l_sensorName = *itr[TARGETING::GPU_SENSOR_ARRAY_MEM_TEMP_ID_OFFSET]; + } + + o_sensorName = static_cast<TARGETING::SENSOR_NAME>(l_sensorName); + o_sensorType = static_cast<uint8_t>((l_sensorName >> 8) & 0x00FF); + o_entityId = static_cast<uint8_t>(l_sensorName & 0x00FF); + } + + return l_result; +} + //-------------------------------------------------------------------------- //Given a sensor number, lookup and parse SENSOR_NAME into SENSOR_TYPE //and ENTITY_ID values. @@ -150,6 +220,19 @@ bool IpmiConfigLookup::getIPMISensorInfo(uint32_t i_sensorNumber, break; } } + else if (doesTargetHaveGPUSensorsAttr(*itr)) + { + l_result = lookupGPUSensorInfo((*itr), + i_sensorNumber, + l_sensorType, + l_entityId, + l_sensorName); + if (l_result) + { + break; + } + + } } } |