asm_init.S 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476
  1. /*
  2. * (C) Copyright 2001 ELTEC Elektronik AG
  3. * Frank Gottschling <fgottschling@eltec.de>
  4. *
  5. * ELTEC BAB PPC 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 <74xx_7xx.h>
  28. #include <mpc106.h>
  29. #include <version.h>
  30. #include <ppc_asm.tmpl>
  31. #include <ppc_defs.h>
  32. /*
  33. * This following contains the entry code for the initialization code
  34. * for the MPC 106, a PCI Bridge/Memory Controller.
  35. * Register usage:
  36. * r0 = ramtest scratch register, toggleError loop counter
  37. * r1 = 0xfec0 0cf8 CONFIG_ADDRESS
  38. * r2 = 0xfee0 0cfc CONFIG_DATA
  39. * r3 = scratch register, subroutine argument and return value, ramtest size
  40. * r4 = scratch register, spdRead clock mask, OutHex loop count
  41. * r5 = ramtest scratch register
  42. * r6 = toggleError 1st value, spdRead port mask
  43. * r7 = toggleError 2nd value, ramtest scratch register,
  44. * spdRead scratch register (0x00)
  45. * r8 = ramtest scratch register, spdRead scratch register (0x80)
  46. * r9 = ramtest scratch register, toggleError loop end, OutHex digit
  47. * r10 = ramtest scratch register, spdWriteByte parameter,
  48. * spdReadByte return value, printf pointer to COM1
  49. * r11 = startType
  50. * r12 = ramtest scratch register, spdRead data mask
  51. * r13 = pointer to message block
  52. * r14 = pointer to GOT
  53. * r15 = scratch register, SPD save
  54. * r16 = bank0 size, total memory size
  55. * r17 = bank1 size
  56. * r18 = bank2 size
  57. * r19 = bank3 size
  58. * r20 = MCCR1, MSAR1
  59. * r21 = MCCR3, MEAR1
  60. * r22 = MCCR4, MBER
  61. * r23 = EMSAR1
  62. * r24 = EMEAR1
  63. * r25 = save link register 1st level
  64. * r26 = save link register 2nd level
  65. * r27 = save link register 3rd level
  66. * r30 = pointer to GPIO for spdRead
  67. */
  68. .globl board_asm_init
  69. board_asm_init:
  70. /*
  71. * setup pointer to message block
  72. */
  73. mflr r25 /* save away link register */
  74. bl get_lnk_reg /* r3=addr of next instruction */
  75. subi r4, r3, 8 /* r4=board_asm_init addr */
  76. addi r13, r4, (MessageBlock-board_asm_init)
  77. /*
  78. * dcache_disable
  79. */
  80. mfspr r3, HID0
  81. li r4, HID0_DCE
  82. andc r3, r3, r4
  83. mr r2, r3
  84. ori r3, r3, HID0_DCI
  85. sync
  86. mtspr HID0, r3
  87. mtspr HID0, r2
  88. isync
  89. sync
  90. /*
  91. * icache_disable
  92. */
  93. mfspr r3, HID0
  94. li r4, 0
  95. ori r4, r4, HID0_ICE
  96. andc r3, r3, r4
  97. sync
  98. mtspr HID0, r3
  99. /*
  100. * invalidate caches
  101. */
  102. ori r3, r3, (HID0_ICE | HID0_ICFI | HID0_DCI | HID0_DCE)
  103. or r4, r4, r3
  104. isync
  105. mtspr HID0, r4
  106. andc r4, r4, r3
  107. isync
  108. mtspr HID0, r4
  109. isync
  110. /*
  111. * icache_enable
  112. */
  113. mfspr r3, HID0
  114. ori r3, r3, (HID0_ICE | HID0_ICFI)
  115. sync
  116. mtspr HID0, r3
  117. lis r1, 0xfec0
  118. ori r1, r1, 0x0cf8
  119. lis r2, 0xfee0
  120. ori r2, r2, 0xcfc
  121. #ifdef CONFIG_SYS_ADDRESS_MAP_A
  122. /*
  123. * Switch to address map A if necessary.
  124. */
  125. lis r3, MPC106_REG@h
  126. ori r3, r3, PCI_PICR1
  127. stwbrx r3, 0, r1
  128. sync
  129. lwbrx r4, 0, r2
  130. sync
  131. lis r0, PICR1_XIO_MODE@h
  132. ori r0, r0, PICR1_XIO_MODE@l
  133. andc r4, r4, r0
  134. lis r0, PICR1_ADDRESS_MAP@h
  135. ori r0, r0, PICR1_ADDRESS_MAP@l
  136. or r4, r4, r0
  137. stwbrx r4, 0, r2
  138. sync
  139. #endif
  140. /*
  141. * Do the init for the SIO.
  142. */
  143. bl .sioInit
  144. addi r3, r13, (MinitLogo-MessageBlock)
  145. bl Printf
  146. addi r3, r13, (Mspd01-MessageBlock)
  147. bl Printf
  148. /*
  149. * Memory cofiguration using SPD information stored on the SODIMMs
  150. */
  151. li r17, 0
  152. li r18, 0
  153. li r19, 0
  154. li r3, 0x0002 /* get RAM type from spd for bank0/1 */
  155. bl spdRead
  156. cmpi 0, 0, r3, -1 /* error ? */
  157. bne noSpdError
  158. addi r3, r13, (Mfail-MessageBlock)
  159. bl Printf
  160. li r6, 0xe0 /* error codes in r6 and r7 */
  161. li r7, 0x00
  162. b toggleError /* fail - loop forever */
  163. noSpdError:
  164. mr r15, r3 /* save r3 */
  165. addi r3, r13, (Mok-MessageBlock)
  166. bl Printf
  167. cmpli 0, 0, r15, 0x0001 /* FPM ? */
  168. beq configFPM
  169. cmpli 0, 0, r15, 0x0002 /* EDO ? */
  170. beq configEDO
  171. cmpli 0, 0, r15, 0x0004 /* SDRAM ? */
  172. beq configSDRAM
  173. li r6, 0xe0 /* error codes in r6 and r7 */
  174. li r7, 0x01
  175. b toggleError /* fail - loop forever */
  176. configSDRAM:
  177. addi r3, r13, (MsdRam-MessageBlock)
  178. bl Printf
  179. /*
  180. * set the Memory Configuration Reg. 1
  181. */
  182. li r3, 0x001f /* get bank size from spd bank0/1 */
  183. bl spdRead
  184. andi. r3, r3, 0x0038
  185. beq SD16MB2B
  186. li r3, 0x0011 /* get number of internal banks */
  187. /* from spd for bank0/1 */
  188. bl spdRead
  189. cmpli 0, 0, r3, 0x02
  190. beq SD64MB2B
  191. cmpli 0, 0, r3, 0x04
  192. beq SD64MB4B
  193. li r6, 0xe0 /* error codes in r6 and r7 */
  194. li r7, 0x02
  195. b toggleError /* fail - loop forever */
  196. SD64MB2B:
  197. li r20, 0x0005 /* 64-Mbit SDRAM 2 banks */
  198. b SDRow2nd
  199. SD64MB4B:
  200. li r20, 0x0000 /* 64-Mbit SDRAM 4 banks */
  201. b SDRow2nd
  202. SD16MB2B:
  203. li r20, 0x000f /* 16-Mbit SDRAM 2 banks */
  204. SDRow2nd:
  205. li r3, 0x0102 /* get RAM type spd for bank2/3 */
  206. bl spdRead
  207. cmpli 0, 0, r3, 0x0004
  208. bne S2D64MB4B /* bank2/3 isn't present or no SDRAM */
  209. li r3, 0x011f /* get bank size from spd bank2/3 */
  210. bl spdRead
  211. andi. r3, r3, 0x0038
  212. beq S2D16MB2B
  213. /*
  214. * set the Memory Configuration Reg. 2
  215. */
  216. li r3, 0x0111 /* get number of internal banks */
  217. /* from spd for bank2/3 */
  218. bl spdRead
  219. cmpli 0, 0, r3, 0x02
  220. beq S2D64MB2B
  221. cmpli 0, 0, r3, 0x04
  222. beq S2D64MB4B
  223. li r6, 0xe0 /* error codes in r6 and r7 */
  224. li r7, 0x03
  225. b toggleError /* fail - loop forever */
  226. S2D64MB2B:
  227. ori r20, r20, 0x0050 /* 64-Mbit SDRAM 2 banks */
  228. b S2D64MB4B
  229. S2D16MB2B:
  230. ori r20, r20, 0x00f0 /* 16-Mbit SDRAM 2 banks */
  231. /*
  232. * set the Memory Configuration Reg. 3
  233. */
  234. S2D64MB4B:
  235. lis r21, 0x8630 /* BSTOPRE = 0x80, REFREC = 6, */
  236. /* RDLAT = 3 */
  237. /*
  238. * set the Memory Configuration Reg. 4
  239. */
  240. lis r22, 0x2430 /* PRETOACT = 2, ACTOPRE = 4, */
  241. /* WCBUF = 1, RCBUF = 1 */
  242. ori r22, r22, 0x2220 /* SDMODE = 0x022, ACTORW = 2 */
  243. /*
  244. * get the size of bank 0-3
  245. */
  246. li r3, 0x001f /* get bank size from spd bank0/1 */
  247. bl spdRead
  248. rlwinm r16, r3, 2, 24, 29 /* calculate size in MByte */
  249. /* (128 MB max.) */
  250. li r3, 0x0005 /* get number of banks from spd */
  251. /* for bank0/1 */
  252. bl spdRead
  253. cmpi 0, 0, r3, 2 /* 2 banks ? */
  254. bne SDRAMnobank1
  255. mr r17, r16
  256. SDRAMnobank1:
  257. addi r3, r13, (Mspd23-MessageBlock)
  258. bl Printf
  259. li r3, 0x0102 /* get RAM type spd for bank2/3 */
  260. bl spdRead
  261. cmpli 0, 0, r3, 0x0001 /* FPM ? */
  262. bne noFPM23 /* handle as EDO */
  263. addi r3, r13, (Mok-MessageBlock)
  264. bl Printf
  265. addi r3, r13, (MfpmRam-MessageBlock)
  266. bl Printf
  267. b configRAMcommon
  268. noFPM23:
  269. cmpli 0, 0, r3, 0x0002 /* EDO ? */
  270. bne noEDO23
  271. addi r3, r13, (Mok-MessageBlock)
  272. bl Printf
  273. addi r3, r13, (MedoRam-MessageBlock)
  274. bl Printf
  275. b configRAMcommon
  276. noEDO23:
  277. cmpli 0, 0, r3, 0x0004 /* SDRAM ? */
  278. bne noSDRAM23
  279. addi r3, r13, (Mok-MessageBlock)
  280. bl Printf
  281. addi r3, r13, (MsdRam-MessageBlock)
  282. bl Printf
  283. b configSDRAM23
  284. noSDRAM23:
  285. addi r3, r13, (Mna-MessageBlock)
  286. bl Printf
  287. b configRAMcommon /* bank2/3 isn't present or no SDRAM */
  288. configSDRAM23:
  289. li r3, 0x011f /* get bank size from spd bank2/3 */
  290. bl spdRead
  291. rlwinm r18, r3, 2, 24, 29 /* calculate size in MByte */
  292. /* (128 MB max.) */
  293. li r3, 0x0105 /* get number of banks from */
  294. /* spd bank0/1 */
  295. bl spdRead
  296. cmpi 0, 0, r3, 2 /* 2 banks ? */
  297. bne SDRAMnobank3
  298. mr r19, r18
  299. SDRAMnobank3:
  300. b configRAMcommon
  301. configFPM:
  302. addi r3, r13, (MfpmRam-MessageBlock)
  303. bl Printf
  304. b configEDO0
  305. /*
  306. * set the Memory Configuration Reg. 1
  307. */
  308. configEDO:
  309. addi r3, r13, (MedoRam-MessageBlock)
  310. bl Printf
  311. configEDO0:
  312. lis r20, MCCR1_TYPE_EDO@h
  313. getSpdRowBank01:
  314. li r3, 0x0003 /* get number of row bits from */
  315. /* spd from bank0/1 */
  316. bl spdRead
  317. ori r20, r20, (MCCR1_BK0_9BITS | MCCR1_BK1_9BITS)
  318. cmpli 0, 0, r3, 0x0009 /* bank0 - 9 row bits */
  319. beq getSpdRowBank23
  320. ori r20, r20, (MCCR1_BK0_10BITS | MCCR1_BK1_10BITS)
  321. cmpli 0, 0, r3, 0x000a /* bank0 - 10 row bits */
  322. beq getSpdRowBank23
  323. ori r20, r20, (MCCR1_BK0_11BITS | MCCR1_BK1_11BITS)
  324. cmpli 0, 0, r3, 0x000b /* bank0 - 11 row bits */
  325. beq getSpdRowBank23
  326. ori r20, r20, (MCCR1_BK0_12BITS | MCCR1_BK1_12BITS)
  327. cmpli 0, 0, r3, 0x000c /* bank0 - 12 row bits */
  328. beq getSpdRowBank23
  329. cmpli 0, 0, r3, 0x000d /* bank0 - 13 row bits */
  330. beq getSpdRowBank23
  331. li r6, 0xe0 /* error codes in r6 and r7 */
  332. li r7, 0x10
  333. b toggleError /* fail - loop forever */
  334. getSpdRowBank23:
  335. li r3, 0x0103 /* get number of row bits from */
  336. /* spd for bank2/3 */
  337. bl spdRead
  338. ori r20, r20, (MCCR1_BK2_9BITS | MCCR1_BK3_9BITS)
  339. cmpli 0, 0, r3, 0x0009 /* bank0 - 9 row bits */
  340. beq writeRowBits
  341. ori r20, r20, (MCCR1_BK2_10BITS | MCCR1_BK3_10BITS)
  342. cmpli 0, 0, r3, 0x000a /* bank0 - 10 row bits */
  343. beq writeRowBits
  344. ori r20, r20, (MCCR1_BK2_11BITS | MCCR1_BK3_11BITS)
  345. cmpli 0, 0, r3, 0x000b /* bank0 - 11 row bits */
  346. beq writeRowBits
  347. ori r20, r20, (MCCR1_BK2_12BITS | MCCR1_BK3_12BITS)
  348. /*
  349. * set the Memory Configuration Reg. 3
  350. */
  351. writeRowBits:
  352. lis r21, 0x000a /* CPX = 1, RAS6P = 4 */
  353. ori r21, r21, 0x2293 /* CAS5 = 2, CP4 = 1, */
  354. /* CAS3 = 2, RCD2 = 2, RP = 3 */
  355. /*
  356. * set the Memory Configuration Reg. 4
  357. */
  358. lis r22, 0x0010 /* all SDRAM parameter 0, */
  359. /* WCBUF flow through, */
  360. /* RCBUF registered */
  361. /*
  362. * get the size of bank 0-3
  363. */
  364. li r3, 0x0003 /* get row bits from spd bank0/1 */
  365. bl spdRead
  366. li r16, 0 /* bank size is: */
  367. /* (8*2^row*2^column)/0x100000 MB */
  368. ori r16, r16, 0x8000
  369. rlwnm r16, r16, r3, 0, 31
  370. li r3, 0x0004 /* get column bits from spd bank0/1 */
  371. bl spdRead
  372. rlwnm r16, r16, r3, 0, 31
  373. li r3, 0x0005 /* get number of banks from */
  374. /* spd for bank0/1 */
  375. bl spdRead
  376. cmpi 0, 0, r3, 2 /* 2 banks ? */
  377. bne EDOnobank1
  378. mr r17, r16
  379. EDOnobank1:
  380. addi r3, r13, (Mspd23-MessageBlock)
  381. bl Printf
  382. li r3, 0x0102 /* get RAM type spd for bank2/3 */
  383. bl spdRead
  384. cmpli 0, 0, r3, 0x0001 /* FPM ? */
  385. bne noFPM231 /* handle as EDO */
  386. addi r3, r13, (Mok-MessageBlock)
  387. bl Printf
  388. addi r3, r13, (MfpmRam-MessageBlock)
  389. bl Printf
  390. b EDObank2
  391. noFPM231:
  392. cmpli 0, 0, r3, 0x0002 /* EDO ? */
  393. bne noEDO231
  394. addi r3, r13, (Mok-MessageBlock)
  395. bl Printf
  396. addi r3, r13, (MedoRam-MessageBlock)
  397. bl Printf
  398. b EDObank2
  399. noEDO231:
  400. cmpli 0, 0, r3, 0x0004 /* SDRAM ? */
  401. bne noSDRAM231
  402. addi r3, r13, (Mok-MessageBlock)
  403. bl Printf
  404. addi r3, r13, (MsdRam-MessageBlock)
  405. bl Printf
  406. b configRAMcommon
  407. noSDRAM231:
  408. addi r3, r13, (Mfail-MessageBlock)
  409. bl Printf
  410. b configRAMcommon /* bank2/3 isn't present or no SDRAM */
  411. EDObank2:
  412. li r3, 0x0103 /* get row bits from spd for bank2/3 */
  413. bl spdRead
  414. li r18, 0 /* bank size is: */
  415. /* (8*2^row*2^column)/0x100000 MB */
  416. ori r18, r18, 0x8000
  417. rlwnm r18, r18, r3, 0, 31
  418. li r3, 0x0104 /* get column bits from spd bank2/3 */
  419. bl spdRead
  420. rlwnm r18, r18, r3, 0, 31
  421. li r3, 0x0105 /* get number of banks from */
  422. /* spd for bank2/3 */
  423. bl spdRead
  424. cmpi 0, 0, r3, 2 /* 2 banks ? */
  425. bne configRAMcommon
  426. mr r19, r18
  427. configRAMcommon:
  428. lis r1, MPC106_REG_ADDR@h
  429. ori r1, r1, MPC106_REG_ADDR@l
  430. lis r2, MPC106_REG_DATA@h
  431. ori r2, r2, MPC106_REG_DATA@l
  432. li r0, 0
  433. /*
  434. * If we are already running in RAM (debug mode), we should
  435. * NOT reset the MEMGO flag. Otherwise we will stop all memory
  436. * accesses.
  437. */
  438. #ifdef IN_RAM
  439. lis r4, MCCR1_MEMGO@h
  440. ori r4, r4, MCCR1_MEMGO@l
  441. or r20, r20, r4
  442. #endif
  443. /*
  444. * set the Memory Configuration Reg. 1
  445. */
  446. lis r3, MPC106_REG@h /* start building new reg number */
  447. ori r3, r3, MPC106_MCCR1 /* register number 0xf0 */
  448. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  449. eieio /* make sure mem. access is complete */
  450. stwbrx r20, r0, r2 /* write data to CONFIG_DATA */
  451. /*
  452. * set the Memory Configuration Reg. 3
  453. */
  454. lis r3, MPC106_REG@h /* start building new reg number */
  455. ori r3, r3, MPC106_MCCR3 /* register number 0xf8 */
  456. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  457. eieio /* make sure mem. access is complete */
  458. stwbrx r21, r0, r2 /* write data to CONFIG_DATA */
  459. /*
  460. * set the Memory Configuration Reg. 4
  461. */
  462. lis r3, MPC106_REG@h /* start building new reg number */
  463. ori r3, r3, MPC106_MCCR4 /* register number 0xfc */
  464. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  465. eieio /* make sure mem. access is complete */
  466. stwbrx r22, r0, r2 /* write data to CONFIG_DATA */
  467. /*
  468. * set the memory boundary registers for bank 0-3
  469. */
  470. li r20, 0
  471. li r23, 0
  472. li r24, 0
  473. subi r21, r16, 1 /* calculate end address bank0 */
  474. li r22, (MBER_BANK0)
  475. cmpi 0, 0, r17, 0 /* bank1 present ? */
  476. beq nobank1
  477. rlwinm r3, r16, 8, 16, 23 /* calculate start address of bank1 */
  478. or r20, r20, r3
  479. add r16, r16, r17 /* add to total memory size */
  480. subi r3, r16, 1 /* calculate end address of bank1 */
  481. rlwinm r3, r3, 8, 16, 23
  482. or r21, r21, r3
  483. ori r22, r22, (MBER_BANK1) /* enable bank1 */
  484. b bank2
  485. nobank1:
  486. ori r23, r23, 0x0300 /* set bank1 start to unused area */
  487. ori r24, r24, 0x0300 /* set bank1 end to unused area */
  488. bank2:
  489. cmpi 0, 0, r18, 0 /* bank2 present ? */
  490. beq nobank2
  491. andi. r3, r16, 0x00ff /* calculate start address of bank2 */
  492. andi. r4, r16, 0x0300
  493. rlwinm r3, r3, 16, 8, 15
  494. or r20, r20, r3
  495. rlwinm r3, r4, 8, 8, 15
  496. or r23, r23, r3
  497. add r16, r16, r18 /* add to total memory size */
  498. subi r3, r16, 1 /* calculate end address of bank2 */
  499. andi. r4, r3, 0x0300
  500. andi. r3, r3, 0x00ff
  501. rlwinm r3, r3, 16, 8, 15
  502. or r21, r21, r3
  503. rlwinm r3, r4, 8, 8, 15
  504. or r24, r24, r3
  505. ori r22, r22, (MBER_BANK2) /* enable bank2 */
  506. b bank3
  507. nobank2:
  508. lis r3, 0x0003
  509. or r23, r23, r3 /* set bank2 start to unused area */
  510. or r24, r24, r3 /* set bank2 end to unused area */
  511. bank3:
  512. cmpi 0, 0, r19, 0 /* bank3 present ? */
  513. beq nobank3
  514. andi. r3, r16, 0x00ff /* calculate start address of bank3 */
  515. andi. r4, r16, 0x0300
  516. rlwinm r3, r3, 24, 0, 7
  517. or r20, r20, r3
  518. rlwinm r3, r4, 16, 0, 7
  519. or r23, r23, r3
  520. add r16, r16, r19 /* add to total memory size */
  521. subi r3, r16, 1 /* calculate end address of bank3 */
  522. andi. r4, r3, 0x0300
  523. andi. r3, r3, 0x00ff
  524. rlwinm r3, r3, 24, 0, 7
  525. or r21, r21, r3
  526. rlwinm r3, r4, 16, 0, 7
  527. or r24, r24, r3
  528. ori r22, r22, (MBER_BANK3) /* enable bank3 */
  529. b writebound
  530. nobank3:
  531. lis r3, 0x0300
  532. or r23, r23, r3 /* set bank3 start to unused area */
  533. or r24, r24, r3 /* set bank3 end to unused area */
  534. writebound:
  535. lis r3, MPC106_REG@h /* start building new reg number */
  536. ori r3, r3, MPC106_MSAR1 /* register number 0x80 */
  537. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  538. eieio /* make sure mem. access is complete */
  539. stwbrx r20, r0, r2 /* write data to CONFIG_DATA */
  540. lis r3, MPC106_REG@h /* start building new reg number */
  541. ori r3, r3, MPC106_MEAR1 /* register number 0x90 */
  542. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  543. eieio /* make sure mem. access is complete */
  544. stwbrx r21, r0, r2 /* write data to CONFIG_DATA */
  545. lis r3, MPC106_REG@h /* start building new reg number */
  546. ori r3, r3, MPC106_EMSAR1 /* register number 0x88 */
  547. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  548. eieio /* make sure mem. access is complete */
  549. stwbrx r23, r0, r2 /* write data to CONFIG_DATA */
  550. lis r3, MPC106_REG@h /* start building new reg number */
  551. ori r3, r3, MPC106_EMEAR1 /* register number 0x98 */
  552. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  553. eieio /* make sure mem. access is complete */
  554. stwbrx r24, r0, r2 /* write data to CONFIG_DATA */
  555. /*
  556. * set boundaries of unused banks to unused address space
  557. */
  558. lis r4, 0x0303
  559. ori r4, r4, 0x0303 /* bank 4-7 start and end adresses */
  560. lis r3, MPC106_REG@h /* start building new reg number */
  561. ori r3, r3, MPC106_EMSAR2 /* register number 0x8C */
  562. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  563. eieio /* make sure mem. access is complete */
  564. stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
  565. lis r3, MPC106_REG@h /* start building new reg number */
  566. ori r3, r3, MPC106_EMEAR2 /* register number 0x9C */
  567. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  568. eieio /* make sure mem. access is complete */
  569. stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
  570. /*
  571. * set the Memory Configuration Reg. 2
  572. */
  573. lis r3, MPC106_REG@h /* start building new reg number */
  574. ori r3, r3, MPC106_MCCR2 /* register number 0xf4 */
  575. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  576. eieio /* make sure mem. access is complete */
  577. li r3, 0x000c /* get refresh from spd for bank0/1 */
  578. bl spdRead
  579. cmpi 0, 0, r3, -1 /* error ? */
  580. bne common1
  581. li r6, 0xe0 /* error codes in r6 and r7 */
  582. li r7, 0x20
  583. b toggleError /* fail - loop forever */
  584. common1:
  585. andi. r15, r3, 0x007f /* mask selfrefresh bit */
  586. li r3, 0x010c /* get refresh from spd for bank2/3 */
  587. bl spdRead
  588. cmpi 0, 0, r3, -1 /* error ? */
  589. beq common2
  590. andi. r3, r3, 0x007f /* mask selfrefresh bit */
  591. cmp 0, 0, r3, r15 /* find the lower */
  592. blt common3
  593. common2:
  594. mr r3, r15
  595. common3:
  596. li r4, 0x1010 /* refesh cycle 1028 clocks */
  597. /* left shifted 2 */
  598. cmpli 0, 0, r3, 0x0000 /* 15.6 us ? */
  599. beq writeRefresh
  600. li r4, 0x0808 /* refesh cycle 514 clocks */
  601. /* left shifted 2 */
  602. cmpli 0, 0, r3, 0x0002 /* 7.8 us ? */
  603. beq writeRefresh
  604. li r4, 0x2020 /* refesh cycle 2056 clocks */
  605. /* left shifted 2 */
  606. cmpli 0, 0, r3, 0x0003 /* 31.3 us ? */
  607. beq writeRefresh
  608. li r4, 0x4040 /* refesh cycle 4112 clocks */
  609. /* left shifted 2 */
  610. cmpli 0, 0, r3, 0x0004 /* 62.5 us ? */
  611. beq writeRefresh
  612. li r4, 0
  613. ori r4, r4, 0x8080 /* refesh cycle 8224 clocks */
  614. /* left shifted 2 */
  615. cmpli 0, 0, r3, 0x0005 /* 125 us ? */
  616. beq writeRefresh
  617. li r6, 0xe0 /* error codes in r6 and r7 */
  618. li r7, 0x21
  619. b toggleError /* fail - loop forever */
  620. writeRefresh:
  621. stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
  622. /*
  623. * DRAM BANKS SHOULD BE ENABLED
  624. */
  625. addi r3, r13, (Mactivate-MessageBlock)
  626. bl Printf
  627. mr r3, r16
  628. bl OutDec
  629. addi r3, r13, (Mmbyte-MessageBlock)
  630. bl Printf
  631. lis r3, MPC106_REG@h /* start building new reg number */
  632. ori r3, r3, MPC106_MBER /* register number 0xa0 */
  633. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  634. eieio /* make sure mem. access is complete */
  635. stb r22, 0(r2) /* write data to CONFIG_DATA */
  636. li r8, 0x63 /* PGMAX = 99 */
  637. stb r8, 3(r2) /* write data to CONFIG_DATA */
  638. /*
  639. * DRAM SHOULD NOW BE CONFIGURED AND ENABLED
  640. * MUST WAIT 200us BEFORE ACCESSING
  641. */
  642. li r0, 0x7800
  643. mtctr r0
  644. wait200us:
  645. bdnz wait200us
  646. lis r3, MPC106_REG@h /* start building new reg number */
  647. ori r3, r3, MPC106_MCCR1 /* register number 0xf0 */
  648. stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
  649. eieio /* make sure mem. access is complete */
  650. lwbrx r4, r0, r2 /* load r4 from CONFIG_DATA */
  651. lis r0, MCCR1_MEMGO@h /* MEMGO=1 */
  652. ori r0, r0, MCCR1_MEMGO@l
  653. or r4, r4, r0 /* set the MEMGO bit */
  654. stwbrx r4, r0, r2 /* write mdfd data to CONFIG_DATA */
  655. li r0, 0x7000
  656. mtctr r0
  657. wait8ref:
  658. bdnz wait8ref
  659. addi r3, r13, (Mok-MessageBlock)
  660. bl Printf
  661. mtlr r25
  662. blr
  663. /*
  664. * Infinite loop called in case of an error during RAM initialisation.
  665. * error codes in r6 and r7.
  666. */
  667. toggleError:
  668. li r0, 0
  669. lis r9, 127
  670. ori r9, r9, 65535
  671. toggleError1:
  672. addic r0, r0, 1
  673. cmpw cr1, r0, r9
  674. ble cr1, toggleError1
  675. li r0, 0
  676. lis r9, 127
  677. ori r9, r9, 65535
  678. toggleError2:
  679. addic r0, r0, 1
  680. cmpw cr1, r0, r9
  681. ble cr1, toggleError2
  682. b toggleError
  683. /******************************************************************************
  684. * This function performs a basic initialisation of the superio chip
  685. * to enable basic console output and SPD access during RAM initialisation.
  686. *
  687. * Upon completion, SIO resource registers are mapped as follows:
  688. * Resource Enabled Address
  689. * UART1 Yes 3F8-3FF COM1
  690. * UART2 Yes 2F8-2FF COM2
  691. * GPIO Yes 220-227
  692. */
  693. .set SIO_LUNINDEX, 0x07 /* SIO LUN index register */
  694. .set SIO_CNFG1, 0x21 /* SIO configuration #1 register */
  695. .set SIO_PCSCI, 0x23 /* SIO PCS configuration index reg */
  696. .set SIO_PCSCD, 0x24 /* SIO PCS configuration data reg */
  697. .set SIO_ACTIVATE, 0x30 /* SIO activate register */
  698. .set SIO_IOBASEHI, 0x60 /* SIO I/O port base address, 15:8 */
  699. .set SIO_IOBASELO, 0x61 /* SIO I/O port base address, 7:0 */
  700. .set SIO_LUNENABLE, 0x01 /* SIO LUN enable */
  701. .sioInit:
  702. mfspr r7, 8 /* save link register */
  703. .sioInit_87308:
  704. /*
  705. * Get base addr of ISA I/O space
  706. */
  707. lis r6, CONFIG_SYS_ISA_IO@h
  708. ori r6, r6, CONFIG_SYS_ISA_IO@l
  709. /*
  710. * Set offset to base address for config registers.
  711. */
  712. #if defined(CONFIG_SYS_NS87308_BADDR_0x)
  713. addi r4, r0, 0x0279
  714. #elif defined(CONFIG_SYS_NS87308_BADDR_10)
  715. addi r4, r0, 0x015C
  716. #elif defined(CONFIG_SYS_NS87308_BADDR_11)
  717. addi r4, r0, 0x002E
  718. #endif
  719. add r6, r6, r4 /* add offset to base */
  720. or r3, r6, r6 /* make a copy */
  721. /*
  722. * PMC (LUN 8)
  723. */
  724. addi r4, r0, SIO_LUNINDEX /* select PMC LUN */
  725. addi r5, r0, 0x8
  726. bl .sio_bw
  727. addi r4, r0, SIO_IOBASEHI /* initialize PMC address to 0x460 */
  728. addi r5, r0, 0x04
  729. bl .sio_bw
  730. addi r4, r0, SIO_IOBASELO
  731. addi r5, r0, 0x60
  732. bl .sio_bw
  733. addi r4, r0, SIO_ACTIVATE /* enable PMC */
  734. addi r5, r0, SIO_LUNENABLE
  735. bl .sio_bw
  736. lis r8, CONFIG_SYS_ISA_IO@h
  737. ori r8, r8, 0x0460
  738. li r9, 0x03
  739. stb r9, 0(r8) /* select PMC2 register */
  740. eieio
  741. li r9, 0x00
  742. stb r9, 1(r8) /* SuperI/O clock src: 24MHz via X1 */
  743. eieio
  744. /*
  745. * map UART1 (LUN 6) or UART2 (LUN 5) to COM1 (0x3F8)
  746. */
  747. addi r4, r0, SIO_LUNINDEX /* select COM1 LUN */
  748. addi r5, r0, 0x6
  749. bl .sio_bw
  750. addi r4, r0, SIO_IOBASEHI /* initialize COM1 address to 0x3F8 */
  751. addi r5, r0, 0x03
  752. bl .sio_bw
  753. addi r4, r0, SIO_IOBASELO
  754. addi r5, r0, 0xF8
  755. bl .sio_bw
  756. addi r4, r0, SIO_ACTIVATE /* enable COM1 */
  757. addi r5, r0, SIO_LUNENABLE
  758. bl .sio_bw
  759. /*
  760. * Init COM1 for polled output
  761. */
  762. lis r8, CONFIG_SYS_ISA_IO@h
  763. ori r8, r8, 0x03f8
  764. li r9, 0x00
  765. stb r9, 1(r8) /* int disabled */
  766. eieio
  767. li r9, 0x00
  768. stb r9, 4(r8) /* modem ctrl */
  769. eieio
  770. li r9, 0x80
  771. stb r9, 3(r8) /* link ctrl, bank select */
  772. eieio
  773. li r9, 115200/CONFIG_BAUDRATE
  774. stb r9, 0(r8) /* baud rate (LSB)*/
  775. eieio
  776. rotrwi r9, r9, 8
  777. stb r9, 1(r8) /* baud rate (MSB) */
  778. eieio
  779. li r9, 0x03
  780. stb r9, 3(r8) /* 8 data bits, 1 stop bit, */
  781. /* no parity */
  782. eieio
  783. li r9, 0x0b
  784. stb r9, 4(r8) /* enable the receiver and transmitter */
  785. eieio
  786. waitEmpty:
  787. lbz r9, 5(r8) /* transmit empty */
  788. andi. r9, r9, 0x40
  789. beq waitEmpty
  790. li r9, 0x47
  791. stb r9, 3(r8) /* send break, 8 data bits, */
  792. /* 2 stop bits, no parity */
  793. eieio
  794. lis r0, 0x0001
  795. mtctr r0
  796. waitCOM1:
  797. lwz r0, 5(r8) /* load from port for delay */
  798. bdnz waitCOM1
  799. waitEmpty1:
  800. lbz r9, 5(r8) /* transmit empty */
  801. andi. r9, r9, 0x40
  802. beq waitEmpty1
  803. li r9, 0x07
  804. stb r9, 3(r8) /* 8 data bits, 2 stop bits, */
  805. /* no parity */
  806. eieio
  807. /*
  808. * GPIO (LUN 7)
  809. */
  810. addi r4, r0, SIO_LUNINDEX /* select GPIO LUN */
  811. addi r5, r0, 0x7
  812. bl .sio_bw
  813. addi r4, r0, SIO_IOBASEHI /* initialize GPIO address to 0x220 */
  814. addi r5, r0, 0x02
  815. bl .sio_bw
  816. addi r4, r0, SIO_IOBASELO
  817. addi r5, r0, 0x20
  818. bl .sio_bw
  819. addi r4, r0, SIO_ACTIVATE /* enable GPIO */
  820. addi r5, r0, SIO_LUNENABLE
  821. bl .sio_bw
  822. .sioInit_done:
  823. /*
  824. * Get base addr of ISA I/O space
  825. */
  826. lis r3, CONFIG_SYS_ISA_IO@h
  827. ori r3, r3, CONFIG_SYS_ISA_IO@l
  828. addi r3, r3, 0x015C /* adjust to superI/O 87308 base */
  829. or r6, r3, r3 /* make a copy */
  830. /*
  831. * CS0
  832. */
  833. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  834. addi r5, r0, 0x00
  835. bl .sio_bw
  836. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  837. addi r5, r0, 0x00
  838. bl .sio_bw
  839. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  840. addi r5, r0, 0x01
  841. bl .sio_bw
  842. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  843. addi r5, r0, 0x76
  844. bl .sio_bw
  845. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  846. addi r5, r0, 0x02
  847. bl .sio_bw
  848. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  849. addi r5, r0, 0x40
  850. bl .sio_bw
  851. /*
  852. * CS1
  853. */
  854. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  855. addi r5, r0, 0x05
  856. bl .sio_bw
  857. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  858. addi r5, r0, 0x00
  859. bl .sio_bw
  860. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  861. addi r5, r0, 0x05
  862. bl .sio_bw
  863. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  864. addi r5, r0, 0x70
  865. bl .sio_bw
  866. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  867. addi r5, r0, 0x06
  868. bl .sio_bw
  869. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  870. addi r5, r0, 0x1C
  871. bl .sio_bw
  872. /*
  873. * CS2
  874. */
  875. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  876. addi r5, r0, 0x08
  877. bl .sio_bw
  878. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  879. addi r5, r0, 0x00
  880. bl .sio_bw
  881. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  882. addi r5, r0, 0x09
  883. bl .sio_bw
  884. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  885. addi r5, r0, 0x71
  886. bl .sio_bw
  887. addi r4, r0, SIO_PCSCI /* select PCSCIR */
  888. addi r5, r0, 0x0A
  889. bl .sio_bw
  890. addi r4, r0, SIO_PCSCD /* select PCSCDR */
  891. addi r5, r0, 0x1C
  892. bl .sio_bw
  893. mtspr 8, r7 /* restore link register */
  894. bclr 20, 0 /* return to caller */
  895. /*
  896. * this function writes a register to the SIO chip
  897. */
  898. .sio_bw:
  899. stb r4, 0(r3) /* write index register with register offset */
  900. eieio
  901. sync
  902. stb r5, 1(r3) /* 1st write */
  903. eieio
  904. sync
  905. stb r5, 1(r3) /* 2nd write */
  906. eieio
  907. sync
  908. bclr 20, 0 /* return to caller */
  909. /*
  910. * this function reads a register from the SIO chip
  911. */
  912. .sio_br:
  913. stb r4, 0(r3) /* write index register with register offset */
  914. eieio
  915. sync
  916. lbz r3, 1(r3) /* retrieve specified reg offset contents */
  917. eieio
  918. sync
  919. bclr 20, 0 /* return to caller */
  920. /*
  921. * Print a message to COM1 in polling mode
  922. * r10=COM1 port, r3=(char*)string
  923. */
  924. .globl Printf
  925. Printf:
  926. lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
  927. ori r10, r10, 0x03f8
  928. WaitChr:
  929. lbz r0, 5(r10) /* read link status */
  930. eieio
  931. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  932. beq cr0, WaitChr /* wait till empty */
  933. lbzx r0, r0, r3 /* get char */
  934. stb r0, 0(r10) /* write to transmit reg */
  935. eieio
  936. addi r3, r3, 1 /* next char */
  937. lbzx r0, r0, r3 /* get char */
  938. cmpwi cr1, r0, 0 /* end of string ? */
  939. bne cr1, WaitChr
  940. blr
  941. /*
  942. * Print 8/4/2 digits hex value to COM1 in polling mode
  943. * r10=COM1 port, r3=val
  944. */
  945. OutHex2:
  946. li r9, 4 /* shift reg for 2 digits */
  947. b OHstart
  948. OutHex4:
  949. li r9, 12 /* shift reg for 4 digits */
  950. b OHstart
  951. .globl OutHex
  952. OutHex:
  953. li r9, 28 /* shift reg for 8 digits */
  954. OHstart:
  955. lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
  956. ori r10, r10, 0x03f8
  957. OutDig:
  958. lbz r0, 5(r10) /* read link status */
  959. eieio
  960. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  961. beq cr0, OutDig
  962. sraw r0, r3, r9
  963. clrlwi r0, r0, 28
  964. cmpwi cr1, r0, 9
  965. ble cr1, digIsNum
  966. addic r0, r0, 55
  967. b nextDig
  968. digIsNum:
  969. addic r0, r0, 48
  970. nextDig:
  971. stb r0, 0(r10) /* write to transmit reg */
  972. eieio
  973. addic. r9, r9, -4
  974. bge OutDig
  975. blr
  976. /*
  977. * Print 3 digits hdec value to COM1 in polling mode
  978. * r10=COM1 port, r3=val, r7=x00, r8=x0, r9=x, r0, r6=scratch
  979. */
  980. .globl OutDec
  981. OutDec:
  982. li r6, 10
  983. divwu r0, r3, r6 /* r0 = r3 / 10, r9 = r3 mod 10 */
  984. mullw r10, r0, r6
  985. subf r9, r10, r3
  986. mr r3, r0
  987. divwu r0, r3, r6 /* r0 = r3 / 10, r8 = r3 mod 10 */
  988. mullw r10, r0, r6
  989. subf r8, r10, r3
  990. mr r3, r0
  991. divwu r0, r3, r6 /* r0 = r3 / 10, r7 = r3 mod 10 */
  992. mullw r10, r0, r6
  993. subf r7, r10, r3
  994. lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
  995. ori r10, r10, 0x03f8
  996. or. r7, r7, r7
  997. bne noblank1
  998. li r3, 0x20
  999. b OutDec4
  1000. noblank1:
  1001. addi r3, r7, 48 /* convert to ASCII */
  1002. OutDec4:
  1003. lbz r0, 0(r13) /* slow down dummy read */
  1004. lbz r0, 5(r10) /* read link status */
  1005. eieio
  1006. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  1007. beq cr0, OutDec4
  1008. stb r3, 0(r10) /* x00 to transmit */
  1009. eieio
  1010. or. r7, r7, r8
  1011. beq OutDec5
  1012. addi r3, r8, 48 /* convert to ASCII */
  1013. OutDec5:
  1014. lbz r0, 0(r13) /* slow down dummy read */
  1015. lbz r0, 5(r10) /* read link status */
  1016. eieio
  1017. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  1018. beq cr0, OutDec5
  1019. stb r3, 0(r10) /* x0 to transmit */
  1020. eieio
  1021. addi r3, r9, 48 /* convert to ASCII */
  1022. OutDec6:
  1023. lbz r0, 0(r13) /* slow down dummy read */
  1024. lbz r0, 5(r10) /* read link status */
  1025. eieio
  1026. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  1027. beq cr0, OutDec6
  1028. stb r3, 0(r10) /* x to transmit */
  1029. eieio
  1030. blr
  1031. /*
  1032. * Print a char to COM1 in polling mode
  1033. * r10=COM1 port, r3=char
  1034. */
  1035. .globl OutChr
  1036. OutChr:
  1037. lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
  1038. ori r10, r10, 0x03f8
  1039. OutChr1:
  1040. lbz r0, 5(r10) /* read link status */
  1041. eieio
  1042. andi. r0, r0, 0x40 /* mask transmitter empty bit */
  1043. beq cr0, OutChr1 /* wait till empty */
  1044. stb r3, 0(r10) /* write to transmit reg */
  1045. eieio
  1046. blr
  1047. /*
  1048. * Input: r3 adr to read
  1049. * Output: r3 val or -1 for error
  1050. */
  1051. spdRead:
  1052. mfspr r26, 8 /* save link register */
  1053. lis r30, CONFIG_SYS_ISA_IO@h
  1054. ori r30, r30, 0x220 /* GPIO Port 1 */
  1055. li r7, 0x00
  1056. li r8, 0x100
  1057. and. r5, r3, r8
  1058. beq spdbank0
  1059. li r12, 0x08
  1060. li r4, 0x10
  1061. li r6, 0x18
  1062. b spdRead1
  1063. spdbank0:
  1064. li r12, 0x20 /* set I2C data */
  1065. li r4, 0x40 /* set I2C clock */
  1066. li r6, 0x60 /* set I2C clock and data */
  1067. spdRead1:
  1068. li r8, 0x80
  1069. bl spdStart /* access I2C bus as master */
  1070. li r10, 0xa0 /* write to SPD */
  1071. bl spdWriteByte
  1072. bl spdReadAck /* ACK returns in r10 */
  1073. cmpw cr0, r10, r7
  1074. bne AckErr /* r10 must be 0, if ACK received */
  1075. mr r10, r3 /* adr to read */
  1076. bl spdWriteByte
  1077. bl spdReadAck
  1078. cmpw cr0, r10, r7
  1079. bne AckErr
  1080. bl spdStart
  1081. li r10, 0xa1 /* read from SPD */
  1082. bl spdWriteByte
  1083. bl spdReadAck
  1084. cmpw cr0, r10, r7
  1085. bne AckErr
  1086. bl spdReadByte /* return val in r10 */
  1087. bl spdWriteAck
  1088. bl spdStop /* release I2C bus */
  1089. mr r3, r10
  1090. mtspr 8, r26 /* restore link register */
  1091. blr
  1092. /*
  1093. * ACK error occurred
  1094. */
  1095. AckErr:
  1096. bl spdStop
  1097. orc r3, r0, r0 /* return -1 */
  1098. mtspr 8, r26 /* restore link register */
  1099. blr
  1100. /*
  1101. * Routines to read from RAM spd.
  1102. * r30 - GPIO Port1 address in all cases.
  1103. * r4 - clock mask for SPD
  1104. * r6 - port mask for SPD
  1105. * r12 - data mask for SPD
  1106. */
  1107. waitSpd:
  1108. li r0, 0x1000
  1109. mtctr r0
  1110. wSpd:
  1111. bdnz wSpd
  1112. bclr 20, 0 /* return to caller */
  1113. /*
  1114. * establish START condition on I2C bus
  1115. */
  1116. spdStart:
  1117. mfspr r27, 8 /* save link register */
  1118. stb r6, 0(r30) /* set SDA and SCL */
  1119. eieio
  1120. stb r6, 1(r30) /* switch GPIO to output */
  1121. eieio
  1122. bl waitSpd
  1123. stb r4, 0(r30) /* reset SDA */
  1124. eieio
  1125. bl waitSpd
  1126. stb r7, 0(r30) /* reset SCL */
  1127. eieio
  1128. bl waitSpd
  1129. mtspr 8, r27
  1130. bclr 20, 0 /* return to caller */
  1131. /*
  1132. * establish STOP condition on I2C bus
  1133. */
  1134. spdStop:
  1135. mfspr r27, 8 /* save link register */
  1136. stb r7, 0(r30) /* reset SCL and SDA */
  1137. eieio
  1138. stb r6, 1(r30) /* switch GPIO to output */
  1139. eieio
  1140. bl waitSpd
  1141. stb r4, 0(r30) /* set SCL */
  1142. eieio
  1143. bl waitSpd
  1144. stb r6, 0(r30) /* set SDA and SCL */
  1145. eieio
  1146. bl waitSpd
  1147. stb r7, 1(r30) /* switch GPIO to input */
  1148. eieio
  1149. mtspr 8, r27
  1150. bclr 20, 0 /* return to caller */
  1151. spdReadByte:
  1152. mfspr r27, 8
  1153. stb r4, 1(r30) /* set GPIO for SCL output */
  1154. eieio
  1155. li r9, 0x08
  1156. li r10, 0x00
  1157. loopRB:
  1158. stb r7, 0(r30) /* reset SDA and SCL */
  1159. eieio
  1160. bl waitSpd
  1161. stb r4, 0(r30) /* set SCL */
  1162. eieio
  1163. bl waitSpd
  1164. lbz r5, 0(r30) /* read from GPIO Port1 */
  1165. rlwinm r10, r10, 1, 0, 31
  1166. and. r5, r5, r12
  1167. beq clearBit
  1168. ori r10, r10, 0x01 /* append _1_ */
  1169. clearBit:
  1170. stb r7, 0(r30) /* reset SCL */
  1171. eieio
  1172. bl waitSpd
  1173. addic. r9, r9, -1
  1174. bne loopRB
  1175. mtspr 8, r27
  1176. bclr 20, 0 /* return (r10) to caller */
  1177. /*
  1178. * spdWriteByte writes bits 24 - 31 of r10 to I2C.
  1179. * r8 contains bit mask 0x80
  1180. */
  1181. spdWriteByte:
  1182. mfspr r27, 8 /* save link register */
  1183. li r9, 0x08 /* write octet */
  1184. and. r5, r10, r8
  1185. bne sWB1
  1186. stb r7, 0(r30) /* set SDA to _0_ */
  1187. eieio
  1188. b sWB2
  1189. sWB1:
  1190. stb r12, 0(r30) /* set SDA to _1_ */
  1191. eieio
  1192. sWB2:
  1193. stb r6, 1(r30) /* set GPIO to output */
  1194. eieio
  1195. loopWB:
  1196. and. r5, r10, r8
  1197. bne sWB3
  1198. stb r7, 0(r30) /* set SDA to _0_ */
  1199. eieio
  1200. b sWB4
  1201. sWB3:
  1202. stb r12, 0(r30) /* set SDA to _1_ */
  1203. eieio
  1204. sWB4:
  1205. bl waitSpd
  1206. and. r5, r10, r8
  1207. bne sWB5
  1208. stb r4, 0(r30) /* set SDA to _0_ and SCL */
  1209. eieio
  1210. b sWB6
  1211. sWB5:
  1212. stb r6, 0(r30) /* set SDA to _1_ and SCL */
  1213. eieio
  1214. sWB6:
  1215. bl waitSpd
  1216. and. r5, r10, r8
  1217. bne sWB7
  1218. stb r7, 0(r30) /* set SDA to _0_ and reset SCL */
  1219. eieio
  1220. b sWB8
  1221. sWB7:
  1222. stb r12, 0(r30) /* set SDA to _1_ and reset SCL */
  1223. eieio
  1224. sWB8:
  1225. bl waitSpd
  1226. rlwinm r10, r10, 1, 0, 31 /* next bit */
  1227. addic. r9, r9, -1
  1228. bne loopWB
  1229. mtspr 8, r27
  1230. bclr 20, 0 /* return to caller */
  1231. /*
  1232. * Read ACK from SPD, return value in r10
  1233. */
  1234. spdReadAck:
  1235. mfspr r27, 8 /* save link register */
  1236. stb r4, 1(r30) /* set GPIO to output */
  1237. eieio
  1238. stb r7, 0(r30) /* reset SDA and SCL */
  1239. eieio
  1240. bl waitSpd
  1241. stb r4, 0(r30) /* set SCL */
  1242. eieio
  1243. bl waitSpd
  1244. lbz r10, 0(r30) /* read GPIO Port 1 and mask SDA */
  1245. and r10, r10, r12
  1246. bl waitSpd
  1247. stb r7, 0(r30) /* reset SDA and SCL */
  1248. eieio
  1249. bl waitSpd
  1250. mtspr 8, r27
  1251. bclr 20, 0 /* return (r10) to caller */
  1252. spdWriteAck:
  1253. mfspr r27, 8
  1254. stb r12, 0(r30) /* set SCL */
  1255. eieio
  1256. stb r6, 1(r30) /* set GPIO to output */
  1257. eieio
  1258. bl waitSpd
  1259. stb r6, 0(r30) /* SDA and SCL */
  1260. eieio
  1261. bl waitSpd
  1262. stb r12, 0(r30) /* reset SCL */
  1263. eieio
  1264. bl waitSpd
  1265. mtspr 8, r27
  1266. bclr 20, 0 /* return to caller */
  1267. get_lnk_reg:
  1268. mflr r3 /* return link reg */
  1269. blr
  1270. /*
  1271. * Messages for console output
  1272. */
  1273. .globl MessageBlock
  1274. MessageBlock:
  1275. Mok:
  1276. .ascii "OK\015\012\000"
  1277. Mfail:
  1278. .ascii "FAILED\015\012\000"
  1279. Mna:
  1280. .ascii "NA\015\012\000"
  1281. MinitLogo:
  1282. .ascii "\015\012*** ELTEC Elektronik, Mainz ***\015\012"
  1283. .ascii "\015\012Initialising RAM\015\012\000"
  1284. Mspd01:
  1285. .ascii " Reading SPD of bank0/1 ..... \000"
  1286. Mspd23:
  1287. .ascii " Reading SPD of bank2/3 ..... \000"
  1288. MfpmRam:
  1289. .ascii " RAM-Type: FPM \015\012\000"
  1290. MedoRam:
  1291. .ascii " RAM-Type: EDO \015\012\000"
  1292. MsdRam:
  1293. .ascii " RAM-Type: SDRAM \015\012\000"
  1294. Mactivate:
  1295. .ascii " Activating \000"
  1296. Mmbyte:
  1297. .ascii " MB .......... \000"
  1298. .align 4