]>
Commit | Line | Data |
---|---|---|
afd7f3d0 WD |
1 | #include <ppc_asm.tmpl> |
2 | #include <mpc824x.h> | |
3 | #include <ppc_defs.h> | |
4 | #include <asm/cache.h> | |
5 | #include <asm/mmu.h> | |
6 | ||
7 | #define USE_V2_INIT 1 /* Jimmy Blair's initialization. */ | |
8 | ||
9 | ||
10 | /* | |
11 | * Initialize the MMU using BAT entries and hardwired TLB | |
12 | * This obviates the need for any code in cpu_init_f which | |
13 | * configures the BAT registers. | |
14 | */ | |
15 | #define MEMORY_MGMT_MSR_BITS (MSR_DR | MSR_IR) /* Data and Inst Relocate */ | |
16 | .global iommu_setup | |
17 | /* Initialize IO/MMU mappings via BAT method Ch. 7, | |
18 | * PPC Programming Reference | |
19 | */ | |
20 | iommu_setup: | |
21 | ||
22 | /* initialize the BAT registers (SPRs 528 - 543 */ | |
23 | #define mtibat0u(x) mtspr 528,(x) /* SPR 528 (IBAT0U) */ | |
24 | #define mtibat0l(x) mtspr 529,(x) /* SPR 529 (IBAT0L) */ | |
25 | #define mtibat1u(x) mtspr 530,(x) /* SPR 530 (IBAT1U) */ | |
26 | #define mtibat1l(x) mtspr 531,(x) /* SPR 531 (IBAT1L) */ | |
27 | #define mtibat2u(x) mtspr 532,(x) /* SPR 532 (IBAT2U) */ | |
28 | #define mtibat2l(x) mtspr 533,(x) /* SPR 533 (IBAT2L) */ | |
29 | #define mtibat3u(x) mtspr 534,(x) /* SPR 534 (IBAT3U) */ | |
30 | #define mtibat3l(x) mtspr 535,(x) /* SPR 535 (IBAT3L) */ | |
31 | #define mtdbat0u(x) mtspr 536,(x) /* SPR 536 (DBAT0U) */ | |
32 | #define mtdbat0l(x) mtspr 537,(x) /* SPR 537 (DBAT0L) */ | |
33 | #define mtdbat1u(x) mtspr 538,(x) /* SPR 538 (DBAT1U) */ | |
34 | #define mtdbat1l(x) mtspr 539,(x) /* SPR 539 (DBAT1L) */ | |
35 | #define mtdbat2u(x) mtspr 540,(x) /* SPR 540 (DBAT2U) */ | |
36 | #define mtdbat2l(x) mtspr 541,(x) /* SPR 541 (DBAT2L) */ | |
37 | #define mtdbat3u(x) mtspr 542,(x) /* SPR 542 (DBAT3U) */ | |
38 | #define mtdbat3l(x) mtspr 543,(x) /* SPR 543 (DBAT3L) */ | |
39 | ||
40 | ||
41 | /* PowerPC processors do not necessarily initialize the BAT | |
42 | registers on power-up or reset. So they are in an unknown | |
43 | state. Before programming the BATs for the first time, all | |
44 | BAT registers MUST have their Vs and Vp bits cleared in the | |
45 | upper BAT half in order to avoid possibly having 2 BATs | |
46 | valid and mapping the same memory region. | |
47 | ||
48 | The reason for this is that, even with address translation | |
49 | disabled, multiple BAT hits for an address are treated as | |
50 | programming errors and can cause unpredictable results. | |
51 | ||
52 | It is up to the software to make sure it never has 2 IBAT | |
53 | mappings or 2 DBAT mappings that are valid for the same | |
54 | addresses. It is not necessary to perform this code | |
55 | sequence every time the BATs are programmed, only when | |
56 | there is a possibility that there may be overlapping BAT | |
57 | entries. | |
58 | ||
59 | When programming the BATs in non-reset scenarios, even if | |
60 | you are sure that your new mapping will not temporarily | |
61 | create overlapping regions, it is still a wise idea to | |
62 | invalidate a BAT entry by setting its upper BAT register to | |
63 | all 0's before programming it. This will avoid having a | |
64 | BAT marked valid that is in an unknown or transient state | |
65 | */ | |
66 | ||
67 | addis r5,0,0x0000 | |
68 | mtibat0u(r5) | |
69 | mtibat0l(r5) | |
70 | mtibat1u(r5) | |
71 | mtibat1l(r5) | |
72 | mtibat2u(r5) | |
73 | mtibat2l(r5) | |
74 | mtibat3u(r5) | |
75 | mtibat3l(r5) | |
76 | mtdbat0u(r5) | |
77 | mtdbat0l(r5) | |
78 | mtdbat1u(r5) | |
79 | mtdbat1l(r5) | |
80 | mtdbat2u(r5) | |
81 | mtdbat2l(r5) | |
82 | mtdbat3u(r5) | |
83 | mtdbat3l(r5) | |
84 | isync | |
85 | ||
86 | /* | |
87 | * Set up I/D BAT0 | |
88 | */ | |
89 | lis r4, CFG_DBAT0L@h | |
90 | ori r4, r4, CFG_DBAT0L@l | |
91 | lis r3, CFG_DBAT0U@h | |
92 | ori r3, r3, CFG_DBAT0U@l | |
93 | ||
94 | mtdbat0l(r4) | |
95 | isync | |
96 | mtdbat0u(r3) | |
97 | isync | |
98 | sync | |
99 | ||
100 | lis r4, CFG_IBAT0L@h | |
101 | ori r4, r4, CFG_IBAT0L@l | |
102 | lis r3, CFG_IBAT0U@h | |
103 | ori r3, r3, CFG_IBAT0U@l | |
104 | ||
105 | isync | |
106 | mtibat0l(r4) | |
107 | isync | |
108 | mtibat0u(r3) | |
109 | isync | |
110 | ||
111 | /* | |
112 | * Set up I/D BAT1 | |
113 | */ | |
114 | lis r4, CFG_IBAT1L@h | |
115 | ori r4, r4, CFG_IBAT1L@l | |
116 | lis r3, CFG_IBAT1U@h | |
117 | ori r3, r3, CFG_IBAT1U@l | |
118 | ||
119 | isync | |
120 | mtibat1l(r4) | |
121 | isync | |
122 | mtibat1u(r3) | |
123 | isync | |
124 | mtdbat1l(r4) | |
125 | isync | |
126 | mtdbat1u(r3) | |
127 | isync | |
128 | sync | |
129 | ||
130 | /* | |
131 | * Set up I/D BAT2 | |
132 | */ | |
133 | lis r4, CFG_IBAT2L@h | |
134 | ori r4, r4, CFG_IBAT2L@l | |
135 | lis r3, CFG_IBAT2U@h | |
136 | ori r3, r3, CFG_IBAT2U@l | |
137 | ||
138 | isync | |
139 | mtibat2l(r4) | |
140 | isync | |
141 | mtibat2u(r3) | |
142 | isync | |
143 | mtdbat2l(r4) | |
144 | isync | |
145 | mtdbat2u(r3) | |
146 | isync | |
147 | sync | |
148 | ||
149 | /* | |
150 | * Setup I/D BAT3 | |
151 | */ | |
152 | lis r4, CFG_IBAT3L@h | |
153 | ori r4, r4, CFG_IBAT3L@l | |
154 | lis r3, CFG_IBAT3U@h | |
155 | ori r3, r3, CFG_IBAT3U@l | |
156 | ||
157 | isync | |
158 | mtibat3l(r4) | |
159 | isync | |
160 | mtibat3u(r3) | |
161 | isync | |
162 | mtdbat3l(r4) | |
163 | isync | |
164 | mtdbat3u(r3) | |
165 | isync | |
166 | sync | |
167 | ||
168 | ||
169 | /* | |
170 | * Invalidate all 64 TLB's | |
171 | */ | |
172 | lis r3, 0 | |
173 | mtctr r3 | |
174 | lis r5, 4 | |
175 | ||
176 | tlblp: | |
177 | tlbie r3 | |
178 | sync | |
179 | addi r3, r3, 0x1000 | |
180 | cmplw r3, r5 | |
181 | blt tlblp | |
182 | ||
183 | sync | |
184 | ||
185 | /* | |
186 | * Enable Data Translation | |
187 | */ | |
188 | lis r4, MEMORY_MGMT_MSR_BITS@h | |
189 | ori r4, r4, MEMORY_MGMT_MSR_BITS@l | |
190 | mfmsr r3 | |
191 | or r3, r4, r3 | |
192 | mtmsr r3 | |
193 | isync | |
194 | sync | |
195 | ||
196 | blr | |
197 | ||
198 | ||
199 | #ifdef USE_V2_INIT | |
200 | /* #define USER_I_CACHE_ENABLE 1*/ /* Fast rom boots */ | |
201 | /* Macro for hiadjust and lo */ | |
202 | #define HIADJ(arg) arg@ha | |
203 | #define HI(arg) arg@h | |
204 | #define LO(arg) arg@l | |
205 | ||
206 | #undef LOADPTR | |
207 | #define LOADPTR(reg,const32) \ | |
208 | addis reg,r0,HIADJ(const32); addi reg,reg,LO(const32) | |
209 | ||
210 | .globl early_init_f | |
211 | ||
212 | early_init_f: | |
213 | /* MPC8245/BMW CPCI System Init | |
214 | * Jimmy Blair, Broadcom Corp, 2002. | |
215 | */ | |
216 | mflr r11 | |
217 | /* Zero-out registers */ | |
218 | ||
219 | addis r0,r0,0 | |
220 | mtspr SPRG0,r0 | |
221 | mtspr SPRG1,r0 | |
222 | mtspr SPRG2,r0 | |
223 | mtspr SPRG3,r0 | |
224 | ||
225 | /* Set MPU/MSR to a known state. Turn on FP */ | |
226 | ||
227 | LOADPTR (r3, MSR_FP) | |
228 | sync | |
229 | mtmsr r3 | |
230 | isync | |
231 | ||
232 | /* Init the floating point control/status register */ | |
233 | ||
234 | mtfsfi 7,0x0 | |
235 | mtfsfi 6,0x0 | |
236 | mtfsfi 5,0x0 | |
237 | mtfsfi 4,0x0 | |
238 | mtfsfi 3,0x0 | |
239 | mtfsfi 2,0x0 | |
240 | mtfsfi 1,0x0 | |
241 | mtfsfi 0,0x0 | |
242 | isync | |
243 | ||
244 | /* Set MPU/MSR to a known state. Turn off FP */ | |
245 | ||
246 | #if 1 /* Turn off floating point (remove to keep FP on) */ | |
247 | andi. r3, r3, 0 | |
248 | sync | |
249 | mtmsr r3 | |
250 | isync | |
251 | #endif | |
252 | ||
253 | /* Init the Segment registers */ | |
254 | ||
255 | andi. r3, r3, 0 | |
256 | isync | |
257 | mtsr 0,r3 | |
258 | isync | |
259 | mtsr 1,r3 | |
260 | isync | |
261 | mtsr 2,r3 | |
262 | isync | |
263 | mtsr 3,r3 | |
264 | isync | |
265 | mtsr 4,r3 | |
266 | isync | |
267 | mtsr 5,r3 | |
268 | isync | |
269 | mtsr 6,r3 | |
270 | isync | |
271 | mtsr 7,r3 | |
272 | isync | |
273 | mtsr 8,r3 | |
274 | isync | |
275 | mtsr 9,r3 | |
276 | isync | |
277 | mtsr 10,r3 | |
278 | isync | |
279 | mtsr 11,r3 | |
280 | isync | |
281 | mtsr 12,r3 | |
282 | isync | |
283 | mtsr 13,r3 | |
284 | isync | |
285 | mtsr 14,r3 | |
286 | isync | |
287 | mtsr 15,r3 | |
288 | isync | |
289 | ||
290 | /* Turn off data and instruction cache control bits */ | |
291 | ||
292 | mfspr r3, HID0 | |
293 | isync | |
294 | rlwinm r4, r3, 0, 18, 15 /* r4 has ICE and DCE bits cleared */ | |
295 | sync | |
296 | isync | |
297 | mtspr HID0, r4 /* HID0 = r4 */ | |
298 | isync | |
299 | ||
300 | /* Get cpu type */ | |
301 | ||
302 | mfspr r28, PVR | |
303 | rlwinm r28, r28, 16, 16, 31 | |
304 | ||
305 | /* invalidate the MPU's data/instruction caches */ | |
306 | ||
307 | lis r3, 0x0 | |
308 | cmpli 0, 0, r28, CPU_TYPE_603 | |
309 | beq cpuIs603 | |
310 | cmpli 0, 0, r28, CPU_TYPE_603E | |
311 | beq cpuIs603 | |
312 | cmpli 0, 0, r28, CPU_TYPE_603P | |
313 | beq cpuIs603 | |
314 | cmpli 0, 0, r28, CPU_TYPE_604R | |
315 | bne cpuNot604R | |
316 | ||
317 | cpuIs604R: | |
318 | lis r3, 0x0 | |
319 | mtspr HID0, r3 /* disable the caches */ | |
320 | isync | |
321 | ori r4, r4, 0x0002 /* disable BTAC by setting bit 30 */ | |
322 | ||
323 | cpuNot604R: | |
324 | ori r3, r3, (HID0_ICFI |HID0_DCI) | |
325 | ||
326 | cpuIs603: | |
327 | ori r3, r3, (HID0_ICE | HID0_DCE) | |
328 | or r4, r4, r3 /* set bits */ | |
329 | sync | |
330 | isync | |
331 | mtspr HID0, r4 /* HID0 = r4 */ | |
332 | andc r4, r4, r3 /* clear bits */ | |
333 | isync | |
334 | cmpli 0, 0, r28, CPU_TYPE_604 | |
335 | beq cpuIs604 | |
336 | cmpli 0, 0, r28, CPU_TYPE_604E | |
337 | beq cpuIs604 | |
338 | cmpli 0, 0, r28, CPU_TYPE_604R | |
339 | beq cpuIs604 | |
340 | mtspr HID0, r4 | |
341 | isync | |
342 | ||
343 | #ifdef USER_I_CACHE_ENABLE | |
344 | b instCacheOn603 | |
345 | #else | |
346 | b cacheEnableDone | |
347 | #endif | |
348 | ||
349 | cpuIs604: | |
350 | LOADPTR (r5, 0x1000) /* loop count, 0x1000 */ | |
351 | mtspr CTR, r5 | |
352 | loopDelay: | |
353 | nop | |
354 | bdnz loopDelay | |
355 | isync | |
356 | mtspr HID0, r4 | |
357 | isync | |
358 | ||
359 | /* turn the Instruction cache ON for faster FLASH ROM boots */ | |
360 | ||
361 | #ifdef USER_I_CACHE_ENABLE | |
362 | ||
363 | ori r4, r4, (HID0_ICE | HID0_ICFI) | |
364 | isync /* Synchronize for ICE enable */ | |
365 | b writeReg4 | |
366 | instCacheOn603: | |
367 | ori r4, r4, (HID0_ICE | HID0_ICFI) | |
368 | rlwinm r3, r4, 0, 21, 19 /* clear the ICFI bit */ | |
369 | ||
370 | /* | |
371 | * The setting of the instruction cache enable (ICE) bit must be | |
372 | * preceded by an isync instruction to prevent the cache from being | |
373 | * enabled or disabled while an instruction access is in progress. | |
374 | */ | |
375 | isync | |
376 | writeReg4: | |
377 | mtspr HID0, r4 /* Enable Instr Cache & Inval cache */ | |
378 | cmpli 0, 0, r28, CPU_TYPE_604 | |
379 | beq cacheEnableDone | |
380 | cmpli 0, 0, r28, CPU_TYPE_604E | |
381 | beq cacheEnableDone | |
382 | ||
383 | mtspr HID0, r3 /* using 2 consec instructions */ | |
384 | /* PPC603 recommendation */ | |
385 | #endif | |
386 | cacheEnableDone: | |
387 | ||
388 | /* Detect map A or B */ | |
389 | ||
390 | addis r5,r0, HI(CHRP_REG_ADDR) | |
391 | addis r6,r0, HI(CHRP_REG_DATA) | |
392 | LOADPTR (r7, KAHLUA_ID) /* Kahlua PCI controller ID */ | |
393 | LOADPTR (r8, BMC_BASE) | |
394 | ||
395 | stwbrx r8,0,(r5) | |
396 | lwbrx r3,0,(r6) /* Store read value to r3 */ | |
397 | cmp 0,0,r3,r7 | |
398 | beq cr0, X4_KAHLUA_START | |
399 | ||
400 | /* It's not an 8240, is it an 8245? */ | |
401 | ||
402 | LOADPTR (r7, KAHLUA2_ID) /* Kahlua PCI controller ID */ | |
403 | cmp 0,0,r3,r7 | |
404 | beq cr0, X4_KAHLUA_START | |
405 | ||
406 | /* Save the PCI controller type in r7 */ | |
407 | mr r7, r3 | |
408 | ||
409 | LOADPTR (r5, PREP_REG_ADDR) | |
410 | LOADPTR (r6, PREP_REG_DATA) | |
411 | ||
412 | X4_KAHLUA_START: | |
413 | /* MPC8245 changes begin here */ | |
414 | LOADPTR (r3, MPC107_PCI_CMD) /* PCI command reg */ | |
415 | stwbrx r3,0,r5 | |
416 | li r4, 6 /* Command register value */ | |
417 | sthbrx r4, 0, r6 | |
418 | ||
419 | LOADPTR (r3, MPC107_PCI_STAT) /* PCI status reg */ | |
420 | stwbrx r3,0,r5 | |
421 | li r4, -1 /* Write-to-clear all bits */ | |
422 | li r3, 2 /* PCI_STATUS is at +2 offset */ | |
423 | sthbrx r4, r3, r6 | |
424 | ||
425 | /*-------PROC_INT1_ADR */ | |
426 | ||
427 | LOADPTR (r3, PROC_INT1_ADR) /* Processor I/F Config 1 reg. */ | |
428 | stwbrx r3,0,r5 | |
429 | LOADPTR (r4, 0xff141b98) | |
430 | stwbrx r4,0,r6 | |
431 | ||
432 | /*-------PROC_INT2_ADR */ | |
433 | ||
434 | LOADPTR (r3, PROC_INT2_ADR) /* Processor I/F Config 2 reg. */ | |
435 | stwbrx r3,0,r5 | |
436 | lis r4, 0x2000 /* Flush PCI config writes */ | |
437 | stwbrx r4,0,r6 | |
438 | ||
439 | LOADPTR (r9, KAHLUA2_ID) | |
440 | cmpl 0, 0, r7, r9 | |
441 | bne L1not8245 | |
442 | ||
443 | /* MIOCR1 -- turn on bit for DLL delay */ | |
444 | ||
445 | LOADPTR (r3, MIOCR1_ADR_X) | |
446 | stwbrx r3,0,r5 | |
447 | li r4, 0x04 | |
448 | stb r4, MIOCR1_SHIFT(r6) | |
449 | ||
450 | /* For the MPC8245, set register 77 to %00100000 (see Errata #15) */ | |
451 | /* SDRAM_CLK_DEL (0x77)*/ | |
452 | ||
453 | LOADPTR (r3, MIOCR2_ADR_X) | |
454 | stwbrx r3,0,r5 | |
455 | li r4, 0x10 | |
456 | stb r4, MIOCR2_SHIFT(r6) | |
457 | ||
458 | /* PMCR2 -- set PCI hold delay to <10>b for 33 MHz */ | |
459 | ||
460 | LOADPTR (r3, PMCR2_ADR_X) | |
461 | stwbrx r3,0,r5 | |
462 | li r4, 0x20 | |
463 | stb r4, PMCR2_SHIFT(r6) | |
464 | ||
465 | /* Initialize EUMBBAR early since 8245 has internal UART in EUMB */ | |
466 | ||
467 | LOADPTR (r3, EUMBBAR) | |
468 | stwbrx r3,0,r5 | |
469 | LOADPTR (r4, CFG_EUMB_ADDR) | |
470 | stwbrx r4,0,r6 | |
471 | ||
472 | L1not8245: | |
473 | ||
474 | /* Toggle the DLL reset bit in AMBOR */ | |
475 | ||
476 | LOADPTR (r3, AMBOR) | |
477 | stwbrx r3,0,r5 | |
478 | lbz r4, 0(r6) | |
479 | ||
480 | andi. r4, r4, 0xdf | |
481 | stb r4, 0(r6) /* Clear DLL_RESET */ | |
482 | sync | |
483 | ||
484 | ori r4, r4, 0x20 /* Set DLL_RESET */ | |
485 | stb r4, 0(r6) | |
486 | sync | |
487 | ||
488 | andi. r4, r4, 0xdf | |
489 | stb r4, 0(r6) /* Clear DLL_RESET */ | |
490 | ||
491 | ||
492 | /* Enable RCS2, use supplied timings */ | |
493 | LOADPTR (r3, ERCR1) | |
494 | stwbrx r3,0,r5 | |
495 | LOADPTR (r4, 0x80408000) | |
496 | stwbrx r4,0,r6 | |
497 | ||
498 | /* Disable RCS3 parameters */ | |
499 | LOADPTR (r3, ERCR2) | |
500 | stwbrx r3,0,r5 | |
501 | LOADPTR (r4, 0x00000000) | |
502 | stwbrx r4,0,r6 | |
503 | ||
504 | /* RCS3 at 0x70000000, 64KBytes */ | |
505 | LOADPTR (r3, ERCR2) | |
506 | stwbrx r3,0,r5 | |
507 | LOADPTR (r4, 0x00000004) | |
508 | stwbrx r4,0,r6 | |
509 | ||
510 | /*-------MCCR1 */ | |
511 | ||
512 | #ifdef INCLUDE_ECC | |
513 | #define MC_ECC 1 | |
514 | #else /* INCLUDE_ECC */ | |
515 | #define MC_ECC 0 | |
516 | #endif /* INCLUDE_ECC */ | |
517 | ||
518 | #define MC1_ROMNAL 8 /* 0-15 */ | |
519 | #define MC1_ROMFAL 11 /* 0-31 */ | |
520 | #define MC1_DBUS_SIZE 0 /* 0-3, read only */ | |
521 | #define MC1_BURST 0 /* 0-1 */ | |
522 | #define MC1_MEMGO 0 /* 0-1 */ | |
523 | #define MC1_SREN 1 /* 0-1 */ | |
524 | #define MC1_RAM_TYPE 0 /* 0-1 */ | |
525 | #define MC1_PCKEN MC_ECC /* 0-1 */ | |
526 | #define MC1_BANKBITS 0x5555 /* 2 bits/bank 7-0 */ | |
527 | ||
528 | LOADPTR (r3, MEM_CONT1_ADR) /* Set MCCR1 (F0) */ | |
529 | stwbrx r3,0,r5 | |
530 | LOADPTR(r4, \ | |
531 | MC1_ROMNAL << 28 | MC1_ROMFAL << 23 | \ | |
532 | MC1_DBUS_SIZE << 21 | MC1_BURST << 20 | \ | |
533 | MC1_MEMGO << 19 | MC1_SREN << 18 | \ | |
534 | MC1_RAM_TYPE << 17 | MC1_PCKEN << 16 ) | |
535 | li r3, MC1_BANKBITS | |
536 | cmpl 0, 0, r7, r9 /* Check for Kahlua2 */ | |
537 | bne BankBitsAdd | |
538 | cmpli 0, 0, r3, 0x5555 | |
539 | beq K2BankBitsHack /* On 8245, 5555 ==> 0 */ | |
540 | BankBitsAdd: | |
541 | ori r4, r3, 0 | |
542 | K2BankBitsHack: | |
543 | stwbrx r4, 0, r6 | |
544 | ||
545 | /*------- MCCR2 */ | |
546 | ||
547 | #define MC2_TS_WAIT_TIMER 0 /* 0-7 */ | |
548 | #define MC2_ASRISE 8 /* 0-15 */ | |
549 | #define MC2_ASFALL 4 /* 0-15 */ | |
550 | #define MC2_INLINE_PAR_NOT_ECC 0 /* 0-1 */ | |
551 | #define MC2_WRITE_PARITY_CHK_EN MC_ECC /* 0-1 */ | |
552 | #define MC2_INLRD_PARECC_CHK_EN MC_ECC /* 0-1 */ | |
553 | #define MC2_ECC_EN 0 /* 0-1 */ | |
554 | #define MC2_EDO 0 /* 0-1 */ | |
555 | /* | |
556 | * N.B. This refresh interval looks good up to 85 MHz with Hynix SDRAM. | |
557 | * May need to be decreased for 100 MHz | |
558 | */ | |
559 | #define MC2_REFINT 0x3a5 /* 0-0x3fff */ | |
560 | #define MC2_RSV_PG 0 /* 0-1 */ | |
561 | #define MC2_RMW_PAR MC_ECC /* 0-1 */ | |
562 | ||
563 | LOADPTR (r3, MEM_CONT2_ADR) /* Set MCCR2 (F4) */ | |
564 | stwbrx r3,0,r5 | |
565 | LOADPTR(r4, \ | |
566 | MC2_TS_WAIT_TIMER << 29 | MC2_ASRISE << 25 | \ | |
567 | MC2_ASFALL << 21 | MC2_INLINE_PAR_NOT_ECC << 20 | \ | |
568 | MC2_WRITE_PARITY_CHK_EN << 19 | \ | |
569 | MC2_INLRD_PARECC_CHK_EN << 18 | \ | |
570 | MC2_ECC_EN << 17 | MC2_EDO << 16 | \ | |
571 | MC2_REFINT << 2 | MC2_RSV_PG << 1 | MC2_RMW_PAR) | |
572 | cmpl 0, 0, r7, r9 /* Check for Kahlua2 */ | |
573 | bne notK2 | |
574 | /* clear Kahlua2 reserved bits */ | |
575 | LOADPTR (r3, 0xfffcffff) | |
576 | and r4, r4, r3 | |
577 | notK2: | |
578 | stwbrx r4,0,r6 | |
579 | ||
580 | /*------- MCCR3 */ | |
581 | ||
582 | #define MC_BSTOPRE 0x079 /* 0-0x7ff */ | |
583 | ||
584 | #define MC3_BSTOPRE_U (MC_BSTOPRE >> 4 & 0xf) | |
585 | #define MC3_REFREC 8 /* 0-15 */ | |
586 | #define MC3_RDLAT (4+MC_ECC) /* 0-15 */ | |
587 | #define MC3_CPX 0 /* 0-1 */ | |
588 | #define MC3_RAS6P 0 /* 0-15 */ | |
589 | #define MC3_CAS5 0 /* 0-7 */ | |
590 | #define MC3_CP4 0 /* 0-7 */ | |
591 | #define MC3_CAS3 0 /* 0-7 */ | |
592 | #define MC3_RCD2 0 /* 0-7 */ | |
593 | #define MC3_RP1 0 /* 0-7 */ | |
594 | ||
595 | LOADPTR (r3, MEM_CONT3_ADR) /* Set MCCR3 (F8) */ | |
596 | stwbrx r3,0,r5 | |
597 | LOADPTR(r4, \ | |
598 | MC3_BSTOPRE_U << 28 | MC3_REFREC << 24 | \ | |
599 | MC3_RDLAT << 20 | MC3_CPX << 19 | \ | |
600 | MC3_RAS6P << 15 | MC3_CAS5 << 12 | MC3_CP4 << 9 | \ | |
601 | MC3_CAS3 << 6 | MC3_RCD2 << 3 | MC3_RP1) | |
602 | cmpl 0, 0, r7, r9 /* Check for Kahlua2 */ | |
603 | bne notK2b | |
604 | /* clear Kahlua2 reserved bits */ | |
605 | LOADPTR (r3, 0xff000000) | |
606 | and r4, r4, r3 | |
607 | notK2b: | |
608 | stwbrx r4,0,r6 | |
609 | ||
610 | /*------- MCCR4 */ | |
611 | ||
612 | #define MC4_PRETOACT 3 /* 0-15 */ | |
613 | #define MC4_ACTOPRE 5 /* 0-15 */ | |
614 | #define MC4_WMODE 0 /* 0-1 */ | |
615 | #define MC4_INLINE MC_ECC /* 0-1 */ | |
616 | #define MC4_REGISTERED (1-MC_ECC) /* 0-1 */ | |
617 | #define MC4_BSTOPRE_UU (MC_BSTOPRE >> 8 & 3) | |
618 | #define MC4_REGDIMM 0 /* 0-1 */ | |
619 | #define MC4_SDMODE_CAS 2 /* 0-7 */ | |
620 | #define MC4_DBUS_RCS1 1 /* 0-1, 8-bit */ | |
621 | #define MC4_SDMODE_WRAP 0 /* 0-1 */ | |
622 | #define MC4_SDMODE_BURST 2 /* 0-7 */ | |
623 | #define MC4_ACTORW 3 /* 0-15 */ | |
624 | #define MC4_BSTOPRE_L (MC_BSTOPRE & 0xf) | |
625 | ||
626 | LOADPTR (r3, MEM_CONT4_ADR) /* Set MCCR4 (FC) */ | |
627 | stwbrx r3,0,r5 | |
628 | LOADPTR(r4, \ | |
629 | MC4_PRETOACT << 28 | MC4_ACTOPRE << 24 | \ | |
630 | MC4_WMODE << 23 | MC4_INLINE << 22 | \ | |
631 | MC4_REGISTERED << 20 | MC4_BSTOPRE_UU << 18 | \ | |
632 | MC4_DBUS_RCS1 << 17 | \ | |
633 | MC4_REGDIMM << 15 | MC4_SDMODE_CAS << 12 | \ | |
634 | MC4_SDMODE_WRAP << 11 | MC4_SDMODE_BURST << 8 | \ | |
635 | MC4_ACTORW << 4 | MC4_BSTOPRE_L) | |
636 | cmpl 0, 0, r7, r9 /* Check for Kahlua 2 */ | |
637 | bne notK2c | |
638 | /* Turn on Kahlua2 extended ROM space */ | |
639 | LOADPTR (r3, 0x00200000) | |
640 | or r4, r4, r3 | |
641 | notK2c: | |
642 | stwbrx r4,0,r6 | |
643 | ||
644 | #ifdef INCLUDE_ECC | |
645 | /*------- MEM_ERREN1 */ | |
646 | ||
647 | LOADPTR (r3, MEM_ERREN1_ADR) /* Set MEM_ERREN1 (c0) */ | |
648 | stwbrx r3,0,r5 | |
649 | lwbrx r4,0,r6 | |
650 | ori r4,r4,4 /* Set MEM_PERR_EN */ | |
651 | stwbrx r4,0,r6 | |
652 | #endif /* INCLUDE_ECC */ | |
653 | ||
654 | /*------- MSAR/MEAR */ | |
655 | ||
656 | LOADPTR (r3, MEM_START1_ADR) /* Set MSAR1 (80) */ | |
657 | stwbrx r3,0,r5 | |
658 | LOADPTR (r4, 0xc0804000) | |
659 | stwbrx r4,0,r6 | |
660 | ||
661 | LOADPTR (r3, MEM_START2_ADR) /* Set MSAR2 (84) */ | |
662 | stwbrx r3,0,r5 | |
663 | LOADPTR (r4, 0xc0804000) | |
664 | stwbrx r4,0,r6 | |
665 | ||
666 | LOADPTR (r3, XMEM_START1_ADR) /* Set MESAR1 (88) */ | |
667 | stwbrx r3,0,r5 | |
668 | LOADPTR (r4, 0x00000000) | |
669 | stwbrx r4,0,r6 | |
670 | ||
671 | LOADPTR (r3, XMEM_START2_ADR) /* Set MESAR2 (8c) */ | |
672 | stwbrx r3,0,r5 | |
673 | LOADPTR (r4, 0x01010101) | |
674 | stwbrx r4,0,r6 | |
675 | ||
676 | LOADPTR (r3, MEM_END1_ADR) /* Set MEAR1 (90) */ | |
677 | stwbrx r3,0,r5 | |
678 | LOADPTR (r4, 0xffbf7f3f) | |
679 | stwbrx r4,0,r6 | |
680 | ||
681 | LOADPTR (r3, MEM_END2_ADR) /* Set MEAR2 (94) */ | |
682 | stwbrx r3,0,r5 | |
683 | LOADPTR (r4, 0xffbf7f3f) | |
684 | stwbrx r4,0,r6 | |
685 | ||
686 | LOADPTR (r3, XMEM_END1_ADR) /* MEEAR1 (98) */ | |
687 | stwbrx r3,0,r5 | |
688 | LOADPTR (r4, 0x00000000) | |
689 | stwbrx r4,0,r6 | |
690 | ||
691 | LOADPTR (r3, XMEM_END2_ADR) /* MEEAR2 (9c) */ | |
692 | stwbrx r3,0,r5 | |
693 | LOADPTR (r4, 0x01010101) | |
694 | stwbrx r4,0,r6 | |
695 | ||
696 | /*-------ODCR */ | |
697 | ||
698 | LOADPTR (r3, ODCR_ADR_X) /* Set ODCR */ | |
699 | stwbrx r3,0,r5 | |
700 | ||
701 | li r4, 0x7f | |
702 | stb r4, ODCR_SHIFT(r6) /* ODCR is at +3 offset */ | |
703 | ||
704 | /*-------MBEN */ | |
705 | ||
706 | LOADPTR (r3, MEM_EN_ADR) /* Set MBEN (a0) */ | |
707 | stwbrx r3,0,r5 | |
708 | li r4, 0x01 /* Enable bank 0 */ | |
709 | stb r4, 0(r6) /* MBEN is at +0 offset */ | |
710 | ||
711 | #if 0 /* Jimmy: I think page made is broken */ | |
712 | /*-------PGMAX */ | |
713 | ||
714 | LOADPTR (r3, MPM_ADR_X) | |
715 | stwbrx r3,0,r5 | |
716 | li r4, 0x32 | |
717 | stb r4, MPM_SHIFT(r6) /* PAGE_MODE is at +3 offset */ | |
718 | #endif | |
719 | ||
720 | /* Wait before initializing other registers */ | |
721 | ||
722 | lis r4,0x0001 | |
723 | mtctr r4 | |
724 | ||
725 | KahluaX4wait200us: | |
726 | bdnz KahluaX4wait200us | |
727 | ||
728 | /* Set MEMGO bit */ | |
729 | ||
730 | LOADPTR (r3, MEM_CONT1_ADR) /* MCCR1 (F0) |= PGMAX */ | |
731 | stwbrx r3,0,r5 | |
732 | lwbrx r4,0,r6 /* old MCCR1 */ | |
733 | oris r4,r4,0x0008 /* MEMGO=1 */ | |
734 | stwbrx r4, 0, r6 | |
735 | ||
736 | /* Wait again */ | |
737 | ||
738 | addis r4,r0,0x0002 | |
739 | ori r4,r4,0xffff | |
740 | ||
741 | mtctr r4 | |
742 | ||
743 | KahluaX4wait8ref: | |
744 | bdnz KahluaX4wait8ref | |
745 | ||
746 | sync | |
747 | eieio | |
748 | mtlr r11 | |
749 | blr | |
750 | ||
751 | #else /* USE_V2_INIT */ | |
752 | ||
753 | ||
754 | ||
755 | /* U-Boot works, but memory will not run reliably for all address ranges. | |
756 | * Early U-Boot Working init, but 2.4.19 kernel will crash since memory is not | |
757 | * initialized correctly. Could work if debugged. | |
758 | */ | |
759 | /* PCI Support routines */ | |
760 | ||
761 | .globl __pci_config_read_32 | |
762 | __pci_config_read_32: | |
763 | lis r4, 0xfec0 | |
764 | stwbrx r3, r0, r4 | |
765 | sync | |
766 | lis r4, 0xfee0 | |
767 | lwbrx r3, 0, r4 | |
768 | blr | |
769 | .globl __pci_config_read_16 | |
770 | __pci_config_read_16: | |
771 | lis r4, 0xfec0 | |
772 | andi. r5, r3, 2 | |
773 | stwbrx r3, r0, r4 | |
774 | sync | |
775 | oris r4, r5, 0xfee0 | |
776 | lhbrx r3, r0, r4 | |
777 | blr | |
778 | .globl __pci_config_read_8 | |
779 | __pci_config_read_8: | |
780 | lis r4, 0xfec0 | |
781 | andi. r5, r3, 3 | |
782 | stwbrx r3, r0, r4 | |
783 | sync | |
784 | oris r4, r5, 0xfee0 | |
785 | lbz r3, 0(4) | |
786 | blr | |
787 | .globl __pci_config_write_32 | |
788 | __pci_config_write_32: | |
789 | lis r5, 0xfec0 | |
790 | stwbrx r3, r0, r5 | |
791 | sync | |
792 | lis r5, 0xfee0 | |
793 | stwbrx r4, r0, r5 | |
794 | sync | |
795 | blr | |
796 | .globl __pci_config_write_16 | |
797 | __pci_config_write_16: | |
798 | lis r5, 0xfec0 | |
799 | andi. r6, r3, 2 | |
800 | stwbrx r3, r0, 5 | |
801 | sync | |
802 | oris r5, r6, 0xfee0 | |
803 | sthbrx r4, r0, r5 | |
804 | sync | |
805 | blr | |
806 | .globl __pci_config_write_8 | |
807 | __pci_config_write_8: | |
808 | lis r5, 0xfec0 | |
809 | andi. r6, r3, 3 | |
810 | stwbrx r3, r0, r5 | |
811 | sync | |
812 | oris r5, r6, 0xfee0 | |
813 | stb r4, 0(r5) | |
814 | sync | |
815 | blr | |
816 | .globl in_8 | |
817 | in_8: | |
818 | oris r3, r3, 0xfe00 | |
819 | lbz r3,0(r3) | |
820 | blr | |
821 | .globl in_16 | |
822 | in_16: | |
823 | oris r3, r3, 0xfe00 | |
824 | lhbrx r3, 0, r3 | |
825 | blr | |
826 | .globl in_16_ne | |
827 | in_16_ne: | |
828 | oris r3, r3, 0xfe00 | |
829 | lhzx r3, 0, r3 | |
830 | blr | |
831 | .globl in_32 | |
832 | in_32: | |
833 | oris r3, r3, 0xfe00 | |
834 | lwbrx r3, 0, r3 | |
835 | blr | |
836 | .globl out_8 | |
837 | out_8: | |
838 | oris r3, r3, 0xfe00 | |
839 | stb r4, 0(r3) | |
840 | eieio | |
841 | blr | |
842 | .globl out_16 | |
843 | out_16: | |
844 | oris r3, r3, 0xfe00 | |
845 | sthbrx r4, 0, r3 | |
846 | eieio | |
847 | blr | |
848 | .globl out_16_ne | |
849 | out_16_ne: | |
850 | oris r3, r3, 0xfe00 | |
851 | sth r4, 0(r3) | |
852 | eieio | |
853 | blr | |
854 | .globl out_32 | |
855 | out_32: | |
856 | oris r3, r3, 0xfe00 | |
857 | stwbrx r4, 0, r3 | |
858 | eieio | |
859 | blr | |
860 | .globl read_8 | |
861 | read_8: | |
862 | lbz r3,0(r3) | |
863 | blr | |
864 | .globl read_16 | |
865 | read_16: | |
866 | lhbrx r3, 0, r3 | |
867 | blr | |
868 | .globl read_32 | |
869 | read_32: | |
870 | lwbrx r3, 0, r3 | |
871 | blr | |
872 | .globl read_32_ne | |
873 | read_32_ne: | |
874 | lwz r3, 0(r3) | |
875 | blr | |
876 | .globl write_8 | |
877 | write_8: | |
878 | stb r4, 0(r3) | |
879 | eieio | |
880 | blr | |
881 | .globl write_16 | |
882 | write_16: | |
883 | sthbrx r4, 0, r3 | |
884 | eieio | |
885 | blr | |
886 | .globl write_32 | |
887 | write_32: | |
888 | stwbrx r4, 0, r3 | |
889 | eieio | |
890 | blr | |
891 | .globl write_32_ne | |
892 | write_32_ne: | |
893 | stw r4, 0(r3) | |
894 | eieio | |
895 | blr | |
896 | ||
897 | ||
898 | .globl early_init_f | |
899 | ||
900 | early_init_f: | |
901 | mflr r11 | |
902 | lis r10, 0x8000 | |
903 | ||
904 | /* PCI Latency Timer */ | |
905 | li r4, 0x0d | |
906 | ori r3, r10, PLTR@l | |
907 | bl __pci_config_write_8 | |
908 | ||
909 | /* Cache Line Size */ | |
910 | li r4, 0x08 | |
911 | ori r3, r10, PCLSR@l | |
912 | bl __pci_config_write_8 | |
913 | ||
914 | /* PCI Cmd */ | |
915 | li r4, 6 | |
916 | ori r3, r10, PCICR@l | |
917 | bl __pci_config_write_16 | |
918 | ||
919 | #if 1 | |
920 | /* PCI Stat */ | |
921 | ori r3, r10, PCISR@l | |
922 | bl __pci_config_read_16 | |
923 | ori r4, r4, 0xffff | |
924 | ori r3, r10, PCISR@l | |
925 | bl __pci_config_write_16 | |
926 | #endif | |
927 | ||
928 | /* PICR1 */ | |
929 | lis r4, 0xff14 | |
930 | ori r4, r4, 0x1b98 | |
931 | ori r3, r10, PICR1@l | |
932 | bl __pci_config_write_32 | |
933 | ||
934 | ||
935 | /* PICR2 */ | |
936 | lis r4, 0x0404 | |
937 | ori r4, r4, 0x0004 | |
938 | ori r3, r10, PICR2@l | |
939 | bl __pci_config_write_32 | |
940 | ||
941 | /* MIOCR1 */ | |
942 | li r4, 0x04 | |
943 | ori r3, r10, MIOCR1@l | |
944 | bl __pci_config_write_8 | |
945 | ||
946 | /* For the MPC8245, set register 77 to %00100000 (see Errata #15) */ | |
947 | /* SDRAM_CLK_DEL (0x77)*/ | |
948 | li r4, 0x10 | |
949 | ori r3, r10, MIOCR2@l | |
950 | bl __pci_config_write_8 | |
951 | ||
952 | /* EUMBBAR */ | |
953 | lis r4, 0xfc00 | |
954 | ori r3, r10, EUMBBAR@l | |
955 | bl __pci_config_write_32 | |
956 | ||
957 | /* AMBOR */ | |
958 | ||
959 | /* Even if Address Map B is not being used (though it should), | |
960 | * the memory DLL needs to be cleared/set/cleared before using memory. | |
961 | */ | |
962 | ||
963 | ori r3, r10, AMBOR@l | |
964 | bl __pci_config_read_8 /* get Current bits */ | |
965 | ||
966 | andi. r4, r4, 0xffdf | |
967 | ori r3, r10, AMBOR@l | |
968 | bl __pci_config_write_16 /* Clear DLL_RESET */ | |
969 | ||
970 | ori r4, r4, 0x0020 | |
971 | ori r3, r10, AMBOR@l | |
972 | bl __pci_config_write_16 /* Set DLL_RESET */ | |
973 | ||
974 | andi. r4, r4, 0xffdf | |
975 | ori r3, r10, AMBOR@l | |
976 | bl __pci_config_write_16 /* Clear DLL_RESET */ | |
977 | ||
978 | /* ERCR1 */ | |
979 | lis r4, 0x8040 /* Enable RCS2, use supplied timings */ | |
980 | ori r4, r4, 0x8000 | |
981 | ori r3, r10, ERCR1@l | |
982 | bl __pci_config_write_32 | |
983 | ||
984 | /* ERCR2 */ | |
985 | lis r4, 0x0000 /* Disable RCS3 parms */ | |
986 | ori r4, r4, 0x0000 | |
987 | ori r3, r10, ERCR2@l | |
988 | bl __pci_config_write_32 | |
989 | ||
990 | /* ERCR3 */ | |
991 | lis r4, 0x0000 /* RCS3 at 0x70000000, 64K bytes */ | |
992 | ori r4, r4, 0x0004 | |
993 | ori r3, r10, ERCR2@l | |
994 | bl __pci_config_write_32 | |
995 | ||
996 | /* Preserve memgo bit */ | |
997 | /* MCCR1 */ | |
998 | ||
999 | /* lis r4, 0x75a8 / Safe Local ROM = 11+3 clocks */ | |
1000 | lis r4, 0x75a0 /* Safe Local ROM = 11+3 clocks */ | |
1001 | /* lis r4, 0x73a0 / Fast Local ROM = 7+3 clocks */ | |
1002 | /* oris r4, r4, 0x0010 / Burst ROM/Flash enable */ | |
1003 | /* oris r4, r4, 0x0004 / Self-refresh enable */ | |
1004 | ||
1005 | /* ori r4,r4,0xFFFF / 16Mbit 2bank SDRAM */ | |
1006 | /* ori r4,r4,0xAAAA / 256Mbit 4bank SDRAM (8245 only) */ | |
1007 | /* ori r4,r4,0x5555 / 64Mbit 2bank SDRAM */ | |
1008 | ori r4,r4,0x0000 /* 64Mbit 4bank SDRAM */ | |
1009 | ||
1010 | ori r3, r10, MCCR1@l | |
1011 | bl __pci_config_write_32 | |
1012 | ||
1013 | /* MCCR2 */ | |
1014 | ||
1015 | lis r4,0x0000 | |
1016 | /* oris r4,r4,0x4000 / TS_WAIT_TIMER = 3 clocks */ | |
1017 | oris r4,r4,0x1000 /* ASRISE = 8 clocks */ | |
1018 | oris r4,r4,0x0080 /* ASFALL = 8 clocks */ | |
1019 | /* oris r4,r4,0x0010 / SDRAM Parity (else ECC) */ | |
1020 | /* oris r4,r4,0x0008 / Write parity check */ | |
1021 | /* oris r4,r4,0x0004 / SDRAM inline reads */ | |
1022 | ||
1023 | ||
1024 | /* Select a refresh rate; it needs to match the bus speed; if too */ | |
1025 | /* slow, data may be lost; if too fast, performance is lost. We */ | |
1026 | /* use the fastest value so we run at all speeds. */ | |
1027 | /* Refresh = (15600ns/busclk) - (213 (see UM)). */ | |
1028 | ||
1029 | /* ori r4,r4,0x1d2c / 133 MHz mem bus = 1867 */ | |
1030 | /* ori r4,r4,0x150c / 100 MHz mem bus = 1347 */ | |
1031 | /* ori r4,r4,0x10fc / 83 MHz mem bus = 1087 */ | |
1032 | /* ori r4,r4,0x0cc4 / 66 MHz mem bus = 817 */ | |
1033 | ori r4,r4,0x04cc /* 33 MHz mem bus (SAFE) = 307 */ | |
1034 | /* ori r4,r4,0x0002 / Reserve a page */ | |
1035 | /* ori r4,r4,0x0001 / RWM parity */ | |
1036 | ||
1037 | ori r3, r10, MCCR2@l | |
1038 | bl __pci_config_write_32 | |
1039 | ||
1040 | ||
1041 | /* MCCR3 */ | |
1042 | lis r4,0x0000 /* BSTOPRE_M = 7 (see A/N) */ | |
1043 | oris r4,r4,0x0500 /* REFREC = 8 clocks */ | |
1044 | ori r3, r10, MCCR3@l | |
1045 | bl __pci_config_write_32 | |
1046 | ||
1047 | /* MCCR4 */ /* Turn on registered buffer mode */ | |
1048 | lis r4, 0x2000 /* PRETOACT = 3 clocks */ | |
1049 | oris r4,r4,0x0400 /* ACTOPRE = 5 clocks */ | |
1050 | /* oris r4,r4,0x0080 / Enable 8-beat burst (32-bit bus) */ | |
1051 | /* oris r4,r4,0x0040 / Enable Inline ECC/Parity */ | |
1052 | oris r4,r4,0x0020 /* EXTROM enabled */ | |
1053 | oris r4,r4,0x0010 /* Registered buffers */ | |
1054 | /* oris r4,r4,0x0000 / BSTOPRE_U = 0 (see A/N) */ | |
1055 | oris r4,r4,0x0002 /* DBUS_SIZ[2] (8 bit on RCS1) */ | |
1056 | ||
1057 | /* ori r4,r4,0x8000 / Registered DIMMs */ | |
1058 | ori r4,r4,0x2000 /*CAS Latency (CL=3) (see RDLAT) */ | |
1059 | /* ori r4,r4,0x2000 / CAS Latency (CL=2) (see RDLAT) */ | |
1060 | /* ori r4,r4,0x0300 / Sequential wrap/8-beat burst */ | |
1061 | ori r4,r4,0x0200 /* Sequential wrap/4-beat burst */ | |
1062 | ori r4,r4,0x0030 /* ACTORW = 3 clocks */ | |
1063 | ori r4,r4,0x0009 /* BSTOPRE_L = 9 (see A/N) */ | |
1064 | ||
1065 | ori r3, r10, MCCR4@l | |
1066 | bl __pci_config_write_32 | |
1067 | ||
1068 | /* MSAR1 */ | |
1069 | lis r4, 0xc0804000@h | |
1070 | ori r4, r4, 0xc0804000@l | |
1071 | ori r3, r10, MSAR1@l | |
1072 | bl __pci_config_write_32 | |
1073 | ||
1074 | /* MSAR2 */ | |
1075 | lis r4, 0xc0804000@h | |
1076 | ori r4, r4, 0xc0804000@l | |
1077 | ori r3, r10, MSAR2@l | |
1078 | bl __pci_config_write_32 | |
1079 | ||
1080 | /* MESAR1 */ | |
1081 | lis r4, 0x00000000@h | |
1082 | ori r4, r4, 0x00000000@l | |
1083 | ori r3, r10, EMSAR1@l | |
1084 | bl __pci_config_write_32 | |
1085 | ||
1086 | /* MESAR2 */ | |
1087 | lis r4, 0x01010101@h | |
1088 | ori r4, r4, 0x01010101@l | |
1089 | ori r3, r10, EMSAR2@l | |
1090 | bl __pci_config_write_32 | |
1091 | ||
1092 | /* MEAR1 */ | |
1093 | lis r4, 0xffbf7f3f@h | |
1094 | ori r4, r4, 0xffbf7f3f@l | |
1095 | ori r3, r10, MEAR1@l | |
1096 | bl __pci_config_write_32 | |
1097 | ||
1098 | /* MEAR2 */ | |
1099 | lis r4, 0xffbf7f3f@h | |
1100 | ori r4, r4, 0xffbf7f3f@l | |
1101 | ori r3, r10, MEAR2@l | |
1102 | bl __pci_config_write_32 | |
1103 | ||
1104 | /* MEEAR1 */ | |
1105 | lis r4, 0x00000000@h | |
1106 | ori r4, r4, 0x00000000@l | |
1107 | ori r3, r10, EMEAR1@l | |
1108 | bl __pci_config_write_32 | |
1109 | ||
1110 | /* MEEAR2 */ | |
1111 | lis r4, 0x01010101@h | |
1112 | ori r4, r4, 0x01010101@l | |
1113 | ori r3, r10, EMEAR2@l | |
1114 | bl __pci_config_write_32 | |
1115 | ||
1116 | /* ODCR */ | |
1117 | li r4, 0x7f | |
1118 | ori r3, r10, ODCR@l | |
1119 | bl __pci_config_write_8 | |
1120 | ||
1121 | /* MBER */ | |
1122 | li r4, 0x01 | |
1123 | ori r3, r10, MBER@l | |
1124 | bl __pci_config_write_8 | |
1125 | ||
1126 | /* Page CTR aka PGMAX */ | |
1127 | li r4, 0x32 | |
1128 | ori r3, r10, 0x70 | |
1129 | bl __pci_config_write_8 | |
1130 | ||
1131 | #if 0 | |
1132 | /* CLK Drive */ | |
1133 | ori r4, r10, 0xfc01 /* Top bit will be ignored */ | |
1134 | ori r3, r10, 0x74 | |
1135 | bl __pci_config_write_16 | |
1136 | #endif | |
1137 | ||
1138 | /* delay */ | |
1139 | lis r7, 1 | |
1140 | mtctr r7 | |
1141 | label1: bdnz label1 | |
1142 | ||
1143 | /* Set memgo bit */ | |
1144 | /* MCCR1 */ | |
1145 | ori r3, r10, MCCR1@l | |
1146 | bl __pci_config_read_32 | |
1147 | lis r7, 0x0008 | |
1148 | or r4, r3, r7 | |
1149 | ori r3, r10, MCCR1@l | |
1150 | bl __pci_config_write_32 | |
1151 | ||
1152 | /* delay again */ | |
1153 | lis r7, 1 | |
1154 | mtctr r7 | |
1155 | label2: bdnz label2 | |
1156 | #if 0 | |
1157 | /* DEBUG: Infinite loop, write then read */ | |
1158 | loop: | |
1159 | lis r7, 0xffff | |
1160 | mtctr r7 | |
1161 | li r3, 0x5004 | |
1162 | lis r4, 0xa0a0 | |
1163 | ori r4, r4, 0x5050 | |
1164 | bl write_32_ne | |
1165 | li r3, 0x5004 | |
1166 | bl read_32_ne | |
1167 | bdnz loop | |
1168 | #endif | |
1169 | mtlr r11 | |
1170 | blr | |
1171 | #endif | |
1172 |