summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Derksen <mderkse1@us.ibm.com>2018-04-26 13:02:55 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-05-03 14:24:16 -0400
commit1a9f2e8e5db5497cfbdd7efc119c4b3946ee87af (patch)
treee6d0037254bb553cf7457d45e0ec7db86952b4ea
parentd49ca4437a5ab88ce244ca0124afbbd90c31158d (diff)
downloadtalos-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.C334
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H4
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 );
OpenPOWER on IntegriCloud