diff --git a/src/usr/diag/prdf/common/plat/explorer/prdfExplorerPlugins_common.C b/src/usr/diag/prdf/common/plat/explorer/prdfExplorerPlugins_common.C index e70bfea8fd5..69d63b34557 100644 --- a/src/usr/diag/prdf/common/plat/explorer/prdfExplorerPlugins_common.C +++ b/src/usr/diag/prdf/common/plat/explorer/prdfExplorerPlugins_common.C @@ -241,18 +241,18 @@ int32_t RdfRcdParityError( ExtensibleChip * i_chip, if ( rdffir->IsBitSet(40) ) { // callout MEM_PORT on 1st occurrence - ExtensibleChip * memPort = - getConnectedChild( i_chip, TYPE_MEM_PORT, 0 ); - io_sc.service_data->SetCallout( memPort->getTrgt() ); + TargetHandle_t memPort = + getConnectedChild( i_chip->getTrgt(), TYPE_MEM_PORT, 0 ); + io_sc.service_data->SetCallout( memPort ); } // Else this is 'confirmed RCD parity error' case else { // callout DIMM high priority, MEM_PORT low on 1st occurrence CalloutAttachedDimmsHigh( i_chip, io_sc ); - ExtensibleChip * memPort = - getConnectedChild( i_chip, TYPE_MEM_PORT, 0 ); - io_sc.service_data->SetCallout( memPort->getTrgt(), MRU_LOW ); + TargetHandle_t memPort = + getConnectedChild( i_chip->getTrgt(), TYPE_MEM_PORT, 0 ); + io_sc.service_data->SetCallout( memPort, MRU_LOW ); } // Mask bit 40 as well diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C index 5cf6a75a497..b913b6c187e 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C @@ -611,93 +611,6 @@ uint32_t getMcbistMaintPort( ExtensibleChip * i_mcbChip, #undef PRDF_FUNC } -//------------------------------------------------------------------------------ - -template<> -uint32_t getMcbistMaintPort( ExtensibleChip * i_ocmbChip, - ExtensibleChipList & o_portList ) -{ - #define PRDF_FUNC "[getMcbistMaintPort] " - - // Check parameters - PRDF_ASSERT( nullptr != i_ocmbChip ); - PRDF_ASSERT( TYPE_OCMB_CHIP == i_ocmbChip->getType() ); - - uint32_t o_rc = SUCCESS; - - o_portList.clear(); - - SCAN_COMM_REGISTER_CLASS * mcbagra = i_ocmbChip->getRegister( "MCBAGRA" ); - SCAN_COMM_REGISTER_CLASS * mcbmcat = i_ocmbChip->getRegister( "MCBMCAT" ); - SCAN_COMM_REGISTER_CLASS * mcb_cntl = i_ocmbChip->getRegister( "MCB_CNTL" ); - - do - { - o_rc = mcbagra->Read(); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "Read() failed on MCBAGRA: i_ocmbChip=0x%08x", - i_ocmbChip->getHuid() ); - break; - } - - // Get a mask of all ports in which the command was executed. Use - // MCB_CNTL[2:5] only if MCBAGRA[10] is b0 OR MCBAGRA[10:11] is b11. - // Otherwise, use MCBMCAT[38:39]. - uint8_t portMask = 0; - if ( !mcbagra->IsBitSet(10) || mcbagra->IsBitSet(11) ) // broadcast mode - { - o_rc = mcb_cntl->Read(); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "Read() failed on MCB_CNTL: " - "i_ocmbChip=0x%08x", i_ocmbChip->getHuid() ); - break; - } - - portMask = mcb_cntl->GetBitFieldJustified( 2, 4 ); - } - else // non-broadcast mode - { - o_rc = mcbmcat->Read(); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "Read() failed on MCBMCAT: " - "i_ocmbChip=0x%08x", i_ocmbChip->getHuid() ); - break; - } - - portMask = 0x8 >> mcbmcat->GetBitFieldJustified( 38, 2 ); - } - - // Get MEM_PORTs from all targeted ports. - ExtensibleChipList portList = getConnected( i_ocmbChip, TYPE_MEM_PORT ); - for ( auto & port : portList ) - { - // Get the MEM_PORT position relative to the OCMB - uint8_t portRelPos = port->getTrgt()->getAttr(); - - // If the port wasn't targeted by the command, skip to next port - if ( 0 == (portMask & (0x8 >> portRelPos)) ) continue; - - o_portList.push_back( port ); - } - - // The list should never be empty. - size_t sz_list = o_portList.size(); - if ( 0 == sz_list ) - { - PRDF_ERR( PRDF_FUNC "o_portList is empty: i_ocmbChip=0x%08x " - "portMask=0x%0x", i_ocmbChip->getHuid(), portMask ); - PRDF_ASSERT( false ); // mcbist functional but no configured ports - } - - } while (0); - - return o_rc; - - #undef PRDF_FUNC -} #endif //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C index e3da2e95251..25db47d64b0 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C @@ -535,25 +535,27 @@ void addEccData( ExtensibleChip * i_chip, } template<> -void addEccData( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) +void addEccData( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) { - PRDF_ASSERT( TYPE_MEM_PORT == i_chip->getType() ); + PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() ); CaptureData & cd = io_sc.service_data->GetCaptureData(); - - TargetHandle_t trgt = i_chip->getTrgt(); - ExtensibleChip * ocmb = getConnectedParent( i_chip, TYPE_OCMB_CHIP ); - OcmbDataBundle * db = getOcmbDataBundle( ocmb ); + OcmbDataBundle * db = getOcmbDataBundle( i_chip ); + TargetHandle_t ocmbTrgt = i_chip->getTrgt(); // Add DRAM repairs data from hardware. - captureDramRepairsData( ocmb->getTrgt(), cd ); + captureDramRepairsData( ocmbTrgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd( trgt, cd ); + // TODO RTC 210072 - Explorer only has one port, however, multiple ports + // will be supported in the future. Updates will need to be made here so we + // can get the relevant port. + TargetHandle_t memPort = getConnectedChild( ocmbTrgt, TYPE_MEM_PORT, 0 ); + captureDramRepairsVpd( memPort, cd ); // Add IUE counts to capture data. - captureIueCounts( ocmb->getTrgt(), db, cd ); + captureIueCounts( ocmbTrgt, db, cd ); // Add CE table to capture data. db->iv_ceTable.addCapData( cd ); @@ -562,17 +564,6 @@ void addEccData( ExtensibleChip * i_chip, db->iv_ueTable.addCapData( cd ); } -template<> -void addEccData( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() ); - - // Add data for each connected MEM_PORT. - ExtensibleChipList list = getConnected( i_chip, TYPE_MEM_PORT ); - for ( auto & port : list ) { addEccData(port, io_sc); } -} - template<> void addEccData( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc ) @@ -635,6 +626,26 @@ void addEccData( TargetHandle_t i_trgt, errlHndl_t io_errl ) ErrDataService::AddCapData( cd, io_errl ); } +template<> +void addEccData( TargetHandle_t i_trgt, + errlHndl_t io_errl ) +{ + PRDF_ASSERT( TYPE_OCMB_CHIP == getTargetType(i_trgt) ); + + CaptureData cd; + + // Add DRAM repairs data from hardware. + captureDramRepairsData( i_trgt, cd ); + + // Add DRAM repairs data from VPD. + // TODO RTC 210072 - Explorer only has one port, however, multiple ports + // will be supported in the future. Updates will need to be made here so we + // can get the relevant port. + TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 ); + captureDramRepairsVpd( memPort, cd ); + + ErrDataService::AddCapData( cd, io_errl ); +} //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C index 308e25dabc7..10f7125ddce 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C @@ -700,7 +700,7 @@ uint32_t MemDqBitmap::setEccSpare( uint8_t i_pins ) // Utility Functions //############################################################################## -uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, +uint32_t setDramInVpd( TargetHandle_t i_trgt, const MemRank & i_rank, MemSymbol i_symbol ) { #define PRDF_FUNC "[MemDqBitmap::__setDramInVpd] " @@ -709,14 +709,12 @@ uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, do { - TARGETING::TargetHandle_t trgt = i_chip->getTrgt(); - MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap( trgt, i_rank, dqBitmap ); + o_rc = getBadDqBitmap( i_trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, 0x%02x) failed.", - getHuid(trgt), i_rank.getKey() ); + getHuid(i_trgt), i_rank.getKey() ); break; } @@ -727,11 +725,11 @@ uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, break; } - o_rc = setBadDqBitmap( trgt, i_rank, dqBitmap ); + o_rc = setBadDqBitmap( i_trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x, 0x%02x) failed.", - getHuid(trgt), i_rank.getKey() ); + getHuid(i_trgt), i_rank.getKey() ); break; } }while(0); @@ -743,7 +741,7 @@ uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, //------------------------------------------------------------------------------ -uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, +uint32_t clearDramInVpd( TargetHandle_t i_trgt, const MemRank & i_rank, MemSymbol i_symbol ) { #define PRDF_FUNC "[MemDqBitmap::__clearDramInVpd] " @@ -752,14 +750,12 @@ uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, do { - TARGETING::TargetHandle_t trgt = i_chip->getTrgt(); - MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap( trgt, i_rank, dqBitmap ); + o_rc = getBadDqBitmap( i_trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, 0x%02x) failed.", - getHuid(trgt), i_rank.getKey() ); + getHuid(i_trgt), i_rank.getKey() ); break; } @@ -770,11 +766,11 @@ uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, break; } - o_rc = setBadDqBitmap( trgt, i_rank, dqBitmap ); + o_rc = setBadDqBitmap( i_trgt, i_rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap(0x%08x, 0x%02x) failed.", - getHuid(trgt), i_rank.getKey() ); + getHuid(i_trgt), i_rank.getKey() ); break; } }while(0); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H index 5d96aadfdfb..9ba92743215 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H @@ -250,20 +250,21 @@ class MemDqBitmap /** * @brief Sets the inputted dram in DRAM repairs VPD. - * @param i_chip MBA or MCA chip. + * @param i_trgt MBA, MCA, MEM_PORT, or OCMB chip. * @param i_rank Target rank. * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise. */ -uint32_t setDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, +uint32_t setDramInVpd( TARGETING::TargetHandle_t i_trgt, const MemRank & i_rank, MemSymbol i_symbol ); /** * @brief Clears the inputted dram in DRAM repairs VPD. - * @param i_chip MBA or MCA chip. + * @param i_trgt MBA, MCA, MEM_PORT, or OCMB chip. * @param i_rank Target rank. * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise. */ -uint32_t clearDramInVpd( ExtensibleChip * i_chip, const MemRank & i_rank, +uint32_t clearDramInVpd( TARGETING::TargetHandle_t i_trgt, + const MemRank & i_rank, MemSymbol i_symbol ); } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C index e0b54ab31c7..4aff52acd86 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C @@ -1009,7 +1009,7 @@ void __addCallout( ExtensibleChip * i_chip, const MemRank & i_rank, //------------------------------------------------------------------------------ template -uint32_t __addRowRepairCallout( ExtensibleChip * i_chip, +uint32_t __addRowRepairCallout( TargetHandle_t i_trgt, const MemRank & i_rank, STEP_CODE_DATA_STRUCT & io_sc ) { @@ -1018,7 +1018,7 @@ uint32_t __addRowRepairCallout( ExtensibleChip * i_chip, uint32_t o_rc = SUCCESS; // Get the dimms on this rank on either port. - TargetHandleList dimmList = getConnectedDimms( i_chip->getTrgt(), i_rank ); + TargetHandleList dimmList = getConnectedDimms( i_trgt, i_rank ); // Check for row repairs on each dimm. for ( auto const & dimm : dimmList ) @@ -1124,8 +1124,8 @@ uint32_t __applyRasPolicies( 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( i_chip, i_rank, - io_sc ); + o_rc = __addRowRepairCallout( + i_chip->getTrgt(), i_rank, io_sc ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "__addRowRepairCallout(0x%08x,0x%02x) " @@ -1205,17 +1205,17 @@ uint32_t __applyRasPolicies( ExtensibleChip * i_chip, const uint8_t ps = i_chipMark.getSymbol().getPortSlct(); const uint8_t dram = i_chipMark.getSymbol().getDram(); - ExtensibleChip * memPort = getConnectedChild(i_chip, TYPE_MEM_PORT, ps); + TargetHandle_t memPort = getConnectedChild( i_chip->getTrgt(), + TYPE_MEM_PORT, ps ); - TargetHandle_t dimmTrgt = getConnectedDimm( memPort->getTrgt(), i_rank, - ps ); + TargetHandle_t dimmTrgt = getConnectedDimm( memPort, i_rank, ps ); const bool isX4 = isDramWidthX4( dimmTrgt ); // Determine if DRAM sparing is enabled. bool isEnabled = false; - o_rc = isDramSparingEnabled( memPort->getTrgt(), i_rank, - ps, isEnabled ); + o_rc = isDramSparingEnabled( memPort, i_rank, ps, + isEnabled ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "isDramSparingEnabled() failed." ); @@ -1268,7 +1268,7 @@ uint32_t __applyRasPolicies( 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( memPort->getTrgt(), i_rank, + o_rc = isSpareAvailable( memPort, i_rank, ps, spAvail, eccAvail ); if ( spAvail ) { @@ -1470,13 +1470,14 @@ uint32_t chipMarkCleanup( ExtensibleChip * i_chip, const MemRank & i_rank, { if ( TYPE_OCMB_CHIP == i_chip->getType() ) { - ExtensibleChip * memPort = getConnectedChild( i_chip, + TargetHandle_t memPort = getConnectedChild( i_chip->getTrgt(), TYPE_MEM_PORT, chipMark.getSymbol().getPortSlct() ); o_rc = setDramInVpd( memPort, i_rank, chipMark.getSymbol() ); } else { - o_rc = setDramInVpd( i_chip, i_rank, chipMark.getSymbol() ); + o_rc = setDramInVpd( i_chip->getTrgt(), i_rank, + chipMark.getSymbol() ); } if ( SUCCESS != o_rc ) { diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemThresholds.C b/src/usr/diag/prdf/common/plat/mem/prdfMemThresholds.C index c59fa36578f..6ad8a724a4e 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemThresholds.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemThresholds.C @@ -173,7 +173,8 @@ void getMnfgMemCeTh( ExtensibleChip * i_chip, const MemRank & i_rank, else { // Get DRAM size - uint8_t size = MemUtils::getDramSize( i_chip, i_rank.getDimmSlct() ); + uint8_t size = MemUtils::getDramSize( i_chip->getTrgt(), + i_rank.getDimmSlct() ); // Get number of ranks per DIMM select. uint8_t rankCount = getNumRanksPerDimm( i_chip->getTrgt(), diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C index 4d96de65ebc..1f9037ee927 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C @@ -31,7 +31,9 @@ // Framework includes #include +#include #include +#include #include // Platform includes @@ -517,19 +519,18 @@ int32_t collectCeStats( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ template<> -uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize( TargetHandle_t i_trgt, uint8_t i_dimmSlct ) { #define PRDF_FUNC "[MemUtils::getDramSize] " - PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + PRDF_ASSERT( TYPE_MCA == getTargetType(i_trgt) ); PRDF_ASSERT( i_dimmSlct < DIMM_SLCT_PER_PORT ); - TargetHandle_t mcaTrgt = i_chip->getTrgt(); - TargetHandle_t mcsTrgt = getConnectedParent( mcaTrgt, TYPE_MCS ); + TargetHandle_t mcsTrgt = getConnectedParent( i_trgt, TYPE_MCS ); PRDF_ASSERT( nullptr != mcsTrgt ); - uint8_t mcaRelPos = i_chip->getPos() % MAX_MCA_PER_MCS; + uint8_t mcaRelPos = getTargetPosition(i_trgt) % MAX_MCA_PER_MCS; uint8_t tmp[MAX_MCA_PER_MCS][DIMM_SLCT_PER_PORT]; @@ -545,19 +546,22 @@ uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize( TargetHandle_t i_trgt, uint8_t i_dimmSlct ) { #define PRDF_FUNC "[MemUtils::getDramSize] " - PRDF_ASSERT( TYPE_MBA == i_chip->getType() ); + PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) ); uint8_t o_size = 0; do { - ExtensibleChip * membufChip = getConnectedParent(i_chip, TYPE_MEMBUF); + TargetHandle_t membuf = getConnectedParent(i_trgt, TYPE_MEMBUF); + ExtensibleChip * membufChip = + (ExtensibleChip*)systemPtr->GetChip(membuf); + PRDF_ASSERT( nullptr != membufChip ); - uint32_t pos = i_chip->getPos(); + uint32_t pos = getTargetPosition(i_trgt); const char * reg_str = (0 == pos) ? "MBA0_MBAXCR" : "MBA1_MBAXCR"; SCAN_COMM_REGISTER_CLASS * reg = membufChip->getRegister( reg_str ); @@ -565,7 +569,7 @@ uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) if ( SUCCESS != rc ) { PRDF_ERR( PRDF_FUNC "Read() failed on %s. Target=0x%08x", - reg_str, i_chip->getHuid() ); + reg_str, getHuid(i_trgt) ); break; } @@ -582,18 +586,16 @@ uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize( TargetHandle_t i_trgt, uint8_t i_dimmSlct ) { #define PRDF_FUNC "[MemUtils::getDramSize] " - PRDF_ASSERT( TYPE_MEM_PORT == i_chip->getType() ); + PRDF_ASSERT( TYPE_MEM_PORT == getTargetType(i_trgt) ); PRDF_ASSERT( i_dimmSlct < DIMM_SLCT_PER_PORT ); - TargetHandle_t memPortTrgt = i_chip->getTrgt(); - uint8_t tmp[DIMM_SLCT_PER_PORT]; - if ( !memPortTrgt->tryGetAttr(tmp) ) + if ( !i_trgt->tryGetAttr(tmp) ) { PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MEM_EFF_DRAM_DENSITY" ); PRDF_ASSERT( false ); @@ -605,18 +607,18 @@ uint8_t getDramSize(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize(ExtensibleChip * i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize( TargetHandle_t i_trgt, uint8_t i_dimmSlct ) { #define PRDF_FUNC "[MemUtils::getDramSize] " - PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() ); + PRDF_ASSERT( TYPE_OCMB_CHIP == getTargetType(i_trgt) ); PRDF_ASSERT( i_dimmSlct < DIMM_SLCT_PER_PORT ); // TODO RTC 210072 - Explorer only has one port, however, multiple ports // will be supported in the future. Updates will need to be made here so we // can get the relevant port. - ExtensibleChip * memPort = getConnectedChild( i_chip, TYPE_MEM_PORT, 0 ); + TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 ); return getDramSize( memPort, i_dimmSlct ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H index 9759cd01056..39a6051feb2 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H @@ -102,12 +102,12 @@ int32_t collectCeStats( ExtensibleChip * i_chip, const MemRank & i_rank, /** * @brief Gets DRAM size for an MBA, MCA, or MEM_PORT. - * @param i_chip MBA, MCA, or MEM_PORT chip. + * @param i_trgt MBA, MCA, or MEM_PORT target. * @param i_dimmSlct DIMM select. Optional for MBA chip. * @return size for a DRAM */ template -uint8_t getDramSize( ExtensibleChip * i_chip, uint8_t i_dimmSlct = 0 ); +uint8_t getDramSize( TARGETING::TargetHandle_t i_trgt, uint8_t i_dimmSlct = 0 ); /** * @brief determines the type of Centaur based raw card associated with MBA. diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C index 3b85d3ca757..c3da71d4277 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C @@ -1021,7 +1021,12 @@ ExtensibleChipList getConnected( ExtensibleChip * i_chip, TYPE i_connType ) TargetHandleList list = getConnected( i_chip->getTrgt(), i_connType ); for ( auto & trgt : list ) { - o_list.push_back( (ExtensibleChip *)systemPtr->GetChip(trgt) ); + // Check to make sure that if we have a non-null Target, we also + // get back a non-null ExtensibleChip. + ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip(trgt); + PRDF_ASSERT( nullptr != chip ); + + o_list.push_back( chip ); } return o_list; @@ -1037,7 +1042,12 @@ ExtensibleChip * getConnectedParent( ExtensibleChip * i_child, TargetHandle_t trgt = getConnectedParent( i_child->getTrgt(), i_parentType ); - return (ExtensibleChip *)systemPtr->GetChip( trgt ); + // Check to make sure that if we have a non-null Target, we also + // get back a non-null ExtensibleChip. + ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip( trgt ); + PRDF_ASSERT( nullptr != chip ); + + return chip; } //------------------------------------------------------------------------------ @@ -1056,6 +1066,10 @@ ExtensibleChip * getConnectedChild( ExtensibleChip * i_parent, if ( nullptr != trgt ) { o_child = (ExtensibleChip *)systemPtr->GetChip( trgt ); + + // Check to make sure that if we have a non-null Target, we also + // get back a non-null ExtensibleChip. + PRDF_ASSERT( nullptr != o_child ); } return o_child; @@ -1715,11 +1729,15 @@ void getSlaveRanks( TargetHandle_t i_trgt, } template<> -void getSlaveRanks( TargetHandle_t i_trgt, - std::vector & o_ranks, - uint8_t i_ds ) +void getSlaveRanks( TargetHandle_t i_trgt, + std::vector & o_ranks, + uint8_t i_ds ) { - __getSlaveRanks( i_trgt, o_ranks, i_ds ); + // TODO RTC 210072 - Explorer only has one port, however, multiple ports + // will be supported in the future. Updates will need to be made here so we + // can get the relevant port. + TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 ); + __getSlaveRanks( memPort, o_ranks, i_ds ); } //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C index 6dff91e823e..fcd347793d1 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C @@ -305,24 +305,8 @@ uint32_t __analyzeCmdComplete( ExtensibleChip * i_chip, do { - // Get all ports in which the command was run. - ExtensibleChipList portList; - o_rc = getMcbistMaintPort( i_chip, portList ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getMcbistMaintPort(0x%08x) failed", - i_chip->getHuid() ); - break; - } - - // In broadcast mode, the rank configuration for all ports will be the - // same. In non-broadcast mode, there will only be one MEM_PORT in - // the list. Therefore, we can simply use the first MEM_PORT in the - // list for all configs. - ExtensibleChip * stopChip = portList.front(); - // Update iv_stoppedRank. - o_stoppedRank = __getStopRank( stopChip, i_addr ); + o_stoppedRank = __getStopRank( i_chip, i_addr ); // Check the OCMB for ECC errors. bool errorsFound; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C index 35c44e2be9a..28988f1ab2a 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C @@ -1154,11 +1154,9 @@ uint32_t __findChipMarks( for ( auto & entry : i_rankList.getList() ) { - ExtensibleChip * memPort = entry.getChip(); + ExtensibleChip * ocmb = entry.getChip(); MemRank rank = entry.getRank(); - ExtensibleChip * ocmb = getConnectedParent( memPort, TYPE_OCMB_CHIP ); - // Call readChipMark to get MemMark. MemMark chipMark; o_rc = MarkStore::readChipMark( ocmb, rank, chipMark ); @@ -1171,13 +1169,19 @@ uint32_t __findChipMarks( if ( !chipMark.isValid() ) continue; // no chip mark present + // TODO RTC 210072 - Explorer only has one port, however, multiple ports + // will be supported in the future. Updates will need to be made here + // so we can get the relevant port. + TargetHandle_t memPort = getConnectedChild( ocmb->getTrgt(), + TYPE_MEM_PORT, 0 ); + // Get the DQ Bitmap data. MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap( memPort->getTrgt(), rank, dqBitmap ); + o_rc = getBadDqBitmap( memPort, rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x,0x%02x)", - memPort->getHuid(), rank.getKey() ); + getHuid(memPort), rank.getKey() ); break; } @@ -1187,7 +1191,7 @@ uint32_t __findChipMarks( if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "dqBitmap.isChipMark() failed on 0x%08x " - "0x%02x", memPort->getHuid(), rank.getKey() ); + "0x%02x", getHuid(memPort), rank.getKey() ); break; } @@ -1509,31 +1513,36 @@ uint32_t MemTdCtlr::handleRrFo() for ( auto & entry : vectorList ) { - ExtensibleChip * memPortChip = entry.getChip(); + ExtensibleChip * ocmbChip = entry.getChip(); MemRank rank = entry.getRank(); // Get the chip mark MemMark chipMark; - o_rc = MarkStore::readChipMark( iv_chip, rank, + o_rc = MarkStore::readChipMark( ocmbChip, rank, chipMark ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "readChipMark(0x%08x,%d) " - "failed", memPortChip->getHuid(), rank.getMaster() ); + "failed", ocmbChip->getHuid(), rank.getMaster() ); break; } if ( !chipMark.isValid() ) continue; // no chip mark present + // TODO RTC 210072 - Explorer only has one port, however, + // multiple ports will be supported in the future. Updates will + // need to be made here so we can get the relevant port. + // Get the DQ Bitmap data. - TargetHandle_t memPortTrgt = memPortChip->GetChipHandle(); + TargetHandle_t memPort = getConnectedChild( ocmbChip->getTrgt(), + TYPE_MEM_PORT, 0 ); MemDqBitmap dqBitmap; - o_rc = getBadDqBitmap( memPortTrgt, rank, dqBitmap ); + o_rc = getBadDqBitmap( memPort, rank, dqBitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap(0x%08x, %d)", - getHuid(memPortTrgt), rank.getMaster() ); + getHuid(memPort), rank.getMaster() ); break; } diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdRankList.H b/src/usr/diag/prdf/plat/mem/prdfMemTdRankList.H index e61389ea226..d1cf12a507a 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdRankList.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdRankList.H @@ -80,7 +80,7 @@ class TdRankListEntry private: - ExtensibleChip * iv_chip = nullptr; ///< MCA, MBA, or MEM_PORT chip. + ExtensibleChip * iv_chip = nullptr; ///< MCA, MBA, or OCMB chip. MemRank iv_rank = MemRank(0); ///< Any rank on the MCA/MBA/MEM_PORT }; @@ -95,7 +95,7 @@ class TdRankList /** * @brief Constructor. - * @param MCBIST or MBA chip. + * @param MCBIST, OCMB, or MBA chip. */ explicit TdRankList( ExtensibleChip * i_chip ); @@ -191,17 +191,13 @@ inline TdRankList::TdRankList( PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() ); - ExtensibleChipList memPortChipList = getConnected( i_chip, TYPE_MEM_PORT ); - for ( auto & memPortChip : memPortChipList ) - { - std::vector rankList; - getSlaveRanks( memPortChip->getTrgt(), rankList ); - PRDF_ASSERT( !rankList.empty() ); // target configured with no ranks + std::vector rankList; + getSlaveRanks( i_chip->getTrgt(), rankList ); + PRDF_ASSERT( !rankList.empty() ); // target configured with no ranks - for ( auto & rank : rankList ) - { - iv_list.push_back( TdRankListEntry(memPortChip, rank) ); - } + for ( auto & rank : rankList ) + { + iv_list.push_back( TdRankListEntry(i_chip, rank) ); } } diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C index f34c26a9c88..d61bb7844c9 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices.C @@ -1316,20 +1316,19 @@ uint32_t incMaintAddr( ExtensibleChip * i_chip, //############################################################################## template<> -uint32_t startBgScrub( ExtensibleChip * i_memPort, - const MemRank & i_rank ) +uint32_t startBgScrub( ExtensibleChip * i_ocmb, + const MemRank & i_rank ) { - #define PRDF_FUNC "[PlatServices::startBgScrub] " + #define PRDF_FUNC "[PlatServices::startBgScrub] " - PRDF_ASSERT( nullptr != i_memPort ); - PRDF_ASSERT( TYPE_MEM_PORT == i_memPort->getType() ); + PRDF_ASSERT( nullptr != i_ocmb ); + PRDF_ASSERT( TYPE_OCMB_CHIP == i_ocmb->getType() ); uint32_t o_rc = SUCCESS; /* TODO RTC 207273 - no HWP support yet // Get the OCMB fapi target - ExtensibleChip * ocmbChip = getConnectedParent( i_memPort, TYPE_OCMB_CHIP ); - fapi2::Target fapiTrgt (ocmbChip->getTrgt()); + fapi2::Target fapiTrgt (i_ocmb->getTrgt()); // Get the stop conditions. // NOTE: If HBRT_PRD is not configured, we want to use the defaults so that @@ -1383,11 +1382,11 @@ uint32_t startBgScrub( ExtensibleChip * i_memPort, } // Clear all of the counters and maintenance ECC attentions. - o_rc = prepareNextCmd( ocmbChip ); + o_rc = prepareNextCmd( i_ocmb ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed", - ocmbChip->getHuid() ); + i_ocmb->getHuid() ); break; } @@ -1399,7 +1398,7 @@ uint32_t startBgScrub( ExtensibleChip * i_memPort, if ( nullptr != errl ) { PRDF_ERR( PRDF_FUNC "mss::memdiags::background_scrub(0x%08x,%d) " - "failed", ocmbChip->getHuid(), i_rank.getMaster() ); + "failed", i_ocmb->getHuid(), i_rank.getMaster() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; break; } @@ -1414,17 +1413,6 @@ uint32_t startBgScrub( ExtensibleChip * i_memPort, //------------------------------------------------------------------------------ -// This specialization only exists to avoid a lot of extra code in some classes. -// The input chip must still be a MEM_PORT. -template<> -uint32_t startBgScrub( ExtensibleChip * i_memPort, - const MemRank & i_rank ) -{ - return startBgScrub( i_memPort, i_rank ); -} - -//------------------------------------------------------------------------------ - template<> uint32_t startTdScrub(ExtensibleChip * i_chip, const MemRank & i_rank, diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C index f516d53b7c9..204e61ca6d8 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C @@ -859,22 +859,21 @@ bool isBroadcastModeCapable( ExtensibleChip * i_chip ) //------------------------------------------------------------------------------ template<> -uint32_t startSfRead( ExtensibleChip * i_memPort, - const MemRank & i_rank ) +uint32_t startSfRead( ExtensibleChip * i_ocmb, + const MemRank & i_rank ) { - #define PRDF_FUNC "[PlatServices::startSfRead] " + #define PRDF_FUNC "[PlatServices::startSfRead] " PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running. - PRDF_ASSERT( nullptr != i_memPort ); - PRDF_ASSERT( TYPE_MEM_PORT == i_memPort->getType() ); + PRDF_ASSERT( nullptr != i_ocmb ); + PRDF_ASSERT( TYPE_OCMB_CHIP == i_ocmb->getType() ); uint32_t o_rc = SUCCESS; /* TODO RTC 207273 - no HWP support yet // Get the OCMB_CHIP fapi target - ExtensibleChip * ocmbChip = getConnectedParent( i_memPort, TYPE_OCMB_CHIP ); - fapi2::Target fapiTrgt ( ocmbChip->getTrgt() ); + fapi2::Target fapiTrgt ( i_ocmb->getTrgt() ); // Get the stop conditions. mss::mcbist::stop_conditions<> stopCond; @@ -892,21 +891,21 @@ uint32_t startSfRead( ExtensibleChip * i_memPort, { // Get the first address of the given rank. mss::mcbist::address saddr, eaddr; - o_rc = getMemAddrRange( i_memPort, i_rank, saddr, eaddr, - SLAVE_RANK ); + o_rc = getMemAddrRange( i_ocmb, i_rank, saddr, eaddr, + SLAVE_RANK ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed", - i_memPort->getHuid(), i_rank.getKey() ); + i_ocmb->getHuid(), i_rank.getKey() ); break; } // Clear all of the counters and maintenance ECC attentions. - o_rc = prepareNextCmd( ocmbChip ); + o_rc = prepareNextCmd( i_ocmb ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed", - ocmbChip->getHuid() ); + i_ocmb->getHuid() ); break; } @@ -917,7 +916,7 @@ uint32_t startSfRead( ExtensibleChip * i_memPort, if ( nullptr != errl ) { PRDF_ERR( PRDF_FUNC "mss::memdiags::sf_read(0x%08x,%d) failed", - ocmbChip->getHuid(), i_rank.getMaster() ); + i_ocmb->getHuid(), i_rank.getMaster() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; break; } @@ -933,17 +932,6 @@ uint32_t startSfRead( ExtensibleChip * i_memPort, //------------------------------------------------------------------------------ -// This specialization only exists to avoid a lot of extra code in some classes. -// The input chip must still be an MEM_PORT chip. -template<> -uint32_t startSfRead( ExtensibleChip * i_memPort, - const MemRank & i_rank ) -{ - return startSfRead( i_memPort, i_rank ); -} - -//------------------------------------------------------------------------------ - template<> uint32_t cleanupSfRead( ExtensibleChip * i_ocmbChip ) {