quantum.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. * (C) Copyright 2000
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <mpc8xx.h>
  9. #include "fpga.h"
  10. /* ------------------------------------------------------------------------- */
  11. static long int dram_size (long int, long int *, long int);
  12. unsigned long flash_init (void);
  13. /* ------------------------------------------------------------------------- */
  14. #define _NOT_USED_ 0xFFFFCC25
  15. const uint sdram_table[] = {
  16. /*
  17. * Single Read. (Offset 00h in UPMA RAM)
  18. */
  19. 0x0F03CC04, 0x00ACCC24, 0x1FF74C20, _NOT_USED_,
  20. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  21. /*
  22. * Burst Read. (Offset 08h in UPMA RAM)
  23. */
  24. 0x0F03CC04, 0x00ACCC24, 0x00FFCC20, 0x00FFCC20,
  25. 0x01FFCC20, 0x1FF74C20, _NOT_USED_, _NOT_USED_,
  26. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  27. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  28. /*
  29. * Single Write. (Offset 18h in UPMA RAM)
  30. */
  31. 0x0F03CC02, 0x00AC0C24, 0x1FF74C25, _NOT_USED_,
  32. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  33. /*
  34. * Burst Write. (Offset 20h in UPMA RAM)
  35. */
  36. 0x0F03CC00, 0x00AC0C20, 0x00FFFC20, 0x00FFFC22,
  37. 0x01FFFC24, 0x1FF74C25, _NOT_USED_, _NOT_USED_,
  38. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  39. _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  40. /*
  41. * Refresh. (Offset 30h in UPMA RAM)
  42. * (Initialization code at 0x36)
  43. */
  44. 0x0FF0CC24, 0xFFFFCC24, _NOT_USED_, _NOT_USED_,
  45. _NOT_USED_, _NOT_USED_, 0xEFFB8C34, 0x0FF74C34,
  46. 0x0FFACCB4, 0x0FF5CC34, 0x0FFCC34, 0x0FFFCCB4,
  47. /*
  48. * Exception. (Offset 3Ch in UPMA RAM)
  49. */
  50. 0x0FEA8C34, 0x1FB54C34, 0xFFFFCC34, _NOT_USED_
  51. };
  52. /* ------------------------------------------------------------------------- */
  53. /*
  54. * Check Board Identity:
  55. */
  56. int checkboard (void)
  57. {
  58. char buf[64];
  59. int i;
  60. int l = getenv_f("serial#", buf, sizeof(buf));
  61. puts ("Board QUANTUM, Serial No: ");
  62. for (i = 0; i < l; ++i) {
  63. if (buf[i] == ' ')
  64. break;
  65. putc (buf[i]);
  66. }
  67. putc ('\n');
  68. return (0); /* success */
  69. }
  70. /* ------------------------------------------------------------------------- */
  71. phys_size_t initdram (int board_type)
  72. {
  73. volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
  74. volatile memctl8xx_t *memctl = &immap->im_memctl;
  75. long int size9;
  76. upmconfig (UPMA, (uint *) sdram_table,
  77. sizeof (sdram_table) / sizeof (uint));
  78. /* Refresh clock prescalar */
  79. memctl->memc_mptpr = CONFIG_SYS_MPTPR;
  80. memctl->memc_mar = 0x00000088;
  81. /* Map controller banks 1 to the SDRAM bank */
  82. memctl->memc_or1 = CONFIG_SYS_OR1_PRELIM;
  83. memctl->memc_br1 = CONFIG_SYS_BR1_PRELIM;
  84. memctl->memc_mamr = CONFIG_SYS_MAMR_9COL & (~(MAMR_PTAE)); /* no refresh yet */
  85. udelay (200);
  86. /* perform SDRAM initializsation sequence */
  87. memctl->memc_mcr = 0x80002136; /* SDRAM bank 0 */
  88. udelay (1);
  89. memctl->memc_mamr |= MAMR_PTAE; /* enable refresh */
  90. udelay (1000);
  91. /* Check Bank 0 Memory Size,
  92. * 9 column mode
  93. */
  94. size9 = dram_size (CONFIG_SYS_MAMR_9COL, (long *) SDRAM_BASE_PRELIM,
  95. SDRAM_MAX_SIZE);
  96. /*
  97. * Final mapping:
  98. */
  99. memctl->memc_or1 = ((-size9) & 0xFFFF0000) | CONFIG_SYS_OR_TIMING_SDRAM;
  100. udelay (1000);
  101. return (size9);
  102. }
  103. /* ------------------------------------------------------------------------- */
  104. /*
  105. * Check memory range for valid RAM. A simple memory test determines
  106. * the actually available RAM size between addresses `base' and
  107. * `base + maxsize'. Some (not all) hardware errors are detected:
  108. * - short between address lines
  109. * - short between data lines
  110. */
  111. static long int dram_size (long int mamr_value, long int *base,
  112. long int maxsize)
  113. {
  114. volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
  115. volatile memctl8xx_t *memctl = &immap->im_memctl;
  116. volatile ulong *addr;
  117. ulong cnt, val, size;
  118. ulong save[32]; /* to make test non-destructive */
  119. unsigned char i = 0;
  120. memctl->memc_mamr = mamr_value;
  121. for (cnt = maxsize / sizeof (long); cnt > 0; cnt >>= 1) {
  122. addr = (volatile ulong *)(base + cnt); /* pointer arith! */
  123. save[i++] = *addr;
  124. *addr = ~cnt;
  125. }
  126. /* write 0 to base address */
  127. addr = (volatile ulong *)base;
  128. save[i] = *addr;
  129. *addr = 0;
  130. /* check at base address */
  131. if ((val = *addr) != 0) {
  132. /* Restore the original data before leaving the function.
  133. */
  134. *addr = save[i];
  135. for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) {
  136. addr = (volatile ulong *) base + cnt;
  137. *addr = save[--i];
  138. }
  139. return (0);
  140. }
  141. for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) {
  142. addr = (volatile ulong *)(base + cnt); /* pointer arith! */
  143. val = *addr;
  144. *addr = save[--i];
  145. if (val != (~cnt)) {
  146. size = cnt * sizeof (long);
  147. /* Restore the original data before returning
  148. */
  149. for (cnt <<= 1; cnt <= maxsize / sizeof (long);
  150. cnt <<= 1) {
  151. addr = (volatile ulong *) base + cnt;
  152. *addr = save[--i];
  153. }
  154. return (size);
  155. }
  156. }
  157. return (maxsize);
  158. }
  159. /*
  160. * Miscellaneous intialization
  161. */
  162. int misc_init_r (void)
  163. {
  164. char *fpga_data_str = getenv ("fpgadata");
  165. char *fpga_size_str = getenv ("fpgasize");
  166. void *fpga_data;
  167. int fpga_size;
  168. int status;
  169. volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
  170. volatile memctl8xx_t *memctl = &immap->im_memctl;
  171. int flash_size;
  172. /* Remap FLASH according to real size */
  173. flash_size = flash_init ();
  174. memctl->memc_or0 = CONFIG_SYS_OR_TIMING_FLASH | (-flash_size & 0xFFFF8000);
  175. memctl->memc_br0 = (CONFIG_SYS_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_V;
  176. if (fpga_data_str && fpga_size_str) {
  177. fpga_data = (void *) simple_strtoul (fpga_data_str, NULL, 16);
  178. fpga_size = simple_strtoul (fpga_size_str, NULL, 10);
  179. status = fpga_boot (fpga_data, fpga_size);
  180. if (status != 0) {
  181. printf ("\nFPGA: Booting failed ");
  182. switch (status) {
  183. case ERROR_FPGA_PRG_INIT_LOW:
  184. printf ("(Timeout: INIT not low after asserting PROGRAM*)\n ");
  185. break;
  186. case ERROR_FPGA_PRG_INIT_HIGH:
  187. printf ("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
  188. break;
  189. case ERROR_FPGA_PRG_DONE:
  190. printf ("(Timeout: DONE not high after programming FPGA)\n ");
  191. break;
  192. }
  193. }
  194. }
  195. return 0;
  196. }