Skip to content

Commit 0c51e13

Browse files
stermoledcrowell77
authored andcommitted
Add new decode of EFD ODT impedance for DDIMM SPD 0.4
Change-Id: Ic02cbc7fcb78de16b435065880d22d9b119eaed9 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/100133 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Reviewed-by: ANDRE A MARIN <aamarin@us.ibm.com> Dev-Ready: Louis Stermole <stermole@us.ibm.com> Reviewed-by: Edgar R Cordero <ecordero@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/100144 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
1 parent 1ac08dd commit 0c51e13

File tree

3 files changed

+63
-16
lines changed

3 files changed

+63
-16
lines changed

src/import/generic/memory/lib/data_engine/attr_engine_traits.H

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <generic/memory/lib/spd/ddimm/efd_decoder.H>
4848
#include <generic/memory/lib/utils/dimm/mss_timing.H>
4949
#include <generic/memory/lib/spd/spd_utils.H>
50+
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
5051

5152
namespace mss
5253
{
@@ -753,24 +754,16 @@ struct attrEngineTraits<P, attr_si_engine_fields, attr_si_engine_fields::SI_MC_R
753754
attr_integral_type& o_setting)
754755
{
755756
uint8_t l_odt_impedance = 0;
757+
uint8_t l_spd_rev = 0;
756758

757-
static const std::vector< std::pair<uint8_t, uint8_t> > ODT_IMP_MAP =
758-
{
759-
// {key byte, PHY ODT IMP (ohms)}
760-
{0b00000, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_DISABLE},
761-
{0b00001, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_40},
762-
{0b00010, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_60},
763-
{0b00011, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_80},
764-
{0b00100, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_120},
765-
{0b00101, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_240},
766-
767-
// All others reserved
768-
};
769759
const auto l_ocmb = i_efd_data->get_target();
760+
const auto& l_ports = mss::find_targets<fapi2::TARGET_TYPE_MEM_PORT>(l_ocmb);
770761

762+
FAPI_TRY(mss::attr::get_spd_revision(l_ports[0], l_spd_rev));
771763
FAPI_TRY(i_efd_data->phy_odt_impedance(l_odt_impedance));
772-
// Map SPD value to desired setting
773-
FAPI_TRY(lookup_table_check(l_ocmb, ODT_IMP_MAP, mss::SET_SI_MC_RCV_IMP_DQ_DQS, l_odt_impedance, o_setting));
764+
765+
// Call helper function
766+
FAPI_TRY(mss::gen::decode_rcv_imp_dq_dqs(l_ocmb, l_odt_impedance, l_spd_rev, o_setting));
774767

775768
fapi_try_exit:
776769
return fapi2::current_err;

src/import/generic/memory/lib/data_engine/data_engine_utils.H

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,60 @@ static inline uint8_t align_odt_field_to_attr(const uint8_t i_value)
515515
return l_value;
516516
}
517517

518+
///
519+
/// @brief Decodes RCV_IMP_DQ_DQS value depending on SPD revision
520+
/// @param[in] i_target OCMB target
521+
/// @param[in] i_odt_impedance encoded value from EFD
522+
/// @param[in] i_spd_rev SPD revision
523+
/// @param[out] o_setting value we want to set attr with
524+
/// @return FAPI2_RC_SUCCESS iff okay
525+
///
526+
static inline fapi2::ReturnCode decode_rcv_imp_dq_dqs(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> i_target,
527+
const uint8_t i_odt_impedance,
528+
const uint8_t i_spd_rev,
529+
uint8_t& o_setting)
530+
{
531+
static const std::vector< std::pair<uint8_t, uint8_t> > ODT_IMP_MAP_0_3 =
532+
{
533+
// {key byte, PHY ODT IMP (ohms)}
534+
{0b00000, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_DISABLE},
535+
{0b00001, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_40},
536+
{0b00010, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_60},
537+
{0b00011, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_80},
538+
{0b00100, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_120},
539+
{0b00101, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_240},
540+
541+
// All others reserved
542+
};
543+
544+
static const std::vector< std::pair<uint8_t, uint8_t> > ODT_IMP_MAP_NEWER =
545+
{
546+
// {key byte, PHY ODT IMP (ohms)}
547+
{0b00000, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_DISABLE},
548+
{0b00001, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_40},
549+
{0b00010, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_48},
550+
{0b00011, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_60},
551+
{0b00100, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_80},
552+
{0b00101, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_120},
553+
{0b00110, fapi2::ENUM_ATTR_MEM_SI_MC_RCV_IMP_DQ_DQS_OHM_240},
554+
555+
// All others reserved
556+
};
557+
558+
// Map SPD value to desired setting
559+
if (i_spd_rev == spd::rev::V0_3)
560+
{
561+
FAPI_TRY(lookup_table_check(i_target, ODT_IMP_MAP_0_3, mss::SET_SI_MC_RCV_IMP_DQ_DQS, i_odt_impedance, o_setting));
562+
}
563+
else
564+
{
565+
FAPI_TRY(lookup_table_check(i_target, ODT_IMP_MAP_NEWER, mss::SET_SI_MC_RCV_IMP_DQ_DQS, i_odt_impedance, o_setting));
566+
}
567+
568+
fapi_try_exit:
569+
return fapi2::current_err;
570+
}
571+
518572
///
519573
/// @brief Check for SPD Revision 0.3, set o_field accordingly, for use with thermal sensor fields
520574
///

src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<!-- -->
66
<!-- OpenPOWER HostBoot Project -->
77
<!-- -->
8-
<!-- Contributors Listed Below - COPYRIGHT 2016,2019 -->
8+
<!-- Contributors Listed Below - COPYRIGHT 2016,2020 -->
99
<!-- [+] International Business Machines Corp. -->
1010
<!-- -->
1111
<!-- -->
@@ -444,7 +444,7 @@
444444
<initToZero></initToZero>
445445
<valueType>uint8</valueType>
446446
<writeable/>
447-
<enum>DISABLE = 0, OHM_40 = 40, OHM_60 = 60, OHM_80 = 80, OHM_120 = 120, OHM_240 = 240</enum>
447+
<enum>DISABLE = 0, OHM_40 = 40, OHM_48 = 48, OHM_60 = 60, OHM_80 = 80, OHM_120 = 120, OHM_240 = 240</enum>
448448
<mssUnits>ohm</mssUnits>
449449
<mssAccessorName>si_mc_rcv_imp_dq_dqs</mssAccessorName>
450450
<array>2 4</array>

0 commit comments

Comments
 (0)