memsetup.S 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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 memsetup
  16. memsetup:
  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. /* 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. /* Static memory controller */
  178. /* RCE0 - can not change while fetching, do so from icache */
  179. move t2, ra /* Store return address */
  180. bal getAddr
  181. nop
  182. getAddr:
  183. move t1, ra
  184. move ra, t2 /* Move return addess back */
  185. cache 0x14,0(t1)
  186. cache 0x14,32(t1)
  187. /*** /From YAMON ***/
  188. noCacheJump:
  189. #endif /* CONFIG_DBAU1550 */
  190. #ifdef CONFIG_DBAU1550
  191. li t0, MEM_STTIME0
  192. li t1, 0x040181D7
  193. sw t1, 0(t0)
  194. /* RCE0 AMD MirrorBit Flash (?) */
  195. li t0, MEM_STCFG0
  196. li t1, 0x00000003
  197. sw t1, 0(t0)
  198. li t0, MEM_STADDR0
  199. li t1, 0x11803E00
  200. sw t1, 0(t0)
  201. #else /* CONFIG_DBAU1550 */
  202. li t0, MEM_STTIME0
  203. li t1, 0x00014C0F
  204. sw t1, 0(t0)
  205. /* RCE0 AMD 29LV640M MirrorBit Flash */
  206. li t0, MEM_STCFG0
  207. li t1, 0x00000013
  208. sw t1, 0(t0)
  209. li t0, MEM_STADDR0
  210. li t1, 0x11E03F80
  211. sw t1, 0(t0)
  212. #endif /* CONFIG_DBAU1550 */
  213. /* RCE1 CPLD Board Logic */
  214. li t0, MEM_STCFG1
  215. li t1, 0x00000080
  216. sw t1, 0(t0)
  217. li t0, MEM_STTIME1
  218. li t1, 0x22080a20
  219. sw t1, 0(t0)
  220. li t0, MEM_STADDR1
  221. li t1, 0x10c03f00
  222. sw t1, 0(t0)
  223. #ifdef CONFIG_DBAU1550
  224. /* RCE2 CPLD Board Logic */
  225. li t0, MEM_STCFG2
  226. li t1, 0x00000040
  227. sw t1, 0(t0)
  228. li t0, MEM_STTIME2
  229. li t1, 0x22080a20
  230. sw t1, 0(t0)
  231. li t0, MEM_STADDR2
  232. li t1, 0x10c03f00
  233. sw t1, 0(t0)
  234. #else
  235. li t0, MEM_STCFG2
  236. li t1, 0x00000000
  237. sw t1, 0(t0)
  238. li t0, MEM_STTIME2
  239. li t1, 0x00000000
  240. sw t1, 0(t0)
  241. li t0, MEM_STADDR2
  242. li t1, 0x00000000
  243. sw t1, 0(t0)
  244. #endif
  245. /* RCE3 PCMCIA 250ns */
  246. li t0, MEM_STCFG3
  247. li t1, 0x00000002
  248. sw t1, 0(t0)
  249. li t0, MEM_STTIME3
  250. li t1, 0x280E3E07
  251. sw t1, 0(t0)
  252. li t0, MEM_STADDR3
  253. li t1, 0x10000000
  254. sw t1, 0(t0)
  255. sync
  256. /* Set peripherals to a known state */
  257. li t0, IC0_CFG0CLR
  258. li t1, 0xFFFFFFFF
  259. sw t1, 0(t0)
  260. li t0, IC0_CFG0CLR
  261. sw t1, 0(t0)
  262. li t0, IC0_CFG1CLR
  263. sw t1, 0(t0)
  264. li t0, IC0_CFG2CLR
  265. sw t1, 0(t0)
  266. li t0, IC0_SRCSET
  267. sw t1, 0(t0)
  268. li t0, IC0_ASSIGNSET
  269. sw t1, 0(t0)
  270. li t0, IC0_WAKECLR
  271. sw t1, 0(t0)
  272. li t0, IC0_RISINGCLR
  273. sw t1, 0(t0)
  274. li t0, IC0_FALLINGCLR
  275. sw t1, 0(t0)
  276. li t0, IC0_TESTBIT
  277. li t1, 0x00000000
  278. sw t1, 0(t0)
  279. sync
  280. li t0, IC1_CFG0CLR
  281. li t1, 0xFFFFFFFF
  282. sw t1, 0(t0)
  283. li t0, IC1_CFG0CLR
  284. sw t1, 0(t0)
  285. li t0, IC1_CFG1CLR
  286. sw t1, 0(t0)
  287. li t0, IC1_CFG2CLR
  288. sw t1, 0(t0)
  289. li t0, IC1_SRCSET
  290. sw t1, 0(t0)
  291. li t0, IC1_ASSIGNSET
  292. sw t1, 0(t0)
  293. li t0, IC1_WAKECLR
  294. sw t1, 0(t0)
  295. li t0, IC1_RISINGCLR
  296. sw t1, 0(t0)
  297. li t0, IC1_FALLINGCLR
  298. sw t1, 0(t0)
  299. li t0, IC1_TESTBIT
  300. li t1, 0x00000000
  301. sw t1, 0(t0)
  302. sync
  303. li t0, SYS_FREQCTRL0
  304. li t1, 0x00000000
  305. sw t1, 0(t0)
  306. li t0, SYS_FREQCTRL1
  307. li t1, 0x00000000
  308. sw t1, 0(t0)
  309. li t0, SYS_CLKSRC
  310. li t1, 0x00000000
  311. sw t1, 0(t0)
  312. li t0, SYS_PININPUTEN
  313. li t1, 0x00000000
  314. sw t1, 0(t0)
  315. sync
  316. li t0, 0xB1100100
  317. li t1, 0x00000000
  318. sw t1, 0(t0)
  319. li t0, 0xB1400100
  320. li t1, 0x00000000
  321. sw t1, 0(t0)
  322. li t0, SYS_WAKEMSK
  323. li t1, 0x00000000
  324. sw t1, 0(t0)
  325. li t0, SYS_WAKESRC
  326. li t1, 0x00000000
  327. sw t1, 0(t0)
  328. /* wait 1mS before setup */
  329. li t1, MEM_1MS
  330. 1: add t1, -1
  331. bne t1, zero, 1b
  332. nop
  333. #ifdef CONFIG_DBAU1550
  334. /* SDCS 0,1,2 DDR SDRAM */
  335. li t0, MEM_SDMODE0
  336. li t1, 0x04276221
  337. sw t1, 0(t0)
  338. li t0, MEM_SDMODE1
  339. li t1, 0x04276221
  340. sw t1, 0(t0)
  341. li t0, MEM_SDMODE2
  342. li t1, 0x04276221
  343. sw t1, 0(t0)
  344. li t0, MEM_SDADDR0
  345. li t1, 0xe21003f0
  346. sw t1, 0(t0)
  347. li t0, MEM_SDADDR1
  348. li t1, 0xe21043f0
  349. sw t1, 0(t0)
  350. li t0, MEM_SDADDR2
  351. li t1, 0xe21083f0
  352. sw t1, 0(t0)
  353. sync
  354. li t0, MEM_SDCONFIGA
  355. li t1, 0x9030060a /* Program refresh - disabled */
  356. sw t1, 0(t0)
  357. sync
  358. li t0, MEM_SDCONFIGB
  359. li t1, 0x00028000
  360. sw t1, 0(t0)
  361. sync
  362. li t0, MEM_SDPRECMD /* Precharge all */
  363. li t1, 0
  364. sw t1, 0(t0)
  365. sync
  366. li t0, MEM_SDWRMD0
  367. li t1, 0x40000000
  368. sw t1, 0(t0)
  369. sync
  370. li t0, MEM_SDWRMD1
  371. li t1, 0x40000000
  372. sw t1, 0(t0)
  373. sync
  374. li t0, MEM_SDWRMD2
  375. li t1, 0x40000000
  376. sw t1, 0(t0)
  377. sync
  378. li t0, MEM_SDWRMD0
  379. li t1, 0x00000063
  380. sw t1, 0(t0)
  381. sync
  382. li t0, MEM_SDWRMD1
  383. li t1, 0x00000063
  384. sw t1, 0(t0)
  385. sync
  386. li t0, MEM_SDWRMD2
  387. li t1, 0x00000063
  388. sw t1, 0(t0)
  389. sync
  390. li t0, MEM_SDPRECMD /* Precharge all */
  391. sw zero, 0(t0)
  392. sync
  393. /* Issue 2 autoref */
  394. li t0, MEM_SDAUTOREF
  395. sw zero, 0(t0)
  396. sync
  397. li t0, MEM_SDAUTOREF
  398. sw zero, 0(t0)
  399. sync
  400. /* Enable refresh */
  401. li t0, MEM_SDCONFIGA
  402. li t1, 0x9830060a /* Program refresh - enabled */
  403. sw t1, 0(t0)
  404. sync
  405. #else /* CONFIG_DBAU1550 */
  406. /* SDCS 0,1 SDRAM */
  407. li t0, MEM_SDMODE0
  408. li t1, 0x005522AA
  409. sw t1, 0(t0)
  410. li t0, MEM_SDMODE1
  411. li t1, 0x005522AA
  412. sw t1, 0(t0)
  413. li t0, MEM_SDMODE2
  414. li t1, 0x00000000
  415. sw t1, 0(t0)
  416. li t0, MEM_SDADDR0
  417. li t1, 0x001003F8
  418. sw t1, 0(t0)
  419. li t0, MEM_SDADDR1
  420. li t1, 0x001023F8
  421. sw t1, 0(t0)
  422. li t0, MEM_SDADDR2
  423. li t1, 0x00000000
  424. sw t1, 0(t0)
  425. sync
  426. li t0, MEM_SDREFCFG
  427. li t1, 0x64000C24 /* Disable */
  428. sw t1, 0(t0)
  429. sync
  430. li t0, MEM_SDPRECMD
  431. sw zero, 0(t0)
  432. sync
  433. li t0, MEM_SDAUTOREF
  434. sw zero, 0(t0)
  435. sync
  436. sw zero, 0(t0)
  437. sync
  438. li t0, MEM_SDREFCFG
  439. li t1, 0x66000C24 /* Enable */
  440. sw t1, 0(t0)
  441. sync
  442. li t0, MEM_SDWRMD0
  443. li t1, 0x00000033
  444. sw t1, 0(t0)
  445. sync
  446. li t0, MEM_SDWRMD1
  447. li t1, 0x00000033
  448. sw t1, 0(t0)
  449. sync
  450. #endif /* CONFIG_DBAU1550 */
  451. /* wait 1mS after setup */
  452. li t1, MEM_1MS
  453. 1: add t1, -1
  454. bne t1, zero, 1b
  455. nop
  456. li t0, SYS_PINFUNC
  457. li t1, 0x00008080
  458. sw t1, 0(t0)
  459. li t0, SYS_TRIOUTCLR
  460. li t1, 0x00001FFF
  461. sw t1, 0(t0)
  462. li t0, SYS_OUTPUTCLR
  463. li t1, 0x00008000
  464. sw t1, 0(t0)
  465. sync
  466. j ra
  467. nop