cpu_init.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. * (C) Copyright 2000-2003
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. * MA 02111-1307 USA
  22. */
  23. #include <common.h>
  24. #include <mpc5xxx.h>
  25. DECLARE_GLOBAL_DATA_PTR;
  26. /*
  27. * Breath some life into the CPU...
  28. *
  29. * Set up the memory map,
  30. * initialize a bunch of registers.
  31. */
  32. void cpu_init_f (void)
  33. {
  34. unsigned long addecr = (1 << 25); /* Boot_CS */
  35. #if defined(CFG_RAMBOOT) && defined(CONFIG_MGT5100)
  36. addecr |= (1 << 22); /* SDRAM enable */
  37. #endif
  38. /* Pointer is writable since we allocated a register for it */
  39. gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET);
  40. /* Clear initial global data */
  41. memset ((void *) gd, 0, sizeof (gd_t));
  42. /*
  43. * Memory Controller: configure chip selects and enable them
  44. */
  45. #if defined(CFG_BOOTCS_START) && defined(CFG_BOOTCS_SIZE)
  46. *(vu_long *)MPC5XXX_BOOTCS_START = START_REG(CFG_BOOTCS_START);
  47. *(vu_long *)MPC5XXX_BOOTCS_STOP = STOP_REG(CFG_BOOTCS_START,
  48. CFG_BOOTCS_SIZE);
  49. #endif
  50. #if defined(CFG_BOOTCS_CFG)
  51. *(vu_long *)MPC5XXX_BOOTCS_CFG = CFG_BOOTCS_CFG;
  52. #endif
  53. #if defined(CFG_CS0_START) && defined(CFG_CS0_SIZE)
  54. *(vu_long *)MPC5XXX_CS0_START = START_REG(CFG_CS0_START);
  55. *(vu_long *)MPC5XXX_CS0_STOP = STOP_REG(CFG_CS0_START, CFG_CS0_SIZE);
  56. /* CS0 and BOOT_CS cannot be enabled at once. */
  57. /* addecr |= (1 << 16); */
  58. #endif
  59. #if defined(CFG_CS0_CFG)
  60. *(vu_long *)MPC5XXX_CS0_CFG = CFG_CS0_CFG;
  61. #endif
  62. #if defined(CFG_CS1_START) && defined(CFG_CS1_SIZE)
  63. *(vu_long *)MPC5XXX_CS1_START = START_REG(CFG_CS1_START);
  64. *(vu_long *)MPC5XXX_CS1_STOP = STOP_REG(CFG_CS1_START, CFG_CS1_SIZE);
  65. addecr |= (1 << 17);
  66. #endif
  67. #if defined(CFG_CS1_CFG)
  68. *(vu_long *)MPC5XXX_CS1_CFG = CFG_CS1_CFG;
  69. #endif
  70. #if defined(CFG_CS2_START) && defined(CFG_CS2_SIZE)
  71. *(vu_long *)MPC5XXX_CS2_START = START_REG(CFG_CS2_START);
  72. *(vu_long *)MPC5XXX_CS2_STOP = STOP_REG(CFG_CS2_START, CFG_CS2_SIZE);
  73. addecr |= (1 << 18);
  74. #endif
  75. #if defined(CFG_CS2_CFG)
  76. *(vu_long *)MPC5XXX_CS2_CFG = CFG_CS2_CFG;
  77. #endif
  78. #if defined(CFG_CS3_START) && defined(CFG_CS3_SIZE)
  79. *(vu_long *)MPC5XXX_CS3_START = START_REG(CFG_CS3_START);
  80. *(vu_long *)MPC5XXX_CS3_STOP = STOP_REG(CFG_CS3_START, CFG_CS3_SIZE);
  81. addecr |= (1 << 19);
  82. #endif
  83. #if defined(CFG_CS3_CFG)
  84. *(vu_long *)MPC5XXX_CS3_CFG = CFG_CS3_CFG;
  85. #endif
  86. #if defined(CFG_CS4_START) && defined(CFG_CS4_SIZE)
  87. *(vu_long *)MPC5XXX_CS4_START = START_REG(CFG_CS4_START);
  88. *(vu_long *)MPC5XXX_CS4_STOP = STOP_REG(CFG_CS4_START, CFG_CS4_SIZE);
  89. addecr |= (1 << 20);
  90. #endif
  91. #if defined(CFG_CS4_CFG)
  92. *(vu_long *)MPC5XXX_CS4_CFG = CFG_CS4_CFG;
  93. #endif
  94. #if defined(CFG_CS5_START) && defined(CFG_CS5_SIZE)
  95. *(vu_long *)MPC5XXX_CS5_START = START_REG(CFG_CS5_START);
  96. *(vu_long *)MPC5XXX_CS5_STOP = STOP_REG(CFG_CS5_START, CFG_CS5_SIZE);
  97. addecr |= (1 << 21);
  98. #endif
  99. #if defined(CFG_CS5_CFG)
  100. *(vu_long *)MPC5XXX_CS5_CFG = CFG_CS5_CFG;
  101. #endif
  102. #if defined(CONFIG_MPC5200)
  103. addecr |= 1;
  104. #if defined(CFG_CS6_START) && defined(CFG_CS6_SIZE)
  105. *(vu_long *)MPC5XXX_CS6_START = START_REG(CFG_CS6_START);
  106. *(vu_long *)MPC5XXX_CS6_STOP = STOP_REG(CFG_CS6_START, CFG_CS6_SIZE);
  107. addecr |= (1 << 26);
  108. #endif
  109. #if defined(CFG_CS6_CFG)
  110. *(vu_long *)MPC5XXX_CS6_CFG = CFG_CS6_CFG;
  111. #endif
  112. #if defined(CFG_CS7_START) && defined(CFG_CS7_SIZE)
  113. *(vu_long *)MPC5XXX_CS7_START = START_REG(CFG_CS7_START);
  114. *(vu_long *)MPC5XXX_CS7_STOP = STOP_REG(CFG_CS7_START, CFG_CS7_SIZE);
  115. addecr |= (1 << 27);
  116. #endif
  117. #if defined(CFG_CS7_CFG)
  118. *(vu_long *)MPC5XXX_CS7_CFG = CFG_CS7_CFG;
  119. #endif
  120. #if defined(CFG_CS_BURST)
  121. *(vu_long *)MPC5XXX_CS_BURST = CFG_CS_BURST;
  122. #endif
  123. #if defined(CFG_CS_DEADCYCLE)
  124. *(vu_long *)MPC5XXX_CS_DEADCYCLE = CFG_CS_DEADCYCLE;
  125. #endif
  126. #endif /* CONFIG_MPC5200 */
  127. /* Enable chip selects */
  128. *(vu_long *)MPC5XXX_ADDECR = addecr;
  129. *(vu_long *)MPC5XXX_CS_CTRL = (1 << 24);
  130. /* Setup pin multiplexing */
  131. #if defined(CFG_GPS_PORT_CONFIG)
  132. *(vu_long *)MPC5XXX_GPS_PORT_CONFIG = CFG_GPS_PORT_CONFIG;
  133. #endif
  134. #if defined(CONFIG_MPC5200)
  135. /* enable timebase */
  136. *(vu_long *)(MPC5XXX_XLBARB + 0x40) |= (1 << 13);
  137. /* Enable snooping for RAM */
  138. *(vu_long *)(MPC5XXX_XLBARB + 0x40) |= (1 << 15);
  139. *(vu_long *)(MPC5XXX_XLBARB + 0x70) = CFG_SDRAM_BASE | 0x1d;
  140. # if defined(CFG_IPBCLK_EQUALS_XLBCLK)
  141. /* Motorola reports IPB should better run at 133 MHz. */
  142. *(vu_long *)MPC5XXX_ADDECR |= 1;
  143. /* pci_clk_sel = 0x02, ipb_clk_sel = 0x00; */
  144. addecr = *(vu_long *)MPC5XXX_CDM_CFG;
  145. addecr &= ~0x103;
  146. # if defined(CFG_PCICLK_EQUALS_IPBCLK_DIV2)
  147. /* pci_clk_sel = 0x01 -> IPB_CLK/2 */
  148. addecr |= 0x01;
  149. # else
  150. /* pci_clk_sel = 0x02 -> XLB_CLK/4 = IPB_CLK/4 */
  151. addecr |= 0x02;
  152. # endif /* CFG_PCICLK_EQUALS_IPBCLK_DIV2 */
  153. *(vu_long *)MPC5XXX_CDM_CFG = addecr;
  154. # endif /* CFG_IPBCLK_EQUALS_XLBCLK */
  155. /* Configure the XLB Arbiter */
  156. *(vu_long *)MPC5XXX_XLBARB_MPRIEN = 0xff;
  157. *(vu_long *)MPC5XXX_XLBARB_MPRIVAL = 0x11111111;
  158. # if defined(CFG_XLB_PIPELINING)
  159. /* Enable piplining */
  160. *(vu_long *)(MPC5XXX_XLBARB + 0x40) &= ~(1 << 31);
  161. # endif
  162. #endif /* CONFIG_MPC5200 */
  163. }
  164. /*
  165. * initialize higher level parts of CPU like time base and timers
  166. */
  167. int cpu_init_r (void)
  168. {
  169. /* mask all interrupts */
  170. #if defined(CONFIG_MGT5100)
  171. *(vu_long *)MPC5XXX_ICTL_PER_MASK = 0xfffffc00;
  172. #elif defined(CONFIG_MPC5200)
  173. *(vu_long *)MPC5XXX_ICTL_PER_MASK = 0xffffff00;
  174. #endif
  175. *(vu_long *)MPC5XXX_ICTL_CRIT |= 0x0001ffff;
  176. *(vu_long *)MPC5XXX_ICTL_EXT &= ~0x00000f00;
  177. /* route critical ints to normal ints */
  178. *(vu_long *)MPC5XXX_ICTL_EXT |= 0x00000001;
  179. #if defined(CONFIG_CMD_NET) && defined(CONFIG_MPC5xxx_FEC)
  180. /* load FEC microcode */
  181. loadtask(0, 2);
  182. #endif
  183. return (0);
  184. }