2 * Copyright 2011 Freescale Semiconductor, Inc.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * Version 2 as published by the Free Software Foundation.
13 #include <asm/fsl_ddr_sdram.h>
14 #include <asm/fsl_ddr_dimm_params.h>
15 #include <asm/fsl_law.h>
19 u32 datarate_mhz_high;
26 } board_specific_parameters_t;
29 * ranges for parameters:
34 const board_specific_parameters_t board_specific_parameters[] = {
37 * lo| hi| num| clk| wrlvl | cpo |wrdata|2T
38 * mhz| mhz|ranks|adjst| start | delay|
40 { 0, 750, 2, 3, 5, 0xff, 2, 0},
41 { 751, 1250, 2, 4, 6, 0xff, 2, 0},
42 { 1251, 1350, 2, 5, 7, 0xff, 2, 0},
43 { 1351, 1666, 2, 5, 8, 0xff, 2, 0},
46 void fsl_ddr_board_options(memctl_options_t *popts,
48 unsigned int ctrl_num)
50 const board_specific_parameters_t *pbsp =
51 &board_specific_parameters[0];
52 u32 num_params = ARRAY_SIZE(board_specific_parameters);
57 * Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
58 * freqency and n_banks specified in board_specific_parameters table.
60 ddr_freq = get_ddr_freq(0) / 1000000;
61 for (i = 0; i < num_params; i++) {
62 if (ddr_freq >= pbsp->datarate_mhz_low &&
63 ddr_freq <= pbsp->datarate_mhz_high &&
64 pdimm[0].n_ranks == pbsp->n_ranks) {
65 popts->cpo_override = pbsp->cpo;
66 popts->write_data_delay = pbsp->write_data_delay;
67 popts->clk_adjust = pbsp->clk_adjust;
68 popts->wrlvl_start = pbsp->wrlvl_start;
69 popts->twoT_en = pbsp->force_2T;
75 if (i == num_params) {
76 printf("Warning: board specific timing not found "
77 "for data rate %lu MT/s!\n", ddr_freq);
81 * Factors to consider for half-strength driver enable:
82 * - number of DIMMs installed
84 popts->half_strength_driver_enable = 0;
85 /* Write leveling override */
86 popts->wrlvl_override = 1;
87 popts->wrlvl_sample = 0xf;
89 /* Rtt and Rtt_WR override */
90 popts->rtt_override = 0;
92 /* Enable ZQ calibration */
95 /* DHC_EN =1, ODT = 60 Ohm */
96 popts->ddr_cdr1 = DDR_CDR1_DHC_EN;
99 phys_size_t initdram(int board_type)
101 phys_size_t dram_size = 0;
103 puts("Initializing....");
107 dram_size = fsl_ddr_sdram();
109 puts("no SPD and fixed parameters\n");
113 dram_size = setup_ddr_tlbs(dram_size / 0x100000);
114 dram_size *= 0x100000;