/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/import/generic/memory/lib/utils/mcbist/gen_mss_mcbist_ecc_trap_address.H $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2019 */ /* [+] 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 gen_mss_mcbist_ecc_trap_address.H /// @brief Class for ECC trap addresses (addresses below the hash translation) /// // *HWP HWP Owner: Stephen Glancy // *HWP HWP Backup: Andre Marin // *HWP Team: Memory // *HWP Level: 3 // *HWP Consumed by: HB:FSP #ifndef _GEN_MSS_MCBIST_ECC_TRAP_ADDRESS_H_ #define _GEN_MSS_MCBIST_ECC_TRAP_ADDRESS_H_ #include #include #include #include #include namespace mss { namespace ecc { /// /// @class trap_address /// @brief Converts trap address into mcbist::address /// @tparam MC the mc type of the T /// @tparam T fapi2 Target Type defaults to fapi2::TARGET_TYPE_MCA or TARGET_TYPE_MEM_PORT /// @tparam TT traits type defaults to eccTraits /// template< mss::mc_type MC = DEFAULT_MC_TYPE, fapi2::TargetType T = mss::mcbistMCTraits::FWMS_ADDR_TARGET_TYPE, typename TT = mss::eccTraits > class trap_address { public: // first is the start bit of the field, second is the length using field = std::pair; constexpr static field PORT = {TT::TRAP_ADDRESS_PORT, TT::TRAP_ADDRESS_PORT_LEN}; constexpr static field DIMM = {TT::TRAP_ADDRESS_DIMM, TT::TRAP_ADDRESS_DIMM_LEN}; constexpr static field MRANK = {TT::TRAP_ADDRESS_MRANK, TT::TRAP_ADDRESS_MRANK_LEN}; constexpr static field SRANK = {TT::TRAP_ADDRESS_SRANK, TT::TRAP_ADDRESS_SRANK_LEN}; constexpr static field ROW = {TT::TRAP_ADDRESS_ROW, TT::TRAP_ADDRESS_ROW_LEN}; constexpr static field COL = {TT::TRAP_ADDRESS_COL, TT::TRAP_ADDRESS_COL_LEN}; constexpr static field BANK = {TT::TRAP_ADDRESS_BANK, TT::TRAP_ADDRESS_BANK_LEN}; constexpr static field BANK_GROUP = {TT::TRAP_ADDRESS_BANK_GROUP, TT::TRAP_ADDRESS_BANK_GROUP_LEN}; trap_address() = default; /// /// @brief Construct an address from a uint64_t (scom'ed value) /// @param[in] i_value representing raw value from FWMS register /// trap_address( const uint64_t& i_value ): iv_value(i_value) { } /// /// @brief Construct an address from an mcbist::address /// @param[in] i_mcbist_address mcbist formatted address /// @note Construction of mcbist::address from trap_address /// @note located in mcbist::address class /// trap_address( const mcbist::address& i_mcbist_address ) { iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight(i_mcbist_address.get_field()); iv_value.insertFromRight (i_mcbist_address.get_field()); } /// /// @brief Construct an mcbist::address from an ecc::trap_address /// @return the mcbist::address /// inline operator mss::mcbist::address() const { mss::mcbist::address l_mcbist_address; l_mcbist_address.set_port (this->get_field()); l_mcbist_address.set_dimm (this->get_field()); l_mcbist_address.set_master_rank(this->get_field()); l_mcbist_address.set_slave_rank (this->get_field()); l_mcbist_address.set_row (this->get_field()); l_mcbist_address.set_column (this->get_field()); l_mcbist_address.set_bank (this->get_field()); l_mcbist_address.set_bank_group (this->get_field()); return l_mcbist_address; } /// /// @brief Conversion operator to uint64_t /// inline operator uint64_t() const { uint64_t l_temp = 0; iv_value.extract(l_temp); return l_temp; } /// /// @brief Get a field from an address /// @tparam F the field to get /// @return right-aligned uint64_t representing the value /// template< const field& F > inline uint64_t get_field() const { uint64_t l_value = 0; iv_value.extractToRight(l_value); return l_value; } private: fapi2::buffer iv_value; }; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::PORT; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::DIMM; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::MRANK; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::SRANK; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::ROW; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::COL; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::BANK; template< mss::mc_type MC, fapi2::TargetType T , typename TT > constexpr typename trap_address::field trap_address::BANK_GROUP; } // close namespace ecc } // close namespace mss #endif