diff options
| author | Caleb Palmer <cnpalmer@us.ibm.com> | 2018-12-06 09:35:18 -0600 |
|---|---|---|
| committer | Zane C. Shelley <zshelle@us.ibm.com> | 2019-01-15 14:36:20 -0600 |
| commit | 451596eb83df36f128b80153d173d8dbcbde741c (patch) | |
| tree | ccafac92c71d2fe2bedd16dac5346a25a644eb80 /src | |
| parent | f5dd1c1283bad3f20c6d791f9f0fc5658a360163 (diff) | |
| download | blackbird-hostboot-451596eb83df36f128b80153d173d8dbcbde741c.tar.gz blackbird-hostboot-451596eb83df36f128b80153d173d8dbcbde741c.zip | |
PRD: Axone updates for MemDqBitmap class
Change-Id: I8613b8ead60f5a94201e35abe03e1c041ce18a7a
RTC: 201603
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/69843
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/70294
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src')
20 files changed, 510 insertions, 542 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C index a41821e31..635217165 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -262,14 +262,15 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_trgt, //------------------------------------------------------------------------------ -template<TARGETING::TYPE T, DIMMS_PER_RANK D> +template<TARGETING::TYPE T> void captureDramRepairsVpd(TargetHandle_t i_trgt, CaptureData & io_cd) { #define PRDF_FUNC "[captureDramRepairsVpd] " // Get the maximum capture data size. static const size_t sz_rank = sizeof(uint8_t); - static const size_t sz_entry = D * DQ_BITMAP::BITMAP_SIZE; + static const size_t sz_port = sizeof(uint8_t); + static const size_t sz_entry = DQ_BITMAP::BITMAP_SIZE; static const size_t sz_word = sizeof(CPU_WORD); do @@ -283,7 +284,7 @@ void captureDramRepairsVpd(TargetHandle_t i_trgt, CaptureData & io_cd) } // Get the maximum capture data size. - size_t sz_maxData = masterRanks.size() * (sz_rank + sz_entry); + size_t sz_maxData = masterRanks.size() * (sz_rank + sz_port + sz_entry); // Adjust the size for endianness. sz_maxData = ((sz_maxData + sz_word-1) / sz_word) * sz_word; @@ -296,22 +297,29 @@ void captureDramRepairsVpd(TargetHandle_t i_trgt, CaptureData & io_cd) uint32_t idx = 0; for ( auto & rank : masterRanks ) { - MemDqBitmap<D> bitmap; + MemDqBitmap bitmap; - if ( SUCCESS != getBadDqBitmap<D>(i_trgt, rank, bitmap) ) + if ( SUCCESS != getBadDqBitmap(i_trgt, rank, bitmap) ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed: MCA=0x%08x" " rank=0x%02x", getHuid(i_trgt), rank.getKey() ); continue; // skip this rank } + size_t numPorts = bitmap.getNumPorts(); if ( bitmap.badDqs() ) // make sure the data is non-zero { - // Add the rank, then the entry data. - capData[idx] = rank.getMaster(); - idx += sz_rank; - memcpy(&capData[idx], bitmap.getData(), sz_entry); - idx += sz_entry; + // Iterate over the ports + for ( uint8_t ps = 0; ps < numPorts; ps++ ) + { + // Add the rank, port, then the entry data. + capData[idx] = rank.getMaster(); + idx += sz_rank; + capData[idx] = ps; + idx += sz_port; + memcpy(&capData[idx], bitmap.getData(ps), sz_entry); + idx += sz_entry; + } } } @@ -458,7 +466,7 @@ void addEccData<TYPE_MCA>( ExtensibleChip * i_chip, captureDramRepairsData<TYPE_MCA>( trgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MCA, DIMMS_PER_RANK::MCA>( trgt, cd ); + captureDramRepairsVpd<TYPE_MCA>( trgt, cd ); // Add IUE counts to capture data. captureIueCounts<McaDataBundle*>( trgt, db, cd ); @@ -503,7 +511,7 @@ void addEccData<TYPE_MBA>( ExtensibleChip * i_chip, captureDramRepairsData<TYPE_MBA>( i_chip->getTrgt(), cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MBA, DIMMS_PER_RANK::MBA>(i_chip->getTrgt(), cd); + captureDramRepairsVpd<TYPE_MBA>(i_chip->getTrgt(), cd); // Add Row Repair data from VPD captureRowRepairVpd<TYPE_MBA>(i_chip->getTrgt(), cd); @@ -521,7 +529,7 @@ void addEccData<TYPE_MCA>( TargetHandle_t i_trgt, errlHndl_t io_errl ) captureDramRepairsData<TYPE_MCA>( i_trgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MCA, DIMMS_PER_RANK::MCA>( i_trgt, cd ); + captureDramRepairsVpd<TYPE_MCA>( i_trgt, cd ); ErrDataService::AddCapData( cd, io_errl ); } @@ -535,7 +543,7 @@ void addEccData<TYPE_MBA>( TargetHandle_t i_trgt, errlHndl_t io_errl ) captureDramRepairsData<TYPE_MBA>( i_trgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MBA, DIMMS_PER_RANK::MBA>( i_trgt, cd ); + captureDramRepairsVpd<TYPE_MBA>( i_trgt, cd ); // Add Row Repair data from VPD. captureRowRepairVpd<TYPE_MBA>( i_trgt, cd ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H index a483a8096..d018e2a5d 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -67,7 +67,7 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ); /** * @brief Queries hardware for all DRAM repairs data (chip/symbol marks, DRAM * spare, etc.) for the given MBA or MCA and adds it to the capture data. - * @param i_trgt An MBA or MCA target. + * @param i_trgt An MBA, MCA, or MEM_PORT target. * @param io_cd Capture data struct. * @note This function will be used to capture DRAM repair data into the * capture data struct. Other functions can call this function and @@ -80,13 +80,13 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_trgt, /** * @brief Queries the Bad DQ attributes for the content of the DRAM repairs VPD * and adds it to the capture data. - * @param i_trgt An MBA or MCA target. + * @param i_trgt An MBA, MCA, or MEM_PORT target. * @param io_cd Capture data struct. * @note This function will be used to capture DRAM repair data into the * capture data struct. Other functions can call this function and * update the error log. */ -template<TARGETING::TYPE T, DIMMS_PER_RANK D> +template<TARGETING::TYPE T> void captureDramRepairsVpd( TARGETING::TargetHandle_t i_trgt, CaptureData & io_cd ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemConst.H b/src/usr/diag/prdf/common/plat/mem/prdfMemConst.H index 6451e2827..b886adfcd 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemConst.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemConst.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2016 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -49,16 +49,15 @@ enum DQS_PER_BYTE = 8, DQS_PER_NIBBLE = 4, - // MCA only - MCA_DIMMS_PER_RANK = 1, + MEM_DIMMS_PER_RANK = 1, - MCA_BYTES_PER_RANK = BYTES_PER_DIMM * MCA_DIMMS_PER_RANK, - MCA_NIBBLES_PER_RANK = NIBBLES_PER_DIMM * MCA_DIMMS_PER_RANK, + MEM_BYTES_PER_RANK = BYTES_PER_DIMM * MEM_DIMMS_PER_RANK, + MEM_NIBBLES_PER_RANK = NIBBLES_PER_DIMM * MEM_DIMMS_PER_RANK, - MCA_SYMBOLS_PER_BYTE = SYMBOLS_PER_RANK / MCA_BYTES_PER_RANK, - MCA_SYMBOLS_PER_NIBBLE = SYMBOLS_PER_RANK / MCA_NIBBLES_PER_RANK, + MEM_SYMBOLS_PER_BYTE = SYMBOLS_PER_RANK / MEM_BYTES_PER_RANK, + MEM_SYMBOLS_PER_NIBBLE = SYMBOLS_PER_RANK / MEM_NIBBLES_PER_RANK, - MCA_DQS_PER_SYMBOL = DQS_PER_BYTE / MCA_SYMBOLS_PER_BYTE, + MEM_DQS_PER_SYMBOL = DQS_PER_BYTE / MEM_SYMBOLS_PER_BYTE, // MBA only MBA_DIMMS_PER_RANK = 2, diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C index 20c3eca3e..311329dfd 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -36,18 +36,20 @@ namespace PRDF using namespace PlatServices; using namespace PARSERUTILS; +using namespace TARGETING; using namespace fapi2; // for spare dram config -template <DIMMS_PER_RANK T> -bool MemDqBitmap<T>::badDqs() const +bool MemDqBitmap::badDqs() const { bool o_badDqs = false; - for ( uint32_t i = 0; i < T; i++ ) + size_t maxPorts = getNumPorts(); + + for ( uint32_t i = 0; i < maxPorts; i++ ) { for ( uint32_t j = 0; j < DQ_BITMAP::BITMAP_SIZE; j++ ) { - if ( 0 != iv_data[i][j] ) + if ( 0 != iv_data.at(i).bitmap[j] ) { o_badDqs = true; break; @@ -61,18 +63,19 @@ bool MemDqBitmap<T>::badDqs() const //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t MemDqBitmap<T>::badDqs( bool & o_badDqs, uint8_t i_portSlct ) const +uint32_t MemDqBitmap::badDqs( bool & o_badDqs, uint8_t i_portSlct ) const { #define PRDF_FUNC "[MemDqBitmap::badDqs] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; o_badDqs = false; do { - if ( T <= i_portSlct ) + size_t maxPorts = getNumPorts(); + + if ( maxPorts <= i_portSlct ) { PRDF_ERR(PRDF_FUNC "Invalid parameter: i_portSlct=%d", i_portSlct); o_rc = FAIL; break; @@ -80,7 +83,7 @@ int32_t MemDqBitmap<T>::badDqs( bool & o_badDqs, uint8_t i_portSlct ) const for ( uint32_t j = 0; j < DQ_BITMAP::BITMAP_SIZE; j++ ) { - if ( 0 != iv_data[i_portSlct][j] ) + if ( 0 != iv_data.at(i_portSlct).bitmap[j] ) { o_badDqs = true; break; @@ -96,12 +99,11 @@ int32_t MemDqBitmap<T>::badDqs( bool & o_badDqs, uint8_t i_portSlct ) const //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t MemDqBitmap<T>::setDq( uint8_t i_dq, uint8_t i_portSlct ) +uint32_t MemDqBitmap::setDq( uint8_t i_dq, uint8_t i_portSlct ) { #define PRDF_FUNC "[MemDqBitmap::setDq] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { @@ -111,7 +113,9 @@ int32_t MemDqBitmap<T>::setDq( uint8_t i_dq, uint8_t i_portSlct ) o_rc = FAIL; break; } - if ( T <= i_portSlct ) + size_t maxPorts = getNumPorts(); + + if ( maxPorts <= i_portSlct ) { PRDF_ERR(PRDF_FUNC "Invalid parameter: i_portSlct=%d", i_portSlct); o_rc = FAIL; break; @@ -121,7 +125,7 @@ int32_t MemDqBitmap<T>::setDq( uint8_t i_dq, uint8_t i_portSlct ) uint8_t bitIdx = i_dq % DQS_PER_BYTE; uint32_t shift = (DQS_PER_BYTE-1) - bitIdx; // 0-7 - iv_data[i_portSlct][byteIdx] |= 0x01 << shift; + iv_data[i_portSlct].bitmap[byteIdx] |= 0x01 << shift; } while (0); @@ -132,12 +136,11 @@ int32_t MemDqBitmap<T>::setDq( uint8_t i_dq, uint8_t i_portSlct ) //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t MemDqBitmap<T>::setSymbol( const MemSymbol & i_symbol, uint8_t i_pins ) +uint32_t MemDqBitmap::setSymbol( const MemSymbol & i_symbol, uint8_t i_pins ) { #define PRDF_FUNC "[MemDqBitmap::setSymbol] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { @@ -150,18 +153,19 @@ int32_t MemDqBitmap<T>::setSymbol( const MemSymbol & i_symbol, uint8_t i_pins ) } uint32_t shift = (DQS_PER_BYTE-1) - bitIdx; - if ( DIMMS_PER_RANK::MBA == T ) - { - i_pins &= 0x3; // limit to 2 bits for MBA - shift = (shift / MBA_DQS_PER_SYMBOL) * MBA_DQS_PER_SYMBOL; //0,2,4,6 - } - else - { - i_pins &= 0x1; // limit to 1 bit for MCA - shift = (shift / MCA_DQS_PER_SYMBOL) * MCA_DQS_PER_SYMBOL; //0-7 - } - iv_data[portSlct][byteIdx] |= i_pins << shift; + // The number of dqs per symbol is equivalent to the ports we have here + size_t dqsPerSym = getNumPorts(); + + // Calculate pin mask -> (2^dqsPerSym)-1 + uint8_t pinMask = 2; + for ( uint8_t i = 1; i < dqsPerSym; i++ ) {pinMask *= 2;} + pinMask -= 1; + + i_pins &= pinMask; // Limit to the number of dqs per symbols + shift = (shift / dqsPerSym) * dqsPerSym; + + iv_data[portSlct].bitmap[byteIdx] |= i_pins << shift; } while (0); @@ -172,12 +176,11 @@ int32_t MemDqBitmap<T>::setSymbol( const MemSymbol & i_symbol, uint8_t i_pins ) //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t MemDqBitmap<T>::setDram( const MemSymbol & i_symbol, uint8_t i_pins ) +uint32_t MemDqBitmap::setDram( const MemSymbol & i_symbol, uint8_t i_pins ) { #define PRDF_FUNC "[MemDqBitmap::setDram] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { @@ -194,12 +197,12 @@ int32_t MemDqBitmap<T>::setDram( const MemSymbol & i_symbol, uint8_t i_pins ) i_pins &= 0xf; // limit to 4 bits uint32_t shift = (DQS_PER_BYTE-1) - bitIdx; shift = (shift / DQS_PER_NIBBLE) * DQS_PER_NIBBLE; // 0,4 - iv_data[portSlct][byteIdx] |= i_pins << shift; + iv_data[portSlct].bitmap[byteIdx] |= i_pins << shift; } else { i_pins &= 0xff; // limit to 8 bits - iv_data[portSlct][byteIdx] |= i_pins; + iv_data[portSlct].bitmap[byteIdx] |= i_pins; } } while (0); @@ -211,12 +214,11 @@ int32_t MemDqBitmap<T>::setDram( const MemSymbol & i_symbol, uint8_t i_pins ) //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -uint32_t MemDqBitmap<T>::clearDram( const MemSymbol & i_symbol, uint8_t i_pins ) +uint32_t MemDqBitmap::clearDram( const MemSymbol & i_symbol, uint8_t i_pins ) { #define PRDF_FUNC "[MemDqBitmap::clearDram] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { @@ -233,12 +235,12 @@ uint32_t MemDqBitmap<T>::clearDram( const MemSymbol & i_symbol, uint8_t i_pins ) i_pins &= 0xf; // limit to 4 bits uint32_t shift = (DQS_PER_BYTE-1) - bitIdx; shift = (shift / DQS_PER_NIBBLE) * DQS_PER_NIBBLE; // 0,4 - iv_data[portSlct][byteIdx] &= ~(i_pins << shift); + iv_data[portSlct].bitmap[byteIdx] &= ~(i_pins << shift); } else { i_pins &= 0xff; // limit to 8 bits - iv_data[portSlct][byteIdx] &= ~(i_pins); + iv_data[portSlct].bitmap[byteIdx] &= ~(i_pins); } } while (0); @@ -250,8 +252,7 @@ uint32_t MemDqBitmap<T>::clearDram( const MemSymbol & i_symbol, uint8_t i_pins ) //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -void MemDqBitmap<T>::getCaptureData( CaptureData & o_cd ) const +void MemDqBitmap::getCaptureData( CaptureData & o_cd ) const { uint8_t rank = iv_rank.getMaster(); size_t sz_rank = sizeof(rank); @@ -266,7 +267,14 @@ void MemDqBitmap<T>::getCaptureData( CaptureData & o_cd ) const memset( capData, 0x00, sz_capData ); capData[0] = rank; - memcpy( &capData[1], iv_data, sizeof(iv_data) ); + + uint8_t numPorts = getNumPorts(); + uint8_t idx = 1; + for ( uint8_t ps = 0; ps < numPorts; ps++ ) + { + memcpy( &capData[idx], getData(ps), sizeof(capData[idx]) ); + idx += DQ_BITMAP::BITMAP_SIZE; + } // Fix endianness issues with non PPC machines. for ( uint32_t i = 0; i < (sz_capData/sz_word); i++ ) @@ -278,15 +286,14 @@ void MemDqBitmap<T>::getCaptureData( CaptureData & o_cd ) const //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t MemDqBitmap<T>::getPortByteBitIdx( const MemSymbol & i_symbol, - uint8_t & o_portSlct, - uint8_t & o_byteIdx, - uint8_t & o_bitIdx ) const +uint32_t MemDqBitmap::getPortByteBitIdx( const MemSymbol & i_symbol, + uint8_t & o_portSlct, + uint8_t & o_byteIdx, + uint8_t & o_bitIdx ) const { #define PRDF_FUNC "[MemDqBitmap::getPortByteBitIdx] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { @@ -322,59 +329,11 @@ int32_t MemDqBitmap<T>::getPortByteBitIdx( const MemSymbol & i_symbol, //------------------------------------------------------------------------------ -template<> -int32_t MemDqBitmap<DIMMS_PER_RANK::MCA>::isChipMark( - const MemSymbol & i_symbol, bool & o_cm ) +uint32_t MemDqBitmap::isChipMark( const MemSymbol & i_symbol, bool & o_cm ) { - #define PRDF_FUNC "[MemDqBitmap<DIMMS_PER_RANK::MCA>::isChipMark] " - - int32_t o_rc = SUCCESS; - o_cm = false; - - do - { - // If 2 or more symbols are set in a nibble, the chip mark is present. - - uint8_t portSlct, byteIdx, bitIdx; - o_rc = getPortByteBitIdx( i_symbol, portSlct, byteIdx, bitIdx ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getPortByteBitIdx() failed" ); - break; - } - - uint8_t cmData = iv_data[portSlct][byteIdx]; + #define PRDF_FUNC "[MemDqBitmap::isChipMark] " - // Find which nibble to check. - uint8_t nibble; - if ( bitIdx < 4 ) - nibble = ( (cmData>>4) & 0xf ); - else - nibble = cmData & 0xf; - - // This nibble must have 2 or more symbols set. - o_cm = ( (0x0 != nibble) && - (0x8 != nibble) && - (0x4 != nibble) && - (0x2 != nibble) && - (0x1 != nibble) ); - - } while (0); - - return o_rc; - - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -template<> -int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::isChipMark( - const MemSymbol & i_symbol, bool & o_cm ) -{ - #define PRDF_FUNC "[MemDqBitmap<DIMMS_PER_RANK::MBA>::isChipMark] " - - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; o_cm = false; do @@ -389,7 +348,7 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::isChipMark( break; } - uint8_t cmData = iv_data[portSlct][byteIdx]; + uint8_t cmData = iv_data[portSlct].bitmap[byteIdx]; // x4 Drams if ( iv_x4Dram ) @@ -431,36 +390,59 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::isChipMark( //------------------------------------------------------------------------------ -template <> -std::vector<MemSymbol> MemDqBitmap<DIMMS_PER_RANK::MCA>::getSymbolList( - uint8_t i_portSlct ) +std::vector<MemSymbol> MemDqBitmap::getSymbolList( uint8_t i_portSlct ) { #define PRDF_FUNC "[MemDqBitmap::getSymbolList] " std::vector<MemSymbol> o_symbolList; - // loop through all dimms - for ( uint8_t dimm = 0; dimm < DIMMS_PER_RANK::MCA; dimm++ ) + size_t maxPorts = getNumPorts(); + + // The number of dqs per symbol is equivalent to the ports we have here + size_t dqsPerSymbol = getNumPorts(); + uint8_t symbolsPerByte = SYMBOLS_PER_RANK/(BYTES_PER_DIMM*dqsPerSymbol); + + // Calculate bit mask -> (2^dqsPerSym)-1 + uint8_t bitMask = 2; + for ( uint8_t i = 1; i < dqsPerSymbol; i++ ) {bitMask *= 2;} + bitMask -= 1; + + // loop through all ports + for ( uint8_t port = 0; port < maxPorts; port++ ) { // loop through each byte in the bitmap for ( uint8_t byte = 0; byte < DQ_BITMAP::BITMAP_SIZE; byte++ ) { // loop through each symbol index - for ( uint8_t symIdx = 0; symIdx < MCA_SYMBOLS_PER_BYTE; symIdx++ ) + for ( uint8_t symIdx = 0; symIdx < symbolsPerByte; symIdx++ ) { - uint8_t shift = ((MCA_SYMBOLS_PER_BYTE - 1) - symIdx) * - MCA_DQS_PER_SYMBOL; + uint8_t shift = ((symbolsPerByte - 1) - symIdx) * dqsPerSymbol; - // if the bit is active - if ( ((iv_data[dimm][byte] >> shift) & 0x1) != 0 ) + // if the bit/bit pair is active + if ( ((iv_data[port].bitmap[byte] >> shift) & bitMask) != 0 ) { // get the dq - uint8_t dq = (byte * DQS_PER_BYTE) + - (symIdx * MCA_DQS_PER_SYMBOL); + uint8_t dq = (byte * DQS_PER_BYTE)+(symIdx * dqsPerSymbol); // convert the dq to symbol - uint8_t symbol = dq2Symbol<TARGETING::TYPE_MCA>( dq, - i_portSlct ); + uint8_t symbol = SYMBOLS_PER_RANK; + TYPE trgtType = getTargetType( iv_trgt ); + switch( trgtType ) + { + case TYPE_MCA: + symbol = dq2Symbol<TYPE_MCA>( dq, i_portSlct ); + break; + case TYPE_MBA: + symbol = dq2Symbol<TYPE_MBA>( dq, i_portSlct ); + break; + case TYPE_MEM_PORT: + symbol = dq2Symbol<TYPE_MEM_PORT>( dq, i_portSlct ); + break; + default: + PRDF_ERR( "Invalid trgt type" ); + PRDF_ASSERT( false ); + break; + } // add symbol to output o_symbolList.push_back( MemSymbol::fromSymbol(iv_trgt, @@ -478,110 +460,122 @@ std::vector<MemSymbol> MemDqBitmap<DIMMS_PER_RANK::MCA>::getSymbolList( //------------------------------------------------------------------------------ -template <> -std::vector<MemSymbol> MemDqBitmap<DIMMS_PER_RANK::MBA>::getSymbolList( - uint8_t i_portSlct ) +uint32_t __getSpareInfo( TargetHandle_t i_trgt, MemRank i_rank, + uint8_t i_portSlct, uint8_t & o_spareConfig, uint8_t & o_noSpare, + uint8_t & o_lowNibble, uint8_t & o_highNibble, bool & o_spareSupported ) { - #define PRDF_FUNC "[MemDqBitmap::getSymbolList] " + #define PRDF_FUNC "[__getSpareInfo] " - std::vector<MemSymbol> o_symbolList; + uint32_t o_rc = SUCCESS; + o_spareSupported = true; - // loop through all dimms - for ( uint8_t dimm = 0; dimm < DIMMS_PER_RANK::MBA; dimm++ ) + do { - // loop through each byte in the bitmap - for ( uint8_t byte = 0; byte < DQ_BITMAP::BITMAP_SIZE; byte++ ) - { - // loop through each bit pair - for (uint8_t symIdx = 0; symIdx < MBA_SYMBOLS_PER_BYTE; symIdx++) - { - uint8_t shift = ((MBA_SYMBOLS_PER_BYTE - 1) - symIdx) * - MBA_DQS_PER_SYMBOL; + TYPE trgtType = getTargetType( i_trgt ); - // if the bit pair is active - if ( ((iv_data[dimm][byte] >> shift) & 0x3) != 0 ) - { - // get the dq - uint8_t dq = (byte * DQS_PER_BYTE) + - (symIdx * MBA_DQS_PER_SYMBOL); - - // convert the dq to symbol - uint8_t symbol = dq2Symbol<TARGETING::TYPE_MBA>( dq, - i_portSlct ); - - // add symbol to output - o_symbolList.push_back( MemSymbol::fromSymbol(iv_trgt, - iv_rank, symbol) ); - } + // Spares not supported on MCA + if ( TYPE_MCA == trgtType ) + { + o_spareSupported = false; + } + // Centaur/MBA case + else if ( TYPE_MBA == trgtType ) + { + o_noSpare = CEN_VPD_DIMM_SPARE_NO_SPARE; + o_lowNibble = CEN_VPD_DIMM_SPARE_LOW_NIBBLE; + o_highNibble = CEN_VPD_DIMM_SPARE_HIGH_NIBBLE; + o_spareConfig = CEN_VPD_DIMM_SPARE_NO_SPARE; + o_rc = getDimmSpareConfig<TYPE_MBA>( i_trgt, i_rank, i_portSlct, + o_spareConfig ); + } + // Generic/MEM_PORT case + else + { + /* TODO RTC 192544 + o_noSpare = CEN_VPD_DIMM_SPARE_NO_SPARE; + o_lowNibble = CEN_VPD_DIMM_SPARE_LOW_NIBBLE; + o_highNibble = CEN_VPD_DIMM_SPARE_HIGH_NIBBLE; + o_spareConfig = CEN_VPD_DIMM_SPARE_NO_SPARE; + TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, + i_portSlct ); + o_rc = getDimmSpareConfig<TYPE_MEM_PORT>( memPort, i_rank, + i_portSlct, o_spareConfig ); + */ + } - } + if( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getDimmSpareConfig() failed" ); + break; } - } + }while(0); - return o_symbolList; + return o_rc; #undef PRDF_FUNC - } //------------------------------------------------------------------------------ -template <> -int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::isSpareAvailable( uint8_t i_portSlct, - bool & o_dramSpare, bool & o_eccSpare ) -{ - #define PRDF_FUNC "[MemDqBitmap<DIMMS_PER_RANK::MBA>::isSpareAvailable] " - int32_t o_rc = SUCCESS; +uint32_t MemDqBitmap::isSpareAvailable( uint8_t i_portSlct, bool & o_dramSpare, + bool & o_eccSpare ) +{ + #define PRDF_FUNC "[MemDqBitmap::isSpareAvailable] " + uint32_t o_rc = SUCCESS; o_dramSpare = false; o_eccSpare = false; do { - if ( MBA_DIMMS_PER_RANK <= i_portSlct ) + // Check to make sure the portSlct is valid + size_t maxPorts = getNumPorts(); + if ( maxPorts <= i_portSlct ) { PRDF_ERR( PRDF_FUNC "Invalid parameter: i_portSlct=%d", i_portSlct); o_rc = FAIL; break; } - uint8_t spareConfig = TARGETING::CEN_VPD_DIMM_SPARE_NO_SPARE; - o_rc = getDimmSpareConfig<TARGETING::TYPE_MBA>( iv_trgt , iv_rank, - i_portSlct, spareConfig ); - if( SUCCESS != o_rc ) + uint8_t spareConfig, noSpare, lowNibble, highNibble; + bool spareSupported = true; + o_rc = __getSpareInfo( iv_trgt, iv_rank, i_portSlct, spareConfig, + noSpare, lowNibble, highNibble, spareSupported ); + if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getDimmSpareConfig() failed" ); + PRDF_ERR( PRDF_FUNC "__getSpareInfo failed" ); break; } - uint8_t spareDqBits = iv_data[i_portSlct][DRAM_SPARE_BYTE]; + // Spare is not available. + if ( noSpare == spareConfig || !spareSupported ) + { + o_dramSpare = false; + break; + } + + uint8_t spareDqBits = iv_data.at(i_portSlct).bitmap[DRAM_SPARE_BYTE]; if ( iv_x4Dram ) { - // Check for DRAM spare - if ( TARGETING::CEN_VPD_DIMM_SPARE_LOW_NIBBLE == spareConfig ) + // Spare is on the lower nibble + if ( lowNibble == spareConfig ) { o_dramSpare = ( 0 == ( spareDqBits & 0xf0 ) ); } - else if ( TARGETING::CEN_VPD_DIMM_SPARE_HIGH_NIBBLE == spareConfig ) + // Spare is on the higher nibble + else if ( highNibble == spareConfig ) { o_dramSpare = ( 0 == ( spareDqBits & 0x0f ) ); } // Check for ECC spare - uint8_t eccDqBits = iv_data[ECC_SPARE_PORT][ECC_SPARE_BYTE]; + uint8_t eccDqBits = + iv_data.at(ECC_SPARE_PORT).bitmap[ECC_SPARE_BYTE]; o_eccSpare = ( 0 == (eccDqBits & 0x0f) ); } else { - if ( TARGETING::CEN_VPD_DIMM_SPARE_NO_SPARE == spareConfig ) - { - // spare is not available. - o_dramSpare = false; - } - else - { - o_dramSpare = ( 0 == spareDqBits ); - } + o_dramSpare = ( 0 == spareDqBits ); } } while (0); @@ -592,44 +586,36 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::isSpareAvailable( uint8_t i_portSlct, } //------------------------------------------------------------------------------ -template <> -int32_t MemDqBitmap<DIMMS_PER_RANK::MCA>::isSpareAvailable( uint8_t i_portSlct, - bool & o_dramSpare, bool & o_eccSpare ) -{ - // spares not supported on MCA - o_dramSpare = false; - o_eccSpare = false; - return SUCCESS; -} -//------------------------------------------------------------------------------ -template <> -int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::setDramSpare( uint8_t i_portSlct, - uint8_t i_pins ) + +uint32_t MemDqBitmap::setDramSpare( uint8_t i_portSlct, uint8_t i_pins ) { - #define PRDF_FUNC "[MemDqBitmap<DIMMS_PER_RANK::MBA>::setDramSpare] " + #define PRDF_FUNC "[MemDqBitmap::setDramSpare] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { - if ( MBA_DIMMS_PER_RANK <= i_portSlct ) + // Check to make sure the portSlct is valid + size_t maxPorts = getNumPorts(); + if ( maxPorts <= i_portSlct ) { PRDF_ERR( PRDF_FUNC "Invalid parameter: i_portSlct=%d", i_portSlct); o_rc = FAIL; break; } - uint8_t spareConfig = TARGETING::CEN_VPD_DIMM_SPARE_NO_SPARE; - o_rc = getDimmSpareConfig<TARGETING::TYPE_MBA>( iv_trgt, iv_rank, - i_portSlct, spareConfig ); + uint8_t spareConfig, noSpare, lowNibble, highNibble; + bool spareSupported = true; + o_rc = __getSpareInfo( iv_trgt, iv_rank, i_portSlct, spareConfig, + noSpare, lowNibble, highNibble, spareSupported ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getDimmSpareConfig() failed" ); - o_rc = FAIL; break; + PRDF_ERR( PRDF_FUNC "__getSpareInfo failed" ); + break; } - if ( TARGETING::CEN_VPD_DIMM_SPARE_NO_SPARE == spareConfig ) + if ( noSpare == spareConfig || !spareSupported ) { - PRDF_ERR( PRDF_FUNC "DRAM Spare is not avaiable" ); + PRDF_ERR( PRDF_FUNC "DRAM Spare is not available" ); o_rc = FAIL; break; } @@ -637,16 +623,16 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::setDramSpare( uint8_t i_portSlct, { i_pins &= 0xf; // limit to 4 bits - if ( TARGETING::CEN_VPD_DIMM_SPARE_LOW_NIBBLE == spareConfig ) + if ( lowNibble == spareConfig ) { i_pins = i_pins << DQS_PER_NIBBLE; } - iv_data[i_portSlct][DRAM_SPARE_BYTE] |= i_pins; + iv_data[i_portSlct].bitmap[DRAM_SPARE_BYTE] |= i_pins; } else { i_pins &= 0xff; // limit to 8 bits - iv_data[i_portSlct][DRAM_SPARE_BYTE] |= i_pins; + iv_data[i_portSlct].bitmap[DRAM_SPARE_BYTE] |= i_pins; } } while (0); @@ -657,24 +643,38 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::setDramSpare( uint8_t i_portSlct, } //------------------------------------------------------------------------------ -template <> -int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::setEccSpare( uint8_t i_pins ) + +uint32_t MemDqBitmap::setEccSpare( uint8_t i_pins ) { #define PRDF_FUNC "[MemDqBitmap::setEccSpare] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; do { + // Use __getSpareInfo just to check if spares are supported or not + uint8_t spareConfig, noSpare, lowNibble, highNibble; + bool spareSupported = true; + o_rc = __getSpareInfo( iv_trgt, iv_rank, 0, spareConfig, + noSpare, lowNibble, highNibble, spareSupported ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "__getSpareInfo failed" ); + break; + } + + // Break out if spares are not supported + if ( !spareSupported ) break; + if ( !iv_x4Dram ) { - PRDF_ERR( PRDF_FUNC "MBA 0x %08x does not support x4 ECC spare", + PRDF_ERR( PRDF_FUNC "0x%08x does not support x4 ECC spare", getHuid(iv_trgt) ); o_rc = FAIL; break; } i_pins &= 0xf; // limit to 4 bits - iv_data[ECC_SPARE_PORT][ECC_SPARE_BYTE] |= i_pins; + iv_data[ECC_SPARE_PORT].bitmap[ECC_SPARE_BYTE] |= i_pins; } while( 0 ); @@ -683,19 +683,12 @@ int32_t MemDqBitmap<DIMMS_PER_RANK::MBA>::setEccSpare( uint8_t i_pins ) #undef PRDF_FUNC } - -//------------------------------------------------------------------------------ -// Avoid linker errors with the template. -template class MemDqBitmap<DIMMS_PER_RANK::MCA>; -template class MemDqBitmap<DIMMS_PER_RANK::MBA>; - //############################################################################## // Utility Functions //############################################################################## -template<TARGETING::TYPE T, DIMMS_PER_RANK D> -uint32_t __setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, - MemSymbol i_symbol ) +uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, + MemSymbol i_symbol ) { #define PRDF_FUNC "[MemDqBitmap::__setDramInVpd] " @@ -705,8 +698,8 @@ uint32_t __setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, { TARGETING::TargetHandle_t trgt = i_chip->getTrgt(); - MemDqBitmap<D> dqBitmap; - o_rc = getBadDqBitmap<D>( trgt, i_rank, dqBitmap ); + MemDqBitmap dqBitmap; + o_rc = getBadDqBitmap( trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, 0x%02x) failed.", @@ -721,7 +714,7 @@ uint32_t __setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, break; } - o_rc = setBadDqBitmap<D>( trgt, i_rank, dqBitmap ); + o_rc = setBadDqBitmap( trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x, 0x%02x) failed.", @@ -735,30 +728,10 @@ uint32_t __setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, #undef PRDF_FUNC } - -template<> -uint32_t setDramInVpd<TARGETING::TYPE_MBA>( ExtensibleChip * i_chip, - const MemRank & i_rank, - MemSymbol i_symbol ) -{ - return __setDramInVpd<TARGETING::TYPE_MBA, DIMMS_PER_RANK::MBA>(i_chip, - i_rank, i_symbol); -} - -template<> -uint32_t setDramInVpd<TARGETING::TYPE_MCA>( ExtensibleChip * i_chip, - const MemRank & i_rank, - MemSymbol i_symbol ) -{ - return __setDramInVpd<TARGETING::TYPE_MCA, DIMMS_PER_RANK::MCA>(i_chip, - i_rank, i_symbol); -} - //------------------------------------------------------------------------------ -template<TARGETING::TYPE T, DIMMS_PER_RANK D> -uint32_t __clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, - MemSymbol i_symbol ) +uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, + MemSymbol i_symbol ) { #define PRDF_FUNC "[MemDqBitmap::__clearDramInVpd] " @@ -768,8 +741,8 @@ uint32_t __clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, { TARGETING::TargetHandle_t trgt = i_chip->getTrgt(); - MemDqBitmap<D> dqBitmap; - o_rc = getBadDqBitmap<D>( trgt, i_rank, dqBitmap ); + MemDqBitmap dqBitmap; + o_rc = getBadDqBitmap( trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, 0x%02x) failed.", @@ -784,7 +757,7 @@ uint32_t __clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, break; } - o_rc = setBadDqBitmap<D>( trgt, i_rank, dqBitmap ); + o_rc = setBadDqBitmap( trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x, 0x%02x) failed.", @@ -798,24 +771,6 @@ uint32_t __clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, #undef PRDF_FUNC } -template<> -uint32_t clearDramInVpd<TARGETING::TYPE_MCA>( ExtensibleChip * i_chip, - const MemRank & i_rank, - MemSymbol i_symbol ) -{ - return __clearDramInVpd<TARGETING::TYPE_MCA, DIMMS_PER_RANK::MCA>(i_chip, - i_rank, i_symbol); -} - -template<> -uint32_t clearDramInVpd<TARGETING::TYPE_MBA>( ExtensibleChip * i_chip, - const MemRank & i_rank, - MemSymbol i_symbol ) -{ - return __clearDramInVpd<TARGETING::TYPE_MBA, DIMMS_PER_RANK::MBA>(i_chip, - i_rank, i_symbol); -} - //------------------------------------------------------------------------------ } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H index 14ba29d1a..5877600a8 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -28,6 +28,8 @@ #ifndef __prdfMemDqBitmap_H #define __prdfMemDqBitmap_H +#include <map> + #include <prdfPlatServices.H> #include <prdfMemAddress.H> @@ -41,16 +43,16 @@ namespace PRDF class CaptureData; class MemSymbol; -enum DIMMS_PER_RANK : uint8_t +struct data { - MCA = MCA_DIMMS_PER_RANK, - MBA = MBA_DIMMS_PER_RANK, + uint8_t bitmap[DQ_BITMAP::BITMAP_SIZE]; }; +// Map from port (uint8_t) to the bitmap data (uint8_t[DQ_BITMAP::BITMAP_SIZE]) +typedef std::map<uint8_t, data> BitmapData; /** * @brief Container for DIMM's DQ bitmap. */ -template <DIMMS_PER_RANK T> class MemDqBitmap { private: // enums, constants @@ -66,19 +68,12 @@ class MemDqBitmap public: // constructors /** @brief Default constructor */ - MemDqBitmap() - { - memset( iv_data, 0x00, sizeof(iv_data) ); - } + MemDqBitmap() {} /** @brief Constructor from components */ MemDqBitmap( TARGETING::TargetHandle_t i_trgt, const MemRank & i_rank, - const uint8_t (&i_d)[T][DQ_BITMAP::BITMAP_SIZE] ) : - iv_trgt(i_trgt), iv_rank(i_rank), - iv_x4Dram(PlatServices::isDramWidthX4(i_trgt)) - { - memcpy( iv_data, i_d, sizeof(iv_data) ); - } + BitmapData i_d ) : iv_trgt(i_trgt), iv_rank(i_rank), + iv_x4Dram(PlatServices::isDramWidthX4(i_trgt)), iv_data(i_d){} public: // functions @@ -96,7 +91,7 @@ class MemDqBitmap * FALSE otherwise. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t badDqs( bool & o_badDqs, uint8_t i_portSlct = 0 ) const; + uint32_t badDqs( bool & o_badDqs, uint8_t i_portSlct = 0 ) const; /** * @brief Sets the specified DQ. @@ -104,7 +99,7 @@ class MemDqBitmap * @param i_portSlct The optional target port. The default is port 0. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t setDq( uint8_t i_dq, uint8_t i_portSlct = 0 ); + uint32_t setDq( uint8_t i_dq, uint8_t i_portSlct = 0 ); /** * @brief Sets the specified symbol. @@ -114,7 +109,7 @@ class MemDqBitmap * is to set both pins. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t setSymbol( const MemSymbol & i_symbol, uint8_t i_pins = 0x3 ); + uint32_t setSymbol( const MemSymbol & i_symbol, uint8_t i_pins = 0x3 ); /** * @brief Sets the specified DRAM. @@ -124,7 +119,7 @@ class MemDqBitmap * DRAM's pins. The default is to set all pins. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t setDram( const MemSymbol & i_symbol, uint8_t i_pins = 0xff ); + uint32_t setDram( const MemSymbol & i_symbol, uint8_t i_pins = 0xff ); /** * @brief Clears the specified DRAM. @@ -142,13 +137,29 @@ class MemDqBitmap */ void getCaptureData( CaptureData & o_cd ) const; - /** @return A reference to the data array. */ - const uint8_t (&getData()const)[T][DQ_BITMAP::BITMAP_SIZE] + /** @return The bitmap data. */ + const BitmapData & getData() const { return iv_data; } /** + * @brief Gets the bitmap data for a specified port. + * @param i_ps The port select. + * @return A reference to the bitmap data at a certain port. + */ + const uint8_t (&getData(uint8_t i_ps)const)[DQ_BITMAP::BITMAP_SIZE] + { + return iv_data.at(i_ps).bitmap; + } + + /** @return The size of the data map, ie how many ports there are */ + const size_t getNumPorts() const + { + return iv_data.size(); + } + + /** * @brief Support function to calculate the port select, byte index, and * bit index based on the given symbol. * @note Will adjust the indexes for DRAM or ECC spares, if applicable. @@ -158,8 +169,8 @@ class MemDqBitmap * @param o_bitIdx The bit index of the symbol (0,2,4,6). * @return Non-SUCCESS if the symbol is invalid, SUCCESS otherwise. */ - int32_t getPortByteBitIdx( const MemSymbol & i_symbol, uint8_t & o_portSlct, - uint8_t & o_byteIdx, uint8_t & o_bitIdx ) const; + uint32_t getPortByteBitIdx(const MemSymbol & i_symbol, uint8_t & o_portSlct, + uint8_t & o_byteIdx, uint8_t & o_bitIdx) const; /** * @brief Checks if chip mark is present on specified DRAM. @@ -168,7 +179,7 @@ class MemDqBitmap * @param o_cm True if chip mark is present false otherwise. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t isChipMark( const MemSymbol & i_symbol, bool & o_cm ); + uint32_t isChipMark( const MemSymbol & i_symbol, bool & o_cm ); /** * @brief Returns a list of all active (non-zero) symbols. @@ -185,8 +196,8 @@ class MemDqBitmap * @param o_eccSpare TRUE if the ECC spare is available, FALSE otherwise. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t isSpareAvailable( uint8_t i_portSlct, - bool & o_dramSpare, bool & o_eccSpare ); + uint32_t isSpareAvailable( uint8_t i_portSlct, + bool & o_dramSpare, bool & o_eccSpare ); /** * @brief Sets the ECC spare on the specified port (x4 mode only). @@ -194,7 +205,7 @@ class MemDqBitmap * The default is to set all pins. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t setEccSpare( uint8_t i_pins = 0x0f ); + uint32_t setEccSpare( uint8_t i_pins = 0x0f ); /** * @brief Sets the DRAM spare on the specified port. @@ -203,17 +214,17 @@ class MemDqBitmap * the DRAM's pins. The default is to set all pins. * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. */ - int32_t setDramSpare( uint8_t i_portSlct, uint8_t i_pins = 0xff ); + uint32_t setDramSpare( uint8_t i_portSlct, uint8_t i_pins = 0xff ); private: // instance variables - TARGETING::TargetHandle_t iv_trgt; ///< Target MBA/MCA + TARGETING::TargetHandle_t iv_trgt; ///< Target MBA/MCA/MEM_PORT MemRank iv_rank; ///< Target rank bool iv_x4Dram; ///< TRUE if iv_trgt uses x4 DRAMs /** A bitmap of all bad DQs for each port. */ - uint8_t iv_data[T][DQ_BITMAP::BITMAP_SIZE]; + BitmapData iv_data; }; //############################################################################## @@ -226,7 +237,6 @@ class MemDqBitmap * @param i_rank Target rank. * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise. */ -template<TARGETING::TYPE T> uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, MemSymbol i_symbol ); @@ -236,7 +246,6 @@ uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, * @param i_rank Target rank. * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise. */ -template<TARGETING::TYPE T> uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, MemSymbol i_symbol ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C index ab5cae95a..9869a8c08 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -164,9 +164,8 @@ uint32_t handleMemUe<TYPE_MBA>( ExtensibleChip * i_chip, const MemAddr & i_addr, MbaDataBundle * mbadb = getMbaDataBundle( i_chip ); - MemDqBitmap<DIMMS_PER_RANK::MBA> l_dqBitmap; - o_rc = mssIplUeIsolation<DIMMS_PER_RANK::MBA>( i_chip->getTrgt(), - rank, l_dqBitmap ); + MemDqBitmap l_dqBitmap; + o_rc = mssIplUeIsolation( i_chip->getTrgt(), rank, l_dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "mssIplUeIsolation(0x%08x, 0x%02x) failed", @@ -179,7 +178,7 @@ uint32_t handleMemUe<TYPE_MBA>( ExtensibleChip * i_chip, const MemAddr & i_addr, // Add all DIMMs with bad bits to the callout list. TargetHandleList callouts; - for ( uint8_t ps = 0; ps < DIMMS_PER_RANK::MBA; ps++ ) + for ( uint8_t ps = 0; ps < MAX_PORT_PER_MBA; ps++ ) { bool badDqs = false; o_rc = l_dqBitmap.badDqs( badDqs, ps ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C index 6ef1f66ff..ee81514b3 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -1223,7 +1223,7 @@ uint32_t chipMarkCleanup( ExtensibleChip * i_chip, const MemRank & i_rank, // Set the chip mark in the DRAM Repairs VPD. if ( !areDramRepairsDisabled() ) { - o_rc = setDramInVpd<T>( i_chip, i_rank, chipMark.getSymbol() ); + o_rc = setDramInVpd( i_chip, i_rank, chipMark.getSymbol() ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setDramInVpd(0x%08x,0x%02x) failed", diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C index e2910cf8d..7f907206a 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -171,9 +171,9 @@ uint8_t MemSymbol::getDramPins() const bool isMba = TYPE_MBA == getTargetType(iv_trgt); bool isX4 = isDramWidthX4( iv_trgt ); - uint32_t dps = isMba ? MBA_DQS_PER_SYMBOL : MCA_DQS_PER_SYMBOL; + uint32_t dps = isMba ? MBA_DQS_PER_SYMBOL : MEM_DQS_PER_SYMBOL; uint32_t spd = isMba ? isX4 ? MBA_SYMBOLS_PER_NIBBLE : MBA_SYMBOLS_PER_BYTE - : isX4 ? MCA_SYMBOLS_PER_NIBBLE : MCA_SYMBOLS_PER_BYTE; + : isX4 ? MEM_SYMBOLS_PER_NIBBLE : MEM_SYMBOLS_PER_BYTE; return iv_pins << (((spd - 1) - (iv_symbol % spd)) * dps); } diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C index f6261eb40..fee031aae 100644 --- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C +++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -626,33 +626,30 @@ bool obusInSmpMode( TargetHandle_t obus ) //## Memory specific functions //############################################################################## -template <DIMMS_PER_RANK T> -int32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, - MemDqBitmap<T> & o_bitmap ) +template <fapi2::TargetType T> +uint32_t __getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, + MemDqBitmap & o_bitmap ) { - #define PRDF_FUNC "[PlatServices::getBadDqBitmap] " + #define PRDF_FUNC "[PlatServices::__getBadDqBitmap] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; #ifdef __HOSTBOOT_MODULE - uint8_t data[T][DQ_BITMAP::BITMAP_SIZE] = {0}; + BitmapData data; - for ( int32_t ps = 0; ps < T; ps++ ) + for ( uint32_t ps = 0; ps < MAX_MEM_PORT; ps++ ) { - // Don't proceed unless the DIMM exists - PRDF_ASSERT( nullptr != getConnectedDimm(i_trgt, i_rank, ps) ); + // Skip if the DIMM doesn't exist + if ( nullptr != getConnectedDimm(i_trgt, i_rank, ps) ) continue; errlHndl_t errl = nullptr; - constexpr fapi2::TargetType l_trgtType = ( T == DIMMS_PER_RANK::MBA ) ? - fapi2::TARGET_TYPE_MBA : fapi2::TARGET_TYPE_MCA; - - fapi2::Target<l_trgtType> l_fapiTrgt( i_trgt ); + fapi2::Target<T> l_fapiTrgt( i_trgt ); FAPI_INVOKE_HWP( errl, p9DimmGetBadDqBitmap, l_fapiTrgt, i_rank.getDimmSlct(), i_rank.getRankSlct(), - data[ps], ps ); + data[ps].bitmap, ps ); if ( nullptr != errl ) { @@ -666,7 +663,7 @@ int32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, if ( SUCCESS == o_rc ) { - o_bitmap = MemDqBitmap<T>( i_trgt, i_rank, data ); + o_bitmap = MemDqBitmap( i_trgt, i_rank, data ); } #endif // __HOSTBOOT_MODULE @@ -676,48 +673,69 @@ int32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, #undef PRDF_FUNC } -template -int32_t getBadDqBitmap<DIMMS_PER_RANK::MCA>( - TargetHandle_t i_trgt, const MemRank & i_rank, - MemDqBitmap<DIMMS_PER_RANK::MCA> & o_bitmap ); +uint32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, + MemDqBitmap & o_bitmap ) +{ + #define PRDF_FUNC "[PlatServices::getBadDqBitmap] " + + uint32_t o_rc = SUCCESS; + TYPE trgtType = getTargetType( i_trgt ); + + switch( trgtType ) + { + case TYPE_MCA: + o_rc = __getBadDqBitmap<fapi2::TARGET_TYPE_MCA>( i_trgt, i_rank, + o_bitmap ); + break; + case TYPE_MBA: + o_rc = __getBadDqBitmap<fapi2::TARGET_TYPE_MBA>( i_trgt, i_rank, + o_bitmap ); + break; + case TYPE_MEM_PORT: + o_rc = __getBadDqBitmap<fapi2::TARGET_TYPE_MEM_PORT>( i_trgt, + i_rank, o_bitmap ); + break; + default: + PRDF_ERR( PRDF_FUNC "Invalid trgt type" ); + o_rc = FAIL; + break; + } + + return o_rc; + + #undef PRDF_FUNC +} -template -int32_t getBadDqBitmap<DIMMS_PER_RANK::MBA>( - TargetHandle_t i_trgt, const MemRank & i_rank, - MemDqBitmap<DIMMS_PER_RANK::MBA> & o_bitmap ); //------------------------------------------------------------------------------ -template <DIMMS_PER_RANK T> -int32_t setBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, - const MemDqBitmap<T> & i_bitmap ) +template <fapi2::TargetType T> +uint32_t __setBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, + const MemDqBitmap & i_bitmap ) { #define PRDF_FUNC "[PlatServices::setBadDqBitmap] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; #ifdef __HOSTBOOT_MODULE if ( !areDramRepairsDisabled() ) { - const uint8_t (&data)[T][DQ_BITMAP::BITMAP_SIZE] = i_bitmap.getData(); + const BitmapData data = i_bitmap.getData(); - for ( int32_t ps = 0; ps < T; ps++ ) + size_t maxPorts = i_bitmap.getNumPorts(); + for ( uint32_t ps = 0; ps < maxPorts; ps++ ) { // Don't proceed unless the DIMM exists PRDF_ASSERT( nullptr != getConnectedDimm(i_trgt, i_rank, ps) ); errlHndl_t errl = nullptr; - constexpr fapi2::TargetType l_trgtType = - ( T == DIMMS_PER_RANK::MBA ) ? fapi2::TARGET_TYPE_MBA - : fapi2::TARGET_TYPE_MCA; - - fapi2::Target<l_trgtType> l_fapiTrgt( i_trgt ); + fapi2::Target<T> l_fapiTrgt( i_trgt ); FAPI_INVOKE_HWP( errl, p9DimmSetBadDqBitmap, l_fapiTrgt, i_rank.getDimmSlct(), i_rank.getRankSlct(), - data[ps], ps ); + data.at(ps).bitmap, ps ); if ( nullptr != errl ) { @@ -737,17 +755,38 @@ int32_t setBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, #undef PRDF_FUNC } -template -int32_t setBadDqBitmap<DIMMS_PER_RANK::MCA>( - TargetHandle_t i_trgt, const MemRank & i_rank, - const MemDqBitmap<DIMMS_PER_RANK::MCA> & i_bitmap ); +uint32_t setBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, + const MemDqBitmap & i_bitmap ) +{ + #define PRDF_FUNC "[PlatServices::setBadDqBitmap] " -template -int32_t setBadDqBitmap<DIMMS_PER_RANK::MBA>( - TargetHandle_t i_trgt, const MemRank & i_rank, - const MemDqBitmap<DIMMS_PER_RANK::MBA> & i_bitmap ); + uint32_t o_rc = SUCCESS; + TYPE trgtType = getTargetType( i_trgt ); + switch( trgtType ) + { + case TYPE_MCA: + o_rc = __setBadDqBitmap<fapi2::TARGET_TYPE_MCA>( i_trgt, i_rank, + i_bitmap ); + break; + case TYPE_MBA: + o_rc = __setBadDqBitmap<fapi2::TARGET_TYPE_MBA>( i_trgt, i_rank, + i_bitmap ); + break; + case TYPE_MEM_PORT: + o_rc = __setBadDqBitmap<fapi2::TARGET_TYPE_MEM_PORT>( i_trgt, + i_rank, i_bitmap ); + break; + default: + PRDF_ERR( PRDF_FUNC "Invalid trgt type" ); + o_rc = FAIL; + break; + } + return o_rc; + + #undef PRDF_FUNC +} //------------------------------------------------------------------------------ template<> @@ -1005,9 +1044,9 @@ uint32_t isDramSparingEnabled<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt, //------------------------------------------------------------------------------ -template<TARGETING::TYPE T, DIMMS_PER_RANK D> -uint32_t __isSpareAvailable( TARGETING::TargetHandle_t i_trgt, MemRank i_rank, - uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail ) +template<TARGETING::TYPE T> +uint32_t isSpareAvailable( TARGETING::TargetHandle_t i_trgt, MemRank i_rank, + uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail ) { #define PRDF_FUNC "[PlatServices::isSpareAvailable] " @@ -1044,8 +1083,8 @@ uint32_t __isSpareAvailable( TARGETING::TargetHandle_t i_trgt, MemRank i_rank, bool eccSparePossible = false; // Get the bad dq data - MemDqBitmap<D> dqBitmap; - o_rc = getBadDqBitmap<D>( i_trgt, i_rank, dqBitmap ); + MemDqBitmap dqBitmap; + o_rc = getBadDqBitmap( i_trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed" ); @@ -1077,13 +1116,9 @@ uint32_t __isSpareAvailable( TARGETING::TargetHandle_t i_trgt, MemRank i_rank, } -template<> +template uint32_t isSpareAvailable<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt, - MemRank i_rank, uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail ) -{ - return __isSpareAvailable<TYPE_MBA, DIMMS_PER_RANK::MBA>( i_trgt, i_rank, - i_ps, o_spAvail, o_eccAvail ); -} + MemRank i_rank, uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail ); //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H index 2c6c9c4df..190f1c2bb 100755 --- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H +++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -55,8 +55,6 @@ namespace PRDF { class CenAddr; -enum DIMMS_PER_RANK : uint8_t; -template <DIMMS_PER_RANK T> class MemDqBitmap; class CenMark; class CenRank; @@ -195,27 +193,25 @@ bool obusInSmpMode(TARGETING::TargetHandle_t obusTgt); /** * @brief Reads the bad DQ bitmap attribute for both ports of the target rank. - * @param i_trgt A MCA/MBA target. + * @param i_trgt A MCA/MBA/MEM_PORT target. * @param i_rank Target rank. * @param o_bitmap DQ bitmap container. * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. */ -template <DIMMS_PER_RANK T> -int32_t getBadDqBitmap( TARGETING::TargetHandle_t i_trgt, - const MemRank & i_rank, MemDqBitmap<T> & o_bitmap ); +uint32_t getBadDqBitmap( TARGETING::TargetHandle_t i_trgt, + const MemRank & i_rank, MemDqBitmap & o_bitmap ); /** * @brief Writes the bad DQ bitmap attribute for both ports of the target rank. - * @param i_trgt A MCA/MBA target. + * @param i_trgt A MCA/MBA/MEM_PORT target. * @param i_rank Target rank. * @param i_bitmap DQ bitmap container. * @note This is a no-op if DRAM Repairs are disabled in manufacturing. * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. */ -template <DIMMS_PER_RANK T> -int32_t setBadDqBitmap( TARGETING::TargetHandle_t i_trgt, - const MemRank & i_rank, - const MemDqBitmap<T> & i_bitmap ); +uint32_t setBadDqBitmap( TARGETING::TargetHandle_t i_trgt, + const MemRank & i_rank, + const MemDqBitmap & i_bitmap ); /** * @brief Invokes the get steer mux hardware procedure. diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.H b/src/usr/diag/prdf/common/plat/prdfTargetServices.H index 41aa67ed9..ed2ea80ef 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.H +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -293,7 +293,7 @@ TARGETING::TargetHandle_t getConnectedPeerTarget( TARGETING::TargetHandle_t i_tgt); /** - * @param i_trgt The target MBA or MCA. + * @param i_trgt The target MBA, MCA, or MEM_PORT. * @param i_rank The target rank. * @return A list of DIMMs connected to the target and rank. */ @@ -301,14 +301,15 @@ TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_trgt, const MemRank & i_rank ); /** - * @param i_trgt The target MBA or MCA. + * @param i_trgt The target MBA, MCA, or MEM_PORT. * @param i_rank The target rank. - * @param i_port Port select. + * @param i_port Port select, only needed for MBA. MCA and MEM_PORT are + * targets equivalent to the port already. * @return The DIMM connected to the target and rank on a port. */ TARGETING::TargetHandle_t getConnectedDimm( TARGETING::TargetHandle_t i_trgt, const MemRank & i_rank, - uint8_t i_port ); + uint8_t i_port = 0 ); /** * @brief Returns the system target. diff --git a/src/usr/diag/prdf/common/plugins/prdfMemLogParse.C b/src/usr/diag/prdf/common/plugins/prdfMemLogParse.C index dfbbe655d..014788a11 100644 --- a/src/usr/diag/prdf/common/plugins/prdfMemLogParse.C +++ b/src/usr/diag/prdf/common/plugins/prdfMemLogParse.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -2789,32 +2789,25 @@ void getDramRepairSymbolStr( uint8_t i_value, char * o_str, uint32_t i_strSize ) // Gets the string representation for a single bad DQ bitmap entry. void getBadDqBitmapEntry( uint8_t * i_buffer, char * o_str, TYPE i_type ) { - uint8_t dimmsPerRank = MCA_DIMMS_PER_RANK; - uint32_t entrySize = DQ_BITMAP::MCA_ENTRY_SIZE; - - if ( TYPE_MBA == i_type ) - { - dimmsPerRank = MBA_DIMMS_PER_RANK; - entrySize = DQ_BITMAP::MBA_ENTRY_SIZE; - } + uint32_t entrySize = DQ_BITMAP::ENTRY_SIZE; UtilMem membuf( i_buffer, entrySize ); uint8_t rank; membuf >> rank; snprintf( o_str, DATA_SIZE, "R:%1d", rank ); - for ( int32_t p = 0; p < dimmsPerRank; p++ ) - { - char temp[DATA_SIZE]; + char temp[DATA_SIZE]; + uint8_t port; membuf >> port; + snprintf( temp, DATA_SIZE, "P:%1d", port ); + strcat( o_str, temp ); - strcat( o_str, " " ); + strcat( o_str, " " ); - for ( int32_t b = 0; b < DQ_BITMAP::BITMAP_SIZE; b++ ) - { - uint8_t byte; membuf >> byte; - snprintf( temp, DATA_SIZE, "%02x", byte ); - strcat( o_str, temp ); - } + for ( int32_t b = 0; b < DQ_BITMAP::BITMAP_SIZE; b++ ) + { + uint8_t byte; membuf >> byte; + snprintf( temp, DATA_SIZE, "%02x", byte ); + strcat( o_str, temp ); } } @@ -3364,8 +3357,7 @@ bool parseDramRepairsVpd( uint8_t * i_buffer, uint32_t i_buflen, if ( NULL == i_buffer ) return false; // Something failed in parser. - uint32_t entrySize = DQ_BITMAP::MCA_ENTRY_SIZE; - if ( TYPE_MBA == i_type ) entrySize = DQ_BITMAP::MBA_ENTRY_SIZE; + uint32_t entrySize = DQ_BITMAP::ENTRY_SIZE; const uint32_t entries = i_buflen / entrySize; @@ -3391,8 +3383,7 @@ bool parseBadDqBitmap( uint8_t * i_buffer, uint32_t i_buflen, if ( NULL == i_buffer ) return false; // Something failed in parser. - uint32_t entrySize = DQ_BITMAP::MCA_ENTRY_SIZE; - if ( TYPE_MBA == i_type ) entrySize = DQ_BITMAP::MBA_ENTRY_SIZE; + uint32_t entrySize = DQ_BITMAP::ENTRY_SIZE; if ( entrySize > i_buflen ) // Data is expected to be one entry. { diff --git a/src/usr/diag/prdf/common/plugins/prdfParserEnums.H b/src/usr/diag/prdf/common/plugins/prdfParserEnums.H index 78232ba68..ab2ca8142 100644 --- a/src/usr/diag/prdf/common/plugins/prdfParserEnums.H +++ b/src/usr/diag/prdf/common/plugins/prdfParserEnums.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -111,6 +111,8 @@ enum PositionBounds MAX_OCMB_PER_OMI = 1, + MAX_MEM_PORT = 2, + MAX_NPU_PER_PROC = 3, INVALID_POSITION_BOUND = 0xffffffff, @@ -181,8 +183,7 @@ namespace DQ_BITMAP enum { BITMAP_SIZE = 10, // 80-bit bitmap - MCA_ENTRY_SIZE = sizeof(uint8_t) + MCA_DIMMS_PER_RANK * BITMAP_SIZE, - MBA_ENTRY_SIZE = sizeof(uint8_t) + MBA_DIMMS_PER_RANK * BITMAP_SIZE, + ENTRY_SIZE = sizeof(uint8_t)*2 + BITMAP_SIZE, }; } // namespace DQ_BITMAP diff --git a/src/usr/diag/prdf/common/plugins/prdfParserUtils.C b/src/usr/diag/prdf/common/plugins/prdfParserUtils.C index 4f64349cc..c2ccd38f2 100644 --- a/src/usr/diag/prdf/common/plugins/prdfParserUtils.C +++ b/src/usr/diag/prdf/common/plugins/prdfParserUtils.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2018 */ +/* Contributors Listed Below - COPYRIGHT 2014,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -89,7 +89,7 @@ uint8_t symbol2Dq<TARGETING::TYPE_MCA>( uint8_t i_symbol ) template<> uint8_t symbol2PortSlct<TARGETING::TYPE_MBA>( uint8_t i_symbol ) { - uint8_t portSlct = MBA_DIMMS_PER_RANK; + uint8_t portSlct = MAX_PORT_PER_MBA; if ( SYMBOLS_PER_RANK > i_symbol ) { @@ -159,6 +159,15 @@ uint8_t dq2Symbol<TARGETING::TYPE_MCA>( uint8_t i_dq, uint8_t i_ps ) //------------------------------------------------------------------------------ template<> +uint8_t dq2Symbol<TARGETING::TYPE_MEM_PORT>( uint8_t i_dq, uint8_t i_ps ) +{ + // MEM_PORT case is identical to MCA + return dq2Symbol<TARGETING::TYPE_MCA>( i_dq, i_ps ); +} + +//------------------------------------------------------------------------------ + +template<> uint8_t nibble2Symbol<TARGETING::TYPE_MBA>( uint8_t i_x4Dram ) { return (MBA_NIBBLES_PER_RANK >i_x4Dram) ? (i_x4Dram *MBA_SYMBOLS_PER_NIBBLE) @@ -234,7 +243,7 @@ uint8_t symbol2Nibble<TARGETING::TYPE_MCA>( uint8_t i_symbol ) { return (SYMBOLS_PER_RANK > i_symbol) ? (symbol2Dq<TARGETING::TYPE_MCA>(i_symbol)/4) - : MCA_NIBBLES_PER_RANK; + : MEM_NIBBLES_PER_RANK; } //------------------------------------------------------------------------------ @@ -253,7 +262,7 @@ uint8_t symbol2Byte<TARGETING::TYPE_MCA>( uint8_t i_symbol ) { return (SYMBOLS_PER_RANK > i_symbol) ? (symbol2Dq<TARGETING::TYPE_MCA>(i_symbol)/8) - : MCA_BYTES_PER_RANK; + : MEM_BYTES_PER_RANK; } diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C index 559e384fa..70a6be7f2 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C @@ -128,10 +128,8 @@ uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, // Set the bad spare in the VPD. At this point, the chip mark // should have already been set in the VPD because it was recently // verified. - MemDqBitmap<DIMMS_PER_RANK::MBA> bitmap; - o_rc = getBadDqBitmap<DIMMS_PER_RANK::MBA>( iv_chip->getTrgt(), - iv_rank, bitmap ); - + MemDqBitmap bitmap; + o_rc = getBadDqBitmap( iv_chip->getTrgt(), iv_rank, bitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed" ); @@ -151,8 +149,7 @@ uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, } } - o_rc = setBadDqBitmap<DIMMS_PER_RANK::MBA>( iv_chip->getTrgt(), - iv_rank, bitmap ); + o_rc = setBadDqBitmap( iv_chip->getTrgt(), iv_rank, bitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap() failed" ); diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C index 163e2ec86..72434e700 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -894,7 +894,7 @@ SCAN_COMM_REGISTER_CLASS * __getEccFirAnd<TYPE_MBA>( ExtensibleChip * i_chip ) : "MBSECCFIR_1_AND" ); } -template <TARGETING::TYPE TP, DIMMS_PER_RANK D, TARGETING::TYPE TC> +template <TARGETING::TYPE TP, TARGETING::TYPE TC> uint32_t __findChipMarks( TdRankList<TC> & i_rankList ) { #define PRDF_FUNC "[__findChipMarks] " @@ -919,7 +919,7 @@ uint32_t __findChipMarks( TdRankList<TC> & i_rankList ) if ( !chipMark.isValid() ) continue; // no chip mark present // Get the DQ Bitmap data. - MemDqBitmap<D> dqBitmap; + MemDqBitmap dqBitmap; o_rc = getBadDqBitmap( chip->getTrgt(), rank, dqBitmap ); if ( SUCCESS != o_rc ) { @@ -990,7 +990,7 @@ uint32_t MemTdCtlr<TYPE_MCBIST>::initialize() } // Find all unverified chip marks. - o_rc = __findChipMarks<TYPE_MCA,DIMMS_PER_RANK::MCA>( iv_rankList ); + o_rc = __findChipMarks<TYPE_MCA>( iv_rankList ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "__findChipMarks() failed on 0x%08x", @@ -1029,7 +1029,7 @@ uint32_t MemTdCtlr<TYPE_MBA>::initialize() } // Find all unverified chip marks. - o_rc = __findChipMarks<TYPE_MBA,DIMMS_PER_RANK::MBA>( iv_rankList ); + o_rc = __findChipMarks<TYPE_MBA>( iv_rankList ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "__findChipMarks() failed on 0x%08x", @@ -1121,13 +1121,13 @@ uint32_t MemTdCtlr<TYPE_MCBIST>::handleRrFo() // Get the DQ Bitmap data. TargetHandle_t mcaTrgt = mcaChip->GetChipHandle(); - MemDqBitmap<DIMMS_PER_RANK::MCA> dqBitmap; + MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap<DIMMS_PER_RANK::MCA>(mcaTrgt, rank, dqBitmap); + o_rc = getBadDqBitmap( mcaTrgt, rank, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getBadDqBitmap<DIMMS_PER_RANK::MCA>" - "(0x%08x, %d)", getHuid(mcaTrgt), rank.getMaster() ); + PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, %d)", + getHuid(mcaTrgt), rank.getMaster() ); break; } @@ -1232,13 +1232,13 @@ uint32_t MemTdCtlr<TYPE_MBA>::handleRrFo() // Get the DQ Bitmap data. TargetHandle_t mbaTrgt = mbaChip->GetChipHandle(); - MemDqBitmap<DIMMS_PER_RANK::MBA> dqBitmap; + MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap<DIMMS_PER_RANK::MBA>(mbaTrgt, rank, dqBitmap); + o_rc = getBadDqBitmap( mbaTrgt, rank, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getBadDqBitmap<DIMMS_PER_RANK::MBA>" - "(0x%08x, %d)", getHuid(mbaTrgt), rank.getMaster() ); + PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, %d)", + getHuid(mbaTrgt), rank.getMaster() ); break; } diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C index 73c7c47cd..187b9b28d 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -284,12 +284,11 @@ void __analyzeNibbleSyms( MemUtils::MaintSymbols i_nibbleStats, //------------------------------------------------------------------------------ -template<DIMMS_PER_RANK T> uint32_t __updateVpdSumAboveOne( CeCount i_sumAboveOneCount, - MemDqBitmap<T> & io_dqBitmap ) + MemDqBitmap & io_dqBitmap ) { - #define PRDF_FUNC "[__updateVpdSumAboveOne<T>] " + #define PRDF_FUNC "[__updateVpdSumAboveOne] " uint32_t o_rc = SUCCESS; @@ -459,14 +458,13 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Get the Bad DQ Bitmap. TargetHandle_t mcaTrgt = iv_chip->getTrgt(); - MemDqBitmap<DIMMS_PER_RANK::MCA> dqBitmap; + MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap<DIMMS_PER_RANK::MCA>(mcaTrgt, iv_rank, dqBitmap); + o_rc = getBadDqBitmap( mcaTrgt, iv_rank, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getBadDqBitmap<DIMMS_PER_RANK::MCA>" - "(0x%08x, 0x%02x) failed", getHuid(mcaTrgt), - iv_rank.getKey() ); + PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, 0x%02x) failed", + getHuid(mcaTrgt), iv_rank.getKey() ); break; } @@ -541,12 +539,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Placing a symbol mark risks a UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne(i_sumAboveOneCount, dqBitmap); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR(PRDF_FUNC "__updateVpdSumAboveOne() failed."); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -622,12 +618,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Placing a symbol mark risks a UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne(i_sumAboveOneCount, dqBitmap); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR(PRDF_FUNC "__updateVpdSumAboveOne() failed."); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -701,12 +695,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Placing a mark risks a UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne(i_sumAboveOneCount, dqBitmap); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR(PRDF_FUNC "__updateVpdSumAboveOne() failed."); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -805,12 +797,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Placing a chip mark risks a UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne(i_sumAboveOneCount, dqBitmap); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR(PRDF_FUNC "__updateVpdSumAboveOne() failed."); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -862,12 +852,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // Placing the symbol mark risks a UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne(i_sumAboveOneCount, dqBitmap); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR(PRDF_FUNC "__updateVpdSumAboveOne() failed."); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -887,12 +875,10 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, // There are enough errors that this could be a potential UE. // For nibbles under threshold with a sum greater than 1, // update VPD with it's non-zero symbols. - o_rc = __updateVpdSumAboveOne<DIMMS_PER_RANK::MCA>( - i_sumAboveOneCount, dqBitmap ); + o_rc = __updateVpdSumAboveOne( i_sumAboveOneCount, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne<DIMMS_PER" - "_RANK::MCA>() failed." ); + PRDF_ERR( PRDF_FUNC "__updateVpdSumAboveOne() failed." ); } io_sc.service_data->setSignature( iv_chip->getHuid(), @@ -917,12 +903,11 @@ uint32_t TpsEvent<TYPE_MCA>::analyzeCeSymbolCounts( CeCount i_badDqCount, } // Write any updates to VPD. - o_rc = setBadDqBitmap<DIMMS_PER_RANK::MCA>(mcaTrgt, iv_rank, dqBitmap); + o_rc = setBadDqBitmap( mcaTrgt, iv_rank, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR(PRDF_FUNC "setBadDqBitmap<DIMMS_PER_RANK::MCA>" - "(0x%08x, 0x%02x) failed", getHuid(mcaTrgt), - iv_rank.getKey()); + PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x, 0x%02x) failed", + getHuid(mcaTrgt), iv_rank.getKey() ); break; } @@ -959,14 +944,13 @@ uint32_t TpsEvent<TYPE_MCA>::getSymbolCeCounts( CeCount & io_badDqCount, { // Get the Bad DQ Bitmap. TargetHandle_t mcaTrgt = iv_chip->getTrgt(); - MemDqBitmap<DIMMS_PER_RANK::MCA> dqBitmap; + MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap<DIMMS_PER_RANK::MCA>(mcaTrgt, iv_rank, dqBitmap); + o_rc = getBadDqBitmap( mcaTrgt, iv_rank, dqBitmap ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "getBadDqBitmap<DIMMS_PER_RANK::MCA>" - "(0x%08x,%d) failed", getHuid(mcaTrgt), - iv_rank.getMaster() ); + PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x,%d) failed", + getHuid(mcaTrgt), iv_rank.getMaster() ); break; } std::vector<MemSymbol> bmSymList = dqBitmap.getSymbolList(); @@ -989,12 +973,12 @@ uint32_t TpsEvent<TYPE_MCA>::getSymbolCeCounts( CeCount & io_badDqCount, uint8_t baseSymbol = SYMBOLS_PER_CE_REG * regIdx; for ( uint8_t i = 0; i < SYMBOLS_PER_CE_REG; - i += MCA_SYMBOLS_PER_NIBBLE ) + i += MEM_SYMBOLS_PER_NIBBLE ) { MemUtils::MaintSymbols nibbleStats; // Get a nibble's worth of symbols. - for ( uint8_t n = 0; n < MCA_SYMBOLS_PER_NIBBLE; n++ ) + for ( uint8_t n = 0; n < MEM_SYMBOLS_PER_NIBBLE; n++ ) { uint8_t sym = baseSymbol + (i+n); PRDF_ASSERT( sym < SYMBOLS_PER_RANK ); @@ -1416,8 +1400,7 @@ uint32_t TpsEvent<TYPE_MBA>::analyzeCeStats( STEP_CODE_DATA_STRUCT & io_sc, } // Add all symbols to the VPD. - MemDqBitmap<DIMMS_PER_RANK::MBA> bitmap; - + MemDqBitmap bitmap; o_rc = getBadDqBitmap( trgt, iv_rank, bitmap ); if ( SUCCESS != o_rc ) { @@ -1676,7 +1659,7 @@ uint32_t TpsEvent<TYPE_MBA>::handleFalseAlarm( STEP_CODE_DATA_STRUCT & io_sc ) } // Add this symbol to the VPD. - MemDqBitmap<DIMMS_PER_RANK::MBA> bitmap; + MemDqBitmap bitmap; o_rc = getBadDqBitmap( iv_chip->getTrgt(), iv_rank, bitmap ); if ( SUCCESS != o_rc ) { diff --git a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C index ef76aca3c..9cd050ac0 100644 --- a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C +++ b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2018 */ +/* Contributors Listed Below - COPYRIGHT 2012,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -97,7 +97,7 @@ void commitErrl( errlHndl_t i_errl, TargetHandle_t i_trgt ) //------------------------------------------------------------------------------ -template<TARGETING::TYPE T, DIMMS_PER_RANK D> +template<TARGETING::TYPE T> void __calloutDimm( errlHndl_t & io_errl, TargetHandle_t i_portTrgt, TargetHandle_t i_dimmTrgt ) { @@ -123,17 +123,20 @@ void __calloutDimm( errlHndl_t & io_errl, TargetHandle_t i_portTrgt, std::vector<MemRank> ranks; getMasterRanks<T>( i_portTrgt, ranks, getDimmSlct(i_dimmTrgt) ); - uint8_t data[D][DQ_BITMAP::BITMAP_SIZE]; - memset( data, 0x00, sizeof(data) ); + BitmapData data; + for ( uint8_t p = 0; p < MAX_MEM_PORT; p++ ) + { + memset( data[p].bitmap, 0x00, sizeof(data) ); + } for ( auto & rank : ranks ) { - MemDqBitmap<D> dqBitmap { i_portTrgt, rank, data }; + MemDqBitmap dqBitmap { i_portTrgt, rank, data }; - if ( SUCCESS != setBadDqBitmap<D>(i_portTrgt, rank, dqBitmap) ) + if ( SUCCESS != setBadDqBitmap(i_portTrgt, rank, dqBitmap) ) { - PRDF_ERR( PRDF_FUNC "setBadDqBitmap<%d>(0x%08x,0x%02x) failed", - D, getHuid(i_portTrgt), rank.getKey() ); + PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x,0x%02x) failed", + getHuid(i_portTrgt), rank.getKey() ); continue; } } @@ -251,8 +254,7 @@ bool processRepairedRanks<TYPE_MCA>( TargetHandle_t i_trgt, // Callout all DIMMs in the map. for ( auto const & dimm : calloutList ) { - __calloutDimm<TYPE_MCA, DIMMS_PER_RANK::MCA>( errl, i_trgt, - dimm.first ); + __calloutDimm<TYPE_MCA>( errl, i_trgt, dimm.first ); } // Commit the error log, if needed. @@ -374,8 +376,7 @@ bool processRepairedRanks<TYPE_MBA>( TargetHandle_t i_trgt, // Callout all DIMMs in the map. for ( auto const & dimm : calloutList ) { - __calloutDimm<TYPE_MBA, DIMMS_PER_RANK::MBA>( errl, i_trgt, - dimm.first ); + __calloutDimm<TYPE_MBA>( errl, i_trgt, dimm.first ); } o_calloutMade = true; @@ -432,7 +433,7 @@ bool processBadDimms<TYPE_MCA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) i_trgt, PRDFSIG_RdrRepairUnavail ); } - __calloutDimm<TYPE_MCA, DIMMS_PER_RANK::MCA>( errl, i_trgt, dimm ); + __calloutDimm<TYPE_MCA>( errl, i_trgt, dimm ); o_calloutMade = true; } @@ -474,7 +475,7 @@ bool processBadDimms<TYPE_MBA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) uint8_t dimmSlct = getDimmSlct( dimm ); // The 4 bits of i_badDimmMask is defined as p0d0, p0d1, p1d0, and p1d1. - uint8_t mask = 0x8 >> (portSlct * MBA_DIMMS_PER_RANK + dimmSlct); + uint8_t mask = 0x8 >> (portSlct * MAX_PORT_PER_MBA + dimmSlct); if ( 0 != (i_badDimmMask & mask) ) { @@ -484,7 +485,7 @@ bool processBadDimms<TYPE_MBA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) i_trgt, PRDFSIG_RdrRepairUnavail ); } - __calloutDimm<TYPE_MBA, DIMMS_PER_RANK::MBA>( errl, i_trgt, dimm ); + __calloutDimm<TYPE_MBA>( errl, i_trgt, dimm ); o_calloutMade = true; } @@ -505,25 +506,6 @@ bool processBadDimms<TYPE_MBA>( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) //------------------------------------------------------------------------------ -template<TARGETING::TYPE> -int32_t __readBadDqBitmap( TargetHandle_t i_trgt, MemRank i_rank ); - -template<> -int32_t __readBadDqBitmap<TYPE_MCA>( TargetHandle_t i_trgt, MemRank i_rank ) -{ - MemDqBitmap<DIMMS_PER_RANK::MCA> bitmap; - return getBadDqBitmap<DIMMS_PER_RANK::MCA>( i_trgt, i_rank, bitmap ); -} - -template<> -int32_t __readBadDqBitmap<TYPE_MBA>( TargetHandle_t i_trgt, MemRank i_rank ) -{ - MemDqBitmap<DIMMS_PER_RANK::MBA> bitmap; - return getBadDqBitmap<DIMMS_PER_RANK::MBA>( i_trgt, i_rank, bitmap ); -} - -//------------------------------------------------------------------------------ - template<TARGETING::TYPE T> bool screenBadDqs( TargetHandle_t i_trgt, const std::vector<MemRank> & i_ranks ) { @@ -540,10 +522,10 @@ bool screenBadDqs( TargetHandle_t i_trgt, const std::vector<MemRank> & i_ranks ) // if it has DRAM Repairs VPD and the DISABLE_DRAM_REPAIRS MNFG policy // flag is set. PRD will simply need to iterate through all the ranks // to ensure all DIMMs are screen and the procedure will do the rest. - - if ( SUCCESS != __readBadDqBitmap<T>(i_trgt, rank) ) + MemDqBitmap bitmap; + if ( SUCCESS != getBadDqBitmap(i_trgt, rank, bitmap) ) { - PRDF_ERR( PRDF_FUNC "__readBadDqBitmap() failed: TRGT=0x%08x " + PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed: TRGT=0x%08x " "rank=0x%02x", getHuid(i_trgt), rank.getKey() ); analysisErrors = true; continue; // skip this rank diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C index dbba168e8..1ff113042 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -208,15 +208,14 @@ uint32_t mssRestoreDramRepairs<TYPE_MBA>( TargetHandle_t i_target, //------------------------------------------------------------------------------ -template<> uint32_t mssIplUeIsolation( TargetHandle_t i_mba, const MemRank & i_rank, - MemDqBitmap<DIMMS_PER_RANK::MBA> & o_bitmap ) + MemDqBitmap & o_bitmap ) { #define PRDF_FUNC "[PlatServices::mssIplUeIsolation] " uint32_t o_rc = SUCCESS; - uint8_t data[DIMMS_PER_RANK::MBA][DQ_BITMAP::BITMAP_SIZE]; + uint8_t data[MAX_PORT_PER_MBA][DQ_BITMAP::BITMAP_SIZE]; errlHndl_t errl = NULL; fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba( i_mba ); @@ -231,7 +230,12 @@ uint32_t mssIplUeIsolation( TargetHandle_t i_mba, const MemRank & i_rank, } else { - o_bitmap = MemDqBitmap<DIMMS_PER_RANK::MBA>( i_mba, i_rank, data ); + BitmapData bitmapData; + for ( uint8_t p = 0; p < MAX_PORT_PER_MBA; p++ ) + { + memcpy( bitmapData[p].bitmap, data[p], sizeof(data[p]) ); + } + o_bitmap = MemDqBitmap( i_mba, i_rank, bitmapData ); } return o_rc; diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H index c3d7dfc23..eaa3937d0 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -92,10 +92,9 @@ uint32_t mssRestoreDramRepairs( TARGETING::TargetHandle_t i_target, * @param o_bitmap DQ bitmap container. * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -template<DIMMS_PER_RANK D> uint32_t mssIplUeIsolation( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank, - MemDqBitmap<D> & o_bitmap ); + MemDqBitmap & o_bitmap ); //############################################################################## //## Nimbus/Centaur Maintenance Command wrappers |

