soc/mediatek/mt8183: Pass impedance data as a function argument
To make data flow more explicit, global variable 'impedance' is replaced with a local variable, which is passed as a function argument. BUG=none BRANCH=kukui TEST=Krane boots correctly Change-Id: I0f6dacc33fda013a3476a10d9899821b7297e770 Signed-off-by: Yu-Ping Wu <yupingso@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/35766 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Hung-Te Lin <hungte@chromium.org>
This commit is contained in:
parent
cea735cf12
commit
4d4ccced31
|
@ -979,7 +979,8 @@ static void dramc_setting_DDR3600(void)
|
||||||
clrsetbits_le32(&ch[0].ao.shu[0].selph_dqs1, 0x77777777, SELPH_DQS1_3600);
|
clrsetbits_le32(&ch[0].ao.shu[0].selph_dqs1, 0x77777777, SELPH_DQS1_3600);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dramc_setting(const struct sdram_params *params, u8 freq_group)
|
static void dramc_setting(const struct sdram_params *params, u8 freq_group,
|
||||||
|
const struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
u8 chn;
|
u8 chn;
|
||||||
|
|
||||||
|
@ -1399,11 +1400,10 @@ static void dramc_setting(const struct sdram_params *params, u8 freq_group)
|
||||||
default:
|
default:
|
||||||
die("Invalid DDR frequency group %u\n", freq_group);
|
die("Invalid DDR frequency group %u\n", freq_group);
|
||||||
return;
|
return;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update_initial_settings(freq_group);
|
update_initial_settings(freq_group);
|
||||||
dramc_sw_impedance_save_reg(freq_group);
|
dramc_sw_impedance_save_reg(freq_group, impedance);
|
||||||
|
|
||||||
clrbits_le32(&ch[0].ao.test2_4, 0x1 << 17);
|
clrbits_le32(&ch[0].ao.test2_4, 0x1 << 17);
|
||||||
clrsetbits_le32(&ch[0].ao.shu[0].conf[3], 0x1ff << 0, 0x5 << 0);
|
clrsetbits_le32(&ch[0].ao.shu[0].conf[3], 0x1ff << 0, 0x5 << 0);
|
||||||
|
@ -1729,9 +1729,10 @@ static void ddr_update_ac_timing(u8 freq_group)
|
||||||
clrsetbits_le32(&ch[0].ao.arbctl, 0x1 << 13, dram_cbt_mode);
|
clrsetbits_le32(&ch[0].ao.arbctl, 0x1 << 13, dram_cbt_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dramc_init(const struct sdram_params *params, u8 freq_group)
|
void dramc_init(const struct sdram_params *params, u8 freq_group,
|
||||||
|
const struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
dramc_setting(params, freq_group);
|
dramc_setting(params, freq_group, impedance);
|
||||||
|
|
||||||
dramc_duty_calibration(params, freq_group);
|
dramc_duty_calibration(params, freq_group);
|
||||||
dvfs_settings(freq_group);
|
dvfs_settings(freq_group);
|
||||||
|
|
|
@ -20,8 +20,6 @@
|
||||||
#include <soc/dramc_register.h>
|
#include <soc/dramc_register.h>
|
||||||
#include <soc/dramc_pi_api.h>
|
#include <soc/dramc_pi_api.h>
|
||||||
|
|
||||||
static u32 impedance[2][4];
|
|
||||||
|
|
||||||
u8 get_freq_fsq(u8 freq)
|
u8 get_freq_fsq(u8 freq)
|
||||||
{
|
{
|
||||||
if (freq == LP4X_DDR1600 || freq == LP4X_DDR2400)
|
if (freq == LP4X_DDR1600 || freq == LP4X_DDR2400)
|
||||||
|
@ -53,7 +51,8 @@ static void dramc_sw_imp_cal_vref_sel(u8 term_option, u8 impcal_stage)
|
||||||
clrsetbits_le32(&ch[0].phy.shu[0].ca_cmd[11], 0x3f << 8, vref_sel << 8);
|
clrsetbits_le32(&ch[0].phy.shu[0].ca_cmd[11], 0x3f << 8, vref_sel << 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term)
|
void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term,
|
||||||
|
struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
u32 broadcast_bak, impcal_bak, imp_cal_result;
|
u32 broadcast_bak, impcal_bak, imp_cal_result;
|
||||||
u32 DRVP_result = 0xff, ODTN_result = 0xff, DRVN_result = 0x9;
|
u32 DRVP_result = 0xff, ODTN_result = 0xff, DRVN_result = 0x9;
|
||||||
|
@ -131,26 +130,25 @@ void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term)
|
||||||
|
|
||||||
dramc_show("impedance: term=%d, DRVP=%d, DRVN=%d, ODTN=%d\n",
|
dramc_show("impedance: term=%d, DRVP=%d, DRVN=%d, ODTN=%d\n",
|
||||||
term, DRVP_result, DRVN_result, ODTN_result);
|
term, DRVP_result, DRVN_result, ODTN_result);
|
||||||
|
u32 *imp = impedance->data[term];
|
||||||
if (term == ODT_OFF) {
|
if (term == ODT_OFF) {
|
||||||
impedance[term][0] = DRVP_result;
|
imp[0] = DRVP_result;
|
||||||
impedance[term][1] = ODTN_result;
|
imp[1] = ODTN_result;
|
||||||
impedance[term][2] = 0;
|
imp[2] = 0;
|
||||||
impedance[term][3] = 15;
|
imp[3] = 15;
|
||||||
} else {
|
} else {
|
||||||
impedance[term][0] = (DRVP_result <= 3) ?
|
imp[0] = (DRVP_result <= 3) ? (DRVP_result * 3) : DRVP_result;
|
||||||
(DRVP_result * 3) : DRVP_result;
|
imp[1] = (DRVN_result <= 3) ? (DRVN_result * 3) : DRVN_result;
|
||||||
impedance[term][1] = (DRVN_result <= 3) ?
|
imp[2] = 0;
|
||||||
(DRVN_result * 3) : DRVN_result;
|
imp[3] = (ODTN_result <= 3) ? (ODTN_result * 3) : ODTN_result;
|
||||||
impedance[term][2] = 0;
|
|
||||||
impedance[term][3] = (ODTN_result <= 3) ?
|
|
||||||
(ODTN_result * 3) : ODTN_result;
|
|
||||||
}
|
}
|
||||||
dramc_sw_imp_cal_vref_sel(term, IMPCAL_STAGE_TRACKING);
|
dramc_sw_imp_cal_vref_sel(term, IMPCAL_STAGE_TRACKING);
|
||||||
|
|
||||||
dramc_set_broadcast(broadcast_bak);
|
dramc_set_broadcast(broadcast_bak);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dramc_sw_impedance_save_reg(u8 freq_group)
|
void dramc_sw_impedance_save_reg(u8 freq_group,
|
||||||
|
const struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
u8 ca_term = ODT_OFF, dq_term = ODT_ON;
|
u8 ca_term = ODT_OFF, dq_term = ODT_ON;
|
||||||
u32 sw_impedance[2][4] = {0};
|
u32 sw_impedance[2][4] = {0};
|
||||||
|
@ -160,7 +158,7 @@ void dramc_sw_impedance_save_reg(u8 freq_group)
|
||||||
|
|
||||||
for (u8 term = 0; term < 2; term++)
|
for (u8 term = 0; term < 2; term++)
|
||||||
for (u8 i = 0; i < 4; i++)
|
for (u8 i = 0; i < 4; i++)
|
||||||
sw_impedance[term][i] = impedance[term][i];
|
sw_impedance[term][i] = impedance->data[term][i];
|
||||||
|
|
||||||
sw_impedance[ODT_OFF][2] = sw_impedance[ODT_ON][2];
|
sw_impedance[ODT_OFF][2] = sw_impedance[ODT_ON][2];
|
||||||
sw_impedance[ODT_OFF][3] = sw_impedance[ODT_ON][3];
|
sw_impedance[ODT_OFF][3] = sw_impedance[ODT_ON][3];
|
||||||
|
|
|
@ -349,13 +349,16 @@ static void spm_pinmux_setting(void)
|
||||||
write32(&mtk_spm->dramc_dpy_clk_sw_con_sel2, 0xffffffff);
|
write32(&mtk_spm->dramc_dpy_clk_sw_con_sel2, 0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dfs_init_for_calibration(const struct sdram_params *params, u8 freq_group)
|
static void dfs_init_for_calibration(const struct sdram_params *params,
|
||||||
|
u8 freq_group,
|
||||||
|
struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
dramc_init(params, freq_group);
|
dramc_init(params, freq_group, impedance);
|
||||||
dramc_apply_config_before_calibration(freq_group);
|
dramc_apply_config_before_calibration(freq_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_dram(const struct sdram_params *params, u8 freq_group)
|
static void init_dram(const struct sdram_params *params, u8 freq_group,
|
||||||
|
struct dram_impedance *impedance)
|
||||||
{
|
{
|
||||||
global_option_init(params);
|
global_option_init(params);
|
||||||
emi_init(params);
|
emi_init(params);
|
||||||
|
@ -364,10 +367,11 @@ static void init_dram(const struct sdram_params *params, u8 freq_group)
|
||||||
dramc_init_pre_settings();
|
dramc_init_pre_settings();
|
||||||
spm_pinmux_setting();
|
spm_pinmux_setting();
|
||||||
|
|
||||||
dramc_sw_impedance_cal(params, ODT_OFF);
|
dramc_sw_impedance_cal(params, ODT_OFF, impedance);
|
||||||
dramc_sw_impedance_cal(params, ODT_ON);
|
dramc_sw_impedance_cal(params, ODT_ON, impedance);
|
||||||
|
|
||||||
dfs_init_for_calibration(params, freq_group);
|
dramc_init(params, freq_group, impedance);
|
||||||
|
dramc_apply_config_before_calibration(freq_group);
|
||||||
emi_init2(params);
|
emi_init2(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,6 +491,7 @@ static void dramc_save_result_to_shuffle(u32 src_shuffle, u32 dst_shuffle)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_calib(const struct dramc_param *dparam,
|
static int run_calib(const struct dramc_param *dparam,
|
||||||
|
struct dram_impedance *impedance,
|
||||||
const int shuffle, bool *first_run)
|
const int shuffle, bool *first_run)
|
||||||
{
|
{
|
||||||
const u8 *freq_tbl;
|
const u8 *freq_tbl;
|
||||||
|
@ -505,9 +510,9 @@ static int run_calib(const struct dramc_param *dparam,
|
||||||
freq_group, *first_run);
|
freq_group, *first_run);
|
||||||
|
|
||||||
if (*first_run)
|
if (*first_run)
|
||||||
init_dram(params, freq_group);
|
init_dram(params, freq_group, impedance);
|
||||||
else
|
else
|
||||||
dfs_init_for_calibration(params, freq_group);
|
dfs_init_for_calibration(params, freq_group, impedance);
|
||||||
*first_run = false;
|
*first_run = false;
|
||||||
|
|
||||||
dramc_show("Start K (current clock: %u\n", params->frequency);
|
dramc_show("Start K (current clock: %u\n", params->frequency);
|
||||||
|
@ -528,17 +533,20 @@ static void after_calib(void)
|
||||||
|
|
||||||
int mt_set_emi(const struct dramc_param *dparam)
|
int mt_set_emi(const struct dramc_param *dparam)
|
||||||
{
|
{
|
||||||
|
struct dram_impedance impedance;
|
||||||
bool first_run = true;
|
bool first_run = true;
|
||||||
set_vdram1_vddq_voltage();
|
set_vdram1_vddq_voltage();
|
||||||
|
|
||||||
if (CONFIG(MT8183_DRAM_DVFS)) {
|
if (CONFIG(MT8183_DRAM_DVFS)) {
|
||||||
if (run_calib(dparam, DRAM_DFS_SHUFFLE_3, &first_run) != 0)
|
if (run_calib(dparam, &impedance, DRAM_DFS_SHUFFLE_3,
|
||||||
|
&first_run) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (run_calib(dparam, DRAM_DFS_SHUFFLE_2, &first_run) != 0)
|
if (run_calib(dparam, &impedance, DRAM_DFS_SHUFFLE_2,
|
||||||
|
&first_run) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (run_calib(dparam, DRAM_DFS_SHUFFLE_1, &first_run) != 0)
|
if (run_calib(dparam, &impedance, DRAM_DFS_SHUFFLE_1, &first_run) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
after_calib();
|
after_calib();
|
||||||
|
|
|
@ -37,7 +37,8 @@ enum {
|
||||||
|
|
||||||
enum dram_odt_type {
|
enum dram_odt_type {
|
||||||
ODT_OFF = 0,
|
ODT_OFF = 0,
|
||||||
ODT_ON
|
ODT_ON,
|
||||||
|
ODT_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -105,9 +105,12 @@ void dramc_runtime_config(void);
|
||||||
void dramc_set_broadcast(u32 onoff);
|
void dramc_set_broadcast(u32 onoff);
|
||||||
u32 dramc_get_broadcast(void);
|
u32 dramc_get_broadcast(void);
|
||||||
u8 get_freq_fsq(u8 freq_group);
|
u8 get_freq_fsq(u8 freq_group);
|
||||||
void dramc_init(const struct sdram_params *params, u8 freq_group);
|
void dramc_init(const struct sdram_params *params, u8 freq_group,
|
||||||
void dramc_sw_impedance_save_reg(u8 freq_group);
|
const struct dram_impedance *impedance);
|
||||||
void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term_option);
|
void dramc_sw_impedance_save_reg(u8 freq_group,
|
||||||
|
const struct dram_impedance *impedance);
|
||||||
|
void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term_option,
|
||||||
|
struct dram_impedance *impedance);
|
||||||
void dramc_apply_config_before_calibration(u8 freq_group);
|
void dramc_apply_config_before_calibration(u8 freq_group);
|
||||||
void dramc_apply_config_after_calibration(void);
|
void dramc_apply_config_after_calibration(void);
|
||||||
int dramc_calibrate_all_channels(const struct sdram_params *pams,
|
int dramc_calibrate_all_channels(const struct sdram_params *pams,
|
||||||
|
|
|
@ -82,6 +82,10 @@ enum {
|
||||||
LP4X_DDRFREQ_MAX,
|
LP4X_DDRFREQ_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dram_impedance {
|
||||||
|
u32 data[ODT_MAX][4];
|
||||||
|
};
|
||||||
|
|
||||||
extern const u8 phy_mapping[CHANNEL_MAX][16];
|
extern const u8 phy_mapping[CHANNEL_MAX][16];
|
||||||
|
|
||||||
int complex_mem_test(u8 *start, unsigned int len);
|
int complex_mem_test(u8 *start, unsigned int len);
|
||||||
|
|
Loading…
Reference in New Issue