diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2018-04-26 13:02:55 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-05-03 14:24:16 -0400 |
commit | 1a9f2e8e5db5497cfbdd7efc119c4b3946ee87af (patch) | |
tree | e6d0037254bb553cf7457d45e0ec7db86952b4ea | |
parent | d49ca4437a5ab88ce244ca0124afbbd90c31158d (diff) | |
download | talos-hostboot-1a9f2e8e5db5497cfbdd7efc119c4b3946ee87af.tar.gz talos-hostboot-1a9f2e8e5db5497cfbdd7efc119c4b3946ee87af.zip |
Update captureRepairsData and captureDramRepairsVPD for Cumulus
Change-Id: I256ed133ff164e274185f05ed904bea6a11a7cdb
RTC:178911
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57908
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
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>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C | 334 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H | 4 |
2 files changed, 91 insertions, 247 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C index 6a4c16964..60a1bcdc9 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C @@ -40,6 +40,8 @@ #include <prdfPlatServices.H> #include <prdfP9McaDataBundle.H> + + using namespace TARGETING; namespace PRDF @@ -138,133 +140,34 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ) //------------------------------------------------------------------------------ -template<> -void captureDramRepairsData<TYPE_MCA>( TARGETING::TargetHandle_t i_trgt, - CaptureData & io_cd ) +template<TARGETING::TYPE T> +void captureDramRepairsData( TARGETING::TargetHandle_t i_trgt, + CaptureData & io_cd ) { - #define PRDF_FUNC "[captureDramRepairsData<TYPE_MCA>] " + #define PRDF_FUNC "[captureDramRepairsData] " int32_t rc = SUCCESS; - DramRepairUsrData mcaData; - mcaData.header.isSpareDram = false; + DramRepairUsrData data; + data.header.isSpareDram = false; - ExtensibleChip * mcaChip = (ExtensibleChip *)systemPtr->GetChip( i_trgt ); + ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip( i_trgt ); std::vector<MemRank> masterRanks; do { - getMasterRanks<TYPE_MCA>( i_trgt, masterRanks ); + getMasterRanks<T>( i_trgt, masterRanks ); if( masterRanks.empty() ) { PRDF_ERR( PRDF_FUNC "Master Rank list size is 0"); break; } - // Iterate all ranks to get DRAM repair data - for ( auto & rank : masterRanks ) - { - // Get chip/symbol marks - MemMark cm, sm; - rc = MarkStore::readChipMark<TYPE_MCA>( mcaChip, rank, cm ); - if ( SUCCESS != rc ) - { - PRDF_ERR( PRDF_FUNC "readChipMark<TYPE_MCA>(0x%08x,0x%02x) " - "failed", mcaChip->getHuid(), rank.getKey() ); - continue; - } - - rc = MarkStore::readSymbolMark<TYPE_MCA>( mcaChip, rank, sm ); - if ( SUCCESS != rc ) - { - PRDF_ERR( PRDF_FUNC "readSymbolMark<TYPE_MCA>(0x%08x,0x%02x) " - "failed", mcaChip->getHuid(), rank.getKey() ); - continue; - } - - if ( cm.isValid() && sm.isValid() ) - { - // Add data - DramRepairRankData rankData = { rank.getMaster(), - cm.getSymbol().getSymbol(), - sm.getSymbol().getSymbol() }; - mcaData.rankDataList.push_back(rankData); - } - } - // If MCA had some DRAM repair data, add header information - if( mcaData.rankDataList.size() > 0 ) - { - mcaData.header.rankCount = mcaData.rankDataList.size(); - mcaData.header.isX4Dram = isDramWidthX4( i_trgt ); - UtilMem dramStream; - dramStream << mcaData; - - // TODO RTC 179854 - #ifndef PPC - // Fix endianness issues with non PPC machines. - // This is a workaround. Though UtilMem takes care of endianness, - // It seems with capture data its not working - const size_t sz_word = sizeof(uint32_t); - - // Align data with 32 bit boundary - for (uint32_t i = 0; i < ( dramStream.size()%sz_word ); i++) - { - uint8_t dummy = 0; - dramStream << dummy; - } - for ( uint32_t i = 0; i < ( dramStream.size()/sz_word); i++ ) - { - ((uint32_t*)dramStream.base())[i] = - htonl(((uint32_t*)dramStream.base())[i]); - } - #endif - // Allocate space for the capture data. - BitString dramRepairData ( ( dramStream.size() )*8, - (CPU_WORD *) dramStream.base() ); - io_cd.Add( i_trgt, Util::hashString("DRAM_REPAIRS_DATA"), - dramRepairData ); - } - }while(0); - - if( FAIL == rc ) - PRDF_ERR( PRDF_FUNC "Failed for MCA 0x%08X", getHuid( i_trgt ) ); - - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -template<> -void captureDramRepairsData<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt, - CaptureData & io_cd ) -{ - #define PRDF_FUNC "[CenMbaCaptureData::captureDramRepairsData] " - /* TODO RTC 178911 - using namespace fapi; // for spare config - - int32_t rc = SUCCESS; - DramRepairMbaData mbaData; - - mbaData.header.isSpareDram = false; - std::vector<CenRank> masterRanks; - - do - { - rc = getMasterRanks( i_mbaTrgt, masterRanks ); - if ( SUCCESS != rc ) - { - PRDF_ERR( PRDF_FUNC "getMasterRanks() failed" ); - break; - } - if( masterRanks.empty() ) - { - PRDF_ERR( PRDF_FUNC "Master Rank list size is 0"); - break;; - } +/* TODO: 189221 uint8_t spareConfig = ENUM_ATTR_VPD_DIMM_SPARE_NO_SPARE; // check for spare DRAM. Port does not matter. // Also this configuration is same for all ranks on MBA. - rc = getDimmSpareConfig( i_mbaTrgt, masterRanks[0], 0, spareConfig ); + rc = getDimmSpareConfig( i_trgt, masterRanks[0], 0, spareConfig ); if( SUCCESS != rc ) { PRDF_ERR( PRDF_FUNC "getDimmSpareConfig() failed" ); @@ -272,50 +175,62 @@ void captureDramRepairsData<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt, } if( ENUM_ATTR_VPD_DIMM_SPARE_NO_SPARE != spareConfig ) - mbaData.header.isSpareDram = true; + data.header.isSpareDram = true; +*/ // Iterate all ranks to get DRAM repair data - for ( std::vector<CenRank>::iterator it = masterRanks.begin(); - it != masterRanks.end(); it++ ) + for ( auto & rank : masterRanks ) { // Get chip/symbol marks - CenMark mark; - rc = mssGetMarkStore( i_mbaTrgt, *it, mark ); + MemMark cm, sm; + rc = MarkStore::readChipMark<T>( chip, rank, cm ); if ( SUCCESS != rc ) { - PRDF_ERR( PRDF_FUNC "mssGetMarkStore() Failed"); + PRDF_ERR( PRDF_FUNC "readChipMark<T>(0x%08x,0x%02x) " + "failed", chip->getHuid(), rank.getKey() ); + continue; + } + + rc = MarkStore::readSymbolMark<T>( chip, rank, sm ); + if ( SUCCESS != rc ) + { + PRDF_ERR( PRDF_FUNC "readSymbolMark<T>(0x%08x,0x%02x) " + "failed", chip->getHuid(), rank.getKey() ); continue; } // Get DRAM spares - CenSymbol sp0, sp1, ecc; - rc = mssGetSteerMux( i_mbaTrgt, *it, sp0, sp1, ecc ); + MemSymbol sp0, sp1, ecc; +/* TODO: 189221 + rc = mssGetSteerMux( i_trgt, rank, sp0, sp1, ecc ); if ( SUCCESS != rc ) { PRDF_ERR( PRDF_FUNC "mssGetSteerMux() failed"); continue; } - +*/ // Add data - DramRepairRankData rankData = { (*it).getMaster(), - mark.getCM().getSymbol(), - mark.getSM().getSymbol(), - sp0.getSymbol(), - sp1.getSymbol(), - ecc.getSymbol() }; + DramRepairRankData rankData = { rank.getMaster(), + cm.getSymbol().getSymbol(), + sm.getSymbol().getSymbol(), + sp0.getSymbol(), + sp1.getSymbol(), + ecc.getSymbol() }; if ( rankData.valid() ) { - mbaData.rankDataList.push_back(rankData); + data.rankDataList.push_back(rankData); } } - // If MBA had some DRAM repair data, add header information - if( mbaData.rankDataList.size() > 0 ) + + // If data exists, add header information. + if ( data.rankDataList.size() > 0 ) { - mbaData.header.rankCount = mbaData.rankDataList.size(); - mbaData.header.isX4Dram = isDramWidthX4( i_mbaTrgt ); + data.header.rankCount = data.rankDataList.size(); + data.header.isX4Dram = isDramWidthX4( i_trgt ); UtilMem dramStream; - dramStream << mbaData; + dramStream << data; + // TODO RTC 179854 #ifndef PPC // Fix endianness issues with non PPC machines. // This is a workaround. Though UtilMem takes care of endianness, @@ -325,46 +240,52 @@ void captureDramRepairsData<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt, // Align data with 32 bit boundary for (uint32_t i = 0; i < ( dramStream.size()%sz_word ); i++) { - uint8_t dummy = 0; - dramStream << dummy; + uint8_t dummy = 0; + dramStream << dummy; } + for ( uint32_t i = 0; i < ( dramStream.size()/sz_word); i++ ) { - ((uint32_t*)dramStream.base())[i] = - htonl(((uint32_t*)dramStream.base())[i]); + ((uint32_t*)dramStream.base())[i] = + htonl(((uint32_t*)dramStream.base())[i]); } #endif // Allocate space for the capture data. BitString dramRepairData ( ( dramStream.size() )*8, - (CPU_WORD *) dramStream.base() ); - io_cd.Add( i_mbaTrgt, Util::hashString("DRAM_REPAIRS_DATA"), + (CPU_WORD *) dramStream.base() ); + + io_cd.Add( i_trgt, Util::hashString("DRAM_REPAIRS_DATA"), dramRepairData ); - } - }while(0); - if( FAIL == rc ) - PRDF_ERR( PRDF_FUNC "Failed for MBA 0x%08X", getHuid( i_mbaTrgt ) );*/ + } + } while (0); + + if ( FAIL == rc ) + { + PRDF_ERR( PRDF_FUNC "Failed on 0x%08X", getHuid( i_trgt ) ); + } #undef PRDF_FUNC } + //------------------------------------------------------------------------------ -template<> -void captureDramRepairsVpd<TYPE_MCA>(TargetHandle_t i_trgt, CaptureData & io_cd) +template<TARGETING::TYPE T, DIMMS_PER_RANK D> +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 = MCA_DIMMS_PER_RANK * DQ_BITMAP::BITMAP_SIZE; + static const size_t sz_entry = D * DQ_BITMAP::BITMAP_SIZE; static const size_t sz_word = sizeof(CPU_WORD); do { std::vector<MemRank> masterRanks; - getMasterRanks<TYPE_MCA>( i_trgt, masterRanks ); + getMasterRanks<T>( i_trgt, masterRanks ); if( masterRanks.empty() ) { PRDF_ERR( PRDF_FUNC "Master Rank list size is 0"); @@ -385,10 +306,9 @@ void captureDramRepairsVpd<TYPE_MCA>(TargetHandle_t i_trgt, CaptureData & io_cd) uint32_t idx = 0; for ( auto & rank : masterRanks ) { - MemDqBitmap<DIMMS_PER_RANK::MCA> bitmap; + MemDqBitmap<D> bitmap; - if ( SUCCESS != getBadDqBitmap<DIMMS_PER_RANK::MCA>(i_trgt, rank, - bitmap) ) + if ( SUCCESS != getBadDqBitmap<D>(i_trgt, rank, bitmap) ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed: MCA=0x%08x" " rank=0x%02x", getHuid(i_trgt), rank.getKey() ); @@ -426,90 +346,6 @@ void captureDramRepairsVpd<TYPE_MCA>(TargetHandle_t i_trgt, CaptureData & io_cd) //------------------------------------------------------------------------------ template<> -void captureDramRepairsVpd<TYPE_MBA>(TargetHandle_t i_trgt, CaptureData & io_cd) -{ - #define PRDF_FUNC "[captureDramRepairsVpd] " - - // Get the maximum capture data size. - /* TODO RTC 178911 - static const size_t sz_rank = sizeof(uint8_t); - static const size_t sz_entry = MBA_DIMMS_PER_RANK * DIMM_DQ_RANK_BITMAP_SIZE; - static const size_t sz_word = sizeof(CPU_WORD); - int32_t rc = SUCCESS; - - do - { - std::vector<CenRank> masterRanks; - rc = getMasterRanks( i_mbaTrgt, masterRanks ); - if ( SUCCESS != rc ) - { - PRDF_ERR( PRDF_FUNC "getMasterRanks() failed" ); - break; - } - - if( masterRanks.empty() ) - { - PRDF_ERR( PRDF_FUNC "Master Rank list size is 0"); - break; - } - - // Get the maximum capture data size. - size_t sz_maxData = masterRanks.size() * (sz_rank + sz_entry); - - // Adjust the size for endianness. - sz_maxData = ((sz_maxData + sz_word-1) / sz_word) * sz_word; - - // Initialize to 0. - uint8_t capData[sz_maxData]; - memset( capData, 0x00, sz_maxData ); - - // Iterate all ranks to get VPD data - uint32_t idx = 0; - for ( std::vector<CenRank>::iterator it = masterRanks.begin(); - it != masterRanks.end(); it++ ) - { - CenDqBitmap bitmap; - uint8_t rank = it->getMaster(); - - if ( SUCCESS != getBadDqBitmap(i_mbaTrgt, *it, bitmap, true) ) - { - PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed: MBA=0x%08x" - " rank=%d", getHuid(i_mbaTrgt), rank ); - continue; // skip this rank - } - - if ( bitmap.badDqs() ) // make sure the data is non-zero - { - // Add the rank, then the entry data. - capData[idx] = rank; idx += sz_rank; - memcpy(&capData[idx], bitmap.getData(), sz_entry); - idx += sz_entry; - } - } - - if( 0 == idx ) break; // Nothing to capture - - // Fix endianness issues with non PPC machines. - size_t sz_capData = idx; - sz_capData = ((sz_capData + sz_word-1) / sz_word) * sz_word; - for ( uint32_t i = 0; i < (sz_capData/sz_word); i++ ) - ((CPU_WORD*)capData)[i] = htonl(((CPU_WORD*)capData)[i]); - - // Add data to capture data. - BitString bs ( sz_capData*8, (CPU_WORD *) &capData ); - io_cd.Add( i_mbaTrgt, Util::hashString("DRAM_REPAIRS_VPD"), bs ); - - }while(0); - - if( FAIL == rc ) - PRDF_ERR( PRDF_FUNC "Failed for MBA 0x%08X", getHuid( i_mbaTrgt ) );*/ - - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -template<> void captureIueCounts<McaDataBundle*>( TARGETING::TargetHandle_t i_trgt, McaDataBundle * i_db, CaptureData & io_cd ) @@ -551,7 +387,7 @@ void addEccData<TYPE_MCA>( ExtensibleChip * i_chip, captureDramRepairsData<TYPE_MCA>( trgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MCA>( trgt, cd ); + captureDramRepairsVpd<TYPE_MCA, DIMMS_PER_RANK::MCA>( trgt, cd ); // Add IUE counts to capture data. captureIueCounts<McaDataBundle*>( trgt, db, cd ); @@ -592,36 +428,44 @@ void addEccData<TYPE_MBA>( ExtensibleChip * i_chip, // Add RCE table to capture data. db->iv_rceTable.addCapData( cd ); -/* TODO: RTC 157888 // Add DRAM repairs data from hardware. - captureDramRepairsData( i_chip->getTrgt(), cd ); + captureDramRepairsData<TYPE_MBA>( i_chip->getTrgt(), cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd( i_chip->getTrgt(), cd ); -*/ + captureDramRepairsVpd<TYPE_MBA, DIMMS_PER_RANK::MBA>(i_chip->getTrgt(), cd); + } //------------------------------------------------------------------------------ -template<TARGETING::TYPE T> -void addEccData( TargetHandle_t i_trgt, errlHndl_t io_errl ) +template<> +void addEccData<TYPE_MCA>( TargetHandle_t i_trgt, errlHndl_t io_errl ) +{ + CaptureData cd; + + // Add DRAM repairs data from hardware. + captureDramRepairsData<TYPE_MCA>( i_trgt, cd ); + + // Add DRAM repairs data from VPD. + captureDramRepairsVpd<TYPE_MCA, DIMMS_PER_RANK::MCA>( i_trgt, cd ); + + ErrDataService::AddCapData( cd, io_errl ); +} + +template<> +void addEccData<TYPE_MBA>( TargetHandle_t i_trgt, errlHndl_t io_errl ) { CaptureData cd; // Add DRAM repairs data from hardware. - captureDramRepairsData<T>( i_trgt, cd ); + captureDramRepairsData<TYPE_MBA>( i_trgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<T>( i_trgt, cd ); + captureDramRepairsVpd<TYPE_MBA, DIMMS_PER_RANK::MBA>( i_trgt, cd ); ErrDataService::AddCapData( cd, io_errl ); } -// To resolve template linker errors. -template -void addEccData<TYPE_MCA>( TargetHandle_t i_trgt, errlHndl_t io_errl ); -template -void addEccData<TYPE_MBA>( TargetHandle_t i_trgt, errlHndl_t io_errl ); //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H index 423a29de7..a8aa0c6be 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,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -86,7 +86,7 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_trgt, * capture data struct. Other functions can call this function and * update the error log. */ -template<TARGETING::TYPE T> +template<TARGETING::TYPE T, DIMMS_PER_RANK D> void captureDramRepairsVpd( TARGETING::TargetHandle_t i_trgt, CaptureData & io_cd ); |