lowlevel_init.S 8.7 KB

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