jupiter.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /*
  2. * (C) Copyright 2007
  3. * Heiko Schocher, DENX Software Engineering, hs@denx.de.
  4. *
  5. * (C) Copyright 2004
  6. * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <mpc5xxx.h>
  12. #include <pci.h>
  13. #include <asm/processor.h>
  14. #include <libfdt.h>
  15. #define SDRAM_DDR 0
  16. #if 1
  17. /* Settings Icecube */
  18. #define SDRAM_MODE 0x00CD0000
  19. #define SDRAM_CONTROL 0x504F0000
  20. #define SDRAM_CONFIG1 0xD2322800
  21. #define SDRAM_CONFIG2 0x8AD70000
  22. #else
  23. /*Settings Jupiter UB 1.0.0 */
  24. #define SDRAM_MODE 0x008D0000
  25. #define SDRAM_CONTROL 0xD04F0000
  26. #define SDRAM_CONFIG1 0xf7277f00
  27. #define SDRAM_CONFIG2 0x88b70004
  28. #endif
  29. #ifndef CONFIG_SYS_RAMBOOT
  30. static void sdram_start (int hi_addr)
  31. {
  32. long hi_addr_bit = hi_addr ? 0x01000000 : 0;
  33. /* unlock mode register */
  34. *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000000 | hi_addr_bit;
  35. __asm__ volatile ("sync");
  36. /* precharge all banks */
  37. *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
  38. __asm__ volatile ("sync");
  39. #if SDRAM_DDR
  40. /* set mode register: extended mode */
  41. *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
  42. __asm__ volatile ("sync");
  43. /* set mode register: reset DLL */
  44. *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
  45. __asm__ volatile ("sync");
  46. #endif
  47. /* precharge all banks */
  48. *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
  49. __asm__ volatile ("sync");
  50. /* auto refresh */
  51. *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit;
  52. __asm__ volatile ("sync");
  53. /* set mode register */
  54. *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE;
  55. __asm__ volatile ("sync");
  56. /* normal operation */
  57. *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
  58. __asm__ volatile ("sync");
  59. }
  60. #endif
  61. /*
  62. * ATTENTION: Although partially referenced initdram does NOT make real use
  63. * use of CONFIG_SYS_SDRAM_BASE. The code does not work if CONFIG_SYS_SDRAM_BASE
  64. * is something else than 0x00000000.
  65. */
  66. phys_size_t initdram (int board_type)
  67. {
  68. ulong dramsize = 0;
  69. ulong dramsize2 = 0;
  70. uint svr, pvr;
  71. #ifndef CONFIG_SYS_RAMBOOT
  72. ulong test1, test2;
  73. /* setup SDRAM chip selects */
  74. *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001e;/* 2G at 0x0 */
  75. *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x80000000;/* disabled */
  76. __asm__ volatile ("sync");
  77. /* setup config registers */
  78. *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
  79. *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
  80. __asm__ volatile ("sync");
  81. #if SDRAM_DDR
  82. /* set tap delay */
  83. *(vu_long *)MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY;
  84. __asm__ volatile ("sync");
  85. #endif
  86. /* find RAM size using SDRAM CS0 only */
  87. sdram_start(0);
  88. test1 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
  89. sdram_start(1);
  90. test2 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
  91. if (test1 > test2) {
  92. sdram_start(0);
  93. dramsize = test1;
  94. } else {
  95. dramsize = test2;
  96. }
  97. /* memory smaller than 1MB is impossible */
  98. if (dramsize < (1 << 20)) {
  99. dramsize = 0;
  100. }
  101. /* set SDRAM CS0 size according to the amount of RAM found */
  102. if (dramsize > 0) {
  103. *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x13 + __builtin_ffs(dramsize >> 20) - 1;
  104. } else {
  105. *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
  106. }
  107. /* let SDRAM CS1 start right after CS0 */
  108. *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;/* 2G */
  109. /* find RAM size using SDRAM CS1 only */
  110. if (!dramsize)
  111. sdram_start(0);
  112. test2 = test1 = get_ram_size((long *)(CONFIG_SYS_SDRAM_BASE + dramsize), 0x80000000);
  113. if (!dramsize) {
  114. sdram_start(1);
  115. test2 = get_ram_size((long *)(CONFIG_SYS_SDRAM_BASE + dramsize), 0x80000000);
  116. }
  117. if (test1 > test2) {
  118. sdram_start(0);
  119. dramsize2 = test1;
  120. } else {
  121. dramsize2 = test2;
  122. }
  123. /* memory smaller than 1MB is impossible */
  124. if (dramsize2 < (1 << 20)) {
  125. dramsize2 = 0;
  126. }
  127. /* set SDRAM CS1 size according to the amount of RAM found */
  128. if (dramsize2 > 0) {
  129. *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize
  130. | (0x13 + __builtin_ffs(dramsize2 >> 20) - 1);
  131. } else {
  132. *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */
  133. }
  134. #else /* CONFIG_SYS_RAMBOOT */
  135. /* retrieve size of memory connected to SDRAM CS0 */
  136. dramsize = *(vu_long *)MPC5XXX_SDRAM_CS0CFG & 0xFF;
  137. if (dramsize >= 0x13) {
  138. dramsize = (1 << (dramsize - 0x13)) << 20;
  139. } else {
  140. dramsize = 0;
  141. }
  142. /* retrieve size of memory connected to SDRAM CS1 */
  143. dramsize2 = *(vu_long *)MPC5XXX_SDRAM_CS1CFG & 0xFF;
  144. if (dramsize2 >= 0x13) {
  145. dramsize2 = (1 << (dramsize2 - 0x13)) << 20;
  146. } else {
  147. dramsize2 = 0;
  148. }
  149. #endif /* CONFIG_SYS_RAMBOOT */
  150. /*
  151. * On MPC5200B we need to set the special configuration delay in the
  152. * DDR controller. Please refer to Freescale's AN3221 "MPC5200B SDRAM
  153. * Initialization and Configuration", 3.3.1 SDelay--MBAR + 0x0190:
  154. *
  155. * "The SDelay should be written to a value of 0x00000004. It is
  156. * required to account for changes caused by normal wafer processing
  157. * parameters."
  158. */
  159. svr = get_svr();
  160. pvr = get_pvr();
  161. if ((SVR_MJREV(svr) >= 2) &&
  162. (PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) {
  163. *(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04;
  164. __asm__ volatile ("sync");
  165. }
  166. return dramsize + dramsize2;
  167. }
  168. int checkboard (void)
  169. {
  170. puts ("Board: Sauter (Jupiter)\n");
  171. return 0;
  172. }
  173. void flash_preinit(void)
  174. {
  175. /*
  176. * Now, when we are in RAM, enable flash write
  177. * access for detection process.
  178. * Note that CS_BOOT cannot be cleared when
  179. * executing in flash.
  180. */
  181. *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
  182. }
  183. int board_early_init_r (void)
  184. {
  185. flash_preinit ();
  186. return 0;
  187. }
  188. void flash_afterinit(ulong size)
  189. {
  190. if (size == 0x1000000) { /* adjust mapping */
  191. *(vu_long *)MPC5XXX_BOOTCS_START = *(vu_long *)MPC5XXX_CS0_START =
  192. START_REG(CONFIG_SYS_BOOTCS_START | size);
  193. *(vu_long *)MPC5XXX_BOOTCS_STOP = *(vu_long *)MPC5XXX_CS0_STOP =
  194. STOP_REG(CONFIG_SYS_BOOTCS_START | size, size);
  195. }
  196. *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 25); /* disable CS_BOOT */
  197. *(vu_long *)MPC5XXX_ADDECR |= (1 << 16); /* enable CS0 */
  198. }
  199. int update_flash_size (int flash_size)
  200. {
  201. flash_afterinit (flash_size);
  202. return 0;
  203. }
  204. int board_early_init_f (void)
  205. {
  206. *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
  207. return 0;
  208. }
  209. #ifdef CONFIG_PCI
  210. static struct pci_controller hose;
  211. extern void pci_mpc5xxx_init(struct pci_controller *);
  212. void pci_init_board(void)
  213. {
  214. pci_mpc5xxx_init(&hose);
  215. }
  216. #endif
  217. #if defined(CONFIG_CMD_IDE) && defined(CONFIG_IDE_RESET)
  218. void init_ide_reset (void)
  219. {
  220. debug ("init_ide_reset\n");
  221. /* Configure PSC1_4 as GPIO output for ATA reset */
  222. *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4;
  223. *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4;
  224. /* Deassert reset */
  225. *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
  226. }
  227. void ide_set_reset (int idereset)
  228. {
  229. debug ("ide_reset(%d)\n", idereset);
  230. if (idereset) {
  231. *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
  232. /* Make a delay. MPC5200 spec says 25 usec min */
  233. udelay(500000);
  234. } else {
  235. *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
  236. }
  237. }
  238. #endif
  239. #ifdef CONFIG_OF_BOARD_SETUP
  240. int ft_board_setup(void *blob, bd_t *bd)
  241. {
  242. ft_cpu_setup(blob, bd);
  243. return 0;
  244. }
  245. #endif /* CONFIG_OF_BOARD_SETUP */