summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2018-07-06 15:58:10 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-08-21 15:34:17 -0500
commit52093c412c62b30efe47a03efcce4b6badefd4f2 (patch)
tree4849eeb7aaa22816e60fc1e1d62f598ade2c9630
parent437807d50d4a3681af9d751a567d689f831b0903 (diff)
downloadblackbird-hostboot-52093c412c62b30efe47a03efcce4b6badefd4f2.tar.gz
blackbird-hostboot-52093c412c62b30efe47a03efcce4b6badefd4f2.zip
PRD: Add MemRowRepair class
Change-Id: Ia8200af1fc187b7b519c7bfa8bf260b93de4795c RTC: 196073 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63374 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/64931 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C344
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H147
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemUtils.C16
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemUtils.H9
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk1
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.C10
-rw-r--r--src/usr/diag/prdf/common/plugins/prdfParserEnums.H8
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C20
8 files changed, 539 insertions, 16 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
new file mode 100644
index 000000000..1b17c8c91
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C
@@ -0,0 +1,344 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2018 */
+/* [+] 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. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/** @file prdfMemRowRepair.C */
+
+#include <prdfMemRowRepair.H>
+
+#include <UtilHash.H>
+#include <iipServiceDataCollector.h>
+#include <prdfParserUtils.H>
+#include <prdfErrlUtil.H>
+#include <prdfMemUtils.H>
+
+#ifdef __HOSTBOOT_MODULE
+#include <rowRepairsFuncs.H>
+#endif // __HOSTBOOT_MODULE
+
+namespace PRDF
+{
+
+using namespace PlatServices;
+using namespace PARSERUTILS;
+using namespace TARGETING;
+
+
+//------------------------------------------------------------------------------
+
+
+//##############################################################################
+// Utility Functions
+//##############################################################################
+
+template<TARGETING::TYPE T, fapi2::TargetType F>
+uint32_t __getRowRepairData( TargetHandle_t i_dimm, const MemRank & i_rank,
+ MemRowRepair & o_rowRepair )
+{
+ #define PRDF_FUNC "[PlatServices::__getRowRepairData] "
+
+ uint32_t o_rc = SUCCESS;
+
+ #ifdef __HOSTBOOT_MODULE
+
+ uint8_t l_data[ROW_REPAIR::ROW_REPAIR_SIZE] = {0};
+
+ errlHndl_t l_errl = nullptr;
+
+ // get port select
+ uint8_t l_ps = getDimmPort<T>( i_dimm );
+
+ // get mba
+ TargetHandle_t l_mba = getConnectedParent( i_dimm, T );
+ fapi2::Target<F> l_fapiMba( l_mba );
+
+ FAPI_INVOKE_HWP( l_errl, getRowRepair, l_fapiMba, i_rank.getDimmSlct(),
+ i_rank.getRankSlct(), l_data, l_ps );
+ if ( nullptr != l_errl )
+ {
+ PRDF_ERR( PRDF_FUNC "getRowRepair() failed: i_dimm=0x%08x "
+ "l_ps=%d ds=%d rs=%d", getHuid(i_dimm), l_ps,
+ i_rank.getDimmSlct(), i_rank.getRankSlct() );
+ PRDF_COMMIT_ERRL( l_errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ else
+ {
+ o_rowRepair = MemRowRepair( i_dimm, i_rank, l_data );
+ }
+
+ #endif // __HOSTBOOT_MODULE
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+template<>
+uint32_t getRowRepairData<TYPE_MBA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank, MemRowRepair & o_rowRepair )
+{
+ return __getRowRepairData<TYPE_MBA, fapi2::TARGET_TYPE_MBA>( i_dimm, i_rank,
+ o_rowRepair );
+}
+
+template<>
+uint32_t getRowRepairData<TYPE_MCA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank, MemRowRepair & o_rowRepair )
+{
+ return __getRowRepairData<TYPE_MCA, fapi2::TARGET_TYPE_MCA>( i_dimm, i_rank,
+ o_rowRepair );
+}
+
+//------------------------------------------------------------------------------
+
+template<TARGETING::TYPE T, fapi2::TargetType F>
+uint32_t __setRowRepairData( TargetHandle_t i_dimm, const MemRank & i_rank,
+ const MemRowRepair & i_rowRepair )
+{
+ #define PRDF_FUNC "[PlatServices::__setRowRepairData] "
+
+ uint32_t o_rc = SUCCESS;
+
+ #ifdef __HOSTBOOT_MODULE
+
+ if ( !areDramRepairsDisabled() )
+ {
+ uint8_t l_data[ROW_REPAIR::ROW_REPAIR_SIZE] = {0};
+ memcpy( l_data, i_rowRepair.getData(), sizeof(l_data) );
+
+ errlHndl_t l_errl = nullptr;
+
+ // get port select
+ uint8_t l_ps = getDimmPort<T>( i_dimm );
+
+ // get mba
+ TargetHandle_t l_mba = getConnectedParent(i_dimm, T);
+ fapi2::Target<F> l_fapiMba( l_mba );
+
+ FAPI_INVOKE_HWP( l_errl, setRowRepair, l_fapiMba, i_rank.getDimmSlct(),
+ i_rank.getRankSlct(), l_data, l_ps );
+ if ( nullptr != l_errl )
+ {
+ PRDF_ERR( PRDF_FUNC "setRowRepair() failed: i_dimm=0x%08x "
+ "l_ps=%d ds=%d rs=%d", getHuid(i_dimm), l_ps,
+ i_rank.getDimmSlct(), i_rank.getRankSlct() );
+ PRDF_COMMIT_ERRL( l_errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+
+ }
+
+ #endif // __HOSTBOOT_MODULE
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+template<>
+uint32_t setRowRepairData<TYPE_MBA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank,
+ const MemRowRepair & i_rowRepair )
+{
+ return __setRowRepairData<TYPE_MBA, fapi2::TARGET_TYPE_MBA>( i_dimm, i_rank,
+ i_rowRepair );
+}
+
+template<>
+uint32_t setRowRepairData<TYPE_MCA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank,
+ const MemRowRepair & i_rowRepair )
+{
+ return __setRowRepairData<TYPE_MCA, fapi2::TARGET_TYPE_MCA>( i_dimm, i_rank,
+ i_rowRepair );
+}
+
+//------------------------------------------------------------------------------
+
+template<TARGETING::TYPE T>
+void __setRowRepairDataHelper( const MemAddr & i_addr, uint32_t & io_tmp );
+
+template<>
+void __setRowRepairDataHelper<TYPE_MBA>( const MemAddr & i_addr,
+ uint32_t & io_tmp )
+{
+ #ifdef __HOSTBOOT_MODULE
+
+ // Bank is stored as MBA "(DDR4): bg1-bg0,b1-b0 (4-bit)" in a MemAddr.
+ // bank group - 2 bits (bg1-bg0)
+ io_tmp = ( io_tmp << 2 ) | ( (i_addr.getBank() >> 2) & 0x03 );
+
+ // bank - 3 bits (b2-b0)
+ io_tmp = ( io_tmp << 3 ) | ( i_addr.getBank() & 0x03 );
+
+ // Row is stored as "MBA: r17-r0 (18-bit)" in a MemAddr.
+ // row - 18 bits (r17-r0)
+ io_tmp = ( io_tmp << 18 ) | ( i_addr.getRow() & 0x0003ffff );
+
+ #endif // __HOSTBOOT_MODULE
+}
+
+template<>
+void __setRowRepairDataHelper<TYPE_MCA>( const MemAddr & i_addr,
+ uint32_t & io_tmp )
+{
+ #ifdef __HOSTBOOT_MODULE
+
+ // Bank is stored as "MCBIST: b0-b2,bg0-bg1 (5-bit)" in a MemAddr.
+ // bank group - 2 bits (bg1-bg0)
+ uint64_t l_bnkGrp = i_addr.getBank() & 0x03;
+ l_bnkGrp = MemUtils::reverseBits( l_bnkGrp, 2 );
+
+ io_tmp = ( io_tmp << 2 ) | ( l_bnkGrp & 0x03 );
+
+ // bank - 3 bits (b2-b0)
+ uint64_t l_bnk = (i_addr.getBank() & 0x1C) >> 2;
+ l_bnk = MemUtils::reverseBits( l_bnk, 3 );
+
+ io_tmp = ( io_tmp << 3 ) | ( l_bnk & 0x03 );
+
+ // Row is stored as "MCBIST: r0-r17 (18-bit)" in a MemAddr.
+ uint64_t l_row = MemUtils::reverseBits( i_addr.getRow(), 18 );
+
+ // row - 18 bits (r17-r0)
+ io_tmp = ( io_tmp << 18 ) | ( l_row & 0x0003ffff );
+
+ #endif // __HOSTBOOT_MODULE
+}
+
+//------------------------------------------------------------------------------
+
+template<TARGETING::TYPE T>
+uint32_t setRowRepairData( TargetHandle_t i_dimm,
+ const MemRank & i_rank,
+ const MemAddr & i_addr,
+ uint8_t i_dram )
+{
+ #define PRDF_FUNC "[PlatServices::setRowRepairData] "
+
+ uint32_t o_rc = SUCCESS;
+
+ #ifdef __HOSTBOOT_MODULE
+
+ if ( !areDramRepairsDisabled() )
+ {
+ uint32_t l_tmp = 0;
+
+ // The format for a row repair is 32 bits total:
+ // 5 bits : DRAM position (x8: 0-9, x4: 0-19)
+ // 3 bits : slave ranks(0-7)
+ // 2 bits : bank group(0-3) (bg1-bg0)
+ // 3 bits : bank(0-7) (b2-b0)
+ // 18 bits: row (r17-r0)
+ // 1 bit : repair validity (0: invalid, 1: valid)
+
+ // dram - 5 bits
+ l_tmp = ( l_tmp << 5 ) | ( i_dram & 0x1f );
+
+ // slave rank - 3 bits
+ l_tmp = ( l_tmp << 3 ) | ( i_addr.getRank().getSlave() & 0x07 );
+
+ // bank group, bank, and row - 23 bits
+ __setRowRepairDataHelper<T>( i_addr, l_tmp );
+
+ // validity - 1 bit
+ l_tmp = ( l_tmp << 1 ) | 0x1;
+
+ // ROW_REPAIR_SIZE = 4
+ uint8_t l_data[ROW_REPAIR::ROW_REPAIR_SIZE] = {0};
+ memcpy( l_data, &l_tmp, sizeof(l_data) );
+
+ MemRowRepair l_rowRepair( i_dimm, i_rank, l_data );
+
+ o_rc = setRowRepairData<TYPE_MBA>( i_dimm, i_rank, l_rowRepair );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "setRowRepairData() failed" );
+ }
+
+ }
+
+ #endif // __HOSTBOOT_MODULE
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+
+}
+
+template
+uint32_t setRowRepairData<TYPE_MBA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank,
+ const MemAddr & i_addr,
+ uint8_t i_dram );
+template
+uint32_t setRowRepairData<TYPE_MCA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank,
+ const MemAddr & i_addr,
+ uint8_t i_dram );
+
+//------------------------------------------------------------------------------
+
+template<TARGETING::TYPE T>
+uint32_t clearRowRepairData( TargetHandle_t i_dimm, const MemRank & i_rank )
+{
+ #define PRDF_FUNC "[PlatServices::clearRowRepairData] "
+
+ uint32_t o_rc = SUCCESS;
+
+ #ifdef __HOSTBOOT_MODULE
+
+ if ( !areDramRepairsDisabled() )
+ {
+ uint8_t l_data[ROW_REPAIR::ROW_REPAIR_SIZE] = {0};
+ memset( l_data, 0, sizeof(l_data) );
+
+ MemRowRepair l_rowRepair( i_dimm, i_rank, l_data );
+
+ o_rc = setRowRepairData<T>( i_dimm, i_rank, l_rowRepair );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "setRowRepairData() failed" )
+ }
+ }
+
+ #endif // __HOSTBOOT_MODULE
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+template
+uint32_t clearRowRepairData<TYPE_MBA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank );
+template
+uint32_t clearRowRepairData<TYPE_MCA>( TargetHandle_t i_dimm,
+ const MemRank & i_rank );
+
+//------------------------------------------------------------------------------
+
+} // end namespace PRDF
+
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H
new file mode 100644
index 000000000..0608ed7a8
--- /dev/null
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H
@@ -0,0 +1,147 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2018 */
+/* [+] 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. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+/** @file prdfMemRowRepair.H */
+
+#ifndef __prdfMemRowRepair_H
+#define __prdfMemRowRepair_H
+
+#include <prdfPlatServices.H>
+
+#include <prdfMemAddress.H>
+#include <prdfMemSymbol.H>
+#include <prdfMemConst.H>
+#include <prdfParserEnums.H>
+
+namespace PRDF
+{
+
+class CaptureData;
+class MemSymbol;
+
+/**
+ * @brief Container for DIMM's Row Repair Data.
+ */
+class MemRowRepair
+{
+ public: // constructors
+
+ /** @brief Default constructor */
+ MemRowRepair()
+ {
+ memset( iv_data, 0x00, sizeof(iv_data) );
+ }
+
+ /** @brief Constructor from components */
+ MemRowRepair( TARGETING::TargetHandle_t i_dimm, const MemRank & i_rank,
+ const uint8_t (&i_d)[ROW_REPAIR::ROW_REPAIR_SIZE] ) :
+ iv_dimm(i_dimm), iv_rank(i_rank)
+ {
+ memcpy( iv_data, i_d, sizeof(iv_data) );
+ }
+
+ public: // functions
+
+ /** @return A reference to the data array. */
+ const uint8_t (&getData()const)[ROW_REPAIR::ROW_REPAIR_SIZE]
+ {
+ return iv_data;
+ }
+
+ /** @return The dram the row repair is on. */
+ uint8_t getRowRepairDram()
+ {
+ // The dram position is located in the first 5 bits of row repair data
+ return ( (iv_data[0] >> 3 ) & 0x1f );
+ }
+
+ /** @return True or false whether this row repair is valid */
+ bool isValid()
+ {
+ // The last bit of row repair data is the validity bit.
+ // 1 if valid. 0 if invalid.
+ return ( iv_data[ROW_REPAIR::ROW_REPAIR_SIZE-1] & 0x01 );
+ }
+
+ private: // instance variables
+
+ TARGETING::TargetHandle_t iv_dimm; ///< Target DIMM
+ MemRank iv_rank; ///< Target rank
+
+ /** A bitmap of all bad DQs for each port. */
+ uint8_t iv_data[ROW_REPAIR::ROW_REPAIR_SIZE];
+};
+
+//##############################################################################
+// Utility Functions
+//##############################################################################
+
+/**
+ * @brief Reads the row repair data attribute for the target rank and dimm.
+ * @param i_dimm A dimm target.
+ * @param i_rank Target rank.
+ * @param o_rowRepair Row repair data container.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t getRowRepairData( TARGETING::TargetHandle_t i_dimm,
+ const MemRank & i_rank, MemRowRepair & o_rowRepair );
+
+/**
+ * @brief Writes the row repair data attribute for the target rank and dimm.
+ * @param i_dimm A dimm target.
+ * @param i_rank Target rank.
+ * @param i_rowRepair Row repair data container.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t setRowRepairData( TARGETING::TargetHandle_t i_dimm,
+ const MemRank & i_rank, const MemRowRepair & i_rowRepair );
+
+/**
+ * @brief Writes the row repair data attribute for the target rank and dimm.
+ * @param i_dimm A dimm target.
+ * @param i_rank Target rank.
+ * @param i_addr Address for the row repair.
+ * @param i_dram Dram position for the row repair.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t setRowRepairData( TARGETING::TargetHandle_t i_dimm,
+ const MemRank & i_rank, const MemAddr & i_addr, uint8_t i_dram );
+
+/**
+ * @brief Clears the row repair data attribute for the target rank and dimm.
+ * @param i_dimm A dimm target.
+ * @param i_rank Target rank.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t clearRowRepairData( TARGETING::TargetHandle_t i_dimm,
+ const MemRank & i_rank );
+
+} // end namespace PRDF
+
+#endif // __prdfMemRowRepair_H
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C
index 4c6c7e823..e2731d055 100755
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C
@@ -955,6 +955,22 @@ void cleanupChnlFail<TYPE_MC>( ExtensibleChip * i_chip,
//------------------------------------------------------------------------------
+uint64_t reverseBits( uint64_t i_val, uint64_t i_numBits )
+{
+ uint64_t o_val = 0;
+
+ for ( uint64_t i = 0; i < i_numBits; i++ )
+ {
+ o_val <<= 1;
+ o_val |= i_val & 0x1;
+ i_val >>= 1;
+ }
+
+ return o_val;
+}
+
+//------------------------------------------------------------------------------
+
} // end namespace MemUtils
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H
index 82a77a95b..0a1e28e0c 100755
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H
@@ -162,6 +162,15 @@ uint32_t handleChnlFail( ExtensibleChip * i_chip,
template<TARGETING::TYPE T>
void cleanupChnlFail( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc );
+/**
+ * @brief Reverses the bit placement in the inputted bit string.
+ * @param i_val The bit string to be reversed.
+ * @param i_numBits The number of bits in the bit string to reverse.
+ * @return The reversed bit string value.
+ */
+
+uint64_t reverseBits( uint64_t i_val, uint64_t i_numBits );
+
} // end namespace MemUtils
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk b/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
index 1a879a58b..087214ece 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
+++ b/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
@@ -45,6 +45,7 @@ prd_obj += prdfMemDqBitmap.o
prd_obj += prdfMemEccAnalysis.o
prd_obj += prdfMemMark.o
prd_obj += prdfMemRceTable.o
+prd_obj += prdfMemRowRepair.o
prd_obj += prdfMemSymbol.o
prd_obj += prdfMemoryMru.o
prd_obj += prdfMemUeTable.o
diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
index cbe916634..88f16b6f8 100755
--- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C
+++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
@@ -1049,6 +1049,16 @@ uint8_t getDimmPort<TYPE_MBA>( TARGETING::TargetHandle_t i_dimmTrgt )
return i_dimmTrgt->getAttr<ATTR_CEN_MBA_PORT>();
}
+template<>
+uint8_t getDimmPort<TYPE_MCA>( TARGETING::TargetHandle_t i_dimmTrgt )
+{
+ PRDF_ASSERT( nullptr != i_dimmTrgt );
+ PRDF_ASSERT( TYPE_DIMM == getTargetType(i_dimmTrgt) );
+
+ // Only one port on MCA
+ return 0;
+}
+
//------------------------------------------------------------------------------
template<>
diff --git a/src/usr/diag/prdf/common/plugins/prdfParserEnums.H b/src/usr/diag/prdf/common/plugins/prdfParserEnums.H
index bf35fb8ae..ebb783dc2 100644
--- a/src/usr/diag/prdf/common/plugins/prdfParserEnums.H
+++ b/src/usr/diag/prdf/common/plugins/prdfParserEnums.H
@@ -173,6 +173,14 @@ namespace DQ_BITMAP
} // namespace DQ_BITMAP
+namespace ROW_REPAIR
+{
+ enum
+ {
+ ROW_REPAIR_SIZE = 4, // 4 byte (32 bit) repair
+ };
+} // namespace ROW_REPAIR
+
namespace CEN_SYMBOL
{
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C b/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
index 18e5cf14b..0e67c0df9 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
@@ -33,6 +33,7 @@
#include <prdfTrace.H>
#include <prdfPlatServices.H>
#include <prdfMemAddress.H>
+#include <prdfMemUtils.H>
//------------------------------------------------------------------------------
// Function Definitions
@@ -43,6 +44,7 @@ using namespace TARGETING;
namespace PRDF
{
using namespace PlatServices;
+using namespace MemUtils;
namespace MemDealloc
{
@@ -111,20 +113,6 @@ int32_t __getAddrConfig( ExtensibleChip * i_mcaChip, uint8_t i_dslct,
#undef PRDF_FUNC
}
-uint64_t __reverseBits( uint64_t i_val, uint64_t i_numBits )
-{
- uint64_t o_val = 0;
-
- for ( uint64_t i = 0; i < i_numBits; i++ )
- {
- o_val <<= 1;
- o_val |= i_val & 0x1;
- i_val >>= 1;
- }
-
- return o_val;
-}
-
uint64_t __maskBits( uint64_t i_val, uint64_t i_numBits )
{
uint64_t mask = (0xffffffffffffffffull >> i_numBits) << i_numBits;
@@ -396,8 +384,8 @@ int32_t __getPortAddr<TYPE_MCA>( ExtensibleChip * i_chip, MemAddr i_addr,
o_addr = 0;
// Local vars for address fields
- uint64_t col = __reverseBits(i_addr.getCol(), 7); // C9 C8 C7 C6 C5 C4 C3
- uint64_t row = __reverseBits(i_addr.getRow(), 18); // R17 R16 R15 .. R1 R0
+ uint64_t col = reverseBits(i_addr.getCol(), 7); // C9 C8 C7 C6 C5 C4 C3
+ uint64_t row = reverseBits(i_addr.getRow(), 18); // R17 R16 R15 .. R1 R0
uint64_t bnk = i_addr.getBank(); // BG0 BG1 B0 B1 B2
uint64_t srnk = i_addr.getRank().getSlave(); // S0 S1 S2
uint64_t mrnk = i_addr.getRank().getRankSlct(); // M0 M1
OpenPOWER on IntegriCloud