asm_init.S 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. /*
  2. * (C) Copyright 2001 ELTEC Elektronik AG
  3. * Frank Gottschling <fgottschling@eltec.de>
  4. *
  5. * ELTEC ELPPC RAM initialization
  6. *
  7. * See file CREDITS for list of people who contributed to this
  8. * project.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 of
  13. * the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23. * MA 02111-1307 USA
  24. */
  25. #include <config.h>
  26. #include <asm/processor.h>
  27. #include <version.h>
  28. #include <mpc106.h>
  29. #include <ppc_asm.tmpl>
  30. #include <ppc_defs.h>
  31. .globl board_asm_init
  32. board_asm_init:
  33. /*
  34. * setup pointer to message block
  35. */
  36. mflr r13 /* save away link register */
  37. bl get_lnk_reg /* r3=addr of next instruction */
  38. subi r4, r3, 8 /* r4=board_asm_init addr */
  39. addi r29, r4, (MessageBlock-board_asm_init)
  40. /*
  41. * dcache_disable
  42. */
  43. mfspr r3, HID0
  44. li r4, HID0_DCE
  45. andc r3, r3, r4
  46. mr r2, r3
  47. ori r3, r3, HID0_DCI
  48. sync
  49. mtspr HID0, r3
  50. mtspr HID0, r2
  51. isync
  52. sync
  53. /*
  54. * icache_disable
  55. */
  56. mfspr r3, HID0
  57. li r4, 0
  58. ori r4, r4, HID0_ICE
  59. andc r3, r3, r4
  60. sync
  61. mtspr HID0, r3
  62. /*
  63. * invalidate caches
  64. */
  65. ori r3, r3, (HID0_ICE | HID0_ICFI | HID0_DCI | HID0_DCE)
  66. or r4, r4, r3
  67. isync
  68. mtspr HID0, r4
  69. andc r4, r4, r3
  70. isync
  71. mtspr HID0, r4
  72. isync
  73. /*
  74. * icache_enable
  75. */
  76. mfspr r3, HID0
  77. ori r3, r3, (HID0_ICE | HID0_ICFI)
  78. sync
  79. mtspr HID0, r3
  80. /*
  81. * setup memory controller
  82. */
  83. lis r1, MPC106_REG_ADDR@h
  84. ori r1, r1, MPC106_REG_ADDR@l
  85. lis r2, MPC106_REG_DATA@h
  86. ori r2, r2, MPC106_REG_DATA@l
  87. /* Configure PICR1 */
  88. lis r3, MPC106_REG@h
  89. ori r3, r3, PCI_PICR1
  90. stwbrx r3, 0, r1
  91. addis r3, r0, 0xFF14
  92. ori r3, r3, 0x1CC8
  93. eieio
  94. stwbrx r3, 0, r2
  95. /* Configure PICR2 */
  96. lis r3, MPC106_REG@h
  97. ori r3, r3, PCI_PICR2
  98. stwbrx r3, 0, r1
  99. addis r3, r0, 0x0000
  100. ori r3, r3, 0x0000
  101. eieio
  102. stwbrx r3, 0, r2
  103. /* Configure EUMBAR */
  104. lis r3, MPC106_REG@h
  105. ori r3, r3, 0x0078 /* offest of EUMBAR in PCI config space */
  106. stwbrx r3, 0, r1
  107. lis r3, MPC107_EUMB_ADDR@h
  108. eieio
  109. stwbrx r3, 0, r2
  110. /* Configure Address Map B Option Reg */
  111. lis r3, MPC106_REG@h
  112. ori r3, r3, 0x00e0 /* offest of AMBOR in PCI config space */
  113. stwbrx r3, 0, r1
  114. lis r3, 0
  115. eieio
  116. stwbrx r3, 0, r2
  117. /* Configure I2C Controller */
  118. lis r14, MPC107_I2C_ADDR@h /* base of I2C controller */
  119. ori r14, r14, MPC107_I2C_ADDR@l
  120. lis r3, 0x2b10 /* I2C clock = 100MHz/1024 */
  121. stw r3, 4(r14)
  122. li r3, 0 /* clear arbitration */
  123. eieio
  124. stw r3, 12(r14)
  125. /* Configure MCCR1 */
  126. lis r3, MPC106_REG@h
  127. ori r3, r3, MPC106_MCCR1
  128. stwbrx r3, 0, r1
  129. addis r3, r0, 0x0660 /* don't set MEMGO now ! */
  130. ori r3, r3, 0x0000
  131. eieio
  132. stwbrx r3, 0, r2
  133. /* Configure MCCR2 */
  134. lis r3, MPC106_REG@h
  135. ori r3, r3, MPC106_MCCR2
  136. stwbrx r3, 0, r1
  137. addis r3, r0, 0x0400
  138. ori r3, r3, 0x1800
  139. eieio
  140. stwbrx r3, 0, r2
  141. /* Configure MCCR3 */
  142. lis r3, MPC106_REG@h
  143. ori r3, r3, MPC106_MCCR3
  144. stwbrx r3, 0, r1
  145. addis r3, r0, 0x0230
  146. ori r3, r3, 0x0000
  147. eieio
  148. stwbrx r3, 0, r2
  149. /* Configure MCCR4 */
  150. lis r3, MPC106_REG@h
  151. ori r3, r3, MPC106_MCCR4
  152. stwbrx r3, 0, r1
  153. addis r3, r0, 0x2532
  154. ori r3, r3, 0x2220
  155. eieio
  156. stwbrx r3, 0, r2
  157. /*
  158. * configure memory interface (MICRs)
  159. */
  160. addis r3, r0, 0x8000 /* ADDR_80 */
  161. ori r3, r3, 0x0080 /* SMEMADD1 */
  162. stwbrx r3, 0, r1
  163. addis r3, r0, 0xFFFF
  164. ori r3, r3, 0x4000
  165. eieio
  166. stwbrx r3, 0, r2
  167. addis r3, r0, 0x8000 /* ADDR_84 */
  168. ori r3, r3, 0x0084 /* SMEMADD2 */
  169. stwbrx r3, 0, r1
  170. addis r3, r0, 0xFFFF
  171. ori r3, r3, 0xFFFF
  172. eieio
  173. stwbrx r3, 0, r2
  174. addis r3, r0, 0x8000 /* ADDR_88 */
  175. ori r3, r3, 0x0088 /* EXTSMEM1 */
  176. stwbrx r3, 0, r1
  177. addis r3, r0, 0x0303
  178. ori r3, r3, 0x0000
  179. eieio
  180. stwbrx r3, 0, r2
  181. addis r3, r0, 0x8000 /* ADDR_8C */
  182. ori r3, r3, 0x008c /* EXTSMEM2 */
  183. stwbrx r3, 0, r1
  184. addis r3, r0, 0x0303
  185. ori r3, r3, 0x0303
  186. eieio
  187. stwbrx r3, 0, r2
  188. addis r3, r0, 0x8000 /* ADDR_90 */
  189. ori r3, r3, 0x0090 /* EMEMADD1 */
  190. stwbrx r3, 0, r1
  191. addis r3, r0, 0xFFFF
  192. ori r3, r3, 0x7F3F
  193. eieio
  194. stwbrx r3, 0, r2
  195. addis r3, r0, 0x8000 /* ADDR_94 */
  196. ori r3, r3, 0x0094 /* EMEMADD2 */
  197. stwbrx r3, 0, r1
  198. addis r3, r0, 0xFFFF
  199. ori r3, r3, 0xFFFF
  200. eieio
  201. stwbrx r3, 0, r2
  202. addis r3, r0, 0x8000 /* ADDR_98 */
  203. ori r3, r3, 0x0098 /* EXTEMEM1 */
  204. stwbrx r3, 0, r1
  205. addis r3, r0, 0x0303
  206. ori r3, r3, 0x0000
  207. eieio
  208. stwbrx r3, 0, r2
  209. addis r3, r0, 0x8000 /* ADDR_9C */
  210. ori r3, r3, 0x009c /* EXTEMEM2 */
  211. stwbrx r3, 0, r1
  212. addis r3, r0, 0x0303
  213. ori r3, r3, 0x0303
  214. eieio
  215. stwbrx r3, 0, r2
  216. addis r3, r0, 0x8000 /* ADDR_A0 */
  217. ori r3, r3, 0x00a0 /* MEMBNKEN */
  218. stwbrx r3, 0, r1
  219. addis r3, r0, 0x0000
  220. ori r3, r3, 0x0003
  221. eieio
  222. stwbrx r3, 0, r2
  223. /*
  224. * must wait at least 100us after HRESET to issue a MEMGO
  225. */
  226. lis r0, 1
  227. mtctr r0
  228. memStartWait:
  229. bdnz memStartWait
  230. /*
  231. * enable RAM Operations through MCCR1 (MEMGO)
  232. */
  233. lis r3, 0x8000
  234. ori r3, r3, 0x00f0
  235. stwbrx r3, r0, r1
  236. sync
  237. lwbrx r3, 0, r2
  238. lis r0, 0x0008
  239. or r3, r0, r3
  240. stwbrx r3, 0, r2
  241. sync
  242. /*
  243. * set LEDs first time
  244. */
  245. li r3, 0x1
  246. lis r30, CONFIG_SYS_USR_LED_BASE@h
  247. stb r3, 2(r30)
  248. sync
  249. /*
  250. * init COM1 for polled output
  251. */
  252. lis r8, CONFIG_SYS_NS16550_COM1@h /* COM1 base address*/
  253. ori r8, r8, CONFIG_SYS_NS16550_COM1@l
  254. li r9, 0x00
  255. stb r9, 1(r8) /* int disabled */
  256. eieio
  257. li r9, 0x00
  258. stb r9, 4(r8) /* modem ctrl */
  259. eieio
  260. li r9, 0x80
  261. stb r9, 3(r8) /* link ctrl */
  262. eieio
  263. li r9, (CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE)
  264. stb r9, 0(r8) /* baud rate (LSB)*/
  265. eieio
  266. li r9, ((CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE) >> 8)
  267. stb r9, 1(r8) /* baud rate (MSB) */
  268. eieio
  269. li r9, 0x07
  270. stb r9, 3(r8) /* 8 data bits, 2 stop bit, no parity */
  271. eieio
  272. li r9, 0x0b
  273. stb r9, 4(r8) /* enable the receiver and transmitter (modem ctrl) */
  274. eieio
  275. waitEmpty:
  276. lbz r9, 5(r8) /* transmit empty */
  277. andi. r9, r9, 0x40
  278. beq waitEmpty
  279. li r9, 0x47
  280. stb r9, 3(r8) /* send break, 8 data bits, 2 stop bit, no parity */
  281. eieio
  282. lis r0, 0x0001
  283. mtctr r0
  284. waitCOM1:
  285. lwz r0, 5(r8) /* load from port for delay */
  286. bdnz waitCOM1
  287. waitEmpty1:
  288. lbz r9, 5(r8) /* transmit empty */
  289. andi. r9, r9, 0x40
  290. beq waitEmpty1
  291. li r9, 0x07
  292. stb r9, 3(r8) /* 8 data bits, 2 stop bit, no parity */
  293. eieio
  294. /*
  295. * intro message from message block
  296. */
  297. addi r3, r29, (MnewLine-MessageBlock)
  298. bl Printf
  299. addi r3, r29, (MinitLogo-MessageBlock)
  300. bl Printf
  301. /*
  302. * memory cofiguration using SPD information stored on the SODIMMs
  303. */
  304. addi r3, r29, (Mspd01-MessageBlock)
  305. bl Printf
  306. li r17, 0
  307. li r3, 0x0002 /* get RAM type from spd for bank0/1 */
  308. bl spdRead
  309. cmpi 0, 0, r3, -1 /* error ? */
  310. bne noSpdError
  311. addi r3, r29, (Mfail-MessageBlock)
  312. bl Printf
  313. li r6, 0xe /* error codes in r6 and r7 */
  314. li r7, 0x0
  315. b toggleError /* fail - loop forever */
  316. noSpdError:
  317. mr r15, r3 /* save r3 */
  318. addi r3, r29, (Mok-MessageBlock)
  319. bl Printf
  320. cmpli 0, 0, r15, 0x0004 /* SDRAM ? */
  321. beq isSDRAM
  322. addi r3, r29, (MramTyp-MessageBlock)
  323. bl Printf
  324. li r6, 0xd /* error codes in r6 and r7 */
  325. li r7, 0x0
  326. b toggleError /* fail - loop forever */
  327. isSDRAM:
  328. li r3, 0x0012 /* get supported CAS latencies from byte 18 */
  329. bl spdRead
  330. mr r15, r3
  331. li r3, 0x09
  332. andi. r0, r15, 0x04
  333. bne maxCLis3
  334. li r3, 0x17
  335. maxCLis3:
  336. andi. r0, r15, 0x02
  337. bne CL2
  338. addi r3, r29, (MramTyp-MessageBlock)
  339. bl Printf
  340. li r6, 0xc /* error codes in r6 and r7 */
  341. li r7, 0x0
  342. b toggleError /* fail - loop forever */
  343. CL2:
  344. bl spdRead
  345. cmpli 0, 0, r3, 0xa1 /* cycle time must be 10ns max. */
  346. blt speedOk
  347. addi r3, r29, (MramTyp-MessageBlock)
  348. bl Printf
  349. li r6, 0xb /* error codes in r6 and r7 */
  350. li r7, 0x0
  351. b toggleError /* fail - loop forever */
  352. speedOk:
  353. lis r20, 0x06e8 /* preset MCR1 value */
  354. li r3, 0x0011 /* get number of internal banks from spd for bank0/1 */
  355. bl spdRead
  356. cmpli 0, 0, r3, 0x02
  357. beq SD_2B
  358. cmpli 0, 0, r3, 0x04
  359. beq SD_4B
  360. memConfErr:
  361. addi r3, r29, (MramConfErr-MessageBlock)
  362. bl Printf
  363. li r6, 0xa /* error codes in r6 and r7 */
  364. li r7, 0x0
  365. b toggleError /* fail - loop forever */
  366. SD_2B:
  367. li r3, 0x0003 /* get number of row bits from spd for bank0/1 */
  368. bl spdRead
  369. cmpli 0, 0, r3, 0x0b
  370. beq row11x2
  371. cmpli 0, 0, r3, 0x0c
  372. beq row12x2or13x2
  373. cmpli 0, 0, r3, 0x0d
  374. beq row12x2or13x2
  375. b memConfErr
  376. SD_4B:
  377. li r3, 0x0003 /* get number of row bits from spd for bank0/1 */
  378. bl spdRead
  379. cmpli 0, 0, r3, 0x0b
  380. beq row11x4or12x4
  381. cmpli 0, 0, r3, 0x0c
  382. beq row11x4or12x4
  383. cmpli 0, 0, r3, 0x0d
  384. beq row13x4
  385. b memConfErr
  386. row12x2or13x2:
  387. ori r20, r20, 0x05
  388. b row11x4or12x4
  389. row13x4:
  390. ori r20, r20, 0x0a
  391. b row11x4or12x4
  392. row11x2:
  393. ori r20, r20, 0x0f
  394. row11x4or12x4:
  395. /* get the size of bank 0-1 */
  396. li r3, 0x001f /* get bank size from spd for bank0/1 */
  397. bl spdRead
  398. rlwinm r16, r3, 2, 24, 29 /* calculate size in MByte (128 MB max.) */
  399. li r3, 0x0005 /* get number of banks from spd for bank0/1 */
  400. bl spdRead
  401. cmpi 0, 0, r3, 2 /* 2 banks ? */
  402. bne SDRAMnobank1
  403. mr r17, r16
  404. SDRAMnobank1:
  405. li r3, 0x000c /* get refresh from spd for bank0/1 */
  406. bl spdRead
  407. andi. r3, r3, 0x007f /* mask selfrefresh bit */
  408. li r4, 0x1800 /* refesh cycle 1536 clocks left shifted 2 */
  409. cmpli 0, 0, r3, 0x0000 /* 15.6 us ? */
  410. beq writeRefresh
  411. li r4, 0x0c00 /* refesh cycle 768 clocks left shifted 2 */
  412. cmpli 0, 0, r3, 0x0002 /* 7.8 us ? */
  413. beq writeRefresh
  414. li r4, 0x3000 /* refesh cycle 3072 clocks left shifted 2 */
  415. cmpli 0, 0, r3, 0x0003 /* 31.3 us ? */
  416. beq writeRefresh
  417. li r4, 0x6000 /* refesh cycle 6144 clocks left shifted 2 */
  418. cmpli 0, 0, r3, 0x0004 /* 62.5 us ? */
  419. beq writeRefresh
  420. li r4, 0
  421. ori r4, r4, 0xc000 /* refesh cycle 8224 clocks left shifted 2 */
  422. cmpli 0, 0, r3, 0x0005 /* 125 us ? */
  423. beq writeRefresh
  424. b memConfErr
  425. writeRefresh:
  426. lis r21, 0x0400 /* preset MCCR2 value */
  427. or r21, r21, r4
  428. /* Overwrite MCCR1 */
  429. lis r3, MPC106_REG@h
  430. ori r3, r3, MPC106_MCCR1
  431. stwbrx r3, 0, r1
  432. eieio
  433. stwbrx r20, 0, r2
  434. /* Overwrite MCCR2 */
  435. lis r3, MPC106_REG@h
  436. ori r3, r3, MPC106_MCCR2
  437. stwbrx r3, 0, r1
  438. eieio
  439. stwbrx r21, 0, r2
  440. /* set the memory boundary registers for bank 0-3 */
  441. li r20, 0
  442. lis r23, 0x0303
  443. lis r24, 0x0303
  444. subi r21, r16, 1 /* calculate end address bank0 */
  445. li r22, 1
  446. cmpi 0, 0, r17, 0 /* bank1 present ? */
  447. beq nobank1
  448. andi. r3, r16, 0x00ff /* calculate start address of bank1 */
  449. andi. r4, r16, 0x0300
  450. rlwinm r3, r3, 8, 16, 23
  451. or r20, r20, r3
  452. or r23, r23, r4
  453. add r16, r16, r17 /* add to total memory size */
  454. subi r3, r16, 1 /* calculate end address of bank1 */
  455. andi. r4, r3, 0x0300
  456. andi. r3, r3, 0x00ff
  457. rlwinm r3, r3, 8, 16, 23
  458. or r21, r21, r3
  459. or r24, r24, r4
  460. ori r22, r22, 2 /* enable bank1 */
  461. b bankOk
  462. nobank1:
  463. ori r23, r23, 0x0300 /* set bank1 start to unused area */
  464. ori r24, r24, 0x0300 /* set bank1 end to unused area */
  465. bankOk:
  466. addi r3, r29, (Mactivate-MessageBlock)
  467. bl Printf
  468. mr r3, r16
  469. bl OutDec
  470. addi r3, r29, (Mact0123e-MessageBlock)
  471. bl Printf
  472. /*
  473. * overwrite MSAR1, MEAR1, EMSAR1, and EMEAR1
  474. */
  475. addis r3, r0, 0x8000 /* ADDR_80 */
  476. ori r3, r3, 0x0080 /* MSAR1 */
  477. stwbrx r3, 0, r1
  478. eieio
  479. stwbrx r20, 0, r2
  480. addis r3, r0, 0x8000 /* ADDR_88 */
  481. ori r3, r3, 0x0088 /* EMSAR1 */
  482. stwbrx r3, 0, r1
  483. eieio
  484. stwbrx r23, 0, r2
  485. addis r3, r0, 0x8000 /* ADDR_90 */
  486. ori r3, r3, 0x0090 /* MEAR1 */
  487. stwbrx r3, 0, r1
  488. eieio
  489. stwbrx r21, 0, r2
  490. addis r3, r0, 0x8000 /* ADDR_98 */
  491. ori r3, r3, 0x0098 /* EMEAR1 */
  492. stwbrx r3, 0, r1
  493. eieio
  494. stwbrx r24, 0, r2
  495. addis r3, r0, 0x8000 /* ADDR_A0 */
  496. ori r3, r3, 0x00a0 /* MBER */
  497. stwbrx r3, 0, r1
  498. eieio
  499. stwbrx r22, 0, r2
  500. /*
  501. * delay to let SDRAM go through several initialization/refresh cycles
  502. */
  503. lis r3, 3
  504. mtctr r3
  505. memStartWait_1:
  506. bdnz memStartWait_1
  507. eieio
  508. /*
  509. * set LEDs end
  510. */
  511. li r3, 0xf
  512. lis r30, CONFIG_SYS_USR_LED_BASE@h
  513. stb r3, 2(r30)
  514. sync
  515. mtlr r13
  516. blr /* EXIT board_asm_init ... */
  517. /*----------------------------------------------------------------------------*/
  518. /*
  519. * print a message to COM1 in polling mode (r10=COM1 port, r3=(char*)string)
  520. */
  521. Printf:
  522. lis r10, CONFIG_SYS_NS16550_COM1@h /* COM1 base address*/
  523. ori r10, r10, CONFIG_SYS_NS16550_COM1@l
  524. WaitChr:
  525. lbz r0, 5(r10) /* read link status */
  526. eieio
  527. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  528. beq cr0, WaitChr /* wait till empty */
  529. lbzx r0, r0, r3 /* get char */
  530. stb r0, 0(r10) /* write to transmit reg */
  531. eieio
  532. addi r3, r3, 1 /* next char */
  533. lbzx r0, r0, r3 /* get char */
  534. cmpwi cr1, r0, 0 /* end of string ? */
  535. bne cr1, WaitChr
  536. blr
  537. /*
  538. * print a char to COM1 in polling mode (r10=COM1 port, r3=char)
  539. */
  540. OutChr:
  541. lis r10, CONFIG_SYS_NS16550_COM1@h /* COM1 base address*/
  542. ori r10, r10, CONFIG_SYS_NS16550_COM1@l
  543. OutChr1:
  544. lbz r0, 5(r10) /* read link status */
  545. eieio
  546. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  547. beq cr0, OutChr1 /* wait till empty */
  548. stb r3, 0(r10) /* write to transmit reg */
  549. eieio
  550. blr
  551. /*
  552. * print 8/4/2 digits hex value to COM1 in polling mode (r10=COM1 port, r3=val)
  553. */
  554. OutHex2:
  555. li r9, 4 /* shift reg for 2 digits */
  556. b OHstart
  557. OutHex4:
  558. li r9, 12 /* shift reg for 4 digits */
  559. b OHstart
  560. OutHex:
  561. li r9, 28 /* shift reg for 8 digits */
  562. OHstart:
  563. lis r10, CONFIG_SYS_NS16550_COM1@h /* COM1 base address*/
  564. ori r10, r10, CONFIG_SYS_NS16550_COM1@l
  565. OutDig:
  566. lbz r0, 0(r29) /* slow down dummy read */
  567. lbz r0, 5(r10) /* read link status */
  568. eieio
  569. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  570. beq cr0, OutDig
  571. sraw r0, r3, r9
  572. clrlwi r0, r0, 28
  573. cmpwi cr1, r0, 9
  574. ble cr1, digIsNum
  575. addic r0, r0, 55
  576. b nextDig
  577. digIsNum:
  578. addic r0, r0, 48
  579. nextDig:
  580. stb r0, 0(r10) /* write to transmit reg */
  581. eieio
  582. addic. r9, r9, -4
  583. bge OutDig
  584. blr
  585. /*
  586. * print 3 digits hdec value to COM1 in polling mode
  587. * (r10=COM1 port, r3=val, r7=x00, r8=x0, r9=x, r0, r6=scratch)
  588. */
  589. OutDec:
  590. li r6, 10
  591. divwu r0, r3, r6 /* r0 = r3 / 10, r9 = r3 mod 10 */
  592. mullw r10, r0, r6
  593. subf r9, r10, r3
  594. mr r3, r0
  595. divwu r0, r3, r6 /* r0 = r3 / 10, r8 = r3 mod 10 */
  596. mullw r10, r0, r6
  597. subf r8, r10, r3
  598. mr r3, r0
  599. divwu r0, r3, r6 /* r0 = r3 / 10, r7 = r3 mod 10 */
  600. mullw r10, r0, r6
  601. subf r7, r10, r3
  602. lis r10, CONFIG_SYS_NS16550_COM1@h /* COM1 base address*/
  603. ori r10, r10, CONFIG_SYS_NS16550_COM1@l
  604. or. r7, r7, r7
  605. bne noblank1
  606. li r3, 0x20
  607. b OutDec4
  608. noblank1:
  609. addi r3, r7, 48 /* convert to ASCII */
  610. OutDec4:
  611. lbz r0, 0(r29) /* slow down dummy read */
  612. lbz r0, 5(r10) /* read link status */
  613. eieio
  614. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  615. beq cr0, OutDec4
  616. stb r3, 0(r10) /* x00 to transmit */
  617. eieio
  618. or. r7, r7, r8
  619. beq OutDec5
  620. addi r3, r8, 48 /* convert to ASCII */
  621. OutDec5:
  622. lbz r0, 0(r29) /* slow down dummy read */
  623. lbz r0, 5(r10) /* read link status */
  624. eieio
  625. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  626. beq cr0, OutDec5
  627. stb r3, 0(r10) /* x0 to transmit */
  628. eieio
  629. addi r3, r9, 48 /* convert to ASCII */
  630. OutDec6:
  631. lbz r0, 0(r29) /* slow down dummy read */
  632. lbz r0, 5(r10) /* read link status */
  633. eieio
  634. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  635. beq cr0, OutDec6
  636. stb r3, 0(r10) /* x to transmit */
  637. eieio
  638. blr
  639. /*
  640. * hang endless loop
  641. */
  642. toggleError: /* fail type in r6, r7=0xff, toggle LEDs */
  643. stb r7, 2(r30) /* r7 to LED */
  644. li r0, 0
  645. lis r9, 127
  646. ori r9, r9, 65535
  647. toggleError1:
  648. addic r0, r0, 1
  649. cmpw cr1, r0, r9
  650. ble cr1, toggleError1
  651. stb r6, 2(r30) /* r6 to LED */
  652. li r0, 0
  653. lis r9, 127
  654. ori r9, r9, 65535
  655. toggleError2:
  656. addic r0, r0, 1
  657. cmpw cr1, r0, r9
  658. ble cr1, toggleError2
  659. b toggleError
  660. /*
  661. * routines to read from ram spd
  662. */
  663. spdWaitIdle:
  664. lis r0, 0x1 /* timeout for about 100us */
  665. mtctr r0
  666. iSpd:
  667. lbz r10, 12(r14)
  668. andi. r10, r10, 0x20 /* mask and test MBB */
  669. beq idle
  670. bdnz iSpd
  671. orc. r10, r0, r0 /* return -1 to caller */
  672. idle:
  673. bclr 20, 0 /* return to caller */
  674. waitSpd:
  675. lis r0, 0x10 /* timeout for about 1.5ms */
  676. mtctr r0
  677. wSpd:
  678. lbz r10, 12(r14)
  679. andi. r10, r10, 0x82
  680. cmpli 0, 0, r10, 0x82 /* test MCF and MIF set */
  681. beq wend
  682. bdnz wSpd
  683. orc. r10, r0, r0 /* return -1 to caller */
  684. bclr 20, 0 /* return to caller */
  685. wend:
  686. li r10, 0
  687. stb r10, 12(r14) /* clear status */
  688. bclr 20, 0 /* return to caller */
  689. /*
  690. * spdread
  691. * in: r3 adr to read
  692. * out: r3 val or -1 for error
  693. * uses r10, assumes that r14 points to I2C controller
  694. */
  695. spdRead:
  696. mfspr r25, 8 /* save link register */
  697. bl spdWaitIdle
  698. bne spdErr
  699. li r10, 0x80 /* start with MEN */
  700. stb r10, 8(r14)
  701. eieio
  702. li r10, 0xb0 /* start as master */
  703. stb r10, 8(r14)
  704. eieio
  705. li r10, 0xa0 /* write device 0xA0 */
  706. stb r10, 16(r14)
  707. eieio
  708. bl waitSpd
  709. bne spdErr
  710. lbz r10, 12(r14) /* test ACK */
  711. andi. r10, r10, 0x01
  712. bne gotNoAck
  713. stb r3, 16(r14) /* data address */
  714. eieio
  715. bl waitSpd
  716. bne spdErr
  717. li r10, 0xb4 /* switch to read - restart */
  718. stb r10, 8(r14)
  719. eieio
  720. li r10, 0xa1 /* read device 0xA0 */
  721. stb r10, 16(r14)
  722. eieio
  723. bl waitSpd
  724. bne spdErr
  725. li r10, 0xa8 /* no ACK */
  726. stb r10, 8(r14)
  727. eieio
  728. lbz r10, 16(r14) /* trigger read next byte */
  729. eieio
  730. bl waitSpd
  731. bne spdErr
  732. li r10, 0x88 /* generate STOP condition */
  733. stb r10, 8(r14)
  734. eieio
  735. lbz r3, 16(r14) /* return read byte */
  736. mtspr 8, r25 /* restore link register */
  737. blr
  738. gotNoAck:
  739. li r10, 0x80 /* generate STOP condition */
  740. stb r10, 8(r14)
  741. eieio
  742. spdErr:
  743. orc r3, r0, r0 /* return -1 */
  744. mtspr 8, r25 /* restore link register */
  745. blr
  746. get_lnk_reg:
  747. mflr r3 /* return link reg */
  748. blr
  749. MessageBlock:
  750. MinitLogo:
  751. .ascii "\015\012*** ELTEC Elektronik, Mainz ***\015\012"
  752. .ascii "\015\012Initialising RAM\015\012\000"
  753. Mspd01:
  754. .ascii " Reading SPD of SODIMM ...... \000"
  755. MramTyp:
  756. .ascii "\015\012\SDRAM with CL=2 at 100 MHz required!\015\012\000"
  757. MramConfErr:
  758. .ascii "\015\012\Unsupported SODIMM Configuration!\015\012\000"
  759. Mactivate:
  760. .ascii " Activating \000"
  761. Mact0123e:
  762. .ascii " MByte.\015\012\000"
  763. Mok:
  764. .ascii "OK \015\012\000"
  765. Mfail:
  766. .ascii "FAILED \015\012\000"
  767. MnewLine:
  768. .ascii "\015\012\000"
  769. .align 4