lowlevel_init.S 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. /* Memory sub-system initialization code */
  2. #include <config.h>
  3. #include <version.h>
  4. #include <asm/regdef.h>
  5. #include <asm/au1x00.h>
  6. #include <asm/mipsregs.h>
  7. #define AU1500_SYS_ADDR 0xB1900000
  8. #define sys_endian 0x0038
  9. #define CP0_Config0 $16
  10. #define MEM_1MS ((396000000/1000000) * 1000)
  11. .text
  12. .set noreorder
  13. .set mips32
  14. .globl lowlevel_init
  15. lowlevel_init:
  16. /*
  17. * Step 1) Establish CPU endian mode.
  18. * NOTE: A fair amount of code is necessary on the Pb1000 to
  19. * obtain the value of Switch S8.1 which is used to determine
  20. * endian at run-time.
  21. */
  22. /* RCE1 */
  23. li t0, MEM_STCFG1
  24. li t1, 0x00000083
  25. sw t1, 0(t0)
  26. li t0, MEM_STTIME1
  27. li t1, 0x33030A10
  28. sw t1, 0(t0)
  29. li t0, MEM_STADDR1
  30. li t1, 0x11803E40
  31. sw t1, 0(t0)
  32. /* Set DSTRB bits so switch will read correctly */
  33. li t1, 0xBE00000C
  34. lw t2, 0(t1)
  35. or t2, t2, 0x00000300
  36. sw t2, 0(t1)
  37. /* Check switch setting */
  38. li t1, 0xBE000014
  39. lw t2, 0(t1)
  40. and t2, t2, 0x00000100
  41. bne t2, zero, big_endian
  42. nop
  43. little_endian:
  44. /* Change Au1 core to little endian */
  45. li t0, AU1500_SYS_ADDR
  46. li t1, 1
  47. sw t1, sys_endian(t0)
  48. mfc0 t2, CP0_CONFIG
  49. mtc0 t2, CP0_CONFIG
  50. nop
  51. nop
  52. /* Big Endian is default so nothing to do but fall through */
  53. big_endian:
  54. /*
  55. * Step 2) Establish Status Register
  56. * (set BEV, clear ERL, clear EXL, clear IE)
  57. */
  58. li t1, 0x00400000
  59. mtc0 t1, CP0_STATUS
  60. /*
  61. * Step 3) Establish CP0 Config0
  62. * (set OD, set K0=3)
  63. */
  64. li t1, 0x00080003
  65. mtc0 t1, CP0_CONFIG
  66. /*
  67. * Step 4) Disable Watchpoint facilities
  68. */
  69. li t1, 0x00000000
  70. mtc0 t1, CP0_WATCHLO
  71. mtc0 t1, CP0_IWATCHLO
  72. /*
  73. * Step 5) Disable the performance counters
  74. */
  75. mtc0 zero, CP0_PERFORMANCE
  76. nop
  77. /*
  78. * Step 6) Establish EJTAG Debug register
  79. */
  80. mtc0 zero, CP0_DEBUG
  81. nop
  82. /*
  83. * Step 7) Establish Cause
  84. * (set IV bit)
  85. */
  86. li t1, 0x00800000
  87. mtc0 t1, CP0_CAUSE
  88. /* Establish Wired (and Random) */
  89. mtc0 zero, CP0_WIRED
  90. nop
  91. /* First setup pll:s to make serial work ok */
  92. /* We have a 12 MHz crystal */
  93. li t0, SYS_CPUPLL
  94. li t1, 0x21 /* 396 MHz */
  95. sw t1, 0(t0)
  96. sync
  97. nop
  98. nop
  99. /* wait 1mS for clocks to settle */
  100. li t1, MEM_1MS
  101. 1: add t1, -1
  102. bne t1, zero, 1b
  103. nop
  104. /* Setup AUX PLL */
  105. li t0, SYS_AUXPLL
  106. li t1, 8 /* 96 MHz */
  107. sw t1, 0(t0) /* aux pll */
  108. sync
  109. /* Static memory controller */
  110. /* RCE0 8MB AMD29D323 Flash */
  111. li t0, MEM_STCFG0
  112. li t1, 0x00001403
  113. sw t1, 0(t0)
  114. li t0, MEM_STTIME0
  115. li t1, 0xFFFFFFDD
  116. sw t1, 0(t0)
  117. li t0, MEM_STADDR0
  118. li t1, 0x11F83FE0
  119. sw t1, 0(t0)
  120. /* RCE1 CPLD Board Logic */
  121. li t0, MEM_STCFG1
  122. li t1, 0x00000083
  123. sw t1, 0(t0)
  124. li t0, MEM_STTIME1
  125. li t1, 0x33030A10
  126. sw t1, 0(t0)
  127. li t0, MEM_STADDR1
  128. li t1, 0x11803E40
  129. sw t1, 0(t0)
  130. /* RCE2 CPLD Board Logic */
  131. li t0, MEM_STCFG2
  132. li t1, 0x00000004
  133. sw t1, 0(t0)
  134. li t0, MEM_STTIME2
  135. li t1, 0x08061908
  136. sw t1, 0(t0)
  137. li t0, MEM_STADDR2
  138. li t1, 0x12A03FC0
  139. sw t1, 0(t0)
  140. /* RCE3 PCMCIA 250ns */
  141. li t0, MEM_STCFG3
  142. li t1, 0x00000002
  143. sw t1, 0(t0)
  144. li t0, MEM_STTIME3
  145. li t1, 0x280E3E07
  146. sw t1, 0(t0)
  147. li t0, MEM_STADDR3
  148. li t1, 0x10000000
  149. sw t1, 0(t0)
  150. sync
  151. /* Set peripherals to a known state */
  152. li t0, IC0_CFG0CLR
  153. li t1, 0xFFFFFFFF
  154. sw t1, 0(t0)
  155. li t0, IC0_CFG0CLR
  156. sw t1, 0(t0)
  157. li t0, IC0_CFG1CLR
  158. sw t1, 0(t0)
  159. li t0, IC0_CFG2CLR
  160. sw t1, 0(t0)
  161. li t0, IC0_SRCSET
  162. sw t1, 0(t0)
  163. li t0, IC0_ASSIGNSET
  164. sw t1, 0(t0)
  165. li t0, IC0_WAKECLR
  166. sw t1, 0(t0)
  167. li t0, IC0_RISINGCLR
  168. sw t1, 0(t0)
  169. li t0, IC0_FALLINGCLR
  170. sw t1, 0(t0)
  171. li t0, IC0_TESTBIT
  172. li t1, 0x00000000
  173. sw t1, 0(t0)
  174. sync
  175. li t0, IC1_CFG0CLR
  176. li t1, 0xFFFFFFFF
  177. sw t1, 0(t0)
  178. li t0, IC1_CFG0CLR
  179. sw t1, 0(t0)
  180. li t0, IC1_CFG1CLR
  181. sw t1, 0(t0)
  182. li t0, IC1_CFG2CLR
  183. sw t1, 0(t0)
  184. li t0, IC1_SRCSET
  185. sw t1, 0(t0)
  186. li t0, IC1_ASSIGNSET
  187. sw t1, 0(t0)
  188. li t0, IC1_WAKECLR
  189. sw t1, 0(t0)
  190. li t0, IC1_RISINGCLR
  191. sw t1, 0(t0)
  192. li t0, IC1_FALLINGCLR
  193. sw t1, 0(t0)
  194. li t0, IC1_TESTBIT
  195. li t1, 0x00000000
  196. sw t1, 0(t0)
  197. sync
  198. li t0, SYS_FREQCTRL0
  199. li t1, 0x00000000
  200. sw t1, 0(t0)
  201. li t0, SYS_FREQCTRL1
  202. li t1, 0x00000000
  203. sw t1, 0(t0)
  204. li t0, SYS_CLKSRC
  205. li t1, 0x00000000
  206. sw t1, 0(t0)
  207. li t0, SYS_PININPUTEN
  208. li t1, 0x00000000
  209. sw t1, 0(t0)
  210. sync
  211. li t0, 0xB1100100
  212. li t1, 0x00000000
  213. sw t1, 0(t0)
  214. li t0, 0xB1400100
  215. li t1, 0x00000000
  216. sw t1, 0(t0)
  217. li t0, SYS_WAKEMSK
  218. li t1, 0x00000000
  219. sw t1, 0(t0)
  220. li t0, SYS_WAKESRC
  221. li t1, 0x00000000
  222. sw t1, 0(t0)
  223. /* wait 1mS before setup */
  224. li t1, MEM_1MS
  225. 1: add t1, -1
  226. bne t1, zero, 1b
  227. nop
  228. /*
  229. * Skip memory setup if we are running from memory
  230. */
  231. li t0, 0x90000000
  232. sub t0, ra, t0
  233. bltz t0, skip_memsetup
  234. nop
  235. /*
  236. * SDCS0 - Not used, for SMROM
  237. * SDCS1 - 32MB Micron 48LCBM16A2
  238. * SDCS2 - 32MB Micron 48LCBM16A2
  239. */
  240. li t0, MEM_SDMODE0
  241. li t1, 0x00000000
  242. sw t1, 0(t0)
  243. li t0, MEM_SDMODE1
  244. li t1, 0x00552229
  245. sw t1, 0(t0)
  246. li t0, MEM_SDMODE2
  247. li t1, 0x00552229
  248. sw t1, 0(t0)
  249. li t0, MEM_SDADDR0
  250. li t1, 0x00000000
  251. sw t1, 0(t0)
  252. li t0, MEM_SDADDR1
  253. li t1, 0x001003F8
  254. sw t1, 0(t0)
  255. li t0, MEM_SDADDR2
  256. li t1, 0x001023F8
  257. sw t1, 0(t0)
  258. sync
  259. li t0, MEM_SDREFCFG
  260. li t1, 0x74000c30 /* Disable */
  261. sw t1, 0(t0)
  262. sync
  263. li t0, MEM_SDPRECMD
  264. sw zero, 0(t0)
  265. sync
  266. li t0, MEM_SDAUTOREF
  267. sw zero, 0(t0)
  268. sync
  269. sw zero, 0(t0)
  270. sync
  271. li t0, MEM_SDREFCFG
  272. li t1, 0x76000c30 /* Enable */
  273. sw t1, 0(t0)
  274. sync
  275. li t0, MEM_SDWRMD0
  276. li t1, 0x00000023
  277. sw t1, 0(t0)
  278. sync
  279. li t0, MEM_SDWRMD1
  280. li t1, 0x00000023
  281. sw t1, 0(t0)
  282. sync
  283. li t0, MEM_SDWRMD2
  284. li t1, 0x00000023
  285. sw t1, 0(t0)
  286. sync
  287. /* wait 1mS after setup */
  288. li t1, MEM_1MS
  289. 1: add t1, -1
  290. bne t1, zero, 1b
  291. nop
  292. skip_memsetup:
  293. li t0, SYS_PINFUNC
  294. li t1, 0/*0x00008080*/
  295. sw t1, 0(t0)
  296. /*
  297. li t0, SYS_TRIOUTCLR
  298. li t1, 0x00001FFF
  299. sw t1, 0(t0)
  300. li t0, SYS_OUTPUTCLR
  301. li t1, 0x00008000
  302. sw t1, 0(t0)
  303. */
  304. sync
  305. j ra
  306. nop