diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2018-07-05 12:29:21 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-07-16 17:50:43 -0400 |
commit | 3e645f2d3703b957e2308a21e64697e0bb5102eb (patch) | |
tree | 84388e05152b0bd0049ac851c9e4b6b1366abb7e /src/usr/errl/plugins | |
parent | f4f189641a8ab52949b3b9097b91b7ae376281b8 (diff) | |
download | talos-hostboot-3e645f2d3703b957e2308a21e64697e0bb5102eb.tar.gz talos-hostboot-3e645f2d3703b957e2308a21e64697e0bb5102eb.zip |
Add WOF compare data section for RC_WOF_TABLE_NOT_FOUND errors
Only show data that was compared to find a matching WOF table.
Show each non-matching table in the WOF compare section along with
what we were trying to match
Change-Id: Ia3b44fac54a212e3584536c376598de5dfcf9a8d
CQ:SW426770
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/61986
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>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/errl/plugins')
-rw-r--r-- | src/usr/errl/plugins/errludparserfactoryerrl.H | 2 | ||||
-rw-r--r-- | src/usr/errl/plugins/errludwofdata.H | 206 |
2 files changed, 208 insertions, 0 deletions
diff --git a/src/usr/errl/plugins/errludparserfactoryerrl.H b/src/usr/errl/plugins/errludparserfactoryerrl.H index 923632852..fbefe231f 100644 --- a/src/usr/errl/plugins/errludparserfactoryerrl.H +++ b/src/usr/errl/plugins/errludparserfactoryerrl.H @@ -40,6 +40,7 @@ #include "errludsensor.H" #include "errludbuild.H" #include "errludstate.H" +#include "errludwofdata.H" namespace ERRORLOG { @@ -69,6 +70,7 @@ public: registerParser<ErrlUserDetailsParserSensor>(ERRL_UDT_SENSOR); registerParser<ErrlUserDetailsParserBuild>(ERRL_UDT_BUILD); registerParser<ErrlUserDetailsParserSysState>(ERRL_UDT_SYSSTATE); + registerParser<ErrlUserDetailsParserWofData>(ERRL_UDT_WOFDATA); } private: diff --git a/src/usr/errl/plugins/errludwofdata.H b/src/usr/errl/plugins/errludwofdata.H new file mode 100644 index 000000000..f757c91d2 --- /dev/null +++ b/src/usr/errl/plugins/errludwofdata.H @@ -0,0 +1,206 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/errl/plugins/errludwofdata.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2017,2018 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ +#ifndef ERRL_UDWOFDATA_H +#define ERRL_UDWOFDATA_H + +/** + * @file errludwofdata.H + * + * Defines the ErrlUserDetailsWofData class that parses the + * WOF data user detail section of an error log + */ + +#include "errluserdetails.H" +#include <targeting/common/target.H> + +namespace ERRORLOG +{ + +/** + * @class ErrlUserDetailsParserWofData + * + * Parses WOF data user detail in an error log + */ +class ErrlUserDetailsParserWofData :public ErrlUserDetailsParser +{ +public: + /** + * @brief Constructor + */ + ErrlUserDetailsParserWofData() {} + + /** + * @brief Destructor + */ + virtual ~ErrlUserDetailsParserWofData() {} + + /** + * @brief Parses WOF detail data from an error log + * + * @param i_version Version of the data + * @param i_parser ErrlUsrParser object for outputting information + * @param i_pBuffer Pointer to buffer containing WOF detail data + * @param i_buflen Length of the buffer + */ + virtual void parse(errlver_t i_version, + ErrlUsrParser & i_parser, + void * i_pBuffer, + const uint32_t i_buflen) const + { + // From src/usr/fapi2/plat_wof_access.C + typedef struct + { + uint8_t core_count; + uint8_t mode; + uint16_t socket_power_w; + uint16_t sort_power_freq_mhz; + } wofTableCompareData_t; + + // From src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h + typedef enum + { + WOF_MODE_UNKNOWN = 0, + WOF_MODE_NOMINAL = 1, + WOF_MODE_TURBO = 2 + } WOF_MODE; + + uint16_t tableEntries = 0; + + // Format of WofData error buffer: + // uint16_t - # of table entries (including search for table) + // wofTableCompareData_t - Searched for this table + // wofTableCompareData_t - last table rejected for possible match + // ... + // wofTableCompareData_t - 1st table rejected for possible match + // NOTE: format must match + // addWofCompareDataToErrl() in plat_wof_access.C + if ((NULL != i_pBuffer) && (i_buflen >= sizeof(tableEntries))) + { + tableEntries = ntohs(*(reinterpret_cast<uint16_t*>(i_pBuffer))); + } + + // How many entries are really present in this buffer? + uint16_t actualTableCount = (i_buflen - sizeof(tableEntries)) / + sizeof(wofTableCompareData_t); + + // sanity check to verify we are getting all the table data + if (tableEntries != actualTableCount) + { + i_parser.PrintString("**************************************",""); + i_parser.PrintNumber("Total entries calculated", "%d", + actualTableCount); + i_parser.PrintNumber("Total entries expected", "%d", + tableEntries); + i_parser.PrintString("**************************************",""); + + tableEntries = actualTableCount; // don't go over buffer length + } + + // Check that the remaining data breaks down into parsable + // wofTableCompareData_t entries + if ( (i_buflen - sizeof(tableEntries)) + % sizeof(wofTableCompareData_t) == 0 ) + { + i_parser.PrintString("---------------------------------------", + "---------------------------------------"); + i_parser.PrintNumber("Total WOF Tables compared", "%d", + tableEntries-1); + + // point to start of table compare data + void * i_pTableData = (uint8_t*)i_pBuffer + sizeof(tableEntries); + wofTableCompareData_t* outputDataPtr = + static_cast<wofTableCompareData_t*>(i_pTableData); + for ( uint32_t tableEntry = 0; tableEntry < tableEntries; + ++tableEntry ) + { + if (tableEntry == 0) + { + i_parser.PrintString("---------------------------------------", + "---------------------------------------"); + i_parser.PrintString("Searched for this table", + "Tried to match this:"); + } + else + { + i_parser.PrintString("---------------------------------------", + "---------------------------"); + i_parser.PrintNumber("WOF Table", "#%d", tableEntry); + } + + i_parser.PrintNumber( "Core Count", "%d", + outputDataPtr->core_count ); + + switch(outputDataPtr->mode) + { + case WOF_MODE_UNKNOWN: + { + i_parser.PrintString( "Mode", "Any" ); + break; + } + case WOF_MODE_NOMINAL: + { + i_parser.PrintString( "Mode", "Nominal" ); + break; + } + case WOF_MODE_TURBO: + { + i_parser.PrintString( "Mode", "Turbo" ); + break; + } + default: + { + i_parser.PrintNumber( "Mode", "UNKNOWN: 0x%X", + outputDataPtr->mode ); + break; + } + } + i_parser.PrintNumber("Socket Power (Watts)", "%d", + ntohs(outputDataPtr->socket_power_w)); + i_parser.PrintNumber("Sort Power Freq (MHz)", "%d", + ntohs(outputDataPtr->sort_power_freq_mhz)); + outputDataPtr++; // go to next table entry + } + } + else + { + i_parser.PrintNumber("WOF Buffer length", "0x%X", i_buflen); + i_parser.PrintString("Expected buffer format:", + "uint16_t count, match this entry, unmatched entries"); + i_parser.PrintNumber("Each entry size", "%d", + sizeof(wofTableCompareData_t)); + i_parser.PrintHexDump(i_pBuffer, i_buflen); + } + } + +private: + // Disabled + ErrlUserDetailsParserWofData(const ErrlUserDetailsParserWofData &); + ErrlUserDetailsParserWofData & operator=( + const ErrlUserDetailsParserWofData &); +}; + +} + +#endif |