fixed_sdram.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * (C) Copyright 2007-2009 DENX Software Engineering
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <asm/mpc512x.h>
  9. /*
  10. * MDDRC Config Runtime Settings
  11. */
  12. ddr512x_config_t default_mddrc_config = {
  13. .ddr_sys_config = CONFIG_SYS_MDDRC_SYS_CFG,
  14. .ddr_time_config0 = CONFIG_SYS_MDDRC_TIME_CFG0,
  15. .ddr_time_config1 = CONFIG_SYS_MDDRC_TIME_CFG1,
  16. .ddr_time_config2 = CONFIG_SYS_MDDRC_TIME_CFG2,
  17. };
  18. u32 default_init_seq[] = {
  19. CONFIG_SYS_DDRCMD_NOP,
  20. CONFIG_SYS_DDRCMD_NOP,
  21. CONFIG_SYS_DDRCMD_NOP,
  22. CONFIG_SYS_DDRCMD_NOP,
  23. CONFIG_SYS_DDRCMD_NOP,
  24. CONFIG_SYS_DDRCMD_NOP,
  25. CONFIG_SYS_DDRCMD_NOP,
  26. CONFIG_SYS_DDRCMD_NOP,
  27. CONFIG_SYS_DDRCMD_NOP,
  28. CONFIG_SYS_DDRCMD_NOP,
  29. CONFIG_SYS_DDRCMD_PCHG_ALL,
  30. CONFIG_SYS_DDRCMD_NOP,
  31. CONFIG_SYS_DDRCMD_RFSH,
  32. CONFIG_SYS_DDRCMD_NOP,
  33. CONFIG_SYS_DDRCMD_RFSH,
  34. CONFIG_SYS_DDRCMD_NOP,
  35. CONFIG_SYS_MICRON_INIT_DEV_OP,
  36. CONFIG_SYS_DDRCMD_NOP,
  37. CONFIG_SYS_DDRCMD_EM2,
  38. CONFIG_SYS_DDRCMD_NOP,
  39. CONFIG_SYS_DDRCMD_PCHG_ALL,
  40. CONFIG_SYS_DDRCMD_EM2,
  41. CONFIG_SYS_DDRCMD_EM3,
  42. CONFIG_SYS_DDRCMD_EN_DLL,
  43. CONFIG_SYS_MICRON_INIT_DEV_OP,
  44. CONFIG_SYS_DDRCMD_PCHG_ALL,
  45. CONFIG_SYS_DDRCMD_RFSH,
  46. CONFIG_SYS_MICRON_INIT_DEV_OP,
  47. CONFIG_SYS_DDRCMD_OCD_DEFAULT,
  48. CONFIG_SYS_DDRCMD_PCHG_ALL,
  49. CONFIG_SYS_DDRCMD_NOP
  50. };
  51. /*
  52. * fixed sdram init:
  53. * The board doesn't use memory modules that have serial presence
  54. * detect or similar mechanism for discovery of the DRAM settings
  55. */
  56. long int fixed_sdram(ddr512x_config_t *mddrc_config,
  57. u32 *dram_init_seq, int seq_sz)
  58. {
  59. volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  60. u32 msize = CONFIG_SYS_MAX_RAM_SIZE;
  61. u32 msize_log2 = __ilog2(msize);
  62. u32 i;
  63. /* take default settings and init sequence if necessary */
  64. if (mddrc_config == NULL)
  65. mddrc_config = &default_mddrc_config;
  66. if (dram_init_seq == NULL) {
  67. dram_init_seq = default_init_seq;
  68. seq_sz = ARRAY_SIZE(default_init_seq);
  69. }
  70. /* Initialize IO Control */
  71. out_be32(&im->io_ctrl.io_control_mem, CONFIG_SYS_IOCTRL_MUX_DDR);
  72. /* Initialize DDR Local Window */
  73. out_be32(&im->sysconf.ddrlaw.bar, CONFIG_SYS_DDR_BASE & 0xFFFFF000);
  74. out_be32(&im->sysconf.ddrlaw.ar, msize_log2 - 1);
  75. sync_law(&im->sysconf.ddrlaw.ar);
  76. /* DDR Enable */
  77. /*
  78. * the "enable" combination: DRAM controller out of reset,
  79. * clock enabled, command mode -- BUT leave CKE low for now
  80. */
  81. i = MDDRC_SYS_CFG_EN & ~MDDRC_SYS_CFG_CKE_MASK;
  82. out_be32(&im->mddrc.ddr_sys_config, i);
  83. /* maintain 200 microseconds of stable power and clock */
  84. udelay(200);
  85. /* apply a NOP, it shouldn't harm */
  86. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_DDRCMD_NOP);
  87. /* now assert CKE (high) */
  88. i |= MDDRC_SYS_CFG_CKE_MASK;
  89. out_be32(&im->mddrc.ddr_sys_config, i);
  90. /* Initialize DDR Priority Manager */
  91. out_be32(&im->mddrc.prioman_config1, CONFIG_SYS_MDDRCGRP_PM_CFG1);
  92. out_be32(&im->mddrc.prioman_config2, CONFIG_SYS_MDDRCGRP_PM_CFG2);
  93. out_be32(&im->mddrc.hiprio_config, CONFIG_SYS_MDDRCGRP_HIPRIO_CFG);
  94. out_be32(&im->mddrc.lut_table0_main_upper, CONFIG_SYS_MDDRCGRP_LUT0_MU);
  95. out_be32(&im->mddrc.lut_table0_main_lower, CONFIG_SYS_MDDRCGRP_LUT0_ML);
  96. out_be32(&im->mddrc.lut_table1_main_upper, CONFIG_SYS_MDDRCGRP_LUT1_MU);
  97. out_be32(&im->mddrc.lut_table1_main_lower, CONFIG_SYS_MDDRCGRP_LUT1_ML);
  98. out_be32(&im->mddrc.lut_table2_main_upper, CONFIG_SYS_MDDRCGRP_LUT2_MU);
  99. out_be32(&im->mddrc.lut_table2_main_lower, CONFIG_SYS_MDDRCGRP_LUT2_ML);
  100. out_be32(&im->mddrc.lut_table3_main_upper, CONFIG_SYS_MDDRCGRP_LUT3_MU);
  101. out_be32(&im->mddrc.lut_table3_main_lower, CONFIG_SYS_MDDRCGRP_LUT3_ML);
  102. out_be32(&im->mddrc.lut_table4_main_upper, CONFIG_SYS_MDDRCGRP_LUT4_MU);
  103. out_be32(&im->mddrc.lut_table4_main_lower, CONFIG_SYS_MDDRCGRP_LUT4_ML);
  104. out_be32(&im->mddrc.lut_table0_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT0_AU);
  105. out_be32(&im->mddrc.lut_table0_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT0_AL);
  106. out_be32(&im->mddrc.lut_table1_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT1_AU);
  107. out_be32(&im->mddrc.lut_table1_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT1_AL);
  108. out_be32(&im->mddrc.lut_table2_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT2_AU);
  109. out_be32(&im->mddrc.lut_table2_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT2_AL);
  110. out_be32(&im->mddrc.lut_table3_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT3_AU);
  111. out_be32(&im->mddrc.lut_table3_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT3_AL);
  112. out_be32(&im->mddrc.lut_table4_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT4_AU);
  113. out_be32(&im->mddrc.lut_table4_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT4_AL);
  114. /*
  115. * Initialize MDDRC
  116. * put MDDRC in CMD mode and
  117. * set the max time between refreshes to 0 during init process
  118. */
  119. out_be32(&im->mddrc.ddr_sys_config,
  120. mddrc_config->ddr_sys_config | MDDRC_SYS_CFG_CMD_MASK);
  121. out_be32(&im->mddrc.ddr_time_config0,
  122. mddrc_config->ddr_time_config0 & MDDRC_REFRESH_ZERO_MASK);
  123. out_be32(&im->mddrc.ddr_time_config1,
  124. mddrc_config->ddr_time_config1);
  125. out_be32(&im->mddrc.ddr_time_config2,
  126. mddrc_config->ddr_time_config2);
  127. /* Initialize DDR with either default or supplied init sequence */
  128. for (i = 0; i < seq_sz; i++)
  129. out_be32(&im->mddrc.ddr_command, dram_init_seq[i]);
  130. /* Start MDDRC */
  131. out_be32(&im->mddrc.ddr_time_config0, mddrc_config->ddr_time_config0);
  132. out_be32(&im->mddrc.ddr_sys_config, mddrc_config->ddr_sys_config);
  133. /* Allow for the DLL to startup before accessing data */
  134. udelay(10);
  135. msize = get_ram_size(CONFIG_SYS_DDR_BASE, CONFIG_SYS_MAX_RAM_SIZE);
  136. /* Fix DDR Local Window for new size */
  137. out_be32(&im->sysconf.ddrlaw.ar, __ilog2(msize) - 1);
  138. sync_law(&im->sysconf.ddrlaw.ar);
  139. return msize;
  140. }