summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2013-05-20 12:10:50 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-06-11 09:11:04 -0500
commitbb2e9e1adac63e8b12c881b546b757f8d8de5697 (patch)
tree0fc5e25035276bcb175a608c954e35da0b969dcc /src/usr/diag/prdf
parentaad40c5ff3cfea7c2901a2f96f6fe4c2c8568f9b (diff)
downloadtalos-hostboot-bb2e9e1adac63e8b12c881b546b757f8d8de5697.tar.gz
talos-hostboot-bb2e9e1adac63e8b12c881b546b757f8d8de5697.zip
PRD: simplified mss[G|S]etMarkStore interfaces
Change-Id: I8b85d462fb618b10e721ed61a6f2bbbf02ca9d93 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/4609 Tested-by: Jenkins Server Reviewed-by: Christopher T. Phan <cphan@us.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/4934
Diffstat (limited to 'src/usr/diag/prdf')
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C87
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H54
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H99
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C37
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C40
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H24
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C9
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C75
8 files changed, 267 insertions, 158 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
index 654c4b4a8..20a4cdea8 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
+++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
@@ -39,6 +39,7 @@
#include <prdfCenAddress.H>
#include <prdfCenDqBitmap.H>
+#include <prdfCenMarkstore.H>
#include <dimmBadDqBitmapFuncs.H> // for dimm[S|G]etBadDqBitmap()
@@ -314,98 +315,126 @@ int32_t setBadDqBitmap( TargetHandle_t i_mba, const CenRank & i_rank,
//------------------------------------------------------------------------------
-int32_t mssGetMarkStore( TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t & o_chipMark, uint8_t & o_symbolMark )
+int32_t mssGetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank,
+ CenMark & o_mark )
{
int32_t o_rc = SUCCESS;
errlHndl_t errl = NULL;
- PRD_FAPI_TO_ERRL( errl, mss_get_mark_store, getFapiTarget(i_mbaTarget),
- i_rank, o_chipMark, o_symbolMark );
+ uint8_t symbolMark, chipMark;
+ PRD_FAPI_TO_ERRL( errl, mss_get_mark_store, getFapiTarget(i_mba),
+ i_rank.flatten(), symbolMark, chipMark );
if ( NULL != errl )
{
PRDF_ERR( "[PlatServices::mssGetMarkStore] mss_get_mark_store() "
"failed. HUID: 0x%08x rank: %d",
- getHuid(i_mbaTarget), i_rank );
+ getHuid(i_mba), i_rank.flatten() );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL;
}
+ else
+ {
+ o_mark = CenMark( i_mba, i_rank, symbolMark, chipMark );
+ }
return o_rc;
}
//------------------------------------------------------------------------------
-int32_t mssSetMarkStore( TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t i_chipMark, uint8_t i_symbolMark )
+int32_t mssSetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank,
+ const CenMark & i_mark, bool & o_writeBlocked,
+ bool i_allowWriteBlocked )
{
+ #define PRDF_FUNC "[PlatServices::mssSetMarkStore] "
+
int32_t o_rc = SUCCESS;
errlHndl_t errl = NULL;
- // TODO: mss_put_mark_store() will give a certain return code if the write
- // to mark store was circumvented by hardware. Will need to check this
- // return code.
+ uint8_t symbolMark = i_mark.getSM().isValid() ? i_mark.getSM().getSymbol()
+ : MSS_INVALID_SYMBOL;
+ uint8_t chipMark = i_mark.getCM().isValid() ? i_mark.getCM().getSymbol()
+ : MSS_INVALID_SYMBOL;
- PRD_FAPI_TO_ERRL( errl, mss_put_mark_store, getFapiTarget(i_mbaTarget),
- i_rank, i_chipMark, i_symbolMark );
+ fapi::ReturnCode l_rc = mss_put_mark_store( getFapiTarget(i_mba),
+ i_rank.flatten(), symbolMark,
+ chipMark );
- if ( NULL != errl )
+ if ( i_allowWriteBlocked &&
+ fapi::RC_MSS_MAINT_MARKSTORE_WRITE_BLOCKED == l_rc )
{
- PRDF_ERR( "[PlatServices::mssSetMarkStore] mss_put_mark_store() "
- "failed. HUID: 0x%08x rank: %d cm: %d sm: %d",
- getHuid(i_mbaTarget), i_rank, i_chipMark, i_symbolMark );
- PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
- o_rc = FAIL;
+ o_writeBlocked = true;
+ }
+ else
+ {
+ errl = fapi::fapiRcToErrl(l_rc);
+ if ( NULL != errl )
+ {
+ PRDF_ERR( PRDF_FUNC"mss_put_mark_store() failed. HUID: 0x%08x "
+ "rank: %d sm: %d cm: %d", getHuid(i_mba),
+ i_rank.flatten(), symbolMark, chipMark );
+ PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
}
return o_rc;
+
+ #undef PRDF_FUNC
}
//------------------------------------------------------------------------------
-int32_t mssGetSteerMux( TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t & o_port0Spare, uint8_t & o_port1Spare,
- uint8_t & o_eccSpare )
+int32_t mssGetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank,
+ CenSymbol & o_port0Spare, CenSymbol & o_port1Spare,
+ CenSymbol & o_eccSpare )
{
int32_t o_rc = SUCCESS;
errlHndl_t errl = NULL;
- PRD_FAPI_TO_ERRL( errl, mss_check_steering, getFapiTarget(i_mbaTarget),
- i_rank, o_port0Spare, o_port1Spare, o_eccSpare );
+ uint8_t port0Spare, port1Spare, eccSpare;
+ PRD_FAPI_TO_ERRL( errl, mss_check_steering, getFapiTarget(i_mba),
+ i_rank.flatten(), port0Spare, port1Spare, eccSpare );
if ( NULL != errl )
{
PRDF_ERR( "[PlatServices::mssGetSteerMux] mss_check_steering() "
"failed. HUID: 0x%08x rank: %d",
- getHuid(i_mbaTarget), i_rank );
+ getHuid(i_mba), i_rank.flatten() );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL;
}
+ else
+ {
+ o_port0Spare = CenSymbol::fromSymbol( i_mba, i_rank, port0Spare );
+ o_port1Spare = CenSymbol::fromSymbol( i_mba, i_rank, port1Spare );
+ o_eccSpare = CenSymbol::fromSymbol( i_mba, i_rank, eccSpare );
+ }
return o_rc;
}
//------------------------------------------------------------------------------
-int32_t mssSetSteerMux( TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t i_symbol, bool i_x4EccSpare )
+int32_t mssSetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank,
+ const CenSymbol & i_symbol, bool i_x4EccSpare )
{
int32_t o_rc = SUCCESS;
errlHndl_t errl = NULL;
- PRD_FAPI_TO_ERRL( errl, mss_do_steering, getFapiTarget(i_mbaTarget),
- i_rank, i_symbol, i_x4EccSpare );
+ PRD_FAPI_TO_ERRL( errl, mss_do_steering, getFapiTarget(i_mba),
+ i_rank.flatten(), i_symbol.getSymbol(), i_x4EccSpare );
if ( NULL != errl )
{
PRDF_ERR( "[PlatServices::mssSetSteerMux] mss_do_steering "
"failed. HUID: 0x%08x rank: %d symbol: %d eccSpare: %c",
- getHuid(i_mbaTarget), i_rank, i_symbol,
+ getHuid(i_mba), i_rank.flatten(), i_symbol.getSymbol(),
i_x4EccSpare ? 'T' : 'F' );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL;
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
index 1cccfa675..24d975b38 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
+++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
@@ -56,7 +56,9 @@ namespace PRDF
{
class CenDqBitmap;
+class CenMark;
class CenRank;
+class CenSymbol;
namespace PlatServices
{
@@ -213,52 +215,60 @@ int32_t setBadDqBitmap( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank,
/**
* @brief Invokes the get mark store hardware procedure.
- * @param i_mbaTarget A MBA target.
- * @param i_rank Target rank (0-7).
- * @param o_chipMark A symbol associated with the returned chip mark.
- * @param o_symbolMark A symbol associated with the returned symbol mark.
+ * @param i_mba Target MBA.
+ * @param i_rank Target rank.
+ * @param o_mark The returned mark.
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
-int32_t mssGetMarkStore( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t & o_chipMark, uint8_t & o_symbolMark );
+int32_t mssGetMarkStore( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank, CenMark & o_mark );
/**
* @brief Invokes the set mark store hardware procedure.
- * @param i_mbaTarget A MBA target.
- * @param i_rank Target rank (0-7).
- * @param i_chipMark A symbol associated with the new chip mark.
- * @param i_symbolMark A symbol associated with the new symbol mark.
+ * @param i_mba Target MBA.
+ * @param i_rank Target rank.
+ * @param i_mark The mark to write.
+ * @param o_writeBlocked TRUE if a blocke write is allowed and hardware
+ * blocked the write to markstore.
+ * @param i_allowWriteBlocked TRUE if a blocked write is allowed. This means
+ * the user will need to read what hardware just
+ * placed in the markstore and retry. If FALSE and
+ * the write was blocked, this function will commit
+ * the FAPI error log and return a non-SUCCESS. The
+ * default value is FALSE.
* @note Both the chip mark and the symbol mark will be written at the same
- * time, so do a RMW operation to avoid overwriting a previous mark.
+ * time, so do a RMW operation to avoid overwritting a previous mark.
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
-int32_t mssSetMarkStore( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t i_chipMark, uint8_t i_symbolMark );
+int32_t mssSetMarkStore( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank, const CenMark & i_mark,
+ bool & o_writeBlocked,
+ bool i_allowWriteBlocked = false );
/**
* @brief Invokes the get steer mux hardware procedure.
- * @param i_mbaTarget A MBA target.
- * @param i_rank Target rank (0-7).
+ * @param i_mba Target MBA.
+ * @param i_rank Target rank.
* @param o_port0Spare A symbol associated with the spare on port 0.
* @param o_port1Spare A symbol associated with the spare on port 1.
* @param o_eccSpare A symbol associated with the ECC spare (x4 mode only).
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
-int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t & o_port0Spare, uint8_t & o_port1Spare,
- uint8_t & o_eccSpare );
+int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank,
+ CenSymbol & o_port0Spare, CenSymbol & o_port1Spare,
+ CenSymbol & o_eccSpare );
/**
* @brief Invokes the set steer mux hardware procedure.
- * @param i_mbaTarget A MBA target.
- * @param i_rank Target rank (0-7).
+ * @param i_mba Target MBA.
+ * @param i_rank Target rank.
* @param i_symbol A symbol associated with the DRAM to be spared.
* @param i_x4EccSpare If true, will set ECC spare instead (x4 mode only).
* @note The procedure will be able to derive the port from the given symbol.
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
-int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank,
- uint8_t i_symbol, bool i_x4EccSpare );
+int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank,
+ const CenSymbol & i_symbol, bool i_x4EccSpare );
/**
* @brief Returns the memory buffer raw card type (i.e. R/C A).
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H
new file mode 100644
index 000000000..38bf32245
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H
@@ -0,0 +1,99 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.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 */
+
+#ifndef prdfCenMarkstore_H
+#define prdfCenMarkstore_H
+
+/** @file prdfCenMarkstore.H */
+
+#include <prdfCenAddress.H>
+#include <prdfCenConst.H>
+#include <prdfCenSymbol.H>
+#include <prdfTargetFwdRef.H>
+
+//##############################################################################
+// class CenMark
+//##############################################################################
+
+namespace PRDF
+{
+
+/**
+ * @brief Container for a memory symbol and chip mark.
+ * @note When reading and writing markstore the symbol and chip marks are set
+ * or returned as a pair. This is a simple container to keep the two
+ * marks bundled.
+ */
+class CenMark
+{
+ public: // constructors
+
+ /** @brief Default constructor */
+ CenMark() :
+ iv_symbolMark(), iv_chipMark()
+ {}
+
+ /** @brief Constructor from components */
+ CenMark( CenSymbol i_symbolMark, CenSymbol i_chipMark ) :
+ iv_symbolMark(i_symbolMark), iv_chipMark(i_chipMark)
+ {}
+
+ /** @brief Constructor from components */
+ CenMark( TARGETING::TargetHandle_t i_mba, CenRank i_rank,
+ uint8_t i_symbolMark, uint8_t i_chipMark )
+ {
+ iv_symbolMark = CenSymbol::fromSymbol( i_mba, i_rank, i_symbolMark );
+ iv_chipMark = CenSymbol::fromSymbol( i_mba, i_rank, i_chipMark );
+ }
+
+ public: // functions
+
+ /** @return A symbol representing the symbol mark. */
+ CenSymbol getSM() const { return iv_symbolMark; }
+
+ /** @return A symbol representing the chip mark. */
+ CenSymbol getCM() const { return iv_chipMark; }
+
+ /** @brief Sets the symbol mark to the given symbol. */
+ void setSM( CenSymbol i_symbolMark ) { iv_symbolMark = i_symbolMark; }
+
+ /** @brief Sets the chip mark to the given symbol. */
+ void setCM( CenSymbol i_chipMark ) { iv_chipMark = i_chipMark; }
+
+ /** @brief Sets the symbol mark to an invalid symbol. */
+ void clearSM() { iv_symbolMark = CenSymbol(); }
+
+ /** @brief Sets the chip mark to an invalid symbol. */
+ void clearCM() { iv_chipMark = CenSymbol(); }
+
+ private: // instance variables
+
+ CenSymbol iv_symbolMark; ///< A symbol representing the symbol mark.
+ CenSymbol iv_chipMark; ///< A symbol representing the chip mark.
+
+};
+
+} // end namespace PRDF
+
+#endif // prdfCenMarkstore_H
+
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
index 0e55bd69f..8fdcfd3d3 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
@@ -33,6 +33,8 @@
#include <iipServiceDataCollector.h>
#include <prdf_ras_services.H>
+#include <prdfCenMarkstore.H>
+
namespace PRDF
{
@@ -67,35 +69,36 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_mbaTarget,
DramRepairMbaData mbaData;
// Iterate all ranks to get DRAM repair data
- for(int rank = 0; rank < MAX_RANKS_PER_MBA ; rank++)
+ for ( uint32_t r = 0; r < MAX_RANKS_PER_MBA; r++ )
{
- DramRepairRankData rankData;
- rankData.rank = rank;
-
- // Get DRAM Repair data
+ CenRank rank ( r );
- rc = PlatServices::mssGetMarkStore( i_mbaTarget, rankData.rank,
- rankData.chipMark, rankData.symbolMark );
-
- if (SUCCESS != rc)
+ // Get chip/symbol marks
+ CenMark mark;
+ rc = PlatServices::mssGetMarkStore( i_mbaTarget, rank, mark );
+ if ( SUCCESS != rc )
{
PRDF_ERR("Failed to get markstore data");
continue;
}
- rc = PlatServices::mssGetSteerMux( i_mbaTarget, rankData.rank,
- rankData.port0Spare,
- rankData.port1Spare,
- rankData.eccSpare );
-
- if (SUCCESS != rc)
+ // Get DRAM spares
+ CenSymbol sp0, sp1, ecc;
+ rc = PlatServices::mssGetSteerMux( i_mbaTarget, rank, sp0, sp1, ecc );
+ if ( SUCCESS != rc )
{
PRDF_ERR("Failed to get DRAM steer data");
continue;
}
- // Check id rank had some DRAM repair data
- if( rankData.valid() )
+ // Add data
+ DramRepairRankData rankData = { rank.flatten(),
+ mark.getCM().getSymbol(),
+ mark.getSM().getSymbol(),
+ sp0.getSymbol(),
+ sp1.getSymbol(),
+ ecc.getSymbol() };
+ if ( rankData.valid() )
{
mbaData.rankDataList.push_back(rankData);
}
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C
index fe28589ba..38edaea21 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C
@@ -37,25 +37,24 @@ using namespace PlatServices;
// class CenSymbol
//##############################################################################
-int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank,
- uint8_t i_symbol, uint8_t i_pins,
- CenSymbol & o_symbol )
+CenSymbol CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank,
+ uint8_t i_symbol, uint8_t i_pins )
{
#define PRDF_FUNC "[CenSymbol::fromSymbol] "
- int32_t o_rc = SUCCESS;
+ CenSymbol o_symbol; // default contructor is invalid.
do
{
if ( TYPE_MBA != getTargetType(i_mba) )
{
PRDF_ERR( PRDF_FUNC"i_mba is invalid" );
- o_rc = FAIL; break;
+ break;
}
WiringType wiringType = WIRING_INVALID;
- o_rc = getWiringType( i_mba, i_rank, wiringType );
- if ( SUCCESS != o_rc )
+ int32_t l_rc = getWiringType( i_mba, i_rank, wiringType );
+ if ( SUCCESS != l_rc )
{
PRDF_ERR( PRDF_FUNC"getWiringType() failed" );
break;
@@ -64,14 +63,12 @@ int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank,
if ( SYMBOLS_PER_RANK <= i_symbol )
{
PRDF_ERR( PRDF_FUNC"i_symbol is invalid" );
- o_rc = FAIL;
break;
}
if ( BOTH_SYMBOL_DQS < i_pins )
{
PRDF_ERR( PRDF_FUNC"i_pins is invalid" );
- o_rc = FAIL;
break;
}
@@ -79,47 +76,46 @@ int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank,
} while (0);
- if ( SUCCESS != o_rc )
+ if ( !o_symbol.isValid() )
{
PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_rank=%d i_symbol=%d "
"i_pins=%d", getHuid(i_mba), i_rank.flatten(), i_symbol,
i_pins );
}
- return o_rc;
+ return o_symbol;
#undef PRDF_FUNC
}
//------------------------------------------------------------------------------
-int32_t CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank,
- uint8_t i_dimmDq, uint8_t i_portSlct,
- CenSymbol & o_symbol )
+CenSymbol CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank,
+ uint8_t i_dimmDq, uint8_t i_portSlct )
{
#define PRDF_FUNC "[CenSymbol::fromDimmDq] "
- int32_t o_rc = SUCCESS;
+ CenSymbol o_symbol; // default contructor is invalid.
do
{
if ( TYPE_MBA != getTargetType(i_mba) )
{
PRDF_ERR( PRDF_FUNC"i_mba is invalid" );
- o_rc = FAIL; break;
+ break;
}
WiringType wiringType = WIRING_INVALID;
- o_rc = getWiringType( i_mba, i_rank, wiringType );
- if ( SUCCESS != o_rc )
+ int32_t l_rc = getWiringType( i_mba, i_rank, wiringType );
+ if ( SUCCESS != l_rc )
{
PRDF_ERR( PRDF_FUNC"getWiringType() failed" );
break;
}
uint8_t symbol;
- o_rc = getSymbol( i_rank, wiringType, i_dimmDq, i_portSlct, symbol );
- if ( SUCCESS != o_rc )
+ l_rc = getSymbol( i_rank, wiringType, i_dimmDq, i_portSlct, symbol );
+ if ( SUCCESS != l_rc )
{
PRDF_ERR( PRDF_FUNC"getSymbol() failed" );
break;
@@ -132,14 +128,14 @@ int32_t CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank,
} while (0);
- if ( SUCCESS != o_rc )
+ if ( !o_symbol.isValid() )
{
PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_rank=%d i_dimmDq=%d "
"i_portSlct=%d", getHuid(i_mba), i_rank.flatten(), i_dimmDq,
i_portSlct );
}
- return o_rc;
+ return o_symbol;
#undef PRDF_FUNC
}
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H
index ccd1f8ec4..0bfc86dfd 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H
@@ -72,7 +72,7 @@ class CenSymbol
*/
CenSymbol() :
iv_mbaTarget(NULL), iv_rank(), iv_wiringType(WIRING_INVALID),
- iv_symbol(0), iv_pins(NO_SYMBOL_DQS)
+ iv_symbol(SYMBOLS_PER_RANK), iv_pins(NO_SYMBOL_DQS)
{}
private: // constructor
@@ -94,12 +94,12 @@ class CenSymbol
* @param i_rank The rank this symbol is on.
* @param i_symbol The input symbol.
* @param i_pins See enum DqMask.
- * @param o_symbol The returned symbol object.
- * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise.
+ * @return A CenSymbol. Must call isValid() to determine if the function was
+ * successful in creating a valid object.
*/
- static int32_t fromSymbol( TARGETING::TargetHandle_t i_mba,
- const CenRank & i_rank, uint8_t i_symbol,
- uint8_t i_pins, CenSymbol & o_symbol );
+ static CenSymbol fromSymbol( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank, uint8_t i_symbol,
+ uint8_t i_pins = NO_SYMBOL_DQS );
/**
* @brief Creates a CenSymbol from a DIMM DQ.
@@ -112,11 +112,12 @@ class CenSymbol
* For IS DIMMs, the mapping between DIMM DQ and Centaur DQ is
* determined by card that the DIMM is plugged into. See enum
* WiringType for more details.
- * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise.
+ * @return A CenSymbol. Must call isValid() to determine if the function was
+ * successful in creating a valid object.
*/
- static int32_t fromDimmDq( TARGETING::TargetHandle_t i_mba,
- const CenRank & i_rank, uint8_t i_dimmDq,
- uint8_t i_portSlct, CenSymbol & o_symbol );
+ static CenSymbol fromDimmDq( TARGETING::TargetHandle_t i_mba,
+ const CenRank & i_rank, uint8_t i_dimmDq,
+ uint8_t i_portSlct );
/**
* @brief Returns the dimm's wiring type.
@@ -129,6 +130,9 @@ class CenSymbol
const CenRank & i_rank,
WiringType & o_wiringType );
+ /** @return true if symbol is within the valid range, false otherwise. */
+ bool isValid() const { return iv_symbol < SYMBOLS_PER_RANK; }
+
/** @return This symbol's wiring type. */
WiringType getWiringType() const { return iv_wiringType; }
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C
index bba6248f5..177a64d91 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C
@@ -122,12 +122,11 @@ MemoryMru::MemoryMru( uint32_t i_memMru ) :
break;
}
- int32_t rc = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank,
- iv_memMruMeld.s.symbol,
- iv_memMruMeld.s.pins,
- iv_symbol );
+ iv_symbol = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank,
+ iv_memMruMeld.s.symbol,
+ iv_memMruMeld.s.pins );
- if ( SUCCESS != rc)
+ if ( !iv_symbol.isValid() )
{
PRDF_ERR( PRDF_FUNC"Can not create symbol from symbol value"
" :%u, pins:%u, rank:%u",
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
index 8e4e95de9..4e58f4f2f 100644
--- a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
+++ b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C
@@ -33,6 +33,7 @@
#include "common/plat/pegasus/prdfCenMbaCaptureData.H"
#include "common/plat/pegasus/prdfCalloutUtil.H"
#include "common/plat/pegasus/prdfCenDqBitmap.H"
+#include "common/plat/pegasus/prdfCenMarkstore.H"
#include "common/plat/pegasus/prdfCenSymbol.H"
#include "common/plat/pegasus/prdfMemoryMru.H"
#include "framework/service/prdfPlatServices.H"
@@ -166,63 +167,35 @@ bool processRepairedRanks( TargetHandle_t i_mba, uint8_t i_repairedRankMask )
// check each rank for repairs
// that violate RAS policy
- for ( uint8_t rankNumber = 0;
- rankNumber < DIMM_DQ_MAX_MBAPORT_DIMMS * DIMM_DQ_MAX_DIMM_RANKS;
- ++rankNumber )
+ for ( uint8_t r = 0; r < MAX_RANKS_PER_MBA; ++r )
{
- if(0 == ((0x80 >> rankNumber) & i_repairedRankMask))
+ if ( 0 == (i_repairedRankMask & (1 << r)) )
{
- // this rank didn't have any repairs
-
- continue;
+ continue; // this rank didn't have any repairs
}
- uint8_t sm = INVALID_SYMBOL,
- cm = INVALID_SYMBOL;
+ CenRank rank ( r );
+ CenMark mark;
- if(SUCCESS != PlatServices::mssGetMarkStore(
- i_mba, rankNumber, cm, sm))
+ if ( SUCCESS != PlatServices::mssGetMarkStore(i_mba, rank, mark) )
{
- // skip this rank
-
- continue;
+ continue; // skip this rank
}
- uint8_t sp0 = INVALID_SYMBOL,
- sp1 = INVALID_SYMBOL,
- sp = INVALID_SYMBOL;
+ CenSymbol sp0, sp1, sp;
- if(SUCCESS != PlatServices::mssGetSteerMux(
- i_mba,
- rankNumber,
- sp0, sp1, sp))
+ if ( SUCCESS != PlatServices::mssGetSteerMux(i_mba, rank, sp0, sp1, sp))
{
- // skip this rank
-
- continue;
+ continue; // skip this rank
}
- if ( (validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp)) &&
- validSymbol(cm) )
+ if ( (sp0.isValid() || sp1.isValid() || sp.isValid()) &&
+ mark.getCM().isValid() )
{
// This rank has both a steer and a chip mark. Call out the DIMM
// with the chip mark.
- CenRank rank ( rankNumber );
-
- CenSymbol symbol;
- int32_t rc = CenSymbol::fromSymbol( i_mba, rank, cm,
- CenSymbol::BOTH_SYMBOL_DQS,
- symbol );
- if ( SUCCESS != rc )
- {
- PRDF_ERR( "[processRepairedRanks] CenSymbol::fromSymbol() "
- "failed: HUID=0x%08x rank=%d symbol=%d",
- PlatServices::getHuid(i_mba), rank.flatten(), cm );
- continue;
- }
-
- MemoryMru memoryMru( i_mba, rank, symbol );
+ MemoryMru memoryMru( i_mba, rank, mark.getCM() );
commitRestoreCallout( &addMemMruCallout, &memoryMru, i_mba );
@@ -382,24 +355,20 @@ void deployDramSpares(TargetHandle_t i_mba)
bool x4 = PlatServices::isDramWidthX4(i_mba);
- for ( uint8_t rankNumber = 0;
- rankNumber < DIMM_DQ_MAX_MBAPORT_DIMMS * DIMM_DQ_MAX_DIMM_RANKS;
- ++rankNumber )
+ for ( uint32_t r = 0; r < MAX_RANKS_PER_MBA; r++ )
{
+ CenRank rank ( r );
+ CenSymbol symbol = CenSymbol::fromSymbol( i_mba, rank, 0 );
+
// ignore errors from putSteerMux
static_cast<void>(
- PlatServices::mssSetSteerMux(
- i_mba,
- rankNumber,
- 0, false));
+ PlatServices::mssSetSteerMux(i_mba, rank, symbol, false) );
- if( x4 ) {
+ if( x4 )
+ {
static_cast<void>(
- PlatServices::mssSetSteerMux(
- i_mba,
- rankNumber,
- 0, true));
+ PlatServices::mssSetSteerMux(i_mba, rank, symbol, true) );
}
}
}
OpenPOWER on IntegriCloud