summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/resolution/iipResolution.C8
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/resolution/prdfCallouts.H81
-rw-r--r--[-rwxr-xr-x]src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H (renamed from src/usr/diag/prdf/common/plat/prdfMemoryMru.C)34
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C10
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdf_ras_services.C55
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C101
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H28
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C262
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H95
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H103
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfMemoryMru.H114
-rwxr-xr-xsrc/usr/diag/prdf/common/prd_framework.mk4
-rwxr-xr-xsrc/usr/diag/prdf/common/prd_pegasus.mk1
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C73
-rw-r--r--src/usr/diag/prdf/prdfErrlUtil.H10
15 files changed, 722 insertions, 257 deletions
diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C
index 935cfee23..a1248bc4f 100755
--- a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C
+++ b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C
@@ -117,12 +117,10 @@ int32_t CalloutResolution::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData )
reduce memory utilization.
*/
- if( PRDcallout::TYPE_TARGET == xMruCallout.getType( ) )
+ if ( PRDcalloutData::TYPE_TARGET == xMruCallout.getType() )
{
- PRDcallout l_targetCallout(
- ServiceDataCollector::getTargetAnalyzed( ) );
-
- io_serviceData.service_data->SetCallout( l_targetCallout ,xPriority );
+ PRDcallout l_targetCallout( ServiceDataCollector::getTargetAnalyzed() );
+ io_serviceData.service_data->SetCallout( l_targetCallout, xPriority );
}
else
{
diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H b/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H
index 1a21a324f..00914dd1c 100755
--- a/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H
+++ b/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H
@@ -28,21 +28,11 @@
// Includes
//------------------------------------------------------------------------------
-#ifndef __HOSTBOOT_MODULE
-
-#include <srci.H>
-
-#endif
-
#include <prdfCalloutMap.H>
+#include <prdfCalloutsData.H>
#include <prdfEnums.H>
#include <prdfMemoryMru.H>
-
-#ifdef PRDF_ERRL_PARSER
- #include <prdfTargetFwdRef.H>
-#else
- #include <prdfPlatServices.H>
-#endif
+#include <prdfPlatServices.H>
namespace PRDF
{
@@ -63,62 +53,53 @@ class PRDcallout
{
public:
- enum MruType
- {
- TYPE_NONE,
- TYPE_TARGET,
- TYPE_MEMMRU,
- TYPE_SYMFRU,
- };
-
/** @brief Constructor */
- PRDcallout() : iv_type(TYPE_NONE)
+ PRDcallout() : iv_type(PRDcalloutData::TYPE_NONE)
{ iv_meldValue.u32 = 0; }
/** @brief Constructor from TargetHandle_t */
- PRDcallout( TARGETING::TargetHandle_t i_target ) : iv_type(TYPE_TARGET)
+ PRDcallout( TARGETING::TargetHandle_t i_target ) :
+ iv_type(PRDcalloutData::TYPE_TARGET)
{ iv_meldValue.target = i_target; }
- /** @brief Constructor from PrdfMemoryMru */
- PRDcallout( const PrdfMemoryMru & i_memmru ) : iv_type(TYPE_MEMMRU)
+ /** @brief Constructor from MemoryMru */
+ PRDcallout( const MemoryMru & i_memmru ) :
+ iv_type(PRDcalloutData::TYPE_MEMMRU)
{ iv_meldValue.u32 = i_memmru.toUint32(); }
/** @brief Constructor from SymbolicFru */
- PRDcallout( SymbolicFru i_symfru ) : iv_type(TYPE_SYMFRU)
+ PRDcallout( SymbolicFru i_symfru ) : iv_type(PRDcalloutData::TYPE_SYMFRU)
{ iv_meldValue.symfru = i_symfru; }
-#ifndef PRDF_ERRL_PARSER
-
/** @brief Constructor from raw data */
- PRDcallout( uint32_t i_val, MruType i_type ) : iv_type(i_type)
+ PRDcallout( uint32_t i_val, PRDcalloutData::MruType i_type ) :
+ iv_type(i_type)
{
switch ( iv_type )
{
- case TYPE_TARGET:
+ case PRDcalloutData::TYPE_TARGET:
iv_meldValue.target = PlatServices::getTarget(i_val); break;
- case TYPE_MEMMRU:
- case TYPE_SYMFRU:
+ case PRDcalloutData::TYPE_MEMMRU:
+ case PRDcalloutData::TYPE_SYMFRU:
iv_meldValue.u32 = i_val; break;
default:
- iv_type = TYPE_NONE;
+ iv_type = PRDcalloutData::TYPE_NONE;
iv_meldValue.u32 = 0;
}
}
-#endif
-
/** @brief Assignment from TargetHandle_t */
PRDcallout & operator=( TARGETING::TargetHandle_t i_target )
{
- iv_type = TYPE_TARGET;
+ iv_type = PRDcalloutData::TYPE_TARGET;
iv_meldValue.target = i_target;
return *this;
}
- /** @brief Assignment from PrdfMemoryMru */
- PRDcallout & operator=( const PrdfMemoryMru & i_memmru )
+ /** @brief Assignment from MemoryMru */
+ PRDcallout & operator=( const MemoryMru & i_memmru )
{
- iv_type = TYPE_MEMMRU;
+ iv_type = PRDcalloutData::TYPE_MEMMRU;
iv_meldValue.u32 = i_memmru.toUint32();
return *this;
}
@@ -126,7 +107,7 @@ class PRDcallout
/** @brief Assignment from SymbolicFru */
PRDcallout & operator=( SymbolicFru i_symfru )
{
- iv_type = TYPE_SYMFRU;
+ iv_type = PRDcalloutData::TYPE_SYMFRU;
iv_meldValue.symfru = i_symfru;
return *this;
}
@@ -139,7 +120,7 @@ class PRDcallout
// Otherwise, the single-argument constructors listed above will do
// automatic type conversion, which will allow code like this:
//
- // TargetHandle_t t; PrdfMemoryMru m;
+ // TargetHandle_t t; MemoryMru m;
// if ( t == m ) ...
//
// The safest way to prevent this is to make all of the single-argument
@@ -153,7 +134,7 @@ class PRDcallout
{
if ( iv_type == r.iv_type )
{
- return ( TYPE_TARGET == iv_type )
+ return ( PRDcalloutData::TYPE_TARGET == iv_type )
? iv_meldValue.target == r.iv_meldValue.target
: iv_meldValue.u32 == r.iv_meldValue.u32;
}
@@ -162,36 +143,32 @@ class PRDcallout
}
/** @brief Returns the callout type. */
- MruType getType() const { return iv_type; }
+ PRDcalloutData::MruType getType() const { return iv_type; }
/** @returns Returns the TargetHandle_t. */
TARGETING::TargetHandle_t getTarget() const { return iv_meldValue.target; }
- /** @returns Returns the PrdfMemoryMru. */
- PrdfMemoryMru getMemMru() const { return PrdfMemoryMru(iv_meldValue.u32); }
-
-#ifndef PRDF_ERRL_PARSER
+ /** @returns Returns the MemoryMru. */
+ MemoryMru getMemMru() const { return MemoryMru(iv_meldValue.u32); }
/** @brief Returns a uint32_t representation of the callout */
uint32_t flatten() const
{
switch ( iv_type )
{
- case TYPE_TARGET:
+ case PRDcalloutData::TYPE_TARGET:
return PlatServices::getHuid(iv_meldValue.target); break;
- case TYPE_MEMMRU:
- case TYPE_SYMFRU:
+ case PRDcalloutData::TYPE_MEMMRU:
+ case PRDcalloutData::TYPE_SYMFRU:
return iv_meldValue.u32; break;
default:
return 0;
}
}
-#endif
-
private:
- MruType iv_type;
+ PRDcalloutData::MruType iv_type;
union
{
diff --git a/src/usr/diag/prdf/common/plat/prdfMemoryMru.C b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H
index 77ead6ca4..f85f6eb3d 100755..100644
--- a/src/usr/diag/prdf/common/plat/prdfMemoryMru.C
+++ b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H
@@ -1,11 +1,11 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
-/* $Source: src/usr/diag/prdf/common/plat/prdfMemoryMru.C $ */
+/* $Source: src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H $ */
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2008,2013 */
+/* COPYRIGHT International Business Machines Corp. 2013 */
/* */
/* p1 */
/* */
@@ -21,18 +21,32 @@
/* */
/* IBM_PROLOG_END_TAG */
-#include <prdfMemoryMru.H>
+/** @file prdfCalloutsData.H
+ * @brief This is specifically designed to be included in both functional and
+ * error log parsing code (i.e. must be able to compile in PPC and
+ * x86.nfp contexts).
+ */
-//------------------------------------------------------------------------------
+#ifndef __prdfCalloutsData_H
+#define __prdfCalloutsData_H
-#ifndef PRDF_ERRL_PARSER
+namespace PRDF
+{
+
+namespace PRDcalloutData
+{
-TARGETING::TargetHandleList PrdfMemoryMru::getCalloutList() const
+enum MruType
{
- TARGETING::TargetHandleList o_dimmList;
+ TYPE_NONE,
+ TYPE_TARGET,
+ TYPE_MEMMRU,
+ TYPE_SYMFRU,
+};
+
+} // end namespace PRDcalloutData
- return o_dimmList;
-}
+} // end namespace PRDF
-#endif
+#endif // __prdfCalloutsData_H
diff --git a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C
index 6890a5537..74fb4f752 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C
+++ b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C
@@ -136,7 +136,7 @@ void ServiceDataCollector::SetCallout( PRDcallout mru,
{
bool found = false;
- if ( PRDcallout::TYPE_TARGET == mru.getType() )
+ if ( PRDcalloutData::TYPE_TARGET == mru.getType() )
{
// Ensuring target is not NULL
if ( NULL == mru.getTarget() )
@@ -296,6 +296,8 @@ uint32_t ServiceDataCollector::Flatten(uint8_t * i_buffer, uint32_t & io_size) c
ServiceDataCollector & ServiceDataCollector::operator=(
const uint8_t * i_flatdata )
{
+ using namespace PRDcalloutData;
+
error_signature.setChipId( buffer_get32(i_flatdata) );
error_signature.setSigId( buffer_get32(i_flatdata) );
@@ -303,9 +305,9 @@ ServiceDataCollector & ServiceDataCollector::operator=(
uint32_t value = buffer_get32(i_flatdata); // number of callouts
for ( uint32_t i = 0; i < value; ++i )
{
- PRDcallout::MruType mt = (PRDcallout::MruType) buffer_get32(i_flatdata);
- uint32_t mru = buffer_get32(i_flatdata);
- PRDpriority priority = (PRDpriority) buffer_get32(i_flatdata);
+ MruType mt = (MruType) buffer_get32(i_flatdata);
+ uint32_t mru = buffer_get32(i_flatdata);
+ PRDpriority priority = (PRDpriority) buffer_get32(i_flatdata);
PRDcallout callout( mru, mt );
xMruList.push_back( SdcCallout(callout, priority) );
diff --git a/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C b/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C
index 7138010de..467717fe1 100755
--- a/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C
+++ b/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C
@@ -572,7 +572,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
for (SDC_MRU_LIST::iterator i = fspmrulist.begin(); i < fspmrulist.end(); ++i)
{
thiscallout = i->callout;
- if ( PRDcallout::TYPE_SYMFRU == thiscallout.getType() )
+ if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() )
{
if ( (EPUB_PRC_SP_CODE == thiscallout.flatten()) ||
(EPUB_PRC_PHYP_CODE == thiscallout.flatten()) )
@@ -588,13 +588,11 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
SecondLevel = true;
}
}
- else if ( PRDcallout::TYPE_MEMMRU == thiscallout.getType() )
+ else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() )
{
- PrdfMemoryMru memMru = thiscallout.getMemMru();
+ MemoryMru memMru (thiscallout.flatten());
SrcWord9 = memMru.toUint32(); // Get MemMru value
-/* FIXME: RTC 47288 Add support after refactoring PrdfMemoryMru
-
TargetHandleList partList = memMru.getCalloutList();
uint32_t partCount = partList.size();
@@ -604,7 +602,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
// If we are in Concurrent Maintenance Mode, we will need to disable
// the Deferred Deconfig, if the callouts are not HOM_CM_FUNCTIONAL.
- // FIXME PlatServices::inCMMode() not available yet
+ /* FIXME: RTC 50063 PlatServices::inCMMode() not available yet
if (PlatServices::inCMMode())
{
if (partCount < 1)
@@ -628,9 +626,9 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
}
}
}
-*/
+ */
}
- else // PRDcallout::TYPE_TARGET
+ else // PRDcalloutData::TYPE_TARGET
{
HW = true; // Hardware callout
@@ -741,7 +739,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
//**************************************************************
// Add SDC Capture data to Error Log User Data here only if
// there are 4 or more callouts,
- // (including Dimm callouts in the PrdfMemoryMru).
+ // (including Dimm callouts in the MemoryMru).
//**************************************************************
bool capDataAdded = false;
if (calloutsPlusDimms > 3)
@@ -763,11 +761,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
//**************************************************************
fspmrulist = sdc.GetMruList();
uint32_t calloutcount = fspmrulist.size();
- for (SDC_MRU_LIST::iterator i = fspmrulist.begin(); i < fspmrulist.end(); ++i)
+ for ( SDC_MRU_LIST::iterator i = fspmrulist.begin();
+ i < fspmrulist.end(); ++i )
{
thispriority = (*i).priority;
thiscallout = (*i).callout;
- if ( PRDcallout::TYPE_TARGET == thiscallout.getType() )
+ if ( PRDcalloutData::TYPE_TARGET == thiscallout.getType() )
{
TargetHandle_t target = thiscallout.getTarget();
// Don't deconfig a Memory Controller for Bus Errors (Mc and SuperNova
@@ -801,23 +800,27 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
hcdbUpdate);
}
- else if ( PRDcallout::TYPE_MEMMRU == thiscallout.getType() )
+ else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() )
{
- // FIXME: RTC 47288 PrdfMemoryMru will need refactor later
- PrdfMemoryMru memMru = thiscallout.getMemMru();
-
- PRDF_HW_ADD_MEMMRU_CALLOUT(ForceTerminate,
- memMru,
- thispriority,
- deconfigState,
- gardState,
- errLog,
- writeVPD,
- gardErrType,
- severityParm,
- hcdbUpdate);
+ MemoryMru memMru (thiscallout.flatten());
+
+ TargetHandleList partList = memMru.getCalloutList();
+ for ( TargetHandleList::iterator it = partList.begin();
+ it != partList.end(); it++ )
+ {
+ PRDF_HW_ADD_CALLOUT( ForceTerminate,
+ *it,
+ thispriority,
+ deconfigState,
+ gardState,
+ errLog,
+ writeVPD,
+ gardErrType,
+ severityParm,
+ hcdbUpdate );
+ }
}
- else if ( PRDcallout::TYPE_SYMFRU == thiscallout.getType() )
+ else if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() )
{
thisProcedureID = epubProcedureID(thiscallout.flatten());
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
index e501bb7be..39917a826 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
@@ -26,9 +26,17 @@
#include <prdfCalloutUtil.H>
#include <iipServiceDataCollector.h>
+#include <prdfCenAddress.H>
+#include <prdfPlatServices.H>
+#include <prdfTrace.H>
+
+using namespace TARGETING;
namespace PRDF
{
+
+using namespace PlatServices;
+
namespace CalloutUtil
{
@@ -39,6 +47,99 @@ void defaultError( STEP_CODE_DATA_STRUCT & i_sc )
i_sc.service_data->SetServiceCall();
}
+//------------------------------------------------------------------------------
+
+TargetHandleList getConnectedDimms( TargetHandle_t i_mba,
+ const CenRank & i_rank )
+{
+ #define PRDF_FUNC "[CalloutUtil::getConnectedDimms] "
+
+ TargetHandleList o_list;
+
+ if ( TYPE_MBA != getTargetType(i_mba) )
+ {
+ PRDF_ERR( PRDF_FUNC"Invalid target type: HUID=0x%08x", getHuid(i_mba) );
+ }
+ else
+ {
+ TargetHandleList dimmList = getConnected( i_mba, TYPE_DIMM );
+ for ( TargetHandleList::iterator dimmIt = dimmList.begin();
+ dimmIt != dimmList.end(); dimmIt++)
+ {
+ uint8_t dimmSlct;
+ int32_t l_rc = getMbaDimm( *dimmIt, dimmSlct );
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"getMbaDimm(0x%08x) failed",
+ getHuid(*dimmIt) );
+ continue;
+ }
+
+ if ( dimmSlct == i_rank.getDimmSlct() )
+ {
+ o_list.push_back( *dimmIt );
+ }
+ }
+ }
+
+ return o_list;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+TargetHandleList getConnectedDimms( TargetHandle_t i_mba )
+{
+ TargetHandleList o_list;
+
+ if ( TYPE_MBA != getTargetType(i_mba) )
+ {
+ PRDF_ERR( "[CalloutUtil::getConnectedDimms] Invalid target type: "
+ "HUID=0x%08x", getHuid(i_mba) );
+ }
+ else
+ o_list = getConnected( i_mba, TYPE_DIMM );
+
+ return o_list;
+}
+
+//------------------------------------------------------------------------------
+
+TargetHandleList getConnectedDimms( TargetHandle_t i_mba,
+ const CenRank & i_rank,
+ uint8_t i_port )
+{
+ #define PRDF_FUNC "[CalloutUtil::getConnectedDimms] "
+
+ TargetHandleList o_list;
+
+ TargetHandleList dimmList = getConnectedDimms( i_mba, i_rank );
+
+ for ( TargetHandleList::iterator dimmIt = dimmList.begin();
+ dimmIt != dimmList.end(); dimmIt++)
+ {
+ uint8_t portSlct;
+ int32_t l_rc = getMbaPort( *dimmIt, portSlct );
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"getMbaPort(0x%08x) failed",
+ getHuid(*dimmIt) );
+ continue;
+ }
+
+ if ( portSlct == i_port )
+ {
+ o_list.push_back( *dimmIt );
+ }
+ }
+
+ return o_list;
+
+ #undef PRDF_FUNC
+}
+
} // end namespace CalloutUtil
+
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
index e364d5fbb..ff4f97baf 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
@@ -24,6 +24,8 @@
#ifndef prdfCalloutUtil_H
#define prdfCalloutUtil_H
+#include <prdfPlatServices.H>
+
/** @file prdfCalloutUtil.H
* @brief Utility functions for common, non-trivial callouts.
*/
@@ -31,6 +33,7 @@
namespace PRDF
{
+class CenRank;
struct STEP_CODE_DATA_STRUCT;
namespace CalloutUtil
@@ -44,7 +47,32 @@ namespace CalloutUtil
*/
void defaultError( STEP_CODE_DATA_STRUCT & i_sc );
+/**
+ * @param i_mba The target MBA.
+ * @param i_rank The target rank.
+ * @return A list of DIMMs connected to the MBA and rank.
+ */
+TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank );
+
+/**
+ * @param i_mba The target MBA.
+ * @return A list of DIMMs connected to the MBA.
+ */
+TARGETING::TargetHandleList getConnectedDimms(TARGETING::TargetHandle_t i_mba);
+
+/**
+ * @param i_mba The target MBA.
+ * @param i_rank The target rank.
+ * @param i_port MBA port.
+ * @return A list of DIMMs connected to the MBA and rank on a port.
+ */
+TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank,
+ uint8_t i_port );
+
} // end namespace CalloutUtil
+
} // end namespace PRDF
#endif // prdfCalloutUtil_H
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C
new file mode 100755
index 000000000..3f9c3d3dc
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C
@@ -0,0 +1,262 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2008,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/** @file prdfMemoryMru.C */
+
+#include <prdfMemoryMru.H>
+
+#include <prdfCalloutUtil.H>
+#include <prdfTrace.H>
+
+using namespace TARGETING;
+
+namespace PRDF
+{
+
+using namespace MemoryMruData;
+using namespace PlatServices;
+
+MemoryMru::MemoryMru() :
+ iv_mbaTarget(NULL), iv_rank(), iv_special(NO_SPECIAL_CALLOUT)
+{
+ iv_memMruMeld.u = 0;
+}
+
+//------------------------------------------------------------------------------
+
+MemoryMru::MemoryMru( uint32_t i_memMru ) :
+ iv_mbaTarget(NULL), iv_rank(), iv_special(NO_SPECIAL_CALLOUT)
+{
+ #define PRDF_FUNC "[MemoryMru::MemoryMru] "
+
+ iv_memMruMeld.u = i_memMru;
+
+ iv_memMruMeld.s.valid = 0; // initially invalidated
+
+ do
+ {
+ // Get MBA target
+ TargetHandleList nodeList = getFunctionalTargetList( TYPE_NODE );
+ for ( TargetHandleList::iterator nodeIt = nodeList.begin();
+ nodeIt != nodeList.end(); nodeIt++ )
+ {
+ if ( iv_memMruMeld.s.nodePos != getTargetPosition(*nodeIt) )
+ continue;
+
+ TargetHandleList mbaList = getConnected( *nodeIt, TYPE_MBA );
+ for ( TargetHandleList::iterator mbaIt = mbaList.begin();
+ mbaIt != mbaList.end(); mbaIt++ )
+ {
+ if ( iv_memMruMeld.s.mbaPos == getTargetPosition(*mbaIt) )
+ {
+ iv_mbaTarget = *mbaIt;
+ break;
+ }
+ }
+ if ( NULL != iv_mbaTarget ) break;
+ }
+ if ( NULL == iv_mbaTarget )
+ {
+ PRDF_ERR( PRDF_FUNC"Could not find functional MBA target: "
+ "nodePos=%d mbaPos=%d", iv_memMruMeld.s.nodePos,
+ iv_memMruMeld.s.mbaPos );
+ break;
+ }
+
+ // Get the rank
+ iv_rank = CenRank( iv_memMruMeld.s.rank );
+
+ // Get the symbol or special callout
+ if ( (FIRST_SPECIAL_CALLOUT <= iv_memMruMeld.s.symbol) &&
+ (iv_memMruMeld.s.symbol <= LAST_SPECIAL_CALLOUT) )
+ {
+ iv_special = (MemoryMruData::Callout)iv_memMruMeld.s.symbol;
+ }
+ else
+ {
+ if ( SYMBOLS_PER_RANK <= iv_memMruMeld.s.symbol)
+ {
+ PRDF_ERR( PRDF_FUNC"Invalid symbol value :%u",
+ iv_memMruMeld.s.symbol);
+ break;
+ }
+
+ int32_t rc = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank,
+ iv_memMruMeld.s.symbol,
+ iv_memMruMeld.s.pins,
+ iv_symbol );
+
+ if ( SUCCESS != rc)
+ {
+ PRDF_ERR( PRDF_FUNC"Can not create symbol from symbol value"
+ " :%u, pins:%u, rank:%u",
+ iv_memMruMeld.s.symbol,
+ iv_memMruMeld.s.pins,
+ iv_memMruMeld.s.rank );
+ break;
+ }
+
+ // Validation checks
+ CenSymbol::WiringType type = iv_symbol.getWiringType();
+
+ if ( type != CenSymbol::WiringType (iv_memMruMeld.s.wiringType))
+ {
+ PRDF_ERR( PRDF_FUNC"Wiring Type does not match type:%u "
+ "iv_memMruMeld.s.wiringType :%u",
+ type, iv_memMruMeld.s.wiringType);
+ break;
+ }
+
+ }
+
+ // If the code gets to this point the MemoryMru is valid.
+ iv_memMruMeld.s.valid = 1;
+
+ } while (0);
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+MemoryMru::MemoryMru( TARGETING::TargetHandle_t i_mbaTarget,
+ const CenRank & i_rank, const CenSymbol & i_symbol ) :
+ iv_mbaTarget(i_mbaTarget), iv_rank(i_rank),
+ iv_special(NO_SPECIAL_CALLOUT), iv_symbol( i_symbol )
+{
+ #define PRDF_FUNC "[MemoryMru::MemoryMru] "
+
+ iv_memMruMeld.u = 0;
+
+ do
+ {
+ TargetHandleList nodeList = getConnected( iv_mbaTarget, TYPE_NODE );
+ if ( 1 != nodeList.size() )
+ {
+ PRDF_ERR( PRDF_FUNC"Could not find node attached to MBA 0x%08x",
+ getHuid(iv_mbaTarget) );
+ break;
+ }
+
+ iv_memMruMeld.s.nodePos = getTargetPosition( nodeList[0] );
+ iv_memMruMeld.s.mbaPos = getTargetPosition( iv_mbaTarget );
+ iv_memMruMeld.s.rank = iv_rank.flatten();
+ iv_memMruMeld.s.symbol = iv_symbol.getSymbol();
+ iv_memMruMeld.s.pins = iv_symbol.getPins();
+ //TODO: RTC 68096 Add support for DRAM spare
+ iv_memMruMeld.s.dramSpared = 0;
+ iv_memMruMeld.s.wiringType = iv_symbol.getWiringType();
+
+ // If the code gets to this point the MemoryMru is valid.
+ iv_memMruMeld.s.valid = 1;
+
+ } while (0);
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+MemoryMru::MemoryMru( TARGETING::TargetHandle_t i_mbaTarget,
+ const CenRank & i_rank,
+ MemoryMruData::Callout i_specialCallout ) :
+ iv_mbaTarget(i_mbaTarget), iv_rank(i_rank), iv_special(i_specialCallout)
+{
+ #define PRDF_FUNC "[MemoryMru::MemoryMru] "
+
+ iv_memMruMeld.u = 0;
+
+ do
+ {
+ TargetHandleList nodeList = getConnected( iv_mbaTarget, TYPE_NODE );
+ if ( 1 != nodeList.size() )
+ {
+ PRDF_ERR( PRDF_FUNC"Could not find node attached to MBA 0x%08x",
+ getHuid(iv_mbaTarget) );
+ break;
+ }
+
+ iv_memMruMeld.s.nodePos = getTargetPosition( nodeList[0] );
+ iv_memMruMeld.s.mbaPos = getTargetPosition( iv_mbaTarget );
+ iv_memMruMeld.s.rank = iv_rank.flatten();
+ iv_memMruMeld.s.symbol = iv_special;
+
+ // If the code gets to this point the MemoryMru is valid.
+ iv_memMruMeld.s.valid = 1;
+
+ } while (0);
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+TargetHandleList MemoryMru::getCalloutList() const
+{
+ #define PRDF_FUNC "[MemoryMru::getCalloutList] "
+
+ TargetHandleList o_list;
+
+ if ( 0 == iv_memMruMeld.s.valid )
+ {
+ PRDF_ERR( PRDF_FUNC"MemoryMru 0x%08x not valid.", iv_memMruMeld.u );
+ }
+ else
+ {
+ if ( NO_SPECIAL_CALLOUT != iv_special )
+ {
+ switch ( iv_special )
+ {
+ case CALLOUT_RANK:
+ o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget,
+ iv_rank );
+ break;
+ case CALLOUT_RANK_AND_MBA:
+ o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget,
+ iv_rank );
+ o_list.push_back( iv_mbaTarget );
+ break;
+ case CALLOUT_ALL_MEM:
+ o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget );
+ break;
+ default:
+ PRDF_ERR( PRDF_FUNC"MemoryMruData::Callout 0x%02x not "
+ "supported", iv_special );
+ }
+ }
+ else
+ {
+ // Add DIMM represented by symbol
+ uint8_t ps = iv_symbol.getPortSlct();
+ o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget,
+ iv_rank, ps );
+ }
+ }
+
+ return o_list;
+
+ #undef PRDF_FUNC
+}
+
+} // end namespace PRDF
+
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H
new file mode 100755
index 000000000..a1cb63ab0
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H
@@ -0,0 +1,95 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2008,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/** @file prdfMemoryMru.H */
+
+#ifndef __prdfMemoryMru_H
+#define __prdfMemoryMru_H
+
+#include <prdfCenAddress.H>
+#include <prdfMemoryMruData.H>
+#include <prdfPlatServices.H>
+#include <prdfCenSymbol.H>
+
+namespace PRDF
+{
+
+/**
+ * @brief This is a container object that assists with callouts and FFDC for the
+ * mainstore memory subsystem. The intent is that it can show with the
+ * smallest possible granularity what part is failing (i.e. DIMM, rank,
+ * DRAM, a single pin on a DRAM, etc.).
+ */
+class MemoryMru
+{
+ public: // Constructors
+
+ /** @brief Default contructor. */
+ MemoryMru();
+
+ /**
+ * @brief Constructor from 32-bit representation of a memory MRU.
+ * @param i_memMru A 32-bit representation of a memory MRU.
+ */
+ explicit MemoryMru( uint32_t i_memMru );
+
+ /**
+ * @brief Constructor for single DIMM callouts.
+ * @param i_mbaTarget The MBA in which the error occurred.
+ * @param i_rank The rank in which the error occurred.
+ * @param i_symbol The symbol in which the error occurred.
+ */
+ MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, const CenRank & i_rank,
+ const CenSymbol & i_symbol );
+
+ /**
+ * @brief Constructor for special callouts.
+ * @param i_mbaTarget The MBA in which error has occured
+ * @param i_rank The rank in which the error occurred.
+ * @param i_specialCallout See enum MemoryMruData::Callout.
+ */
+ MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, const CenRank & i_rank,
+ MemoryMruData::Callout i_specialCallout );
+
+ public: // functions
+
+ /** @return The 32-bit representation of this MemoryMru. */
+ uint32_t toUint32() const { return iv_memMruMeld.u; }
+
+ /** @return A list of targets that are represented by this MemoryMru. */
+ TARGETING::TargetHandleList getCalloutList() const;
+
+ private: // instance variables
+
+ MemoryMruData::MemMruMeld iv_memMruMeld;
+
+ TARGETING::TargetHandle_t iv_mbaTarget; ///< Target MBA.
+ CenRank iv_rank; ///< Target rank
+ MemoryMruData::Callout iv_special; ///< See enum MemoryMruData::Callout
+ CenSymbol iv_symbol; ///< Target symbol
+};
+
+} // end namespace PRDF
+
+#endif // __prdfMemoryMru_H
+
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H
new file mode 100644
index 000000000..ee24f331a
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H
@@ -0,0 +1,103 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/** @file prdfMemoryMruData.H
+ * @brief This is specifically designed to be included in both functional and
+ * error log parsing code (i.e. must be able to compile in PPC and
+ * x86.nfp contexts).
+ */
+
+#ifndef __prdfMemoryMruData_H
+#define __prdfMemoryMruData_H
+
+#include <stdint.h>
+
+namespace PRDF
+{
+
+namespace MemoryMruData
+{
+
+/** Typically a MemoryMru callout is associated with a symbol (single DIMM
+ * callout), however, there are times were we cannot isolate down that far and
+ * instead need to callout a rank (pair of DIMMs) and the assoicated MBA.
+ * This enums will be used to indicate if any special callouts are needed.
+ */
+enum Callout
+{
+ // NOTE: These values will be stored in the symbol field of the uint32_t
+ // version of the MemoryMru so the values must fit within the
+ // 7-bits field and not collide with a valid symbol value.
+ NO_SPECIAL_CALLOUT = 0x6f,
+ FIRST_SPECIAL_CALLOUT = 0x70,
+
+ CALLOUT_RANK = FIRST_SPECIAL_CALLOUT,
+ CALLOUT_RANK_AND_MBA,
+ CALLOUT_ALL_MEM,
+
+ LAST_SPECIAL_CALLOUT = CALLOUT_ALL_MEM, // Absolute last value is 0x7f
+};
+
+union MemMruMeld
+{
+ uint32_t u; ///< The 32-bit version of the MemoryMru
+
+ struct
+ {
+ // NOTE: The combined total of all bits in this struct must add up to
+ // 32 bits.
+ // NOTE: There are some unused bits that can be used for future needs
+ // such as version number or wiring type.
+ // NOTE: The arrangement of bits should not change. This struct will be
+ // used for parsing the MemoryMru in the error log parser, which
+ // wil be used in multiple releases. You should be able to add a
+ // field using the unused bits depending on the usage of the
+ // field, however, if the structure changes, you must add a
+ // version field so that the error log parser know which format to
+ // used.
+
+ uint32_t valid : 1; ///< Used to indicate nothing failed while
+ ///< building the object (1=valid, 0=not valid)
+ uint32_t mbaPos : 7; ///< MBA position within node (0-127)
+
+ uint32_t pins : 2; ///< Even and/or Odd symbol pins
+ uint32_t nodePos : 3; ///< Node position (0-7)
+ uint32_t rank : 3; ///< Rank (0-7)
+
+ uint32_t dramSpared : 1; ///< True if symbol is on spared DRAM
+ uint32_t symbol : 7; ///< Symbol or SpecialCallout
+
+ // TODO: RTC 67376 Check if width for wiring type is enough
+ uint32_t wiringType : 5; ///< Wiring type
+
+ uint32_t unused : 3; ///< Reserved for future use
+
+ } s; ///< A struct defining the 32-bit version of the MemoryMru
+};
+
+} // end namespace MemoryMruData
+
+} // end namespace PRDF
+
+#endif // __prdfMemoryMruData_H
+
diff --git a/src/usr/diag/prdf/common/plat/prdfMemoryMru.H b/src/usr/diag/prdf/common/plat/prdfMemoryMru.H
deleted file mode 100755
index 282f7197a..000000000
--- a/src/usr/diag/prdf/common/plat/prdfMemoryMru.H
+++ /dev/null
@@ -1,114 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/diag/prdf/common/plat/prdfMemoryMru.H $ */
-/* */
-/* IBM CONFIDENTIAL */
-/* */
-/* COPYRIGHT International Business Machines Corp. 2008,2013 */
-/* */
-/* p1 */
-/* */
-/* Object Code Only (OCO) source materials */
-/* Licensed Internal Code Source Materials */
-/* IBM HostBoot Licensed Internal Code */
-/* */
-/* The source code for this program is not published or otherwise */
-/* divested of its trade secrets, irrespective of what has been */
-/* deposited with the U.S. Copyright Office. */
-/* */
-/* Origin: 30 */
-/* */
-/* IBM_PROLOG_END_TAG */
-
-#ifndef prdfMemoryMru_H
-#define prdfMemoryMru_H
-
-/** @file prdfMemoryMru.H
- */
-
-#include <stdint.h>
-
-#ifndef PRDF_ERRL_PARSER
- #include <prdfPlatServices.H>
-#endif
-
-// FIXME: RTC 47288 Will need to wrap this in PRDF namespace once external
-// interfaces are removed/modified.
-
-class PrdfMemoryMru
-{
- public:
-
- /**
- * @brief Used to specify the PrdfMemoryMru type.
- *
- * One requirement for all memory MRUs is that it must be able to be
- * converted into a 32-bit representation of the object. This number is then
- * passed around is different places, one in particular is word 9 of the
- * SRC. Eventually, data will need to be retrieved from the number. Since
- * the structure of each memory MRU may change, bits[0:2] of the 32-bit
- * number is reserved for the version type of the memory MRU. Based on the
- * version a new memory MRU can be constructed.
- *
- * NOTE: The reason MEMMRU_ECLIPZ starts with 3 is because in the original
- * P6 memory MRU there was a 4-bit field for the version type in which
- * the value was 6 (for P6). To save as much space as possible the
- * version field was reduced to 3 bits and the P6 version as changed
- * to 3. Thus, saving a bit of space without compromising the value of
- * that field.
- */
- enum PrdfMemMruVersion
- {
- MEMMRU_INVALID = 0, ///< An invalid memory MRU
- MEMMRU_ECLIPZ = 3, ///< A P6 MC memory MRU
- MEMMRU_APOLLO = 5, ///< A P7 MC memory MRU
- };
-
- public:
-
- /**
- * @brief Default contructor.
- */
- PrdfMemoryMru() : iv_memMruUint32( 0 ) {}
-
- /**
- * @brief Constructor from 32-bit representation of a memory MRU.
- * @param i_memMruUint32 A 32-bit representation of a memory MRU.
- */
- explicit PrdfMemoryMru( uint32_t i_memMruUint32 ) :
- iv_memMruUint32( i_memMruUint32 )
- {}
-
- /**
- * @brief Default destructor.
- */
- virtual ~PrdfMemoryMru() {}
-
- /**
- * @brief Returns the 32-bit representation of this memory MRU.
- * @return The 32-bit representation of this memory MRU.
- */
- virtual uint32_t toUint32() const
- { return iv_memMruUint32; }
-
-#ifndef PRDF_ERRL_PARSER
-
- /**
- * @brief Returns a list of targets that are represented by this
- * memory MRU.
- * @return The number of targets in the callout list is returned.
- */
- virtual TARGETING::TargetHandleList getCalloutList() const;
-
-#endif
-
- private:
-
- /** The 32-bit representation of this memory MRU. */
- uint32_t iv_memMruUint32;
-
-};
-
-#endif /* prdfMemoryMru_H */
-
diff --git a/src/usr/diag/prdf/common/prd_framework.mk b/src/usr/diag/prdf/common/prd_framework.mk
index c17cc2dcb..4bbc5194b 100755
--- a/src/usr/diag/prdf/common/prd_framework.mk
+++ b/src/usr/diag/prdf/common/prd_framework.mk
@@ -57,9 +57,6 @@ prd_service = \
prdfTargetServices.o \
xspprdsdbug.o
-prd_ss = \
- prdfMemoryMru.o
-
prd_resolution = \
iipResolution.o \
iipResolutionFactory.o \
@@ -87,7 +84,6 @@ prd_object_files = \
${prd_util} \
${prd_config} \
${prd_service} \
- ${prd_ss} \
${prd_resolution} \
${prd_register} \
diff --git a/src/usr/diag/prdf/common/prd_pegasus.mk b/src/usr/diag/prdf/common/prd_pegasus.mk
index 6d384b44a..97259971d 100755
--- a/src/usr/diag/prdf/common/prd_pegasus.mk
+++ b/src/usr/diag/prdf/common/prd_pegasus.mk
@@ -43,5 +43,6 @@ prd_pegasus_specific = \
prdfLineDelete.o \
prdfPegasusConfigurator.o \
prdfCenMbaCaptureData.o \
+ prdfMemoryMru.o \
prdfRegisterData.o
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
index de5c4d840..ba229628b 100644
--- a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
+++ b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
@@ -31,7 +31,8 @@
#include <prdfErrlUtil.H>
#include "common/prdfEnums.H"
#include "common/plat/pegasus/prdfCenMbaCaptureData.H"
-#include "common/plat/prdfMemoryMru.H"
+#include "common/plat/pegasus/prdfCenSymbol.H"
+#include "common/plat/pegasus/prdfMemoryMru.H"
#include "framework/service/prdfPlatServices.H"
using namespace HWAS;
@@ -104,17 +105,27 @@ bool addMemMruCallout(errlHndl_t & io_log, void * i_memMru)
bool o_term = false;
- PRDF_HW_ADD_MEMMRU_CALLOUT(
- o_term,
- *static_cast<PrdfMemoryMru *>(i_memMru),
- SRCI_PRIORITY_HIGH,
- HWSV::HOM_DECONFIG,
- HWSV::HOM_DECONFIG_GARD,
- io_log,
- false, // don't write src to vpd
- GARD_Predictive,
- ERRL_SEV_PREDICTIVE,
- false); // don't update hcdb
+ if ( NULL != i_memMru )
+ {
+ MemoryMru *memMru = static_cast<MemoryMru *>(i_memMru);
+
+ TargetHandleList partList = memMru->getCalloutList();
+ for ( TargetHandleList::iterator it = partList.begin();
+ it != partList.end(); it++ )
+ {
+ PRDF_HW_ADD_CALLOUT(
+ o_term,
+ *it,
+ SRCI_PRIORITY_HIGH,
+ HWSV::HOM_DECONFIG,
+ HWSV::HOM_DECONFIG_GARD,
+ io_log,
+ false, // don't write src to vpd
+ GARD_Predictive,
+ ERRL_SEV_PREDICTIVE,
+ false); // don't update hcdb
+ }
+ }
return o_term;
}
@@ -140,9 +151,7 @@ bool addDimmCallout(errlHndl_t & io_log, void * i_dimm)
return o_term;
}
-bool processRepairedRanks(
- TargetHandle_t i_mba,
- uint8_t i_repairedRankMask)
+bool processRepairedRanks( TargetHandle_t i_mba, uint8_t i_repairedRankMask )
{
PRDF_DENTER("processRepairedRanks: %p, 0x%02x",
i_mba, i_repairedRankMask);
@@ -194,29 +203,29 @@ bool processRepairedRanks(
continue;
}
- if((validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp))
- && validSymbol(cm))
+ if ( (validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp)) &&
+ validSymbol(cm) )
{
- // this rank has both a steer
- // and a chip mark
+ // This rank has both a steer and a chip mark. Call out the DIMM
+ // with the chip mark.
- // FIXME replace with a real memory mru
+ CenRank rank ( rankNumber );
- struct GetMemoryMru
+ CenSymbol symbol;
+ int32_t rc = CenSymbol::fromSymbol( i_mba, rank, cm,
+ CenSymbol::BOTH_SYMBOL_DQS,
+ symbol );
+ if ( SUCCESS != rc )
{
- PrdfMemoryMru * operator()(
- TargetHandle_t i_mba,
- uint8_t i_rank,
- uint8_t i_symbol)
- {
- return NULL;
- }
-
- } getMemoryMru;
+ PRDF_ERR( "[processRepairedRanks] CenSymbol::fromSymbol() "
+ "failed: HUID=0x%08x rank=%d symbol=%d",
+ PlatServices::getHuid(i_mba), rank.flatten(), cm );
+ continue;
+ }
- PrdfMemoryMru * memoryMru = getMemoryMru(i_mba, rankNumber, cm);
+ MemoryMru memoryMru( i_mba, rank, symbol );
- commitRestoreCallout( &addMemMruCallout, memoryMru, i_mba );
+ commitRestoreCallout( &addMemMruCallout, &memoryMru, i_mba );
calloutMade = true;
}
diff --git a/src/usr/diag/prdf/prdfErrlUtil.H b/src/usr/diag/prdf/prdfErrlUtil.H
index 22dd8d3c6..997906475 100644
--- a/src/usr/diag/prdf/prdfErrlUtil.H
+++ b/src/usr/diag/prdf/prdfErrlUtil.H
@@ -209,16 +209,6 @@
(const HWAS::GARD_ErrorType)i_gardErrType)
/**
- * @brief Error log interface to add a HW callout to an existing error log.
- */
-// FIXME:RTC: 65609 will address this issue.
-// will need to implement later
-#define PRDF_HW_ADD_MEMMRU_CALLOUT(io_sysTerm, i_memMRU, i_priority, \
- i_deconfigState, i_gardState, \
- io_errl, i_writeVpd, \
- i_gardErrType, i_severity, i_hcdb_update)
-
-/**
* @brief Process's pending deconfig and GARD service actions
* and thencommits and deletes the error log.
*/
OpenPOWER on IntegriCloud