Lines Matching refs:ddrss

204 	struct k3_ddrss_desc *ddrss = (struct k3_ddrss_desc *)pd->ddr_instance;  in k3_lpddr4_read_ddr_type()  local
207 status = ddrss->driverdt->readreg(pd, LPDDR4_CTL_REGS, offset, &regval); in k3_lpddr4_read_ddr_type()
218 static void k3_lpddr4_freq_update(struct k3_ddrss_desc *ddrss) in k3_lpddr4_freq_update() argument
222 for (counter = 0; counter < ddrss->ddr_fhs_cnt; counter++) { in k3_lpddr4_freq_update()
223 if (wait_for_bit_le32(ddrss->ddrss_ctrl_mmr + in k3_lpddr4_freq_update()
224 CTRLMMR_DDR4_FSP_CLKCHNG_REQ_OFFS + ddrss->instance * 0x10, 0x80, in k3_lpddr4_freq_update()
230 req_type = readl(ddrss->ddrss_ctrl_mmr + in k3_lpddr4_freq_update()
231 CTRLMMR_DDR4_FSP_CLKCHNG_REQ_OFFS + ddrss->instance * 0x10) & 0x03; in k3_lpddr4_freq_update()
234 clk_set_rate(&ddrss->ddr_clk, ddrss->ddr_freq1); in k3_lpddr4_freq_update()
236 clk_set_rate(&ddrss->ddr_clk, ddrss->ddr_freq2); in k3_lpddr4_freq_update()
238 clk_set_rate(&ddrss->ddr_clk, ddrss->ddr_freq0); in k3_lpddr4_freq_update()
242 writel(0x1, ddrss->ddrss_ctrl_mmr + in k3_lpddr4_freq_update()
243 CTRLMMR_DDR4_FSP_CLKCHNG_ACK_OFFS + ddrss->instance * 0x10); in k3_lpddr4_freq_update()
244 if (wait_for_bit_le32(ddrss->ddrss_ctrl_mmr + in k3_lpddr4_freq_update()
245 CTRLMMR_DDR4_FSP_CLKCHNG_REQ_OFFS + ddrss->instance * 0x10, 0x80, in k3_lpddr4_freq_update()
250 writel(0x0, ddrss->ddrss_ctrl_mmr + in k3_lpddr4_freq_update()
251 CTRLMMR_DDR4_FSP_CLKCHNG_ACK_OFFS + ddrss->instance * 0x10); in k3_lpddr4_freq_update()
257 struct k3_ddrss_desc *ddrss = (struct k3_ddrss_desc *)pd->ddr_instance; in k3_lpddr4_ack_freq_upd_req() local
259 switch (ddrss->dram_class) { in k3_lpddr4_ack_freq_upd_req()
263 k3_lpddr4_freq_update(ddrss); in k3_lpddr4_ack_freq_upd_req()
270 static int k3_ddrss_init_freq(struct k3_ddrss_desc *ddrss) in k3_ddrss_init_freq() argument
273 lpddr4_privatedata *pd = &ddrss->pd; in k3_ddrss_init_freq()
275 ddrss->dram_class = k3_lpddr4_read_ddr_type(pd); in k3_ddrss_init_freq()
277 switch (ddrss->dram_class) { in k3_ddrss_init_freq()
280 ret = clk_set_rate(&ddrss->ddr_clk, ddrss->ddr_freq1); in k3_ddrss_init_freq()
283 ret = clk_set_rate(&ddrss->ddr_clk, ddrss->ddr_freq0); in k3_ddrss_init_freq()
291 dev_err(ddrss->dev, "ddr clk init failed: %d\n", ret); in k3_ddrss_init_freq()
305 static int k3_ddrss_power_on(struct k3_ddrss_desc *ddrss) in k3_ddrss_power_on() argument
309 debug("%s(ddrss=%p)\n", __func__, ddrss); in k3_ddrss_power_on()
311 ret = power_domain_on(&ddrss->ddrcfg_pwrdmn); in k3_ddrss_power_on()
313 dev_err(ddrss->dev, "power_domain_on() failed: %d\n", ret); in k3_ddrss_power_on()
317 ret = power_domain_on(&ddrss->ddrdata_pwrdmn); in k3_ddrss_power_on()
319 dev_err(ddrss->dev, "power_domain_on() failed: %d\n", ret); in k3_ddrss_power_on()
323 ret = device_get_supply_regulator(ddrss->dev, "vtt-supply", in k3_ddrss_power_on()
324 &ddrss->vtt_supply); in k3_ddrss_power_on()
326 dev_dbg(ddrss->dev, "vtt-supply not found.\n"); in k3_ddrss_power_on()
328 ret = regulator_set_value(ddrss->vtt_supply, 3300000); in k3_ddrss_power_on()
331 dev_dbg(ddrss->dev, "VTT regulator enabled, volt = %d\n", in k3_ddrss_power_on()
332 regulator_get_value(ddrss->vtt_supply)); in k3_ddrss_power_on()
340 struct k3_ddrss_desc *ddrss = dev_get_priv(dev); in k3_ddrss_ofdata_to_priv() local
352 ddrss->ddrss_ctl_cfg = reg; in k3_ddrss_ofdata_to_priv()
359 ddrss->ddrss_ctrl_mmr = reg; in k3_ddrss_ofdata_to_priv()
364 ddrss->ddrss_ss_cfg = reg; in k3_ddrss_ofdata_to_priv()
366 ret = power_domain_get_by_index(dev, &ddrss->ddrcfg_pwrdmn, 0); in k3_ddrss_ofdata_to_priv()
372 ret = power_domain_get_by_index(dev, &ddrss->ddrdata_pwrdmn, 1); in k3_ddrss_ofdata_to_priv()
378 ret = clk_get_by_index(dev, 0, &ddrss->ddr_clk); in k3_ddrss_ofdata_to_priv()
382 ret = clk_get_by_index(dev, 1, &ddrss->osc_clk); in k3_ddrss_ofdata_to_priv()
388 ret = dev_read_u32(dev, "instance", &ddrss->instance); in k3_ddrss_ofdata_to_priv()
394 ddrss->instance = 0; in k3_ddrss_ofdata_to_priv()
397 ret = dev_read_u32(dev, "ti,ddr-freq0", &ddrss->ddr_freq0); in k3_ddrss_ofdata_to_priv()
399 ddrss->ddr_freq0 = clk_get_rate(&ddrss->osc_clk); in k3_ddrss_ofdata_to_priv()
404 ret = dev_read_u32(dev, "ti,ddr-freq1", &ddrss->ddr_freq1); in k3_ddrss_ofdata_to_priv()
408 ret = dev_read_u32(dev, "ti,ddr-freq2", &ddrss->ddr_freq2); in k3_ddrss_ofdata_to_priv()
412 ret = dev_read_u32(dev, "ti,ddr-fhs-cnt", &ddrss->ddr_fhs_cnt); in k3_ddrss_ofdata_to_priv()
419 void k3_lpddr4_probe(struct k3_ddrss_desc *ddrss) in k3_lpddr4_probe() argument
423 lpddr4_config *config = &ddrss->config; in k3_lpddr4_probe()
425 status = ddrss->driverdt->probe(config, &configsize); in k3_lpddr4_probe()
436 void k3_lpddr4_init(struct k3_ddrss_desc *ddrss) in k3_lpddr4_init() argument
439 lpddr4_config *config = &ddrss->config; in k3_lpddr4_init()
440 lpddr4_obj *driverdt = ddrss->driverdt; in k3_lpddr4_init()
441 lpddr4_privatedata *pd = &ddrss->pd; in k3_lpddr4_init()
448 config->ctlbase = (struct lpddr4_ctlregs_s *)ddrss->ddrss_ctl_cfg; in k3_lpddr4_init()
454 pd->ddr_instance = (void *)ddrss; in k3_lpddr4_init()
467 void populate_data_array_from_dt(struct k3_ddrss_desc *ddrss, in populate_data_array_from_dt() argument
472 ret = dev_read_u32_array(ddrss->dev, "ti,ctl-data", in populate_data_array_from_dt()
481 ret = dev_read_u32_array(ddrss->dev, "ti,pi-data", in populate_data_array_from_dt()
490 ret = dev_read_u32_array(ddrss->dev, "ti,phy-data", in populate_data_array_from_dt()
500 void k3_lpddr4_hardware_reg_init(struct k3_ddrss_desc *ddrss) in k3_lpddr4_hardware_reg_init() argument
504 lpddr4_obj *driverdt = ddrss->driverdt; in k3_lpddr4_hardware_reg_init()
505 lpddr4_privatedata *pd = &ddrss->pd; in k3_lpddr4_hardware_reg_init()
507 populate_data_array_from_dt(ddrss, &reginitdata); in k3_lpddr4_hardware_reg_init()
526 void k3_lpddr4_start(struct k3_ddrss_desc *ddrss) in k3_lpddr4_start() argument
531 lpddr4_obj *driverdt = ddrss->driverdt; in k3_lpddr4_start()
532 lpddr4_privatedata *pd = &ddrss->pd; in k3_lpddr4_start()
565 static void k3_lpddr4_bist_init_mem_region(struct k3_ddrss_desc *ddrss, in k3_lpddr4_bist_init_mem_region() argument
569 lpddr4_obj *driverdt = ddrss->driverdt; in k3_lpddr4_bist_init_mem_region()
570 lpddr4_privatedata *pd = &ddrss->pd; in k3_lpddr4_bist_init_mem_region()
652 static void k3_ddrss_lpddr4_preload_full_mem(struct k3_ddrss_desc *ddrss, in k3_ddrss_lpddr4_preload_full_mem() argument
673 k3_lpddr4_bist_init_mem_region(ddrss, 0, total_size, pattern); in k3_ddrss_lpddr4_preload_full_mem()
677 static void k3_ddrss_ddr_bank_base_size_calc(struct k3_ddrss_desc *ddrss) in k3_ddrss_ddr_bank_base_size_calc() argument
683 ddrss->ddr_bank_base[bank] = 0; in k3_ddrss_ddr_bank_base_size_calc()
684 ddrss->ddr_bank_size[bank] = 0; in k3_ddrss_ddr_bank_base_size_calc()
706 ddrss->ddr_bank_base[bank] = fdt_translate_address(fdt, node, ptr); in k3_ddrss_ddr_bank_base_size_calc()
708 ddrss->ddr_bank_base[bank] = fdtdec_get_number(ptr, na); in k3_ddrss_ddr_bank_base_size_calc()
710 ddrss->ddr_bank_size[bank] = fdtdec_get_number(&ptr[na], ns); in k3_ddrss_ddr_bank_base_size_calc()
717 ddrss->ddr_ram_size += ddrss->ddr_bank_size[bank]; in k3_ddrss_ddr_bank_base_size_calc()
720 static void k3_ddrss_ddr_reg_init(struct k3_ddrss_desc *ddrss) in k3_ddrss_ddr_reg_init() argument
724 sdram_idx = DDRSS_V2A_CTL_REG_SDRAM_IDX_CALC(ddrss->ddr_ram_size); in k3_ddrss_ddr_reg_init()
725 v2a_ctl_reg = readl(ddrss->ddrss_ss_cfg + DDRSS_V2A_CTL_REG); in k3_ddrss_ddr_reg_init()
732 writel(v2a_ctl_reg, ddrss->ddrss_ss_cfg + DDRSS_V2A_CTL_REG); in k3_ddrss_ddr_reg_init()
733 writel(DDRSS_ECC_CTRL_REG_DEFAULT, ddrss->ddrss_ss_cfg + DDRSS_ECC_CTRL_REG); in k3_ddrss_ddr_reg_init()
736 static void k3_ddrss_lpddr4_ecc_calc_reserved_mem(struct k3_ddrss_desc *ddrss) in k3_ddrss_lpddr4_ecc_calc_reserved_mem() argument
740 ddrss->ecc_reserved_space = ddrss->ddr_ram_size; in k3_ddrss_lpddr4_ecc_calc_reserved_mem()
741 do_div(ddrss->ecc_reserved_space, 9); in k3_ddrss_lpddr4_ecc_calc_reserved_mem()
744 ddrss->ecc_reserved_space = 1ull << (fls(ddrss->ecc_reserved_space)); in k3_ddrss_lpddr4_ecc_calc_reserved_mem()
747 static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss) in k3_ddrss_lpddr4_ecc_init() argument
749 u64 ecc_region_start = ddrss->ecc_regions[0].start; in k3_ddrss_lpddr4_ecc_init()
750 u64 ecc_range = ddrss->ecc_regions[0].range; in k3_ddrss_lpddr4_ecc_init()
751 u32 base = (u32)ddrss->ddrss_ss_cfg; in k3_ddrss_lpddr4_ecc_init()
755 k3_ddrss_set_ecc_range_r0(base, ecc_region_start - ddrss->ddr_bank_base[0], ecc_range); in k3_ddrss_lpddr4_ecc_init()
764 k3_ddrss_lpddr4_preload_full_mem(ddrss, ddrss->ddr_ram_size, 0); in k3_ddrss_lpddr4_ecc_init()
781 struct k3_ddrss_desc *ddrss = dev_get_priv(dev); in k3_ddrss_probe() local
789 ddrss->dev = dev; in k3_ddrss_probe()
790 ret = k3_ddrss_power_on(ddrss); in k3_ddrss_probe()
794 k3_ddrss_ddr_bank_base_size_calc(ddrss); in k3_ddrss_probe()
796 k3_ddrss_ddr_reg_init(ddrss); in k3_ddrss_probe()
798 ddrss->driverdt = lpddr4_getinstance(); in k3_ddrss_probe()
800 k3_lpddr4_probe(ddrss); in k3_ddrss_probe()
801 k3_lpddr4_init(ddrss); in k3_ddrss_probe()
802 k3_lpddr4_hardware_reg_init(ddrss); in k3_ddrss_probe()
804 ret = k3_ddrss_init_freq(ddrss); in k3_ddrss_probe()
808 k3_lpddr4_start(ddrss); in k3_ddrss_probe()
811 if (!ddrss->ddrss_ss_cfg) { in k3_ddrss_probe()
817 k3_ddrss_lpddr4_ecc_calc_reserved_mem(ddrss); in k3_ddrss_probe()
820 ddrss->ecc_regions[0].start = ddrss->ddr_bank_base[0]; in k3_ddrss_probe()
821 ddrss->ecc_regions[0].range = ddrss->ddr_ram_size - ddrss->ecc_reserved_space; in k3_ddrss_probe()
822 k3_ddrss_lpddr4_ecc_init(ddrss); in k3_ddrss_probe()
831 struct k3_ddrss_desc *ddrss = dev_get_priv(dev); in k3_ddrss_ddr_fdt_fixup() local
833 if (ddrss->ecc_reserved_space == 0) in k3_ddrss_ddr_fdt_fixup()
837 if (ddrss->ecc_reserved_space > ddrss->ddr_bank_size[bank]) { in k3_ddrss_ddr_fdt_fixup()
838 ddrss->ecc_reserved_space -= ddrss->ddr_bank_size[bank]; in k3_ddrss_ddr_fdt_fixup()
839 ddrss->ddr_bank_size[bank] = 0; in k3_ddrss_ddr_fdt_fixup()
841 ddrss->ddr_bank_size[bank] -= ddrss->ecc_reserved_space; in k3_ddrss_ddr_fdt_fixup()
846 return fdt_fixup_memory_banks(blob, ddrss->ddr_bank_base, in k3_ddrss_ddr_fdt_fixup()
847 ddrss->ddr_bank_size, CONFIG_NR_DRAM_BANKS); in k3_ddrss_ddr_fdt_fixup()