]> git.saurik.com Git - apple/xnu.git/blame - osfmk/ppc/start.s
xnu-517.9.5.tar.gz
[apple/xnu.git] / osfmk / ppc / start.s
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
e5568f75
A
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
1c79356b 11 *
e5568f75
A
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1c79356b
A
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
e5568f75
A
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
1c79356b
A
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * @OSF_COPYRIGHT@
24 */
43866e37
A
25
26#define __APPLE_API_PRIVATE
27
1c79356b
A
28#include <cpus.h>
29#include <mach_kdb.h>
30#include <mach_kdp.h>
31#include <mach_kgdb.h>
32#include <ppc/asm.h>
33#include <ppc/proc_reg.h>
9bccf70c 34#include <ppc/spec_reg.h>
43866e37 35#include <machine/cpu_capabilities.h>
1c79356b
A
36#include <mach/ppc/vm_param.h>
37#include <assym.s>
38
43866e37
A
39#define ptFilter 0
40#define ptVersion 4
41#define ptRevision 6
42#define ptFeatures 8
43#define ptCPUCap 12
4a249263
A
44#define ptPwrModes 16
45#define ptPatch 20
46#define ptInitRout 24
47#define ptRptdProc 28
483a1d10
A
48#define ptLineSize 32
49#define ptl1iSize 36
50#define ptl1dSize 40
51#define ptPTEG 44
52#define ptMaxVAddr 48
53#define ptMaxPAddr 52
54#define ptSize 56
1c79356b
A
55
56#define bootCPU 10
57#define firstInit 9
58#define firstBoot 8
0b4e3aa0 59
1c79356b
A
60/*
61 * Interrupt and bootup stack for initial processor
62 */
63
64 .file "start.s"
65
1c79356b
A
66/*
67 * All CPUs start here.
68 *
69 * This code is called from SecondaryLoader
70 *
71 * Various arguments are passed via a table:
55e303ae 72 * R3 = pointer to other startup parameters
1c79356b
A
73 */
74 .text
55e303ae
A
75
76ENTRY(resetPOR,TAG_NO_FRAME_USED)
77
78 li r12,0 ; Get a 0
79 stw r12,0xF0(0) ; Make sure the special flag is clear
80 mtmsrd r12 ; Make sure we are in 32-bit mode
81 isync ; Really make sure
82 lwz r3,0xF4(0) ; Get the boot_args pointer
83 b startJoin ; Join up...
84
85
1c79356b
A
86ENTRY(_start_cpu,TAG_NO_FRAME_USED)
87 crclr bootCPU ; Set non-boot processor
88 crclr firstInit ; Set not first time init
89 mr r30,r3 ; Set current per_proc
90
91;
92; Note that we are just trying to get close. The real TB sync will take
93; place later. The value we are loading is set in two places. For the
94; main processor, it will be the TB at the last interrupt before we went
95; to sleep. For the others, it will be the time just before the main
96; processor woke us up.
97;
98
99 lwz r15,ruptStamp(r3) ; Get the timebase from the other processor
100 li r17,0 ; Clear this out
101 lwz r16,ruptStamp+4(r3) ; Get the timebase from the other processor
102 mtspr tbl,r17 ; Clear bottom so we do not tick
103 mtspr tbu,r15 ; Set top
104 mtspr tbl,r16 ; Then bottom again
1c79356b
A
105 b allstart
106
107ENTRY(_start,TAG_NO_FRAME_USED)
108
55e303ae
A
109startJoin:
110 mflr r2 ; Save the return address
1c79356b
A
111 lis r30,hi16(EXT(per_proc_info)) ; Set current per_proc
112 ori r30,r30,lo16(EXT(per_proc_info)) ; Set current per_proc
113 crset bootCPU ; Set boot processor
114
115 lwz r17,pfAvailable(r30) ; Get the available bits
116 rlwinm. r0,r17,0,pfValidb,pfValidb ; Have we initialized the feature flags yet?
117 crmove firstInit,cr0_eq ; Set if we are doing first time init
118 bne allstart ; Yeah, we must be waking up from sleep...
119
120;
121; Here is where we do any one time general low-level initialization
122
123 lis r20,HIGH_ADDR(fwdisplock) ; Get address of the firmware display lock
124 li r19,0 ; Zorch a register
125 ori r20,r20,LOW_ADDR(fwdisplock) ; Get address of the firmware display lock
126 stw r19,0(r20) ; Make sure the lock is free
127
43866e37
A
128allstart:
129 mr r31,r3 ; Save away arguments
130
131 crand firstBoot,bootCPU,firstInit ; Indicate if we are on the initial first processor startup
132
d7e50217 133 mtsprg 0,r30 ; Set the per_proc
1c79356b 134
de355530 135 li r9,0 ; Clear out a register
55e303ae 136 mtsprg 1,r9 ; Clear the SPRGs
de355530
A
137 mtsprg 2,r9
138 mtsprg 3,r9
139
55e303ae
A
140 li r7,MSR_VM_OFF ; Get real mode MSR
141 mtmsr r7 ; Set the real mode SRR
142 isync
143
1c79356b
A
144 lis r26,hi16(processor_types) ; Point to processor table
145 ori r26,r26,lo16(processor_types) ; Other half
146 mfpvr r10 ; Get the PVR
147
148nextPVR: lwz r28,ptFilter(r26) ; Get the filter
149 lwz r27,ptVersion(r26) ; Get the version and revision codes
150 and r28,r10,r28 ; Throw away dont care bits
151 cmplw r27,r28 ; Is this the right set?
152 beq donePVR ; We have the right one...
153 addi r26,r26,ptSize ; Point to the next type
154 b nextPVR ; Check it out...
155
156donePVR: lwz r20,ptInitRout(r26) ; Grab the special init routine
157 mtlr r20 ; Setup to call the init
158
43866e37 159 bf firstBoot,notFirst ; Not first boot, go...
1c79356b
A
160
161;
162; The following code just does a general initialization of the features just
163; after the initial first-time boot. This is not done after waking up or on
55e303ae
A
164; any "secondary" processor. Just after the boot-processor init, we copy the
165; features to any possible per_proc.
1c79356b
A
166;
167; We are just setting defaults. The specific initialization code will modify these
168; if necessary.
169;
55e303ae
A
170 lis r18,hi16(EXT(_cpu_capabilities)) ; Get the address of _cpu_capabilities
171 ori r18,r18,lo16(EXT(_cpu_capabilities))
43866e37 172 lwz r17,ptCPUCap(r26) ; Get the default cpu capabilities
55e303ae 173 stw r17, 0(r18) ; Save the default value in _cpu_capabilities
1c79356b
A
174
175 lwz r17,ptFeatures(r26) ; Pick up the features
176
55e303ae
A
177 lwz r18,ptRptdProc(r26) ; Get the reported processor
178 sth r18,pfrptdProc(r30) ; Set the reported processor
1c79356b 179
4a249263
A
180 lwz r13,ptPwrModes(r26) ; Get the supported power modes
181 stw r13,pfPowerModes(r30) ; Set the supported power modes
182
1c79356b
A
183 lwz r13,ptLineSize(r26) ; Get the cache line size
184 sth r13,pflineSize(r30) ; Save it
185 lwz r13,ptl1iSize(r26) ; Get icache size
186 stw r13,pfl1iSize(r30) ; Save it
187 lwz r13,ptl1dSize(r26) ; Get dcache size
188 stw r13,pfl1dSize(r30) ; Save it
55e303ae
A
189 lwz r13,ptPTEG(r26) ; Get PTEG size address
190 stw r13,pfPTEG(r30) ; Save it
191 lwz r13,ptMaxVAddr(r26) ; Get max virtual address
192 stw r13,pfMaxVAddr(r30) ; Save it
193 lwz r13,ptMaxPAddr(r26) ; Get max physical address
194 stw r13,pfMaxPAddr(r30) ; Save it
195 lis r11,hi16(EXT(patch_table))
196 ori r11,r11,lo16(EXT(patch_table))
197 lwz r19,ptPatch(r26) ; Get ptPatch field
198 li r12,PATCH_TABLE_SIZE
199 mtctr r12
200patch_loop:
201 lwz r16,patchType(r11) ; Load the patch type
202 lwz r15,patchValue(r11) ; Load the patch value
203 cmplwi cr1,r16,PATCH_FEATURE ; Is it a patch feature entry
204 and. r14,r15,r19 ; Is it set in the patch feature
205 crandc cr0_eq,cr1_eq,cr0_eq ; Do we have a match
206 beq patch_apply ; Yes, patch memory
207 cmplwi cr1,r16,PATCH_PROCESSOR ; Is it a patch processor entry
208 cmplw cr0,r15,r18 ; Check matching processor
209 crand cr0_eq,cr1_eq,cr0_eq ; Do we have a match
210 bne patch_skip ; No, skip patch memory
211patch_apply:
212 lwz r13,patchAddr(r11) ; Load the address to patch
213 lwz r14,patchData(r11) ; Load the patch data
214 stw r14,0(r13) ; Patch the location
215 dcbf 0,r13 ; Flush the old one
216 sync ; Make sure we see it all
217 icbi 0,r13 ; Flush the i-cache
218 isync ; Hang out
219 sync ; Hang out some more...
220patch_skip:
221 addi r11,r11,peSize ; Point to the next patch entry
222 bdnz patch_loop ; Loop if in the range
1c79356b
A
223 b doOurInit ; Go do processor specific initialization...
224
225notFirst: lwz r17,pfAvailable(r30) ; Get our features
1c79356b 226
55e303ae
A
227doOurInit: mr. r20,r20 ; See if initialization routine
228 crand firstBoot,bootCPU,firstInit ; Indicate if we are on the initial first processor startup
229 bnelrl ; Do the initialization
230
231 ori r17,r17,lo16(pfValid) ; Set the valid bit
232 stw r17,pfAvailable(r30) ; Set the available features
233
234 bf firstBoot,nofeatcpy ; Skip feature propagate if not first time boot...
235
236 li r2,NCPUS ; Get number of CPUs
1c79356b
A
237 lis r23,hi16(EXT(per_proc_info)) ; Set base per_proc
238 ori r23,r23,lo16(EXT(per_proc_info)) ; Set base per_proc
55e303ae 239 addi r6,r23,ppSize ; Point to the next one
1c79356b 240
55e303ae 241cpyFCpu: addic. r2,r2,-1 ; Count down
1c79356b 242 la r8,pfAvailable(r23) ; Point to features of boot processor
55e303ae 243 la r7,pfAvailable(r6) ; Point to features of our processor
483a1d10 244 li r9,pfSize/4 ; Get size of a features area
55e303ae 245 ble-- nofeatcpy ; Copied all we need
1c79356b
A
246
247cpyFeat: subi r9,r9,1 ; Count word
248 lwz r0,0(r8) ; Get boot cpu features
249 stw r0,0(r7) ; Copy to ours
250 mr. r9,r9 ; Finished?
251 addi r7,r7,4 ; Next out
252 addi r8,r8,4 ; Next in
253 bgt cpyFeat ; Copy all boot cpu features to us...
d7e50217 254
55e303ae
A
255 lwz r17,pfAvailable(r6) ; Get our newly initialized features
256 addi r6,r6,ppSize ; Point to the next one
257 b cpyFCpu ; Do the next per_proc...
1c79356b 258
55e303ae
A
259
260nofeatcpy: rlwinm. r0,r17,0,pf64Bitb,pf64Bitb ; Is this a 64-bit machine?
de355530 261 mtsprg 2,r17 ; Remember the feature flags
55e303ae
A
262
263 bne++ start64 ; Skip following if 64-bit...
264
265 mfspr r6,hid0 ; Get the HID0
266 rlwinm r6,r6,0,sleep+1,doze-1 ; Remove any vestiges of sleep
267 mtspr hid0,r6 ; Set the insominac HID0
268 isync
269
270; Clear the BAT registers
271
272 li r9,0 ; Clear out a register
273 sync
274 isync
275 mtdbatu 0,r9 ; Invalidate maps
276 mtdbatl 0,r9 ; Invalidate maps
277 mtdbatu 1,r9 ; Invalidate maps
278 mtdbatl 1,r9 ; Invalidate maps
279 mtdbatu 2,r9 ; Invalidate maps
280 mtdbatl 2,r9 ; Invalidate maps
281 mtdbatu 3,r9 ; Invalidate maps
282 mtdbatl 3,r9 ; Invalidate maps
283 sync
284 isync
285 mtibatu 0,r9 ; Invalidate maps
286 mtibatl 0,r9 ; Invalidate maps
287 mtibatu 1,r9 ; Invalidate maps
288 mtibatl 1,r9 ; Invalidate maps
289 mtibatu 2,r9 ; Invalidate maps
290 mtibatl 2,r9 ; Invalidate maps
291 mtibatu 3,r9 ; Invalidate maps
292 mtibatl 3,r9 ; Invalidate maps
293 sync
294 isync
295 b startcommon ; Go join up the common start routine
d7e50217 296
55e303ae
A
297start64: lis r5,hi16(startcommon) ; Get top of address of continue point
298 mfspr r6,hid0 ; Get the HID0
299 ori r5,r5,lo16(startcommon) ; Get low of address of continue point
300 lis r9,hi16(MASK(MSR_HV)) ; ?
301 lis r20,hi16(dozem|napm|sleepm) ; Get mask of power saving features
302 li r7,MSR_VM_OFF ; Get real mode MSR, 64-bit off
303 sldi r9,r9,32 ; Slide into position
304 sldi r20,r20,32 ; Slide power stuff into position
305 or r9,r9,r7 ; Form initial MSR
306 andc r6,r6,r20 ; Remove any vestiges of sleep
307 isync
308 mtspr hid0,r6 ; Set the insominac HID0
309 mfspr r6,hid0 ; Get it
310 mfspr r6,hid0 ; Get it
311 mfspr r6,hid0 ; Get it
312 mfspr r6,hid0 ; Get it
313 mfspr r6,hid0 ; Get it
314 mfspr r6,hid0 ; Get it
315 isync
316 mtsrr0 r5 ; Set the continue point
317 mtsrr1 r9 ; Set our normal disabled MSR
318 rfid ; Tally ho...
319
320 .align 5
321
322startcommon:
1c79356b
A
323 rlwinm. r0,r17,0,pfFloatb,pfFloatb ; See if there is floating point
324 beq- noFloat ; Nope, this is a really stupid machine...
325
326 li r0,MSR_VM_OFF|MASK(MSR_FP) ; Enable for floating point
327 mtmsr r0 /* Set the standard MSR values */
328 isync
329
330 lis r5,HIGH_ADDR(EXT(FloatInit)) /* Get top of floating point init value */
331 ori r5,r5,LOW_ADDR(EXT(FloatInit)) /* Slam bottom */
332 lfd f0,0(r5) /* Initialize FP0 */
333 fmr f1,f0 /* Ours in not */
334 fmr f2,f0 /* to wonder why, */
335 fmr f3,f0 /* ours is but to */
336 fmr f4,f0 /* do or die! */
337 fmr f5,f0
338 fmr f6,f0
339 fmr f7,f0
340 fmr f8,f0
341 fmr f9,f0
342 fmr f10,f0
343 fmr f11,f0
344 fmr f12,f0
345 fmr f13,f0
346 fmr f14,f0
347 fmr f15,f0
348 fmr f16,f0
349 fmr f17,f0
350 fmr f18,f0
351 fmr f19,f0
352 fmr f20,f0
353 fmr f21,f0
354 fmr f22,f0
355 fmr f23,f0
356 fmr f24,f0
357 fmr f25,f0
358 fmr f26,f0
359 fmr f27,f0
360 fmr f28,f0
361 fmr f29,f0
362 fmr f30,f0
363 fmr f31,f0
364
365 li r0, MSR_VM_OFF ; Turn off floating point
366 mtmsr r0
367 isync
368
369noFloat: rlwinm. r0,r17,0,pfAltivecb,pfAltivecb ; See if there is Altivec
370 beq- noVector ; Nope...
371
372 li r0,0 ; Clear out a register
373
374 lis r7,hi16(MSR_VEC_ON) ; Get real mode MSR + Altivec
375 ori r7,r7,lo16(MSR_VM_OFF) ; Get real mode MSR + Altivec
376 mtmsr r7 ; Set the real mode SRR */
377 isync ; Make sure it has happened
378
379 lis r5,hi16(EXT(QNaNbarbarian)) ; Altivec initializer
380 ori r5,r5,lo16(EXT(QNaNbarbarian)) ; Altivec initializer
381
382 mtspr vrsave,r0 ; Set that no VRs are used yet */
383
55e303ae
A
384 vspltish v1,1 ; Turn on the non-Java bit and saturate
385 vspltisw v0,1 ; Turn on the saturate bit
386 vxor v1,v1,v0 ; Turn off saturate and leave non-Java set
1c79356b
A
387 lvx v0,br0,r5 ; Initialize VR0
388 mtvscr v1 ; Clear the vector status register
389 vor v2,v0,v0 ; Copy into the next register
390 vor v1,v0,v0 ; Copy into the next register
391 vor v3,v0,v0 ; Copy into the next register
392 vor v4,v0,v0 ; Copy into the next register
393 vor v5,v0,v0 ; Copy into the next register
394 vor v6,v0,v0 ; Copy into the next register
395 vor v7,v0,v0 ; Copy into the next register
396 vor v8,v0,v0 ; Copy into the next register
397 vor v9,v0,v0 ; Copy into the next register
398 vor v10,v0,v0 ; Copy into the next register
399 vor v11,v0,v0 ; Copy into the next register
400 vor v12,v0,v0 ; Copy into the next register
401 vor v13,v0,v0 ; Copy into the next register
402 vor v14,v0,v0 ; Copy into the next register
403 vor v15,v0,v0 ; Copy into the next register
404 vor v16,v0,v0 ; Copy into the next register
405 vor v17,v0,v0 ; Copy into the next register
406 vor v18,v0,v0 ; Copy into the next register
407 vor v19,v0,v0 ; Copy into the next register
408 vor v20,v0,v0 ; Copy into the next register
409 vor v21,v0,v0 ; Copy into the next register
410 vor v22,v0,v0 ; Copy into the next register
411 vor v23,v0,v0 ; Copy into the next register
412 vor v24,v0,v0 ; Copy into the next register
413 vor v25,v0,v0 ; Copy into the next register
414 vor v26,v0,v0 ; Copy into the next register
415 vor v27,v0,v0 ; Copy into the next register
416 vor v28,v0,v0 ; Copy into the next register
417 vor v29,v0,v0 ; Copy into the next register
418 vor v30,v0,v0 ; Copy into the next register
419 vor v31,v0,v0 ; Copy into the next register
420
421 li r0, MSR_VM_OFF ; Turn off vectors
422 mtmsr r0
423 isync
424
425noVector: rlwinm. r0,r17,0,pfSMPcapb,pfSMPcapb ; See if we can do SMP
426 beq- noSMP ; Nope...
427
428 lhz r13,PP_CPU_NUMBER(r30) ; Get the CPU number
429 mtspr pir,r13 ; Set the PIR
430
483a1d10 431noSMP:
1c79356b
A
432
433 bl EXT(cacheInit) ; Initializes all caches (including the TLB)
55e303ae
A
434
435 rlwinm. r0,r17,0,pf64Bitb,pf64Bitb ; Is this a 64-bit machine?
436 beq++ isnot64 ; Skip following if not 64-bit...
1c79356b 437
55e303ae
A
438 mfmsr r29 ; Get the MSR
439 rlwinm r29,r29,0,0,31 ; Make sure that 64-bit mode is off
440 mtmsrd r29 ; Set it
441 isync ; Make sure
1c79356b 442
55e303ae 443isnot64: bf bootCPU,callcpu
1c79356b
A
444
445 lis r29,HIGH_ADDR(EXT(intstack_top_ss)) ; move onto interrupt stack
446 ori r29,r29,LOW_ADDR(EXT(intstack_top_ss))
447 lwz r29,0(r29)
448
449 li r28,0
450 stw r28,FM_BACKPTR(r29) ; store a null frame backpointer
451
452 mr r1,r29
453 mr r3,r31 ; Restore any arguments we may have trashed
454
55e303ae
A
455; Note that we exit from here with translation still off
456
1c79356b
A
457 bl EXT(ppc_init) ; Jump into boot init code
458 BREAKPOINT_TRAP
459
460callcpu:
461 lwz r29,PP_INTSTACK_TOP_SS(r31) ; move onto interrupt stack
462
463 li r28,0
464 stw r28,FM_BACKPTR(r29) ; store a null frame backpointer
465
466
467 mr r1,r29 ; move onto new stack
468 mr r3,r31 ; Restore any arguments we may have trashed
469
55e303ae
A
470; Note that we exit from here with translation still off
471
1c79356b
A
472 bl EXT(ppc_init_cpu) ; Jump into cpu init code
473 BREAKPOINT_TRAP ; Should never return
474
475;
476; Specific processor initialization routines
477;
478
1c79356b
A
479; 750
480
765c9de3
A
481init750:
482 bf firstBoot, init750nb ; No init for wakeup....
1c79356b 483
765c9de3 484 mfspr r13,l2cr ; Get the L2CR
1c79356b
A
485 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
486 bne+ i750hl2 ; Yes...
487 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
488
765c9de3
A
489i750hl2:
490 lis r14,hi16(256*1024) ; Base L2 size
491 addis r15,r13,0x3000 ; Hah... Figure this one out...
492 rlwinm r15,r15,4,30,31 ; Isolate
493 rlwinm. r8,r13,0,l2siz,l2sizf ; Was size valid?
494 slw r14,r14,r15 ; Set 256KB, 512KB, or 1MB
495 beq- init750l2none ; Not a valid setting...
1c79356b 496
d52fe63f 497 stw r13,pfl2crOriginal(r30) ; Shadow the L2CR
765c9de3
A
498 stw r13,pfl2cr(r30) ; Shadow the L2CR
499 stw r14,pfl2Size(r30) ; Set the L2 size
500 b init750l2done ; Done with L2
1c79356b 501
765c9de3
A
502init750l2none:
503 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No level 2 cache
504
505init750l2done:
506 mfspr r11,hid0 ; Get the current HID0
507 stw r11,pfHID0(r30) ; Save the HID0 value
508 blr ; Return...
509
510init750nb:
d52fe63f 511 lwz r11,pfHID0(r30) ; Get HID0
765c9de3
A
512 sync
513 mtspr hid0,r11 ; Set the HID
514 isync
515 sync
516 blr
1c79356b 517
d52fe63f
A
518; 750CX
519
520init750CX:
521 bf firstBoot, init750 ; No init for wakeup....
522 mfspr r13,hid1 ; Get HID1
523 li r14,lo16(0xFD5F) ; Get valid
55e303ae
A
524 rlwinm r13,r13,4,28,31 ; Isolate
525 slw r14,r14,r13 ; Position
526 rlwimi r17,r14,15-pfCanNapb,pfCanNapb,pfCanNapb ; Set it
527 b init750 ; Join common...
d52fe63f
A
528
529
9bccf70c
A
530; 750FX
531
532init750FX:
533 bf firstBoot, init750FXnb
534 mfspr r11, hid1
535 stw r11, pfHID1(r30) ; Save the HID1 value
536 b init750
537
538init750FXnb:
539 lwz r13, pfHID0(r30) ; Get HID0
540 lwz r11, pfHID1(r30) ; Get HID1
541
55e303ae 542 rlwinm. r0, r11, 0, hid1ps, hid1ps ; Isolate the hid1ps bit
9bccf70c 543 beq init750FXnb2 ; Clear BTIC if hid1ps set
55e303ae 544 rlwinm r13, r13, 0, btic+1, btic-1 ; Clear the BTIC bit
9bccf70c
A
545
546init750FXnb2:
547 sync
548 mtspr hid0, r13 ; Set the HID
549 isync
550 sync
551
55e303ae 552 rlwinm r12, r11, 0, hid1ps+1, hid1ps-1 ; Select PLL0
9bccf70c 553 mtspr hid1, r12 ; Restore PLL config
55e303ae 554 mftb r13 ; Wait 5000 ticks (> 200 us)
9bccf70c
A
555
556init750FXnbloop:
557 mftb r14
558 sub r14, r14, r13
559 cmpli cr0, r14, 5000
560 ble init750FXnbloop
561 mtspr hid1, r11 ; Select the desired PLL
562 blr
563
d12e1678
A
564; 750FX vers 2.0 or later
565init750FXV2:
566 bf firstBoot, init750FXV2nb ; Wake from sleep
567
568 mfspr r11, hid2
569 stw r11, pfHID2(r30) ; Save the HID2 value
570 b init750FX ; Continue with 750FX init
571
572init750FXV2nb:
573 lwz r13, pfHID2(r30) ; Get HID2
574 rlwinm r13, r13, 0, hid2vmin+1, hid2vmin-1 ; Clear the vmin bit
575 mtspr hid2, r13 ; Restore HID2 value
576 sync ; Wait for it to be done
577 b init750FX
578
d52fe63f
A
579; 7400
580
1c79356b
A
581init7400: bf firstBoot,i7400nb ; Do different if not initial boot...
582 mfspr r13,l2cr ; Get the L2CR
583 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
584 bne+ i7400hl2 ; Yes...
585 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
586
587i7400hl2: lis r14,hi16(256*1024) ; Base L2 size
588 addis r15,r13,0x3000 ; Hah... Figure this one out...
589 rlwinm r15,r15,4,30,31
590 slw r14,r14,r15 ; Set 256KB, 512KB, 1MB, or 2MB
591
55e303ae 592 stw r13,pfl2crOriginal(r30) ; Shadow the L2CR
1c79356b
A
593 stw r13,pfl2cr(r30) ; Shadow the L2CR
594 stw r14,pfl2Size(r30) ; Set the L2 size
595
596 mfspr r11,hid0 ; Get the current HID0
597 oris r11,r11,hi16(emcpm|eiecm) ; ?
598 mtspr hid0,r11 ; ?
599 isync
600 stw r11,pfHID0(r30) ; Save the HID0 value
601
602 mfspr r11,msscr0 ; Get the msscr0 register
603 stw r11,pfMSSCR0(r30) ; Save the MSSCR0 value
604 mfspr r11,msscr1 ; Get the msscr1 register
605 stw r11,pfMSSCR1(r30) ; Save the MSSCR1 value
606 blr ; Return...
607
765c9de3 608i7400nb:
d52fe63f 609 li r11,0
55e303ae 610 mtspr l2cr,r11 ; Make sure L2CR is zero
765c9de3 611 lwz r11,pfHID0(r30) ; Get HID0
1c79356b
A
612 sync
613 mtspr hid0,r11 ; Set the HID
765c9de3
A
614 isync
615 sync
1c79356b
A
616 lwz r11,pfMSSCR0(r30) ; Get MSSCR0
617 isync
618 sync
619 mtspr msscr0,r11 ; Set the MSSCR0
620 lwz r11,pfMSSCR1(r30) ; Get msscr1
621 isync
622 sync
623 mtspr msscr1,r11 ; Set the msscr1
624 isync
625 sync
626 blr
9bccf70c
A
627
628; 7400 (ver 2.0 - ver 2.7)
629
630init7400v2_7:
631 bf firstBoot, init7400
632 mfspr r13, hid0 ; Get the HID0
633 ori r13, r13, nopdstm ; ?
634 mtspr hid0, r13 ; Set the HID0
635 isync
636 sync
637 b init7400
638
1c79356b
A
639; 7410
640; Note that this is the same as 7400 except we initialize the l2cr2 register
641
642init7410: li r13,0 ; Clear
643 mtspr 1016,r13 ; Turn off direct cache
644 b init7400 ; Join up with common....
1c79356b 645
d52fe63f
A
646
647; 745X - Any 7450 family processor
648
649init745X:
55e303ae 650 bf firstBoot,init745Xnb ; Do different if not initial boot...
1c79356b
A
651
652 mfspr r13,l2cr ; Get the L2CR
653 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
d52fe63f 654 bne+ init745Xhl2 ; Yes...
1c79356b
A
655 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
656
43866e37 657init745Xhl2:
e5568f75
A
658 mfpvr r14 ; Get processor version
659 rlwinm r14,r14,16,16,31 ; Isolate processor version
660 cmpli cr0, r14, PROCESSOR_VERSION_7457 ; Test for 7457 or
661 cmpli cr1, r14, PROCESSOR_VERSION_7447A ; 7447A
662 cror cr0_eq, cr1_eq, cr0_eq
43866e37 663 lis r14,hi16(512*1024) ; 512KB L2
e5568f75 664 beq init745Xhl2_2
43866e37
A
665
666 lis r14,hi16(256*1024) ; Base L2 size
1c79356b
A
667 rlwinm r15,r13,22,12,13 ; Convert to 256k, 512k, or 768k
668 add r14,r14,r15 ; Add in minimum
43866e37
A
669
670init745Xhl2_2:
e5568f75 671 stw r13,pfl2crOriginal(r30) ; Shadow the L2CR
1c79356b
A
672 stw r13,pfl2cr(r30) ; Shadow the L2CR
673 stw r14,pfl2Size(r30) ; Set the L2 size
674
675; Take care of level 3 cache
676
677 mfspr r13,l3cr ; Get the L3CR
7b1edb79 678 rlwinm. r0,r13,0,l3e,l3e ; Any L3?
d52fe63f 679 bne+ init745Xhl3 ; Yes...
7b1edb79 680 rlwinm r17,r17,0,pfL3b+1,pfL3b-1 ; No L3, turn off feature
1c79356b 681
55e303ae
A
682init745Xhl3: cmplwi cr0,r13,0 ; No L3 if L3CR is zero
683 beq- init745Xnone ; Go turn off the features...
1c79356b
A
684 lis r14,hi16(1024*1024) ; Base L3 size
685 rlwinm r15,r13,4,31,31 ; Get size multiplier
686 slw r14,r14,r15 ; Set 1 or 2MB
687
55e303ae 688 stw r13,pfl3crOriginal(r30) ; Shadow the L3CR
1c79356b
A
689 stw r13,pfl3cr(r30) ; Shadow the L3CR
690 stw r14,pfl3Size(r30) ; Set the L3 size
d52fe63f 691 b init745Xfin ; Return....
1c79356b 692
d52fe63f 693init745Xnone:
55e303ae 694 rlwinm r17,r17,0,pfL3fab+1,pfL3b-1 ; No 3rd level cache or assist
0b4e3aa0
A
695 rlwinm r11,r17,pfWillNapb-pfCanNapb,pfCanNapb,pfCanNapb ; Set pfCanNap if pfWillNap is set
696 or r17,r17,r11
1c79356b 697
d52fe63f 698init745Xfin:
55e303ae 699 rlwinm r17,r17,0,pfWillNapb+1,pfWillNapb-1 ; Make sure pfWillNap is not set
0b4e3aa0
A
700
701 mfspr r11,hid0 ; Get the current HID0
1c79356b
A
702 stw r11,pfHID0(r30) ; Save the HID0 value
703 mfspr r11,hid1 ; Get the current HID1
704 stw r11,pfHID1(r30) ; Save the HID1 value
705 mfspr r11,msscr0 ; Get the msscr0 register
706 stw r11,pfMSSCR0(r30) ; Save the MSSCR0 value
707 mfspr r11,msscr1 ; Get the msscr1 register
708 stw r11,pfMSSCR1(r30) ; Save the MSSCR1 value
709 mfspr r11,ictrl ; Get the ictrl register
710 stw r11,pfICTRL(r30) ; Save the ICTRL value
711 mfspr r11,ldstcr ; Get the ldstcr register
712 stw r11,pfLDSTCR(r30) ; Save the LDSTCR value
0b4e3aa0
A
713 mfspr r11,ldstdb ; Get the ldstdb register
714 stw r11,pfLDSTDB(r30) ; Save the LDSTDB value
d52fe63f
A
715 mfspr r11,pir ; Get the pir register
716 stw r11,pfBootConfig(r30) ; Save the BootConfig value
1c79356b
A
717 blr ; Return....
718
719
d52fe63f 720init745Xnb: lwz r11,pfHID0(r30) ; Get HID0
1c79356b
A
721 sync
722 mtspr hid0,r11 ; Set the HID
723 isync
724 lwz r11,pfHID1(r30) ; Get HID1
725 sync
726 mtspr hid1,r11 ; Set the HID
727 isync
728 lwz r11,pfMSSCR0(r30) ; Get MSSCR0
729 sync
730 mtspr msscr0,r11 ; Set the MSSCR0
731 isync
732 sync
733 lwz r11,pfICTRL(r30) ; Get ICTRL
734 sync
735 mtspr ictrl,r11 ; Set the ICTRL
736 isync
737 sync
738 lwz r11,pfLDSTCR(r30) ; Get LDSTCR
739 sync
740 mtspr ldstcr,r11 ; Set the LDSTCR
741 isync
742 sync
0b4e3aa0
A
743 lwz r11,pfLDSTDB(r30) ; Get LDSTDB
744 sync
745 mtspr ldstdb,r11 ; Set the LDSTDB
746 isync
747 sync
1c79356b
A
748 blr
749
d52fe63f
A
750; 7450 - Specific
751
752init7450:
753 bf firstBoot, init745X ; Not boot, use standard init
754
755 mfspr r13, pir ; Get BootConfig from PIR
756 rlwinm. r14, r13, 0, 20, 23 ; Is the pdet value zero
757 bne init7450done ; No, done for now
758
759 ori r13, r13, 0x0400 ; Force pdet value to 4
760 mtspr pir, r13 ; Write back the BootConfig
761
762init7450done:
763 b init745X ; Continue with standard init
764
1c79356b 765
55e303ae
A
766init970:
767 li r20,0 ; Clear this
483a1d10 768 mtspr hior,r20 ; Make sure that 0 is interrupt prefix
55e303ae
A
769 bf firstBoot,init970nb ; No init for wakeup or second processor....
770
771
772 mfspr r11,hid0 ; Get original hid0
773 std r11,pfHID0(r30) ; Save original
774 mfspr r11,hid1 ; Get original hid1
775 std r11,pfHID1(r30) ; Save original
776 mfspr r11,hid4 ; Get original hid4
777 std r11,pfHID4(r30) ; Save original
778 mfspr r11,hid5 ; Get original hid5
779 std r11,pfHID5(r30) ; Save original
483a1d10
A
780
781 lis r0, hi16(dnapm) ; Create a mask for the dnap bit
782 sldi r0, r0, 32 ; Shift to the top half
783 ld r11,pfHID0(r30) ; Load the hid0 value
784 andc r11, r11, r0 ; Clear the dnap bit
785 isync
786 mtspr hid0,r11 ; Stuff it
787 mfspr r11,hid0 ; Get it
788 mfspr r11,hid0 ; Get it
789 mfspr r11,hid0 ; Get it
790 mfspr r11,hid0 ; Get it
791 mfspr r11,hid0 ; Get it
792 mfspr r11,hid0 ; Get it
793 isync
794
55e303ae
A
795;
796; We can not query or change the L2 size. We will just
797; phoney up a L2CR to make sysctl "happy" and set the
798; L2 size to 512K.
799;
800
801 lis r0,0x8000 ; Synthesize a "valid" but non-existant L2CR
802 stw r0,pfl2crOriginal(r30) ; Set a dummy L2CR
803 stw r0,pfl2cr(r30) ; Set a dummy L2CR
804 lis r0,8 ; Get 512K
805 stw r0,pfl2Size(r30) ; Set the L2 size
806
807 blr
808
809;
810; Start up code for second processor or wake up from sleep
811;
812
483a1d10
A
813init970nb:
814 lis r0, hi16(dnapm) ; Create a mask for the dnap bit
815 sldi r0, r0, 32 ; Shift to the top half
816 ld r11,pfHID0(r30) ; Load the hid0 value
817 andc r11, r11, r0 ; Clear the dnap bit
55e303ae
A
818 isync
819 mtspr hid0,r11 ; Stuff it
820 mfspr r11,hid0 ; Get it
821 mfspr r11,hid0 ; Get it
822 mfspr r11,hid0 ; Get it
823 mfspr r11,hid0 ; Get it
824 mfspr r11,hid0 ; Get it
825 mfspr r11,hid0 ; Get it
826 isync
827
828 ld r11,pfHID1(r30) ; Get it
829 isync
830 mtspr hid1,r11 ; Stick it
831 mtspr hid1,r11 ; Stick it again
832 isync
833
834 ld r11,pfHID4(r30) ; Get it
835 sync
836 mtspr hid4,r11 ; Stick it
837 isync
838
839 ld r11,pfHID5(r30) ; Get it
840 mtspr hid5,r11 ; Set it
841 isync
842 blr ; Leave...
843
844
845; Unsupported Processors
846initUnsupported:
847 mtlr r2 ; Restore the return address
848 blr ; Return to the booter
849
850
1c79356b
A
851;
852; Processor to feature table
853
854; .align 2 - Always on word boundary
855; .long ptFilter - Mask of significant bits in the Version/Revision code
856; - NOTE: Always order from most restrictive to least restrictive matching
857; .short ptVersion - Version code from PVR. Always start with 0 which is default
858; .short ptRevision - Revision code from PVR. A zero value denotes the generic attributes if not specific
859; .long ptFeatures - Available features
43866e37 860; .long ptCPUCap - Default value for _cpu_capabilities
4a249263 861; .long ptPwrModes - Available power management features
55e303ae 862; .long ptPatch - Patch features
1c79356b
A
863; .long ptInitRout - Initilization routine. Can modify any of the other attributes.
864; .long ptRptdProc - Processor type reported
1c79356b
A
865; .long ptLineSize - Level 1 cache line size
866; .long ptl1iSize - Level 1 instruction cache size
867; .long ptl1dSize - Level 1 data cache size
55e303ae
A
868; .long ptPTEG - Size of PTEG
869; .long ptMaxVAddr - Maximum effective address
870; .long ptMaxPAddr - Maximum physical address
871;
1c79356b
A
872
873 .align 2
874processor_types:
875
1c79356b
A
876; 750CX (ver 2.x)
877
55e303ae
A
878 .align 2
879 .long 0xFFFF0F00 ; 2.x vers
880 .short PROCESSOR_VERSION_750
881 .short 0x0200
882 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL2
883 .long kCache32 | kHasGraphicsOps | kHasStfiwx
4a249263 884 .long 0
55e303ae
A
885 .long PatchExt32
886 .long init750CX
887 .long CPU_SUBTYPE_POWERPC_750
55e303ae
A
888 .long 32
889 .long 32*1024
890 .long 32*1024
891 .long 64
892 .long 52
893 .long 32
894
1c79356b
A
895; 750 (generic)
896
55e303ae
A
897 .align 2
898 .long 0xFFFF0000 ; All revisions
899 .short PROCESSOR_VERSION_750
900 .short 0
483a1d10 901 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL2
55e303ae 902 .long kCache32 | kHasGraphicsOps | kHasStfiwx
4a249263 903 .long 0
55e303ae
A
904 .long PatchExt32
905 .long init750
906 .long CPU_SUBTYPE_POWERPC_750
55e303ae
A
907 .long 32
908 .long 32*1024
909 .long 32*1024
910 .long 64
911 .long 52
912 .long 32
913
d12e1678
A
914; 750FX (ver 1.x)
915
55e303ae
A
916 .align 2
917 .long 0xFFFF0F00 ; 1.x vers
918 .short PROCESSOR_VERSION_750FX
919 .short 0x0100
920 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfSlowNap | pfNoMuMMCK | pf32Byte | pfL2
921 .long kCache32 | kHasGraphicsOps | kHasStfiwx
4a249263 922 .long pmDualPLL
55e303ae
A
923 .long PatchExt32
924 .long init750FX
925 .long CPU_SUBTYPE_POWERPC_750
55e303ae
A
926 .long 32
927 .long 32*1024
928 .long 32*1024
929 .long 64
930 .long 52
931 .long 32
932
9bccf70c 933; 750FX (generic)
0b4e3aa0 934
55e303ae
A
935 .align 2
936 .long 0xFFFF0000 ; All revisions
937 .short PROCESSOR_VERSION_750FX
938 .short 0
939 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfSlowNap | pfNoMuMMCK | pf32Byte | pfL2
940 .long kCache32 | kHasGraphicsOps | kHasStfiwx
4a249263 941 .long pmDualPLL | pmDPLLVmin
55e303ae
A
942 .long PatchExt32
943 .long init750FXV2
944 .long CPU_SUBTYPE_POWERPC_750
55e303ae
A
945 .long 32
946 .long 32*1024
947 .long 32*1024
948 .long 64
949 .long 52
950 .long 32
951
9bccf70c
A
952; 7400 (ver 2.0 - ver 2.7)
953
55e303ae
A
954 .align 2
955 .long 0xFFFFFFF8 ; ver 2.0 - 2.7
956 .short PROCESSOR_VERSION_7400
957 .short 0x0200
483a1d10 958 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL1fa | pfL2 | pfL2fa | pfHasDcba
55e303ae 959 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 960 .long 0
55e303ae
A
961 .long PatchExt32
962 .long init7400v2_7
963 .long CPU_SUBTYPE_POWERPC_7400
55e303ae
A
964 .long 32
965 .long 32*1024
966 .long 32*1024
967 .long 64
968 .long 52
969 .long 32
970
1c79356b
A
971; 7400 (generic)
972
55e303ae
A
973 .align 2
974 .long 0xFFFF0000 ; All revisions
975 .short PROCESSOR_VERSION_7400
976 .short 0
483a1d10 977 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL1fa | pfL2 | pfL2fa | pfHasDcba
55e303ae 978 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 979 .long 0
55e303ae
A
980 .long PatchExt32
981 .long init7400
982 .long CPU_SUBTYPE_POWERPC_7400
55e303ae
A
983 .long 32
984 .long 32*1024
985 .long 32*1024
986 .long 64
987 .long 52
988 .long 36
989
1c79356b
A
990; 7410 (ver 1.1)
991
55e303ae
A
992 .align 2
993 .long 0xFFFFFFFF ; Exact match
994 .short PROCESSOR_VERSION_7400
995 .short 0x1101
996 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL1fa | pfL2 | pfL2fa | pfHasDcba
997 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 998 .long 0
55e303ae
A
999 .long PatchExt32
1000 .long init7410
1001 .long CPU_SUBTYPE_POWERPC_7400
55e303ae
A
1002 .long 32
1003 .long 32*1024
1004 .long 32*1024
1005 .long 64
1006 .long 52
1007 .long 36
1c79356b
A
1008
1009; 7410 (generic)
1010
55e303ae
A
1011 .align 2
1012 .long 0xFFFF0000 ; All other revisions
1013 .short PROCESSOR_VERSION_7410
1014 .short 0
1015 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pf32Byte | pfL1fa | pfL2 | pfL2fa | pfHasDcba
1016 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1017 .long 0
55e303ae
A
1018 .long PatchExt32
1019 .long init7410
1020 .long CPU_SUBTYPE_POWERPC_7400
55e303ae
A
1021 .long 32
1022 .long 32*1024
1023 .long 32*1024
1024 .long 64
1025 .long 52
1026 .long 36
1c79356b
A
1027
1028; 7450 (ver 1.xx)
1029
55e303ae
A
1030 .align 2
1031 .long 0xFFFFFF00 ; Just revisions 1.xx
1032 .short PROCESSOR_VERSION_7450
1033 .short 0x0100
1034 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1035 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1036 .long 0
55e303ae
A
1037 .long PatchExt32
1038 .long init7450
1039 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1040 .long 32
1041 .long 32*1024
1042 .long 32*1024
1043 .long 64
1044 .long 52
1045 .long 36
1c79356b 1046
0b4e3aa0
A
1047; 7450 (2.0)
1048
55e303ae
A
1049 .align 2
1050 .long 0xFFFFFFFF ; Just revision 2.0
1051 .short PROCESSOR_VERSION_7450
1052 .short 0x0200
1053 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1054 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1055 .long 0
55e303ae
A
1056 .long PatchExt32
1057 .long init7450
1058 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1059 .long 32
1060 .long 32*1024
1061 .long 32*1024
1062 .long 64
1063 .long 52
1064 .long 36
0b4e3aa0
A
1065
1066; 7450 (2.1)
1c79356b 1067
55e303ae
A
1068 .align 2
1069 .long 0xFFFF0000 ; All other revisions
1070 .short PROCESSOR_VERSION_7450
1071 .short 0
1072 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfWillNap | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1073 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1074 .long 0
55e303ae
A
1075 .long PatchExt32
1076 .long init7450
1077 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1078 .long 32
1079 .long 32*1024
1080 .long 32*1024
1081 .long 64
1082 .long 52
1083 .long 36
1c79356b 1084
d52fe63f
A
1085; 7455 (1.xx) Just like 7450 2.0
1086
55e303ae
A
1087 .align 2
1088 .long 0xFFFFFF00 ; Just revisions 1.xx
1089 .short PROCESSOR_VERSION_7455
1090 .short 0x0100
1091 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1092 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1093 .long 0
55e303ae
A
1094 .long PatchExt32
1095 .long init745X
1096 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1097 .long 32
1098 .long 32*1024
1099 .long 32*1024
1100 .long 64
1101 .long 52
1102 .long 36
d52fe63f
A
1103
1104; 7455 (2.0)
1105
55e303ae
A
1106 .align 2
1107 .long 0xFFFFFFFF ; Just revision 2.0
1108 .short PROCESSOR_VERSION_7455
1109 .short 0x0200
1110 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfWillNap | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1111 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1112 .long 0
55e303ae
A
1113 .long PatchExt32
1114 .long init745X
1115 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1116 .long 32
1117 .long 32*1024
1118 .long 32*1024
1119 .long 64
1120 .long 52
1121 .long 36
d52fe63f
A
1122
1123; 7455 (2.1)
1124
55e303ae
A
1125 .align 2
1126 .long 0xFFFF0000 ; All other revisions
1127 .short PROCESSOR_VERSION_7455
1128 .short 0
1129 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1130 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1131 .long 0
55e303ae
A
1132 .long PatchExt32
1133 .long init745X
1134 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1135 .long 32
1136 .long 32*1024
1137 .long 32*1024
1138 .long 64
1139 .long 52
1140 .long 36
43866e37
A
1141
1142; 7457
1143
55e303ae
A
1144 .align 2
1145 .long 0xFFFF0000 ; All revisions
1146 .short PROCESSOR_VERSION_7457
1147 .short 0
1148 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1149 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
4a249263 1150 .long 0
55e303ae
A
1151 .long PatchExt32
1152 .long init745X
1153 .long CPU_SUBTYPE_POWERPC_7450
55e303ae
A
1154 .long 32
1155 .long 32*1024
1156 .long 32*1024
1157 .long 64
1158 .long 52
1159 .long 36
1160
e5568f75
A
1161; 7447A
1162
1163 .align 2
1164 .long 0xFFFF0000 ; All revisions
1165 .short PROCESSOR_VERSION_7447A
1166 .short 0
1167 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfNoMSRir | pfNoL2PFNap | pfLClck | pf32Byte | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa | pfHasDcba
1168 .long kHasAltivec | kCache32 | kDcbaAvailable | kDataStreamsRecommended | kDataStreamsAvailable | kHasGraphicsOps | kHasStfiwx
1169 .long pmDFS
1170 .long PatchExt32
1171 .long init745X
1172 .long CPU_SUBTYPE_POWERPC_7450
e5568f75
A
1173 .long 32
1174 .long 32*1024
1175 .long 32*1024
1176 .long 64
1177 .long 52
1178 .long 36
1179
55e303ae
A
1180; 970
1181
1182 .align 2
1183 .long 0xFFFF0000 ; All versions so far
1184 .short PROCESSOR_VERSION_970
1185 .short 0
1186 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pf128Byte | pf64Bit | pfL2 | pfSCOMFixUp
1187 .long kHasAltivec | k64Bit | kCache128 | kDataStreamsAvailable | kDcbtStreamsRecommended | kDcbtStreamsAvailable | kHasGraphicsOps | kHasStfiwx | kHasFsqrt
4a249263
A
1188 .long 0
1189 .long PatchLwsync
1190 .long init970
1191 .long CPU_SUBTYPE_POWERPC_970
4a249263
A
1192 .long 128
1193 .long 64*1024
1194 .long 32*1024
1195 .long 128
1196 .long 65
1197 .long 42
1198
1199; 970FX
1200
1201 .align 2
1202 .long 0xFFFF0000 ; All versions so far
1203 .short PROCESSOR_VERSION_970FX
1204 .short 0
1205 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pf128Byte | pf64Bit | pfL2
1206 .long kHasAltivec | k64Bit | kCache128 | kDataStreamsAvailable | kDcbtStreamsRecommended | kDcbtStreamsAvailable | kHasGraphicsOps | kHasStfiwx | kHasFsqrt
1207 .long pmPowerTune
55e303ae
A
1208 .long PatchLwsync
1209 .long init970
1210 .long CPU_SUBTYPE_POWERPC_970
55e303ae
A
1211 .long 128
1212 .long 64*1024
1213 .long 32*1024
1214 .long 128
1215 .long 65
1216 .long 42
1217
1218; All other processors are not supported
1219
1220 .align 2
1221 .long 0x00000000 ; Matches everything
1222 .short 0
1223 .short 0
1224 .long pfFloat | pf32Byte
1225 .long kCache32 | kHasGraphicsOps | kHasStfiwx
4a249263 1226 .long 0
55e303ae
A
1227 .long PatchExt32
1228 .long initUnsupported
1229 .long CPU_SUBTYPE_POWERPC_ALL
55e303ae
A
1230 .long 32
1231 .long 32*1024
1232 .long 32*1024
1233 .long 64
1234 .long 52
1235 .long 32
1c79356b 1236