sdram.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Copyright (c) 2004 Picture Elements, Inc.
  3. * Stephen Williams (steve@icarus.com)
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/ppc4xx.h>
  9. #include <asm/processor.h>
  10. # define SDRAM_LEN 0x08000000
  11. /*
  12. * this is even after checkboard. It returns the size of the SDRAM
  13. * that we have installed. This function is called by board_init_f
  14. * in arch/powerpc/lib/board.c to initialize the memory and return what I
  15. * found.
  16. */
  17. phys_size_t initdram (int board_type)
  18. {
  19. /* Configure the SDRAMS */
  20. /* disable memory controller */
  21. mtdcr (SDRAM0_CFGADDR, SDRAM0_CFG);
  22. mtdcr (SDRAM0_CFGDATA, 0x00000000);
  23. udelay (500);
  24. /* Clear SDRAM0_BESR0 (Bus Error Syndrome Register) */
  25. mtdcr (SDRAM0_CFGADDR, SDRAM0_BESR0);
  26. mtdcr (SDRAM0_CFGDATA, 0xffffffff);
  27. /* Clear SDRAM0_BESR1 (Bus Error Syndrome Register) */
  28. mtdcr (SDRAM0_CFGADDR, SDRAM0_BESR1);
  29. mtdcr (SDRAM0_CFGDATA, 0xffffffff);
  30. /* Clear SDRAM0_ECCCFG (disable ECC) */
  31. mtdcr (SDRAM0_CFGADDR, SDRAM0_ECCCFG);
  32. mtdcr (SDRAM0_CFGDATA, 0x00000000);
  33. /* Clear SDRAM0_ECCESR (ECC Error Syndrome Register) */
  34. mtdcr (SDRAM0_CFGADDR, SDRAM0_ECCESR);
  35. mtdcr (SDRAM0_CFGDATA, 0xffffffff);
  36. /* Timing register: CASL=2, PTA=2, CTP=2, LDF=1, RFTA=5, RCD=2 */
  37. mtdcr (SDRAM0_CFGADDR, SDRAM0_TR);
  38. mtdcr (SDRAM0_CFGDATA, 0x010a4016);
  39. /* Memory Bank 0 Config == BA=0x00000000, SZ=64M, AM=3, BE=1 */
  40. mtdcr (SDRAM0_CFGADDR, SDRAM0_B0CR);
  41. mtdcr (SDRAM0_CFGDATA, 0x00084001);
  42. /* Memory Bank 1 Config == BA=0x04000000, SZ=64M, AM=3, BE=1 */
  43. mtdcr (SDRAM0_CFGADDR, SDRAM0_B1CR);
  44. mtdcr (SDRAM0_CFGDATA, 0x04084001);
  45. /* Memory Bank 2 Config == BE=0 */
  46. mtdcr (SDRAM0_CFGADDR, SDRAM0_B2CR);
  47. mtdcr (SDRAM0_CFGDATA, 0x00000000);
  48. /* Memory Bank 3 Config == BE=0 */
  49. mtdcr (SDRAM0_CFGADDR, SDRAM0_B3CR);
  50. mtdcr (SDRAM0_CFGDATA, 0x00000000);
  51. /* refresh timer = 0x400 */
  52. mtdcr (SDRAM0_CFGADDR, SDRAM0_RTR);
  53. mtdcr (SDRAM0_CFGDATA, 0x04000000);
  54. /* Power management idle timer set to the default. */
  55. mtdcr (SDRAM0_CFGADDR, SDRAM0_PMIT);
  56. mtdcr (SDRAM0_CFGDATA, 0x07c00000);
  57. udelay (500);
  58. /* Enable banks (DCE=1, BPRF=1, ECCDD=1, EMDUL=1) */
  59. mtdcr (SDRAM0_CFGADDR, SDRAM0_CFG);
  60. mtdcr (SDRAM0_CFGDATA, 0x80e00000);
  61. return SDRAM_LEN;
  62. }
  63. /*
  64. * The U-Boot core, as part of the initialization to prepare for
  65. * loading the monitor into SDRAM, requests of this function that the
  66. * memory be tested. Return 0 if the memory tests OK.
  67. */
  68. int testdram (void)
  69. {
  70. unsigned long idx;
  71. unsigned val;
  72. unsigned errors;
  73. volatile unsigned long *sdram;
  74. #ifdef DEBUG
  75. printf ("SDRAM Controller Registers --\n");
  76. mtdcr (SDRAM0_CFGADDR, SDRAM0_CFG);
  77. val = mfdcr (SDRAM0_CFGDATA);
  78. printf (" SDRAM0_CFG : 0x%08x\n", val);
  79. mtdcr (SDRAM0_CFGADDR, 0x24);
  80. val = mfdcr (SDRAM0_CFGDATA);
  81. printf (" SDRAM0_STATUS: 0x%08x\n", val);
  82. mtdcr (SDRAM0_CFGADDR, SDRAM0_B0CR);
  83. val = mfdcr (SDRAM0_CFGDATA);
  84. printf (" SDRAM0_B0CR : 0x%08x\n", val);
  85. mtdcr (SDRAM0_CFGADDR, SDRAM0_B1CR);
  86. val = mfdcr (SDRAM0_CFGDATA);
  87. printf (" SDRAM0_B1CR : 0x%08x\n", val);
  88. mtdcr (SDRAM0_CFGADDR, SDRAM0_TR);
  89. val = mfdcr (SDRAM0_CFGDATA);
  90. printf (" SDRAM0_TR : 0x%08x\n", val);
  91. mtdcr (SDRAM0_CFGADDR, SDRAM0_RTR);
  92. val = mfdcr (SDRAM0_CFGDATA);
  93. printf (" SDRAM0_RTR : 0x%08x\n", val);
  94. #endif
  95. /* Wait for memory to be ready by testing MRSCMPbit
  96. bit. Really, there should already have been plenty of time,
  97. given it was started long ago. But, best to check. */
  98. for (idx = 0; idx < 1000000; idx += 1) {
  99. mtdcr (SDRAM0_CFGADDR, 0x24);
  100. val = mfdcr (SDRAM0_CFGDATA);
  101. if (val & 0x80000000)
  102. break;
  103. }
  104. if (!(val & 0x80000000)) {
  105. printf ("SDRAM ERROR: SDRAM0_STATUS never set!\n");
  106. return 1;
  107. }
  108. /* Start memory test. */
  109. printf ("test: %u MB - ", SDRAM_LEN / 1048576);
  110. sdram = (unsigned long *) CONFIG_SYS_SDRAM_BASE;
  111. printf ("write - ");
  112. for (idx = 2; idx < SDRAM_LEN / 4; idx += 2) {
  113. sdram[idx + 0] = idx;
  114. sdram[idx + 1] = ~idx;
  115. }
  116. printf ("read - ");
  117. errors = 0;
  118. for (idx = 2; idx < SDRAM_LEN / 4; idx += 2) {
  119. if (sdram[idx + 0] != idx)
  120. errors += 1;
  121. if (sdram[idx + 1] != ~idx)
  122. errors += 1;
  123. if (errors > 0)
  124. break;
  125. }
  126. if (errors > 0) {
  127. printf ("NOT OK\n");
  128. printf ("FIRST ERROR at %p: 0x%08lx:0x%08lx != 0x%08lx:0x%08lx\n",
  129. sdram + idx, sdram[idx + 0], sdram[idx + 1], idx, ~idx);
  130. return 1;
  131. }
  132. printf ("ok\n");
  133. return 0;
  134. }