diff options
Diffstat (limited to 'src/usr/diag/prdf/common/plugins')
-rw-r--r-- | src/usr/diag/prdf/common/plugins/prdfCenLogParse.C | 186 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plugins/prdfCenLogParse.H | 14 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plugins/prdfLogParse_common.C | 5 |
3 files changed, 203 insertions, 2 deletions
diff --git a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C index 428850151..caafd6e69 100644 --- a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C +++ b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C @@ -31,8 +31,9 @@ #include <errlusrparser.H> #include <cstring> +#include <UtilHash.H> #include <utilmem.H> -#include <iipconst.h> +#include <iipconst.h> #include <prdfDramRepairUsrData.H> #include <prdfMemoryMruData.H> #include <prdfParserEnums.H> @@ -2155,6 +2156,189 @@ bool parseBadDqBitmap( uint8_t * i_buffer, uint32_t i_buflen, //------------------------------------------------------------------------------ +bool parseTdCtlrStateData( uint8_t * i_buffer, uint32_t i_buflen, + ErrlUsrParser & i_parser, uint32_t i_sigId ) +{ + bool o_rc = true; + + if ( Util::hashString("TDCTLR_STATE_DATA_START") == i_sigId ) + i_parser.PrintString( " TDCTLR_STATE_DATA_START", "" ); + else if ( Util::hashString("TDCTLR_STATE_DATA_END") == i_sigId ) + i_parser.PrintString( " TDCTLR_STATE_DATA_END", "" ); + + // These are copies of the enums in prdfCenMbaTdCtlr_common.H. This is not + // elegant nor robust. It is a quick fix simply to deliver this parser code + // quickly. We can make a better fix later. + enum + { + VCM_EVENT = 0, + TPS_EVENT, + + NO_OP = 0, + VCM_PHASE_1, + VCM_PHASE_2, + DSD_PHASE_1, + DSD_PHASE_2, + TPS_PHASE_1, + TPS_PHASE_2, + }; + + uint32_t idx = 0; + + do + { + if ( NULL == i_buffer ) { o_rc = false; break; } + + //###################################################################### + // Header data (4 bytes) + //###################################################################### + + if ( i_buflen < (idx + 4) ) { o_rc = false; break; } + + uint8_t rescount = i_buffer[idx]; + uint8_t badRankMask = i_buffer[idx+1]; + uint8_t state = (i_buffer[idx+2] >> 4) & 0xf; + uint8_t mrnk = (i_buffer[idx+2] >> 1) & 0x7; + uint8_t fetchMsk = i_buffer[idx+2] & 0x1; + uint8_t srnk = (i_buffer[idx+3] >> 5) & 0x7; + + idx += 4; + + const char * state_str = " "; + switch ( state ) + { + case NO_OP: state_str = "NO_OP "; break; + case VCM_PHASE_1: state_str = "VCM_PHASE_1"; break; + case VCM_PHASE_2: state_str = "VCM_PHASE_2"; break; + case DSD_PHASE_1: state_str = "DSD_PHASE_1"; break; + case DSD_PHASE_2: state_str = "DSD_PHASE_2"; break; + case TPS_PHASE_1: state_str = "TPS_PHASE_1"; break; + case TPS_PHASE_2: state_str = "TPS_PHASE_2"; break; + } + + char rank_str[DATA_SIZE] = " "; + switch ( state ) + { + case VCM_PHASE_1: case VCM_PHASE_2: + case DSD_PHASE_1: case DSD_PHASE_2: + snprintf( rank_str, DATA_SIZE, "m%d ", mrnk ); break; + case TPS_PHASE_1: case TPS_PHASE_2: + snprintf( rank_str, DATA_SIZE, "m%ds%d", mrnk, srnk ); break; + } + + i_parser.PrintString( " TD State", state_str ); + i_parser.PrintString( " Target Rank", rank_str ); + i_parser.PrintNumber( " Resume Counter", "0x%02X", rescount ); + i_parser.PrintBool( " Fetch Attns Masked", 0 != fetchMsk ); + i_parser.PrintNumber( " Bad Master Ranks", "0x%02X", badRankMask ); + + //###################################################################### + // TD Request Queue (min 1 byte, max 33 bytes) + //###################################################################### + + if ( i_buflen < (idx + 1) ) { o_rc = false; break; } + + uint8_t dataCount = i_buffer[idx] * 2; + idx += 1; + + if ( i_buflen < (idx + dataCount) ) { o_rc = false; break; } + + for ( uint8_t i = 0; i < dataCount; i += 2 ) + { + uint8_t type = i_buffer[idx+i]; + uint8_t mr = (i_buffer[idx+i+1] >> 5) & 0x7; + uint8_t sr = (i_buffer[idx+i+1] >> 2) & 0x7; + + const char * type_str = " "; + switch ( type ) + { + case VCM_EVENT: type_str = "VCM_EVENT"; break; + case TPS_EVENT: type_str = "TPS_EVENT"; break; + } + + char rank_str[DATA_SIZE] = " "; + switch ( type ) + { + case VCM_EVENT: + snprintf( rank_str, DATA_SIZE, "m%d ", mr ); break; + case TPS_EVENT: + snprintf( rank_str, DATA_SIZE, "m%ds%d", mr, sr ); break; + } + + char data[DATA_SIZE] = ""; + snprintf( data, DATA_SIZE, "%s on %s", type_str, rank_str ); + + i_parser.PrintString( " TD Request", data ); + } + + idx += dataCount; + + //###################################################################### + // VCM Rank Data (min 1 byte, max 17 bytes) + //###################################################################### + + if ( i_buflen < (idx + 1) ) { o_rc = false; break; } + + dataCount = i_buffer[idx] * 2; + idx += 1; + + if ( i_buflen < (idx + dataCount) ) { o_rc = false; break; } + + for ( uint8_t i = 0; i < dataCount; i += 2 ) + { + uint8_t faCount = i_buffer[idx+i]; + uint8_t mr = (i_buffer[idx+i+1] >> 5) & 0x7; + + char data[DATA_SIZE] = ""; + snprintf( data, DATA_SIZE, + "rank=m%d FA count=0x%02x", + mr, faCount ); + + i_parser.PrintString( " VCM Rank Data", data ); + } + + idx += dataCount; + + //###################################################################### + // TPS Rank Data (min 1 byte, max 129 bytes) + //###################################################################### + + if ( i_buflen < (idx + 1) ) { o_rc = false; break; } + + dataCount = i_buffer[idx] * 2; + idx += 1; + + if ( i_buflen < (idx + dataCount) ) { o_rc = false; break; } + + for ( uint8_t i = 0; i < dataCount; i += 2 ) + { + uint8_t faCount = i_buffer[idx+i]; + uint8_t mr = (i_buffer[idx+i+1] >> 5) & 0x7; + uint8_t sr = (i_buffer[idx+i+1] >> 2) & 0x7; + uint8_t isBan = (i_buffer[idx+i+1] >> 1) & 0x1; + + char data[DATA_SIZE] = ""; + snprintf( data, DATA_SIZE, + "rank=m%ds%d FA count=0x%02x banned=%s", + mr, sr, faCount, (0 != isBan) ? "true" : "false" ); + + i_parser.PrintString( " TPS Rank Data", data ); + } + + idx += dataCount; + + } while (0); + + if ( !o_rc ) + { + i_parser.PrintHexDump(i_buffer, i_buflen); + } + + return o_rc; +} + +//------------------------------------------------------------------------------ + } // namespace FSP/HOSTBBOT } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H index 00fee94ff..b5385bfb7 100644 --- a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H +++ b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2003,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* [+] 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. */ @@ -107,6 +109,16 @@ bool parseDramRepairsVpd( uint8_t * i_buffer, uint32_t i_buflen, bool parseBadDqBitmap( uint8_t * i_buffer, uint32_t i_buflen, ErrlUsrParser & i_parser ); +/** + * @brief Parses TD Controller state data. + * @param i_buffer The data buffer. + * @param i_buflen The buffer length. + * @param i_parser The error log parser. + * @param i_sigId The signature ID. + */ +bool parseTdCtlrStateData( uint8_t * i_buffer, uint32_t i_buflen, + ErrlUsrParser & i_parser, uint32_t i_sigId ); + } // namespace FSP/HOSTBBOT } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C index 8aa712238..ba166d5a0 100644 --- a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C +++ b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C @@ -370,6 +370,11 @@ bool parseCaptureData( void * i_buffer, uint32_t i_buflen, { parseBadDqBitmap( sigData, sigDataSize, i_parser ); } + else if ( (Util::hashString("TDCTLR_STATE_DATA_START") == sigId) || + (Util::hashString("TDCTLR_STATE_DATA_END") == sigId) ) + { + parseTdCtlrStateData( sigData, sigDataSize, i_parser, sigId ); + } else if ( (0 != sigDataSize) && (sizeof(uint64_t) >= sigDataSize) ) { // Print one reg/line if the data size <= 8 bytes |