/* * Copyright 2020 Scalys B.V. * opensource@scalys.com * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include #include #include DECLARE_GLOBAL_DATA_PTR; /* Values for QT1040 */ dimm_params_t ddr_raw_timing = { .n_ranks = 1, .rank_density = 1073741824u, .capacity = 1073741824u, .device_width = 16, .primary_sdram_width = 64, .ec_sdram_width = 8, .registered_dimm = 0, .mirrored_dimm = 0, .n_row_addr = 14, .n_col_addr = 10, .n_banks_per_sdram_device = 8, .edc_config = 2, .burst_lengths_bitmask = 0x0c, .tckmin_x_ps = 1250, .caslat_x = (0x7fe << 4), .taa_ps = 13750, .twr_ps = 15000, .trcd_ps = 13750, .trrd_ps = 7500, .trp_ps = 13750, .tras_ps = 37500, .trc_ps = 50600, .trfc_ps = 160000, .twtr_ps = 7500, .trtp_ps = 7500, .refresh_rate_ps = 3900000, .tfaw_ps = 50000, }; void fsl_ddr_board_options(memctl_options_t *popts, dimm_params_t *pdimm, unsigned int ctrl_num) { int i; if (ctrl_num != 0) { printf("Only 1 memory controller supported, but %i requested\n", ctrl_num); return; } if (pdimm == NULL ) { printf("Error, no valid dimm pararmeter supplied\n"); return; } if (!pdimm->n_ranks) { printf("No ranks in dimm parameters. Configuration error?\n"); return; } /* DDR speed is fixed in the RCW */ /* set odt_rd_cfg and odt_wr_cfg. */ for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { popts->cs_local_opts[i].odt_wr_cfg = 4; } popts->half_strength_driver_enable = 0; /* */ popts->wrlvl_en = 1; popts->wrlvl_override = 1; popts->wrlvl_sample = 0xf; popts->wrlvl_start = 5; popts->wrlvl_ctl_2 = 0x05050506; popts->wrlvl_ctl_3 = 0x06060605; /* 1333MT/s */ popts->ddr_cdr1 = 0x800c0000; popts->ddr_cdr2 = 0x00000001; /* * rtt and rtt_wr override */ popts->rtt_override = 0; /* */ /* Enable ZQ calibration */ popts->zq_en = 1; /* */ /* Clock is launched 1/2 applied cycle after address/command */ popts->clk_adjust = 4; /* Optimized cpo */ popts->cpo_sample = 0x33; } int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, unsigned int controller_number, unsigned int dimm_number) { const char dimm_model[] = "Soldered DDR3L"; if (((controller_number == 0) && (dimm_number == 0)) || ((controller_number == 1) && (dimm_number == 0))) { memcpy(pdimm, &ddr_raw_timing, sizeof(dimm_params_t)); memset(pdimm->mpart, 0, sizeof(pdimm->mpart)); memcpy(pdimm->mpart, dimm_model, sizeof(pdimm->mpart) - 1); } return 0; } int dram_init(void) { phys_size_t dram_size; #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_RAMBOOT_PBL) dram_size = fsl_ddr_sdram(); dram_size = setup_ddr_tlbs(dram_size / 0x100000); dram_size *= 0x100000; #else /* DDR has been initialised by SPL loader */ dram_size = fsl_ddr_sdram_size(); #endif gd->ram_size = dram_size; return 0; }