summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/import/chips/centaur/procedures/hwp/memory/p9c_mss_eff_config.C54
1 files changed, 49 insertions, 5 deletions
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_eff_config.C b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_eff_config.C
index 582b7b793..de0ff96b9 100644
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_eff_config.C
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_eff_config.C
@@ -719,6 +719,7 @@ extern "C"
uint8_t l_mss_power_control_requested = 0;
uint32_t l_rdimm_rcd_ibt[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0};
uint8_t l_rdimm_rcd_output_timing[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0};
+ uint8_t l_refresh_rate = 0;
uint8_t l_die_count = 1;
uint8_t l_ranks_3d_tsv = 0;
uint8_t l_allow_port_size = 1;
@@ -726,6 +727,9 @@ extern "C"
uint32_t l_max_delay = 0; // in ps
uint8_t l_speed_idx = 0;
uint8_t l_width_idx = 0;
+ constexpr double TEN_PERCENT_FASTER = 0.90;
+ constexpr double ONE_PERCENT_FASTER = 0.99;
+ constexpr uint64_t TRFI_BASE = 7800;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_VPD_DRAM_ADDRESS_MIRRORING, i_target_mba, l_vpd_dram_address_mirroring));
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_VPD_DRAM_2N_MODE_ENABLED, i_target_mba, l_mss_dram_2n_mode_enable));
// DDR4 Vref
@@ -1782,11 +1786,51 @@ extern "C"
o_atts->eff_memcal_interval = (62500 *
i_mss_eff_config_data->mss_freq) / 2;
- // Calculate tRFI
- o_atts->eff_dram_trfi = (3900 *
- i_mss_eff_config_data->mss_freq) / 2000;
- // Added 10% margin to TRFI per defect HW248225
- o_atts->eff_dram_trfi = (o_atts->eff_dram_trfi * 9) / 10;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MSS_MRW_REFRESH_RATE_REQUEST, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ l_refresh_rate));
+
+ // Calculate tRFI
+ switch(l_refresh_rate)
+ {
+ case fapi2::ENUM_ATTR_MSS_MRW_REFRESH_RATE_REQUEST_DOUBLE:
+ o_atts->eff_dram_trfi = ((TRFI_BASE / 2) *
+ i_mss_eff_config_data->mss_freq) / 2000;
+ // Added 1% margin to TRFI
+ o_atts->eff_dram_trfi = o_atts->eff_dram_trfi * ONE_PERCENT_FASTER;
+ break;
+
+ case fapi2::ENUM_ATTR_MSS_MRW_REFRESH_RATE_REQUEST_DOUBLE_10_PERCENT_FASTER:
+ o_atts->eff_dram_trfi = ((TRFI_BASE / 2) *
+ i_mss_eff_config_data->mss_freq) / 2000;
+ // Added 10% margin to TRFI
+ o_atts->eff_dram_trfi = o_atts->eff_dram_trfi * TEN_PERCENT_FASTER;
+ break;
+
+ case fapi2::ENUM_ATTR_MSS_MRW_REFRESH_RATE_REQUEST_SINGLE:
+ o_atts->eff_dram_trfi = (TRFI_BASE *
+ i_mss_eff_config_data->mss_freq) / 2000;
+ // Added 1% margin to TRFI
+ o_atts->eff_dram_trfi = o_atts->eff_dram_trfi * ONE_PERCENT_FASTER;
+ break;
+
+ case fapi2::ENUM_ATTR_MSS_MRW_REFRESH_RATE_REQUEST_SINGLE_10_PERCENT_FASTER:
+ o_atts->eff_dram_trfi = (TRFI_BASE *
+ i_mss_eff_config_data->mss_freq) / 2000;
+ // Added 10% margin to TRFI
+ o_atts->eff_dram_trfi = o_atts->eff_dram_trfi * TEN_PERCENT_FASTER;
+ break;
+
+ default:
+ FAPI_ERR("Unknown value in MRW attribute ATTR_MSS_MRW_REFRESH_RATE_REQUEST, setting TRFI to double plus 10 percent on %s",
+ mss::c_str(i_target_mba));
+ o_atts->eff_dram_trfi = ((TRFI_BASE / 2) *
+ i_mss_eff_config_data->mss_freq) / 2000;
+ // Added 10% margin to TRFI
+ o_atts->eff_dram_trfi = o_atts->eff_dram_trfi * TEN_PERCENT_FASTER;
+ break;
+ }
+
+ FAPI_INF("Set eff_dram_trfi = %d", o_atts->eff_dram_trfi);
o_atts->eff_vpd_version = 0xFFFFFF; // set VPD version to a large number, searching for smallest
OpenPOWER on IntegriCloud