asm_init.S 22 KB

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