diff options
author | Dzuy Nguyen <dzuy@us.ibm.com> | 2016-11-23 16:57:16 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-01-19 18:03:32 -0500 |
commit | 7fd14de1394f507935cd60f6215ca5f65b97df51 (patch) | |
tree | 57aee80a5e9627f76fa9b09068568fc07f05df6c /src/usr/sbeio/sbe_psudd.C | |
parent | e671bf2e25b6902a76212ab830c1f6e2841042cc (diff) | |
download | talos-hostboot-7fd14de1394f507935cd60f6215ca5f65b97df51.tar.gz talos-hostboot-7fd14de1394f507935cd60f6215ca5f65b97df51.zip |
SBE FIFO device driver FFDC and error recovery
Add SBE FFDC error handling to FIFO driver
Change-Id: I6ae81062eac1d5362c5fa5651c8ca5a2043b5c73
RTC: 149454
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32969
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: Shakeeb A. Pasha B K <shakeebbk@in.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/sbeio/sbe_psudd.C')
-rw-r--r-- | src/usr/sbeio/sbe_psudd.C | 153 |
1 files changed, 49 insertions, 104 deletions
diff --git a/src/usr/sbeio/sbe_psudd.C b/src/usr/sbeio/sbe_psudd.C index f1e200c34..ef1e78fa8 100644 --- a/src/usr/sbeio/sbe_psudd.C +++ b/src/usr/sbeio/sbe_psudd.C @@ -40,8 +40,8 @@ #include <sbeio/sbeioreasoncodes.H> #include <initservice/initserviceif.H> //@todo-RTC:149454-Remove #include <sbeio/sbe_psudd.H> +#include <sbeio/sbe_ffdc_parser.H> #include <arch/ppc.H> -#include <util/utilbyte.H> #include <kernel/pagemgr.H> trace_desc_t* g_trac_sbeio; @@ -253,13 +253,28 @@ errlHndl_t SbePsu::writeRequest(TARGETING::Target * i_target, i_pPsuRequest->mbxReg0, l_data); - handleFFDCError(errl); + SbeFFDCParser * l_ffdc_parser = new SbeFFDCParser(); + l_ffdc_parser->parseFFDCData(iv_ffdcPackageBuffer); + uint8_t l_pkgs = l_ffdc_parser->getTotalPackages(); + uint8_t i; + for(i = 0; i < l_pkgs; i++) + { + errl->addFFDC( SBE_COMP_ID, + l_ffdc_parser->getFFDCPackage(i), + l_ffdc_parser->getPackageLength(i), + 0, // version + ERRORLOG::ERRL_UDT_NOFORMAT, // subversion + false ); + } + errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_HIGH); errl->collectTrace(SBEIO_COMP_NAME); MAGIC_INST_GET_SBE_TRACES( i_target->getAttr<TARGETING::ATTR_POSITION>(), SBEIO_PSU_NOT_READY); + + delete l_ffdc_parser; break; // return with error } @@ -372,13 +387,28 @@ errlHndl_t SbePsu::readResponse(TARGETING::Target * i_target, i_pPsuRequest->mbxReg0, o_pPsuResponse->mbxReg4); - handleFFDCError(errl); + SbeFFDCParser * l_ffdc_parser = new SbeFFDCParser(); + l_ffdc_parser->parseFFDCData(iv_ffdcPackageBuffer); + uint8_t l_pkgs = l_ffdc_parser->getTotalPackages(); + uint8_t i; + for(i = 0; i < l_pkgs; i++) + { + errl->addFFDC( SBE_COMP_ID, + l_ffdc_parser->getFFDCPackage(i), + l_ffdc_parser->getPackageLength(i), + 0, // version + ERRORLOG::ERRL_UDT_NOFORMAT, // subversion + false ); + } + errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_HIGH); errl->collectTrace(SBEIO_COMP_NAME); MAGIC_INST_GET_SBE_TRACES( i_target->getAttr<TARGETING::ATTR_POSITION>(), SBEIO_PSU_RESPONSE_ERROR); + + delete l_ffdc_parser; break; } @@ -437,13 +467,28 @@ errlHndl_t SbePsu::pollForPsuComplete(TARGETING::Target * i_target, i_timeout, 0); - handleFFDCError(errl); + SbeFFDCParser * l_ffdc_parser = new SbeFFDCParser(); + l_ffdc_parser->parseFFDCData(iv_ffdcPackageBuffer); + uint8_t l_pkgs = l_ffdc_parser->getTotalPackages(); + uint8_t i; + for(i = 0; i < l_pkgs; i++) + { + errl->addFFDC( SBE_COMP_ID, + l_ffdc_parser->getFFDCPackage(i), + l_ffdc_parser->getPackageLength(i), + 0, // version + ERRORLOG::ERRL_UDT_NOFORMAT, // subversion + false ); + } + errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_HIGH); errl->collectTrace(SBEIO_COMP_NAME); MAGIC_INST_GET_SBE_TRACES( i_target->getAttr<TARGETING::ATTR_POSITION>(), SBEIO_PSU_RESPONSE_TIMEOUT); + + delete l_ffdc_parser; break; } @@ -541,104 +586,4 @@ void SbePsu::writeFFDCBuffer( void * i_data, uint8_t i_len) { } } -/** - * @brief Read FFDC package(s) iv_ffdcPackageBuffer - * - * @param[in] io_errl Error entry object to inject FFDC errors - * - * FFDC package according to the SBE Interface Specification: - * Dword 0: - * byte 0,1: Magic Byte: 0xFFDC - * byte 2,3: Length in words (N + 6) - * byte 4,5: Sequence Id - * byte 6 : Command Class - * byte 7 : Command - * Dword 1: - * byte 0-3: Return Code - * byte 4-7: Word 0 - * Dword M: - * byte 0-3: Word N - 1 - * byte 4-7: Word N - */ - -bool SbePsu::handleFFDCError(ERRORLOG::ErrlEntry * io_errl) -{ - uint16_t l_magicByte = 0x00; - uint8_t i = 0; - bool rc = true; - - SBE_TRACD(ENTER_MRK "handleFFDCError"); - do { - // Magic Byte is 1st 2 bytes - l_magicByte = UtilByte::bufferTo16uint( - static_cast<char *>(iv_ffdcPackageBuffer) + i); - - if(l_magicByte == ffdcMagicByte) - { - // Length is next 2 bytes (in words, each word is 4 bytes) - uint16_t l_packageLen = UtilByte::bufferTo16uint( - static_cast<char *>(iv_ffdcPackageBuffer) + (i + 2)); - // In FFDC packet, byte 2 & byte 3 holds the length in words, - // which is 6 bytes less than the total package length. - uint8_t l_words = l_packageLen - ffdcPadLen; - uint8_t l_wordLen = ffdcWordLen * l_words; - SBE_TRACD(INFO_MRK"handleFFDCError: Package length: %d, Words: %d", l_packageLen, l_words); - - // Check to see if what we're copying is beyond the buffer size - if((uint8_t) (i + wordPadding + l_wordLen) > - PAGESIZE * ffdcPackageSize) - { - SBE_TRACF(ERR_MRK"handleFFDCError: FFDC Package buffer overflow detected."); - rc = false; - break; - } - else - { - // Extract the words and add to errl - void * l_wordBuffer = (void *) malloc(l_wordLen); - if(l_wordBuffer == NULL) - { - SBE_TRACF(ERR_MRK"handleFFDCError: Failure to allocate memory."); - rc = false; - break; - } - // Copy data from ffdcPackageBuffer to wordBuffer - // starting at 12th byte from current pointer - memcpy(static_cast<char *>(iv_ffdcPackageBuffer) + wordPadding, - l_wordBuffer, l_wordLen); - - ErrlUD *l_errlud = io_errl->addFFDC( SBE_COMP_ID, - l_wordBuffer, - sizeof(l_wordBuffer), - 0, // version - ERRL_UDT_NOFORMAT, // subversion - false ); - - if(l_errlud == NULL) - { - SBE_TRACF(ERR_MRK"handleFFDCError: Failure to add FFDC to error log."); - rc = false; - } - - free(l_wordBuffer); - } - // Skip length of whole package - i += l_wordLen + wordPadding; - } - else - { - SBE_TRACD(ERR_MRK"handleFFDCError: Invalid FFDC Magic Byte: 0x%04lx", - l_magicByte); - break; - } - } while (l_magicByte != 0x00); - - // zero out the whole thing - initFFDCPackageBuffer(); - - SBE_TRACD(EXIT_MRK "handleFFDCError"); - return rc; - -} - } //end of namespace SBEIO |