cpu_init.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. #if defined(CONFIG_MGT5100)
  26. #define START_REG(start) ((start) >> 15)
  27. #define STOP_REG(start, size) (((start) + (size) - 1) >> 15)
  28. #elif defined(CONFIG_MPC5200)
  29. #define START_REG(start) ((start) >> 16)
  30. #define STOP_REG(start, size) (((start) + (size) - 1) >> 16)
  31. #endif
  32. /*
  33. * Breath some life into the CPU...
  34. *
  35. * Set up the memory map,
  36. * initialize a bunch of registers.
  37. */
  38. void cpu_init_f (void)
  39. {
  40. DECLARE_GLOBAL_DATA_PTR;
  41. unsigned long addecr = (1 << 25); /* Boot_CS */
  42. #if defined(CFG_RAMBOOT) && defined(CONFIG_MGT5100)
  43. addecr |= (1 << 22); /* SDRAM enable */
  44. #endif
  45. /* Pointer is writable since we allocated a register for it */
  46. gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET);
  47. /* Clear initial global data */
  48. memset ((void *) gd, 0, sizeof (gd_t));
  49. /*
  50. * Memory Controller: configure chip selects and enable them
  51. */
  52. #if defined(CFG_BOOTCS_START) && defined(CFG_BOOTCS_SIZE)
  53. *(vu_long *)MPC5XXX_BOOTCS_START = START_REG(CFG_BOOTCS_START);
  54. *(vu_long *)MPC5XXX_BOOTCS_STOP = STOP_REG(CFG_BOOTCS_START,
  55. CFG_BOOTCS_SIZE);
  56. #endif
  57. #if defined(CFG_BOOTCS_CFG)
  58. *(vu_long *)MPC5XXX_BOOTCS_CFG = CFG_BOOTCS_CFG;
  59. #endif
  60. #if defined(CFG_CS0_START) && defined(CFG_CS0_SIZE)
  61. *(vu_long *)MPC5XXX_CS0_START = START_REG(CFG_CS0_START);
  62. *(vu_long *)MPC5XXX_CS0_STOP = STOP_REG(CFG_CS0_START, CFG_CS0_SIZE);
  63. /* CS0 and BOOT_CS cannot be enabled at once. */
  64. /* addecr |= (1 << 16); */
  65. #endif
  66. #if defined(CFG_CS0_CFG)
  67. *(vu_long *)MPC5XXX_CS0_CFG = CFG_CS0_CFG;
  68. #endif
  69. #if defined(CFG_CS1_START) && defined(CFG_CS1_SIZE)
  70. *(vu_long *)MPC5XXX_CS1_START = START_REG(CFG_CS1_START);
  71. *(vu_long *)MPC5XXX_CS1_STOP = STOP_REG(CFG_CS1_START, CFG_CS1_SIZE);
  72. addecr |= (1 << 17);
  73. #endif
  74. #if defined(CFG_CS1_CFG)
  75. *(vu_long *)MPC5XXX_CS1_CFG = CFG_CS1_CFG;
  76. #endif
  77. #if defined(CFG_CS2_START) && defined(CFG_CS2_SIZE)
  78. *(vu_long *)MPC5XXX_CS2_START = START_REG(CFG_CS2_START);
  79. *(vu_long *)MPC5XXX_CS2_STOP = STOP_REG(CFG_CS2_START, CFG_CS2_SIZE);
  80. addecr |= (1 << 18);
  81. #endif
  82. #if defined(CFG_CS2_CFG)
  83. *(vu_long *)MPC5XXX_CS2_CFG = CFG_CS2_CFG;
  84. #endif
  85. #if defined(CFG_CS3_START) && defined(CFG_CS3_SIZE)
  86. *(vu_long *)MPC5XXX_CS3_START = START_REG(CFG_CS3_START);
  87. *(vu_long *)MPC5XXX_CS3_STOP = STOP_REG(CFG_CS3_START, CFG_CS3_SIZE);
  88. addecr |= (1 << 19);
  89. #endif
  90. #if defined(CFG_CS3_CFG)
  91. *(vu_long *)MPC5XXX_CS3_CFG = CFG_CS3_CFG;
  92. #endif
  93. #if defined(CFG_CS4_START) && defined(CFG_CS4_SIZE)
  94. *(vu_long *)MPC5XXX_CS4_START = START_REG(CFG_CS4_START);
  95. *(vu_long *)MPC5XXX_CS4_STOP = STOP_REG(CFG_CS4_START, CFG_CS4_SIZE);
  96. addecr |= (1 << 20);
  97. #endif
  98. #if defined(CFG_CS4_CFG)
  99. *(vu_long *)MPC5XXX_CS4_CFG = CFG_CS4_CFG;
  100. #endif
  101. #if defined(CFG_CS5_START) && defined(CFG_CS5_SIZE)
  102. *(vu_long *)MPC5XXX_CS5_START = START_REG(CFG_CS5_START);
  103. *(vu_long *)MPC5XXX_CS5_STOP = STOP_REG(CFG_CS5_START, CFG_CS5_SIZE);
  104. addecr |= (1 << 21);
  105. #endif
  106. #if defined(CFG_CS5_CFG)
  107. *(vu_long *)MPC5XXX_CS5_CFG = CFG_CS5_CFG;
  108. #endif
  109. #if defined(CONFIG_MPC5200)
  110. addecr |= 1;
  111. #if defined(CFG_CS6_START) && defined(CFG_CS6_SIZE)
  112. *(vu_long *)MPC5XXX_CS6_START = START_REG(CFG_CS6_START);
  113. *(vu_long *)MPC5XXX_CS6_STOP = STOP_REG(CFG_CS6_START, CFG_CS6_SIZE);
  114. addecr |= (1 << 26);
  115. #endif
  116. #if defined(CFG_CS6_CFG)
  117. *(vu_long *)MPC5XXX_CS6_CFG = CFG_CS6_CFG;
  118. #endif
  119. #if defined(CFG_CS7_START) && defined(CFG_CS7_SIZE)
  120. *(vu_long *)MPC5XXX_CS7_START = START_REG(CFG_CS5_START);
  121. *(vu_long *)MPC5XXX_CS7_STOP = STOP_REG(CFG_CS7_START, CFG_CS7_SIZE);
  122. addecr |= (1 << 27);
  123. #endif
  124. #if defined(CFG_CS7_CFG)
  125. *(vu_long *)MPC5XXX_CS7_CFG = CFG_CS7_CFG;
  126. #endif
  127. #if defined(CFG_CS_BURST)
  128. *(vu_long *)MPC5XXX_CS_BURST = CFG_CS_BURST;
  129. #endif
  130. #if defined(CFG_CS_DEADCYCLE)
  131. *(vu_long *)MPC5XXX_CS_DEADCYCLE = CFG_CS_DEADCYCLE;
  132. #endif
  133. #endif /* CONFIG_MPC5200 */
  134. /* Enable chip selects */
  135. *(vu_long *)MPC5XXX_ADDECR = addecr;
  136. *(vu_long *)MPC5XXX_CS_CTRL = (1 << 24);
  137. /* Setup pin multiplexing */
  138. #if defined(CFG_GPS_PORT_CONFIG)
  139. *(vu_long *)MPC5XXX_GPS_PORT_CONFIG = CFG_GPS_PORT_CONFIG;
  140. #endif
  141. }
  142. /*
  143. * initialize higher level parts of CPU like time base and timers
  144. */
  145. int cpu_init_r (void)
  146. {
  147. /* mask all interrupts */
  148. #if defined(CONFIG_MGT5100)
  149. *(vu_long *)MPC5XXX_ICTL_PER_MASK = 0xfffffc00;
  150. #elif defined(CONFIG_MPC5200)
  151. *(vu_long *)MPC5XXX_ICTL_PER_MASK = 0xffffff00;
  152. #endif
  153. *(vu_long *)MPC5XXX_ICTL_CRIT |= 0x0001ffff;
  154. *(vu_long *)MPC5XXX_ICTL_EXT &= ~0x00000f00;
  155. #if defined(CONFIG_MPC5200)
  156. /* enable timebase */
  157. *(vu_long *)(MPC5XXX_XLBARB + 0x40) |= (1 << 13);
  158. #endif
  159. #if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_MPC5XXX_FEC)
  160. /* load FEC microcode */
  161. loadtask(0, 2);
  162. #endif
  163. return (0);
  164. }