summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2018-12-06 09:35:18 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2019-01-15 14:36:20 -0600
commit451596eb83df36f128b80153d173d8dbcbde741c (patch)
treeccafac92c71d2fe2bedd16dac5346a25a644eb80 /src
parentf5dd1c1283bad3f20c6d791f9f0fc5658a360163 (diff)
downloadblackbird-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')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C38
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.H8
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemConst.H15
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C475
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H73
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C9
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemMark.C4
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C6
-rw-r--r--src/usr/diag/prdf/common/plat/prdfPlatServices_common.C145
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfPlatServices_common.H20
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.H11
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfMemLogParse.C37
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfParserEnums.H7
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfParserUtils.C17
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C9
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C26
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C77
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C56
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_ipl.C14
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_ipl.H5
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
OpenPOWER on IntegriCloud