diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2018-07-06 15:58:10 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-08-21 15:34:17 -0500 |
commit | 52093c412c62b30efe47a03efcce4b6badefd4f2 (patch) | |
tree | 4849eeb7aaa22816e60fc1e1d62f598ade2c9630 | |
parent | 437807d50d4a3681af9d751a567d689f831b0903 (diff) | |
download | blackbird-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.C | 344 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemRowRepair.H | 147 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemUtils.C | 16 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemUtils.H | 9 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk | 1 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/prdfTargetServices.C | 10 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plugins/prdfParserEnums.H | 8 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C | 20 |
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 |