fixed_sdram.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * (C) Copyright 2007-2009 DENX Software Engineering
  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
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 of
  10. * the License, or (at your option) 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. */
  23. #include <common.h>
  24. #include <asm/io.h>
  25. #include <asm/mpc512x.h>
  26. /*
  27. * fixed sdram init:
  28. * The board doesn't use memory modules that have serial presence
  29. * detect or similar mechanism for discovery of the DRAM settings
  30. */
  31. long int fixed_sdram(void)
  32. {
  33. volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
  34. u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024;
  35. u32 msize_log2 = __ilog2(msize);
  36. u32 i;
  37. /* Initialize IO Control */
  38. out_be32(&im->io_ctrl.io_control_mem, IOCTRL_MUX_DDR);
  39. /* Initialize DDR Local Window */
  40. out_be32(&im->sysconf.ddrlaw.bar, CONFIG_SYS_DDR_BASE & 0xFFFFF000);
  41. out_be32(&im->sysconf.ddrlaw.ar, msize_log2 - 1);
  42. sync_law(&im->sysconf.ddrlaw.ar);
  43. /* Enable DDR */
  44. out_be32(&im->mddrc.ddr_sys_config, CONFIG_SYS_MDDRC_SYS_CFG_EN);
  45. /* Initialize DDR Priority Manager */
  46. out_be32(&im->mddrc.prioman_config1, CONFIG_SYS_MDDRCGRP_PM_CFG1);
  47. out_be32(&im->mddrc.prioman_config2, CONFIG_SYS_MDDRCGRP_PM_CFG2);
  48. out_be32(&im->mddrc.hiprio_config, CONFIG_SYS_MDDRCGRP_HIPRIO_CFG);
  49. out_be32(&im->mddrc.lut_table0_main_upper, CONFIG_SYS_MDDRCGRP_LUT0_MU);
  50. out_be32(&im->mddrc.lut_table0_main_lower, CONFIG_SYS_MDDRCGRP_LUT0_ML);
  51. out_be32(&im->mddrc.lut_table1_main_upper, CONFIG_SYS_MDDRCGRP_LUT1_MU);
  52. out_be32(&im->mddrc.lut_table1_main_lower, CONFIG_SYS_MDDRCGRP_LUT1_ML);
  53. out_be32(&im->mddrc.lut_table2_main_upper, CONFIG_SYS_MDDRCGRP_LUT2_MU);
  54. out_be32(&im->mddrc.lut_table2_main_lower, CONFIG_SYS_MDDRCGRP_LUT2_ML);
  55. out_be32(&im->mddrc.lut_table3_main_upper, CONFIG_SYS_MDDRCGRP_LUT3_MU);
  56. out_be32(&im->mddrc.lut_table3_main_lower, CONFIG_SYS_MDDRCGRP_LUT3_ML);
  57. out_be32(&im->mddrc.lut_table4_main_upper, CONFIG_SYS_MDDRCGRP_LUT4_MU);
  58. out_be32(&im->mddrc.lut_table4_main_lower, CONFIG_SYS_MDDRCGRP_LUT4_ML);
  59. out_be32(&im->mddrc.lut_table0_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT0_AU);
  60. out_be32(&im->mddrc.lut_table0_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT0_AL);
  61. out_be32(&im->mddrc.lut_table1_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT1_AU);
  62. out_be32(&im->mddrc.lut_table1_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT1_AL);
  63. out_be32(&im->mddrc.lut_table2_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT2_AU);
  64. out_be32(&im->mddrc.lut_table2_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT2_AL);
  65. out_be32(&im->mddrc.lut_table3_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT3_AU);
  66. out_be32(&im->mddrc.lut_table3_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT3_AL);
  67. out_be32(&im->mddrc.lut_table4_alternate_upper, CONFIG_SYS_MDDRCGRP_LUT4_AU);
  68. out_be32(&im->mddrc.lut_table4_alternate_lower, CONFIG_SYS_MDDRCGRP_LUT4_AL);
  69. /* Initialize MDDRC */
  70. out_be32(&im->mddrc.ddr_sys_config, CONFIG_SYS_MDDRC_SYS_CFG);
  71. out_be32(&im->mddrc.ddr_time_config0, CONFIG_SYS_MDDRC_TIME_CFG0);
  72. out_be32(&im->mddrc.ddr_time_config1, CONFIG_SYS_MDDRC_TIME_CFG1);
  73. out_be32(&im->mddrc.ddr_time_config2, CONFIG_SYS_MDDRC_TIME_CFG2);
  74. /* Initialize DDR */
  75. for (i = 0; i < 10; i++)
  76. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  77. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL);
  78. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  79. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH);
  80. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  81. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH);
  82. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  83. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP);
  84. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  85. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM2);
  86. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  87. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL);
  88. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM2);
  89. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM3);
  90. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EN_DLL);
  91. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP);
  92. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL);
  93. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH);
  94. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP);
  95. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_OCD_DEFAULT);
  96. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL);
  97. out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
  98. /* Start MDDRC */
  99. out_be32(&im->mddrc.ddr_time_config0, CONFIG_SYS_MDDRC_TIME_CFG0_RUN);
  100. out_be32(&im->mddrc.ddr_sys_config, CONFIG_SYS_MDDRC_SYS_CFG_RUN);
  101. return msize;
  102. }