Skip to content

Commit e5a493e

Browse files
aamarincrgeddes
authored andcommitted
Add attribute engine algorithm for eff_config and pre_eff_config
Change-Id: I8498c143109fa1d1a2c9ad5492476e72f51ba509 Original-Change-Id: I2c89e6da17511462afbc661680d19df18a4708f4 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/72962 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@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: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/74689 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
1 parent 6d28e5b commit e5a493e

File tree

16 files changed

+1314
-41
lines changed

16 files changed

+1314
-41
lines changed

src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
// *HWP Level: 2
3434
// *HWP Consumed by: CI
3535

36-
#ifndef EXP_CONSTS_H
37-
#define EXP_CONSTS_H
36+
#ifndef MSS_EXP_CONSTS_H
37+
#define MSS_EXP_CONSTS_H
3838

3939
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
4040

@@ -48,6 +48,30 @@ namespace exp
4848

4949
constexpr uint32_t OCMB_ADDR_SHIFT = 3;
5050

51+
///
52+
/// @brief enum list of explorer eff attributes to set
53+
///
54+
enum attr_eff_engine_fields
55+
{
56+
// Template recursive base case
57+
ATTR_EFF_BASE_CASE = 0,
58+
59+
// Attrs to set
60+
BYTE_ENABLES = 1,
61+
NIBBLE_ENABLES = 2,
62+
SPD_TAA_MIN = 3,
63+
FOUR_RANK_MODE = 4,
64+
DDP_COMPATIBILITY = 5,
65+
TSV_8H_SUPPORT = 6,
66+
PSTATES = 7,
67+
MRAM_SUPPORT = 8,
68+
HEIGHT_3DS = 9,
69+
SPD_CL_SUPPORTED = 10,
70+
71+
// Dispatcher set to last enum value
72+
ATTR_EFF_DISPATCHER = SPD_CL_SUPPORTED,
73+
};
74+
5175
///
5276
/// @brief common explorer sizes
5377
///
@@ -66,6 +90,18 @@ enum ffdc_codes
6690
EXP_I2C_SET_FIELD = 0x0001,
6791
READ_HOST_FW_RESPONSE_STRUCT = 0x0003,
6892
READ_SENSOR_CACHE_STRUCT = 0x0004,
93+
94+
SET_BYTE_ENABLES = 0x1041,
95+
SET_NIBBLE_ENABLES = 0x1042,
96+
SET_TAA_MIN = 0x1043,
97+
SET_FOUR_RANK_MODE = 0x1044,
98+
SET_DDP_COMPATIBILITY = 0x1045,
99+
SET_TSV_8H_SUPPORT = 0x1046,
100+
SET_VREF_DQ_TRAIN_RANGE = 0x1047,
101+
SET_PSTATES = 0x1048,
102+
SET_MRAM_SUPPORT = 0x1049,
103+
SET_3DS_HEIGHT = 0x1050,
104+
SET_SPD_CL_SUPPORTED = 0x1051,
69105
};
70106

71107
namespace i2c

src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.C

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,14 @@
3434
// *HWP Consumed by: FSP:HB
3535

3636
// fapi2
37+
#include <fapi2.H>
3738
#include <p9a_mss_eff_config.H>
38-
39+
#include <generic/memory/lib/data_engine/data_engine.H>
40+
#include <generic/memory/lib/utils/find.H>
41+
#include <generic/memory/lib/spd/ddimm/efd_factory.H>
42+
#include <vpd_access.H>
43+
#include <mss_generic_attribute_getters.H>
44+
#include <lib/eff_config/explorer_attr_engine_traits.H>
3945

4046
///
4147
/// @brief Configure the attributes for each controller
@@ -44,5 +50,63 @@
4450
///
4551
fapi2::ReturnCode p9a_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>& i_target )
4652
{
47-
return fapi2::FAPI2_RC_SUCCESS;
53+
// Workaround until DIMM level attrs work
54+
uint8_t l_ranks[mss::exp::MAX_DIMM_PER_PORT] = {};
55+
56+
// Get EFD size - should only need to do it once
57+
const auto l_ocmb = mss::find_target<fapi2::TARGET_TYPE_OCMB_CHIP>(i_target);
58+
fapi2::MemVpdData_t l_vpd_type(fapi2::EFD);
59+
fapi2::VPDInfo<fapi2::TARGET_TYPE_OCMB_CHIP> l_vpd_info(l_vpd_type);
60+
FAPI_TRY( fapi2::getVPD(l_ocmb, l_vpd_info, nullptr) );
61+
62+
FAPI_TRY( mss::attr::get_num_master_ranks_per_dimm(i_target, l_ranks) );
63+
64+
for(const auto& dimm : mss::find_targets<fapi2::TARGET_TYPE_DIMM>(i_target))
65+
{
66+
uint8_t l_dimm_index = 0;
67+
uint64_t l_freq = 0;
68+
FAPI_TRY( mss::attr::get_freq(mss::find_target<fapi2::TARGET_TYPE_MEM_PORT>(dimm), l_freq) );
69+
70+
// Quick hack to get the index until DIMM level attrs work
71+
FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_REL_POS, dimm, l_dimm_index) );
72+
73+
for( auto rank = 0; rank < l_ranks[l_dimm_index]; ++rank )
74+
{
75+
std::shared_ptr<mss::efd::base_decoder> l_efd_data;
76+
77+
// Get EFD data
78+
l_vpd_info.iv_rank = rank;
79+
l_vpd_info.iv_omi_freq_mhz = l_freq;
80+
std::vector<uint8_t> l_vpd_raw (l_vpd_info.iv_size, 0);
81+
FAPI_TRY( fapi2::getVPD(l_ocmb, l_vpd_info, l_vpd_raw.data()) );
82+
83+
// Instantiate EFD decoder
84+
FAPI_TRY( mss::efd::factory(l_ocmb, l_vpd_raw, l_vpd_info.iv_rank, l_efd_data) );
85+
86+
// Set up SI ATTRS
87+
FAPI_TRY( mss::attr_si_engine<mss::attr_si_engine_fields>::set(l_efd_data) );
88+
}
89+
90+
{
91+
std::vector<uint8_t> l_raw_spd;
92+
FAPI_TRY(mss::spd::get_raw_data(dimm, l_raw_spd));
93+
{
94+
// Gets the SPD facade
95+
fapi2::ReturnCode l_rc(fapi2::FAPI2_RC_SUCCESS);
96+
mss::spd::facade l_spd_decoder(dimm, l_raw_spd, l_rc);
97+
98+
// Checks that the facade was setup correctly
99+
FAPI_TRY( l_rc, "Failed to initialize SPD facade for %s", mss::spd::c_str(dimm) );
100+
101+
// Set up generic SPD ATTRS
102+
FAPI_TRY( mss::attr_eff_engine<mss::attr_eff_engine_fields>::set(l_spd_decoder) );
103+
104+
// Set up explorer SPD ATTRS
105+
FAPI_TRY( mss::attr_eff_engine<mss::exp::attr_eff_engine_fields>::set(l_spd_decoder) );
106+
}
107+
}
108+
}// dimm
109+
110+
fapi_try_exit:
111+
return fapi2::current_err;
48112
}

src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
-include 00p9a_common.mk
2828

2929
PROCEDURE=p9a_mss_eff_config
30-
$(eval $(call ADD_MEMORY_INCDIRS,$(PROCEDURE)))
30+
$(eval $(call ADD_P9A_MEMORY_INCDIRS,$(PROCEDURE)))
3131
$(call BUILD_PROCEDURE)

src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq.C

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@
3333
// *HWP Level: 1
3434
// *HWP Consumed by: FSP:HB
3535

36-
// fapi2
3736
#include <p9a_mss_freq.H>
37+
#include <generic/memory/lib/data_engine/p9a/p9a_data_init_traits.H>
38+
#include <generic/memory/lib/data_engine/data_engine.H>
39+
#include <generic/memory/lib/utils/find.H>
40+
#include <generic/memory/lib/spd/spd_facade.H>
3841

3942
///
4043
/// @brief Calculate and save off DIMM frequencies
@@ -43,5 +46,27 @@
4346
///
4447
fapi2::ReturnCode p9a_mss_freq( const fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>& i_target )
4548
{
46-
return fapi2::FAPI2_RC_SUCCESS;
49+
// We will first set pre-eff_config attribes
50+
for(const auto& d : mss::find_targets<fapi2::TARGET_TYPE_DIMM>(i_target))
51+
{
52+
std::vector<uint8_t> l_raw_spd;
53+
FAPI_TRY(mss::spd::get_raw_data(d, l_raw_spd));
54+
{
55+
// Gets the SPD facade
56+
fapi2::ReturnCode l_rc(fapi2::FAPI2_RC_SUCCESS);
57+
mss::spd::facade l_spd_decoder(d, l_raw_spd, l_rc);
58+
59+
// Checks that the facade was setup correctly
60+
FAPI_TRY( l_rc, "Failed to initialize SPD facade for %s", mss::spd::c_str(d) );
61+
62+
FAPI_TRY( mss::attr_eff_engine<mss::pre_data_init_fields>::set(l_spd_decoder) );
63+
}
64+
65+
// TK - Remove hard-code FREQ -- Should we have enums? Louis problem now
66+
uint64_t HARDCODE_FREQ_LOUIS_REMOVE = 25600;
67+
FAPI_TRY( mss::attr::set_freq(i_target, HARDCODE_FREQ_LOUIS_REMOVE) );
68+
}// dimm
69+
70+
fapi_try_exit:
71+
return fapi2::current_err;
4772
}

0 commit comments

Comments
 (0)