summaryrefslogtreecommitdiffstats
path: root/src/usr/diag
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2013-03-22 13:42:52 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-04-09 16:58:30 -0500
commit2e593961823791a39b81bdea1e5efb3866638a39 (patch)
tree4523e51fae51ff909eed7f67c3f6e4663b73470b /src/usr/diag
parent4da1938d5da74ce5d77f47846b2f3348d00a3f46 (diff)
downloadtalos-hostboot-2e593961823791a39b81bdea1e5efb3866638a39.tar.gz
talos-hostboot-2e593961823791a39b81bdea1e5efb3866638a39.zip
PRD: Add support for Centaur addresses
Change-Id: I318ea9394f7d38659ac9f72a62124faa004b7ccb RTC: 67315 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3700 Tested-by: Jenkins Server Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3891
Diffstat (limited to 'src/usr/diag')
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Mba.rule4
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Membuf_regs_NEST.rule60
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.C277
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.H274
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMba.C45
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.C40
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.H101
-rwxr-xr-xsrc/usr/diag/prdf/common/prd_pegasus.mk2
8 files changed, 634 insertions, 169 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
index 4bb8fb3c0..3e8c67925 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
+++ b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
@@ -251,14 +251,14 @@ chip Mba
register MBMACA
{
- name "MBU.MBA01.MBA_MCBIST.SCOMFIR.MBMACAQ";
+ name "MBA Maintenance Command Start Address Register";
scomaddr 0x0301060D;
capture group default;
};
register MBMEA
{
- name "MBU.MBA01.MBA_MCBIST.SCOMFIR.MBMEAQ";
+ name "MBA Maintenance Command End Address Register";
scomaddr 0x0301060E;
capture group default;
};
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Membuf_regs_NEST.rule b/src/usr/diag/prdf/common/plat/pegasus/Membuf_regs_NEST.rule
index e3888b164..5e6d4e31b 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/Membuf_regs_NEST.rule
+++ b/src/usr/diag/prdf/common/plat/pegasus/Membuf_regs_NEST.rule
@@ -456,3 +456,63 @@
capture group default;
};
+ ############################################################################
+ # Memory ECC Error Address Registers
+ ############################################################################
+
+ register MBNCER_0
+ {
+ name "MBS Memory NCE Error Address 0 Register";
+ scomaddr 0x02011660;
+ capture group default;
+ };
+
+ register MBRCER_0
+ {
+ name "MBS Memory RCE Error Address 0 Register";
+ scomaddr 0x02011661;
+ capture group default;
+ };
+
+ register MBMPER_0
+ {
+ name "MBS Memory MPE Error Address 0 Register";
+ scomaddr 0x02011662;
+ capture group default;
+ };
+
+ register MBUER_0
+ {
+ name "MBS Memory UE Error Address 0 Register";
+ scomaddr 0x02011663;
+ capture group default;
+ };
+
+ register MBNCER_1
+ {
+ name "MBS Memory NCE Error Address 1 Register";
+ scomaddr 0x02011760;
+ capture group default;
+ };
+
+ register MBRCER_1
+ {
+ name "MBS Memory RCE Error Address 1 Register";
+ scomaddr 0x02011761;
+ capture group default;
+ };
+
+ register MBMPER_1
+ {
+ name "MBS Memory MPE Error Address 1 Register";
+ scomaddr 0x02011762;
+ capture group default;
+ };
+
+ register MBUER_1
+ {
+ name "MBS Memory UE Error Address 1 Register";
+ scomaddr 0x02011763;
+ capture group default;
+ };
+
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.C
new file mode 100755
index 000000000..e50fc5045
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.C
@@ -0,0 +1,277 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.C $ */
+/* */
+/* 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 prdfCenAddress.C
+ * @brief General utilities to read, modify, and write the memory address
+ * registers (MBMACA, MBMEA, etc.). Also includes the CenRank class.
+ */
+
+#include <prdfCenAddress.H>
+
+#include <prdfExtensibleChip.H>
+#include <prdfPlatServices.H>
+#include <prdfTrace.H>
+
+using namespace TARGETING;
+
+namespace PRDF
+{
+
+using namespace PlatServices;
+
+//------------------------------------------------------------------------------
+// MBS Address Registers
+//------------------------------------------------------------------------------
+
+ReadAddrReg READ_NCE_ADDR_0 = "MBNCER_0";
+ReadAddrReg READ_RCE_ADDR_0 = "MBRCER_0";
+ReadAddrReg READ_MPE_ADDR_0 = "MBMPER_0";
+ReadAddrReg READ_UE_ADDR_0 = "MBUER_0";
+
+ReadAddrReg READ_NCE_ADDR_1 = "MBNCER_1";
+ReadAddrReg READ_RCE_ADDR_1 = "MBRCER_1";
+ReadAddrReg READ_MPE_ADDR_1 = "MBMPER_1";
+ReadAddrReg READ_UE_ADDR_1 = "MBUER_1";
+
+//------------------------------------------------------------------------------
+
+int32_t cenGetReadAddr( ExtensibleChip * i_mbChip, ReadAddrReg i_addrReg,
+ CenAddr & o_addr )
+{
+ #define PRDF_FUNC "[cenGetReadAddr] "
+
+ int32_t o_rc = SUCCESS;
+
+ TargetHandle_t mbTarget = i_mbChip->GetChipHandle();
+
+ do
+ {
+ if ( TYPE_MEMBUF != getTargetType(mbTarget) )
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported target type" );
+ o_rc = FAIL; break;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * reg = i_mbChip->getRegister(i_addrReg);
+ o_rc = reg->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC" %s Read() failed", i_addrReg );
+ break;
+ }
+
+ uint32_t rank = reg->GetBitFieldJustified( 1, 3);
+ uint32_t bank = reg->GetBitFieldJustified( 7, 4);
+ uint32_t row = reg->GetBitFieldJustified(11,17);
+ uint32_t col = reg->GetBitFieldJustified(28,12);
+
+ uint32_t types = CenAddr::NONE;
+ if ( READ_NCE_ADDR_0 == i_addrReg || READ_NCE_ADDR_1 == i_addrReg )
+ types = CenAddr::NCE;
+ else if ( READ_RCE_ADDR_0 == i_addrReg || READ_RCE_ADDR_1 == i_addrReg )
+ types = CenAddr::RCE;
+ else if ( READ_MPE_ADDR_0 == i_addrReg || READ_MPE_ADDR_1 == i_addrReg )
+ types = CenAddr::MPE;
+ else if ( READ_UE_ADDR_0 == i_addrReg || READ_UE_ADDR_1 == i_addrReg )
+ types = CenAddr::UE;
+ else
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported register" );
+ o_rc = FAIL; break;
+ }
+
+ o_addr = CenAddr ( rank, bank, row, col, types );
+
+ } while (0);
+
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"Failed: HUID=0x%08x addrReg='%s'",
+ getHuid(mbTarget), i_addrReg );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+int32_t cenSetReadAddr( ExtensibleChip * i_mbChip, ReadAddrReg i_addrReg,
+ CenAddr i_addr )
+{
+ #define PRDF_FUNC "[cenSetReadAddr] "
+
+ int32_t o_rc = SUCCESS;
+
+ TargetHandle_t mbTarget = i_mbChip->GetChipHandle();
+
+ do
+ {
+ if ( TYPE_MEMBUF != getTargetType(mbTarget) )
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported target type" );
+ o_rc = FAIL; break;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * reg = i_mbChip->getRegister(i_addrReg);
+ reg->clearAllBits(); // clears out all status bits
+
+ reg->SetBitFieldJustified( 1, 3, i_addr.getRank().flatten() );
+ reg->SetBitFieldJustified( 7, 4, i_addr.getBank() );
+ reg->SetBitFieldJustified( 11, 17, i_addr.getRow() );
+ reg->SetBitFieldJustified( 28, 12, i_addr.getCol() );
+
+ o_rc = reg->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC" %s Write() failed", i_addrReg );
+ break;
+ }
+
+ } while (0);
+
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"Failed: HUID=0x%08x addrReg='%s'",
+ getHuid(mbTarget), i_addrReg );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+// MBA Address Registers
+//------------------------------------------------------------------------------
+
+MaintAddrReg MAINT_START_ADDR = "MBMACA";
+MaintAddrReg MAINT_END_ADDR = "MBMEA";
+
+//------------------------------------------------------------------------------
+
+int32_t cenGetMaintAddr( ExtensibleChip * i_mbaChip, MaintAddrReg i_addrReg,
+ CenAddr & o_addr )
+{
+ #define PRDF_FUNC "[cenGetMaintAddr] "
+
+ int32_t o_rc = SUCCESS;
+
+ TargetHandle_t mbaTarget = i_mbaChip->GetChipHandle();
+
+ do
+ {
+ if ( TYPE_MBA != getTargetType(mbaTarget) )
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported target type" );
+ o_rc = FAIL; break;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * reg = i_mbaChip->getRegister(i_addrReg);
+ o_rc = reg->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC" %s Read() failed", i_addrReg );
+ break;
+ }
+
+ uint32_t rank = reg->GetBitFieldJustified( 1, 3);
+ uint32_t bank = reg->GetBitFieldJustified( 7, 4);
+ uint32_t row = reg->GetBitFieldJustified(11,17);
+ uint32_t col = reg->GetBitFieldJustified(28,12);
+
+ uint32_t types = CenAddr::NONE;
+ if ( MAINT_START_ADDR == i_addrReg )
+ types = reg->GetBitFieldJustified(40,7);
+ else if ( MAINT_END_ADDR == i_addrReg )
+ types = CenAddr::NONE;
+ else
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported register" );
+ o_rc = FAIL; break;
+ }
+
+ o_addr = CenAddr ( rank, bank, row, col, types );
+
+ } while (0);
+
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"Failed: HUID=0x%08x addrReg='%s'",
+ getHuid(mbaTarget), i_addrReg );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+int32_t cenSetMaintAddr( ExtensibleChip * i_mbaChip, MaintAddrReg i_addrReg,
+ CenAddr i_addr )
+{
+ #define PRDF_FUNC "[cenSetMaintAddr] "
+
+ int32_t o_rc = SUCCESS;
+
+ TargetHandle_t mbaTarget = i_mbaChip->GetChipHandle();
+
+ do
+ {
+ if ( TYPE_MBA != getTargetType(mbaTarget) )
+ {
+ PRDF_ERR( PRDF_FUNC"Unsupported target type" );
+ o_rc = FAIL; break;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * reg = i_mbaChip->getRegister(i_addrReg);
+ reg->clearAllBits(); // clears out all status bits
+
+ reg->SetBitFieldJustified( 1, 3, i_addr.getRank().flatten() );
+ reg->SetBitFieldJustified( 7, 4, i_addr.getBank() );
+ reg->SetBitFieldJustified( 11, 17, i_addr.getRow() );
+ reg->SetBitFieldJustified( 28, 12, i_addr.getCol() );
+
+ o_rc = reg->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC" %s Write() failed", i_addrReg );
+ break;
+ }
+
+ } while (0);
+
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"Failed: HUID=0x%08x addrReg='%s'",
+ getHuid(mbaTarget), i_addrReg );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.H
new file mode 100755
index 000000000..960e9d484
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.H
@@ -0,0 +1,274 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenAddress.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 prdfCenAddress.H
+ * @brief General utilities to read, modify, and write the memory address
+ * registers (MBMACA, MBMEA, etc.). Also includes the CenRank class.
+ */
+
+#ifndef __prdfCenAddress_H
+#define __prdfCenAddress_H
+
+#include <prdf_types.h>
+
+namespace PRDF
+{
+
+class ExtensibleChip;
+
+//------------------------------------------------------------------------------
+// Class CenRank
+//------------------------------------------------------------------------------
+
+/**
+ * @brief Container for a memory rank.
+ */
+class CenRank
+{
+ public: // constructor
+
+ /** @brief Default constructor */
+ CenRank() { iv_rank.u = 0; }
+
+ /**
+ * @brief Constructor from flattened rank.
+ * @param i_rank The 3-bit rank.
+ * @note The rank format should be 0bDRR (D=DIMM select, R=rank select).
+ */
+ explicit CenRank( uint8_t i_rank ) { iv_rank.u = i_rank; }
+
+ /**
+ * @brief Constructor from components.
+ * @param i_dimmSlct The 1-bit DIMM select.
+ * @param i_rankSlct The 2-bit rank select.
+ */
+ CenRank( uint8_t i_dimmSlct, uint8_t i_rankSlct )
+ {
+ iv_rank.s.ds = i_dimmSlct;
+ iv_rank.s.rs = i_rankSlct;
+ }
+
+ /** @return The 1-bit DIMM select. */
+ uint8_t getDimmSlct() const { return iv_rank.s.ds; }
+
+ /** @return The 2-bit rank select. */
+ uint8_t getRankSlct() const { return iv_rank.s.rs; }
+
+ /**
+ * @brief Converts internal data structure to a uint8_t.
+ * @note The format will be 0bDRR (D=DIMM select, R=rank select).
+ * @return A uint8_t version of the rank.
+ */
+ uint8_t flatten() const { return iv_rank.u; }
+
+ /** @brief '==' operator */
+ bool operator==( const CenRank & i_rank ) const
+ { return ( this->flatten() == i_rank.flatten() ); }
+
+ /** @brief '<' operator */
+ bool operator<( const CenRank & i_rank ) const
+ { return ( this->flatten() < i_rank.flatten() ); }
+
+ private: // data
+
+ union
+ {
+ struct { uint8_t unused : 5; uint8_t ds : 1; uint8_t rs : 2; } s;
+ uint8_t u;
+ } iv_rank;
+};
+
+//------------------------------------------------------------------------------
+// Class CenAddr
+//------------------------------------------------------------------------------
+
+/**
+ * @brief Simple container for a memory address.
+ */
+class CenAddr
+{
+ public: // constants, enums
+
+ /** Some addresses are associated with a specific error type. For example,
+ * the address in the MBMACA will indicate what type of CE/UE caused the
+ * maintenance command to stop.
+ *
+ * From the MBMACA SCOM def:
+ * Multiple error status bits may be set due to unique errors on each
+ * 64 byte pieces of read data.
+ *
+ * Since it is possible to have multiple error types, iv_types will need to
+ * be an OR of all error types. The enum values will be mapped directly
+ * with MBMACA[40:46] so that the user can simply pass that 7-bit field
+ * into the i_types parameter of the contructor.
+ */
+ enum ErrorType
+ {
+ NONE = 0, ///< Unknown attention
+ NCE = 0x40, ///< New CE
+ SCE = 0x20, ///< CE on a symbol mark
+ MCE = 0x10, ///< CE on a chip mark
+ RCE = 0x08, ///< Retry CE
+ MPE = 0x04, ///< Mark placed error
+ SUE = 0x02, ///< SUE
+ UE = 0x01, ///< UE
+ };
+
+ public: // functions
+
+ /** @brief Default constructor. */
+ CenAddr() :
+ iv_rank(0), iv_types(NONE)
+ {
+ iv_bankRowCol.bank = 0;
+ iv_bankRowCol.row = 0;
+ iv_bankRowCol.col = 0;
+ }
+
+ /**
+ * @brief Constructor from components.
+ * @param i_rank The 3-bit master rank.
+ * @param i_bank The 4-bit bank.
+ * @param i_row The 17-bit row.
+ * @param i_col The 12-bit column.
+ * @param i_types An OR of all error types associated with this address (see
+ * enum ErrorType).
+ */
+ CenAddr( uint32_t i_rank, uint32_t i_bank, uint32_t i_row,
+ uint32_t i_col, uint32_t i_types = NONE ) :
+ iv_rank(i_rank), iv_types(i_types)
+ {
+ iv_bankRowCol.bank = i_bank;
+ iv_bankRowCol.row = i_row;
+ iv_bankRowCol.col = i_col;
+ }
+
+ /** @return This address's rank. */
+ const CenRank& getRank() const { return iv_rank; };
+
+ /** @return This address's bank. */
+ uint32_t getBank() const { return iv_bankRowCol.bank; };
+
+ /** @return This address's row. */
+ uint32_t getRow() const { return iv_bankRowCol.row; };
+
+ /** @return This address's column. */
+ uint32_t getCol() const { return iv_bankRowCol.col; };
+
+ /** @brief '==' operator */
+ bool operator==( const CenAddr & i_addr ) const
+ {
+ return ( this->getRank() == i_addr.getRank() &&
+ this->getBank() == i_addr.getBank() &&
+ this->getRow() == i_addr.getRow() &&
+ this->getCol() == i_addr.getCol() );
+ }
+
+ private: // instance variable
+
+ CenRank iv_rank; ///< Master rank (see CenRank class)
+
+ /** The bank, row, and column. Note that these are all packed in a struct
+ * to save space. */
+ struct __attribute__((__packed__))
+ {
+ uint32_t bank : 4; ///< b2-b0
+ uint32_t col : 12; ///< c13,c11,c9-c3 (c2-c0 are tied to 0)
+ uint32_t row : 17; ///< r16-r0
+ } iv_bankRowCol;
+
+ /** An OR of all error types assoiated with this address (see enum
+ * ErrorType). */
+ uint32_t iv_types;
+
+};
+
+//------------------------------------------------------------------------------
+// MBS Address Registers
+//------------------------------------------------------------------------------
+
+typedef const char * const ReadAddrReg;
+
+extern ReadAddrReg READ_NCE_ADDR_0; ///< For the MBNCER_0 register
+extern ReadAddrReg READ_RCE_ADDR_0; ///< For the MBRCER_0 register
+extern ReadAddrReg READ_MPE_ADDR_0; ///< For the MBMPER_0 register
+extern ReadAddrReg READ_UE_ADDR_0; ///< For the MBUER_0 register
+
+extern ReadAddrReg READ_NCE_ADDR_1; ///< For the MBNCER_1 register
+extern ReadAddrReg READ_RCE_ADDR_1; ///< For the MBRCER_1 register
+extern ReadAddrReg READ_MPE_ADDR_1; ///< For the MBMPER_1 register
+extern ReadAddrReg READ_UE_ADDR_1; ///< For the MBUER_1 register
+
+/**
+ * @brief Returns the address from the specified register.
+ * @param i_mbChip A Centaur chip.
+ * @param i_addrReg The target address register.
+ * @param o_addr The returned address from hardware.
+ * @return Non-SUCCESS if a register read fails, SUCCESS otherwise.
+ */
+int32_t cenGetReadAddr( ExtensibleChip * i_mbChip, ReadAddrReg i_addrReg,
+ CenAddr & o_addr );
+
+/**
+ * @brief Writes an address to the specified register.
+ * @param i_mbChip A Centaur chip.
+ * @param i_addrReg The target address register.
+ * @param i_addr The address to write to hardware.
+ * @return Non-SUCCESS if a register read fails, SUCCESS otherwise.
+ */
+int32_t cenSetReadAddr( ExtensibleChip * i_mbChip, ReadAddrReg i_addrReg,
+ CenAddr i_addr );
+
+//------------------------------------------------------------------------------
+// MBA Address Registers
+//------------------------------------------------------------------------------
+
+typedef const char * const MaintAddrReg;
+
+extern MaintAddrReg MAINT_START_ADDR; ///< For the MBMACA register
+extern MaintAddrReg MAINT_END_ADDR; ///< For the MBMEA register
+
+/**
+ * @brief Returns the address from the specified register.
+ * @param i_mbaChip An MBA chip.
+ * @param i_addrReg The target address register.
+ * @param o_addr The returned address from hardware.
+ * @return Non-SUCCESS if a register read fails, SUCCESS otherwise.
+ */
+int32_t cenGetMaintAddr( ExtensibleChip * i_mbaChip, MaintAddrReg i_addrReg,
+ CenAddr & o_addr );
+
+/**
+ * @brief Writes an address to the specified register.
+ * @param i_mbaChip An MBA chip.
+ * @param i_addrReg The target address register.
+ * @param i_addr The address to write to hardware.
+ * @return Non-SUCCESS if a register read fails, SUCCESS otherwise.
+ */
+int32_t cenSetMaintAddr( ExtensibleChip * i_mbChip, MaintAddrReg i_addrReg,
+ CenAddr i_addr );
+
+} // end namespace PRDF
+
+#endif // __prdfCenAddress_H
+
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMba.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMba.C
index 5bb2b1620..ef6727f55 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMba.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMba.C
@@ -31,6 +31,7 @@
#include <prdfPlatServices.H>
#include <prdfPluginMap.H>
+#include <prdfCenAddress.H>
#include <prdfCenMbaCaptureData.H>
#include <prdfCenMbaDataBundle.H>
@@ -119,6 +120,8 @@ PRDF_PLUGIN_DEFINE( Mba, PostAnalysis );
int32_t MaintCmdComplete( ExtensibleChip * i_mbaChip,
STEP_CODE_DATA_STRUCT & i_sc )
{
+ #define PRDF_FUNC "[Mba::MaintCmdComplete] "
+
using namespace TARGETING;
int32_t l_rc = SUCCESS;
@@ -128,20 +131,16 @@ int32_t MaintCmdComplete( ExtensibleChip * i_mbaChip,
{
#ifdef __HOSTBOOT_MODULE
- if ( PlatServices::isInMdiaMode() )
+ if ( isInMdiaMode() )
{
// Immediately inform mdia that the command
// has finished.
- l_rc = PlatServices::mdiaSendEventMsg( mbaTarget,
- MDIA::RESET_TIMER );
+ l_rc = mdiaSendEventMsg( mbaTarget, MDIA::RESET_TIMER );
if(l_rc)
{
- PRDF_ERR( "[Mba::MaintCmdComplete] "
- "PlatServices::mdiaSendEventMsg"
- " failed" );
-
+ PRDF_ERR( PRDF_FUNC"PlatServices::mdiaSendEventMsg() failed" );
// keep going
}
@@ -150,25 +149,20 @@ int32_t MaintCmdComplete( ExtensibleChip * i_mbaChip,
// the command will need to be restarted.
// Tuck this away until PostAnalysis.
- CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip );
-
- SCAN_COMM_REGISTER_CLASS * MBMACA =
- i_mbaChip->getRegister("MBMACA");
- SCAN_COMM_REGISTER_CLASS * MBMEA = i_mbaChip->getRegister("MBMEA");
-
- l_rc = MBMACA->Read();
- if (l_rc != SUCCESS) break;
-
- l_rc = MBMEA->Read();
- if (l_rc != SUCCESS) break;
+ CenAddr startAddr, endAddr;
+ l_rc = cenGetMaintAddr( i_mbaChip, MAINT_START_ADDR, startAddr );
+ l_rc |= cenGetMaintAddr( i_mbaChip, MAINT_END_ADDR, endAddr );
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"cenGetMbaAddr() failed" );
+ break;
+ }
+ CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip );
mbadb->iv_sendCmdCompleteMsg = true;
mbadb->iv_cmdCompleteMsgData =
- (MBMACA->GetBitFieldJustified(0, 40)
- == MBMEA->GetBitFieldJustified(0, 40))
- ? MDIA::COMMAND_COMPLETE
- : MDIA::COMMAND_STOPPED;
-
+ startAddr == endAddr ? MDIA::COMMAND_COMPLETE
+ : MDIA::COMMAND_STOPPED;
// Do not commit error log for a successful command complete.
if ( MDIA::COMMAND_COMPLETE == mbadb->iv_cmdCompleteMsgData )
i_sc.service_data->DontCommitErrorLog();
@@ -183,12 +177,13 @@ int32_t MaintCmdComplete( ExtensibleChip * i_mbaChip,
if ( SUCCESS != l_rc )
{
- PRDF_ERR( "[Mba::MaintCmdComplete] failed on MBA 0x%08x",
- PlatServices::getHuid(mbaTarget) );
+ PRDF_ERR( PRDF_FUNC"failed on MBA 0x%08x", getHuid(mbaTarget) );
CalloutUtil::defaultError( i_sc );
}
return l_rc;
+
+ #undef PRDF_FUNC
}
PRDF_PLUGIN_DEFINE( Mba, MaintCmdComplete );
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.C
deleted file mode 100755
index 88bfbc8f9..000000000
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.C
+++ /dev/null
@@ -1,40 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.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 */
-
-#include <prdfCenMbaAddress.H>
-
-// FIXME : via RTC 65231
-// Needs to revisit this file
-// There will be changes specific to P8 Addressing scheme
-// Currently This file only have skeleton code
-
-namespace PRDF
-{
-//------------------------------------------------------------------------------
-
-uint8_t CenMbaRank::toUint8() const
-{
- uint8_t temp = 0;
- return temp;
-}
-}
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.H
deleted file mode 100755
index d6df76870..000000000
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.H
+++ /dev/null
@@ -1,101 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaAddress.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 PRDF_CEN_MBA_ADDRESS_H
-#define PRDF_CEN_MBA_ADDRESS_H
-#include <prdf_types.h>
-
-/** @file prdfCenMbaAddress.H
- * @brief General utilities to read, modify, and write the memory controller's
- * address registers (MCMACA, MCMEA, MCRADR, MCRADRSDUE). Also includes
- * the CenMbaRank class.
- */
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-
-namespace PRDF
-{
-// FIXME : via RTC 65231
-// Needs to revisit this file
-// There will be changes specific to P8 Addressing scheme
-// Currently This file has just skeleton code
-//------------------------------------------------------------------------------
-// Class CenMbaRank
-//------------------------------------------------------------------------------
-
-/**
- * @brief Container for a memory rank.
- */
-class CenMbaRank
-{
- public: // constructor
-
- /**
- * @brief Default constructor
- */
- CenMbaRank() {};
-
- /**
- * @brief convert internal data structure to rank number
- * @return rank number
- */
- uint8_t toUint8() const;
-};
-
-/**
- * @brief Simple container for a memory address.
- */
-class CenMbaAddr
-{
- public:
-
- /** Starting with P7 DD2.0 each memory read error (MCRADR, MCRADRSDUE), or
- * maintenance command stopped by an error (MCMACA) will have a tag to
- * identify which type of error occured. */
- enum AttnType
- {
- UNKNOWN, ///< Unknown attention (default for DD1.0)
- CE, ///< CE
- READ_INT_UE, ///< Read-intermittent UE
- UE_WITH_CM, ///< Fast decoder UE fixed by a chip mark
- SLOW_DEC_UE, ///< Slow decoder UE
- MIRROR_SD_UE, ///< Mirrored slow decoder UE
- };
-
- /** @brief Default constructor. */
- CenMbaAddr() {};
-
- /**
- * @return rank class reference
- */
- const CenMbaRank& getRank() const { return iv_rank; };
-
- private:
- CenMbaRank iv_rank; ///< See class CenMbaRank
-};
-
-} //namespace PRDF
-#endif /* PRDF_CEN_MBA_ADDRESS_H */
-
diff --git a/src/usr/diag/prdf/common/prd_pegasus.mk b/src/usr/diag/prdf/common/prd_pegasus.mk
index de609ba57..614022a99 100755
--- a/src/usr/diag/prdf/common/prd_pegasus.mk
+++ b/src/usr/diag/prdf/common/prd_pegasus.mk
@@ -38,7 +38,7 @@ PRDF_RULE_PLUGINS_PEGASUS_WSIM = \
# PEGASUS specific objects, not rule related.
prd_pegasus_specific = \
prdfCalloutUtil.o \
- prdfCenMbaAddress.o \
+ prdfCenAddress.o \
prdfLineDelete.o \
prdfPegasusConfigurator.o \
prdfCenMbaCaptureData.o \
OpenPOWER on IntegriCloud