summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2015-11-20 15:16:30 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-12-11 13:01:34 -0600
commitd52716d1be73b27c3d3f5c3ffb84fef546cb6e45 (patch)
treec40bbee95ffdf1cf62b1dd93075eaaa8e7591960
parent622cb577234c37c6c349f51f569260d9d1205d86 (diff)
downloadtalos-hostboot-d52716d1be73b27c3d3f5c3ffb84fef546cb6e45.tar.gz
talos-hostboot-d52716d1be73b27c3d3f5c3ffb84fef546cb6e45.zip
PRD: common interface to add extended MemoryMru FFDC to error log
Change-Id: I8de67b0a41307519809147eb90445ea896df0933 Backport: release-fips840 CQ: SW329405 Depends-on: I8b33dd89e2fb431580b720f06b97b116bc871ce1 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/22441 Tested-by: Jenkins Server Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com> Reviewed-by: BENJAMIN J. WEISENBECK <bweisenb@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/22616 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/22684 Tested-by: Jenkins OP Build CI
-rw-r--r--src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C106
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C83
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H9
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H13
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfCenLogParse.C41
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfCenLogParse.H7
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfLogParse_common.C10
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfMemoryMruData.H47
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfPlatCalloutUtil.C8
9 files changed, 193 insertions, 131 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C
index 77f76587c..84045f93a 100644
--- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C
+++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C
@@ -37,7 +37,7 @@
#include <prdfCallouts.H>
#include <prdfMemoryMru.H>
#include <prdfPlatServices.H>
-#include <prdfCenLogParse.H>
+#include <prdfCenMbaCaptureData.H>
// For compression routines
#define PRDF_COMPRESSBUFFER_COMPRESS_FUNCTIONS
@@ -72,8 +72,6 @@
using namespace TARGETING;
-
-
namespace PRDF
{
@@ -606,89 +604,6 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
errlSev,
l_diagUpdate );
}
-
- // If we have a valid symbol in the memory MRU object, then we
- // should have one DIMM called out that we want the DQ map for.
- // If the symbol is not valid, then we will do nothing. If the
- // symbol is valid, but we have multiple callouts, then there is
- // probably something wrong.
- CenSymbol l_cenSymbol = memMru.getSymbol();
- if (l_cenSymbol.isValid())
- {
- if (1 == partList.size())
- {
- // Will make extra check that we have a DIMM
- TARGETING::TYPE l_type;
- l_type = getTargetType( partList[0] );
-
- if (TARGETING::TYPE_DIMM == l_type)
- {
- // Will be storing the CEN/IS DIMM indicator, cardtype,
- // and the 32 bit memmru prior to the 80 byte mapping
- memMruDqInfo l_memData;
- memset(&l_memData, 0, sizeof(memMruDqInfo));
-
- // Call routine to read the FAPI attribute for DQ map
- errlHndl_t l_fapiElog;
- l_fapiElog = getFapiDimmDqAttr(partList[0],
- &(l_memData.dqMapping[0]));
-
- if (NULL == l_fapiElog)
- {
- bool l_bufDimm;
- CEN_SYMBOL::WiringType l_cardWireType;
- int32_t l_chkRc;
- // Get MBA target from DIMM
- TargetHandle_t l_mba;
- l_mba = getConnectedParent(partList[0], TYPE_MBA);
- // Track if centaur or IS DIMM
- l_chkRc = isMembufOnDimm(l_mba, l_bufDimm);
- l_chkRc |= getMemBufRawCardType(l_mba,
- l_cardWireType);
-
- if (SUCCESS == l_chkRc)
- { // Put data into structure
- l_memData.bufferedDimm = l_bufDimm;
- l_memData.cardType = l_cardWireType;
- }
- else
- { // unable to determine anything
- l_memData.cardType = CEN_SYMBOL::WIRING_INVALID;
- }
-
- // Get the 32 bit representation of MemMru
- l_memData.memMru32bits = memMru.toUint32();
-
- // Get the DRAM width.
- l_memData.isX4 = isDramWidthX4( l_mba ) ? 1 : 0;
-
- // Add mapping to ELOG and parser will print it
- PRDF_ADD_FFDC( iv_errl, (const char*)(&l_memData),
- sizeof(memMruDqInfo),
- ErrlVer1, ErrlMruData_2 );
- } // end if success reading attribute
- else
- {
- PRDF_ERR( PRDF_FUNC "Fail on Read DQ mapping");
- PRDF_COMMIT_ERRL(l_fapiElog, ERRL_ACTION_REPORT);
- } // end else error reading attribute
-
- } // end if DIMM target
- else
- {
- PRDF_ERR( PRDF_FUNC "Not DIMM Target (%08X)",
- l_type );
- } // end else NOT DIMM
-
- } // end if just one part called out
- else
- { // more than one part called out
- PRDF_ERR( PRDF_FUNC "Valid Symbol with multiple parts (%d)",
- partList.size() );
- } // end else multiple parts called out with valid symbol
-
- } // if valid centaur symbol
-
}
else if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() )
{
@@ -789,6 +704,25 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
AddCapData( io_sdc.getTraceArrayData(), iv_errl );
}
+ //**************************************************************************
+ // Add extended MemoryMru error log sections (if needed).
+ //**************************************************************************
+
+ for ( SDC_MRU_LIST::const_iterator it = mruList.begin();
+ it < mruList.end(); ++it )
+ {
+ // Operate only on MemoryMru callouts.
+ if ( PRDcalloutData::TYPE_MEMMRU != it->callout.getType() ) continue;
+
+ // Only add single DIMM callouts. Otherwise, the parsed data is
+ // redundant.
+ MemoryMru memMru ( it->callout.flatten() );
+ if ( !memMru.getSymbol().isValid() ) continue;
+
+ // Add the MemoryMru to the capture data.
+ CenMbaCaptureData::addExtMemMruData( memMru, iv_errl );
+ }
+
// Note moved the code from here, that was associated with checking for the last
// functional core to be before the PFA data is placed in error log.
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
index b8c08049f..e87730332 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
@@ -33,6 +33,7 @@
// Framwork includes
#include <iipServiceDataCollector.h>
#include <prdfDramRepairUsrData.H>
+#include <prdfErrlUtil.H>
#include <prdfExtensibleChip.H>
#include <prdfRasServices.H>
#include <utilmem.H>
@@ -359,6 +360,88 @@ void captureDramRepairsVpd( TargetHandle_t i_mbaTrgt, CaptureData & io_cd )
#undef PRDF_FUNC
}
+//------------------------------------------------------------------------------
+
+void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl )
+{
+ #define PRDF_FUNC "[addExtMemMruData] "
+
+ MemoryMruData::ExtendedData extMemMru ( i_memMru.toUint32() );
+
+ do
+ {
+ int32_t l_rc = SUCCESS;
+
+ TargetHandle_t mbaTrgt = i_memMru.getMbaTrgt();
+
+ // Get the DRAM width.
+ extMemMru.isX4Dram = isDramWidthX4( mbaTrgt ) ? 1 : 0;
+
+ // Get the DIMM type.
+ bool isBufDimm = false;
+ l_rc = isMembufOnDimm( mbaTrgt, isBufDimm );
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed. MBA:0x%08x",
+ getHuid(mbaTrgt) );
+ break;
+ }
+ extMemMru.isBufDimm = isBufDimm ? 1 : 0;
+
+ if ( isBufDimm )
+ {
+ // Get the raw card type (CDIMMS only).
+ CEN_SYMBOL::WiringType cardType = CEN_SYMBOL::WIRING_INVALID;
+ l_rc = getMemBufRawCardType( mbaTrgt, cardType );
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getMemBufRawCardType() failed. MBA:0x%08x",
+ getHuid(mbaTrgt) );
+ break;
+ }
+ extMemMru.cardType = cardType;
+ }
+ else
+ {
+ // Get the 80-byte DQ map (ISDIMMS only). This is only needed if
+ // the MemoryMru contains a single DIMM callout with a valid symbol.
+ if ( i_memMru.getSymbol().isValid() )
+ {
+ TargetHandleList partList = i_memMru.getCalloutList();
+ if ( 1 != partList.size() ||
+ TYPE_DIMM != getTargetType(partList[0]) )
+ {
+ PRDF_ERR( PRDF_FUNC "Symbol is valid but callout is not a "
+ "single DIMM." );
+ break;
+ }
+
+ errlHndl_t l_errl = getFapiDimmDqAttr( partList[0],
+ &(extMemMru.dqMapping[0]) );
+ if ( NULL != l_errl )
+ {
+ PRDF_ERR( PRDF_FUNC "getFapiDimmDqAttr() failed. "
+ "DIMM:0x%08x", getHuid(partList[0]) );
+ PRDF_COMMIT_ERRL( l_errl, ERRL_ACTION_REPORT );
+ break;
+ }
+ }
+ }
+
+ // If we reach this point, nothing failed and the data is valid.
+ extMemMru.isValid = 1;
+
+ } while (0);
+
+ // Add the extended MemoryMru to the error log.
+ PRDF_ADD_FFDC( io_errl, (const char*)(&extMemMru), sizeof(extMemMru),
+ ErrlVer1, ErrlMruData_2 );
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
} //end namespace MbaCaptureData
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
index de570d6a6..4fa52c783 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
@@ -34,6 +34,7 @@
#include <targeting/common/targetservice.H>
#include <iipCaptureData.h>
#include <errlentry.H>
+#include <prdfMemoryMru.H>
namespace PRDF
{
@@ -100,6 +101,14 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_mbaTrgt,
void captureDramRepairsVpd( TARGETING::TargetHandle_t i_mbaTrgt,
CaptureData & io_cd );
+/**
+ * @brief Adds a new user data section to the error log containing a MemoryMru
+ * plus extended data for extra FFDC.
+ * @param i_mbaTrgt An MBA target
+ * @param io_errl Target error log.
+ */
+void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl );
+
} // end namespace MbaCaptureData
} // 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
index bc8090272..38f70bf6c 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H
@@ -82,11 +82,14 @@ class MemoryMru
/** @return A list of targets that are represented by this MemoryMru. */
TARGETING::TargetHandleList getCalloutList() const;
- /**
- * @brief Allows reading the symbol information
- * @return 'centaur symbol object'
- */
- CenSymbol getSymbol() { return iv_symbol; }
+ /** @return The MBA target associated with this MemoryMru. */
+ TARGETING::TargetHandle_t getMbaTrgt() const { return iv_mbaTarget; }
+
+ /** @return The rank associated with this MemoryMru. */
+ CenRank getRank() const { return iv_rank; }
+
+ /** @return The symbol associated with this MemoryMru. */
+ CenSymbol getSymbol() const { return iv_symbol; }
private: // instance variables
diff --git a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C
index 734c21262..9e5ceb386 100644
--- a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C
+++ b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.C
@@ -2796,14 +2796,14 @@ void getBadDqBitmapEntry( uint8_t * i_buffer, char * o_str )
//------------------------------------------------------------------------------
// Helper function for parseMemMruData()
-int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
+int32_t getMemMruDramSite( MemoryMruData::ExtendedData & i_extMemMru,
char * o_data )
{
char l_dqMapBuffer[10];
memset (l_dqMapBuffer, 0, 10);
int32_t o_rc = SUCCESS;
- MemoryMruData::MemMruMeld mm; mm.u = i_memDqStruct.memMru32bits;
+ MemoryMruData::MemMruMeld mm = i_extMemMru.mmMeld;
do
{
@@ -2811,7 +2811,7 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
uint8_t symbol = transEccSpare( mm.s.symbol,
mm.s.eccSpared );
- uint8_t type = i_memDqStruct.cardType;
+ uint8_t type = i_extMemMru.cardType;
uint8_t mbaPos = mm.s.mbaPos;
uint8_t ps = symbol2PortSlct( symbol );
uint8_t mrank = mm.s.mrank;
@@ -2822,7 +2822,7 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
const char ** dqMap;
// This routine will only succeed on CDIMMs
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
bool x4Dram = false; // Not used in this function.
o_rc = getDramSiteInfo( type, mbaPos, ps, mrank, x4Dram,
@@ -2835,7 +2835,7 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
uint8_t dqIdx = transDramSpare( symbol2CenDq(symbol),
mm.s.dramSpared );
- uint8_t dramIdx = dqSiteIdx2DramSiteIdx( dqIdx, i_memDqStruct.isX4 );
+ uint8_t dramIdx = dqSiteIdx2DramSiteIdx( dqIdx, i_extMemMru.isX4Dram );
// Add the DRAM site data based on the pin info.
strcpy( o_data, "" );
@@ -2843,33 +2843,33 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
switch ( mm.s.pins )
{
case EVEN_SYMBOL_DQ:
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
strcat( o_data, dqMap[dqIdx] );
}
else
{
snprintf( l_dqMapBuffer, 4, "%d",
- i_memDqStruct.dqMapping[dqIdx] );
+ i_extMemMru.dqMapping[dqIdx] );
strcat( o_data, l_dqMapBuffer );
}
break;
case ODD_SYMBOL_DQ:
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
strcat( o_data, dqMap[dqIdx+1] );
}
else
{
snprintf( l_dqMapBuffer, 4, "%d",
- i_memDqStruct.dqMapping[dqIdx+1] );
+ i_extMemMru.dqMapping[dqIdx+1] );
strcat( o_data, l_dqMapBuffer );
}
break;
case BOTH_SYMBOL_DQS:
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
strcat( o_data, dqMap[dqIdx] );
strcat( o_data, ", " );
@@ -2878,23 +2878,23 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
else
{
snprintf( l_dqMapBuffer, 10, "%d, %d",
- i_memDqStruct.dqMapping[dqIdx],
- i_memDqStruct.dqMapping[dqIdx+1] );
+ i_extMemMru.dqMapping[dqIdx],
+ i_extMemMru.dqMapping[dqIdx+1] );
strcat( o_data, l_dqMapBuffer );
}
break;
case NO_SYMBOL_DQS:
// blaming relevant dram since we aren't sure of DQ
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
strcat( o_data, dramMap[dramIdx] );
}
else
{
snprintf( l_dqMapBuffer, 10, "%d, %d",
- i_memDqStruct.dqMapping[dqIdx],
- i_memDqStruct.dqMapping[dqIdx+1] );
+ i_extMemMru.dqMapping[dqIdx],
+ i_extMemMru.dqMapping[dqIdx+1] );
strcat( o_data, l_dqMapBuffer );
}
break;
@@ -2908,12 +2908,15 @@ int32_t getMemMruDramSite( memMruDqInfo &i_memDqStruct,
return o_rc;
}
+
//------------------------------------------------------------------------------
-bool parseMemMruData( ErrlUsrParser & i_parser, memMruDqInfo &i_memDqStruct )
+
+bool parseMemMruData( ErrlUsrParser & i_parser,
+ MemoryMruData::ExtendedData & i_extMemMru )
{
bool o_rc = true;
- MemoryMruData::MemMruMeld mm; mm.u = i_memDqStruct.memMru32bits;
+ MemoryMruData::MemMruMeld mm = i_extMemMru.mmMeld;
uint8_t nodePos = mm.s.nodePos;
uint8_t cenPos = (mm.s.procPos << 3) | mm.s.cenPos;
@@ -2947,10 +2950,10 @@ bool parseMemMruData( ErrlUsrParser & i_parser, memMruDqInfo &i_memDqStruct )
{
char dramSite_str[DATA_SIZE] = { '\0' };
- getMemMruDramSite( i_memDqStruct, dramSite_str );
+ getMemMruDramSite( i_extMemMru, dramSite_str );
char l_sitePinString[5];
- if (i_memDqStruct.bufferedDimm)
+ if ( i_extMemMru.isBufDimm )
{
strcpy(l_sitePinString, "Site");
}
diff --git a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H
index 8a2e3f368..68a268484 100644
--- a/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H
+++ b/src/usr/diag/prdf/common/plugins/prdfCenLogParse.H
@@ -50,10 +50,11 @@ namespace FSP
* simply parses the data. It does not print header information (i.e.
* "MemoryMru") or print out the uint32_t value of the MemoryMru. It is
* up to the caller to add that data.
- * @param i_parser The error log parser.
- * @param i_memMru The MemoryMru data.
+ * @param i_parser The error log parser.
+ * @param i_extMemMru A MemoryMru with extended data for extra FFDC.
*/
-bool parseMemMruData( ErrlUsrParser & i_parser, memMruDqInfo &i_memDqStruct );
+bool parseMemMruData( ErrlUsrParser & i_parser,
+ MemoryMruData::ExtendedData & i_extMemMru );
/**
* @brief Parses Memory UE table.
diff --git a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C
index e138072e8..e58692ccd 100644
--- a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C
+++ b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C
@@ -707,7 +707,7 @@ bool parseMemMru( void * i_buffer, uint32_t i_buflen, ErrlUsrParser & i_parser )
bool parseDqMap( void * i_buffer, uint32_t i_buflen, ErrlUsrParser & i_parser )
{
bool o_rc = true;
- size_t l_size = sizeof(memMruDqInfo);
+ size_t l_size = sizeof(MemoryMruData::ExtendedData);
i_parser.PrintBlank();
@@ -720,15 +720,15 @@ bool parseDqMap( void * i_buffer, uint32_t i_buflen, ErrlUsrParser & i_parser )
else
{
// Data on input::has DQ mapping and a few other fields in a structure
- memMruDqInfo l_memData;
+ MemoryMruData::ExtendedData extMemMru;
UtilMem membuf( i_buffer, i_buflen );
- membuf >> l_memData;
+ membuf >> extMemMru;
char header[72];
- snprintf( header, 72, "MemoryMru (0x%08x)", l_memData.memMru32bits);
+ snprintf( header, 72, "MemoryMru (0x%08x)", extMemMru.mmMeld.u);
i_parser.PrintHeading( header );
- o_rc = parseMemMruData( i_parser, l_memData );
+ o_rc = parseMemMruData( i_parser, extMemMru );
}
diff --git a/src/usr/diag/prdf/common/plugins/prdfMemoryMruData.H b/src/usr/diag/prdf/common/plugins/prdfMemoryMruData.H
index 64f3b174b..075abbe17 100644
--- a/src/usr/diag/prdf/common/plugins/prdfMemoryMruData.H
+++ b/src/usr/diag/prdf/common/plugins/prdfMemoryMruData.H
@@ -34,19 +34,12 @@
#include <stdint.h>
#include <endian.h>
+#include <string.h>
+
+#include <prdfParserEnums.H>
namespace PRDF
{
-// Structure to contain memory DQ mapping and related info
-struct memMruDqInfo
-{
- uint32_t memMru32bits; // 32 bit MemoryMru format
- uint32_t cardType :8; // cardType for Centaur DIMMs
- uint32_t bufferedDimm :1; // 1=Centaur DIMM, 0=IS DIMM
- uint32_t isX4 :1; // 1=x4 DRAM DIMM, 0=x8 DRAM DIMM
- uint32_t reserved :22; // Future use / nice boundary
- uint8_t dqMapping[80]; // CenDQ to DimmDQ mapping
-};
#ifdef PRDF_HOSTBOOT_ERRL_PLUGIN
namespace HOSTBOOT
@@ -141,6 +134,40 @@ union MemMruMeld
} s; ///< A struct defining the 32-bit version of the MemoryMru
};
+/** Contains a MemoryMru and extended data for extra FFDC. */
+struct ExtendedData
+{
+ MemMruMeld mmMeld; ///< See MemMruMeld union
+ uint32_t cardType : 8; ///< Raw card type (Centaur DIMMs only)
+ uint32_t isBufDimm : 1; ///< 1=Centaur DIMM, 0=IS DIMM
+ uint32_t isX4Dram : 1; ///< 1=x4 DRAM DIMM, 0=x8 DRAM DIMM
+ uint32_t isValid : 1; ///< 1=struct contains valid data,
+ ///< 0=otherwise. Needed just in case there
+ ///< was a failure to gather extended data.
+ uint32_t reserved :21; ///< Future use / nice boundary
+ uint8_t dqMapping[80]; ///< Centaur DQ to DIMM DQ mapping (only used
+ ///< when the MemoryMru contains a single
+ ///< IS DIMM callout).
+
+ /** Default contructor */
+ ExtendedData() :
+ cardType(CEN_SYMBOL::WIRING_INVALID), isBufDimm(0), isX4Dram(0),
+ isValid(0), reserved(0)
+ {
+ mmMeld.u = 0;
+ memset( &dqMapping[0], 0x00, sizeof(dqMapping) );
+ }
+
+ /** Contructor from flattened MemoryMru */
+ explicit ExtendedData( uint32_t i_memMru ) :
+ cardType(CEN_SYMBOL::WIRING_INVALID), isBufDimm(0), isX4Dram(0),
+ isValid(0), reserved(0)
+ {
+ mmMeld.u = i_memMru;
+ memset( &dqMapping[0], 0x00, sizeof(dqMapping) );
+ }
+};
+
} // end namespace MemoryMruData
#ifdef PRDF_HOSTBOOT_ERRL_PLUGIN
} // end namespace HOSTBOOT
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfPlatCalloutUtil.C b/src/usr/diag/prdf/plat/pegasus/prdfPlatCalloutUtil.C
index 14a073b4c..9d07558b0 100644
--- a/src/usr/diag/prdf/plat/pegasus/prdfPlatCalloutUtil.C
+++ b/src/usr/diag/prdf/plat/pegasus/prdfPlatCalloutUtil.C
@@ -5,7 +5,9 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -32,6 +34,7 @@
// Pegasus includes
#include <prdfMemoryMru.H>
+#include <prdfCenMbaCaptureData.H>
using namespace TARGETING;
@@ -57,8 +60,7 @@ void calloutMemoryMru( errlHndl_t io_errl, const MemoryMru & i_memmru,
}
// Add the MemoryMru to the capture data.
- uint32_t tmpMru = i_memmru.toUint32();
- PRDF_ADD_FFDC( io_errl, &tmpMru, sizeof(tmpMru), ErrlVer1, ErrlMruData_1 );
+ CenMbaCaptureData::addExtMemMruData( i_memmru, io_errl );
}
} // end namespace CalloutUtil
OpenPOWER on IntegriCloud