summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2019-05-10 15:22:30 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2019-06-06 10:06:45 -0500
commitaeb359a820eed2e8eb2ef66b228715de9c966b06 (patch)
treeee2e3f6998a34d5731fa805131c00b6255e1c474 /src/usr
parent415af5749f8fc062e8185ace2e646c217e3bb876 (diff)
downloadtalos-hostboot-aeb359a820eed2e8eb2ef66b228715de9c966b06.tar.gz
talos-hostboot-aeb359a820eed2e8eb2ef66b228715de9c966b06.zip
PRD: Axone MemMark updates
Change-Id: I39a258eb122681f15ea0b3bd85f523d7aba65fae RTC: 207389 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/76006 Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Benjamen G. Tyner <ben.tyner@ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Paul Greenwood <paul.greenwood@ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/78328 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/usr')
-rw-r--r--src/usr/diag/prdf/common/plat/explorer/explorer_ocmb_regs.rule120
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C4
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemMark.C373
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemMark.H22
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C10
-rw-r--r--src/usr/diag/prdf/common/plat/prdfPlatServices_common.C26
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C4
7 files changed, 271 insertions, 288 deletions
diff --git a/src/usr/diag/prdf/common/plat/explorer/explorer_ocmb_regs.rule b/src/usr/diag/prdf/common/plat/explorer/explorer_ocmb_regs.rule
index a4a526124..c302f32cd 100644
--- a/src/usr/diag/prdf/common/plat/explorer/explorer_ocmb_regs.rule
+++ b/src/usr/diag/prdf/common/plat/explorer/explorer_ocmb_regs.rule
@@ -223,3 +223,123 @@
capture group never;
access write_only;
};
+
+ ############################################################################
+ # P9 Hardware Mark Stores
+ ############################################################################
+
+ register HW_MS0
+ {
+ name "P9 Hardware Mark Store rank 0";
+ scomaddr 0x08011C10;
+ capture group default;
+ };
+
+ register HW_MS1
+ {
+ name "P9 Hardware Mark Store rank 1";
+ scomaddr 0x08011C11;
+ capture group default;
+ };
+
+ register HW_MS2
+ {
+ name "P9 Hardware Mark Store rank 2";
+ scomaddr 0x08011C12;
+ capture group default;
+ };
+
+ register HW_MS3
+ {
+ name "P9 Hardware Mark Store rank 3";
+ scomaddr 0x08011C13;
+ capture group default;
+ };
+
+ register HW_MS4
+ {
+ name "P9 Hardware Mark Store rank 4";
+ scomaddr 0x08011C14;
+ capture group default;
+ };
+
+ register HW_MS5
+ {
+ name "P9 Hardware Mark Store rank 5";
+ scomaddr 0x08011C15;
+ capture group default;
+ };
+
+ register HW_MS6
+ {
+ name "P9 Hardware Mark Store rank 6";
+ scomaddr 0x08011C16;
+ capture group default;
+ };
+
+ register HW_MS7
+ {
+ name "P9 Hardware Mark Store rank 7";
+ scomaddr 0x08011C17;
+ capture group default;
+ };
+
+ ############################################################################
+ # P9 Firmware Mark Stores
+ ############################################################################
+
+ register FW_MS0
+ {
+ name "P9 Firmware Mark Store 0";
+ scomaddr 0x08011C18;
+ capture group default;
+ };
+
+ register FW_MS1
+ {
+ name "P9 Firmware Mark Store 1";
+ scomaddr 0x08011C19;
+ capture group default;
+ };
+
+ register FW_MS2
+ {
+ name "P9 Firmware Mark Store 2";
+ scomaddr 0x08011C1A;
+ capture group default;
+ };
+
+ register FW_MS3
+ {
+ name "P9 Firmware Mark Store 3";
+ scomaddr 0x08011C1B;
+ capture group default;
+ };
+
+ register FW_MS4
+ {
+ name "P9 Firmware Mark Store 4";
+ scomaddr 0x08011C1C;
+ capture group default;
+ };
+
+ register FW_MS5
+ {
+ name "P9 Firmware Mark Store 5";
+ scomaddr 0x08011C1D;
+ capture group default;
+ };
+
+ register FW_MS6
+ {
+ name "P9 Firmware Mark Store 6";
+ scomaddr 0x08011C1E;
+ capture group default;
+ };
+
+ register FW_MS7
+ {
+ name "P9 Firmware Mark Store 7";
+ scomaddr 0x08011C1F;
+ capture group default;
+ };
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C
index c7cee2abd..732fa99ce 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C
@@ -220,8 +220,8 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_trgt,
if ( data.rankDataList.size() > 0 )
{
data.header.rankCount = data.rankDataList.size();
- data.header.isEccSp = ( isDramWidthX4( i_trgt ) &&
- (TYPE_MBA == getTargetType(i_trgt)) );
+ data.header.isEccSp = ( (TYPE_MBA == getTargetType(i_trgt)) &&
+ isDramWidthX4( i_trgt ) );
UtilMem dramStream;
dramStream << data;
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
index 98e72cf43..61dd6e548 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
@@ -46,7 +46,7 @@ namespace MarkStore
{
//##############################################################################
-// Utilities to read/write markstore (MCA)
+// Utilities to read/write markstore
//##############################################################################
// - We have the ability to set chip marks via the FWMSx registers, but there
@@ -62,15 +62,19 @@ namespace MarkStore
// mark per master rank. This matches the P8 behavior. This could be improved
// upon later if we have the time, but doubtful.
// - Summary:
-// - Chip marks will use HWMS0-7 registers (0x07010AD0-0x07010AD7).
-// - Symbol marks will use FWMS0-7 registers (0x07010AD8-0x07010ADF).
+// - Chip marks will use HWMS0-7 registers:
+// Nimbus: (0x07010AD0-0x07010AD7)
+// Axone: (0x08011C10-0x08011C17)
+// - Symbol marks will use FWMS0-7 registers:
+// Nimbus: (0x07010AD8-0x07010ADF)
+// Axone: (0x08011C18-0x08011C1F)
// - Each register maps to master ranks 0-7.
-template<>
-uint32_t readChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank, MemMark & o_mark )
+template<TARGETING::TYPE T>
+uint32_t readChipMark( ExtensibleChip * i_chip, const MemRank & i_rank,
+ MemMark & o_mark )
{
- #define PRDF_FUNC "[readChipMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[readChipMark<T>] "
uint32_t o_rc = SUCCESS;
o_mark = MemMark(); // ensure invalid
@@ -110,77 +114,21 @@ uint32_t readChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
-template<>
+template
+uint32_t readChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank, MemMark & o_mark );
+template
uint32_t readChipMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
const MemRank & i_rank,
- MemMark & o_mark )
-{
- #define PRDF_FUNC "[readChipMark<TYPE_OCMB_CHIP>] "
-
- uint32_t o_rc = SUCCESS;
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- /* TODO RTC 207389
- o_mark = MemMark(); // ensure invalid
-
- // get the register name
- char msName[64];
- sprintf( msName, "HW_MS%x", i_rank.getMaster() );
+ MemMark & o_mark );
- // get the mark store register
- SCAN_COMM_REGISTER_CLASS * hwms = i_chip->getRegister( msName );
-
- o_rc = hwms->ForceRead(); // always read latest
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "ForceRead() failed on %s: i_chip=0x%08x",
- msName, i_chip->getHuid() );
- }
- else
- {
- // HWMSx[0:7] contains the Galois field
- uint8_t galois = hwms->GetBitFieldJustified(0,8);
-
- // If the Galois field is zero, do nothing and use the default
- // constructor for o_mark
- if (0 != galois)
- {
- // get the target
- TargetHandle_t trgt = i_chip->getTrgt();
-
- // get the MemMark
- o_mark = MemMark(trgt, i_rank, galois);
- }
- }
- */
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-
-template<>
-uint32_t readChipMark<TYPE_MEM_PORT>( ExtensibleChip * i_chip,
- const MemRank & i_rank,
- MemMark & o_mark )
-{
- #define PRDF_FUNC "[readChipMark<TYPE_MEM_PORT>] "
-
- uint32_t o_rc = SUCCESS;
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- // TODO RTC 207389
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
//------------------------------------------------------------------------------
-template<>
-uint32_t writeChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank,
- const MemMark & i_mark )
+template<TARGETING::TYPE T>
+uint32_t writeChipMark( ExtensibleChip * i_chip, const MemRank & i_rank,
+ const MemMark & i_mark )
{
- #define PRDF_FUNC "[writeChipMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[writeChipMark<T>] "
PRDF_ASSERT( i_mark.isValid() );
@@ -216,13 +164,21 @@ uint32_t writeChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
+template
+uint32_t writeChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ const MemMark & i_mark );
+template
+uint32_t writeChipMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ const MemMark & i_mark );
+
//------------------------------------------------------------------------------
-template<>
-uint32_t clearChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
+template<TARGETING::TYPE T>
+uint32_t clearChipMark( ExtensibleChip * i_chip, const MemRank & i_rank )
{
- #define PRDF_FUNC "[clearChipMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[clearChipMark<T>] "
uint32_t o_rc = SUCCESS;
@@ -248,48 +204,20 @@ uint32_t clearChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
-//------------------------------------------------------------------------------
-
-template<>
+template
+uint32_t clearChipMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank );
+template
uint32_t clearChipMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[clearChipMark<TYPE_OCMB_CHIP>] "
-
- uint32_t o_rc = SUCCESS;
-
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- /* TODO RTC 207389
- // get the register name
- char msName[64];
- sprintf( msName, "HW_MS%x", i_rank.getMaster() );
-
- // get the mark store register
- SCAN_COMM_REGISTER_CLASS * hwms = i_chip->getRegister( msName );
-
- // Clear the entire HWMSx register.
- hwms->clearAllBits();
-
- o_rc = hwms->Write();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Write() failed on %s: i_chip=0x%08x",
- msName, i_chip->getHuid() );
- }
- */
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
+ const MemRank & i_rank );
//------------------------------------------------------------------------------
-template<>
-uint32_t readSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank, MemMark & o_mark )
+template<TARGETING::TYPE T>
+uint32_t readSymbolMark( ExtensibleChip * i_chip,
+ const MemRank & i_rank, MemMark & o_mark )
{
- #define PRDF_FUNC "[readSymbolMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[readSymbolMark<T>] "
uint32_t o_rc = SUCCESS;
o_mark = MemMark(); // ensure invalid
@@ -345,96 +273,21 @@ uint32_t readSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
-template<>
+template
+uint32_t readSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank, MemMark & o_mark );
+template
uint32_t readSymbolMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
const MemRank & i_rank,
- MemMark & o_mark )
-{
- #define PRDF_FUNC "[readSymbolMark<TYPE_OCMB_CHIP>] "
-
- uint32_t o_rc = SUCCESS;
-
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- /* TODO RTC 207389
- o_mark = MemMark(); // ensure invalid
-
- // get the register name
- char msName[64];
- sprintf( msName, "FW_MS%x", i_rank.getMaster() );
-
- // get the mark store register
- SCAN_COMM_REGISTER_CLASS * fwms = i_chip->getRegister( msName );
-
- o_rc = fwms->ForceRead(); // always read latest
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "ForceRead() failed on %s: i_chip=0x%08x",
- msName, i_chip->getHuid() );
- }
- else
- {
- // FWMSx[0:7] contains the Galois field
- uint8_t galois = fwms->GetBitFieldJustified(0,8);
-
- // If the Galois field is zero, do nothing and use the default
- // constructor for o_mark
- if (0 != galois)
- {
- // check other fields for accuracy - assert on failure
-
- // FWMSx[8] should be 1 to indicate a symbol mark.
- PRDF_ASSERT( fwms->IsBitSet(8) );
-
- // FWMSx[9:11] should be 0b101 to indicate master rank.
- PRDF_ASSERT( 0x5 == fwms->GetBitFieldJustified(9,3) );
-
- // FWMSx[12:14] is the master rank and should match the register
- // number.
- PRDF_ASSERT( i_rank.getMaster() ==
- fwms->GetBitFieldJustified(12,3) );
-
- // FWMSx[15:22] should be all zeros
- PRDF_ASSERT( 0x0 == fwms->GetBitFieldJustified(15,8) );
-
- // get the target
- TargetHandle_t trgt = i_chip->getTrgt();
-
- // get the MemMark
- o_mark = MemMark(trgt, i_rank, galois);
- }
- }
- */
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-
-template<>
-uint32_t readSymbolMark<TYPE_MEM_PORT>( ExtensibleChip * i_chip,
- const MemRank & i_rank,
- MemMark & o_mark )
-{
- #define PRDF_FUNC "[readSymbolMark<TYPE_MEM_PORT>] "
-
- uint32_t o_rc = SUCCESS;
-
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- // TODO RTC 207389
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
+ MemMark & o_mark );
//------------------------------------------------------------------------------
-template<>
-uint32_t writeSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank,
- const MemMark & i_mark )
+template<TARGETING::TYPE T>
+uint32_t writeSymbolMark( ExtensibleChip * i_chip, const MemRank & i_rank,
+ const MemMark & i_mark )
{
- #define PRDF_FUNC "[writeSymbolMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[writeSymbolMark<T>] "
PRDF_ASSERT( i_mark.isValid() );
@@ -474,36 +327,47 @@ uint32_t writeSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
msName, i_chip->getHuid() );
}
- // Nimbus symbol mark performance workaround
- // When a symbol mark is placed at runtime
- #ifdef __HOSTBOOT_RUNTIME
+ // Nimbus only symbol mark performance workaround
+ if ( T == TYPE_MCA )
+ {
+ // When a symbol mark is placed at runtime
+ #ifdef __HOSTBOOT_RUNTIME
- // Trigger WAT logic to 'disable bypass'
- // Get the ECC Debug/WAT Control register
- SCAN_COMM_REGISTER_CLASS * dbgr = i_chip->getRegister( "DBGR" );
+ // Trigger WAT logic to 'disable bypass'
+ // Get the ECC Debug/WAT Control register
+ SCAN_COMM_REGISTER_CLASS * dbgr = i_chip->getRegister( "DBGR" );
- // Set DBGR[8] = 0b1
- dbgr->SetBit( 8 );
- o_rc = dbgr->Write();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Write() failed on DBGR: mca=0x%08x",
- i_chip->getHuid() );
+ // Set DBGR[8] = 0b1
+ dbgr->SetBit( 8 );
+ o_rc = dbgr->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Write() failed on DBGR: mca=0x%08x",
+ i_chip->getHuid() );
+ }
+ #endif
}
- #endif
return o_rc;
#undef PRDF_FUNC
}
+template
+uint32_t writeSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ const MemMark & i_mark );
+template
+uint32_t writeSymbolMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ const MemMark & i_mark );
+
//------------------------------------------------------------------------------
-template<>
-uint32_t clearSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
+template<TARGETING::TYPE T>
+uint32_t clearSymbolMark( ExtensibleChip * i_chip, const MemRank & i_rank )
{
- #define PRDF_FUNC "[clearSymbolMark<TYPE_MCA>] "
+ #define PRDF_FUNC "[clearSymbolMark<T>] "
uint32_t o_rc = SUCCESS;
@@ -529,40 +393,12 @@ uint32_t clearSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
-//------------------------------------------------------------------------------
-
-template<>
+template
+uint32_t clearSymbolMark<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank );
+template
uint32_t clearSymbolMark<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[clearSymbolMark<TYPE_OCMB_CHIP>] "
-
- uint32_t o_rc = SUCCESS;
-
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- /* TODO RTC 207389
- // get the register name
- char msName[64];
- sprintf( msName, "FW_MS%x", i_rank.getMaster() );
-
- // get the mark store register
- SCAN_COMM_REGISTER_CLASS * fwms = i_chip->getRegister( msName );
-
- // Clear the entire FWMSx register.
- fwms->clearAllBits();
-
- o_rc = fwms->Write();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Write() failed on %s: i_chip=0x%08x",
- msName, i_chip->getHuid() );
- }
- */
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
+ const MemRank & i_rank );
//##############################################################################
// Utilities to read/write markstore (MBA)
@@ -1364,19 +1200,22 @@ uint32_t __applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
uint32_t o_rc = SUCCESS;
- PRDF_ERR( PRDF_FUNC "Function not supported yet" );
- /* TODO RTC 207389
do
{
const uint8_t ps = i_chipMark.getSymbol().getPortSlct();
const uint8_t dram = i_chipMark.getSymbol().getDram();
- const bool isX4 = isDramWidthX4( i_chip->getTrgt() );
+ ExtensibleChip * memPort = getConnectedChild(i_chip, TYPE_MEM_PORT, ps);
+
+ TargetHandle_t dimmTrgt = getConnectedDimm( memPort->getTrgt(), i_rank,
+ ps );
+
+ const bool isX4 = isDramWidthX4( dimmTrgt );
// Determine if DRAM sparing is enabled.
bool isEnabled = false;
- o_rc = isDramSparingEnabled<TYPE_MBA>( i_chip->getTrgt(), i_rank, ps,
- isEnabled );
+ o_rc = isDramSparingEnabled<TYPE_MEM_PORT>( memPort->getTrgt(), i_rank,
+ ps, isEnabled );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "isDramSparingEnabled() failed." );
@@ -1387,8 +1226,9 @@ uint32_t __applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
{
// Sparing is enabled. Get the current spares in hardware.
MemSymbol sp0, sp1, ecc;
- o_rc = mssGetSteerMux<TARGETING::TYPE_MBA>( i_chip->getTrgt(),
- i_rank, sp0, sp1, ecc );
+ o_rc = mssGetSteerMux<TARGETING::TYPE_OCMB_CHIP>( i_chip->getTrgt(),
+ i_rank, sp0, sp1,
+ ecc );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "mssGetSteerMux(0x%08x,0x%02x) failed",
@@ -1402,8 +1242,9 @@ uint32_t __applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
__addCallout( i_chip, i_rank, ecc, io_sc );
// Add the row repairs to the callout list if they exist
- o_rc = __addRowRepairCallout<TARGETING::TYPE_MBA>( i_chip, i_rank,
- io_sc );
+ o_rc = __addRowRepairCallout<TARGETING::TYPE_MEM_PORT>( memPort,
+ i_rank,
+ io_sc );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "__addRowRepairCallout(0x%08x,0x%02x) "
@@ -1427,19 +1268,19 @@ uint32_t __applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
// Certain DIMMs may have had spares intentially made unavailable by
// the manufacturer. Check the VPD for available spares.
bool spAvail, eccAvail;
- o_rc = isSpareAvailable<TYPE_MBA>( i_chip->getTrgt(), i_rank, ps,
- spAvail, eccAvail );
+ o_rc = isSpareAvailable<TYPE_MEM_PORT>( memPort->getTrgt(), i_rank,
+ ps, spAvail, eccAvail );
if ( spAvail )
{
// A spare DRAM is available.
- o_dsdEvent = new DsdEvent<TYPE_MBA>{ i_chip, i_rank,
- i_chipMark };
+ o_dsdEvent = new DsdEvent<TYPE_OCMB_CHIP>{ i_chip, i_rank,
+ i_chipMark };
}
else if ( eccAvail )
{
// The ECC spare is available.
- o_dsdEvent = new DsdEvent<TYPE_MBA>{ i_chip, i_rank,
- i_chipMark, true };
+ o_dsdEvent = new DsdEvent<TYPE_OCMB_CHIP>{ i_chip, i_rank,
+ i_chipMark, true };
}
else
{
@@ -1459,7 +1300,6 @@ uint32_t __applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
}
} while (0);
- */
return o_rc;
@@ -1571,6 +1411,11 @@ uint32_t applyRasPolicies<TYPE_MBA>( ExtensibleChip * i_chip,
const MemRank & i_rank,
STEP_CODE_DATA_STRUCT & io_sc,
TdEntry * & o_dsdEvent );
+template
+uint32_t applyRasPolicies<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ STEP_CODE_DATA_STRUCT & io_sc,
+ TdEntry * & o_dsdEvent );
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
index 2cd28b8dd..86ffa1dc9 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2018 */
+/* Contributors Listed Below - COPYRIGHT 2016,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -57,7 +57,7 @@ class MemMark
/**
* @brief Constructor from components.
- * @param i_trgt MBA or MCA target.
+ * @param i_trgt MBA, MCA, or OCMB target.
* @param i_rank The rank this mark is on.
* @param i_galois The Galois field.
*/
@@ -68,7 +68,7 @@ class MemMark
/**
* @brief Constructor from components.
- * @param i_trgt MBA or MCA target.
+ * @param i_trgt MBA, MCA, or OCMB target.
* @param i_rank The rank this mark is on.
* @param i_symbol The symbol representing this mark.
*/
@@ -112,7 +112,7 @@ namespace MarkStore
/**
* @brief Reads markstore and returns the chip mark for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @param o_mark The returned chip mark.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
@@ -123,7 +123,7 @@ uint32_t readChipMark( ExtensibleChip * i_chip, const MemRank & i_rank,
/**
* @brief Writes a chip mark into markstore for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @param i_mark Target chip mark.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
@@ -134,7 +134,7 @@ uint32_t writeChipMark( ExtensibleChip * i_chip, const MemRank & i_rank,
/**
* @brief Clear chip mark in markstore for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
*/
@@ -143,7 +143,7 @@ uint32_t clearChipMark( ExtensibleChip * i_chip, const MemRank & i_rank );
/**
* @brief Reads markstore and returns the symbol mark for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA. or OCMB chip.
* @param i_rank Target rank.
* @param o_mark The returned symbol mark.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
@@ -154,7 +154,7 @@ uint32_t readSymbolMark( ExtensibleChip * i_chip, const MemRank & i_rank,
/**
* @brief Writes a symbol mark into markstore for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @param i_mark Target symbol mark.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
@@ -165,7 +165,7 @@ uint32_t writeSymbolMark( ExtensibleChip * i_chip, const MemRank & i_rank,
/**
* @brief Clear symbol mark in markstore for the given rank.
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA. or OCMB chip.
* @param i_rank Target rank.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
*/
@@ -187,7 +187,7 @@ uint32_t clearSymbolMark( ExtensibleChip * i_chip, const MemRank & i_rank );
* repairs have been used.
* - Returns a new DsdEvent if DRAM sparing is available.
*
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @param io_sc The step code data struct.
* @param o_dsdEvent A new DsdEvent if DRAM sparing is available. Otherwise,
@@ -211,7 +211,7 @@ uint32_t applyRasPolicies( ExtensibleChip * i_chip, const MemRank & i_rank,
* - Sets the DRAM in the DRAM Repair VPD if DRAM repairs.
* - Adds a DSD procedure to the TD queue if a DRAM spare is available
*
- * @param i_chip MBA or MCA chip.
+ * @param i_chip MBA, MCA, or OCMB chip.
* @param i_rank Target rank.
* @param io_sc The step code data struct.
* @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
index 8ebe6cea8..becec5abf 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2018 */
+/* Contributors Listed Below - COPYRIGHT 2018,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -126,6 +126,14 @@ uint32_t getRowRepairData<TYPE_MCA>( TargetHandle_t i_dimm,
o_rowRepair );
}
+template<>
+uint32_t getRowRepairData<TYPE_MEM_PORT>( TargetHandle_t i_dimm,
+ const MemRank & i_rank, MemRowRepair & o_rowRepair )
+{
+ return __getRowRepairData<TYPE_MEM_PORT, fapi2::TARGET_TYPE_MEM_PORT>(
+ i_dimm, i_rank, o_rowRepair );
+}
+
//------------------------------------------------------------------------------
template<TARGETING::TYPE T, fapi2::TargetType F>
diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
index 08e7584b3..41ae9ca00 100644
--- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
+++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
@@ -1225,9 +1225,7 @@ uint32_t isDramSparingEnabled<TYPE_MEM_PORT>( TARGETING::TargetHandle_t i_trgt,
}
// Check for any DRAM spares.
- // TODO RTC 207273 - no TARGETING support for attr yet
- //uint8_t cnfg = TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE;
- uint8_t cnfg = 0;
+ uint8_t cnfg = TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE;
o_rc = getDimmSpareConfig<TYPE_MEM_PORT>( i_trgt, i_rank, i_ps, cnfg );
if ( SUCCESS != o_rc )
{
@@ -1235,9 +1233,7 @@ uint32_t isDramSparingEnabled<TYPE_MEM_PORT>( TARGETING::TargetHandle_t i_trgt,
"failed", getHuid(i_trgt), i_rank.getKey(), i_ps );
break;
}
- // TODO RTC 207273 - no TARGETING support for attr yet
- //o_spareEnable = (TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE; != cnfg);
- o_spareEnable = (0 != cnfg);
+ o_spareEnable = (TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE != cnfg);
}while(0);
@@ -1312,12 +1308,22 @@ uint32_t isSpareAvailable( TARGETING::TargetHandle_t i_trgt, MemRank i_rank,
if ( !dramSparingEnabled ) break;
// Get the current spares in hardware
+ TargetHandle_t steerTrgt = i_trgt;
MemSymbol sp0, sp1, ecc;
- o_rc = mssGetSteerMux<T>( i_trgt, i_rank, sp0, sp1, ecc );
+ if ( TYPE_MEM_PORT == T )
+ {
+ steerTrgt = getConnectedParent( i_trgt, TYPE_OCMB_CHIP );
+ o_rc = mssGetSteerMux<TYPE_OCMB_CHIP>( steerTrgt, i_rank, sp0, sp1,
+ ecc );
+ }
+ else
+ {
+ o_rc = mssGetSteerMux<T>( steerTrgt, i_rank, sp0, sp1, ecc );
+ }
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "mssGetSteerMux(0x%08x,0x%02x) failed",
- getHuid(i_trgt), i_rank.getKey() );
+ getHuid(steerTrgt), i_rank.getKey() );
break;
}
@@ -1362,6 +1368,10 @@ template
uint32_t isSpareAvailable<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt,
MemRank i_rank, uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail );
+template
+uint32_t isSpareAvailable<TYPE_MEM_PORT>( TARGETING::TargetHandle_t i_trgt,
+ MemRank i_rank, uint8_t i_ps, bool & o_spAvail, bool & o_eccAvail );
+
//------------------------------------------------------------------------------
template<>
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C
index 356b5b530..35c44e2be 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C
@@ -1514,8 +1514,8 @@ uint32_t MemTdCtlr<TYPE_OCMB_CHIP>::handleRrFo()
// Get the chip mark
MemMark chipMark;
- o_rc = MarkStore::readChipMark<TYPE_MEM_PORT>( memPortChip, rank,
- chipMark );
+ o_rc = MarkStore::readChipMark<TYPE_OCMB_CHIP>( iv_chip, rank,
+ chipMark );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "readChipMark<TYPE_MEM_PORT>(0x%08x,%d) "
OpenPOWER on IntegriCloud