diff options
Diffstat (limited to 'src/import')
9 files changed, 552 insertions, 7 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C index f3d7e761f..76e167e35 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C @@ -368,10 +368,93 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief Determines & sets effective config for eff_rcd_mfg_id from SPD +/// @return fapi2::FAPI2_RC_SUCCESS if okay +/// +fapi2::ReturnCode eff_dimm::rcd_mfg_id() +{ + uint16_t l_decoder_val = 0; + uint16_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {}; -///////////////////////// -// Member Method implementation -///////////////////////// + // Get & update MCS attribute + FAPI_TRY( eff_rcd_mfg_id(iv_mcs, &l_mcs_attrs[0][0]), "Failed accessing ATTR_MSS_EFF_RCD_MFG_ID" ); + FAPI_TRY( iv_pDecoder->reg_manufacturer_id_code(l_decoder_val), "Failed getting rcd id code from SPD %s", + mss::c_str(iv_dimm) ); + + switch (l_decoder_val) + { + case fapi2::ENUM_ATTR_EFF_RCD_MFG_ID_IDT: + FAPI_INF("%s Register Manufacturer is %s", mss::c_str(iv_dimm), "IDT"); + break; + + case fapi2::ENUM_ATTR_EFF_RCD_MFG_ID_INPHI: + FAPI_INF("%s Register Manufacturer is %s", mss::c_str(iv_dimm), "INPHI"); + break; + + case fapi2::ENUM_ATTR_EFF_RCD_MFG_ID_MONTAGE: + FAPI_INF("%s Register Manufacturer is %s", mss::c_str(iv_dimm), "MONTAGE"); + break; + + default: + FAPI_INF("%s Register Manufacturer is 0x%04x", mss::c_str(iv_dimm), l_decoder_val); + break; + } + + l_mcs_attrs[iv_port_index][iv_dimm_index] = l_decoder_val; + FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_RCD_MFG_ID, iv_mcs, l_mcs_attrs), "Failed to set ATTR_EFF_RCD_MFG_ID" ); + +fapi_try_exit: + return fapi2::current_err; + +} + +/// +/// @brief Determines & sets effective config for eff_register_type from SPD +/// @return fapi2::FAPI2_RC_SUCCESS if okay +/// +fapi2::ReturnCode eff_dimm::register_type() +{ + uint8_t l_decoder_val = 0; + uint8_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {}; + + // Get & update MCS attribute + FAPI_TRY( eff_register_type(iv_mcs, &l_mcs_attrs[0][0]), "Failed accessing ATTR_MSS_REGISTER_TYPE" ); + FAPI_TRY( iv_pDecoder->iv_module_decoder->register_and_buffer_type(l_decoder_val), + "Failed getting register_type code from SPD %s", + mss::c_str(iv_dimm) ); + + FAPI_INF("%s Register type is %s", mss::c_str(iv_dimm), l_decoder_val ? "RCD01" : "RCD02"); + + l_mcs_attrs[iv_port_index][iv_dimm_index] = l_decoder_val; + FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_REGISTER_TYPE, iv_mcs, l_mcs_attrs), "Failed to set ATTR_EFF_REGISTER_TYPE" ); + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Determines & sets effective config for eff_register_rev type from SPD +/// @return fapi2::FAPI2_RC_SUCCESS if okay +/// +fapi2::ReturnCode eff_dimm::register_rev() +{ + uint8_t l_decoder_val = 0; + uint8_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {}; + + // Get & update MCS attribute + FAPI_TRY( eff_register_rev(iv_mcs, &l_mcs_attrs[0][0]), "Failed accessing ATTR_MSS_REGISTER_REV" ); + FAPI_TRY( iv_pDecoder->register_rev_num(l_decoder_val), "Failed getting register_rev code from SPD %s", + mss::c_str(iv_dimm) ); + + FAPI_INF("%s Register rev is 0x%02x", mss::c_str(iv_dimm), l_decoder_val); + l_mcs_attrs[iv_port_index][iv_dimm_index] = l_decoder_val; + FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_REGISTER_REV, iv_mcs, l_mcs_attrs), "Failed to set ATTR_EFF_REGISTER_REV" ); + +fapi_try_exit: + return fapi2::current_err; + +} /// /// @brief Determines & sets effective config for eff_dram_mfg_id type from SPD @@ -387,6 +470,25 @@ fapi2::ReturnCode eff_dimm::dram_mfg_id() FAPI_TRY( iv_pDecoder->dram_manufacturer_id_code(l_decoder_val), "Failed getting dram id code from SPD %s", mss::c_str(iv_dimm) ); + switch (l_decoder_val) + { + case fapi2::ENUM_ATTR_EFF_DRAM_MFG_ID_MICRON: + FAPI_INF("%s Dram Manufacturer is %s", mss::c_str(iv_dimm), "MICRON"); + break; + + case fapi2::ENUM_ATTR_EFF_DRAM_MFG_ID_HYNIX: + FAPI_INF("%s Dram Manufacturer is %s", mss::c_str(iv_dimm), "HYNIX"); + break; + + case fapi2::ENUM_ATTR_EFF_DRAM_MFG_ID_SAMSUNG: + FAPI_INF("%s Dram Manufacturer is %s", mss::c_str(iv_dimm), "SAMSUNG"); + break; + + default: + FAPI_INF("%s Dram Manufacturer is 0x%04x", mss::c_str(iv_dimm), l_decoder_val); + break; + } + l_mcs_attrs[iv_port_index][iv_dimm_index] = l_decoder_val; FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_MFG_ID, iv_mcs, l_mcs_attrs), "Failed to set ATTR_EFF_DRAM_MFG_ID" ); @@ -423,7 +525,6 @@ fapi2::ReturnCode eff_dimm::dram_width() fapi_try_exit: return fapi2::current_err; - } /// diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H index 4e047e540..7daa12437 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H @@ -154,6 +154,24 @@ class eff_dimm fapi2::ReturnCode dram_mfg_id(); /// + /// @brief Determines & sets effective config for eff_rcd_mfg_id type from SPD + /// @return fapi2::FAPI2_RC_SUCCESS if okay + /// + fapi2::ReturnCode rcd_mfg_id(); + + /// + /// @brief Determines & sets effective config for eff_register_type from SPD + /// @return fapi2::FAPI2_RC_SUCCESS if okay + /// + fapi2::ReturnCode register_type(); + + /// + /// @brief Determines & sets effective config for eff_register_rev type from SPD + /// @return fapi2::FAPI2_RC_SUCCESS if okay + /// + fapi2::ReturnCode register_rev(); + + /// /// @brief Determines & sets effective config for primary stack type /// @return fapi2::FAPI2_RC_SUCCESS if okay /// @@ -190,7 +208,6 @@ class eff_dimm fapi2::ReturnCode dram_density(); /// - /// @brief Determines & sets effective config for dram width /// @return fapi2::FAPI2_RC_SUCCESS if okay /// diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H index 2378ccbd7..cfda1ab5f 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H @@ -19714,6 +19714,90 @@ fapi_try_exit: } /// +/// @brief ATTR_EFF_REGISTER_TYPE getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_DIMM> +/// @param[out] ref to the value uint8_t +/// @note Generated by gen_accessors.pl generateParameters (F) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Type Decodes SPD Byte 131 creator: mss_eff_cnfg consumer: +/// eff_dimm +/// +inline fapi2::ReturnCode eff_register_type(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, uint8_t& o_value) +{ + uint8_t l_value[2][2]; + auto l_mca = i_target.getParent<fapi2::TARGET_TYPE_MCA>(); + auto l_mcs = l_mca.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_TYPE, l_mcs, l_value) ); + o_value = l_value[mss::index(l_mca)][mss::index(i_target)]; + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_TYPE: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_REGISTER_TYPE getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCA> +/// @param[out] uint8_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (G) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Type Decodes SPD Byte 131 creator: mss_eff_cnfg consumer: +/// eff_dimm +/// +inline fapi2::ReturnCode eff_register_type(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target, uint8_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint8_t l_value[2][2]; + auto l_mcs = i_target.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_TYPE, l_mcs, l_value) ); + memcpy(o_array, &(l_value[mss::index(i_target)][0]), 2); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_TYPE: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_REGISTER_TYPE getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCS> +/// @param[out] uint8_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (H) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Type Decodes SPD Byte 131 creator: mss_eff_cnfg consumer: +/// eff_dimm +/// +inline fapi2::ReturnCode eff_register_type(const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target, uint8_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint8_t l_value[2][2]; + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_TYPE, i_target, l_value) ); + memcpy(o_array, &l_value, 4); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_TYPE: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// /// @brief ATTR_EFF_DRAM_MFG_ID getter /// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_DIMM> /// @param[out] ref to the value uint16_t @@ -19800,6 +19884,174 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief ATTR_EFF_RCD_MFG_ID getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_DIMM> +/// @param[out] ref to the value uint16_t +/// @note Generated by gen_accessors.pl generateParameters (F) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Manufacturer ID Code Decodes SPD Byte 133 and 134 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_rcd_mfg_id(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, uint16_t& o_value) +{ + uint16_t l_value[2][2]; + auto l_mca = i_target.getParent<fapi2::TARGET_TYPE_MCA>(); + auto l_mcs = l_mca.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_RCD_MFG_ID, l_mcs, l_value) ); + o_value = l_value[mss::index(l_mca)][mss::index(i_target)]; + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_RCD_MFG_ID: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_RCD_MFG_ID getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCA> +/// @param[out] uint16_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (G) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Manufacturer ID Code Decodes SPD Byte 133 and 134 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_rcd_mfg_id(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target, uint16_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint16_t l_value[2][2]; + auto l_mcs = i_target.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_RCD_MFG_ID, l_mcs, l_value) ); + memcpy(o_array, &(l_value[mss::index(i_target)][0]), 4); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_RCD_MFG_ID: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_RCD_MFG_ID getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCS> +/// @param[out] uint16_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (H) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Manufacturer ID Code Decodes SPD Byte 133 and 134 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_rcd_mfg_id(const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target, uint16_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint16_t l_value[2][2]; + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_RCD_MFG_ID, i_target, l_value) ); + memcpy(o_array, &l_value, 8); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_RCD_MFG_ID: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_REGISTER_REV getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_DIMM> +/// @param[out] ref to the value uint8_t +/// @note Generated by gen_accessors.pl generateParameters (F) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Revision Number Decodes SPD Byte 135 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_register_rev(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, uint8_t& o_value) +{ + uint8_t l_value[2][2]; + auto l_mca = i_target.getParent<fapi2::TARGET_TYPE_MCA>(); + auto l_mcs = l_mca.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_REV, l_mcs, l_value) ); + o_value = l_value[mss::index(l_mca)][mss::index(i_target)]; + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_REV: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_REGISTER_REV getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCA> +/// @param[out] uint8_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (G) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Revision Number Decodes SPD Byte 135 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_register_rev(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target, uint8_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint8_t l_value[2][2]; + auto l_mcs = i_target.getParent<fapi2::TARGET_TYPE_MCS>(); + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_REV, l_mcs, l_value) ); + memcpy(o_array, &(l_value[mss::index(i_target)][0]), 2); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_REV: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + +/// +/// @brief ATTR_EFF_REGISTER_REV getter +/// @param[in] const ref to the fapi2::Target<fapi2::TARGET_TYPE_MCS> +/// @param[out] uint8_t* memory to store the value +/// @note Generated by gen_accessors.pl generateParameters (H) +/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK +/// @note Register Revision Number Decodes SPD Byte 135 creator: +/// mss_eff_cnfg +/// +inline fapi2::ReturnCode eff_register_rev(const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target, uint8_t* o_array) +{ + if (o_array == nullptr) + { + FAPI_ERR("nullptr passed to attribute accessor %s", __func__); + return fapi2::FAPI2_RC_INVALID_PARAMETER; + } + + uint8_t l_value[2][2]; + + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_REGISTER_REV, i_target, l_value) ); + memcpy(o_array, &l_value, 4); + return fapi2::current_err; + +fapi_try_exit: + FAPI_ERR("failed accessing ATTR_EFF_REGISTER_REV: 0x%lx (target: %s)", + uint64_t(fapi2::current_err), mss::c_str(i_target)); + return fapi2::current_err; +} + /// /// @brief ATTR_MSS_MRW_SAFEMODE_MEM_THROTTLED_N_COMMANDS_PER_PORT getter diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C b/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C index 725844974..40ccd52b0 100644 --- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C +++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C @@ -84,10 +84,16 @@ fapi2::ReturnCode p9_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MCS> for( const auto& l_cache : l_factory_caches ) { + + std::shared_ptr<mss::eff_dimm> l_eff_dimm; FAPI_TRY( mss::eff_dimm::eff_dimm_factory( l_cache, l_eff_dimm)); + FAPI_INF("%s Running eff_config", mss::c_str(l_cache->iv_target) ); + FAPI_TRY( l_eff_dimm->rcd_mfg_id() ); + FAPI_TRY( l_eff_dimm->register_type() ); + FAPI_TRY( l_eff_dimm->register_rev() ); FAPI_TRY( l_eff_dimm->dram_mfg_id() ); FAPI_TRY( l_eff_dimm->dram_width() ); FAPI_TRY( l_eff_dimm->dram_density() ); diff --git a/src/import/chips/p9/procedures/xml/attribute_info/memory_spd_attributes.xml b/src/import/chips/p9/procedures/xml/attribute_info/memory_spd_attributes.xml index 03e92966a..c80160d5e 100755 --- a/src/import/chips/p9/procedures/xml/attribute_info/memory_spd_attributes.xml +++ b/src/import/chips/p9/procedures/xml/attribute_info/memory_spd_attributes.xml @@ -5,7 +5,7 @@ <!-- --> <!-- OpenPOWER HostBoot Project --> <!-- --> -<!-- Contributors Listed Below - COPYRIGHT 2016 --> +<!-- Contributors Listed Below - COPYRIGHT 2016,2017 --> <!-- [+] International Business Machines Corp. --> <!-- --> <!-- --> @@ -595,6 +595,23 @@ </attribute> <attribute> + <id>ATTR_EFF_REGISTER_TYPE</id> + <targetType>TARGET_TYPE_MCS</targetType> + <description> + Register Type + Decodes SPD Byte 131 + creator: mss_eff_cnfg + consumer: eff_dimm + </description> + <enum>RCD01 = 0x0, RCD02 = 0x1</enum> + <initToZero></initToZero> + <valueType>uint8</valueType> + <writeable/> + <array>2 2</array> + <mssAccessorName>eff_register_type</mssAccessorName> + </attribute> + + <attribute> <id>ATTR_EFF_DRAM_MFG_ID</id> <targetType>TARGET_TYPE_MCS</targetType> <description> @@ -607,9 +624,38 @@ <initToZero></initToZero> <valueType>uint16</valueType> <writeable/> - <array> 2 2</array> + <array>2 2</array> <mssAccessorName>eff_dram_mfg_id</mssAccessorName> </attribute> + <attribute> + <id>ATTR_EFF_RCD_MFG_ID</id> + <targetType>TARGET_TYPE_MCS</targetType> + <description> + Register Manufacturer ID Code + Decodes SPD Byte 133 and 134 + creator: mss_eff_cnfg + </description> + <enum>INPHI = 0xB304, MONTAGE = 0x3286, IDT = 0xB380 </enum> + <initToZero></initToZero> + <valueType>uint16</valueType> + <writeable/> + <array>2 2</array> + <mssAccessorName>eff_rcd_mfg_id</mssAccessorName> + </attribute> + <attribute> + <id>ATTR_EFF_REGISTER_REV</id> + <targetType>TARGET_TYPE_MCS</targetType> + <description> + Register Revision Number + Decodes SPD Byte 135 + creator: mss_eff_cnfg + </description> + <initToZero></initToZero> + <valueType>uint8</valueType> + <writeable/> + <array>2 2</array> + <mssAccessorName>eff_register_rev</mssAccessorName> + </attribute> </attributes> diff --git a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H index 63584075f..237e63378 100644 --- a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H +++ b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H @@ -1154,6 +1154,29 @@ class decoder_v1_0 : public decoder /// @note Page 4.1.2.12 - 54 /// virtual fapi2::ReturnCode dram_manufacturer_id_code( uint16_t& o_output ) const override; + + /// + /// @brief Decodes RCD Manufacturer ID code + /// @param[out] o_value rcd manufacturing id code + /// @return FAPI2_RC_SUCCESS if okay + /// @note SPD Byte 133 134 + /// @note Item JEDEC Standard No. 21-C + /// @note DDR4 SPD Document Release 2 + /// @note Page 4.1.2.12 - 54 + /// + virtual fapi2::ReturnCode reg_manufacturer_id_code( uint16_t& o_value ) const override; + + /// + /// @brief Decodes Register Revision Number + /// @param[out] o_value register revision number + /// @return FAPI2_RC_SUCCESS if okay + /// @note SPD Byte 135 + /// @note Item JEDEC Standard No. 21-C + /// @note DDR4 SPD Document Release 2 + /// @note Page 4.1.2.12 - 54 + /// + virtual fapi2::ReturnCode register_rev_num( uint8_t& o_value ) const override; + /// /// @brief Decodes DRAM Stepping /// @param[out] o_value uint8_t DRAM Stepping val diff --git a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4_v1_0.C b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4_v1_0.C index baca956f8..845648752 100644 --- a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4_v1_0.C +++ b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4_v1_0.C @@ -2866,6 +2866,69 @@ fapi2::ReturnCode decoder_v1_0::dram_manufacturer_id_code( uint16_t& o_value ) c } /// +/// @brief Decodes REGISTER Manufacturer ID code +/// @param[out] o_value rcd manufacturing id code +/// @return FAPI2_RC_SUCCESS if okay +/// @note SPD Byte 133-134 +/// @note Item JEDEC Standard No. 21-C +/// @note DDR4 SPD Document Release 2 +/// @note Page 4.1.2.12 - 54 +/// +fapi2::ReturnCode decoder_v1_0::reg_manufacturer_id_code( uint16_t& o_value ) const +{ + constexpr size_t BYTE_INDEX_LSB = 133; + uint8_t mfgid_LSB = iv_spd_data[BYTE_INDEX_LSB]; + + constexpr size_t BYTE_INDEX_MSB = 134; + uint8_t mfgid_MSB = iv_spd_data[BYTE_INDEX_MSB]; + + constexpr size_t MSB_START = 0; + constexpr size_t MSB_LEN = 8; + constexpr size_t LSB_START = 8; + constexpr size_t LSB_LEN = 8; + + fapi2::buffer<uint16_t> l_buffer; + l_buffer.insertFromRight<MSB_START, MSB_LEN>( mfgid_MSB ) + .insertFromRight<LSB_START, LSB_LEN>( mfgid_LSB ); + + o_value = l_buffer; + + FAPI_INF("%s.RCD Manufacturer ID Code (rcd_mfg_id): %x", + mss::c_str(iv_target), + o_value); + + return fapi2::FAPI2_RC_SUCCESS; +} + +/// +/// @brief Decodes Register Revision Number +/// @param[out] o_value register revision number +/// @return FAPI2_RC_SUCCESS if okay +/// @note SPD Byte 135 +/// @note Item JEDEC Standard No. 21-C +/// @note DDR4 SPD Document Release 2 +/// @note Page 4.1.2.12 - 54 +/// +fapi2::ReturnCode decoder_v1_0::register_rev_num( uint8_t& o_value ) const +{ + // Trace in the front assists w/ debug + constexpr size_t BYTE_INDEX = 135; + + FAPI_INF("%s SPD data at Byte %d: 0x%01X.", + mss::c_str(iv_target), + BYTE_INDEX, + iv_spd_data[BYTE_INDEX]); + + o_value = iv_spd_data[BYTE_INDEX]; + + FAPI_INF("%s. Register Revision Number: %x", + mss::c_str(iv_target), + o_value); + + return fapi2::FAPI2_RC_SUCCESS; +} + +/// /// @brief Decodes DRAM Stepping /// @param[out] o_value uint8_t DRAM Stepping val /// @return FAPI2_RC_SUCCESS if okay diff --git a/src/import/generic/memory/lib/spd/common/spd_decoder_base.H b/src/import/generic/memory/lib/spd/common/spd_decoder_base.H index c61983436..76594ba66 100644 --- a/src/import/generic/memory/lib/spd/common/spd_decoder_base.H +++ b/src/import/generic/memory/lib/spd/common/spd_decoder_base.H @@ -871,6 +871,28 @@ class decoder } /// + /// @brief Decodes RCD Manufacturer ID code + /// @param[out] o_value rcd manufacturing id code + /// @return FAPI2_RC_SUCCESS if okay + /// + virtual fapi2::ReturnCode reg_manufacturer_id_code( uint16_t& o_value ) const + { + o_value = 0; + return fapi2::FAPI2_RC_SUCCESS; + } + + /// + /// @brief Decodes Register Revision Number + /// @param[out] o_value register revision number + /// @return FAPI2_RC_SUCCESS if okay + /// + virtual fapi2::ReturnCode register_rev_num( uint8_t& o_value ) const + { + o_value = 0; + return fapi2::FAPI2_RC_SUCCESS; + } + + /// /// @brief Decodes DRAM Stepping /// @param[out] o_value uint8_t DRAM Stepping val /// @return FAPI2_RC_SUCCESS if okay diff --git a/src/import/hwpf/fapi2/xml/attribute_info/hb_temp_defaults.xml b/src/import/hwpf/fapi2/xml/attribute_info/hb_temp_defaults.xml index b03bfc288..04a2a5907 100644 --- a/src/import/hwpf/fapi2/xml/attribute_info/hb_temp_defaults.xml +++ b/src/import/hwpf/fapi2/xml/attribute_info/hb_temp_defaults.xml @@ -264,6 +264,21 @@ </attribute> <attribute> + <id>ATTR_EFF_REGISTER_TYPE</id> + <default>0x00</default> + </attribute> + + <attribute> + <id>ATTR_EFF_RCD_MFG_ID</id> + <default>0x00</default> + </attribute> + + <attribute> + <id>ATTR_EFF_REGISTER_REV</id> + <default>0x00</default> + </attribute> + + <attribute> <id>ATTR_SYSTEM_PSTATES_MODE</id> <default>0x00</default> </attribute> |