Blame view
board/Arcturus/ucp1020/ddr.c
4.33 KB
8b0044ff5 powerpc/mpc85xx: ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
/* * Copyright 2013-2015 Arcturus Networks, Inc. * http://www.arcturusnetworks.com/products/ucp1020/ * based on board/freescale/p1_p2_rdb_pc/spl.c * original copyright follows: * Copyright 2013 Freescale Semiconductor, Inc. * * SPDX-License-Identifier: GPL-2.0+ */ #include <common.h> #include <asm/mmu.h> #include <asm/immap_85xx.h> #include <asm/processor.h> #include <fsl_ddr_sdram.h> #include <fsl_ddr_dimm_params.h> #include <asm/io.h> #include <asm/fsl_law.h> #ifdef CONFIG_SYS_DDR_RAW_TIMING #if defined(CONFIG_UCP1020) || defined(CONFIG_UCP1020T1) /* * Micron MT41J128M16HA-15E * */ dimm_params_t ddr_raw_timing = { .n_ranks = 1, .rank_density = 536870912u, .capacity = 536870912u, .primary_sdram_width = 32, .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 = 1650, .caslat_x = 0x7e << 4, /* 5,6,7,8,9,10 */ .taa_ps = 14050, .twr_ps = 15000, .trcd_ps = 13500, .trrd_ps = 75000, .trp_ps = 13500, .tras_ps = 40000, .trc_ps = 49500, .trfc_ps = 160000, .twtr_ps = 75000, .trtp_ps = 75000, .refresh_rate_ps = 7800000, .tfaw_ps = 30000, }; #else #error Missing raw timing data for this board #endif int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, unsigned int controller_number, unsigned int dimm_number) { const char dimm_model[] = "Fixed DDR on board"; if ((controller_number == 0) && (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(dimm_model) - 1); } return 0; } #endif /* CONFIG_SYS_DDR_RAW_TIMING */ #ifdef CONFIG_SYS_DDR_CS0_BNDS /* Fixed sdram init -- doesn't use serial presence detect. */ phys_size_t fixed_sdram(void) { sys_info_t sysinfo; char buf[32]; size_t ddr_size; fsl_ddr_cfg_regs_t ddr_cfg_regs = { .cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS, .cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG, .cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2, #if CONFIG_CHIP_SELECTS_PER_CTRL > 1 .cs[1].bnds = CONFIG_SYS_DDR_CS1_BNDS, .cs[1].config = CONFIG_SYS_DDR_CS1_CONFIG, .cs[1].config_2 = CONFIG_SYS_DDR_CS1_CONFIG_2, #endif .timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3, .timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0, .timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1, .timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2, .ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL, .ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2, .ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1, .ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2, .ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL, .ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL, .ddr_data_init = CONFIG_SYS_DDR_DATA_INIT, .ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL, .ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR, .ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR, .timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4, .timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5, .ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL, .ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL, .ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR, .ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1, .ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2 }; get_sys_info(&sysinfo); printf("Configuring DDR for %s MT/s data rate ", strmhz(buf, sysinfo.freq_ddrbus)); ddr_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0, 0); if (set_ddr_laws(CONFIG_SYS_DDR_SDRAM_BASE, ddr_size, LAW_TRGT_IF_DDR_1) < 0) { printf("ERROR setting Local Access Windows for DDR "); return 0; }; return ddr_size; } #endif void fsl_ddr_board_options(memctl_options_t *popts, dimm_params_t *pdimm, unsigned int ctrl_num) { int i; popts->clk_adjust = 6; popts->cpo_override = 0x1f; popts->write_data_delay = 2; popts->half_strength_driver_enable = 1; /* Write leveling override */ popts->wrlvl_en = 1; popts->wrlvl_override = 1; popts->wrlvl_sample = 0xf; popts->wrlvl_start = 0x8; popts->trwt_override = 1; popts->trwt = 0; if (pdimm->primary_sdram_width == 64) popts->data_bus_width = 0; else if (pdimm->primary_sdram_width == 32) popts->data_bus_width = 1; else printf("Error in DDR bus width configuration! "); for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { popts->cs_local_opts[i].odt_rd_cfg = FSL_DDR_ODT_NEVER; popts->cs_local_opts[i].odt_wr_cfg = FSL_DDR_ODT_CS; } } |