asm_init.S 42 KB

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