summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2016-12-19 09:37:52 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2017-02-10 13:22:08 -0500
commit97dcd092f4e72e2b67f2b97b6aac3cd57944d05e (patch)
tree4590ce315156b50cfa54d5515ce3ac11cd3f53fe /src
parent2df37e971282522423f114880f99501f0728116f (diff)
downloadtalos-hostboot-97dcd092f4e72e2b67f2b97b6aac3cd57944d05e.tar.gz
talos-hostboot-97dcd092f4e72e2b67f2b97b6aac3cd57944d05e.zip
PRD: Update MemUtils File
Change-Id: I90add0fc0222e1f6f9ef4cdc4a657824c52df492 RTC: 159627 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/34055 Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36073 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src')
-rwxr-xr-xsrc/usr/diag/prdf/plat/mem/prdfMemUtils.C (renamed from src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C)293
-rwxr-xr-xsrc/usr/diag/prdf/plat/mem/prdfMemUtils.H (renamed from src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H)89
-rw-r--r--src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk3
3 files changed, 227 insertions, 158 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C b/src/usr/diag/prdf/plat/mem/prdfMemUtils.C
index 798c741e0..dffdf7fbc 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemUtils.C
@@ -1,11 +1,11 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
-/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C $ */
+/* $Source: src/usr/diag/prdf/plat/mem/prdfMemUtils.C $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+/* Contributors Listed Below - COPYRIGHT 2013,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -23,20 +23,17 @@
/* */
/* IBM_PROLOG_END_TAG */
-/** @file prdfCenMemUtils.C
- * @brief Utility functions related to Centaur
+/** @file prdfMemUtils.C
+ * @brief Utility functions related to memory
*/
-#include <prdfCenMemUtils.H>
+#include <prdfMemUtils.H>
#include <prdfExtensibleChip.H>
-#include <prdfCenMbaDataBundle.H>
-#include <prdfP8McsDataBundle.H>
#include <prdfPlatServices.H>
-#include <prdfCenMembufDataBundle.H>
#include <prdfParserUtils.H>
#if defined(__HOSTBOOT_RUNTIME) || !defined(__HOSTBOOT_MODULE)
- #include <prdfCenMbaDynMemDealloc_rt.H>
+// #include <prdfCenMbaDynMemDealloc_rt.H>
#endif
using namespace TARGETING;
@@ -51,10 +48,12 @@ using namespace PlatServices;
using namespace PARSERUTILS;
using namespace CEN_SYMBOL;
-const uint8_t CE_REGS_PER_MBA = 9;
+const uint8_t CE_REGS_PER_PORT = 9;
const uint8_t SYMBOLS_PER_CE_REG = 8;
-static const char *mbsCeStatReg[][ CE_REGS_PER_MBA ] = {
+//TODO RTC 166802
+/*
+static const char *mbsCeStatReg[][ CE_REGS_PER_PORT ] = {
{ "MBA0_MBSSYMEC0", "MBA0_MBSSYMEC1","MBA0_MBSSYMEC2",
"MBA0_MBSSYMEC3", "MBA0_MBSSYMEC4", "MBA0_MBSSYMEC5",
"MBA0_MBSSYMEC6", "MBA0_MBSSYMEC7", "MBA0_MBSSYMEC8" },
@@ -62,6 +61,14 @@ static const char *mbsCeStatReg[][ CE_REGS_PER_MBA ] = {
"MBA1_MBSSYMEC3", "MBA1_MBSSYMEC4", "MBA1_MBSSYMEC5",
"MBA1_MBSSYMEC6", "MBA1_MBSSYMEC7", "MBA1_MBSSYMEC8" }
};
+*/
+
+static const char *mcbCeStatReg[CE_REGS_PER_PORT] =
+ {
+ "MCB_MBSSYMEC0", "MCB_MBSSYMEC1", "MCB_MBSSYMEC2",
+ "MCB_MBSSYMEC3", "MCB_MBSSYMEC4", "MCB_MBSSYMEC5",
+ "MCB_MBSSYMEC6", "MCB_MBSSYMEC7", "MCB_MBSSYMEC8"
+ };
//------------------------------------------------------------------------------
@@ -74,15 +81,145 @@ struct DramCount_t
typedef std::map<uint32_t, DramCount_t> DramCountMap;
//------------------------------------------------------------------------------
+template<>
+int32_t collectCeStats<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank, MaintSymbols & o_maintStats,
+ MemSymbol & o_chipMark, uint8_t i_thr )
+{
+ #define PRDF_FUNC "[MemUtils::collectCeStats<TYPE_MCA>] "
+
+ int32_t o_rc = SUCCESS;
+ o_chipMark = MemSymbol(); // Initially invalid.
+
+ do
+ {
+ PRDF_ASSERT( 0 != i_thr );
+
+ TargetHandle_t mcaTrgt = i_chip->getTrgt();
+ ExtensibleChip * mcbChip = getConnectedParent( i_chip, TYPE_MCBIST );
+
+ uint8_t mcaPos = getTargetPosition( mcaTrgt );
+
+ PRDF_ASSERT( MAX_MCA_PER_MCBIST > mcaPos );
+
+ const bool isX4 = isDramWidthX4(mcaTrgt);
+
+ // Use this map to keep track of the total counts per DRAM.
+ DramCountMap dramCounts;
+
+ const char * reg_str = NULL;
+ SCAN_COMM_REGISTER_CLASS * reg = NULL;
+
+ for ( uint8_t regIdx = 0; regIdx < CE_REGS_PER_PORT; regIdx++ )
+ {
+ reg_str = mcbCeStatReg[regIdx];
+ reg = mcbChip->getRegister( reg_str );
+
+ o_rc = reg->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Read() failed on %s", reg_str );
+ break;
+ }
+
+ uint8_t baseSymbol = SYMBOLS_PER_CE_REG * regIdx;
+
+ for ( uint8_t i = 0; i < SYMBOLS_PER_CE_REG; i++ )
+ {
+ uint8_t count = reg->GetBitFieldJustified( (i*8), 8 );
+
+ if ( 0 == count ) continue; // nothing to do
+
+ uint8_t sym = baseSymbol + i;
+ uint8_t dram = isX4 ? symbol2Nibble<TYPE_MCA>( sym )
+ : symbol2Byte <TYPE_MCA>( sym );
+
+ // Keep track of the total DRAM counts.
+ dramCounts[dram].totalCount += count;
+
+ // Add any symbols that have exceeded threshold to the list.
+ if ( i_thr <= count )
+ {
+ // Keep track of the total number of symbols per DRAM that
+ // have exceeded threshold.
+ dramCounts[dram].symbolCount++;
+
+ SymbolData symData;
+ symData.symbol = MemSymbol::fromSymbol( mcaTrgt, i_rank,
+ sym, CEN_SYMBOL::BOTH_SYMBOL_DQS );
+ if ( !symData.symbol.isValid() )
+ {
+ PRDF_ERR( PRDF_FUNC "MemSymbol() failed: symbol=%d",
+ sym );
+ o_rc = FAIL;
+ break;
+ }
+ else
+ {
+ // Add the symbol to the list.
+ symData.count = count;
+ o_maintStats.push_back( symData );
+ }
+ }
+ }
+ if ( SUCCESS != o_rc ) break;
+ }
+ if ( SUCCESS != o_rc ) break;
-int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank,
- MaintSymbols & o_maintStats, CenSymbol & o_chipMark,
- uint8_t i_thr )
+ if ( o_maintStats.empty() ) break; // no need to continue
+
+ // Sort the list of symbols.
+ std::sort( o_maintStats.begin(), o_maintStats.end(), sortSymDataCount );
+
+ // Get the DRAM with the highest count.
+ uint32_t highestDram = 0;
+ uint32_t highestCount = 0;
+ const uint32_t symbolTH = isX4 ? 1 : 2;
+ for ( DramCountMap::iterator it = dramCounts.begin();
+ it != dramCounts.end(); ++it )
+ {
+ if ( (symbolTH <= it->second.symbolCount) &&
+ (highestCount < it->second.totalCount ) )
+ {
+ highestDram = it->first;
+ highestCount = it->second.totalCount;
+ }
+ }
+
+ if ( 0 != highestCount )
+ {
+ uint8_t sym = isX4 ? nibble2Symbol<TYPE_MCA>( highestDram )
+ : byte2Symbol <TYPE_MCA>( highestDram );
+ o_chipMark = MemSymbol::fromSymbol( mcaTrgt, i_rank, sym );
+ }
+
+ } while(0);
+
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Failed: i_chip=0x%08x i_rank=m%ds%d i_thr=%d",
+ i_chip->GetId(), i_rank.getMaster(), i_rank.getSlave(),
+ i_thr );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+int32_t collectCeStats<TYPE_MBA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank, MaintSymbols & o_maintStats,
+ MemSymbol & o_chipMark, uint8_t i_thr )
{
- #define PRDF_FUNC "[MemUtils::collectCeStats] "
+ #define PRDF_FUNC "[MemUtils::collectCeStats<TYPE_MBA>] "
int32_t o_rc = SUCCESS;
+ //TODO RTC 166802
+ /*
o_chipMark = CenSymbol(); // Initially invalid.
do
@@ -93,7 +230,7 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank,
o_rc = FAIL; break;
}
- TargetHandle_t mbaTrgt = i_mbaChip->GetChipHandle();
+ TargetHandle_t mbaTrgt = i_mbaChip->getTrgt();
CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip );
ExtensibleChip * membufChip = mbadb->getMembChip();
if ( NULL == membufChip )
@@ -240,7 +377,7 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank,
i_mbaChip->GetId(), i_rank.getMaster(), i_rank.getSlave(),
i_thr );
}
-
+ */
return o_rc;
#undef PRDF_FUNC
@@ -248,97 +385,79 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank,
//------------------------------------------------------------------------------
-int32_t clearPerSymbolCounters( ExtensibleChip * i_membChip, uint32_t i_mbaPos )
+template<>
+uint8_t getDramSize<TYPE_MCA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct)
{
- #define PRDF_FUNC "[MemUtils::clearPerSymbolCounters] "
-
- int32_t o_rc = SUCCESS;
-
- do
- {
- if ( MAX_MBA_PER_MEMBUF <= i_mbaPos )
- {
- PRDF_ERR( PRDF_FUNC "i_mbaPos %d is invalid", i_mbaPos );
- o_rc = FAIL;
- break;
- }
-
- const char * reg_str = NULL;
- SCAN_COMM_REGISTER_CLASS * reg = NULL;
+ #define PRDF_FUNC "[MemUtils::getDramSize] "
- for ( uint8_t regIdx = 0; regIdx < CE_REGS_PER_MBA; regIdx++ )
- {
- reg_str = mbsCeStatReg[i_mbaPos][regIdx];
- reg = i_membChip->getRegister( reg_str );
+ PRDF_ASSERT( TYPE_MCA == i_chip->getType() );
+ PRDF_ASSERT( i_dimmSlct < DIMM_SLCT_PER_PORT );
- reg->clearAllBits();
+ TargetHandle_t mcaTrgt = i_chip->getTrgt();
+ TargetHandle_t mcsTrgt = getConnectedParent( mcaTrgt, TYPE_MCS );
- o_rc = reg->Write();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Write() failed on %s", reg_str );
- break;
- }
- }
+ PRDF_ASSERT( nullptr != mcsTrgt );
- if ( SUCCESS != o_rc ) break;
+ uint8_t mcaPos = i_chip->getPos();
- } while(0);
+ uint8_t tmp[MAX_MCA_PER_MCS][DIMM_SLCT_PER_PORT];
- if ( SUCCESS != o_rc )
+ if ( !mcsTrgt->tryGetAttr<TARGETING::ATTR_EFF_DRAM_DENSITY>(tmp) )
{
- PRDF_ERR( PRDF_FUNC "Failed. i_membChip=0x%08x i_mbaPos=%d",
- i_membChip->GetId(), i_mbaPos );
+ PRDF_ERR( PRDF_FUNC "Failed to get ATTR_EFF_DRAM_DENSITY" );
+ PRDF_ASSERT( false );
}
- return o_rc;
+ return tmp[mcaPos][i_dimmSlct];
#undef PRDF_FUNC
}
-//------------------------------------------------------------------------------
-
-int32_t getDramSize( ExtensibleChip *i_mbaChip, uint8_t & o_size )
+template<>
+uint8_t getDramSize<TYPE_MBA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct)
{
#define PRDF_FUNC "[MemUtils::getDramSize] "
- int32_t o_rc = SUCCESS;
- o_size = SIZE_2GB;
-
- do
- {
- TargetHandle_t mbaTrgt = i_mbaChip->GetChipHandle();
- CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip );
- ExtensibleChip * membufChip = mbadb->getMembChip();
- if ( NULL == membufChip )
- {
- PRDF_ERR( PRDF_FUNC "getMembChip() failed: MBA=0x%08x",
- getHuid(mbaTrgt) );
- o_rc = FAIL; break;
- }
-
- uint32_t pos = getTargetPosition(mbaTrgt);
- const char * reg_str = (0 == pos) ? "MBA0_MBAXCR" : "MBA1_MBAXCR";
-
- SCAN_COMM_REGISTER_CLASS * reg = membufChip->getRegister( reg_str );
- o_rc = reg->Read();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Read() failed on %s. Target=0x%08x",
- reg_str, getHuid(mbaTrgt) );
- break;
- }
- o_size = reg->GetBitFieldJustified( 6, 2 );
-
- } while(0);
+ uint8_t o_rc = 0;
+
+ //TODO RTC 166802
+ //do
+ //{
+ // CenMbaDataBundle * mbadb = getMbaDataBundle( i_chip );
+ // ExtensibleChip * membufChip = mbadb->getMembChip();
+ // if ( NULL == membufChip )
+ // {
+ // PRDF_ERR( PRDF_FUNC "getMembChip() failed: MBA=0x%08x",
+ // getHuid(mbaTrgt) );
+ // o_rc = FAIL; break;
+ // }
+
+ // uint32_t pos = getTargetPosition(mbaTrgt);
+ // // If we will still be using the register values for centaur, we will
+ // // need to convert them to the appropriate enum
+ // const char * reg_str = (0 == pos) ? "MBA0_MBAXCR" : "MBA1_MBAXCR";
+
+ // SCAN_COMM_REGISTER_CLASS * reg = membufChip->getRegister( reg_str );
+ // o_rc = reg->Read();
+ // if ( SUCCESS != o_rc )
+ // {
+ // PRDF_ERR( PRDF_FUNC "Read() failed on %s. Target=0x%08x",
+ // reg_str, getHuid(mbaTrgt) );
+ // break;
+ // }
+ // o_size = reg->GetBitFieldJustified( 6, 2 );
+
+ //} while(0);
return o_rc;
#undef PRDF_FUNC
+
}
+//TODO RTC 166802
//------------------------------------------------------------------------------
-
+/*
int32_t checkMcsChannelFail( ExtensibleChip * i_mcsChip,
STEP_CODE_DATA_STRUCT & io_sc )
{
@@ -514,8 +633,8 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip,
int32_t l_rc = mdiaSendEventMsg( mba, MDIA::SKIP_MBA );
if ( SUCCESS != l_rc )
{
- PRDF_ERR( PRDF_FUNC "mdiaSendEventMsg(0x%08x, SKIP_MBA) "
- "failed", getHuid( mba ) );
+ PRDF_ERR( PRDF_FUNC "mdiaSendEventMsg(0x%08x, SKIP_MBA)"
+ " failed", getHuid( mba ) );
o_rc |= l_rc;
}
#else
@@ -542,7 +661,7 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip,
}
//------------------------------------------------------------------------------
-
+*/
} // end namespace MemUtils
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H b/src/usr/diag/prdf/plat/mem/prdfMemUtils.H
index b31d2035f..aaadc1827 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H
+++ b/src/usr/diag/prdf/plat/mem/prdfMemUtils.H
@@ -1,11 +1,11 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
-/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H $ */
+/* $Source: src/usr/diag/prdf/plat/mem/prdfMemUtils.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+/* Contributors Listed Below - COPYRIGHT 2013,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -23,11 +23,11 @@
/* */
/* IBM_PROLOG_END_TAG */
-#ifndef prdfCenMemUtils_H
-#define prdfCenMemUtils_H
+#ifndef prdfMemUtils_H
+#define prdfMemUtils_H
-/** @file prdfCenMemUtils.H
- * @brief General utility functions for Centaur
+/** @file prdfMemUtils.H
+ * @brief General utility functions for memory
*/
//------------------------------------------------------------------------------
@@ -35,7 +35,7 @@
//------------------------------------------------------------------------------
#include <vector>
-#include <prdfCenSymbol.H>
+#include <prdfMemSymbol.H>
#include <prdfParserEnums.H>
namespace PRDF
@@ -48,23 +48,6 @@ namespace MemUtils
{
//==============================================================================
-// Constants and Enums
-//==============================================================================
-
-/**
- * @brief Lists all possible sizes for a DRAM.
- * @note These values must match the definition of MBAXCR[6:7]. They are
- * important for calculations.
- */
-enum DramSize
-{
- SIZE_2GB = 0,
- SIZE_4GB = 1,
- SIZE_8GB = 2,
- SIZE_16GB = 3,
-};
-
-//==============================================================================
// Maintenance statistics
//==============================================================================
@@ -73,7 +56,7 @@ enum DramSize
*/
struct SymbolData
{
- CenSymbol symbol;
+ MemSymbol symbol;
uint8_t count;
SymbolData() : count(0) {}
};
@@ -86,37 +69,11 @@ inline bool sortSymDataCount( const SymbolData & i, const SymbolData & j )
return i.count < j.count;
}
-/** Functor for MaintSymbols to match a DRAM. */
-class MatchSymDataDram
-{
- public:
- explicit MatchSymDataDram( const CenSymbol & i_d ) : iv_d(i_d.getDram()) {}
-
- bool operator() ( const SymbolData & i_data ) const
- { return ( iv_d == i_data.symbol.getDram() ); }
-
- private:
- uint8_t iv_d;
-};
-
-/** Functor for MaintSymbols to match a symbol. */
-class MatchSymDataSymbol
-{
- public:
- explicit MatchSymDataSymbol( const CenSymbol & i_s ) : iv_s(i_s) {}
-
- bool operator() ( const SymbolData & i_data ) const
- { return ( iv_s == i_data.symbol ); }
-
- private:
- CenSymbol iv_s;
-};
-
/**
* @brief Queries the per symbol counters and returns a sorted list of symbols
* with a count greater than or equal to the given threshold.
* @note The returned list will be sorted from lowest count to highest count.
- * @param i_mbaChip Target MBA chip.
+ * @param i_chip Target mba or mca chip.
* @param i_rank Target rank.
* @param o_maintStats Returns the list of symbols and counts.
* @param o_chipMark This represents the DRAM in which a chip mark should be
@@ -138,27 +95,19 @@ class MatchSymDataSymbol
* return code.
* @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
*/
-int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank,
- MaintSymbols & o_maintStats, CenSymbol & o_chipMark,
+template<TARGETING::TYPE T>
+int32_t collectCeStats( ExtensibleChip * i_chip, const MemRank & i_rank,
+ MaintSymbols & o_maintStats, MemSymbol & o_chipMark,
uint8_t i_thr = 1 );
/**
- * @brief Clears the per symbol CE counters on a target MBA (via MEMBUF and MBA
- * position number).
- * @param i_membChip MEMBUF chip.
- * @param i_mbaPos MBA positions number (0-1).
- * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
- */
-int32_t clearPerSymbolCounters( ExtensibleChip * i_membChip,
- uint32_t i_mbaPos );
-
-/**
- * @brief Gets DRAM size for an MBA.
- * @param i_mbaChip MBA chip.
- * @param o_size size for a DRAM.
- * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ * @brief Gets DRAM size for an MBA or MCA.
+ * @param i_chip MBA or MCA chip.
+ * @param i_dimmSlct DIMM select.
+ * @return size for a DRAM
*/
-int32_t getDramSize( ExtensibleChip * i_mbaChip, uint8_t & o_size );
+template<TARGETING::TYPE T>
+uint8_t getDramSize( ExtensibleChip * i_chip, uint8_t i_dimmSlct );
/**
* @brief Check for channel fail attentions on the MCS side of the DMI bus.
@@ -170,7 +119,7 @@ int32_t checkMcsChannelFail( ExtensibleChip * i_mcsChip,
STEP_CODE_DATA_STRUCT & io_sc );
/**
- * @brief Cleanup for channel CS on Centaur.
+ * @brief Cleanup for channel CS.
* @param i_mbChip Membuf chip.
* @param i_sc Service Data Collector.
* @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
diff --git a/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk b/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk
index 9a28bdb3d..b753dc50a 100644
--- a/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk
+++ b/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2016
+# Contributors Listed Below - COPYRIGHT 2016,2017
# [+] International Business Machines Corp.
#
#
@@ -40,6 +40,7 @@ prd_incpath += ${PRD_SRC_PATH}/plat/mem
# plat/mem/ (non-rule plugin related)
prd_obj += prdfMemScrubUtils.o
prd_obj += prdfMemTdCtlr.o
+prd_obj += prdfMemUtils.o
# plat/mem/ (rule plugin related)
prd_rule_plugin += prdfP9Mca.o
OpenPOWER on IntegriCloud