In preparation to move handoff data from 'qts' files to devicetree, fetch SDRAM config in 'of_to_platdata' DM callback. That way, this callback can be changed to fetch the data from devicetree.
Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> --- Changes in v2: None drivers/ddr/altera/sdram_gen5.c | 45 +++++++++++++++++++++++++-------- drivers/ddr/altera/sequencer.c | 35 +++++++++++++++---------- drivers/ddr/altera/sequencer.h | 9 ++++++- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/drivers/ddr/altera/sdram_gen5.c b/drivers/ddr/altera/sdram_gen5.c index 8c8ea19eb9..91d9f6c0fc 100644 --- a/drivers/ddr/altera/sdram_gen5.c +++ b/drivers/ddr/altera/sdram_gen5.c @@ -25,6 +25,15 @@ struct altera_gen5_sdram_priv { struct altera_gen5_sdram_platdata { struct socfpga_sdr *sdr; + /* Handoff config follows */ + const struct socfpga_sdram_config *cfg; + const struct socfpga_sdram_rw_mgr_config *rwcfg; + const struct socfpga_sdram_io_config *iocfg; + const struct socfpga_sdram_misc_config *misccf; + const u32 *inst_rom_init; + unsigned int inst_rom_init_len; + const u32 *ac_rom_init; + unsigned int ac_rom_init_len; }; struct sdram_prot_rule { @@ -43,7 +52,9 @@ struct sdram_prot_rule { static struct socfpga_system_manager *sysmgr_regs = (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS; -static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl); +static unsigned long sdram_calculate_size( + struct socfpga_sdr_ctrl *sdr_ctrl, + const struct socfpga_sdram_config *cfg); /** * get_errata_rows() - Up the number of DRAM rows to cover entire address space @@ -446,10 +457,10 @@ static void sdr_load_regs(struct socfpga_sdr_ctrl *sdr_ctrl, * * Initialize the SDRAM MMR. */ -int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, - unsigned int sdr_phy_reg) +static int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, + unsigned int sdr_phy_reg, + const struct socfpga_sdram_config *cfg) { - const struct socfpga_sdram_config *cfg = socfpga_get_sdram_config(); const unsigned int rows = (cfg->dram_addrw & SDR_CTRLGRP_DRAMADDRW_ROWBITS_MASK) >> SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB; @@ -481,7 +492,7 @@ int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, 1 << SDR_CTRLGRP_STATICCFG_APPLYCFG_LSB); sdram_set_protection_config(sdr_ctrl, 0, - sdram_calculate_size(sdr_ctrl) - 1); + sdram_calculate_size(sdr_ctrl, cfg) - 1); sdram_dump_protection_config(sdr_ctrl); @@ -494,11 +505,12 @@ int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, * Calculate SDRAM device size based on SDRAM controller parameters. * Size is specified in bytes. */ -static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl) +static unsigned long sdram_calculate_size( + struct socfpga_sdr_ctrl *sdr_ctrl, + const struct socfpga_sdram_config *cfg) { unsigned long temp; unsigned long row, bank, col, cs, width; - const struct socfpga_sdram_config *cfg = socfpga_get_sdram_config(); const unsigned int csbits = ((cfg->dram_addrw & SDR_CTRLGRP_DRAMADDRW_CSBITS_MASK) >> SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB) + 1; @@ -565,6 +577,16 @@ static int altera_gen5_sdram_ofdata_to_platdata(struct udevice *dev) if (!plat->sdr) return -ENODEV; + /* Get handoff config */ + plat->cfg = socfpga_get_sdram_config(); + plat->rwcfg = socfpga_get_sdram_rwmgr_config(); + plat->iocfg = socfpga_get_sdram_io_config(); + plat->misccf = socfpga_get_sdram_misc_config(); + + socfpga_get_seq_inst_init(&plat->inst_rom_init, + &plat->inst_rom_init_len); + socfpga_get_seq_ac_init(&plat->ac_rom_init, &plat->ac_rom_init_len); + return 0; } @@ -584,19 +606,22 @@ static int altera_gen5_sdram_probe(struct udevice *dev) } reset_deassert_bulk(&resets); - if (sdram_mmr_init_full(sdr_ctrl, 0xffffffff) != 0) { + if (sdram_mmr_init_full(sdr_ctrl, 0xffffffff, plat->cfg) != 0) { puts("SDRAM init failed.\n"); goto failed; } debug("SDRAM: Calibrating PHY\n"); /* SDRAM calibration */ - if (sdram_calibration_full(plat->sdr) == 0) { + if (sdram_calibration_full(plat->sdr, plat->rwcfg, plat->iocfg, + plat->misccf, plat->inst_rom_init, + plat->inst_rom_init_len, plat->ac_rom_init, + plat->ac_rom_init_len) == 0) { puts("SDRAM calibration failed.\n"); goto failed; } - sdram_size = sdram_calculate_size(sdr_ctrl); + sdram_size = sdram_calculate_size(sdr_ctrl, plat->cfg); debug("SDRAM: %ld MiB\n", sdram_size >> 20); /* Sanity check ensure correct SDRAM size specified */ diff --git a/drivers/ddr/altera/sequencer.c b/drivers/ddr/altera/sequencer.c index 6c632227c2..1e03cf3cf6 100644 --- a/drivers/ddr/altera/sequencer.c +++ b/drivers/ddr/altera/sequencer.c @@ -3655,21 +3655,20 @@ static void debug_mem_calibrate(struct socfpga_sdrseq *seq, int pass) * * Initialize ROM data. */ -static void hc_initialize_rom_data(void) +static void hc_initialize_rom_data(const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len) { - unsigned int nelem = 0; - const u32 *rom_init; u32 i, addr; - socfpga_get_seq_inst_init(&rom_init, &nelem); addr = SDR_PHYGRP_RWMGRGRP_ADDRESS | RW_MGR_INST_ROM_WRITE_OFFSET; - for (i = 0; i < nelem; i++) - writel(rom_init[i], addr + (i << 2)); + for (i = 0; i < inst_rom_init_len; i++) + writel(inst_rom_init[i], addr + (i << 2)); - socfpga_get_seq_ac_init(&rom_init, &nelem); addr = SDR_PHYGRP_RWMGRGRP_ADDRESS | RW_MGR_AC_ROM_WRITE_OFFSET; - for (i = 0; i < nelem; i++) - writel(rom_init[i], addr + (i << 2)); + for (i = 0; i < ac_rom_init_len; i++) + writel(ac_rom_init[i], addr + (i << 2)); } /** @@ -3788,7 +3787,14 @@ static void initialize_tracking(struct socfpga_sdrseq *seq) &sdr_reg_file->trk_rfsh); } -int sdram_calibration_full(struct socfpga_sdr *sdr) +int sdram_calibration_full(struct socfpga_sdr *sdr, + const struct socfpga_sdram_rw_mgr_config *rwcfg, + const struct socfpga_sdram_io_config *iocfg, + const struct socfpga_sdram_misc_config *misccfg, + const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len) { u32 pass; struct socfpga_sdrseq seq; @@ -3802,9 +3808,9 @@ int sdram_calibration_full(struct socfpga_sdr *sdr) memset(&seq, 0, sizeof(seq)); - seq.rwcfg = socfpga_get_sdram_rwmgr_config(); - seq.iocfg = socfpga_get_sdram_io_config(); - seq.misccfg = socfpga_get_sdram_misc_config(); + seq.rwcfg = rwcfg; + seq.iocfg = iocfg; + seq.misccfg = misccfg; /* Set the calibration enabled by default */ seq.gbl.phy_debug_mode_flags |= PHY_DEBUG_ENABLE_CAL_RPT; @@ -3856,7 +3862,8 @@ int sdram_calibration_full(struct socfpga_sdr *sdr) debug_cond(DLEVEL >= 1, "dqs_in_reserve=%u dqs_out_reserve=%u\n", seq.iocfg->dqs_in_reserve, seq.iocfg->dqs_out_reserve); - hc_initialize_rom_data(); + hc_initialize_rom_data(inst_rom_init, inst_rom_init_len, + ac_rom_init, ac_rom_init_len); /* update info for sims */ reg_file_set_stage(CAL_STAGE_NIL); diff --git a/drivers/ddr/altera/sequencer.h b/drivers/ddr/altera/sequencer.h index 4a03c3fdf9..84057d4b4f 100644 --- a/drivers/ddr/altera/sequencer.h +++ b/drivers/ddr/altera/sequencer.h @@ -278,6 +278,13 @@ struct socfpga_sdrseq { struct param_type param; }; -int sdram_calibration_full(struct socfpga_sdr *sdr); +int sdram_calibration_full(struct socfpga_sdr *sdr, + const struct socfpga_sdram_rw_mgr_config *rwcfg, + const struct socfpga_sdram_io_config *iocfg, + const struct socfpga_sdram_misc_config *misccfg, + const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len); #endif /* _SEQUENCER_H_ */ -- 2.20.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot