diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2019-06-21 11:16:39 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2019-06-28 14:08:02 -0500 |
commit | 8e6a69de2d3988dd904ede00a99b6fc537c30c8b (patch) | |
tree | 73b1862be2497ddb93bf8a436a180af9ecacdaaf | |
parent | 8db1ba5aaa8198a0535cc472eda56cecdbb016f9 (diff) | |
download | talos-hostboot-8e6a69de2d3988dd904ede00a99b6fc537c30c8b.tar.gz talos-hostboot-8e6a69de2d3988dd904ede00a99b6fc537c30c8b.zip |
PRD: Remove use of unsupported MEM_PORT ExtensibleChip
Change-Id: I2fe2952854a62ce0b562eacdb7a554ed6a9f1881
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/79344
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Benjamen G. Tyner <ben.tyner@ibm.com>
Reviewed-by: Paul Greenwood <paul.greenwood@ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/79346
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
-rw-r--r-- | src/usr/diag/prdf/common/plat/explorer/prdfExplorerPlugins_common.C | 12 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C | 87 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C | 53 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.C | 24 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemDqBitmap.H | 9 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemMark.C | 25 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemThresholds.C | 3 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C | 38 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H | 4 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/prdfTargetServices.C | 30 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C | 18 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C | 33 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdRankList.H | 20 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.C | 30 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_ipl.C | 36 |
15 files changed, 165 insertions, 257 deletions
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 e70bfea8f..69d63b345 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 5cf6a75a4..b913b6c18 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<TYPE_MCBIST>( ExtensibleChip * i_mcbChip, #undef PRDF_FUNC } -//------------------------------------------------------------------------------ - -template<> -uint32_t getMcbistMaintPort<TYPE_OCMB_CHIP>( 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<ATTR_REL_POS>(); - - // 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 e3da2e952..25db47d64 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<TYPE_MCBIST>( ExtensibleChip * i_chip, } template<> -void addEccData<TYPE_MEM_PORT>( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) +void addEccData<TYPE_OCMB_CHIP>( 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<TYPE_OCMB_CHIP>( ocmb->getTrgt(), cd ); + captureDramRepairsData<TYPE_OCMB_CHIP>( ocmbTrgt, cd ); // Add DRAM repairs data from VPD. - captureDramRepairsVpd<TYPE_MEM_PORT>( 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<TYPE_MEM_PORT>( memPort, cd ); // Add IUE counts to capture data. - captureIueCounts<OcmbDataBundle*>( ocmb->getTrgt(), db, cd ); + captureIueCounts<OcmbDataBundle*>( ocmbTrgt, db, cd ); // Add CE table to capture data. db->iv_ceTable.addCapData( cd ); @@ -563,17 +565,6 @@ void addEccData<TYPE_MEM_PORT>( ExtensibleChip * i_chip, } template<> -void addEccData<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>(port, io_sc); } -} - -template<> void addEccData<TYPE_MBA>( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc ) { @@ -635,6 +626,26 @@ void addEccData<TYPE_MBA>( TargetHandle_t i_trgt, errlHndl_t io_errl ) ErrDataService::AddCapData( cd, io_errl ); } +template<> +void addEccData<TYPE_OCMB_CHIP>( 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<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( 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 308e25dab..10f7125dd 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 5d96aadfd..9ba927432 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 e0b54ab31..4aff52acd 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<TARGETING::TYPE T> -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<TYPE_MBA>( 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_MBA>( + 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<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( memPort->getTrgt(), i_rank, - ps, isEnabled ); + o_rc = isDramSparingEnabled<TYPE_MEM_PORT>( memPort, i_rank, ps, + isEnabled ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "isDramSparingEnabled() failed." ); @@ -1268,7 +1268,7 @@ 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_MEM_PORT>( memPort->getTrgt(), i_rank, + o_rc = isSpareAvailable<TYPE_MEM_PORT>( 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 c59fa3657..6ad8a724a 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<T>( i_chip, i_rank.getDimmSlct() ); + uint8_t size = MemUtils::getDramSize<T>( i_chip->getTrgt(), + i_rank.getDimmSlct() ); // Get number of ranks per DIMM select. uint8_t rankCount = getNumRanksPerDimm<T>( 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 4d96de65e..1f9037ee9 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 <iipServiceDataCollector.h> +#include <iipSystem.h> #include <prdfExtensibleChip.H> +#include <prdfGlobal_common.H> #include <UtilHash.H> // Platform includes @@ -517,19 +519,18 @@ int32_t collectCeStats<TYPE_MBA>( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ template<> -uint8_t getDramSize<TYPE_MCA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize<TYPE_MCA>( 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<TYPE_MCA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize<TYPE_MBA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize<TYPE_MBA>( 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<TYPE_MBA>(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<TYPE_MBA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize<TYPE_MEM_PORT>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize<TYPE_MEM_PORT>( 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<TARGETING::ATTR_MEM_EFF_DRAM_DENSITY>(tmp) ) + if ( !i_trgt->tryGetAttr<TARGETING::ATTR_MEM_EFF_DRAM_DENSITY>(tmp) ) { PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MEM_EFF_DRAM_DENSITY" ); PRDF_ASSERT( false ); @@ -605,18 +607,18 @@ uint8_t getDramSize<TYPE_MEM_PORT>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) } template<> -uint8_t getDramSize<TYPE_OCMB_CHIP>(ExtensibleChip * i_chip, uint8_t i_dimmSlct) +uint8_t getDramSize<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( 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 9759cd010..39a6051fe 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<TARGETING::TYPE T> -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 3b85d3ca7..c3da71d42 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<TYPE_MBA>( TargetHandle_t i_trgt, } template<> -void getSlaveRanks<TYPE_MEM_PORT>( TargetHandle_t i_trgt, - std::vector<MemRank> & o_ranks, - uint8_t i_ds ) +void getSlaveRanks<TYPE_OCMB_CHIP>( TargetHandle_t i_trgt, + std::vector<MemRank> & o_ranks, + uint8_t i_ds ) { - __getSlaveRanks<TYPE_MEM_PORT>( 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<TYPE_MEM_PORT>( 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 6dff91e82..fcd347793 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<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip, do { - // Get all ports in which the command was run. - ExtensibleChipList portList; - o_rc = getMcbistMaintPort<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( stopChip, i_addr ); + o_stoppedRank = __getStopRank<TYPE_OCMB_CHIP>( 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 35c44e2be..28988f1ab 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<TYPE_MEM_PORT>( 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<TYPE_OCMB_CHIP>( ocmb, rank, chipMark ); @@ -1171,13 +1169,19 @@ uint32_t __findChipMarks<TYPE_MEM_PORT>( 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<TYPE_MEM_PORT>( 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<TYPE_OCMB_CHIP>::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<TYPE_OCMB_CHIP>( iv_chip, rank, + o_rc = MarkStore::readChipMark<TYPE_OCMB_CHIP>( ocmbChip, rank, chipMark ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "readChipMark<TYPE_MEM_PORT>(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 e61389ea2..d1cf12a50 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<TARGETING::TYPE_OCMB_CHIP>::TdRankList( PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() ); - ExtensibleChipList memPortChipList = getConnected( i_chip, TYPE_MEM_PORT ); - for ( auto & memPortChip : memPortChipList ) - { - std::vector<MemRank> rankList; - getSlaveRanks<TYPE_MEM_PORT>( memPortChip->getTrgt(), rankList ); - PRDF_ASSERT( !rankList.empty() ); // target configured with no ranks + std::vector<MemRank> rankList; + getSlaveRanks<TYPE_OCMB_CHIP>( 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 f34c26a9c..d61bb7844 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices.C @@ -1316,20 +1316,19 @@ uint32_t incMaintAddr<TYPE_MBA>( ExtensibleChip * i_chip, //############################################################################## template<> -uint32_t startBgScrub<TYPE_MEM_PORT>( ExtensibleChip * i_memPort, - const MemRank & i_rank ) +uint32_t startBgScrub<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmb, + const MemRank & i_rank ) { - #define PRDF_FUNC "[PlatServices::startBgScrub<TYPE_MEM_PORT>] " + #define PRDF_FUNC "[PlatServices::startBgScrub<TYPE_OCMB_CHIP>] " - 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<fapi2::TARGET_TYPE_OCMB_CHIP> fapiTrgt (ocmbChip->getTrgt()); + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> 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<TYPE_MEM_PORT>( ExtensibleChip * i_memPort, } // Clear all of the counters and maintenance ECC attentions. - o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( ocmbChip ); + o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( 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<TYPE_MEM_PORT>( 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<TYPE_OCMB_CHIP>( ExtensibleChip * i_memPort, - const MemRank & i_rank ) -{ - return startBgScrub<TYPE_MEM_PORT>( i_memPort, i_rank ); -} - -//------------------------------------------------------------------------------ - template<> uint32_t startTdScrub<TYPE_OCMB_CHIP>(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 f516d53b7..204e61ca6 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<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip ) //------------------------------------------------------------------------------ template<> -uint32_t startSfRead<TYPE_MEM_PORT>( ExtensibleChip * i_memPort, - const MemRank & i_rank ) +uint32_t startSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmb, + const MemRank & i_rank ) { - #define PRDF_FUNC "[PlatServices::startSfRead<TYPE_MCA>] " + #define PRDF_FUNC "[PlatServices::startSfRead<TYPE_OCMB_CHIP>] " 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<fapi2::TYPE_OCMB_CHIP> fapiTrgt ( ocmbChip->getTrgt() ); + fapi2::Target<fapi2::TYPE_OCMB_CHIP> fapiTrgt ( i_ocmb->getTrgt() ); // Get the stop conditions. mss::mcbist::stop_conditions<> stopCond; @@ -892,21 +891,21 @@ uint32_t startSfRead<TYPE_MEM_PORT>( ExtensibleChip * i_memPort, { // Get the first address of the given rank. mss::mcbist::address saddr, eaddr; - o_rc = getMemAddrRange<TYPE_MEM_PORT>( i_memPort, i_rank, saddr, eaddr, - SLAVE_RANK ); + o_rc = getMemAddrRange<TYPE_OCMB_CHIP>( 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<TYPE_OCMB_CHIP>( ocmbChip ); + o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( 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<TYPE_MEM_PORT>( 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<TYPE_MEM_PORT>( 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<TYPE_OCMB_CHIP>( ExtensibleChip * i_memPort, - const MemRank & i_rank ) -{ - return startSfRead<TYPE_MEM_PORT>( i_memPort, i_rank ); -} - -//------------------------------------------------------------------------------ - template<> uint32_t cleanupSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmbChip ) { |