ddr.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright 2011 Freescale Semiconductor, Inc.
  3. *
  4. * See file CREDITS for list of people who contributed to this
  5. * project.
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the Free
  9. * Software Foundation; either version 2 of the License, or (at your option)
  10. * any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20. * MA 02111-1307 USA
  21. */
  22. #include <common.h>
  23. #include <asm/fsl_ddr_sdram.h>
  24. #include <asm/fsl_ddr_dimm_params.h>
  25. struct board_specific_parameters {
  26. u32 datarate_mhz_low;
  27. u32 datarate_mhz_high;
  28. u32 n_ranks;
  29. u32 clk_adjust;
  30. u32 cpo;
  31. u32 write_data_delay;
  32. u32 force_2T;
  33. };
  34. const struct board_specific_parameters board_specific_parameters_udimm[][20] = {
  35. {
  36. /*
  37. * memory controller 0
  38. * lo| hi| num| clk| cpo|wrdata|2T
  39. * mhz| mhz|ranks|adjst| | delay|
  40. */
  41. { 0, 300, 2, 4, 4, 2, 0},
  42. {301, 365, 2, 4, 6, 2, 0},
  43. {366, 450, 2, 4, 7, 2, 0},
  44. {451, 850, 2, 4, 31, 2, 0},
  45. { 0, 300, 1, 4, 4, 2, 0},
  46. {301, 365, 1, 4, 6, 2, 0},
  47. {366, 450, 1, 4, 7, 2, 0},
  48. {451, 850, 1, 4, 31, 2, 0}
  49. }
  50. };
  51. void fsl_ddr_board_options(memctl_options_t *popts,
  52. dimm_params_t *pdimm,
  53. unsigned int ctrl_num)
  54. {
  55. const struct board_specific_parameters *pbsp;
  56. u32 num_params;
  57. u32 i, dimm_num;
  58. ulong ddr_freq;
  59. if (ctrl_num != 0) /* we have only one controller */
  60. return;
  61. for (i = 0; i < CONFIG_DIMM_SLOTS_PER_CTLR; i++) {
  62. if (pdimm[i].n_ranks)
  63. break;
  64. }
  65. if (i >= CONFIG_DIMM_SLOTS_PER_CTLR) /* no DIMM */
  66. return;
  67. dimm_num = i;
  68. pbsp = &(board_specific_parameters_udimm[ctrl_num][0]);
  69. num_params = sizeof(board_specific_parameters_udimm[ctrl_num]) /
  70. sizeof(board_specific_parameters_udimm[0][0]);
  71. /* Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
  72. * freqency and n_banks specified in board_specific_parameters table.
  73. */
  74. ddr_freq = get_ddr_freq(0) / 1000000;
  75. for (i = 0; i < num_params; i++) {
  76. if (ddr_freq >= pbsp->datarate_mhz_low &&
  77. ddr_freq <= pbsp->datarate_mhz_high &&
  78. pdimm[dimm_num].n_ranks == pbsp->n_ranks) {
  79. popts->clk_adjust = pbsp->clk_adjust;
  80. popts->cpo_override = pbsp->cpo;
  81. popts->write_data_delay = pbsp->write_data_delay;
  82. popts->twoT_en = pbsp->force_2T;
  83. break;
  84. }
  85. pbsp++;
  86. }
  87. if (i == num_params) {
  88. printf("Warning: board specific timing not found "
  89. "for data rate %lu MT/s!\n", ddr_freq);
  90. }
  91. /*
  92. * Factors to consider for half-strength driver enable:
  93. * - number of DIMMs installed
  94. */
  95. popts->half_strength_driver_enable = 0;
  96. popts->DQS_config = 0; /* only true DQS signal is used on board */
  97. }