lowlevel_init.S 5.6 KB

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