diff options
Diffstat (limited to 'arch/ppc/kernel')
-rw-r--r-- | arch/ppc/kernel/entry.S | 52 | ||||
-rw-r--r-- | arch/ppc/kernel/head.S | 183 | ||||
-rw-r--r-- | arch/ppc/kernel/pci.c | 396 | ||||
-rw-r--r-- | arch/ppc/kernel/ppc_htab.c | 8 | ||||
-rw-r--r-- | arch/ppc/kernel/ppc_ksyms.c | 22 | ||||
-rw-r--r-- | arch/ppc/kernel/setup.c | 254 |
6 files changed, 12 insertions, 903 deletions
diff --git a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S index fa8d49789ef1..5891ecbdc703 100644 --- a/arch/ppc/kernel/entry.S +++ b/arch/ppc/kernel/entry.S | |||
@@ -930,55 +930,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_601) | |||
930 | b 4b | 930 | b 4b |
931 | 931 | ||
932 | .comm ee_restarts,4 | 932 | .comm ee_restarts,4 |
933 | |||
934 | /* | ||
935 | * PROM code for specific machines follows. Put it | ||
936 | * here so it's easy to add arch-specific sections later. | ||
937 | * -- Cort | ||
938 | */ | ||
939 | #ifdef CONFIG_PPC_OF | ||
940 | /* | ||
941 | * On CHRP, the Run-Time Abstraction Services (RTAS) have to be | ||
942 | * called with the MMU off. | ||
943 | */ | ||
944 | _GLOBAL(enter_rtas) | ||
945 | stwu r1,-INT_FRAME_SIZE(r1) | ||
946 | mflr r0 | ||
947 | stw r0,INT_FRAME_SIZE+4(r1) | ||
948 | lis r4,rtas_data@ha | ||
949 | lwz r4,rtas_data@l(r4) | ||
950 | lis r6,1f@ha /* physical return address for rtas */ | ||
951 | addi r6,r6,1f@l | ||
952 | tophys(r6,r6) | ||
953 | tophys(r7,r1) | ||
954 | lis r8,rtas_entry@ha | ||
955 | lwz r8,rtas_entry@l(r8) | ||
956 | mfmsr r9 | ||
957 | stw r9,8(r1) | ||
958 | LOAD_MSR_KERNEL(r0,MSR_KERNEL) | ||
959 | SYNC /* disable interrupts so SRR0/1 */ | ||
960 | MTMSRD(r0) /* don't get trashed */ | ||
961 | li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR) | ||
962 | mtlr r6 | ||
963 | CLR_TOP32(r7) | ||
964 | mtspr SPRN_SPRG2,r7 | ||
965 | mtspr SPRN_SRR0,r8 | ||
966 | mtspr SPRN_SRR1,r9 | ||
967 | RFI | ||
968 | 1: tophys(r9,r1) | ||
969 | lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */ | ||
970 | lwz r9,8(r9) /* original msr value */ | ||
971 | FIX_SRR1(r9,r0) | ||
972 | addi r1,r1,INT_FRAME_SIZE | ||
973 | li r0,0 | ||
974 | mtspr SPRN_SPRG2,r0 | ||
975 | mtspr SPRN_SRR0,r8 | ||
976 | mtspr SPRN_SRR1,r9 | ||
977 | RFI /* return to caller */ | ||
978 | |||
979 | .globl machine_check_in_rtas | ||
980 | machine_check_in_rtas: | ||
981 | twi 31,0,0 | ||
982 | /* XXX load up BATs and panic */ | ||
983 | |||
984 | #endif /* CONFIG_PPC_OF */ | ||
diff --git a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S index 53ea845fb911..01303efeddad 100644 --- a/arch/ppc/kernel/head.S +++ b/arch/ppc/kernel/head.S | |||
@@ -37,19 +37,6 @@ | |||
37 | #include <asm/amigappc.h> | 37 | #include <asm/amigappc.h> |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #ifdef CONFIG_PPC64BRIDGE | ||
41 | #define LOAD_BAT(n, reg, RA, RB) \ | ||
42 | ld RA,(n*32)+0(reg); \ | ||
43 | ld RB,(n*32)+8(reg); \ | ||
44 | mtspr SPRN_IBAT##n##U,RA; \ | ||
45 | mtspr SPRN_IBAT##n##L,RB; \ | ||
46 | ld RA,(n*32)+16(reg); \ | ||
47 | ld RB,(n*32)+24(reg); \ | ||
48 | mtspr SPRN_DBAT##n##U,RA; \ | ||
49 | mtspr SPRN_DBAT##n##L,RB; \ | ||
50 | |||
51 | #else /* CONFIG_PPC64BRIDGE */ | ||
52 | |||
53 | /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ | 40 | /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ |
54 | #define LOAD_BAT(n, reg, RA, RB) \ | 41 | #define LOAD_BAT(n, reg, RA, RB) \ |
55 | /* see the comment for clear_bats() -- Cort */ \ | 42 | /* see the comment for clear_bats() -- Cort */ \ |
@@ -66,7 +53,6 @@ | |||
66 | mtspr SPRN_DBAT##n##U,RA; \ | 53 | mtspr SPRN_DBAT##n##U,RA; \ |
67 | mtspr SPRN_DBAT##n##L,RB; \ | 54 | mtspr SPRN_DBAT##n##L,RB; \ |
68 | 1: | 55 | 1: |
69 | #endif /* CONFIG_PPC64BRIDGE */ | ||
70 | 56 | ||
71 | .text | 57 | .text |
72 | .stabs "arch/ppc/kernel/",N_SO,0,0,0f | 58 | .stabs "arch/ppc/kernel/",N_SO,0,0,0f |
@@ -129,11 +115,6 @@ _start: | |||
129 | 115 | ||
130 | .globl __start | 116 | .globl __start |
131 | __start: | 117 | __start: |
132 | /* | ||
133 | * We have to do any OF calls before we map ourselves to KERNELBASE, | ||
134 | * because OF may have I/O devices mapped into that area | ||
135 | * (particularly on CHRP). | ||
136 | */ | ||
137 | mr r31,r3 /* save parameters */ | 118 | mr r31,r3 /* save parameters */ |
138 | mr r30,r4 | 119 | mr r30,r4 |
139 | mr r29,r5 | 120 | mr r29,r5 |
@@ -148,14 +129,6 @@ __start: | |||
148 | */ | 129 | */ |
149 | bl early_init | 130 | bl early_init |
150 | 131 | ||
151 | /* | ||
152 | * On POWER4, we first need to tweak some CPU configuration registers | ||
153 | * like real mode cache inhibit or exception base | ||
154 | */ | ||
155 | #ifdef CONFIG_POWER4 | ||
156 | bl __970_cpu_preinit | ||
157 | #endif /* CONFIG_POWER4 */ | ||
158 | |||
159 | #ifdef CONFIG_APUS | 132 | #ifdef CONFIG_APUS |
160 | /* On APUS the __va/__pa constants need to be set to the correct | 133 | /* On APUS the __va/__pa constants need to be set to the correct |
161 | * values before continuing. | 134 | * values before continuing. |
@@ -169,7 +142,6 @@ __start: | |||
169 | */ | 142 | */ |
170 | bl mmu_off | 143 | bl mmu_off |
171 | __after_mmu_off: | 144 | __after_mmu_off: |
172 | #ifndef CONFIG_POWER4 | ||
173 | bl clear_bats | 145 | bl clear_bats |
174 | bl flush_tlbs | 146 | bl flush_tlbs |
175 | 147 | ||
@@ -177,10 +149,6 @@ __after_mmu_off: | |||
177 | #if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) | 149 | #if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) |
178 | bl setup_disp_bat | 150 | bl setup_disp_bat |
179 | #endif | 151 | #endif |
180 | #else /* CONFIG_POWER4 */ | ||
181 | bl reloc_offset | ||
182 | bl initial_mm_power4 | ||
183 | #endif /* CONFIG_POWER4 */ | ||
184 | 152 | ||
185 | /* | 153 | /* |
186 | * Call setup_cpu for CPU 0 and initialize 6xx Idle | 154 | * Call setup_cpu for CPU 0 and initialize 6xx Idle |
@@ -192,18 +160,11 @@ __after_mmu_off: | |||
192 | bl reloc_offset | 160 | bl reloc_offset |
193 | bl init_idle_6xx | 161 | bl init_idle_6xx |
194 | #endif /* CONFIG_6xx */ | 162 | #endif /* CONFIG_6xx */ |
195 | #ifdef CONFIG_POWER4 | ||
196 | bl reloc_offset | ||
197 | bl init_idle_power4 | ||
198 | #endif /* CONFIG_POWER4 */ | ||
199 | 163 | ||
200 | 164 | ||
201 | #ifndef CONFIG_APUS | 165 | #ifndef CONFIG_APUS |
202 | /* | 166 | /* |
203 | * We need to run with _start at physical address 0. | 167 | * We need to run with _start at physical address 0. |
204 | * On CHRP, we are loaded at 0x10000 since OF on CHRP uses | ||
205 | * the exception vectors at 0 (and therefore this copy | ||
206 | * overwrites OF's exception vectors with our own). | ||
207 | * If the MMU is already turned on, we copy stuff to KERNELBASE, | 168 | * If the MMU is already turned on, we copy stuff to KERNELBASE, |
208 | * otherwise we copy it to 0. | 169 | * otherwise we copy it to 0. |
209 | */ | 170 | */ |
@@ -358,51 +319,19 @@ i##n: \ | |||
358 | #endif | 319 | #endif |
359 | 320 | ||
360 | /* Machine check */ | 321 | /* Machine check */ |
361 | /* | ||
362 | * On CHRP, this is complicated by the fact that we could get a | ||
363 | * machine check inside RTAS, and we have no guarantee that certain | ||
364 | * critical registers will have the values we expect. The set of | ||
365 | * registers that might have bad values includes all the GPRs | ||
366 | * and all the BATs. We indicate that we are in RTAS by putting | ||
367 | * a non-zero value, the address of the exception frame to use, | ||
368 | * in SPRG2. The machine check handler checks SPRG2 and uses its | ||
369 | * value if it is non-zero. If we ever needed to free up SPRG2, | ||
370 | * we could use a field in the thread_info or thread_struct instead. | ||
371 | * (Other exception handlers assume that r1 is a valid kernel stack | ||
372 | * pointer when we take an exception from supervisor mode.) | ||
373 | * -- paulus. | ||
374 | */ | ||
375 | . = 0x200 | 322 | . = 0x200 |
376 | mtspr SPRN_SPRG0,r10 | 323 | mtspr SPRN_SPRG0,r10 |
377 | mtspr SPRN_SPRG1,r11 | 324 | mtspr SPRN_SPRG1,r11 |
378 | mfcr r10 | 325 | mfcr r10 |
379 | #ifdef CONFIG_PPC_CHRP | ||
380 | mfspr r11,SPRN_SPRG2 | ||
381 | cmpwi 0,r11,0 | ||
382 | bne 7f | ||
383 | #endif /* CONFIG_PPC_CHRP */ | ||
384 | EXCEPTION_PROLOG_1 | 326 | EXCEPTION_PROLOG_1 |
385 | 7: EXCEPTION_PROLOG_2 | 327 | 7: EXCEPTION_PROLOG_2 |
386 | addi r3,r1,STACK_FRAME_OVERHEAD | 328 | addi r3,r1,STACK_FRAME_OVERHEAD |
387 | #ifdef CONFIG_PPC_CHRP | ||
388 | mfspr r4,SPRN_SPRG2 | ||
389 | cmpwi cr1,r4,0 | ||
390 | bne cr1,1f | ||
391 | #endif | ||
392 | EXC_XFER_STD(0x200, machine_check_exception) | 329 | EXC_XFER_STD(0x200, machine_check_exception) |
393 | #ifdef CONFIG_PPC_CHRP | ||
394 | 1: b machine_check_in_rtas | ||
395 | #endif | ||
396 | 330 | ||
397 | /* Data access exception. */ | 331 | /* Data access exception. */ |
398 | . = 0x300 | 332 | . = 0x300 |
399 | #ifdef CONFIG_PPC64BRIDGE | ||
400 | b DataAccess | ||
401 | DataAccessCont: | ||
402 | #else | ||
403 | DataAccess: | 333 | DataAccess: |
404 | EXCEPTION_PROLOG | 334 | EXCEPTION_PROLOG |
405 | #endif /* CONFIG_PPC64BRIDGE */ | ||
406 | mfspr r10,SPRN_DSISR | 335 | mfspr r10,SPRN_DSISR |
407 | andis. r0,r10,0xa470 /* weird error? */ | 336 | andis. r0,r10,0xa470 /* weird error? */ |
408 | bne 1f /* if not, try to put a PTE */ | 337 | bne 1f /* if not, try to put a PTE */ |
@@ -414,21 +343,10 @@ DataAccess: | |||
414 | mfspr r4,SPRN_DAR | 343 | mfspr r4,SPRN_DAR |
415 | EXC_XFER_EE_LITE(0x300, handle_page_fault) | 344 | EXC_XFER_EE_LITE(0x300, handle_page_fault) |
416 | 345 | ||
417 | #ifdef CONFIG_PPC64BRIDGE | ||
418 | /* SLB fault on data access. */ | ||
419 | . = 0x380 | ||
420 | b DataSegment | ||
421 | #endif /* CONFIG_PPC64BRIDGE */ | ||
422 | |||
423 | /* Instruction access exception. */ | 346 | /* Instruction access exception. */ |
424 | . = 0x400 | 347 | . = 0x400 |
425 | #ifdef CONFIG_PPC64BRIDGE | ||
426 | b InstructionAccess | ||
427 | InstructionAccessCont: | ||
428 | #else | ||
429 | InstructionAccess: | 348 | InstructionAccess: |
430 | EXCEPTION_PROLOG | 349 | EXCEPTION_PROLOG |
431 | #endif /* CONFIG_PPC64BRIDGE */ | ||
432 | andis. r0,r9,0x4000 /* no pte found? */ | 350 | andis. r0,r9,0x4000 /* no pte found? */ |
433 | beq 1f /* if so, try to put a PTE */ | 351 | beq 1f /* if so, try to put a PTE */ |
434 | li r3,0 /* into the hash table */ | 352 | li r3,0 /* into the hash table */ |
@@ -438,12 +356,6 @@ InstructionAccess: | |||
438 | mr r5,r9 | 356 | mr r5,r9 |
439 | EXC_XFER_EE_LITE(0x400, handle_page_fault) | 357 | EXC_XFER_EE_LITE(0x400, handle_page_fault) |
440 | 358 | ||
441 | #ifdef CONFIG_PPC64BRIDGE | ||
442 | /* SLB fault on instruction access. */ | ||
443 | . = 0x480 | ||
444 | b InstructionSegment | ||
445 | #endif /* CONFIG_PPC64BRIDGE */ | ||
446 | |||
447 | /* External interrupt */ | 359 | /* External interrupt */ |
448 | EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE) | 360 | EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE) |
449 | 361 | ||
@@ -708,15 +620,9 @@ DataStoreTLBMiss: | |||
708 | EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE) | 620 | EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE) |
709 | EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE) | 621 | EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE) |
710 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) | 622 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) |
711 | #ifdef CONFIG_POWER4 | ||
712 | EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE) | ||
713 | EXCEPTION(0x1700, Trap_17, altivec_assist_exception, EXC_XFER_EE) | ||
714 | EXCEPTION(0x1800, Trap_18, TAUException, EXC_XFER_STD) | ||
715 | #else /* !CONFIG_POWER4 */ | ||
716 | EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE) | 623 | EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE) |
717 | EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD) | 624 | EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD) |
718 | EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE) | 625 | EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE) |
719 | #endif /* CONFIG_POWER4 */ | ||
720 | EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE) | 626 | EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE) |
721 | EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE) | 627 | EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE) |
722 | EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE) | 628 | EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE) |
@@ -754,28 +660,6 @@ AltiVecUnavailable: | |||
754 | addi r3,r1,STACK_FRAME_OVERHEAD | 660 | addi r3,r1,STACK_FRAME_OVERHEAD |
755 | EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception) | 661 | EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception) |
756 | 662 | ||
757 | #ifdef CONFIG_PPC64BRIDGE | ||
758 | DataAccess: | ||
759 | EXCEPTION_PROLOG | ||
760 | b DataAccessCont | ||
761 | |||
762 | InstructionAccess: | ||
763 | EXCEPTION_PROLOG | ||
764 | b InstructionAccessCont | ||
765 | |||
766 | DataSegment: | ||
767 | EXCEPTION_PROLOG | ||
768 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
769 | mfspr r4,SPRN_DAR | ||
770 | stw r4,_DAR(r11) | ||
771 | EXC_XFER_STD(0x380, unknown_exception) | ||
772 | |||
773 | InstructionSegment: | ||
774 | EXCEPTION_PROLOG | ||
775 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
776 | EXC_XFER_STD(0x480, unknown_exception) | ||
777 | #endif /* CONFIG_PPC64BRIDGE */ | ||
778 | |||
779 | #ifdef CONFIG_ALTIVEC | 663 | #ifdef CONFIG_ALTIVEC |
780 | /* Note that the AltiVec support is closely modeled after the FP | 664 | /* Note that the AltiVec support is closely modeled after the FP |
781 | * support. Changes to one are likely to be applicable to the | 665 | * support. Changes to one are likely to be applicable to the |
@@ -1048,13 +932,6 @@ __secondary_start_pmac_0: | |||
1048 | 932 | ||
1049 | .globl __secondary_start | 933 | .globl __secondary_start |
1050 | __secondary_start: | 934 | __secondary_start: |
1051 | #ifdef CONFIG_PPC64BRIDGE | ||
1052 | mfmsr r0 | ||
1053 | clrldi r0,r0,1 /* make sure it's in 32-bit mode */ | ||
1054 | SYNC | ||
1055 | MTMSRD(r0) | ||
1056 | isync | ||
1057 | #endif | ||
1058 | /* Copy some CPU settings from CPU 0 */ | 935 | /* Copy some CPU settings from CPU 0 */ |
1059 | bl __restore_cpu_setup | 936 | bl __restore_cpu_setup |
1060 | 937 | ||
@@ -1065,10 +942,6 @@ __secondary_start: | |||
1065 | lis r3,-KERNELBASE@h | 942 | lis r3,-KERNELBASE@h |
1066 | bl init_idle_6xx | 943 | bl init_idle_6xx |
1067 | #endif /* CONFIG_6xx */ | 944 | #endif /* CONFIG_6xx */ |
1068 | #ifdef CONFIG_POWER4 | ||
1069 | lis r3,-KERNELBASE@h | ||
1070 | bl init_idle_power4 | ||
1071 | #endif /* CONFIG_POWER4 */ | ||
1072 | 945 | ||
1073 | /* get current_thread_info and current */ | 946 | /* get current_thread_info and current */ |
1074 | lis r1,secondary_ti@ha | 947 | lis r1,secondary_ti@ha |
@@ -1109,12 +982,12 @@ __secondary_start: | |||
1109 | * Those generic dummy functions are kept for CPUs not | 982 | * Those generic dummy functions are kept for CPUs not |
1110 | * included in CONFIG_6xx | 983 | * included in CONFIG_6xx |
1111 | */ | 984 | */ |
1112 | #if !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) | 985 | #if !defined(CONFIG_6xx) |
1113 | _GLOBAL(__save_cpu_setup) | 986 | _GLOBAL(__save_cpu_setup) |
1114 | blr | 987 | blr |
1115 | _GLOBAL(__restore_cpu_setup) | 988 | _GLOBAL(__restore_cpu_setup) |
1116 | blr | 989 | blr |
1117 | #endif /* !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) */ | 990 | #endif /* !defined(CONFIG_6xx) */ |
1118 | 991 | ||
1119 | 992 | ||
1120 | /* | 993 | /* |
@@ -1132,11 +1005,6 @@ load_up_mmu: | |||
1132 | tophys(r6,r6) | 1005 | tophys(r6,r6) |
1133 | lwz r6,_SDR1@l(r6) | 1006 | lwz r6,_SDR1@l(r6) |
1134 | mtspr SPRN_SDR1,r6 | 1007 | mtspr SPRN_SDR1,r6 |
1135 | #ifdef CONFIG_PPC64BRIDGE | ||
1136 | /* clear the ASR so we only use the pseudo-segment registers. */ | ||
1137 | li r6,0 | ||
1138 | mtasr r6 | ||
1139 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1140 | li r0,16 /* load up segment register values */ | 1008 | li r0,16 /* load up segment register values */ |
1141 | mtctr r0 /* for context 0 */ | 1009 | mtctr r0 /* for context 0 */ |
1142 | lis r3,0x2000 /* Ku = 1, VSID = 0 */ | 1010 | lis r3,0x2000 /* Ku = 1, VSID = 0 */ |
@@ -1145,7 +1013,7 @@ load_up_mmu: | |||
1145 | addi r3,r3,0x111 /* increment VSID */ | 1013 | addi r3,r3,0x111 /* increment VSID */ |
1146 | addis r4,r4,0x1000 /* address of next segment */ | 1014 | addis r4,r4,0x1000 /* address of next segment */ |
1147 | bdnz 3b | 1015 | bdnz 3b |
1148 | #ifndef CONFIG_POWER4 | 1016 | |
1149 | /* Load the BAT registers with the values set up by MMU_init. | 1017 | /* Load the BAT registers with the values set up by MMU_init. |
1150 | MMU_init takes care of whether we're on a 601 or not. */ | 1018 | MMU_init takes care of whether we're on a 601 or not. */ |
1151 | mfpvr r3 | 1019 | mfpvr r3 |
@@ -1158,7 +1026,7 @@ load_up_mmu: | |||
1158 | LOAD_BAT(1,r3,r4,r5) | 1026 | LOAD_BAT(1,r3,r4,r5) |
1159 | LOAD_BAT(2,r3,r4,r5) | 1027 | LOAD_BAT(2,r3,r4,r5) |
1160 | LOAD_BAT(3,r3,r4,r5) | 1028 | LOAD_BAT(3,r3,r4,r5) |
1161 | #endif /* CONFIG_POWER4 */ | 1029 | |
1162 | blr | 1030 | blr |
1163 | 1031 | ||
1164 | /* | 1032 | /* |
@@ -1269,9 +1137,6 @@ _GLOBAL(set_context) | |||
1269 | li r4,0 | 1137 | li r4,0 |
1270 | isync | 1138 | isync |
1271 | 3: | 1139 | 3: |
1272 | #ifdef CONFIG_PPC64BRIDGE | ||
1273 | slbie r4 | ||
1274 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1275 | mtsrin r3,r4 | 1140 | mtsrin r3,r4 |
1276 | addi r3,r3,0x111 /* next VSID */ | 1141 | addi r3,r3,0x111 /* next VSID */ |
1277 | rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */ | 1142 | rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */ |
@@ -1358,7 +1223,6 @@ mmu_off: | |||
1358 | sync | 1223 | sync |
1359 | RFI | 1224 | RFI |
1360 | 1225 | ||
1361 | #ifndef CONFIG_POWER4 | ||
1362 | /* | 1226 | /* |
1363 | * Use the first pair of BAT registers to map the 1st 16MB | 1227 | * Use the first pair of BAT registers to map the 1st 16MB |
1364 | * of RAM to KERNELBASE. From this point on we can't safely | 1228 | * of RAM to KERNELBASE. From this point on we can't safely |
@@ -1366,7 +1230,6 @@ mmu_off: | |||
1366 | */ | 1230 | */ |
1367 | initial_bats: | 1231 | initial_bats: |
1368 | lis r11,KERNELBASE@h | 1232 | lis r11,KERNELBASE@h |
1369 | #ifndef CONFIG_PPC64BRIDGE | ||
1370 | mfspr r9,SPRN_PVR | 1233 | mfspr r9,SPRN_PVR |
1371 | rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */ | 1234 | rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */ |
1372 | cmpwi 0,r9,1 | 1235 | cmpwi 0,r9,1 |
@@ -1381,7 +1244,6 @@ initial_bats: | |||
1381 | mtspr SPRN_IBAT1L,r10 | 1244 | mtspr SPRN_IBAT1L,r10 |
1382 | isync | 1245 | isync |
1383 | blr | 1246 | blr |
1384 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1385 | 1247 | ||
1386 | 4: tophys(r8,r11) | 1248 | 4: tophys(r8,r11) |
1387 | #ifdef CONFIG_SMP | 1249 | #ifdef CONFIG_SMP |
@@ -1395,11 +1257,6 @@ initial_bats: | |||
1395 | ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */ | 1257 | ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */ |
1396 | #endif /* CONFIG_APUS */ | 1258 | #endif /* CONFIG_APUS */ |
1397 | 1259 | ||
1398 | #ifdef CONFIG_PPC64BRIDGE | ||
1399 | /* clear out the high 32 bits in the BAT */ | ||
1400 | clrldi r11,r11,32 | ||
1401 | clrldi r8,r8,32 | ||
1402 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1403 | mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */ | 1260 | mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */ |
1404 | mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */ | 1261 | mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */ |
1405 | mtspr SPRN_IBAT0L,r8 | 1262 | mtspr SPRN_IBAT0L,r8 |
@@ -1432,38 +1289,6 @@ setup_disp_bat: | |||
1432 | 1289 | ||
1433 | #endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */ | 1290 | #endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */ |
1434 | 1291 | ||
1435 | #else /* CONFIG_POWER4 */ | ||
1436 | /* | ||
1437 | * Load up the SDR1 and segment register values now | ||
1438 | * since we don't have the BATs. | ||
1439 | * Also make sure we are running in 32-bit mode. | ||
1440 | */ | ||
1441 | |||
1442 | initial_mm_power4: | ||
1443 | addis r14,r3,_SDR1@ha /* get the value from _SDR1 */ | ||
1444 | lwz r14,_SDR1@l(r14) /* assume hash table below 4GB */ | ||
1445 | mtspr SPRN_SDR1,r14 | ||
1446 | slbia | ||
1447 | lis r4,0x2000 /* set pseudo-segment reg 12 */ | ||
1448 | ori r5,r4,0x0ccc | ||
1449 | mtsr 12,r5 | ||
1450 | #if 0 | ||
1451 | ori r5,r4,0x0888 /* set pseudo-segment reg 8 */ | ||
1452 | mtsr 8,r5 /* (for access to serial port) */ | ||
1453 | #endif | ||
1454 | #ifdef CONFIG_BOOTX_TEXT | ||
1455 | ori r5,r4,0x0999 /* set pseudo-segment reg 9 */ | ||
1456 | mtsr 9,r5 /* (for access to screen) */ | ||
1457 | #endif | ||
1458 | mfmsr r0 | ||
1459 | clrldi r0,r0,1 | ||
1460 | sync | ||
1461 | mtmsr r0 | ||
1462 | isync | ||
1463 | blr | ||
1464 | |||
1465 | #endif /* CONFIG_POWER4 */ | ||
1466 | |||
1467 | #ifdef CONFIG_8260 | 1292 | #ifdef CONFIG_8260 |
1468 | /* Jump into the system reset for the rom. | 1293 | /* Jump into the system reset for the rom. |
1469 | * We first disable the MMU, and then jump to the ROM reset address. | 1294 | * We first disable the MMU, and then jump to the ROM reset address. |
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index 04d04c5bfdd0..809673a36f7a 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c | |||
@@ -46,9 +46,6 @@ static void pcibios_fixup_resources(struct pci_dev* dev); | |||
46 | static void fixup_broken_pcnet32(struct pci_dev* dev); | 46 | static void fixup_broken_pcnet32(struct pci_dev* dev); |
47 | static int reparent_resources(struct resource *parent, struct resource *res); | 47 | static int reparent_resources(struct resource *parent, struct resource *res); |
48 | static void fixup_cpc710_pci64(struct pci_dev* dev); | 48 | static void fixup_cpc710_pci64(struct pci_dev* dev); |
49 | #ifdef CONFIG_PPC_OF | ||
50 | static u8* pci_to_OF_bus_map; | ||
51 | #endif | ||
52 | 49 | ||
53 | /* By default, we don't re-assign bus numbers. | 50 | /* By default, we don't re-assign bus numbers. |
54 | */ | 51 | */ |
@@ -625,406 +622,13 @@ pcibios_alloc_controller(void) | |||
625 | return hose; | 622 | return hose; |
626 | } | 623 | } |
627 | 624 | ||
628 | #ifdef CONFIG_PPC_OF | ||
629 | /* | ||
630 | * Functions below are used on OpenFirmware machines. | ||
631 | */ | ||
632 | static void | ||
633 | make_one_node_map(struct device_node* node, u8 pci_bus) | ||
634 | { | ||
635 | int *bus_range; | ||
636 | int len; | ||
637 | |||
638 | if (pci_bus >= pci_bus_count) | ||
639 | return; | ||
640 | bus_range = (int *) get_property(node, "bus-range", &len); | ||
641 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
642 | printk(KERN_WARNING "Can't get bus-range for %s, " | ||
643 | "assuming it starts at 0\n", node->full_name); | ||
644 | pci_to_OF_bus_map[pci_bus] = 0; | ||
645 | } else | ||
646 | pci_to_OF_bus_map[pci_bus] = bus_range[0]; | ||
647 | |||
648 | for (node=node->child; node != 0;node = node->sibling) { | ||
649 | struct pci_dev* dev; | ||
650 | unsigned int *class_code, *reg; | ||
651 | |||
652 | class_code = (unsigned int *) get_property(node, "class-code", NULL); | ||
653 | if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && | ||
654 | (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) | ||
655 | continue; | ||
656 | reg = (unsigned int *)get_property(node, "reg", NULL); | ||
657 | if (!reg) | ||
658 | continue; | ||
659 | dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff)); | ||
660 | if (!dev || !dev->subordinate) | ||
661 | continue; | ||
662 | make_one_node_map(node, dev->subordinate->number); | ||
663 | } | ||
664 | } | ||
665 | |||
666 | void | ||
667 | pcibios_make_OF_bus_map(void) | ||
668 | { | ||
669 | int i; | ||
670 | struct pci_controller* hose; | ||
671 | u8* of_prop_map; | ||
672 | |||
673 | pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL); | ||
674 | if (!pci_to_OF_bus_map) { | ||
675 | printk(KERN_ERR "Can't allocate OF bus map !\n"); | ||
676 | return; | ||
677 | } | ||
678 | |||
679 | /* We fill the bus map with invalid values, that helps | ||
680 | * debugging. | ||
681 | */ | ||
682 | for (i=0; i<pci_bus_count; i++) | ||
683 | pci_to_OF_bus_map[i] = 0xff; | ||
684 | |||
685 | /* For each hose, we begin searching bridges */ | ||
686 | for(hose=hose_head; hose; hose=hose->next) { | ||
687 | struct device_node* node; | ||
688 | node = (struct device_node *)hose->arch_data; | ||
689 | if (!node) | ||
690 | continue; | ||
691 | make_one_node_map(node, hose->first_busno); | ||
692 | } | ||
693 | of_prop_map = get_property(find_path_device("/"), "pci-OF-bus-map", NULL); | ||
694 | if (of_prop_map) | ||
695 | memcpy(of_prop_map, pci_to_OF_bus_map, pci_bus_count); | ||
696 | #ifdef DEBUG | ||
697 | printk("PCI->OF bus map:\n"); | ||
698 | for (i=0; i<pci_bus_count; i++) { | ||
699 | if (pci_to_OF_bus_map[i] == 0xff) | ||
700 | continue; | ||
701 | printk("%d -> %d\n", i, pci_to_OF_bus_map[i]); | ||
702 | } | ||
703 | #endif | ||
704 | } | ||
705 | |||
706 | typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data); | ||
707 | |||
708 | static struct device_node* | ||
709 | scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data) | ||
710 | { | ||
711 | struct device_node* sub_node; | ||
712 | |||
713 | for (; node != 0;node = node->sibling) { | ||
714 | unsigned int *class_code; | ||
715 | |||
716 | if (filter(node, data)) | ||
717 | return node; | ||
718 | |||
719 | /* For PCI<->PCI bridges or CardBus bridges, we go down | ||
720 | * Note: some OFs create a parent node "multifunc-device" as | ||
721 | * a fake root for all functions of a multi-function device, | ||
722 | * we go down them as well. | ||
723 | */ | ||
724 | class_code = (unsigned int *) get_property(node, "class-code", NULL); | ||
725 | if ((!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && | ||
726 | (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) && | ||
727 | strcmp(node->name, "multifunc-device")) | ||
728 | continue; | ||
729 | sub_node = scan_OF_pci_childs(node->child, filter, data); | ||
730 | if (sub_node) | ||
731 | return sub_node; | ||
732 | } | ||
733 | return NULL; | ||
734 | } | ||
735 | |||
736 | static int | ||
737 | scan_OF_pci_childs_iterator(struct device_node* node, void* data) | ||
738 | { | ||
739 | unsigned int *reg; | ||
740 | u8* fdata = (u8*)data; | ||
741 | |||
742 | reg = (unsigned int *) get_property(node, "reg", NULL); | ||
743 | if (reg && ((reg[0] >> 8) & 0xff) == fdata[1] | ||
744 | && ((reg[0] >> 16) & 0xff) == fdata[0]) | ||
745 | return 1; | ||
746 | return 0; | ||
747 | } | ||
748 | |||
749 | static struct device_node* | ||
750 | scan_OF_childs_for_device(struct device_node* node, u8 bus, u8 dev_fn) | ||
751 | { | ||
752 | u8 filter_data[2] = {bus, dev_fn}; | ||
753 | |||
754 | return scan_OF_pci_childs(node, scan_OF_pci_childs_iterator, filter_data); | ||
755 | } | ||
756 | |||
757 | /* | ||
758 | * Scans the OF tree for a device node matching a PCI device | ||
759 | */ | ||
760 | struct device_node * | ||
761 | pci_busdev_to_OF_node(struct pci_bus *bus, int devfn) | ||
762 | { | ||
763 | struct pci_controller *hose; | ||
764 | struct device_node *node; | ||
765 | int busnr; | ||
766 | |||
767 | if (!have_of) | ||
768 | return NULL; | ||
769 | |||
770 | /* Lookup the hose */ | ||
771 | busnr = bus->number; | ||
772 | hose = pci_bus_to_hose(busnr); | ||
773 | if (!hose) | ||
774 | return NULL; | ||
775 | |||
776 | /* Check it has an OF node associated */ | ||
777 | node = (struct device_node *) hose->arch_data; | ||
778 | if (!node) | ||
779 | return NULL; | ||
780 | |||
781 | /* Fixup bus number according to what OF think it is. */ | ||
782 | if (pci_to_OF_bus_map) | ||
783 | busnr = pci_to_OF_bus_map[busnr]; | ||
784 | if (busnr == 0xff) | ||
785 | return NULL; | ||
786 | |||
787 | /* Now, lookup childs of the hose */ | ||
788 | return scan_OF_childs_for_device(node->child, busnr, devfn); | ||
789 | } | ||
790 | EXPORT_SYMBOL(pci_busdev_to_OF_node); | ||
791 | |||
792 | struct device_node* | ||
793 | pci_device_to_OF_node(struct pci_dev *dev) | ||
794 | { | ||
795 | return pci_busdev_to_OF_node(dev->bus, dev->devfn); | ||
796 | } | ||
797 | EXPORT_SYMBOL(pci_device_to_OF_node); | ||
798 | |||
799 | /* This routine is meant to be used early during boot, when the | ||
800 | * PCI bus numbers have not yet been assigned, and you need to | ||
801 | * issue PCI config cycles to an OF device. | ||
802 | * It could also be used to "fix" RTAS config cycles if you want | ||
803 | * to set pci_assign_all_buses to 1 and still use RTAS for PCI | ||
804 | * config cycles. | ||
805 | */ | ||
806 | struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node) | ||
807 | { | ||
808 | if (!have_of) | ||
809 | return NULL; | ||
810 | while(node) { | ||
811 | struct pci_controller* hose; | ||
812 | for (hose=hose_head;hose;hose=hose->next) | ||
813 | if (hose->arch_data == node) | ||
814 | return hose; | ||
815 | node=node->parent; | ||
816 | } | ||
817 | return NULL; | ||
818 | } | ||
819 | |||
820 | static int | ||
821 | find_OF_pci_device_filter(struct device_node* node, void* data) | ||
822 | { | ||
823 | return ((void *)node == data); | ||
824 | } | ||
825 | |||
826 | /* | ||
827 | * Returns the PCI device matching a given OF node | ||
828 | */ | ||
829 | int | ||
830 | pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn) | ||
831 | { | ||
832 | unsigned int *reg; | ||
833 | struct pci_controller* hose; | ||
834 | struct pci_dev* dev = NULL; | ||
835 | |||
836 | if (!have_of) | ||
837 | return -ENODEV; | ||
838 | /* Make sure it's really a PCI device */ | ||
839 | hose = pci_find_hose_for_OF_device(node); | ||
840 | if (!hose || !hose->arch_data) | ||
841 | return -ENODEV; | ||
842 | if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child, | ||
843 | find_OF_pci_device_filter, (void *)node)) | ||
844 | return -ENODEV; | ||
845 | reg = (unsigned int *) get_property(node, "reg", NULL); | ||
846 | if (!reg) | ||
847 | return -ENODEV; | ||
848 | *bus = (reg[0] >> 16) & 0xff; | ||
849 | *devfn = ((reg[0] >> 8) & 0xff); | ||
850 | |||
851 | /* Ok, here we need some tweak. If we have already renumbered | ||
852 | * all busses, we can't rely on the OF bus number any more. | ||
853 | * the pci_to_OF_bus_map is not enough as several PCI busses | ||
854 | * may match the same OF bus number. | ||
855 | */ | ||
856 | if (!pci_to_OF_bus_map) | ||
857 | return 0; | ||
858 | |||
859 | for_each_pci_dev(dev) | ||
860 | if (pci_to_OF_bus_map[dev->bus->number] == *bus && | ||
861 | dev->devfn == *devfn) { | ||
862 | *bus = dev->bus->number; | ||
863 | pci_dev_put(dev); | ||
864 | return 0; | ||
865 | } | ||
866 | |||
867 | return -ENODEV; | ||
868 | } | ||
869 | EXPORT_SYMBOL(pci_device_from_OF_node); | ||
870 | |||
871 | void __init | ||
872 | pci_process_bridge_OF_ranges(struct pci_controller *hose, | ||
873 | struct device_node *dev, int primary) | ||
874 | { | ||
875 | static unsigned int static_lc_ranges[256] __initdata; | ||
876 | unsigned int *dt_ranges, *lc_ranges, *ranges, *prev; | ||
877 | unsigned int size; | ||
878 | int rlen = 0, orig_rlen; | ||
879 | int memno = 0; | ||
880 | struct resource *res; | ||
881 | int np, na = prom_n_addr_cells(dev); | ||
882 | np = na + 5; | ||
883 | |||
884 | /* First we try to merge ranges to fix a problem with some pmacs | ||
885 | * that can have more than 3 ranges, fortunately using contiguous | ||
886 | * addresses -- BenH | ||
887 | */ | ||
888 | dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen); | ||
889 | if (!dt_ranges) | ||
890 | return; | ||
891 | /* Sanity check, though hopefully that never happens */ | ||
892 | if (rlen > sizeof(static_lc_ranges)) { | ||
893 | printk(KERN_WARNING "OF ranges property too large !\n"); | ||
894 | rlen = sizeof(static_lc_ranges); | ||
895 | } | ||
896 | lc_ranges = static_lc_ranges; | ||
897 | memcpy(lc_ranges, dt_ranges, rlen); | ||
898 | orig_rlen = rlen; | ||
899 | |||
900 | /* Let's work on a copy of the "ranges" property instead of damaging | ||
901 | * the device-tree image in memory | ||
902 | */ | ||
903 | ranges = lc_ranges; | ||
904 | prev = NULL; | ||
905 | while ((rlen -= np * sizeof(unsigned int)) >= 0) { | ||
906 | if (prev) { | ||
907 | if (prev[0] == ranges[0] && prev[1] == ranges[1] && | ||
908 | (prev[2] + prev[na+4]) == ranges[2] && | ||
909 | (prev[na+2] + prev[na+4]) == ranges[na+2]) { | ||
910 | prev[na+4] += ranges[na+4]; | ||
911 | ranges[0] = 0; | ||
912 | ranges += np; | ||
913 | continue; | ||
914 | } | ||
915 | } | ||
916 | prev = ranges; | ||
917 | ranges += np; | ||
918 | } | ||
919 | |||
920 | /* | ||
921 | * The ranges property is laid out as an array of elements, | ||
922 | * each of which comprises: | ||
923 | * cells 0 - 2: a PCI address | ||
924 | * cells 3 or 3+4: a CPU physical address | ||
925 | * (size depending on dev->n_addr_cells) | ||
926 | * cells 4+5 or 5+6: the size of the range | ||
927 | */ | ||
928 | ranges = lc_ranges; | ||
929 | rlen = orig_rlen; | ||
930 | while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) { | ||
931 | res = NULL; | ||
932 | size = ranges[na+4]; | ||
933 | switch ((ranges[0] >> 24) & 0x3) { | ||
934 | case 1: /* I/O space */ | ||
935 | if (ranges[2] != 0) | ||
936 | break; | ||
937 | hose->io_base_phys = ranges[na+2]; | ||
938 | /* limit I/O space to 16MB */ | ||
939 | if (size > 0x01000000) | ||
940 | size = 0x01000000; | ||
941 | hose->io_base_virt = ioremap(ranges[na+2], size); | ||
942 | if (primary) | ||
943 | isa_io_base = (unsigned long) hose->io_base_virt; | ||
944 | res = &hose->io_resource; | ||
945 | res->flags = IORESOURCE_IO; | ||
946 | res->start = ranges[2]; | ||
947 | DBG("PCI: IO 0x%lx -> 0x%lx\n", | ||
948 | res->start, res->start + size - 1); | ||
949 | break; | ||
950 | case 2: /* memory space */ | ||
951 | memno = 0; | ||
952 | if (ranges[1] == 0 && ranges[2] == 0 | ||
953 | && ranges[na+4] <= (16 << 20)) { | ||
954 | /* 1st 16MB, i.e. ISA memory area */ | ||
955 | if (primary) | ||
956 | isa_mem_base = ranges[na+2]; | ||
957 | memno = 1; | ||
958 | } | ||
959 | while (memno < 3 && hose->mem_resources[memno].flags) | ||
960 | ++memno; | ||
961 | if (memno == 0) | ||
962 | hose->pci_mem_offset = ranges[na+2] - ranges[2]; | ||
963 | if (memno < 3) { | ||
964 | res = &hose->mem_resources[memno]; | ||
965 | res->flags = IORESOURCE_MEM; | ||
966 | if(ranges[0] & 0x40000000) | ||
967 | res->flags |= IORESOURCE_PREFETCH; | ||
968 | res->start = ranges[na+2]; | ||
969 | DBG("PCI: MEM[%d] 0x%lx -> 0x%lx\n", memno, | ||
970 | res->start, res->start + size - 1); | ||
971 | } | ||
972 | break; | ||
973 | } | ||
974 | if (res != NULL) { | ||
975 | res->name = dev->full_name; | ||
976 | res->end = res->start + size - 1; | ||
977 | res->parent = NULL; | ||
978 | res->sibling = NULL; | ||
979 | res->child = NULL; | ||
980 | } | ||
981 | ranges += np; | ||
982 | } | ||
983 | } | ||
984 | |||
985 | /* We create the "pci-OF-bus-map" property now so it appears in the | ||
986 | * /proc device tree | ||
987 | */ | ||
988 | void __init | ||
989 | pci_create_OF_bus_map(void) | ||
990 | { | ||
991 | struct property* of_prop; | ||
992 | |||
993 | of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256); | ||
994 | if (of_prop && find_path_device("/")) { | ||
995 | memset(of_prop, -1, sizeof(struct property) + 256); | ||
996 | of_prop->name = "pci-OF-bus-map"; | ||
997 | of_prop->length = 256; | ||
998 | of_prop->value = (unsigned char *)&of_prop[1]; | ||
999 | prom_add_property(find_path_device("/"), of_prop); | ||
1000 | } | ||
1001 | } | ||
1002 | |||
1003 | static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf) | ||
1004 | { | ||
1005 | struct pci_dev *pdev; | ||
1006 | struct device_node *np; | ||
1007 | |||
1008 | pdev = to_pci_dev (dev); | ||
1009 | np = pci_device_to_OF_node(pdev); | ||
1010 | if (np == NULL || np->full_name == NULL) | ||
1011 | return 0; | ||
1012 | return sprintf(buf, "%s", np->full_name); | ||
1013 | } | ||
1014 | static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); | ||
1015 | |||
1016 | #else /* CONFIG_PPC_OF */ | ||
1017 | void pcibios_make_OF_bus_map(void) | 625 | void pcibios_make_OF_bus_map(void) |
1018 | { | 626 | { |
1019 | } | 627 | } |
1020 | #endif /* CONFIG_PPC_OF */ | ||
1021 | 628 | ||
1022 | /* Add sysfs properties */ | 629 | /* Add sysfs properties */ |
1023 | void pcibios_add_platform_entries(struct pci_dev *pdev) | 630 | void pcibios_add_platform_entries(struct pci_dev *pdev) |
1024 | { | 631 | { |
1025 | #ifdef CONFIG_PPC_OF | ||
1026 | device_create_file(&pdev->dev, &dev_attr_devspec); | ||
1027 | #endif /* CONFIG_PPC_OF */ | ||
1028 | } | 632 | } |
1029 | 633 | ||
1030 | 634 | ||
diff --git a/arch/ppc/kernel/ppc_htab.c b/arch/ppc/kernel/ppc_htab.c index 2f5c7650274f..eabac6cad1f5 100644 --- a/arch/ppc/kernel/ppc_htab.c +++ b/arch/ppc/kernel/ppc_htab.c | |||
@@ -104,7 +104,7 @@ static char *pmc2_lookup(unsigned long mmcr0) | |||
104 | static int ppc_htab_show(struct seq_file *m, void *v) | 104 | static int ppc_htab_show(struct seq_file *m, void *v) |
105 | { | 105 | { |
106 | unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; | 106 | unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; |
107 | #if defined(CONFIG_PPC_STD_MMU) && !defined(CONFIG_PPC64BRIDGE) | 107 | #if defined(CONFIG_PPC_STD_MMU) |
108 | unsigned int kptes = 0, uptes = 0; | 108 | unsigned int kptes = 0, uptes = 0; |
109 | PTE *ptr; | 109 | PTE *ptr; |
110 | #endif /* CONFIG_PPC_STD_MMU */ | 110 | #endif /* CONFIG_PPC_STD_MMU */ |
@@ -133,7 +133,6 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
133 | return 0; | 133 | return 0; |
134 | } | 134 | } |
135 | 135 | ||
136 | #ifndef CONFIG_PPC64BRIDGE | ||
137 | for (ptr = Hash; ptr < Hash_end; ptr++) { | 136 | for (ptr = Hash; ptr < Hash_end; ptr++) { |
138 | unsigned int mctx, vsid; | 137 | unsigned int mctx, vsid; |
139 | 138 | ||
@@ -147,7 +146,6 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
147 | else | 146 | else |
148 | uptes++; | 147 | uptes++; |
149 | } | 148 | } |
150 | #endif | ||
151 | 149 | ||
152 | seq_printf(m, | 150 | seq_printf(m, |
153 | "PTE Hash Table Information\n" | 151 | "PTE Hash Table Information\n" |
@@ -155,20 +153,16 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
155 | "Buckets\t\t: %lu\n" | 153 | "Buckets\t\t: %lu\n" |
156 | "Address\t\t: %08lx\n" | 154 | "Address\t\t: %08lx\n" |
157 | "Entries\t\t: %lu\n" | 155 | "Entries\t\t: %lu\n" |
158 | #ifndef CONFIG_PPC64BRIDGE | ||
159 | "User ptes\t: %u\n" | 156 | "User ptes\t: %u\n" |
160 | "Kernel ptes\t: %u\n" | 157 | "Kernel ptes\t: %u\n" |
161 | "Percent full\t: %lu%%\n" | 158 | "Percent full\t: %lu%%\n" |
162 | #endif | ||
163 | , (unsigned long)(Hash_size>>10), | 159 | , (unsigned long)(Hash_size>>10), |
164 | (Hash_size/(sizeof(PTE)*8)), | 160 | (Hash_size/(sizeof(PTE)*8)), |
165 | (unsigned long)Hash, | 161 | (unsigned long)Hash, |
166 | Hash_size/sizeof(PTE) | 162 | Hash_size/sizeof(PTE) |
167 | #ifndef CONFIG_PPC64BRIDGE | ||
168 | , uptes, | 163 | , uptes, |
169 | kptes, | 164 | kptes, |
170 | ((kptes+uptes)*100) / (Hash_size/sizeof(PTE)) | 165 | ((kptes+uptes)*100) / (Hash_size/sizeof(PTE)) |
171 | #endif | ||
172 | ); | 166 | ); |
173 | 167 | ||
174 | seq_printf(m, | 168 | seq_printf(m, |
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index 683e028000e9..865ba74991a9 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/adb.h> | 29 | #include <linux/adb.h> |
30 | #include <linux/cuda.h> | 30 | #include <linux/cuda.h> |
31 | #include <linux/pmu.h> | 31 | #include <linux/pmu.h> |
32 | #include <asm/prom.h> | ||
33 | #include <asm/system.h> | 32 | #include <asm/system.h> |
34 | #include <asm/pci-bridge.h> | 33 | #include <asm/pci-bridge.h> |
35 | #include <asm/irq.h> | 34 | #include <asm/irq.h> |
@@ -207,27 +206,6 @@ EXPORT_SYMBOL(adb_try_handler_change); | |||
207 | EXPORT_SYMBOL(cuda_request); | 206 | EXPORT_SYMBOL(cuda_request); |
208 | EXPORT_SYMBOL(cuda_poll); | 207 | EXPORT_SYMBOL(cuda_poll); |
209 | #endif /* CONFIG_ADB_CUDA */ | 208 | #endif /* CONFIG_ADB_CUDA */ |
210 | #ifdef CONFIG_PPC_OF | ||
211 | EXPORT_SYMBOL(find_devices); | ||
212 | EXPORT_SYMBOL(find_type_devices); | ||
213 | EXPORT_SYMBOL(find_compatible_devices); | ||
214 | EXPORT_SYMBOL(find_path_device); | ||
215 | EXPORT_SYMBOL(device_is_compatible); | ||
216 | EXPORT_SYMBOL(machine_is_compatible); | ||
217 | EXPORT_SYMBOL(find_all_nodes); | ||
218 | EXPORT_SYMBOL(get_property); | ||
219 | EXPORT_SYMBOL(request_OF_resource); | ||
220 | EXPORT_SYMBOL(release_OF_resource); | ||
221 | EXPORT_SYMBOL(of_find_node_by_name); | ||
222 | EXPORT_SYMBOL(of_find_node_by_type); | ||
223 | EXPORT_SYMBOL(of_find_compatible_node); | ||
224 | EXPORT_SYMBOL(of_find_node_by_path); | ||
225 | EXPORT_SYMBOL(of_find_all_nodes); | ||
226 | EXPORT_SYMBOL(of_get_parent); | ||
227 | EXPORT_SYMBOL(of_get_next_child); | ||
228 | EXPORT_SYMBOL(of_node_get); | ||
229 | EXPORT_SYMBOL(of_node_put); | ||
230 | #endif /* CONFIG_PPC_OF */ | ||
231 | #if defined(CONFIG_BOOTX_TEXT) | 209 | #if defined(CONFIG_BOOTX_TEXT) |
232 | EXPORT_SYMBOL(btext_update_display); | 210 | EXPORT_SYMBOL(btext_update_display); |
233 | #endif | 211 | #endif |
diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c index 53e9deacee82..7eb91a2e818a 100644 --- a/arch/ppc/kernel/setup.c +++ b/arch/ppc/kernel/setup.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Common prep/chrp boot and setup code. | 2 | * Common prep boot and setup code. |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/config.h> | 5 | #include <linux/config.h> |
@@ -72,17 +72,12 @@ unsigned long ISA_DMA_THRESHOLD; | |||
72 | unsigned int DMA_MODE_READ; | 72 | unsigned int DMA_MODE_READ; |
73 | unsigned int DMA_MODE_WRITE; | 73 | unsigned int DMA_MODE_WRITE; |
74 | 74 | ||
75 | #ifdef CONFIG_PPC_MULTIPLATFORM | 75 | #ifdef CONFIG_PPC_PREP |
76 | int _machine = 0; | ||
77 | EXPORT_SYMBOL(_machine); | ||
78 | |||
79 | extern void prep_init(unsigned long r3, unsigned long r4, | 76 | extern void prep_init(unsigned long r3, unsigned long r4, |
80 | unsigned long r5, unsigned long r6, unsigned long r7); | 77 | unsigned long r5, unsigned long r6, unsigned long r7); |
81 | extern void chrp_init(unsigned long r3, unsigned long r4, | ||
82 | unsigned long r5, unsigned long r6, unsigned long r7); | ||
83 | 78 | ||
84 | dev_t boot_dev; | 79 | dev_t boot_dev; |
85 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 80 | #endif /* CONFIG_PPC_PREP */ |
86 | 81 | ||
87 | int have_of; | 82 | int have_of; |
88 | EXPORT_SYMBOL(have_of); | 83 | EXPORT_SYMBOL(have_of); |
@@ -319,72 +314,12 @@ early_init(int r3, int r4, int r5) | |||
319 | identify_cpu(offset, 0); | 314 | identify_cpu(offset, 0); |
320 | do_cpu_ftr_fixups(offset); | 315 | do_cpu_ftr_fixups(offset); |
321 | 316 | ||
322 | #if defined(CONFIG_PPC_OF) | ||
323 | reloc_got2(offset); | ||
324 | |||
325 | /* | ||
326 | * don't do anything on prep | ||
327 | * for now, don't use bootinfo because it breaks yaboot 0.5 | ||
328 | * and assume that if we didn't find a magic number, we have OF | ||
329 | */ | ||
330 | if (*(unsigned long *)(0) != 0xdeadc0de) | ||
331 | phys = prom_init(r3, r4, (prom_entry)r5); | ||
332 | |||
333 | reloc_got2(-offset); | ||
334 | #endif | ||
335 | |||
336 | return phys; | 317 | return phys; |
337 | } | 318 | } |
338 | 319 | ||
339 | #ifdef CONFIG_PPC_OF | 320 | #ifdef CONFIG_PPC_PREP |
340 | /* | ||
341 | * Assume here that all clock rates are the same in a | ||
342 | * smp system. -- Cort | ||
343 | */ | ||
344 | int | ||
345 | of_show_percpuinfo(struct seq_file *m, int i) | ||
346 | { | ||
347 | struct device_node *cpu_node; | ||
348 | u32 *fp; | ||
349 | int s; | ||
350 | |||
351 | cpu_node = find_type_devices("cpu"); | ||
352 | if (!cpu_node) | ||
353 | return 0; | ||
354 | for (s = 0; s < i && cpu_node->next; s++) | ||
355 | cpu_node = cpu_node->next; | ||
356 | fp = (u32 *)get_property(cpu_node, "clock-frequency", NULL); | ||
357 | if (fp) | ||
358 | seq_printf(m, "clock\t\t: %dMHz\n", *fp / 1000000); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | void __init | ||
363 | intuit_machine_type(void) | ||
364 | { | ||
365 | char *model; | ||
366 | struct device_node *root; | ||
367 | |||
368 | /* ask the OF info if we're a chrp or pmac */ | ||
369 | root = find_path_device("/"); | ||
370 | if (root != 0) { | ||
371 | /* assume pmac unless proven to be chrp -- Cort */ | ||
372 | _machine = _MACH_Pmac; | ||
373 | model = get_property(root, "device_type", NULL); | ||
374 | if (model && !strncmp("chrp", model, 4)) | ||
375 | _machine = _MACH_chrp; | ||
376 | else { | ||
377 | model = get_property(root, "model", NULL); | ||
378 | if (model && !strncmp(model, "IBM", 3)) | ||
379 | _machine = _MACH_chrp; | ||
380 | } | ||
381 | } | ||
382 | } | ||
383 | #endif | ||
384 | |||
385 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
386 | /* | 321 | /* |
387 | * The PPC_MULTIPLATFORM version of platform_init... | 322 | * The PPC_PREP version of platform_init... |
388 | */ | 323 | */ |
389 | void __init | 324 | void __init |
390 | platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | 325 | platform_init(unsigned long r3, unsigned long r4, unsigned long r5, |
@@ -399,161 +334,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
399 | 334 | ||
400 | parse_bootinfo(find_bootinfo()); | 335 | parse_bootinfo(find_bootinfo()); |
401 | 336 | ||
402 | /* if we didn't get any bootinfo telling us what we are... */ | 337 | prep_init(r3, r4, r5, r6, r7); |
403 | if (_machine == 0) { | ||
404 | /* prep boot loader tells us if we're prep or not */ | ||
405 | if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) ) | ||
406 | _machine = _MACH_prep; | ||
407 | } | ||
408 | |||
409 | #ifdef CONFIG_PPC_PREP | ||
410 | /* not much more to do here, if prep */ | ||
411 | if (_machine == _MACH_prep) { | ||
412 | prep_init(r3, r4, r5, r6, r7); | ||
413 | return; | ||
414 | } | ||
415 | #endif | ||
416 | |||
417 | #ifdef CONFIG_PPC_OF | ||
418 | have_of = 1; | ||
419 | |||
420 | /* prom_init has already been called from __start */ | ||
421 | if (boot_infos) | ||
422 | relocate_nodes(); | ||
423 | |||
424 | /* If we aren't PReP, we can find out if we're Pmac | ||
425 | * or CHRP with this. */ | ||
426 | if (_machine == 0) | ||
427 | intuit_machine_type(); | ||
428 | |||
429 | /* finish_device_tree may need _machine defined. */ | ||
430 | finish_device_tree(); | ||
431 | |||
432 | /* | ||
433 | * If we were booted via quik, r3 points to the physical | ||
434 | * address of the command-line parameters. | ||
435 | * If we were booted from an xcoff image (i.e. netbooted or | ||
436 | * booted from floppy), we get the command line from the | ||
437 | * bootargs property of the /chosen node. | ||
438 | * If an initial ramdisk is present, r3 and r4 | ||
439 | * are used for initrd_start and initrd_size, | ||
440 | * otherwise they contain 0xdeadbeef. | ||
441 | */ | ||
442 | if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) { | ||
443 | strlcpy(cmd_line, (char *)r3 + KERNELBASE, | ||
444 | sizeof(cmd_line)); | ||
445 | } else if (boot_infos != 0) { | ||
446 | /* booted by BootX - check for ramdisk */ | ||
447 | if (boot_infos->kernelParamsOffset != 0) | ||
448 | strlcpy(cmd_line, (char *) boot_infos | ||
449 | + boot_infos->kernelParamsOffset, | ||
450 | sizeof(cmd_line)); | ||
451 | #ifdef CONFIG_BLK_DEV_INITRD | ||
452 | if (boot_infos->ramDisk) { | ||
453 | initrd_start = (unsigned long) boot_infos | ||
454 | + boot_infos->ramDisk; | ||
455 | initrd_end = initrd_start + boot_infos->ramDiskSize; | ||
456 | initrd_below_start_ok = 1; | ||
457 | } | ||
458 | #endif | ||
459 | } else { | ||
460 | struct device_node *chosen; | ||
461 | char *p; | ||
462 | |||
463 | #ifdef CONFIG_BLK_DEV_INITRD | ||
464 | if (r3 && r4 && r4 != 0xdeadbeef) { | ||
465 | if (r3 < KERNELBASE) | ||
466 | r3 += KERNELBASE; | ||
467 | initrd_start = r3; | ||
468 | initrd_end = r3 + r4; | ||
469 | ROOT_DEV = Root_RAM0; | ||
470 | initrd_below_start_ok = 1; | ||
471 | } | ||
472 | #endif | ||
473 | chosen = find_devices("chosen"); | ||
474 | if (chosen != NULL) { | ||
475 | p = get_property(chosen, "bootargs", NULL); | ||
476 | if (p && *p) { | ||
477 | strlcpy(cmd_line, p, sizeof(cmd_line)); | ||
478 | } | ||
479 | } | ||
480 | } | ||
481 | #ifdef CONFIG_ADB | ||
482 | if (strstr(cmd_line, "adb_sync")) { | ||
483 | extern int __adb_probe_sync; | ||
484 | __adb_probe_sync = 1; | ||
485 | } | ||
486 | #endif /* CONFIG_ADB */ | ||
487 | |||
488 | switch (_machine) { | ||
489 | #ifdef CONFIG_PPC_CHRP | ||
490 | case _MACH_chrp: | ||
491 | chrp_init(r3, r4, r5, r6, r7); | ||
492 | break; | ||
493 | #endif | ||
494 | } | ||
495 | #endif /* CONFIG_PPC_OF */ | ||
496 | } | 338 | } |
497 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 339 | #endif /* CONFIG_PPC_PREP */ |
498 | |||
499 | #ifdef CONFIG_PPC_OF | ||
500 | #ifdef CONFIG_SERIAL_CORE_CONSOLE | ||
501 | extern char *of_stdout_device; | ||
502 | |||
503 | static int __init set_preferred_console(void) | ||
504 | { | ||
505 | struct device_node *prom_stdout; | ||
506 | char *name; | ||
507 | int offset = 0; | ||
508 | |||
509 | if (of_stdout_device == NULL) | ||
510 | return -ENODEV; | ||
511 | |||
512 | /* The user has requested a console so this is already set up. */ | ||
513 | if (strstr(saved_command_line, "console=")) | ||
514 | return -EBUSY; | ||
515 | |||
516 | prom_stdout = find_path_device(of_stdout_device); | ||
517 | if (!prom_stdout) | ||
518 | return -ENODEV; | ||
519 | |||
520 | name = (char *)get_property(prom_stdout, "name", NULL); | ||
521 | if (!name) | ||
522 | return -ENODEV; | ||
523 | |||
524 | if (strcmp(name, "serial") == 0) { | ||
525 | int i; | ||
526 | u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i); | ||
527 | if (i > 8) { | ||
528 | switch (reg[1]) { | ||
529 | case 0x3f8: | ||
530 | offset = 0; | ||
531 | break; | ||
532 | case 0x2f8: | ||
533 | offset = 1; | ||
534 | break; | ||
535 | case 0x898: | ||
536 | offset = 2; | ||
537 | break; | ||
538 | case 0x890: | ||
539 | offset = 3; | ||
540 | break; | ||
541 | default: | ||
542 | /* We dont recognise the serial port */ | ||
543 | return -ENODEV; | ||
544 | } | ||
545 | } | ||
546 | } else if (strcmp(name, "ch-a") == 0) | ||
547 | offset = 0; | ||
548 | else if (strcmp(name, "ch-b") == 0) | ||
549 | offset = 1; | ||
550 | else | ||
551 | return -ENODEV; | ||
552 | return add_preferred_console("ttyS", offset, NULL); | ||
553 | } | ||
554 | console_initcall(set_preferred_console); | ||
555 | #endif /* CONFIG_SERIAL_CORE_CONSOLE */ | ||
556 | #endif /* CONFIG_PPC_OF */ | ||
557 | 340 | ||
558 | struct bi_record *find_bootinfo(void) | 341 | struct bi_record *find_bootinfo(void) |
559 | { | 342 | { |
@@ -589,23 +372,6 @@ void parse_bootinfo(struct bi_record *rec) | |||
589 | initrd_end = data[0] + data[1] + KERNELBASE; | 372 | initrd_end = data[0] + data[1] + KERNELBASE; |
590 | break; | 373 | break; |
591 | #endif /* CONFIG_BLK_DEV_INITRD */ | 374 | #endif /* CONFIG_BLK_DEV_INITRD */ |
592 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
593 | case BI_MACHTYPE: | ||
594 | /* Machine types changed with the merge. Since the | ||
595 | * bootinfo are now deprecated, we can just hard code | ||
596 | * the appropriate conversion here for when we are | ||
597 | * called with yaboot which passes us a machine type | ||
598 | * this way. | ||
599 | */ | ||
600 | switch(data[0]) { | ||
601 | case 1: _machine = _MACH_prep; break; | ||
602 | case 2: _machine = _MACH_Pmac; break; | ||
603 | case 4: _machine = _MACH_chrp; break; | ||
604 | default: | ||
605 | _machine = data[0]; | ||
606 | } | ||
607 | break; | ||
608 | #endif | ||
609 | case BI_MEMSIZE: | 375 | case BI_MEMSIZE: |
610 | boot_mem_size = data[0]; | 376 | boot_mem_size = data[0]; |
611 | break; | 377 | break; |
@@ -631,9 +397,6 @@ machine_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
631 | #ifdef CONFIG_6xx | 397 | #ifdef CONFIG_6xx |
632 | ppc_md.power_save = ppc6xx_idle; | 398 | ppc_md.power_save = ppc6xx_idle; |
633 | #endif | 399 | #endif |
634 | #ifdef CONFIG_POWER4 | ||
635 | ppc_md.power_save = power4_idle; | ||
636 | #endif | ||
637 | 400 | ||
638 | platform_init(r3, r4, r5, r6, r7); | 401 | platform_init(r3, r4, r5, r6, r7); |
639 | 402 | ||
@@ -799,7 +562,4 @@ void __init setup_arch(char **cmdline_p) | |||
799 | if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab); | 562 | if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab); |
800 | 563 | ||
801 | paging_init(); | 564 | paging_init(); |
802 | |||
803 | /* this is for modules since _machine can be a define -- Cort */ | ||
804 | ppc_md.ppc_machine = _machine; | ||
805 | } | 565 | } |