lowlevel_init.S 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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 CPU_SCALE ((CONFIG_SYS_MHZ) / 12) /* CPU clock is a multiple of 12 MHz */
  10. #define MEM_1MS ((CONFIG_SYS_MHZ) * 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. * Db1500-specific:
  19. * Switch S1.1 Off(bit7 reads 1) is Little Endian
  20. * Switch S1.1 On (bit7 reads 0) is Big Endian
  21. */
  22. #ifdef CONFIG_DBAU1550
  23. li t0, MEM_STCFG2
  24. li t1, 0x00000040
  25. sw t1, 0(t0)
  26. li t0, MEM_STTIME2
  27. li t1, 0x22080a20
  28. sw t1, 0(t0)
  29. li t0, MEM_STADDR2
  30. li t1, 0x10c03f00
  31. sw t1, 0(t0)
  32. #else
  33. li t0, MEM_STCFG1
  34. li t1, 0x00000080
  35. sw t1, 0(t0)
  36. li t0, MEM_STTIME1
  37. li t1, 0x22080a20
  38. sw t1, 0(t0)
  39. li t0, MEM_STADDR1
  40. li t1, 0x10c03f00
  41. sw t1, 0(t0)
  42. #endif
  43. li t0, DB1XX0_BCSR_ADDR
  44. lw t1,8(t0)
  45. andi t1,t1,0x80
  46. beq zero,t1,big_endian
  47. nop
  48. little_endian:
  49. /* Change Au1 core to little endian */
  50. li t0, AU1500_SYS_ADDR
  51. li t1, 1
  52. sw t1, sys_endian(t0)
  53. mfc0 t2, CP0_CONFIG
  54. mtc0 t2, CP0_CONFIG
  55. nop
  56. nop
  57. /* Big Endian is default so nothing to do but fall through */
  58. big_endian:
  59. /*
  60. * Step 2) Establish Status Register
  61. * (set BEV, clear ERL, clear EXL, clear IE)
  62. */
  63. li t1, 0x00400000
  64. mtc0 t1, CP0_STATUS
  65. /*
  66. * Step 3) Establish CP0 Config0
  67. * (set OD, set K0=3)
  68. */
  69. li t1, 0x00080003
  70. mtc0 t1, CP0_CONFIG
  71. /*
  72. * Step 4) Disable Watchpoint facilities
  73. */
  74. li t1, 0x00000000
  75. mtc0 t1, CP0_WATCHLO
  76. mtc0 t1, CP0_IWATCHLO
  77. /*
  78. * Step 5) Disable the performance counters
  79. */
  80. mtc0 zero, CP0_PERFORMANCE
  81. nop
  82. /*
  83. * Step 6) Establish EJTAG Debug register
  84. */
  85. mtc0 zero, CP0_DEBUG
  86. nop
  87. /*
  88. * Step 7) Establish Cause
  89. * (set IV bit)
  90. */
  91. li t1, 0x00800000
  92. mtc0 t1, CP0_CAUSE
  93. /* Establish Wired (and Random) */
  94. mtc0 zero, CP0_WIRED
  95. nop
  96. #ifdef CONFIG_DBAU1550
  97. /* No workaround if running from ram */
  98. lui t0, 0xffc0
  99. lui t3, 0xbfc0
  100. and t1, ra, t0
  101. bne t1, t3, noCacheJump
  102. nop
  103. /*** From AMD YAMON ***/
  104. /*
  105. * Step 8) Initialize the caches
  106. */
  107. li t0, (16*1024)
  108. li t1, 32
  109. li t2, 0x80000000
  110. addu t3, t0, t2
  111. cacheloop:
  112. cache 0, 0(t2)
  113. cache 1, 0(t2)
  114. addu t2, t1
  115. bne t2, t3, cacheloop
  116. nop
  117. /* Save return address */
  118. move t3, ra
  119. /* Run from cacheable space now */
  120. bal cachehere
  121. nop
  122. cachehere:
  123. li t1, ~0x20000000 /* convert to KSEG0 */
  124. and t0, ra, t1
  125. addi t0, 5*4 /* 5 insns beyond cachehere */
  126. jr t0
  127. nop
  128. /* Restore return address */
  129. move ra, t3
  130. /*
  131. * Step 9) Initialize the TLB
  132. */
  133. li t0, 0 # index value
  134. li t1, 0x00000000 # entryhi value
  135. li t2, 32 # 32 entries
  136. tlbloop:
  137. /* Probe TLB for matching EntryHi */
  138. mtc0 t1, CP0_ENTRYHI
  139. tlbp
  140. nop
  141. /* Examine Index[P], 1=no matching entry */
  142. mfc0 t3, CP0_INDEX
  143. li t4, 0x80000000
  144. and t3, t4, t3
  145. addiu t1, t1, 1 # increment t1 (asid)
  146. beq zero, t3, tlbloop
  147. nop
  148. /* Initialize the TLB entry */
  149. mtc0 t0, CP0_INDEX
  150. mtc0 zero, CP0_ENTRYLO0
  151. mtc0 zero, CP0_ENTRYLO1
  152. mtc0 zero, CP0_PAGEMASK
  153. tlbwi
  154. /* Do it again */
  155. addiu t0, t0, 1
  156. bne t0, t2, tlbloop
  157. nop
  158. #endif /* CONFIG_DBAU1550 */
  159. /* First setup pll:s to make serial work ok */
  160. /* We have a 12 MHz crystal */
  161. li t0, SYS_CPUPLL
  162. li t1, CPU_SCALE /* CPU clock */
  163. sw t1, 0(t0)
  164. sync
  165. nop
  166. nop
  167. /* wait 1mS for clocks to settle */
  168. li t1, MEM_1MS
  169. 1: add t1, -1
  170. bne t1, zero, 1b
  171. nop
  172. /* Setup AUX PLL */
  173. li t0, SYS_AUXPLL
  174. li t1, 0x20 /* 96 MHz */
  175. sw t1, 0(t0) /* aux pll */
  176. sync
  177. #ifdef CONFIG_DBAU1550
  178. /* Static memory controller */
  179. /* RCE0 - can not change while fetching, do so from icache */
  180. move t2, ra /* Store return address */
  181. bal getAddr
  182. nop
  183. getAddr:
  184. move t1, ra
  185. move ra, t2 /* Move return addess back */
  186. cache 0x14,0(t1)
  187. cache 0x14,32(t1)
  188. /*** /From YAMON ***/
  189. noCacheJump:
  190. #endif /* CONFIG_DBAU1550 */
  191. #ifdef CONFIG_DBAU1550
  192. li t0, MEM_STTIME0
  193. li t1, 0x040181D7
  194. sw t1, 0(t0)
  195. /* RCE0 AMD MirrorBit Flash (?) */
  196. li t0, MEM_STCFG0
  197. li t1, 0x00000003
  198. sw t1, 0(t0)
  199. li t0, MEM_STADDR0
  200. li t1, 0x11803E00
  201. sw t1, 0(t0)
  202. #else /* CONFIG_DBAU1550 */
  203. li t0, MEM_STTIME0
  204. li t1, 0x040181D7
  205. sw t1, 0(t0)
  206. /* RCE0 AMD 29LV640M MirrorBit Flash */
  207. li t0, MEM_STCFG0
  208. li t1, 0x00000013
  209. sw t1, 0(t0)
  210. li t0, MEM_STADDR0
  211. li t1, 0x11E03F80
  212. sw t1, 0(t0)
  213. #endif /* CONFIG_DBAU1550 */
  214. /* RCE1 CPLD Board Logic */
  215. li t0, MEM_STCFG1
  216. li t1, 0x00000080
  217. sw t1, 0(t0)
  218. li t0, MEM_STTIME1
  219. li t1, 0x22080a20
  220. sw t1, 0(t0)
  221. li t0, MEM_STADDR1
  222. li t1, 0x10c03f00
  223. sw t1, 0(t0)
  224. #ifdef CONFIG_DBAU1550
  225. /* RCE2 CPLD Board Logic */
  226. li t0, MEM_STCFG2
  227. li t1, 0x00000040
  228. sw t1, 0(t0)
  229. li t0, MEM_STTIME2
  230. li t1, 0x22080a20
  231. sw t1, 0(t0)
  232. li t0, MEM_STADDR2
  233. li t1, 0x10c03f00
  234. sw t1, 0(t0)
  235. #else
  236. li t0, MEM_STCFG2
  237. li t1, 0x00000000
  238. sw t1, 0(t0)
  239. li t0, MEM_STTIME2
  240. li t1, 0x00000000
  241. sw t1, 0(t0)
  242. li t0, MEM_STADDR2
  243. li t1, 0x00000000
  244. sw t1, 0(t0)
  245. #endif
  246. /* RCE3 PCMCIA 250ns */
  247. li t0, MEM_STCFG3
  248. li t1, 0x00000002
  249. sw t1, 0(t0)
  250. li t0, MEM_STTIME3
  251. li t1, 0x280E3E07
  252. sw t1, 0(t0)
  253. li t0, MEM_STADDR3
  254. li t1, 0x10000000
  255. sw t1, 0(t0)
  256. sync
  257. /* Set peripherals to a known state */
  258. li t0, IC0_CFG0CLR
  259. li t1, 0xFFFFFFFF
  260. sw t1, 0(t0)
  261. li t0, IC0_CFG0CLR
  262. sw t1, 0(t0)
  263. li t0, IC0_CFG1CLR
  264. sw t1, 0(t0)
  265. li t0, IC0_CFG2CLR
  266. sw t1, 0(t0)
  267. li t0, IC0_SRCSET
  268. sw t1, 0(t0)
  269. li t0, IC0_ASSIGNSET
  270. sw t1, 0(t0)
  271. li t0, IC0_WAKECLR
  272. sw t1, 0(t0)
  273. li t0, IC0_RISINGCLR
  274. sw t1, 0(t0)
  275. li t0, IC0_FALLINGCLR
  276. sw t1, 0(t0)
  277. li t0, IC0_TESTBIT
  278. li t1, 0x00000000
  279. sw t1, 0(t0)
  280. sync
  281. li t0, IC1_CFG0CLR
  282. li t1, 0xFFFFFFFF
  283. sw t1, 0(t0)
  284. li t0, IC1_CFG0CLR
  285. sw t1, 0(t0)
  286. li t0, IC1_CFG1CLR
  287. sw t1, 0(t0)
  288. li t0, IC1_CFG2CLR
  289. sw t1, 0(t0)
  290. li t0, IC1_SRCSET
  291. sw t1, 0(t0)
  292. li t0, IC1_ASSIGNSET
  293. sw t1, 0(t0)
  294. li t0, IC1_WAKECLR
  295. sw t1, 0(t0)
  296. li t0, IC1_RISINGCLR
  297. sw t1, 0(t0)
  298. li t0, IC1_FALLINGCLR
  299. sw t1, 0(t0)
  300. li t0, IC1_TESTBIT
  301. li t1, 0x00000000
  302. sw t1, 0(t0)
  303. sync
  304. li t0, SYS_FREQCTRL0
  305. li t1, 0x00000000
  306. sw t1, 0(t0)
  307. li t0, SYS_FREQCTRL1
  308. li t1, 0x00000000
  309. sw t1, 0(t0)
  310. li t0, SYS_CLKSRC
  311. li t1, 0x00000000
  312. sw t1, 0(t0)
  313. li t0, SYS_PININPUTEN
  314. li t1, 0x00000000
  315. sw t1, 0(t0)
  316. sync
  317. li t0, 0xB1100100
  318. li t1, 0x00000000
  319. sw t1, 0(t0)
  320. li t0, 0xB1400100
  321. li t1, 0x00000000
  322. sw t1, 0(t0)
  323. li t0, SYS_WAKEMSK
  324. li t1, 0x00000000
  325. sw t1, 0(t0)
  326. li t0, SYS_WAKESRC
  327. li t1, 0x00000000
  328. sw t1, 0(t0)
  329. /* wait 1mS before setup */
  330. li t1, MEM_1MS
  331. 1: add t1, -1
  332. bne t1, zero, 1b
  333. nop
  334. #ifdef CONFIG_DBAU1550
  335. /* SDCS 0,1,2 DDR SDRAM */
  336. li t0, MEM_SDMODE0
  337. li t1, 0x04276221
  338. sw t1, 0(t0)
  339. li t0, MEM_SDMODE1
  340. li t1, 0x04276221
  341. sw t1, 0(t0)
  342. li t0, MEM_SDMODE2
  343. li t1, 0x04276221
  344. sw t1, 0(t0)
  345. li t0, MEM_SDADDR0
  346. li t1, 0xe21003f0
  347. sw t1, 0(t0)
  348. li t0, MEM_SDADDR1
  349. li t1, 0xe21043f0
  350. sw t1, 0(t0)
  351. li t0, MEM_SDADDR2
  352. li t1, 0xe21083f0
  353. sw t1, 0(t0)
  354. sync
  355. li t0, MEM_SDCONFIGA
  356. li t1, 0x9030060a /* Program refresh - disabled */
  357. sw t1, 0(t0)
  358. sync
  359. li t0, MEM_SDCONFIGB
  360. li t1, 0x00028000
  361. sw t1, 0(t0)
  362. sync
  363. li t0, MEM_SDPRECMD /* Precharge all */
  364. li t1, 0
  365. sw t1, 0(t0)
  366. sync
  367. li t0, MEM_SDWRMD0
  368. li t1, 0x40000000
  369. sw t1, 0(t0)
  370. sync
  371. li t0, MEM_SDWRMD1
  372. li t1, 0x40000000
  373. sw t1, 0(t0)
  374. sync
  375. li t0, MEM_SDWRMD2
  376. li t1, 0x40000000
  377. sw t1, 0(t0)
  378. sync
  379. li t0, MEM_SDWRMD0
  380. li t1, 0x00000063
  381. sw t1, 0(t0)
  382. sync
  383. li t0, MEM_SDWRMD1
  384. li t1, 0x00000063
  385. sw t1, 0(t0)
  386. sync
  387. li t0, MEM_SDWRMD2
  388. li t1, 0x00000063
  389. sw t1, 0(t0)
  390. sync
  391. li t0, MEM_SDPRECMD /* Precharge all */
  392. sw zero, 0(t0)
  393. sync
  394. /* Issue 2 autoref */
  395. li t0, MEM_SDAUTOREF
  396. sw zero, 0(t0)
  397. sync
  398. li t0, MEM_SDAUTOREF
  399. sw zero, 0(t0)
  400. sync
  401. /* Enable refresh */
  402. li t0, MEM_SDCONFIGA
  403. li t1, 0x9830060a /* Program refresh - enabled */
  404. sw t1, 0(t0)
  405. sync
  406. #else /* CONFIG_DBAU1550 */
  407. /* SDCS 0,1 SDRAM */
  408. li t0, MEM_SDMODE0
  409. li t1, 0x005522AA
  410. sw t1, 0(t0)
  411. li t0, MEM_SDMODE1
  412. li t1, 0x005522AA
  413. sw t1, 0(t0)
  414. li t0, MEM_SDMODE2
  415. li t1, 0x00000000
  416. sw t1, 0(t0)
  417. li t0, MEM_SDADDR0
  418. li t1, 0x001003F8
  419. sw t1, 0(t0)
  420. li t0, MEM_SDADDR1
  421. li t1, 0x001023F8
  422. sw t1, 0(t0)
  423. li t0, MEM_SDADDR2
  424. li t1, 0x00000000
  425. sw t1, 0(t0)
  426. sync
  427. li t0, MEM_SDREFCFG
  428. li t1, 0x64000C24 /* Disable */
  429. sw t1, 0(t0)
  430. sync
  431. li t0, MEM_SDPRECMD
  432. sw zero, 0(t0)
  433. sync
  434. li t0, MEM_SDAUTOREF
  435. sw zero, 0(t0)
  436. sync
  437. sw zero, 0(t0)
  438. sync
  439. li t0, MEM_SDREFCFG
  440. li t1, 0x66000C24 /* Enable */
  441. sw t1, 0(t0)
  442. sync
  443. li t0, MEM_SDWRMD0
  444. li t1, 0x00000033
  445. sw t1, 0(t0)
  446. sync
  447. li t0, MEM_SDWRMD1
  448. li t1, 0x00000033
  449. sw t1, 0(t0)
  450. sync
  451. #endif /* CONFIG_DBAU1550 */
  452. /* wait 1mS after setup */
  453. li t1, MEM_1MS
  454. 1: add t1, -1
  455. bne t1, zero, 1b
  456. nop
  457. li t0, SYS_PINFUNC
  458. li t1, 0x00008080
  459. sw t1, 0(t0)
  460. li t0, SYS_TRIOUTCLR
  461. li t1, 0x00001FFF
  462. sw t1, 0(t0)
  463. li t0, SYS_OUTPUTCLR
  464. li t1, 0x00008000
  465. sw t1, 0(t0)
  466. sync
  467. jr ra
  468. nop