4 #include <soc/dramc_param.h>
5 #include <soc/dramc_pi_api.h>
6 #include <soc/dramc_register.h>
8 #include <soc/infracfg.h>
41 1, 0, 2, 4, 3, 7, 5, 6,
42 9, 8, 12, 11, 10, 15, 13, 14
46 0, 1, 5, 6, 3, 7, 4, 2,
47 9, 8, 12, 15, 11, 14, 13, 10
71 const u8 *freq_tbl =
CONFIG(MT8183_DRAM_EMCP) ?
78 u32 shift_for_16bit = 1;
82 shift_for_16bit = (emi_cona & 0x2) ? 0 : 1;
84 col_bit = ((emi_cona >> (chn * 16 + rank * 2 + 4)) & 0x03) + 9;
85 row_bit = ((((emi_cona >> (24 - chn * 20 + rank)) & 0x01) << 2) +
86 ((emi_cona >> (12 + chn * 16 + rank * 2)) & 0x03)) + 13;
89 return ((
u64)(1 << (row_bit + col_bit))) *
90 ((
u64)(4 >> shift_for_16bit) * 8);
95 u64 ch0_rank0_size, ch0_rank1_size, ch1_rank0_size, ch1_rank1_size;
96 u64 ch_rank0_size = 0, ch_rank1_size = 0;
100 dram_rank_size[0] = 0;
101 dram_rank_size[1] = 0;
103 ch0_rank0_size = (emi_conh >> 16) & 0xf;
104 ch0_rank1_size = (emi_conh >> 20) & 0xf;
105 ch1_rank0_size = (emi_conh >> 24) & 0xf;
106 ch1_rank1_size = (emi_conh >> 28) & 0xf;
109 if (ch0_rank0_size == 0)
112 ch_rank0_size = (ch0_rank0_size * 256 << 20);
115 if ((emi_cona & (1 << 17)) != 0) {
116 if (ch0_rank1_size == 0)
119 ch_rank1_size = (ch0_rank1_size * 256 << 20);
122 dram_rank_size[0] = ch_rank0_size;
123 dram_rank_size[1] = ch_rank1_size;
125 if (ch1_rank0_size == 0)
128 ch_rank0_size = (ch1_rank0_size * 256 << 20);
130 if ((emi_cona & (1 << 16)) != 0) {
131 if (ch1_rank1_size == 0)
134 ch_rank1_size = (ch1_rank1_size * 256 << 20);
136 dram_rank_size[0] += ch_rank0_size;
137 dram_rank_size[1] += ch_rank1_size;
142 size_t dram_size = 0;
148 dram_size += rank_size[i];
165 (map[8] << 0) | (map[9] << 8) |
166 (map[10] << 16) | (map[11] << 24));
169 (map[12] << 0) | (map[13] << 8));
178 (map[0] << 0) | (map[1] << 8) |
179 (map[2] << 16) | (map[3] << 24));
182 (map[4] << 0) | (map[5] << 8) |
183 (map[6] << 16) | (map[7] << 24));
186 (map[8] << 0) | (map[9] << 8) |
187 (map[10] << 16) | (map[11] << 24));
190 (map[12] << 0) | (map[13] << 8) |
191 (map[14] << 16) | (map[15] << 24));
204 dramc_dbg(
"Set DRAM voltage (freq %d): vcore = %u\n",
211 const u32 vdram1 = 1125000;
212 const u32 vddq = 600000;
213 dramc_dbg(
"Set DRAM voltage: vdram1 = %u, vddq = %u\n",
255 write32(&
ch[0].emi.chn_cona, 0x0400a051);
256 write32(&
ch[0].emi.chn_conb, 0x00ff2048);
257 write32(&
ch[0].emi.chn_conc, 0x00000000);
258 write32(&
ch[0].emi.chn_mdct, 0x88008817);
259 write32(&
ch[0].emi.chn_testb, 0x00030027);
260 write32(&
ch[0].emi.chn_testc, 0x38460002);
261 write32(&
ch[0].emi.chn_testd, 0x00000000);
262 write32(&
ch[0].emi.chn_md_pre_mask, 0x00000f00);
263 write32(&
ch[0].emi.chn_md_pre_mask_shf, 0x00000b00);
264 write32(&
ch[0].emi.chn_arbi, 0x20406188);
265 write32(&
ch[0].emi.chn_arbi_2nd, 0x20406188);
266 write32(&
ch[0].emi.chn_arbj, 0x3719595e);
267 write32(&
ch[0].emi.chn_arbj_2nd, 0x3719595e);
268 write32(&
ch[0].emi.chn_arbk, 0x64f3fc79);
269 write32(&
ch[0].emi.chn_arbk_2nd, 0x64f3fc79);
270 write32(&
ch[0].emi.chn_slct, 0x00080888);
271 write32(&
ch[0].emi.chn_arb_ref, 0x82410222);
272 write32(&
ch[0].emi.chn_emi_shf0, 0x8a228c17);
273 write32(&
ch[0].emi.chn_rkarb0, 0x0006002f);
274 write32(&
ch[0].emi.chn_rkarb1, 0x01010101);
275 write32(&
ch[0].emi.chn_rkarb2, 0x10100820);
276 write32(&
ch[0].emi.chn_eco3, 0x00000000);
311 if (
CONFIG(MT8183_DRAM_EMCP))
326 (0x1 << 21) | (0x1 << 20) | (0x1 << 19) | (0x1 << 18) |
327 (0x1f << 8) | (0x1f << 0),
328 (0x1 << 19) | (0xa << 8) | (0xa << 0));
338 u8 trfc, trfrc_05t, trfc_pb, trfrc_pb05t, tx_ref_cnt;
349 [tRFCAB_130] = {.
trfc = 14, .trfrc_05t = 0, .trfc_pb = 0,
350 .trfrc_pb05t = 0, .tx_ref_cnt = 32},
351 [tRFCAB_180] = {.trfc = 24, .trfrc_05t = 0, .trfc_pb = 6,
352 .trfrc_pb05t = 0, .tx_ref_cnt = 42},
353 [tRFCAB_280] = {.trfc = 44, .trfrc_05t = 0, .trfc_pb = 16,
354 .trfrc_pb05t = 0, .tx_ref_cnt = 62},
355 [tRFCAB_380] = {.trfc = 64, .trfrc_05t = 0, .trfc_pb = 26,
356 .trfrc_pb05t = 0, .tx_ref_cnt = 82}
359 [tRFCAB_130] = {.trfc = 27, .trfrc_05t = 0, .trfc_pb = 6,
360 .trfrc_pb05t = 0, .tx_ref_cnt = 46},
361 [tRFCAB_180] = {.trfc = 42, .trfrc_05t = 0, .trfc_pb = 15,
362 .trfrc_pb05t = 0, .tx_ref_cnt = 61},
363 [tRFCAB_280] = {.trfc = 72, .trfrc_05t = 0, .trfc_pb = 30,
364 .trfrc_pb05t = 0, .tx_ref_cnt = 91},
365 [tRFCAB_380] = {.trfc = 102, .trfrc_05t = 0, .trfc_pb = 45,
366 .trfrc_pb05t = 0, .tx_ref_cnt = 121}
369 [tRFCAB_130] = {.trfc = 40, .trfrc_05t = 0, .trfc_pb = 12,
370 .trfrc_pb05t = 0, .tx_ref_cnt = 59},
371 [tRFCAB_180] = {.trfc = 60, .trfrc_05t = 0, .trfc_pb = 24,
372 .trfrc_pb05t = 0, .tx_ref_cnt = 79},
373 [tRFCAB_280] = {.trfc = 100, .trfrc_05t = 0, .trfc_pb = 44,
374 .trfrc_pb05t = 0, .tx_ref_cnt = 119},
375 [tRFCAB_380] = {.trfc = 140, .trfrc_05t = 0, .trfc_pb = 64,
376 .trfrc_pb05t = 0, .tx_ref_cnt = 159}
379 [tRFCAB_130] = {.trfc = 48, .trfrc_05t = 1, .trfc_pb = 16,
380 .trfrc_pb05t = 0, .tx_ref_cnt = 68},
381 [tRFCAB_180] = {.trfc = 72, .trfrc_05t = 0, .trfc_pb = 30,
382 .trfrc_pb05t = 0, .tx_ref_cnt = 92},
383 [tRFCAB_280] = {.trfc = 118, .trfrc_05t = 1, .trfc_pb = 53,
384 .trfrc_pb05t = 1, .tx_ref_cnt = 138},
385 [tRFCAB_380] = {.trfc = 165, .trfrc_05t = 0, .trfc_pb = 76,
386 .trfrc_pb05t = 1, .tx_ref_cnt = 185}
392 rfcab_grp = tRFCAB_130;
396 rfcab_grp = tRFCAB_180;
400 rfcab_grp = tRFCAB_280;
404 rfcab_grp = tRFCAB_380;
417 dramc_dbg(
"Density %d, trfc %u, trfrc_05t %d, tx_ref_cnt %d, trfc_pb %d, trfrc_pb05t %d\n",
422 0xff << 16,
trfc << 16);
437 (0xffff << 16) | (0x1 << 0), (0xb16 << 16) | (0x1 << 0));
483 #define AO_SHU_ADDR(s, e) \
485 .start = offsetof(struct dramc_ao_regs_shu, s), \
486 .end = offsetof(struct dramc_ao_regs_shu, e), \
497 #define PHY_SHU_ADDR(s, e) \
499 .start = offsetof(struct ddrphy_ao_shu, s), \
500 .end = offsetof(struct ddrphy_ao_shu, e), \
523 u8 *src_addr, *dst_addr;
525 if (src_shuffle == dst_shuffle)
528 dramc_dbg(
"Save shuffle %u to shuffle %u\n", src_shuffle, dst_shuffle);
535 src_addr = (
u8 *)&
ch[chn].ao.shu[src_shuffle] +
537 dst_addr = (
u8 *)&
ch[chn].ao.shu[dst_shuffle] +
545 src_addr = (
u8 *)&
ch[chn].ao.shuctrl2;
546 dst_addr = (
u8 *)&
ch[chn].ao.dvfsdll;
555 src_addr = (
u8 *)&
ch[chn].ao.dvfsdll;
567 src_addr = (
u8 *)&
ch[chn].phy.shu[src_shuffle] +
569 dst_addr = (
u8 *)&
ch[chn].phy.shu[dst_shuffle] +
580 const int shuffle,
bool *first_run)
585 if (
CONFIG(MT8183_DRAM_EMCP))
590 const u8 freq_group = freq_tbl[shuffle];
595 dramc_show(
"Run calibration (freq: %u, first: %d)\n",
625 bool first_run =
true;
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
static struct sdram_info params
#define dramc_err(_x_...)
#define dramc_dbg(_x_...)
#define setbits32(addr, set)
#define clrsetbits32(addr, clear, set)
#define clrbits32(addr, clear)
void pmic_set_vddq_vol(unsigned int vddq_uv)
void pmic_set_vdram1_vol(unsigned int vdram_uv)
void pmic_set_vcore_vol(unsigned int vcore_uv)
void dramc_init(u32 channel, const struct mt8173_sdram_params *sdram_params)
u8 is_dual_rank(u32 channel, const struct mt8173_sdram_params *sdram_params)
void dramc_runtime_config(u32 channel, const struct mt8173_sdram_params *sdram_params)
void mt_set_emi(const struct mt8173_sdram_params *sdram_params)
static struct dramc_channel const ch[2]
static struct mtk_spm_regs *const mtk_spm
void dramc_sw_impedance_cal(const struct sdram_params *params, u8 term, struct dram_impedance *impedance)
int dramc_calibrate_all_channels(const struct sdram_params *pams, u8 freq_group, struct mr_value *mr, bool run_dvfs)
void dramc_apply_config_after_calibration(const struct mr_value *mr, u32 rk_num)
void get_dram_info_after_cal(u8 *density_result, u32 rk_num)
void dramc_apply_config_before_calibration(u8 freq_group, u32 cbt_mode)
void dramc_get_rank_size(u64 *dram_rank_size)
static void set_vcore_voltage(u8 freq_group)
static void set_vdram1_vddq_voltage(void)
static void dramc_ac_timing_optimize(u8 freq_group, u8 density)
static const u32 vcore_lp4x[LP4X_DDRFREQ_MAX]
static const struct shuffle_reg_addr phy_regs[]
static void emi_init(const struct sdram_params *params)
static void init_dram(const struct sdram_params *params, u8 freq_group, struct dram_shared_data *shared)
static void after_calib(const struct mr_value *mr, u32 rk_num)
static void emi_init2(const struct sdram_params *params)
static const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX]
static void spm_pinmux_setting(void)
#define AO_SHU_ADDR(s, e)
static void dfs_init_for_calibration(const struct sdram_params *params, u8 freq_group, struct dram_shared_data *shared)
void enable_emi_dcm(void)
void set_mrr_pinmux_mapping(void)
static void set_rank_info_to_conf(const struct sdram_params *params)
u32 dramc_get_broadcast(void)
static const struct shuffle_reg_addr dramc_regs[]
static const u32 frequency_table[LP4X_DDRFREQ_MAX]
void cbt_mrr_pinmux_mapping(void)
static const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX]
#define PHY_SHU_ADDR(s, e)
static int run_calib(const struct dramc_param *dparam, struct dram_shared_data *shared, const int shuffle, bool *first_run)
static u64 get_ch_rank_size(u8 chn, u8 rank)
static void emi_esl_setting2(void)
const u8 phy_mapping[CHANNEL_MAX][16]
static void global_option_init(const struct sdram_params *params)
static void dramc_save_result_to_shuffle(u32 src_shuffle, u32 dst_shuffle)
static void dramc_init_pre_settings(void)
void dramc_set_broadcast(u32 onoff)
static void emi_esl_setting1(void)
#define DRAMC_BROADCAST_OFF
#define DRAMC_BROADCAST_ON
static struct emi_mpu_regs *const emi_mpu
static struct mt8183_infracfg_regs *const mt8183_infracfg
struct dram_impedance impedance
struct dramc_param_header header
struct sdram_params freq_params[DRAM_DFS_SHUFFLE_MAX]
u32 dramc_dpy_clk_sw_con_sel
u32 dramc_dpy_clk_sw_con_sel2
Defines the SDRAM parameter structure.