diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-23 01:11:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-23 01:11:30 -0400 |
commit | 45c091bb2d453ce4a8b06cf19872ec7a77fc4799 (patch) | |
tree | 06fb2e05518ebfba163f8424e028e7faf5672d66 /arch | |
parent | d588fcbe5a7ba8bba2cebf7799ab2d573717a806 (diff) | |
parent | 2191fe3e39159e3375f4b7ec1420df149f154101 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (139 commits)
[POWERPC] re-enable OProfile for iSeries, using timer interrupt
[POWERPC] support ibm,extended-*-frequency properties
[POWERPC] Extra sanity check in EEH code
[POWERPC] Dont look for class-code in pci children
[POWERPC] Fix mdelay badness on shared processor partitions
[POWERPC] disable floating point exceptions for init
[POWERPC] Unify ppc syscall tables
[POWERPC] mpic: add support for serial mode interrupts
[POWERPC] pseries: Print PCI slot location code on failure
[POWERPC] spufs: one more fix for 64k pages
[POWERPC] spufs: fail spu_create with invalid flags
[POWERPC] spufs: clear class2 interrupt status before wakeup
[POWERPC] spufs: fix Makefile for "make clean"
[POWERPC] spufs: remove stop_code from struct spu
[POWERPC] spufs: fix spu irq affinity setting
[POWERPC] spufs: further abstract priv1 register access
[POWERPC] spufs: split the Cell BE support into generic and platform dependant parts
[POWERPC] spufs: dont try to access SPE channel 1 count
[POWERPC] spufs: use kzalloc in create_spu
[POWERPC] spufs: fix initial state of wbox file
...
Manually resolved conflicts in:
drivers/net/phy/Makefile
include/asm-powerpc/spu.h
Diffstat (limited to 'arch')
157 files changed, 8517 insertions, 3767 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 6729c98b66f9..7b829c754d0d 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -45,6 +45,10 @@ config GENERIC_CALIBRATE_DELAY | |||
45 | bool | 45 | bool |
46 | default y | 46 | default y |
47 | 47 | ||
48 | config GENERIC_FIND_NEXT_BIT | ||
49 | bool | ||
50 | default y | ||
51 | |||
48 | config PPC | 52 | config PPC |
49 | bool | 53 | bool |
50 | default y | 54 | default y |
@@ -137,6 +141,15 @@ config PPC_85xx | |||
137 | select FSL_SOC | 141 | select FSL_SOC |
138 | select 85xx | 142 | select 85xx |
139 | 143 | ||
144 | config PPC_86xx | ||
145 | bool "Freescale 86xx" | ||
146 | select 6xx | ||
147 | select FSL_SOC | ||
148 | select PPC_FPU | ||
149 | select ALTIVEC | ||
150 | help | ||
151 | The Freescale E600 SoCs have 74xx cores. | ||
152 | |||
140 | config 40x | 153 | config 40x |
141 | bool "AMCC 40x" | 154 | bool "AMCC 40x" |
142 | 155 | ||
@@ -336,7 +349,7 @@ endchoice | |||
336 | 349 | ||
337 | config PPC_PSERIES | 350 | config PPC_PSERIES |
338 | depends on PPC_MULTIPLATFORM && PPC64 | 351 | depends on PPC_MULTIPLATFORM && PPC64 |
339 | bool " IBM pSeries & new (POWER5-based) iSeries" | 352 | bool "IBM pSeries & new (POWER5-based) iSeries" |
340 | select PPC_I8259 | 353 | select PPC_I8259 |
341 | select PPC_RTAS | 354 | select PPC_RTAS |
342 | select RTAS_ERROR_LOGGING | 355 | select RTAS_ERROR_LOGGING |
@@ -344,7 +357,7 @@ config PPC_PSERIES | |||
344 | default y | 357 | default y |
345 | 358 | ||
346 | config PPC_CHRP | 359 | config PPC_CHRP |
347 | bool " Common Hardware Reference Platform (CHRP) based machines" | 360 | bool "Common Hardware Reference Platform (CHRP) based machines" |
348 | depends on PPC_MULTIPLATFORM && PPC32 | 361 | depends on PPC_MULTIPLATFORM && PPC32 |
349 | select PPC_I8259 | 362 | select PPC_I8259 |
350 | select PPC_INDIRECT_PCI | 363 | select PPC_INDIRECT_PCI |
@@ -354,7 +367,7 @@ config PPC_CHRP | |||
354 | default y | 367 | default y |
355 | 368 | ||
356 | config PPC_PMAC | 369 | config PPC_PMAC |
357 | bool " Apple PowerMac based machines" | 370 | bool "Apple PowerMac based machines" |
358 | depends on PPC_MULTIPLATFORM | 371 | depends on PPC_MULTIPLATFORM |
359 | select PPC_INDIRECT_PCI if PPC32 | 372 | select PPC_INDIRECT_PCI if PPC32 |
360 | select PPC_MPC106 if PPC32 | 373 | select PPC_MPC106 if PPC32 |
@@ -370,7 +383,7 @@ config PPC_PMAC64 | |||
370 | default y | 383 | default y |
371 | 384 | ||
372 | config PPC_PREP | 385 | config PPC_PREP |
373 | bool " PowerPC Reference Platform (PReP) based machines" | 386 | bool "PowerPC Reference Platform (PReP) based machines" |
374 | depends on PPC_MULTIPLATFORM && PPC32 && BROKEN | 387 | depends on PPC_MULTIPLATFORM && PPC32 && BROKEN |
375 | select PPC_I8259 | 388 | select PPC_I8259 |
376 | select PPC_INDIRECT_PCI | 389 | select PPC_INDIRECT_PCI |
@@ -379,7 +392,7 @@ config PPC_PREP | |||
379 | 392 | ||
380 | config PPC_MAPLE | 393 | config PPC_MAPLE |
381 | depends on PPC_MULTIPLATFORM && PPC64 | 394 | depends on PPC_MULTIPLATFORM && PPC64 |
382 | bool " Maple 970FX Evaluation Board" | 395 | bool "Maple 970FX Evaluation Board" |
383 | select U3_DART | 396 | select U3_DART |
384 | select MPIC_BROKEN_U3 | 397 | select MPIC_BROKEN_U3 |
385 | select GENERIC_TBSYNC | 398 | select GENERIC_TBSYNC |
@@ -391,8 +404,18 @@ config PPC_MAPLE | |||
391 | For more informations, refer to <http://www.970eval.com> | 404 | For more informations, refer to <http://www.970eval.com> |
392 | 405 | ||
393 | config PPC_CELL | 406 | config PPC_CELL |
394 | bool " Cell Broadband Processor Architecture" | 407 | bool |
408 | default n | ||
409 | |||
410 | config PPC_CELL_NATIVE | ||
411 | bool | ||
412 | select PPC_CELL | ||
413 | default n | ||
414 | |||
415 | config PPC_IBM_CELL_BLADE | ||
416 | bool " IBM Cell Blade" | ||
395 | depends on PPC_MULTIPLATFORM && PPC64 | 417 | depends on PPC_MULTIPLATFORM && PPC64 |
418 | select PPC_CELL_NATIVE | ||
396 | select PPC_RTAS | 419 | select PPC_RTAS |
397 | select MMIO_NVRAM | 420 | select MMIO_NVRAM |
398 | select PPC_UDBG_16550 | 421 | select PPC_UDBG_16550 |
@@ -439,11 +462,6 @@ config MPIC_BROKEN_U3 | |||
439 | depends on PPC_MAPLE | 462 | depends on PPC_MAPLE |
440 | default y | 463 | default y |
441 | 464 | ||
442 | config CELL_IIC | ||
443 | depends on PPC_CELL | ||
444 | bool | ||
445 | default y | ||
446 | |||
447 | config IBMVIO | 465 | config IBMVIO |
448 | depends on PPC_PSERIES || PPC_ISERIES | 466 | depends on PPC_PSERIES || PPC_ISERIES |
449 | bool | 467 | bool |
@@ -545,6 +563,7 @@ source arch/powerpc/platforms/embedded6xx/Kconfig | |||
545 | source arch/powerpc/platforms/4xx/Kconfig | 563 | source arch/powerpc/platforms/4xx/Kconfig |
546 | source arch/powerpc/platforms/83xx/Kconfig | 564 | source arch/powerpc/platforms/83xx/Kconfig |
547 | source arch/powerpc/platforms/85xx/Kconfig | 565 | source arch/powerpc/platforms/85xx/Kconfig |
566 | source arch/powerpc/platforms/86xx/Kconfig | ||
548 | source arch/powerpc/platforms/8xx/Kconfig | 567 | source arch/powerpc/platforms/8xx/Kconfig |
549 | source arch/powerpc/platforms/cell/Kconfig | 568 | source arch/powerpc/platforms/cell/Kconfig |
550 | 569 | ||
@@ -776,6 +795,7 @@ config GENERIC_ISA_DMA | |||
776 | 795 | ||
777 | config PPC_I8259 | 796 | config PPC_I8259 |
778 | bool | 797 | bool |
798 | default y if MPC8641_HPCN | ||
779 | default n | 799 | default n |
780 | 800 | ||
781 | config PPC_INDIRECT_PCI | 801 | config PPC_INDIRECT_PCI |
@@ -798,8 +818,8 @@ config MCA | |||
798 | bool | 818 | bool |
799 | 819 | ||
800 | config PCI | 820 | config PCI |
801 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) | 821 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) |
802 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx | 822 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx && !PPC_86xx |
803 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS | 823 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS |
804 | default PCI_QSPAN if !4xx && !CPM2 && 8xx | 824 | default PCI_QSPAN if !4xx && !CPM2 && 8xx |
805 | help | 825 | help |
@@ -827,12 +847,12 @@ config PCI_8260 | |||
827 | default y | 847 | default y |
828 | 848 | ||
829 | config 8260_PCI9 | 849 | config 8260_PCI9 |
830 | bool " Enable workaround for MPC826x erratum PCI 9" | 850 | bool "Enable workaround for MPC826x erratum PCI 9" |
831 | depends on PCI_8260 && !ADS8272 | 851 | depends on PCI_8260 && !ADS8272 |
832 | default y | 852 | default y |
833 | 853 | ||
834 | choice | 854 | choice |
835 | prompt " IDMA channel for PCI 9 workaround" | 855 | prompt "IDMA channel for PCI 9 workaround" |
836 | depends on 8260_PCI9 | 856 | depends on 8260_PCI9 |
837 | 857 | ||
838 | config 8260_PCI9_IDMA1 | 858 | config 8260_PCI9_IDMA1 |
@@ -849,6 +869,8 @@ config 8260_PCI9_IDMA4 | |||
849 | 869 | ||
850 | endchoice | 870 | endchoice |
851 | 871 | ||
872 | source "drivers/pci/pcie/Kconfig" | ||
873 | |||
852 | source "drivers/pci/Kconfig" | 874 | source "drivers/pci/Kconfig" |
853 | 875 | ||
854 | source "drivers/pcmcia/Kconfig" | 876 | source "drivers/pcmcia/Kconfig" |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 8d48e9e7162a..c69006ae8246 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -110,13 +110,16 @@ config SERIAL_TEXT_DEBUG | |||
110 | depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \ | 110 | depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \ |
111 | PPC_GEN550 || PPC_MPC52xx | 111 | PPC_GEN550 || PPC_MPC52xx |
112 | 112 | ||
113 | config PPC_EARLY_DEBUG | ||
114 | bool "Early debugging (dangerous)" | ||
115 | |||
113 | choice | 116 | choice |
114 | prompt "Early debugging (dangerous)" | 117 | prompt "Early debugging console" |
115 | bool | 118 | depends on PPC_EARLY_DEBUG |
116 | optional | ||
117 | help | 119 | help |
118 | Enable early debugging. Careful, if you enable debugging for the | 120 | Use the selected console for early debugging. Careful, if you |
119 | wrong type of machine your kernel _will not boot_. | 121 | enable debugging for the wrong type of machine your kernel |
122 | _will not boot_. | ||
120 | 123 | ||
121 | config PPC_EARLY_DEBUG_LPAR | 124 | config PPC_EARLY_DEBUG_LPAR |
122 | bool "LPAR HV Console" | 125 | bool "LPAR HV Console" |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index ed5b26aa8be3..01667d1d571d 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -108,7 +108,6 @@ ifeq ($(CONFIG_6xx),y) | |||
108 | CFLAGS += -mcpu=powerpc | 108 | CFLAGS += -mcpu=powerpc |
109 | endif | 109 | endif |
110 | 110 | ||
111 | cpu-as-$(CONFIG_PPC64BRIDGE) += -Wa,-mppc64bridge | ||
112 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 | 111 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
113 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec | 112 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec |
114 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec | 113 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec |
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c index 816446f0e497..b66634c9ea34 100644 --- a/arch/powerpc/boot/main.c +++ b/arch/powerpc/boot/main.c | |||
@@ -33,6 +33,14 @@ extern char _vmlinux_end[]; | |||
33 | extern char _initrd_start[]; | 33 | extern char _initrd_start[]; |
34 | extern char _initrd_end[]; | 34 | extern char _initrd_end[]; |
35 | 35 | ||
36 | /* A buffer that may be edited by tools operating on a zImage binary so as to | ||
37 | * edit the command line passed to vmlinux (by setting /chosen/bootargs). | ||
38 | * The buffer is put in it's own section so that tools may locate it easier. | ||
39 | */ | ||
40 | static char builtin_cmdline[512] | ||
41 | __attribute__((section("__builtin_cmdline"))); | ||
42 | |||
43 | |||
36 | struct addr_range { | 44 | struct addr_range { |
37 | unsigned long addr; | 45 | unsigned long addr; |
38 | unsigned long size; | 46 | unsigned long size; |
@@ -204,6 +212,23 @@ static int is_elf32(void *hdr) | |||
204 | return 1; | 212 | return 1; |
205 | } | 213 | } |
206 | 214 | ||
215 | void export_cmdline(void* chosen_handle) | ||
216 | { | ||
217 | int len; | ||
218 | char cmdline[2] = { 0, 0 }; | ||
219 | |||
220 | if (builtin_cmdline[0] == 0) | ||
221 | return; | ||
222 | |||
223 | len = getprop(chosen_handle, "bootargs", cmdline, sizeof(cmdline)); | ||
224 | if (len > 0 && cmdline[0] != 0) | ||
225 | return; | ||
226 | |||
227 | setprop(chosen_handle, "bootargs", builtin_cmdline, | ||
228 | strlen(builtin_cmdline) + 1); | ||
229 | } | ||
230 | |||
231 | |||
207 | void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | 232 | void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) |
208 | { | 233 | { |
209 | int len; | 234 | int len; |
@@ -289,6 +314,8 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
289 | memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,vmlinuz.size); | 314 | memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,vmlinuz.size); |
290 | } | 315 | } |
291 | 316 | ||
317 | export_cmdline(chosen_handle); | ||
318 | |||
292 | /* Skip over the ELF header */ | 319 | /* Skip over the ELF header */ |
293 | #ifdef DEBUG | 320 | #ifdef DEBUG |
294 | printf("... skipping 0x%lx bytes of ELF header\n\r", | 321 | printf("... skipping 0x%lx bytes of ELF header\n\r", |
diff --git a/arch/powerpc/boot/prom.h b/arch/powerpc/boot/prom.h index 3e2ddd4a5a81..a57b184c564f 100644 --- a/arch/powerpc/boot/prom.h +++ b/arch/powerpc/boot/prom.h | |||
@@ -31,4 +31,11 @@ static inline int getprop(void *phandle, const char *name, | |||
31 | return call_prom("getprop", 4, 1, phandle, name, buf, buflen); | 31 | return call_prom("getprop", 4, 1, phandle, name, buf, buflen); |
32 | } | 32 | } |
33 | 33 | ||
34 | |||
35 | static inline int setprop(void *phandle, const char *name, | ||
36 | void *buf, int buflen) | ||
37 | { | ||
38 | return call_prom("setprop", 4, 1, phandle, name, buf, buflen); | ||
39 | } | ||
40 | |||
34 | #endif /* _PPC_BOOT_PROM_H_ */ | 41 | #endif /* _PPC_BOOT_PROM_H_ */ |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index dbe421dc3c11..b8b8d4675dc0 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.16 | 3 | # Linux kernel version: 2.6.17 |
4 | # Thu Mar 23 20:48:09 2006 | 4 | # Mon Jun 19 17:23:03 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -11,6 +11,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
14 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_PPC=y | 15 | CONFIG_PPC=y |
15 | CONFIG_EARLY_PRINTK=y | 16 | CONFIG_EARLY_PRINTK=y |
16 | CONFIG_COMPAT=y | 17 | CONFIG_COMPAT=y |
@@ -55,7 +56,7 @@ CONFIG_SYSCTL=y | |||
55 | # CONFIG_AUDIT is not set | 56 | # CONFIG_AUDIT is not set |
56 | CONFIG_IKCONFIG=y | 57 | CONFIG_IKCONFIG=y |
57 | CONFIG_IKCONFIG_PROC=y | 58 | CONFIG_IKCONFIG_PROC=y |
58 | # CONFIG_CPUSETS is not set | 59 | CONFIG_CPUSETS=y |
59 | # CONFIG_RELAY is not set | 60 | # CONFIG_RELAY is not set |
60 | CONFIG_INITRAMFS_SOURCE="" | 61 | CONFIG_INITRAMFS_SOURCE="" |
61 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 62 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
@@ -116,13 +117,15 @@ CONFIG_PPC_MULTIPLATFORM=y | |||
116 | # CONFIG_PPC_PMAC is not set | 117 | # CONFIG_PPC_PMAC is not set |
117 | # CONFIG_PPC_MAPLE is not set | 118 | # CONFIG_PPC_MAPLE is not set |
118 | CONFIG_PPC_CELL=y | 119 | CONFIG_PPC_CELL=y |
120 | CONFIG_PPC_CELL_NATIVE=y | ||
121 | CONFIG_PPC_IBM_CELL_BLADE=y | ||
122 | CONFIG_PPC_SYSTEMSIM=y | ||
119 | # CONFIG_U3_DART is not set | 123 | # CONFIG_U3_DART is not set |
120 | CONFIG_PPC_RTAS=y | 124 | CONFIG_PPC_RTAS=y |
121 | # CONFIG_RTAS_ERROR_LOGGING is not set | 125 | # CONFIG_RTAS_ERROR_LOGGING is not set |
122 | CONFIG_RTAS_PROC=y | 126 | CONFIG_RTAS_PROC=y |
123 | CONFIG_RTAS_FLASH=y | 127 | CONFIG_RTAS_FLASH=y |
124 | CONFIG_MMIO_NVRAM=y | 128 | CONFIG_MMIO_NVRAM=y |
125 | CONFIG_CELL_IIC=y | ||
126 | # CONFIG_PPC_MPC106 is not set | 129 | # CONFIG_PPC_MPC106 is not set |
127 | # CONFIG_PPC_970_NAP is not set | 130 | # CONFIG_PPC_970_NAP is not set |
128 | # CONFIG_CPU_FREQ is not set | 131 | # CONFIG_CPU_FREQ is not set |
@@ -132,7 +135,9 @@ CONFIG_CELL_IIC=y | |||
132 | # Cell Broadband Engine options | 135 | # Cell Broadband Engine options |
133 | # | 136 | # |
134 | CONFIG_SPU_FS=m | 137 | CONFIG_SPU_FS=m |
138 | CONFIG_SPU_BASE=y | ||
135 | CONFIG_SPUFS_MMAP=y | 139 | CONFIG_SPUFS_MMAP=y |
140 | CONFIG_CBE_RAS=y | ||
136 | 141 | ||
137 | # | 142 | # |
138 | # Kernel options | 143 | # Kernel options |
@@ -152,20 +157,24 @@ CONFIG_FORCE_MAX_ZONEORDER=13 | |||
152 | CONFIG_KEXEC=y | 157 | CONFIG_KEXEC=y |
153 | # CONFIG_CRASH_DUMP is not set | 158 | # CONFIG_CRASH_DUMP is not set |
154 | CONFIG_IRQ_ALL_CPUS=y | 159 | CONFIG_IRQ_ALL_CPUS=y |
155 | # CONFIG_NUMA is not set | 160 | CONFIG_NUMA=y |
161 | CONFIG_NODES_SHIFT=4 | ||
156 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 162 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
157 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
158 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 163 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
159 | CONFIG_SELECT_MEMORY_MODEL=y | 164 | CONFIG_SELECT_MEMORY_MODEL=y |
160 | # CONFIG_FLATMEM_MANUAL is not set | 165 | # CONFIG_FLATMEM_MANUAL is not set |
161 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 166 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
162 | CONFIG_SPARSEMEM_MANUAL=y | 167 | CONFIG_SPARSEMEM_MANUAL=y |
163 | CONFIG_SPARSEMEM=y | 168 | CONFIG_SPARSEMEM=y |
169 | CONFIG_NEED_MULTIPLE_NODES=y | ||
164 | CONFIG_HAVE_MEMORY_PRESENT=y | 170 | CONFIG_HAVE_MEMORY_PRESENT=y |
165 | # CONFIG_SPARSEMEM_STATIC is not set | 171 | # CONFIG_SPARSEMEM_STATIC is not set |
166 | CONFIG_SPARSEMEM_EXTREME=y | 172 | CONFIG_SPARSEMEM_EXTREME=y |
167 | # CONFIG_MEMORY_HOTPLUG is not set | 173 | CONFIG_MEMORY_HOTPLUG=y |
168 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 174 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
175 | CONFIG_MIGRATION=y | ||
176 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | ||
177 | CONFIG_ARCH_MEMORY_PROBE=y | ||
169 | # CONFIG_PPC_64K_PAGES is not set | 178 | # CONFIG_PPC_64K_PAGES is not set |
170 | CONFIG_SCHED_SMT=y | 179 | CONFIG_SCHED_SMT=y |
171 | CONFIG_PROC_DEVICETREE=y | 180 | CONFIG_PROC_DEVICETREE=y |
@@ -182,6 +191,7 @@ CONFIG_GENERIC_ISA_DMA=y | |||
182 | # CONFIG_PPC_INDIRECT_PCI is not set | 191 | # CONFIG_PPC_INDIRECT_PCI is not set |
183 | CONFIG_PCI=y | 192 | CONFIG_PCI=y |
184 | CONFIG_PCI_DOMAINS=y | 193 | CONFIG_PCI_DOMAINS=y |
194 | CONFIG_PCIEPORTBUS=y | ||
185 | # CONFIG_PCI_DEBUG is not set | 195 | # CONFIG_PCI_DEBUG is not set |
186 | 196 | ||
187 | # | 197 | # |
@@ -476,7 +486,7 @@ CONFIG_DM_MULTIPATH=m | |||
476 | # | 486 | # |
477 | CONFIG_NETDEVICES=y | 487 | CONFIG_NETDEVICES=y |
478 | # CONFIG_DUMMY is not set | 488 | # CONFIG_DUMMY is not set |
479 | # CONFIG_BONDING is not set | 489 | CONFIG_BONDING=y |
480 | # CONFIG_EQUALIZER is not set | 490 | # CONFIG_EQUALIZER is not set |
481 | # CONFIG_TUN is not set | 491 | # CONFIG_TUN is not set |
482 | 492 | ||
@@ -624,6 +634,7 @@ CONFIG_SERIAL_NONSTANDARD=y | |||
624 | # CONFIG_N_HDLC is not set | 634 | # CONFIG_N_HDLC is not set |
625 | # CONFIG_SPECIALIX is not set | 635 | # CONFIG_SPECIALIX is not set |
626 | # CONFIG_SX is not set | 636 | # CONFIG_SX is not set |
637 | # CONFIG_RIO is not set | ||
627 | # CONFIG_STALDRV is not set | 638 | # CONFIG_STALDRV is not set |
628 | 639 | ||
629 | # | 640 | # |
@@ -766,6 +777,7 @@ CONFIG_I2C_ALGOBIT=y | |||
766 | # Multimedia devices | 777 | # Multimedia devices |
767 | # | 778 | # |
768 | # CONFIG_VIDEO_DEV is not set | 779 | # CONFIG_VIDEO_DEV is not set |
780 | CONFIG_VIDEO_V4L2=y | ||
769 | 781 | ||
770 | # | 782 | # |
771 | # Digital Video Broadcasting Devices | 783 | # Digital Video Broadcasting Devices |
@@ -1054,11 +1066,7 @@ CONFIG_DEBUGGER=y | |||
1054 | # CONFIG_XMON is not set | 1066 | # CONFIG_XMON is not set |
1055 | CONFIG_IRQSTACKS=y | 1067 | CONFIG_IRQSTACKS=y |
1056 | # CONFIG_BOOTX_TEXT is not set | 1068 | # CONFIG_BOOTX_TEXT is not set |
1057 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | 1069 | # CONFIG_PPC_EARLY_DEBUG is not set |
1058 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
1059 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
1060 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
1061 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
1062 | 1070 | ||
1063 | # | 1071 | # |
1064 | # Security options | 1072 | # Security options |
diff --git a/arch/powerpc/configs/mpc85xx_cds_defconfig b/arch/powerpc/configs/mpc85xx_cds_defconfig new file mode 100644 index 000000000000..9bb022a523fe --- /dev/null +++ b/arch/powerpc/configs/mpc85xx_cds_defconfig | |||
@@ -0,0 +1,846 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.16 | ||
4 | # Sun Apr 2 11:23:42 2006 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | CONFIG_PPC32=y | ||
8 | CONFIG_PPC_MERGE=y | ||
9 | CONFIG_MMU=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
14 | CONFIG_PPC=y | ||
15 | CONFIG_EARLY_PRINTK=y | ||
16 | CONFIG_GENERIC_NVRAM=y | ||
17 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
18 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
19 | CONFIG_PPC_OF=y | ||
20 | CONFIG_PPC_UDBG_16550=y | ||
21 | # CONFIG_GENERIC_TBSYNC is not set | ||
22 | # CONFIG_DEFAULT_UIMAGE is not set | ||
23 | |||
24 | # | ||
25 | # Processor support | ||
26 | # | ||
27 | # CONFIG_CLASSIC32 is not set | ||
28 | # CONFIG_PPC_52xx is not set | ||
29 | # CONFIG_PPC_82xx is not set | ||
30 | # CONFIG_PPC_83xx is not set | ||
31 | CONFIG_PPC_85xx=y | ||
32 | # CONFIG_40x is not set | ||
33 | # CONFIG_44x is not set | ||
34 | # CONFIG_8xx is not set | ||
35 | # CONFIG_E200 is not set | ||
36 | CONFIG_85xx=y | ||
37 | CONFIG_E500=y | ||
38 | CONFIG_BOOKE=y | ||
39 | CONFIG_FSL_BOOKE=y | ||
40 | # CONFIG_PHYS_64BIT is not set | ||
41 | CONFIG_SPE=y | ||
42 | |||
43 | # | ||
44 | # Code maturity level options | ||
45 | # | ||
46 | CONFIG_EXPERIMENTAL=y | ||
47 | CONFIG_BROKEN_ON_SMP=y | ||
48 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
49 | |||
50 | # | ||
51 | # General setup | ||
52 | # | ||
53 | CONFIG_LOCALVERSION="" | ||
54 | CONFIG_LOCALVERSION_AUTO=y | ||
55 | CONFIG_SWAP=y | ||
56 | CONFIG_SYSVIPC=y | ||
57 | # CONFIG_POSIX_MQUEUE is not set | ||
58 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
59 | CONFIG_SYSCTL=y | ||
60 | # CONFIG_AUDIT is not set | ||
61 | # CONFIG_IKCONFIG is not set | ||
62 | # CONFIG_RELAY is not set | ||
63 | CONFIG_INITRAMFS_SOURCE="" | ||
64 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
65 | CONFIG_EMBEDDED=y | ||
66 | CONFIG_KALLSYMS=y | ||
67 | # CONFIG_KALLSYMS_ALL is not set | ||
68 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
69 | CONFIG_HOTPLUG=y | ||
70 | CONFIG_PRINTK=y | ||
71 | CONFIG_BUG=y | ||
72 | CONFIG_ELF_CORE=y | ||
73 | CONFIG_BASE_FULL=y | ||
74 | CONFIG_FUTEX=y | ||
75 | CONFIG_EPOLL=y | ||
76 | CONFIG_SHMEM=y | ||
77 | CONFIG_SLAB=y | ||
78 | # CONFIG_TINY_SHMEM is not set | ||
79 | CONFIG_BASE_SMALL=0 | ||
80 | # CONFIG_SLOB is not set | ||
81 | |||
82 | # | ||
83 | # Loadable module support | ||
84 | # | ||
85 | # CONFIG_MODULES is not set | ||
86 | |||
87 | # | ||
88 | # Block layer | ||
89 | # | ||
90 | # CONFIG_LBD is not set | ||
91 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
92 | # CONFIG_LSF is not set | ||
93 | |||
94 | # | ||
95 | # IO Schedulers | ||
96 | # | ||
97 | CONFIG_IOSCHED_NOOP=y | ||
98 | CONFIG_IOSCHED_AS=y | ||
99 | CONFIG_IOSCHED_DEADLINE=y | ||
100 | CONFIG_IOSCHED_CFQ=y | ||
101 | CONFIG_DEFAULT_AS=y | ||
102 | # CONFIG_DEFAULT_DEADLINE is not set | ||
103 | # CONFIG_DEFAULT_CFQ is not set | ||
104 | # CONFIG_DEFAULT_NOOP is not set | ||
105 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
106 | CONFIG_MPIC=y | ||
107 | # CONFIG_WANT_EARLY_SERIAL is not set | ||
108 | |||
109 | # | ||
110 | # Platform support | ||
111 | # | ||
112 | # CONFIG_MPC8540_ADS is not set | ||
113 | CONFIG_MPC85xx_CDS=y | ||
114 | CONFIG_MPC8540=y | ||
115 | CONFIG_PPC_INDIRECT_PCI_BE=y | ||
116 | |||
117 | # | ||
118 | # Kernel options | ||
119 | # | ||
120 | # CONFIG_HIGHMEM is not set | ||
121 | # CONFIG_HZ_100 is not set | ||
122 | CONFIG_HZ_250=y | ||
123 | # CONFIG_HZ_1000 is not set | ||
124 | CONFIG_HZ=250 | ||
125 | CONFIG_PREEMPT_NONE=y | ||
126 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
127 | # CONFIG_PREEMPT is not set | ||
128 | CONFIG_BINFMT_ELF=y | ||
129 | CONFIG_BINFMT_MISC=y | ||
130 | CONFIG_MATH_EMULATION=y | ||
131 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
132 | CONFIG_SELECT_MEMORY_MODEL=y | ||
133 | CONFIG_FLATMEM_MANUAL=y | ||
134 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
135 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
136 | CONFIG_FLATMEM=y | ||
137 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
138 | # CONFIG_SPARSEMEM_STATIC is not set | ||
139 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
140 | CONFIG_PROC_DEVICETREE=y | ||
141 | # CONFIG_CMDLINE_BOOL is not set | ||
142 | # CONFIG_PM is not set | ||
143 | # CONFIG_SOFTWARE_SUSPEND is not set | ||
144 | # CONFIG_SECCOMP is not set | ||
145 | CONFIG_ISA_DMA_API=y | ||
146 | |||
147 | # | ||
148 | # Bus options | ||
149 | # | ||
150 | CONFIG_PPC_I8259=y | ||
151 | CONFIG_PPC_INDIRECT_PCI=y | ||
152 | CONFIG_FSL_SOC=y | ||
153 | CONFIG_PCI=y | ||
154 | CONFIG_PCI_DOMAINS=y | ||
155 | # CONFIG_PCI_DEBUG is not set | ||
156 | |||
157 | # | ||
158 | # PCCARD (PCMCIA/CardBus) support | ||
159 | # | ||
160 | # CONFIG_PCCARD is not set | ||
161 | |||
162 | # | ||
163 | # PCI Hotplug Support | ||
164 | # | ||
165 | # CONFIG_HOTPLUG_PCI is not set | ||
166 | |||
167 | # | ||
168 | # Advanced setup | ||
169 | # | ||
170 | # CONFIG_ADVANCED_OPTIONS is not set | ||
171 | |||
172 | # | ||
173 | # Default settings for advanced configuration options are used | ||
174 | # | ||
175 | CONFIG_HIGHMEM_START=0xfe000000 | ||
176 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
177 | CONFIG_KERNEL_START=0xc0000000 | ||
178 | CONFIG_TASK_SIZE=0x80000000 | ||
179 | CONFIG_BOOT_LOAD=0x00800000 | ||
180 | |||
181 | # | ||
182 | # Networking | ||
183 | # | ||
184 | CONFIG_NET=y | ||
185 | |||
186 | # | ||
187 | # Networking options | ||
188 | # | ||
189 | # CONFIG_NETDEBUG is not set | ||
190 | CONFIG_PACKET=y | ||
191 | # CONFIG_PACKET_MMAP is not set | ||
192 | CONFIG_UNIX=y | ||
193 | # CONFIG_NET_KEY is not set | ||
194 | CONFIG_INET=y | ||
195 | CONFIG_IP_MULTICAST=y | ||
196 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
197 | CONFIG_IP_FIB_HASH=y | ||
198 | CONFIG_IP_PNP=y | ||
199 | CONFIG_IP_PNP_DHCP=y | ||
200 | CONFIG_IP_PNP_BOOTP=y | ||
201 | # CONFIG_IP_PNP_RARP is not set | ||
202 | # CONFIG_NET_IPIP is not set | ||
203 | # CONFIG_NET_IPGRE is not set | ||
204 | # CONFIG_IP_MROUTE is not set | ||
205 | # CONFIG_ARPD is not set | ||
206 | CONFIG_SYN_COOKIES=y | ||
207 | # CONFIG_INET_AH is not set | ||
208 | # CONFIG_INET_ESP is not set | ||
209 | # CONFIG_INET_IPCOMP is not set | ||
210 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
211 | # CONFIG_INET_TUNNEL is not set | ||
212 | CONFIG_INET_DIAG=y | ||
213 | CONFIG_INET_TCP_DIAG=y | ||
214 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
215 | CONFIG_TCP_CONG_BIC=y | ||
216 | # CONFIG_IPV6 is not set | ||
217 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
218 | # CONFIG_INET6_TUNNEL is not set | ||
219 | # CONFIG_NETFILTER is not set | ||
220 | |||
221 | # | ||
222 | # DCCP Configuration (EXPERIMENTAL) | ||
223 | # | ||
224 | # CONFIG_IP_DCCP is not set | ||
225 | |||
226 | # | ||
227 | # SCTP Configuration (EXPERIMENTAL) | ||
228 | # | ||
229 | # CONFIG_IP_SCTP is not set | ||
230 | |||
231 | # | ||
232 | # TIPC Configuration (EXPERIMENTAL) | ||
233 | # | ||
234 | # CONFIG_TIPC is not set | ||
235 | # CONFIG_ATM is not set | ||
236 | # CONFIG_BRIDGE is not set | ||
237 | # CONFIG_VLAN_8021Q is not set | ||
238 | # CONFIG_DECNET is not set | ||
239 | # CONFIG_LLC2 is not set | ||
240 | # CONFIG_IPX is not set | ||
241 | # CONFIG_ATALK is not set | ||
242 | # CONFIG_X25 is not set | ||
243 | # CONFIG_LAPB is not set | ||
244 | # CONFIG_NET_DIVERT is not set | ||
245 | # CONFIG_ECONET is not set | ||
246 | # CONFIG_WAN_ROUTER is not set | ||
247 | |||
248 | # | ||
249 | # QoS and/or fair queueing | ||
250 | # | ||
251 | # CONFIG_NET_SCHED is not set | ||
252 | |||
253 | # | ||
254 | # Network testing | ||
255 | # | ||
256 | # CONFIG_NET_PKTGEN is not set | ||
257 | # CONFIG_HAMRADIO is not set | ||
258 | # CONFIG_IRDA is not set | ||
259 | # CONFIG_BT is not set | ||
260 | # CONFIG_IEEE80211 is not set | ||
261 | |||
262 | # | ||
263 | # Device Drivers | ||
264 | # | ||
265 | |||
266 | # | ||
267 | # Generic Driver Options | ||
268 | # | ||
269 | CONFIG_STANDALONE=y | ||
270 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
271 | # CONFIG_FW_LOADER is not set | ||
272 | # CONFIG_DEBUG_DRIVER is not set | ||
273 | |||
274 | # | ||
275 | # Connector - unified userspace <-> kernelspace linker | ||
276 | # | ||
277 | # CONFIG_CONNECTOR is not set | ||
278 | |||
279 | # | ||
280 | # Memory Technology Devices (MTD) | ||
281 | # | ||
282 | # CONFIG_MTD is not set | ||
283 | |||
284 | # | ||
285 | # Parallel port support | ||
286 | # | ||
287 | # CONFIG_PARPORT is not set | ||
288 | |||
289 | # | ||
290 | # Plug and Play support | ||
291 | # | ||
292 | |||
293 | # | ||
294 | # Block devices | ||
295 | # | ||
296 | # CONFIG_BLK_DEV_FD is not set | ||
297 | # CONFIG_BLK_CPQ_DA is not set | ||
298 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
299 | # CONFIG_BLK_DEV_DAC960 is not set | ||
300 | # CONFIG_BLK_DEV_UMEM is not set | ||
301 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
302 | CONFIG_BLK_DEV_LOOP=y | ||
303 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
304 | # CONFIG_BLK_DEV_NBD is not set | ||
305 | # CONFIG_BLK_DEV_SX8 is not set | ||
306 | CONFIG_BLK_DEV_RAM=y | ||
307 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
308 | CONFIG_BLK_DEV_RAM_SIZE=32768 | ||
309 | CONFIG_BLK_DEV_INITRD=y | ||
310 | # CONFIG_CDROM_PKTCDVD is not set | ||
311 | # CONFIG_ATA_OVER_ETH is not set | ||
312 | |||
313 | # | ||
314 | # ATA/ATAPI/MFM/RLL support | ||
315 | # | ||
316 | CONFIG_IDE=y | ||
317 | CONFIG_BLK_DEV_IDE=y | ||
318 | |||
319 | # | ||
320 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
321 | # | ||
322 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
323 | # CONFIG_BLK_DEV_IDEDISK is not set | ||
324 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
325 | # CONFIG_BLK_DEV_IDECD is not set | ||
326 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
327 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
328 | # CONFIG_IDE_TASK_IOCTL is not set | ||
329 | |||
330 | # | ||
331 | # IDE chipset support/bugfixes | ||
332 | # | ||
333 | CONFIG_IDE_GENERIC=y | ||
334 | CONFIG_BLK_DEV_IDEPCI=y | ||
335 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
336 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
337 | CONFIG_BLK_DEV_GENERIC=y | ||
338 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
339 | # CONFIG_BLK_DEV_SL82C105 is not set | ||
340 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
341 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | ||
342 | # CONFIG_IDEDMA_PCI_AUTO is not set | ||
343 | # CONFIG_BLK_DEV_AEC62XX is not set | ||
344 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
345 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
346 | # CONFIG_BLK_DEV_CMD64X is not set | ||
347 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
348 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
349 | # CONFIG_BLK_DEV_CS5520 is not set | ||
350 | # CONFIG_BLK_DEV_CS5530 is not set | ||
351 | # CONFIG_BLK_DEV_HPT34X is not set | ||
352 | # CONFIG_BLK_DEV_HPT366 is not set | ||
353 | # CONFIG_BLK_DEV_SC1200 is not set | ||
354 | # CONFIG_BLK_DEV_PIIX is not set | ||
355 | # CONFIG_BLK_DEV_IT821X is not set | ||
356 | # CONFIG_BLK_DEV_NS87415 is not set | ||
357 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
358 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | ||
359 | # CONFIG_BLK_DEV_SVWKS is not set | ||
360 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
361 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
362 | # CONFIG_BLK_DEV_TRM290 is not set | ||
363 | CONFIG_BLK_DEV_VIA82CXXX=y | ||
364 | # CONFIG_IDE_ARM is not set | ||
365 | CONFIG_BLK_DEV_IDEDMA=y | ||
366 | # CONFIG_IDEDMA_IVB is not set | ||
367 | # CONFIG_IDEDMA_AUTO is not set | ||
368 | # CONFIG_BLK_DEV_HD is not set | ||
369 | |||
370 | # | ||
371 | # SCSI device support | ||
372 | # | ||
373 | # CONFIG_RAID_ATTRS is not set | ||
374 | # CONFIG_SCSI is not set | ||
375 | |||
376 | # | ||
377 | # Multi-device support (RAID and LVM) | ||
378 | # | ||
379 | # CONFIG_MD is not set | ||
380 | |||
381 | # | ||
382 | # Fusion MPT device support | ||
383 | # | ||
384 | # CONFIG_FUSION is not set | ||
385 | |||
386 | # | ||
387 | # IEEE 1394 (FireWire) support | ||
388 | # | ||
389 | # CONFIG_IEEE1394 is not set | ||
390 | |||
391 | # | ||
392 | # I2O device support | ||
393 | # | ||
394 | # CONFIG_I2O is not set | ||
395 | |||
396 | # | ||
397 | # Macintosh device drivers | ||
398 | # | ||
399 | # CONFIG_WINDFARM is not set | ||
400 | |||
401 | # | ||
402 | # Network device support | ||
403 | # | ||
404 | CONFIG_NETDEVICES=y | ||
405 | # CONFIG_DUMMY is not set | ||
406 | # CONFIG_BONDING is not set | ||
407 | # CONFIG_EQUALIZER is not set | ||
408 | # CONFIG_TUN is not set | ||
409 | |||
410 | # | ||
411 | # ARCnet devices | ||
412 | # | ||
413 | # CONFIG_ARCNET is not set | ||
414 | |||
415 | # | ||
416 | # PHY device support | ||
417 | # | ||
418 | CONFIG_PHYLIB=y | ||
419 | |||
420 | # | ||
421 | # MII PHY device drivers | ||
422 | # | ||
423 | # CONFIG_MARVELL_PHY is not set | ||
424 | # CONFIG_DAVICOM_PHY is not set | ||
425 | # CONFIG_QSEMI_PHY is not set | ||
426 | # CONFIG_LXT_PHY is not set | ||
427 | # CONFIG_CICADA_PHY is not set | ||
428 | |||
429 | # | ||
430 | # Ethernet (10 or 100Mbit) | ||
431 | # | ||
432 | CONFIG_NET_ETHERNET=y | ||
433 | CONFIG_MII=y | ||
434 | # CONFIG_HAPPYMEAL is not set | ||
435 | # CONFIG_SUNGEM is not set | ||
436 | # CONFIG_CASSINI is not set | ||
437 | # CONFIG_NET_VENDOR_3COM is not set | ||
438 | |||
439 | # | ||
440 | # Tulip family network device support | ||
441 | # | ||
442 | # CONFIG_NET_TULIP is not set | ||
443 | # CONFIG_HP100 is not set | ||
444 | # CONFIG_NET_PCI is not set | ||
445 | |||
446 | # | ||
447 | # Ethernet (1000 Mbit) | ||
448 | # | ||
449 | # CONFIG_ACENIC is not set | ||
450 | # CONFIG_DL2K is not set | ||
451 | CONFIG_E1000=y | ||
452 | CONFIG_E1000_NAPI=y | ||
453 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
454 | # CONFIG_NS83820 is not set | ||
455 | # CONFIG_HAMACHI is not set | ||
456 | # CONFIG_YELLOWFIN is not set | ||
457 | # CONFIG_R8169 is not set | ||
458 | # CONFIG_SIS190 is not set | ||
459 | # CONFIG_SKGE is not set | ||
460 | # CONFIG_SKY2 is not set | ||
461 | # CONFIG_SK98LIN is not set | ||
462 | # CONFIG_TIGON3 is not set | ||
463 | # CONFIG_BNX2 is not set | ||
464 | CONFIG_GIANFAR=y | ||
465 | CONFIG_GFAR_NAPI=y | ||
466 | |||
467 | # | ||
468 | # Ethernet (10000 Mbit) | ||
469 | # | ||
470 | # CONFIG_CHELSIO_T1 is not set | ||
471 | # CONFIG_IXGB is not set | ||
472 | # CONFIG_S2IO is not set | ||
473 | |||
474 | # | ||
475 | # Token Ring devices | ||
476 | # | ||
477 | # CONFIG_TR is not set | ||
478 | |||
479 | # | ||
480 | # Wireless LAN (non-hamradio) | ||
481 | # | ||
482 | # CONFIG_NET_RADIO is not set | ||
483 | |||
484 | # | ||
485 | # Wan interfaces | ||
486 | # | ||
487 | # CONFIG_WAN is not set | ||
488 | # CONFIG_FDDI is not set | ||
489 | # CONFIG_HIPPI is not set | ||
490 | # CONFIG_PPP is not set | ||
491 | # CONFIG_SLIP is not set | ||
492 | # CONFIG_SHAPER is not set | ||
493 | # CONFIG_NETCONSOLE is not set | ||
494 | # CONFIG_NETPOLL is not set | ||
495 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
496 | |||
497 | # | ||
498 | # ISDN subsystem | ||
499 | # | ||
500 | # CONFIG_ISDN is not set | ||
501 | |||
502 | # | ||
503 | # Telephony Support | ||
504 | # | ||
505 | # CONFIG_PHONE is not set | ||
506 | |||
507 | # | ||
508 | # Input device support | ||
509 | # | ||
510 | CONFIG_INPUT=y | ||
511 | |||
512 | # | ||
513 | # Userland interfaces | ||
514 | # | ||
515 | # CONFIG_INPUT_MOUSEDEV is not set | ||
516 | # CONFIG_INPUT_JOYDEV is not set | ||
517 | # CONFIG_INPUT_TSDEV is not set | ||
518 | # CONFIG_INPUT_EVDEV is not set | ||
519 | # CONFIG_INPUT_EVBUG is not set | ||
520 | |||
521 | # | ||
522 | # Input Device Drivers | ||
523 | # | ||
524 | # CONFIG_INPUT_KEYBOARD is not set | ||
525 | # CONFIG_INPUT_MOUSE is not set | ||
526 | # CONFIG_INPUT_JOYSTICK is not set | ||
527 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
528 | # CONFIG_INPUT_MISC is not set | ||
529 | |||
530 | # | ||
531 | # Hardware I/O ports | ||
532 | # | ||
533 | # CONFIG_SERIO is not set | ||
534 | # CONFIG_GAMEPORT is not set | ||
535 | |||
536 | # | ||
537 | # Character devices | ||
538 | # | ||
539 | # CONFIG_VT is not set | ||
540 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
541 | |||
542 | # | ||
543 | # Serial drivers | ||
544 | # | ||
545 | CONFIG_SERIAL_8250=y | ||
546 | CONFIG_SERIAL_8250_CONSOLE=y | ||
547 | CONFIG_SERIAL_8250_PCI=y | ||
548 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
549 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
550 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
551 | |||
552 | # | ||
553 | # Non-8250 serial port support | ||
554 | # | ||
555 | CONFIG_SERIAL_CORE=y | ||
556 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
557 | # CONFIG_SERIAL_JSM is not set | ||
558 | CONFIG_UNIX98_PTYS=y | ||
559 | CONFIG_LEGACY_PTYS=y | ||
560 | CONFIG_LEGACY_PTY_COUNT=256 | ||
561 | |||
562 | # | ||
563 | # IPMI | ||
564 | # | ||
565 | # CONFIG_IPMI_HANDLER is not set | ||
566 | |||
567 | # | ||
568 | # Watchdog Cards | ||
569 | # | ||
570 | # CONFIG_WATCHDOG is not set | ||
571 | # CONFIG_NVRAM is not set | ||
572 | CONFIG_GEN_RTC=y | ||
573 | # CONFIG_GEN_RTC_X is not set | ||
574 | # CONFIG_DTLK is not set | ||
575 | # CONFIG_R3964 is not set | ||
576 | # CONFIG_APPLICOM is not set | ||
577 | |||
578 | # | ||
579 | # Ftape, the floppy tape device driver | ||
580 | # | ||
581 | # CONFIG_AGP is not set | ||
582 | # CONFIG_DRM is not set | ||
583 | # CONFIG_RAW_DRIVER is not set | ||
584 | |||
585 | # | ||
586 | # TPM devices | ||
587 | # | ||
588 | # CONFIG_TCG_TPM is not set | ||
589 | # CONFIG_TELCLOCK is not set | ||
590 | |||
591 | # | ||
592 | # I2C support | ||
593 | # | ||
594 | # CONFIG_I2C is not set | ||
595 | |||
596 | # | ||
597 | # SPI support | ||
598 | # | ||
599 | # CONFIG_SPI is not set | ||
600 | # CONFIG_SPI_MASTER is not set | ||
601 | |||
602 | # | ||
603 | # Dallas's 1-wire bus | ||
604 | # | ||
605 | # CONFIG_W1 is not set | ||
606 | |||
607 | # | ||
608 | # Hardware Monitoring support | ||
609 | # | ||
610 | CONFIG_HWMON=y | ||
611 | # CONFIG_HWMON_VID is not set | ||
612 | # CONFIG_SENSORS_F71805F is not set | ||
613 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
614 | |||
615 | # | ||
616 | # Misc devices | ||
617 | # | ||
618 | |||
619 | # | ||
620 | # Multimedia devices | ||
621 | # | ||
622 | # CONFIG_VIDEO_DEV is not set | ||
623 | |||
624 | # | ||
625 | # Digital Video Broadcasting Devices | ||
626 | # | ||
627 | # CONFIG_DVB is not set | ||
628 | |||
629 | # | ||
630 | # Graphics support | ||
631 | # | ||
632 | # CONFIG_FB is not set | ||
633 | |||
634 | # | ||
635 | # Sound | ||
636 | # | ||
637 | # CONFIG_SOUND is not set | ||
638 | |||
639 | # | ||
640 | # USB support | ||
641 | # | ||
642 | CONFIG_USB_ARCH_HAS_HCD=y | ||
643 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
644 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
645 | # CONFIG_USB is not set | ||
646 | |||
647 | # | ||
648 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
649 | # | ||
650 | |||
651 | # | ||
652 | # USB Gadget Support | ||
653 | # | ||
654 | # CONFIG_USB_GADGET is not set | ||
655 | |||
656 | # | ||
657 | # MMC/SD Card support | ||
658 | # | ||
659 | # CONFIG_MMC is not set | ||
660 | |||
661 | # | ||
662 | # LED devices | ||
663 | # | ||
664 | # CONFIG_NEW_LEDS is not set | ||
665 | |||
666 | # | ||
667 | # InfiniBand support | ||
668 | # | ||
669 | # CONFIG_INFINIBAND is not set | ||
670 | |||
671 | # | ||
672 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
673 | # | ||
674 | |||
675 | # | ||
676 | # Real Time Clock | ||
677 | # | ||
678 | # CONFIG_RTC_CLASS is not set | ||
679 | |||
680 | # | ||
681 | # File systems | ||
682 | # | ||
683 | CONFIG_EXT2_FS=y | ||
684 | # CONFIG_EXT2_FS_XATTR is not set | ||
685 | # CONFIG_EXT2_FS_XIP is not set | ||
686 | CONFIG_EXT3_FS=y | ||
687 | CONFIG_EXT3_FS_XATTR=y | ||
688 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
689 | # CONFIG_EXT3_FS_SECURITY is not set | ||
690 | CONFIG_JBD=y | ||
691 | # CONFIG_JBD_DEBUG is not set | ||
692 | CONFIG_FS_MBCACHE=y | ||
693 | # CONFIG_REISERFS_FS is not set | ||
694 | # CONFIG_JFS_FS is not set | ||
695 | # CONFIG_FS_POSIX_ACL is not set | ||
696 | # CONFIG_XFS_FS is not set | ||
697 | # CONFIG_OCFS2_FS is not set | ||
698 | # CONFIG_MINIX_FS is not set | ||
699 | # CONFIG_ROMFS_FS is not set | ||
700 | CONFIG_INOTIFY=y | ||
701 | # CONFIG_QUOTA is not set | ||
702 | CONFIG_DNOTIFY=y | ||
703 | # CONFIG_AUTOFS_FS is not set | ||
704 | # CONFIG_AUTOFS4_FS is not set | ||
705 | # CONFIG_FUSE_FS is not set | ||
706 | |||
707 | # | ||
708 | # CD-ROM/DVD Filesystems | ||
709 | # | ||
710 | # CONFIG_ISO9660_FS is not set | ||
711 | # CONFIG_UDF_FS is not set | ||
712 | |||
713 | # | ||
714 | # DOS/FAT/NT Filesystems | ||
715 | # | ||
716 | # CONFIG_MSDOS_FS is not set | ||
717 | # CONFIG_VFAT_FS is not set | ||
718 | # CONFIG_NTFS_FS is not set | ||
719 | |||
720 | # | ||
721 | # Pseudo filesystems | ||
722 | # | ||
723 | CONFIG_PROC_FS=y | ||
724 | CONFIG_PROC_KCORE=y | ||
725 | CONFIG_SYSFS=y | ||
726 | CONFIG_TMPFS=y | ||
727 | # CONFIG_HUGETLB_PAGE is not set | ||
728 | CONFIG_RAMFS=y | ||
729 | # CONFIG_CONFIGFS_FS is not set | ||
730 | |||
731 | # | ||
732 | # Miscellaneous filesystems | ||
733 | # | ||
734 | # CONFIG_ADFS_FS is not set | ||
735 | # CONFIG_AFFS_FS is not set | ||
736 | # CONFIG_HFS_FS is not set | ||
737 | # CONFIG_HFSPLUS_FS is not set | ||
738 | # CONFIG_BEFS_FS is not set | ||
739 | # CONFIG_BFS_FS is not set | ||
740 | # CONFIG_EFS_FS is not set | ||
741 | # CONFIG_CRAMFS is not set | ||
742 | # CONFIG_VXFS_FS is not set | ||
743 | # CONFIG_HPFS_FS is not set | ||
744 | # CONFIG_QNX4FS_FS is not set | ||
745 | # CONFIG_SYSV_FS is not set | ||
746 | # CONFIG_UFS_FS is not set | ||
747 | |||
748 | # | ||
749 | # Network File Systems | ||
750 | # | ||
751 | CONFIG_NFS_FS=y | ||
752 | # CONFIG_NFS_V3 is not set | ||
753 | # CONFIG_NFS_V4 is not set | ||
754 | # CONFIG_NFS_DIRECTIO is not set | ||
755 | # CONFIG_NFSD is not set | ||
756 | CONFIG_ROOT_NFS=y | ||
757 | CONFIG_LOCKD=y | ||
758 | CONFIG_NFS_COMMON=y | ||
759 | CONFIG_SUNRPC=y | ||
760 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
761 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
762 | # CONFIG_SMB_FS is not set | ||
763 | # CONFIG_CIFS is not set | ||
764 | # CONFIG_NCP_FS is not set | ||
765 | # CONFIG_CODA_FS is not set | ||
766 | # CONFIG_AFS_FS is not set | ||
767 | # CONFIG_9P_FS is not set | ||
768 | |||
769 | # | ||
770 | # Partition Types | ||
771 | # | ||
772 | CONFIG_PARTITION_ADVANCED=y | ||
773 | # CONFIG_ACORN_PARTITION is not set | ||
774 | # CONFIG_OSF_PARTITION is not set | ||
775 | # CONFIG_AMIGA_PARTITION is not set | ||
776 | # CONFIG_ATARI_PARTITION is not set | ||
777 | # CONFIG_MAC_PARTITION is not set | ||
778 | # CONFIG_MSDOS_PARTITION is not set | ||
779 | # CONFIG_LDM_PARTITION is not set | ||
780 | # CONFIG_SGI_PARTITION is not set | ||
781 | # CONFIG_ULTRIX_PARTITION is not set | ||
782 | # CONFIG_SUN_PARTITION is not set | ||
783 | # CONFIG_KARMA_PARTITION is not set | ||
784 | # CONFIG_EFI_PARTITION is not set | ||
785 | |||
786 | # | ||
787 | # Native Language Support | ||
788 | # | ||
789 | # CONFIG_NLS is not set | ||
790 | |||
791 | # | ||
792 | # Library routines | ||
793 | # | ||
794 | # CONFIG_CRC_CCITT is not set | ||
795 | # CONFIG_CRC16 is not set | ||
796 | CONFIG_CRC32=y | ||
797 | # CONFIG_LIBCRC32C is not set | ||
798 | |||
799 | # | ||
800 | # Instrumentation Support | ||
801 | # | ||
802 | # CONFIG_PROFILING is not set | ||
803 | |||
804 | # | ||
805 | # Kernel hacking | ||
806 | # | ||
807 | # CONFIG_PRINTK_TIME is not set | ||
808 | # CONFIG_MAGIC_SYSRQ is not set | ||
809 | CONFIG_DEBUG_KERNEL=y | ||
810 | CONFIG_LOG_BUF_SHIFT=14 | ||
811 | CONFIG_DETECT_SOFTLOCKUP=y | ||
812 | # CONFIG_SCHEDSTATS is not set | ||
813 | # CONFIG_DEBUG_SLAB is not set | ||
814 | CONFIG_DEBUG_MUTEXES=y | ||
815 | # CONFIG_DEBUG_SPINLOCK is not set | ||
816 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
817 | # CONFIG_DEBUG_KOBJECT is not set | ||
818 | # CONFIG_DEBUG_INFO is not set | ||
819 | # CONFIG_DEBUG_FS is not set | ||
820 | # CONFIG_DEBUG_VM is not set | ||
821 | # CONFIG_UNWIND_INFO is not set | ||
822 | CONFIG_FORCED_INLINING=y | ||
823 | # CONFIG_RCU_TORTURE_TEST is not set | ||
824 | # CONFIG_DEBUGGER is not set | ||
825 | # CONFIG_BDI_SWITCH is not set | ||
826 | # CONFIG_BOOTX_TEXT is not set | ||
827 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | ||
828 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
829 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
830 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
831 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
832 | |||
833 | # | ||
834 | # Security options | ||
835 | # | ||
836 | # CONFIG_KEYS is not set | ||
837 | # CONFIG_SECURITY is not set | ||
838 | |||
839 | # | ||
840 | # Cryptographic options | ||
841 | # | ||
842 | # CONFIG_CRYPTO is not set | ||
843 | |||
844 | # | ||
845 | # Hardware crypto devices | ||
846 | # | ||
diff --git a/arch/powerpc/configs/mpc8641_hpcn_defconfig b/arch/powerpc/configs/mpc8641_hpcn_defconfig new file mode 100644 index 000000000000..d7a30f9bc535 --- /dev/null +++ b/arch/powerpc/configs/mpc8641_hpcn_defconfig | |||
@@ -0,0 +1,921 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.17-rc3 | ||
4 | # Fri Jun 16 10:47:09 2006 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | CONFIG_PPC32=y | ||
8 | CONFIG_PPC_MERGE=y | ||
9 | CONFIG_MMU=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
14 | CONFIG_PPC=y | ||
15 | CONFIG_EARLY_PRINTK=y | ||
16 | CONFIG_GENERIC_NVRAM=y | ||
17 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
18 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
19 | CONFIG_PPC_OF=y | ||
20 | CONFIG_PPC_UDBG_16550=y | ||
21 | CONFIG_GENERIC_TBSYNC=y | ||
22 | # CONFIG_DEFAULT_UIMAGE is not set | ||
23 | |||
24 | # | ||
25 | # Processor support | ||
26 | # | ||
27 | # CONFIG_CLASSIC32 is not set | ||
28 | # CONFIG_PPC_52xx is not set | ||
29 | # CONFIG_PPC_82xx is not set | ||
30 | # CONFIG_PPC_83xx is not set | ||
31 | # CONFIG_PPC_85xx is not set | ||
32 | CONFIG_PPC_86xx=y | ||
33 | # CONFIG_40x is not set | ||
34 | # CONFIG_44x is not set | ||
35 | # CONFIG_8xx is not set | ||
36 | # CONFIG_E200 is not set | ||
37 | CONFIG_6xx=y | ||
38 | CONFIG_PPC_FPU=y | ||
39 | CONFIG_ALTIVEC=y | ||
40 | CONFIG_PPC_STD_MMU=y | ||
41 | CONFIG_PPC_STD_MMU_32=y | ||
42 | CONFIG_SMP=y | ||
43 | CONFIG_NR_CPUS=2 | ||
44 | |||
45 | # | ||
46 | # Code maturity level options | ||
47 | # | ||
48 | CONFIG_EXPERIMENTAL=y | ||
49 | CONFIG_LOCK_KERNEL=y | ||
50 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
51 | |||
52 | # | ||
53 | # General setup | ||
54 | # | ||
55 | CONFIG_LOCALVERSION="" | ||
56 | # CONFIG_LOCALVERSION_AUTO is not set | ||
57 | # CONFIG_SWAP is not set | ||
58 | # CONFIG_SYSVIPC is not set | ||
59 | # CONFIG_POSIX_MQUEUE is not set | ||
60 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
61 | CONFIG_SYSCTL=y | ||
62 | # CONFIG_AUDIT is not set | ||
63 | CONFIG_IKCONFIG=y | ||
64 | CONFIG_IKCONFIG_PROC=y | ||
65 | # CONFIG_CPUSETS is not set | ||
66 | # CONFIG_RELAY is not set | ||
67 | CONFIG_INITRAMFS_SOURCE="" | ||
68 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
69 | CONFIG_EMBEDDED=y | ||
70 | CONFIG_KALLSYMS=y | ||
71 | # CONFIG_KALLSYMS_ALL is not set | ||
72 | CONFIG_KALLSYMS_EXTRA_PASS=y | ||
73 | CONFIG_HOTPLUG=y | ||
74 | CONFIG_PRINTK=y | ||
75 | CONFIG_BUG=y | ||
76 | # CONFIG_ELF_CORE is not set | ||
77 | CONFIG_BASE_FULL=y | ||
78 | CONFIG_FUTEX=y | ||
79 | CONFIG_EPOLL=y | ||
80 | CONFIG_SHMEM=y | ||
81 | # CONFIG_SLAB is not set | ||
82 | # CONFIG_TINY_SHMEM is not set | ||
83 | CONFIG_BASE_SMALL=0 | ||
84 | CONFIG_SLOB=y | ||
85 | |||
86 | # | ||
87 | # Loadable module support | ||
88 | # | ||
89 | # CONFIG_MODULES is not set | ||
90 | |||
91 | # | ||
92 | # Block layer | ||
93 | # | ||
94 | # CONFIG_LBD is not set | ||
95 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
96 | # CONFIG_LSF is not set | ||
97 | |||
98 | # | ||
99 | # IO Schedulers | ||
100 | # | ||
101 | CONFIG_IOSCHED_NOOP=y | ||
102 | # CONFIG_IOSCHED_AS is not set | ||
103 | CONFIG_IOSCHED_DEADLINE=y | ||
104 | # CONFIG_IOSCHED_CFQ is not set | ||
105 | # CONFIG_DEFAULT_AS is not set | ||
106 | CONFIG_DEFAULT_DEADLINE=y | ||
107 | # CONFIG_DEFAULT_CFQ is not set | ||
108 | # CONFIG_DEFAULT_NOOP is not set | ||
109 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
110 | CONFIG_MPIC=y | ||
111 | # CONFIG_WANT_EARLY_SERIAL is not set | ||
112 | CONFIG_PPC_INDIRECT_PCI_BE=y | ||
113 | |||
114 | # | ||
115 | # Platform Support | ||
116 | # | ||
117 | CONFIG_MPC8641_HPCN=y | ||
118 | CONFIG_MPC8641=y | ||
119 | |||
120 | # | ||
121 | # Kernel options | ||
122 | # | ||
123 | CONFIG_HIGHMEM=y | ||
124 | # CONFIG_HZ_100 is not set | ||
125 | # CONFIG_HZ_250 is not set | ||
126 | CONFIG_HZ_1000=y | ||
127 | CONFIG_HZ=1000 | ||
128 | CONFIG_PREEMPT_NONE=y | ||
129 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
130 | # CONFIG_PREEMPT is not set | ||
131 | CONFIG_PREEMPT_BKL=y | ||
132 | CONFIG_BINFMT_ELF=y | ||
133 | # CONFIG_BINFMT_MISC is not set | ||
134 | # CONFIG_IRQ_ALL_CPUS is not set | ||
135 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
136 | CONFIG_SELECT_MEMORY_MODEL=y | ||
137 | CONFIG_FLATMEM_MANUAL=y | ||
138 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
139 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
140 | CONFIG_FLATMEM=y | ||
141 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
142 | # CONFIG_SPARSEMEM_STATIC is not set | ||
143 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
144 | CONFIG_PROC_DEVICETREE=y | ||
145 | # CONFIG_CMDLINE_BOOL is not set | ||
146 | # CONFIG_PM is not set | ||
147 | # CONFIG_SECCOMP is not set | ||
148 | CONFIG_ISA_DMA_API=y | ||
149 | |||
150 | # | ||
151 | # Bus options | ||
152 | # | ||
153 | CONFIG_GENERIC_ISA_DMA=y | ||
154 | CONFIG_PPC_I8259=y | ||
155 | CONFIG_PPC_INDIRECT_PCI=y | ||
156 | CONFIG_FSL_SOC=y | ||
157 | CONFIG_PCI=y | ||
158 | CONFIG_PCI_DOMAINS=y | ||
159 | # CONFIG_PCI_DEBUG is not set | ||
160 | |||
161 | # | ||
162 | # PCCARD (PCMCIA/CardBus) support | ||
163 | # | ||
164 | # CONFIG_PCCARD is not set | ||
165 | |||
166 | # | ||
167 | # PCI Hotplug Support | ||
168 | # | ||
169 | # CONFIG_HOTPLUG_PCI is not set | ||
170 | |||
171 | # | ||
172 | # Advanced setup | ||
173 | # | ||
174 | # CONFIG_ADVANCED_OPTIONS is not set | ||
175 | |||
176 | # | ||
177 | # Default settings for advanced configuration options are used | ||
178 | # | ||
179 | CONFIG_HIGHMEM_START=0xfe000000 | ||
180 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
181 | CONFIG_KERNEL_START=0xc0000000 | ||
182 | CONFIG_TASK_SIZE=0x80000000 | ||
183 | CONFIG_BOOT_LOAD=0x00800000 | ||
184 | |||
185 | # | ||
186 | # Networking | ||
187 | # | ||
188 | CONFIG_NET=y | ||
189 | |||
190 | # | ||
191 | # Networking options | ||
192 | # | ||
193 | # CONFIG_NETDEBUG is not set | ||
194 | CONFIG_PACKET=y | ||
195 | # CONFIG_PACKET_MMAP is not set | ||
196 | CONFIG_UNIX=y | ||
197 | # CONFIG_NET_KEY is not set | ||
198 | CONFIG_INET=y | ||
199 | # CONFIG_IP_MULTICAST is not set | ||
200 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
201 | CONFIG_IP_FIB_HASH=y | ||
202 | CONFIG_IP_PNP=y | ||
203 | CONFIG_IP_PNP_DHCP=y | ||
204 | CONFIG_IP_PNP_BOOTP=y | ||
205 | CONFIG_IP_PNP_RARP=y | ||
206 | # CONFIG_NET_IPIP is not set | ||
207 | # CONFIG_NET_IPGRE is not set | ||
208 | # CONFIG_ARPD is not set | ||
209 | # CONFIG_SYN_COOKIES is not set | ||
210 | # CONFIG_INET_AH is not set | ||
211 | # CONFIG_INET_ESP is not set | ||
212 | # CONFIG_INET_IPCOMP is not set | ||
213 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
214 | # CONFIG_INET_TUNNEL is not set | ||
215 | CONFIG_INET_DIAG=y | ||
216 | CONFIG_INET_TCP_DIAG=y | ||
217 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
218 | CONFIG_TCP_CONG_BIC=y | ||
219 | CONFIG_IPV6=y | ||
220 | # CONFIG_IPV6_PRIVACY is not set | ||
221 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
222 | # CONFIG_INET6_AH is not set | ||
223 | # CONFIG_INET6_ESP is not set | ||
224 | # CONFIG_INET6_IPCOMP is not set | ||
225 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
226 | # CONFIG_INET6_TUNNEL is not set | ||
227 | # CONFIG_IPV6_TUNNEL is not set | ||
228 | # CONFIG_NETFILTER is not set | ||
229 | |||
230 | # | ||
231 | # DCCP Configuration (EXPERIMENTAL) | ||
232 | # | ||
233 | # CONFIG_IP_DCCP is not set | ||
234 | |||
235 | # | ||
236 | # SCTP Configuration (EXPERIMENTAL) | ||
237 | # | ||
238 | # CONFIG_IP_SCTP is not set | ||
239 | |||
240 | # | ||
241 | # TIPC Configuration (EXPERIMENTAL) | ||
242 | # | ||
243 | # CONFIG_TIPC is not set | ||
244 | # CONFIG_ATM is not set | ||
245 | # CONFIG_BRIDGE is not set | ||
246 | # CONFIG_VLAN_8021Q is not set | ||
247 | # CONFIG_DECNET is not set | ||
248 | # CONFIG_LLC2 is not set | ||
249 | # CONFIG_IPX is not set | ||
250 | # CONFIG_ATALK is not set | ||
251 | # CONFIG_X25 is not set | ||
252 | # CONFIG_LAPB is not set | ||
253 | # CONFIG_NET_DIVERT is not set | ||
254 | # CONFIG_ECONET is not set | ||
255 | # CONFIG_WAN_ROUTER is not set | ||
256 | |||
257 | # | ||
258 | # QoS and/or fair queueing | ||
259 | # | ||
260 | # CONFIG_NET_SCHED is not set | ||
261 | |||
262 | # | ||
263 | # Network testing | ||
264 | # | ||
265 | # CONFIG_NET_PKTGEN is not set | ||
266 | # CONFIG_HAMRADIO is not set | ||
267 | # CONFIG_IRDA is not set | ||
268 | # CONFIG_BT is not set | ||
269 | # CONFIG_IEEE80211 is not set | ||
270 | |||
271 | # | ||
272 | # Device Drivers | ||
273 | # | ||
274 | |||
275 | # | ||
276 | # Generic Driver Options | ||
277 | # | ||
278 | CONFIG_STANDALONE=y | ||
279 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
280 | CONFIG_FW_LOADER=y | ||
281 | # CONFIG_DEBUG_DRIVER is not set | ||
282 | |||
283 | # | ||
284 | # Connector - unified userspace <-> kernelspace linker | ||
285 | # | ||
286 | # CONFIG_CONNECTOR is not set | ||
287 | |||
288 | # | ||
289 | # Memory Technology Devices (MTD) | ||
290 | # | ||
291 | # CONFIG_MTD is not set | ||
292 | |||
293 | # | ||
294 | # Parallel port support | ||
295 | # | ||
296 | # CONFIG_PARPORT is not set | ||
297 | |||
298 | # | ||
299 | # Plug and Play support | ||
300 | # | ||
301 | |||
302 | # | ||
303 | # Block devices | ||
304 | # | ||
305 | # CONFIG_BLK_DEV_FD is not set | ||
306 | # CONFIG_BLK_CPQ_DA is not set | ||
307 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
308 | # CONFIG_BLK_DEV_DAC960 is not set | ||
309 | # CONFIG_BLK_DEV_UMEM is not set | ||
310 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
311 | CONFIG_BLK_DEV_LOOP=y | ||
312 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
313 | # CONFIG_BLK_DEV_NBD is not set | ||
314 | # CONFIG_BLK_DEV_SX8 is not set | ||
315 | CONFIG_BLK_DEV_RAM=y | ||
316 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
317 | CONFIG_BLK_DEV_RAM_SIZE=131072 | ||
318 | CONFIG_BLK_DEV_INITRD=y | ||
319 | # CONFIG_CDROM_PKTCDVD is not set | ||
320 | # CONFIG_ATA_OVER_ETH is not set | ||
321 | |||
322 | # | ||
323 | # ATA/ATAPI/MFM/RLL support | ||
324 | # | ||
325 | # CONFIG_IDE is not set | ||
326 | |||
327 | # | ||
328 | # SCSI device support | ||
329 | # | ||
330 | # CONFIG_RAID_ATTRS is not set | ||
331 | # CONFIG_SCSI is not set | ||
332 | |||
333 | # | ||
334 | # Multi-device support (RAID and LVM) | ||
335 | # | ||
336 | # CONFIG_MD is not set | ||
337 | |||
338 | # | ||
339 | # Fusion MPT device support | ||
340 | # | ||
341 | # CONFIG_FUSION is not set | ||
342 | |||
343 | # | ||
344 | # IEEE 1394 (FireWire) support | ||
345 | # | ||
346 | # CONFIG_IEEE1394 is not set | ||
347 | |||
348 | # | ||
349 | # I2O device support | ||
350 | # | ||
351 | # CONFIG_I2O is not set | ||
352 | |||
353 | # | ||
354 | # Macintosh device drivers | ||
355 | # | ||
356 | # CONFIG_WINDFARM is not set | ||
357 | |||
358 | # | ||
359 | # Network device support | ||
360 | # | ||
361 | CONFIG_NETDEVICES=y | ||
362 | CONFIG_DUMMY=y | ||
363 | # CONFIG_BONDING is not set | ||
364 | # CONFIG_EQUALIZER is not set | ||
365 | # CONFIG_TUN is not set | ||
366 | |||
367 | # | ||
368 | # ARCnet devices | ||
369 | # | ||
370 | # CONFIG_ARCNET is not set | ||
371 | |||
372 | # | ||
373 | # PHY device support | ||
374 | # | ||
375 | CONFIG_PHYLIB=y | ||
376 | |||
377 | # | ||
378 | # MII PHY device drivers | ||
379 | # | ||
380 | # CONFIG_MARVELL_PHY is not set | ||
381 | # CONFIG_DAVICOM_PHY is not set | ||
382 | # CONFIG_QSEMI_PHY is not set | ||
383 | # CONFIG_LXT_PHY is not set | ||
384 | # CONFIG_CICADA_PHY is not set | ||
385 | CONFIG_VITESSE_PHY=y | ||
386 | |||
387 | # | ||
388 | # Ethernet (10 or 100Mbit) | ||
389 | # | ||
390 | CONFIG_NET_ETHERNET=y | ||
391 | CONFIG_MII=y | ||
392 | # CONFIG_HAPPYMEAL is not set | ||
393 | # CONFIG_SUNGEM is not set | ||
394 | # CONFIG_CASSINI is not set | ||
395 | # CONFIG_NET_VENDOR_3COM is not set | ||
396 | |||
397 | # | ||
398 | # Tulip family network device support | ||
399 | # | ||
400 | # CONFIG_NET_TULIP is not set | ||
401 | # CONFIG_HP100 is not set | ||
402 | # CONFIG_NET_PCI is not set | ||
403 | |||
404 | # | ||
405 | # Ethernet (1000 Mbit) | ||
406 | # | ||
407 | # CONFIG_ACENIC is not set | ||
408 | # CONFIG_DL2K is not set | ||
409 | # CONFIG_E1000 is not set | ||
410 | # CONFIG_NS83820 is not set | ||
411 | # CONFIG_HAMACHI is not set | ||
412 | # CONFIG_YELLOWFIN is not set | ||
413 | # CONFIG_R8169 is not set | ||
414 | # CONFIG_SIS190 is not set | ||
415 | # CONFIG_SKGE is not set | ||
416 | # CONFIG_SKY2 is not set | ||
417 | # CONFIG_SK98LIN is not set | ||
418 | # CONFIG_TIGON3 is not set | ||
419 | # CONFIG_BNX2 is not set | ||
420 | CONFIG_GIANFAR=y | ||
421 | # CONFIG_GFAR_NAPI is not set | ||
422 | |||
423 | # | ||
424 | # Ethernet (10000 Mbit) | ||
425 | # | ||
426 | # CONFIG_CHELSIO_T1 is not set | ||
427 | # CONFIG_IXGB is not set | ||
428 | # CONFIG_S2IO is not set | ||
429 | |||
430 | # | ||
431 | # Token Ring devices | ||
432 | # | ||
433 | # CONFIG_TR is not set | ||
434 | |||
435 | # | ||
436 | # Wireless LAN (non-hamradio) | ||
437 | # | ||
438 | # CONFIG_NET_RADIO is not set | ||
439 | |||
440 | # | ||
441 | # Wan interfaces | ||
442 | # | ||
443 | # CONFIG_WAN is not set | ||
444 | # CONFIG_FDDI is not set | ||
445 | # CONFIG_HIPPI is not set | ||
446 | # CONFIG_PPP is not set | ||
447 | # CONFIG_SLIP is not set | ||
448 | # CONFIG_SHAPER is not set | ||
449 | # CONFIG_NETCONSOLE is not set | ||
450 | # CONFIG_NETPOLL is not set | ||
451 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
452 | |||
453 | # | ||
454 | # ISDN subsystem | ||
455 | # | ||
456 | # CONFIG_ISDN is not set | ||
457 | |||
458 | # | ||
459 | # Telephony Support | ||
460 | # | ||
461 | # CONFIG_PHONE is not set | ||
462 | |||
463 | # | ||
464 | # Input device support | ||
465 | # | ||
466 | CONFIG_INPUT=y | ||
467 | |||
468 | # | ||
469 | # Userland interfaces | ||
470 | # | ||
471 | # CONFIG_INPUT_MOUSEDEV is not set | ||
472 | # CONFIG_INPUT_JOYDEV is not set | ||
473 | # CONFIG_INPUT_TSDEV is not set | ||
474 | # CONFIG_INPUT_EVDEV is not set | ||
475 | # CONFIG_INPUT_EVBUG is not set | ||
476 | |||
477 | # | ||
478 | # Input Device Drivers | ||
479 | # | ||
480 | # CONFIG_INPUT_KEYBOARD is not set | ||
481 | # CONFIG_INPUT_MOUSE is not set | ||
482 | # CONFIG_INPUT_JOYSTICK is not set | ||
483 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
484 | # CONFIG_INPUT_MISC is not set | ||
485 | |||
486 | # | ||
487 | # Hardware I/O ports | ||
488 | # | ||
489 | CONFIG_SERIO=y | ||
490 | CONFIG_SERIO_I8042=y | ||
491 | CONFIG_SERIO_SERPORT=y | ||
492 | # CONFIG_SERIO_PCIPS2 is not set | ||
493 | CONFIG_SERIO_LIBPS2=y | ||
494 | # CONFIG_SERIO_RAW is not set | ||
495 | # CONFIG_GAMEPORT is not set | ||
496 | |||
497 | # | ||
498 | # Character devices | ||
499 | # | ||
500 | CONFIG_VT=y | ||
501 | CONFIG_VT_CONSOLE=y | ||
502 | CONFIG_HW_CONSOLE=y | ||
503 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
504 | |||
505 | # | ||
506 | # Serial drivers | ||
507 | # | ||
508 | CONFIG_SERIAL_8250=y | ||
509 | CONFIG_SERIAL_8250_CONSOLE=y | ||
510 | CONFIG_SERIAL_8250_PCI=y | ||
511 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
512 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
513 | CONFIG_SERIAL_8250_EXTENDED=y | ||
514 | CONFIG_SERIAL_8250_MANY_PORTS=y | ||
515 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
516 | CONFIG_SERIAL_8250_DETECT_IRQ=y | ||
517 | CONFIG_SERIAL_8250_RSA=y | ||
518 | |||
519 | # | ||
520 | # Non-8250 serial port support | ||
521 | # | ||
522 | CONFIG_SERIAL_CORE=y | ||
523 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
524 | # CONFIG_SERIAL_JSM is not set | ||
525 | CONFIG_UNIX98_PTYS=y | ||
526 | # CONFIG_LEGACY_PTYS is not set | ||
527 | |||
528 | # | ||
529 | # IPMI | ||
530 | # | ||
531 | # CONFIG_IPMI_HANDLER is not set | ||
532 | |||
533 | # | ||
534 | # Watchdog Cards | ||
535 | # | ||
536 | # CONFIG_WATCHDOG is not set | ||
537 | # CONFIG_NVRAM is not set | ||
538 | # CONFIG_GEN_RTC is not set | ||
539 | # CONFIG_DTLK is not set | ||
540 | # CONFIG_R3964 is not set | ||
541 | # CONFIG_APPLICOM is not set | ||
542 | |||
543 | # | ||
544 | # Ftape, the floppy tape device driver | ||
545 | # | ||
546 | # CONFIG_AGP is not set | ||
547 | # CONFIG_DRM is not set | ||
548 | # CONFIG_RAW_DRIVER is not set | ||
549 | |||
550 | # | ||
551 | # TPM devices | ||
552 | # | ||
553 | # CONFIG_TCG_TPM is not set | ||
554 | # CONFIG_TELCLOCK is not set | ||
555 | |||
556 | # | ||
557 | # I2C support | ||
558 | # | ||
559 | CONFIG_I2C=y | ||
560 | # CONFIG_I2C_CHARDEV is not set | ||
561 | |||
562 | # | ||
563 | # I2C Algorithms | ||
564 | # | ||
565 | # CONFIG_I2C_ALGOBIT is not set | ||
566 | # CONFIG_I2C_ALGOPCF is not set | ||
567 | # CONFIG_I2C_ALGOPCA is not set | ||
568 | |||
569 | # | ||
570 | # I2C Hardware Bus support | ||
571 | # | ||
572 | # CONFIG_I2C_ALI1535 is not set | ||
573 | # CONFIG_I2C_ALI1563 is not set | ||
574 | # CONFIG_I2C_ALI15X3 is not set | ||
575 | # CONFIG_I2C_AMD756 is not set | ||
576 | # CONFIG_I2C_AMD8111 is not set | ||
577 | # CONFIG_I2C_I801 is not set | ||
578 | # CONFIG_I2C_I810 is not set | ||
579 | # CONFIG_I2C_PIIX4 is not set | ||
580 | CONFIG_I2C_MPC=y | ||
581 | # CONFIG_I2C_NFORCE2 is not set | ||
582 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
583 | # CONFIG_I2C_PROSAVAGE is not set | ||
584 | # CONFIG_I2C_SAVAGE4 is not set | ||
585 | # CONFIG_I2C_SIS5595 is not set | ||
586 | # CONFIG_I2C_SIS630 is not set | ||
587 | # CONFIG_I2C_SIS96X is not set | ||
588 | # CONFIG_I2C_VIA is not set | ||
589 | # CONFIG_I2C_VIAPRO is not set | ||
590 | # CONFIG_I2C_VOODOO3 is not set | ||
591 | # CONFIG_I2C_PCA_ISA is not set | ||
592 | |||
593 | # | ||
594 | # Miscellaneous I2C Chip support | ||
595 | # | ||
596 | # CONFIG_SENSORS_DS1337 is not set | ||
597 | # CONFIG_SENSORS_DS1374 is not set | ||
598 | CONFIG_SENSORS_EEPROM=y | ||
599 | # CONFIG_SENSORS_PCF8574 is not set | ||
600 | # CONFIG_SENSORS_PCA9539 is not set | ||
601 | # CONFIG_SENSORS_PCF8591 is not set | ||
602 | # CONFIG_SENSORS_M41T00 is not set | ||
603 | # CONFIG_SENSORS_MAX6875 is not set | ||
604 | # CONFIG_I2C_DEBUG_CORE is not set | ||
605 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
606 | # CONFIG_I2C_DEBUG_BUS is not set | ||
607 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
608 | |||
609 | # | ||
610 | # SPI support | ||
611 | # | ||
612 | # CONFIG_SPI is not set | ||
613 | # CONFIG_SPI_MASTER is not set | ||
614 | |||
615 | # | ||
616 | # Dallas's 1-wire bus | ||
617 | # | ||
618 | # CONFIG_W1 is not set | ||
619 | |||
620 | # | ||
621 | # Hardware Monitoring support | ||
622 | # | ||
623 | # CONFIG_HWMON is not set | ||
624 | # CONFIG_HWMON_VID is not set | ||
625 | |||
626 | # | ||
627 | # Misc devices | ||
628 | # | ||
629 | |||
630 | # | ||
631 | # Multimedia devices | ||
632 | # | ||
633 | # CONFIG_VIDEO_DEV is not set | ||
634 | |||
635 | # | ||
636 | # Digital Video Broadcasting Devices | ||
637 | # | ||
638 | # CONFIG_DVB is not set | ||
639 | |||
640 | # | ||
641 | # Graphics support | ||
642 | # | ||
643 | # CONFIG_FB is not set | ||
644 | |||
645 | # | ||
646 | # Console display driver support | ||
647 | # | ||
648 | CONFIG_VGA_CONSOLE=y | ||
649 | # CONFIG_VGACON_SOFT_SCROLLBACK is not set | ||
650 | CONFIG_DUMMY_CONSOLE=y | ||
651 | |||
652 | # | ||
653 | # Sound | ||
654 | # | ||
655 | # CONFIG_SOUND is not set | ||
656 | |||
657 | # | ||
658 | # USB support | ||
659 | # | ||
660 | CONFIG_USB_ARCH_HAS_HCD=y | ||
661 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
662 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
663 | # CONFIG_USB is not set | ||
664 | |||
665 | # | ||
666 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
667 | # | ||
668 | |||
669 | # | ||
670 | # USB Gadget Support | ||
671 | # | ||
672 | # CONFIG_USB_GADGET is not set | ||
673 | |||
674 | # | ||
675 | # MMC/SD Card support | ||
676 | # | ||
677 | # CONFIG_MMC is not set | ||
678 | |||
679 | # | ||
680 | # LED devices | ||
681 | # | ||
682 | # CONFIG_NEW_LEDS is not set | ||
683 | |||
684 | # | ||
685 | # LED drivers | ||
686 | # | ||
687 | |||
688 | # | ||
689 | # LED Triggers | ||
690 | # | ||
691 | |||
692 | # | ||
693 | # InfiniBand support | ||
694 | # | ||
695 | # CONFIG_INFINIBAND is not set | ||
696 | |||
697 | # | ||
698 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
699 | # | ||
700 | |||
701 | # | ||
702 | # Real Time Clock | ||
703 | # | ||
704 | # CONFIG_RTC_CLASS is not set | ||
705 | |||
706 | # | ||
707 | # File systems | ||
708 | # | ||
709 | CONFIG_EXT2_FS=y | ||
710 | # CONFIG_EXT2_FS_XATTR is not set | ||
711 | # CONFIG_EXT2_FS_XIP is not set | ||
712 | CONFIG_EXT3_FS=y | ||
713 | CONFIG_EXT3_FS_XATTR=y | ||
714 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
715 | # CONFIG_EXT3_FS_SECURITY is not set | ||
716 | CONFIG_JBD=y | ||
717 | # CONFIG_JBD_DEBUG is not set | ||
718 | CONFIG_FS_MBCACHE=y | ||
719 | # CONFIG_REISERFS_FS is not set | ||
720 | # CONFIG_JFS_FS is not set | ||
721 | # CONFIG_FS_POSIX_ACL is not set | ||
722 | # CONFIG_XFS_FS is not set | ||
723 | # CONFIG_OCFS2_FS is not set | ||
724 | # CONFIG_MINIX_FS is not set | ||
725 | # CONFIG_ROMFS_FS is not set | ||
726 | # CONFIG_INOTIFY is not set | ||
727 | # CONFIG_QUOTA is not set | ||
728 | # CONFIG_DNOTIFY is not set | ||
729 | # CONFIG_AUTOFS_FS is not set | ||
730 | # CONFIG_AUTOFS4_FS is not set | ||
731 | # CONFIG_FUSE_FS is not set | ||
732 | |||
733 | # | ||
734 | # CD-ROM/DVD Filesystems | ||
735 | # | ||
736 | # CONFIG_ISO9660_FS is not set | ||
737 | # CONFIG_UDF_FS is not set | ||
738 | |||
739 | # | ||
740 | # DOS/FAT/NT Filesystems | ||
741 | # | ||
742 | # CONFIG_MSDOS_FS is not set | ||
743 | # CONFIG_VFAT_FS is not set | ||
744 | # CONFIG_NTFS_FS is not set | ||
745 | |||
746 | # | ||
747 | # Pseudo filesystems | ||
748 | # | ||
749 | CONFIG_PROC_FS=y | ||
750 | CONFIG_PROC_KCORE=y | ||
751 | CONFIG_SYSFS=y | ||
752 | CONFIG_TMPFS=y | ||
753 | # CONFIG_HUGETLB_PAGE is not set | ||
754 | CONFIG_RAMFS=y | ||
755 | # CONFIG_CONFIGFS_FS is not set | ||
756 | |||
757 | # | ||
758 | # Miscellaneous filesystems | ||
759 | # | ||
760 | # CONFIG_ADFS_FS is not set | ||
761 | # CONFIG_AFFS_FS is not set | ||
762 | # CONFIG_HFS_FS is not set | ||
763 | # CONFIG_HFSPLUS_FS is not set | ||
764 | # CONFIG_BEFS_FS is not set | ||
765 | # CONFIG_BFS_FS is not set | ||
766 | # CONFIG_EFS_FS is not set | ||
767 | # CONFIG_CRAMFS is not set | ||
768 | # CONFIG_VXFS_FS is not set | ||
769 | # CONFIG_HPFS_FS is not set | ||
770 | # CONFIG_QNX4FS_FS is not set | ||
771 | # CONFIG_SYSV_FS is not set | ||
772 | # CONFIG_UFS_FS is not set | ||
773 | |||
774 | # | ||
775 | # Network File Systems | ||
776 | # | ||
777 | CONFIG_NFS_FS=y | ||
778 | CONFIG_NFS_V3=y | ||
779 | # CONFIG_NFS_V3_ACL is not set | ||
780 | # CONFIG_NFS_V4 is not set | ||
781 | # CONFIG_NFS_DIRECTIO is not set | ||
782 | CONFIG_NFSD=y | ||
783 | # CONFIG_NFSD_V3 is not set | ||
784 | CONFIG_NFSD_TCP=y | ||
785 | CONFIG_ROOT_NFS=y | ||
786 | CONFIG_LOCKD=y | ||
787 | CONFIG_LOCKD_V4=y | ||
788 | CONFIG_EXPORTFS=y | ||
789 | CONFIG_NFS_COMMON=y | ||
790 | CONFIG_SUNRPC=y | ||
791 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
792 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
793 | # CONFIG_SMB_FS is not set | ||
794 | # CONFIG_CIFS is not set | ||
795 | # CONFIG_NCP_FS is not set | ||
796 | # CONFIG_CODA_FS is not set | ||
797 | # CONFIG_AFS_FS is not set | ||
798 | # CONFIG_9P_FS is not set | ||
799 | |||
800 | # | ||
801 | # Partition Types | ||
802 | # | ||
803 | CONFIG_PARTITION_ADVANCED=y | ||
804 | # CONFIG_ACORN_PARTITION is not set | ||
805 | # CONFIG_OSF_PARTITION is not set | ||
806 | # CONFIG_AMIGA_PARTITION is not set | ||
807 | # CONFIG_ATARI_PARTITION is not set | ||
808 | # CONFIG_MAC_PARTITION is not set | ||
809 | CONFIG_MSDOS_PARTITION=y | ||
810 | # CONFIG_BSD_DISKLABEL is not set | ||
811 | # CONFIG_MINIX_SUBPARTITION is not set | ||
812 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
813 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
814 | CONFIG_LDM_PARTITION=y | ||
815 | # CONFIG_LDM_DEBUG is not set | ||
816 | # CONFIG_SGI_PARTITION is not set | ||
817 | # CONFIG_ULTRIX_PARTITION is not set | ||
818 | # CONFIG_SUN_PARTITION is not set | ||
819 | # CONFIG_KARMA_PARTITION is not set | ||
820 | # CONFIG_EFI_PARTITION is not set | ||
821 | |||
822 | # | ||
823 | # Native Language Support | ||
824 | # | ||
825 | CONFIG_NLS=y | ||
826 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
827 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
828 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
829 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
830 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
831 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
832 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
833 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
834 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
835 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
836 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
837 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
838 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
839 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
840 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
841 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
842 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
843 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
844 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
845 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
846 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
847 | # CONFIG_NLS_ISO8859_8 is not set | ||
848 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
849 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
850 | # CONFIG_NLS_ASCII is not set | ||
851 | # CONFIG_NLS_ISO8859_1 is not set | ||
852 | # CONFIG_NLS_ISO8859_2 is not set | ||
853 | # CONFIG_NLS_ISO8859_3 is not set | ||
854 | # CONFIG_NLS_ISO8859_4 is not set | ||
855 | # CONFIG_NLS_ISO8859_5 is not set | ||
856 | # CONFIG_NLS_ISO8859_6 is not set | ||
857 | # CONFIG_NLS_ISO8859_7 is not set | ||
858 | # CONFIG_NLS_ISO8859_9 is not set | ||
859 | # CONFIG_NLS_ISO8859_13 is not set | ||
860 | # CONFIG_NLS_ISO8859_14 is not set | ||
861 | # CONFIG_NLS_ISO8859_15 is not set | ||
862 | # CONFIG_NLS_KOI8_R is not set | ||
863 | # CONFIG_NLS_KOI8_U is not set | ||
864 | # CONFIG_NLS_UTF8 is not set | ||
865 | |||
866 | # | ||
867 | # Library routines | ||
868 | # | ||
869 | # CONFIG_CRC_CCITT is not set | ||
870 | # CONFIG_CRC16 is not set | ||
871 | CONFIG_CRC32=y | ||
872 | # CONFIG_LIBCRC32C is not set | ||
873 | |||
874 | # | ||
875 | # Instrumentation Support | ||
876 | # | ||
877 | # CONFIG_PROFILING is not set | ||
878 | |||
879 | # | ||
880 | # Kernel hacking | ||
881 | # | ||
882 | # CONFIG_PRINTK_TIME is not set | ||
883 | # CONFIG_MAGIC_SYSRQ is not set | ||
884 | CONFIG_DEBUG_KERNEL=y | ||
885 | CONFIG_LOG_BUF_SHIFT=14 | ||
886 | CONFIG_DETECT_SOFTLOCKUP=y | ||
887 | # CONFIG_SCHEDSTATS is not set | ||
888 | # CONFIG_DEBUG_MUTEXES is not set | ||
889 | # CONFIG_DEBUG_SPINLOCK is not set | ||
890 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
891 | # CONFIG_DEBUG_KOBJECT is not set | ||
892 | # CONFIG_DEBUG_HIGHMEM is not set | ||
893 | # CONFIG_DEBUG_INFO is not set | ||
894 | # CONFIG_DEBUG_FS is not set | ||
895 | # CONFIG_DEBUG_VM is not set | ||
896 | # CONFIG_UNWIND_INFO is not set | ||
897 | CONFIG_FORCED_INLINING=y | ||
898 | # CONFIG_RCU_TORTURE_TEST is not set | ||
899 | # CONFIG_DEBUGGER is not set | ||
900 | # CONFIG_BDI_SWITCH is not set | ||
901 | # CONFIG_BOOTX_TEXT is not set | ||
902 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | ||
903 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
904 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
905 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
906 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
907 | |||
908 | # | ||
909 | # Security options | ||
910 | # | ||
911 | # CONFIG_KEYS is not set | ||
912 | # CONFIG_SECURITY is not set | ||
913 | |||
914 | # | ||
915 | # Cryptographic options | ||
916 | # | ||
917 | # CONFIG_CRYPTO is not set | ||
918 | |||
919 | # | ||
920 | # Hardware crypto devices | ||
921 | # | ||
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig index 57a027971d67..addc79381c3b 100644 --- a/arch/powerpc/configs/pmac32_defconfig +++ b/arch/powerpc/configs/pmac32_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.16-rc6 | 3 | # Linux kernel version: 2.6.17-rc5 |
4 | # Wed Mar 15 16:21:32 2006 | 4 | # Mon May 29 14:47:49 2006 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | CONFIG_PPC32=y | 7 | CONFIG_PPC32=y |
@@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y | |||
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | ||
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
13 | CONFIG_PPC=y | 14 | CONFIG_PPC=y |
14 | CONFIG_EARLY_PRINTK=y | 15 | CONFIG_EARLY_PRINTK=y |
@@ -27,11 +28,11 @@ CONFIG_CLASSIC32=y | |||
27 | # CONFIG_PPC_52xx is not set | 28 | # CONFIG_PPC_52xx is not set |
28 | # CONFIG_PPC_82xx is not set | 29 | # CONFIG_PPC_82xx is not set |
29 | # CONFIG_PPC_83xx is not set | 30 | # CONFIG_PPC_83xx is not set |
31 | # CONFIG_PPC_85xx is not set | ||
30 | # CONFIG_40x is not set | 32 | # CONFIG_40x is not set |
31 | # CONFIG_44x is not set | 33 | # CONFIG_44x is not set |
32 | # CONFIG_8xx is not set | 34 | # CONFIG_8xx is not set |
33 | # CONFIG_E200 is not set | 35 | # CONFIG_E200 is not set |
34 | # CONFIG_E500 is not set | ||
35 | CONFIG_6xx=y | 36 | CONFIG_6xx=y |
36 | CONFIG_PPC_FPU=y | 37 | CONFIG_PPC_FPU=y |
37 | CONFIG_ALTIVEC=y | 38 | CONFIG_ALTIVEC=y |
@@ -59,6 +60,7 @@ CONFIG_SYSCTL=y | |||
59 | # CONFIG_AUDIT is not set | 60 | # CONFIG_AUDIT is not set |
60 | CONFIG_IKCONFIG=y | 61 | CONFIG_IKCONFIG=y |
61 | CONFIG_IKCONFIG_PROC=y | 62 | CONFIG_IKCONFIG_PROC=y |
63 | # CONFIG_RELAY is not set | ||
62 | CONFIG_INITRAMFS_SOURCE="" | 64 | CONFIG_INITRAMFS_SOURCE="" |
63 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 65 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
64 | # CONFIG_EMBEDDED is not set | 66 | # CONFIG_EMBEDDED is not set |
@@ -73,10 +75,6 @@ CONFIG_BASE_FULL=y | |||
73 | CONFIG_FUTEX=y | 75 | CONFIG_FUTEX=y |
74 | CONFIG_EPOLL=y | 76 | CONFIG_EPOLL=y |
75 | CONFIG_SHMEM=y | 77 | CONFIG_SHMEM=y |
76 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
77 | CONFIG_CC_ALIGN_LABELS=0 | ||
78 | CONFIG_CC_ALIGN_LOOPS=0 | ||
79 | CONFIG_CC_ALIGN_JUMPS=0 | ||
80 | CONFIG_SLAB=y | 78 | CONFIG_SLAB=y |
81 | # CONFIG_TINY_SHMEM is not set | 79 | # CONFIG_TINY_SHMEM is not set |
82 | CONFIG_BASE_SMALL=0 | 80 | CONFIG_BASE_SMALL=0 |
@@ -88,7 +86,6 @@ CONFIG_BASE_SMALL=0 | |||
88 | CONFIG_MODULES=y | 86 | CONFIG_MODULES=y |
89 | CONFIG_MODULE_UNLOAD=y | 87 | CONFIG_MODULE_UNLOAD=y |
90 | CONFIG_MODULE_FORCE_UNLOAD=y | 88 | CONFIG_MODULE_FORCE_UNLOAD=y |
91 | CONFIG_OBSOLETE_MODPARM=y | ||
92 | # CONFIG_MODVERSIONS is not set | 89 | # CONFIG_MODVERSIONS is not set |
93 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 90 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
94 | CONFIG_KMOD=y | 91 | CONFIG_KMOD=y |
@@ -97,6 +94,8 @@ CONFIG_KMOD=y | |||
97 | # Block layer | 94 | # Block layer |
98 | # | 95 | # |
99 | CONFIG_LBD=y | 96 | CONFIG_LBD=y |
97 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
98 | CONFIG_LSF=y | ||
100 | 99 | ||
101 | # | 100 | # |
102 | # IO Schedulers | 101 | # IO Schedulers |
@@ -124,6 +123,7 @@ CONFIG_MPIC=y | |||
124 | # CONFIG_PPC_RTAS is not set | 123 | # CONFIG_PPC_RTAS is not set |
125 | # CONFIG_MMIO_NVRAM is not set | 124 | # CONFIG_MMIO_NVRAM is not set |
126 | CONFIG_PPC_MPC106=y | 125 | CONFIG_PPC_MPC106=y |
126 | # CONFIG_PPC_970_NAP is not set | ||
127 | CONFIG_CPU_FREQ=y | 127 | CONFIG_CPU_FREQ=y |
128 | CONFIG_CPU_FREQ_TABLE=y | 128 | CONFIG_CPU_FREQ_TABLE=y |
129 | # CONFIG_CPU_FREQ_DEBUG is not set | 129 | # CONFIG_CPU_FREQ_DEBUG is not set |
@@ -182,7 +182,6 @@ CONFIG_GENERIC_ISA_DMA=y | |||
182 | CONFIG_PPC_INDIRECT_PCI=y | 182 | CONFIG_PPC_INDIRECT_PCI=y |
183 | CONFIG_PCI=y | 183 | CONFIG_PCI=y |
184 | CONFIG_PCI_DOMAINS=y | 184 | CONFIG_PCI_DOMAINS=y |
185 | CONFIG_PCI_LEGACY_PROC=y | ||
186 | # CONFIG_PCI_DEBUG is not set | 185 | # CONFIG_PCI_DEBUG is not set |
187 | 186 | ||
188 | # | 187 | # |
@@ -239,7 +238,9 @@ CONFIG_NET=y | |||
239 | CONFIG_PACKET=y | 238 | CONFIG_PACKET=y |
240 | # CONFIG_PACKET_MMAP is not set | 239 | # CONFIG_PACKET_MMAP is not set |
241 | CONFIG_UNIX=y | 240 | CONFIG_UNIX=y |
242 | # CONFIG_NET_KEY is not set | 241 | CONFIG_XFRM=y |
242 | CONFIG_XFRM_USER=y | ||
243 | CONFIG_NET_KEY=y | ||
243 | CONFIG_INET=y | 244 | CONFIG_INET=y |
244 | CONFIG_IP_MULTICAST=y | 245 | CONFIG_IP_MULTICAST=y |
245 | # CONFIG_IP_ADVANCED_ROUTER is not set | 246 | # CONFIG_IP_ADVANCED_ROUTER is not set |
@@ -250,9 +251,10 @@ CONFIG_IP_FIB_HASH=y | |||
250 | # CONFIG_IP_MROUTE is not set | 251 | # CONFIG_IP_MROUTE is not set |
251 | # CONFIG_ARPD is not set | 252 | # CONFIG_ARPD is not set |
252 | CONFIG_SYN_COOKIES=y | 253 | CONFIG_SYN_COOKIES=y |
253 | # CONFIG_INET_AH is not set | 254 | CONFIG_INET_AH=y |
254 | # CONFIG_INET_ESP is not set | 255 | CONFIG_INET_ESP=y |
255 | # CONFIG_INET_IPCOMP is not set | 256 | # CONFIG_INET_IPCOMP is not set |
257 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
256 | # CONFIG_INET_TUNNEL is not set | 258 | # CONFIG_INET_TUNNEL is not set |
257 | CONFIG_INET_DIAG=y | 259 | CONFIG_INET_DIAG=y |
258 | CONFIG_INET_TCP_DIAG=y | 260 | CONFIG_INET_TCP_DIAG=y |
@@ -264,6 +266,8 @@ CONFIG_TCP_CONG_BIC=y | |||
264 | # | 266 | # |
265 | # CONFIG_IP_VS is not set | 267 | # CONFIG_IP_VS is not set |
266 | # CONFIG_IPV6 is not set | 268 | # CONFIG_IPV6 is not set |
269 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
270 | # CONFIG_INET6_TUNNEL is not set | ||
267 | CONFIG_NETFILTER=y | 271 | CONFIG_NETFILTER=y |
268 | # CONFIG_NETFILTER_DEBUG is not set | 272 | # CONFIG_NETFILTER_DEBUG is not set |
269 | 273 | ||
@@ -278,12 +282,15 @@ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | |||
278 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 282 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
279 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m | 283 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m |
280 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m | 284 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m |
281 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | 285 | CONFIG_NETFILTER_XT_MATCH_DCCP=m |
286 | CONFIG_NETFILTER_XT_MATCH_ESP=m | ||
282 | CONFIG_NETFILTER_XT_MATCH_HELPER=m | 287 | CONFIG_NETFILTER_XT_MATCH_HELPER=m |
283 | CONFIG_NETFILTER_XT_MATCH_LENGTH=m | 288 | CONFIG_NETFILTER_XT_MATCH_LENGTH=m |
284 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m | 289 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m |
285 | CONFIG_NETFILTER_XT_MATCH_MAC=m | 290 | CONFIG_NETFILTER_XT_MATCH_MAC=m |
286 | CONFIG_NETFILTER_XT_MATCH_MARK=m | 291 | CONFIG_NETFILTER_XT_MATCH_MARK=m |
292 | CONFIG_NETFILTER_XT_MATCH_POLICY=m | ||
293 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m | ||
287 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m | 294 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m |
288 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 295 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
289 | CONFIG_NETFILTER_XT_MATCH_SCTP=m | 296 | CONFIG_NETFILTER_XT_MATCH_SCTP=m |
@@ -305,15 +312,15 @@ CONFIG_IP_NF_NETBIOS_NS=m | |||
305 | CONFIG_IP_NF_TFTP=m | 312 | CONFIG_IP_NF_TFTP=m |
306 | CONFIG_IP_NF_AMANDA=m | 313 | CONFIG_IP_NF_AMANDA=m |
307 | CONFIG_IP_NF_PPTP=m | 314 | CONFIG_IP_NF_PPTP=m |
315 | CONFIG_IP_NF_H323=m | ||
308 | # CONFIG_IP_NF_QUEUE is not set | 316 | # CONFIG_IP_NF_QUEUE is not set |
309 | CONFIG_IP_NF_IPTABLES=m | 317 | CONFIG_IP_NF_IPTABLES=m |
310 | CONFIG_IP_NF_MATCH_IPRANGE=m | 318 | CONFIG_IP_NF_MATCH_IPRANGE=m |
311 | CONFIG_IP_NF_MATCH_MULTIPORT=m | ||
312 | CONFIG_IP_NF_MATCH_TOS=m | 319 | CONFIG_IP_NF_MATCH_TOS=m |
313 | CONFIG_IP_NF_MATCH_RECENT=m | 320 | CONFIG_IP_NF_MATCH_RECENT=m |
314 | CONFIG_IP_NF_MATCH_ECN=m | 321 | CONFIG_IP_NF_MATCH_ECN=m |
315 | CONFIG_IP_NF_MATCH_DSCP=m | 322 | CONFIG_IP_NF_MATCH_DSCP=m |
316 | CONFIG_IP_NF_MATCH_AH_ESP=m | 323 | CONFIG_IP_NF_MATCH_AH=m |
317 | CONFIG_IP_NF_MATCH_TTL=m | 324 | CONFIG_IP_NF_MATCH_TTL=m |
318 | CONFIG_IP_NF_MATCH_OWNER=m | 325 | CONFIG_IP_NF_MATCH_OWNER=m |
319 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | 326 | CONFIG_IP_NF_MATCH_ADDRTYPE=m |
@@ -335,6 +342,7 @@ CONFIG_IP_NF_NAT_FTP=m | |||
335 | CONFIG_IP_NF_NAT_TFTP=m | 342 | CONFIG_IP_NF_NAT_TFTP=m |
336 | CONFIG_IP_NF_NAT_AMANDA=m | 343 | CONFIG_IP_NF_NAT_AMANDA=m |
337 | CONFIG_IP_NF_NAT_PPTP=m | 344 | CONFIG_IP_NF_NAT_PPTP=m |
345 | CONFIG_IP_NF_NAT_H323=m | ||
338 | CONFIG_IP_NF_MANGLE=m | 346 | CONFIG_IP_NF_MANGLE=m |
339 | CONFIG_IP_NF_TARGET_TOS=m | 347 | CONFIG_IP_NF_TARGET_TOS=m |
340 | CONFIG_IP_NF_TARGET_ECN=m | 348 | CONFIG_IP_NF_TARGET_ECN=m |
@@ -350,10 +358,12 @@ CONFIG_IP_NF_ARP_MANGLE=m | |||
350 | # | 358 | # |
351 | CONFIG_IP_DCCP=m | 359 | CONFIG_IP_DCCP=m |
352 | CONFIG_INET_DCCP_DIAG=m | 360 | CONFIG_INET_DCCP_DIAG=m |
361 | CONFIG_IP_DCCP_ACKVEC=y | ||
353 | 362 | ||
354 | # | 363 | # |
355 | # DCCP CCIDs Configuration (EXPERIMENTAL) | 364 | # DCCP CCIDs Configuration (EXPERIMENTAL) |
356 | # | 365 | # |
366 | CONFIG_IP_DCCP_CCID2=m | ||
357 | CONFIG_IP_DCCP_CCID3=m | 367 | CONFIG_IP_DCCP_CCID3=m |
358 | CONFIG_IP_DCCP_TFRC_LIB=m | 368 | CONFIG_IP_DCCP_TFRC_LIB=m |
359 | 369 | ||
@@ -361,7 +371,6 @@ CONFIG_IP_DCCP_TFRC_LIB=m | |||
361 | # DCCP Kernel Hacking | 371 | # DCCP Kernel Hacking |
362 | # | 372 | # |
363 | # CONFIG_IP_DCCP_DEBUG is not set | 373 | # CONFIG_IP_DCCP_DEBUG is not set |
364 | # CONFIG_IP_DCCP_UNLOAD_HACK is not set | ||
365 | 374 | ||
366 | # | 375 | # |
367 | # SCTP Configuration (EXPERIMENTAL) | 376 | # SCTP Configuration (EXPERIMENTAL) |
@@ -477,6 +486,8 @@ CONFIG_IEEE80211=m | |||
477 | CONFIG_IEEE80211_CRYPT_WEP=m | 486 | CONFIG_IEEE80211_CRYPT_WEP=m |
478 | CONFIG_IEEE80211_CRYPT_CCMP=m | 487 | CONFIG_IEEE80211_CRYPT_CCMP=m |
479 | CONFIG_IEEE80211_CRYPT_TKIP=m | 488 | CONFIG_IEEE80211_CRYPT_TKIP=m |
489 | # CONFIG_IEEE80211_SOFTMAC is not set | ||
490 | CONFIG_WIRELESS_EXT=y | ||
480 | 491 | ||
481 | # | 492 | # |
482 | # Device Drivers | 493 | # Device Drivers |
@@ -662,9 +673,8 @@ CONFIG_SCSI_SYM53C8XX_2=y | |||
662 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 | 673 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 |
663 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | 674 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 |
664 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | 675 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 |
665 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | 676 | CONFIG_SCSI_SYM53C8XX_MMIO=y |
666 | # CONFIG_SCSI_IPR is not set | 677 | # CONFIG_SCSI_IPR is not set |
667 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
668 | # CONFIG_SCSI_QLOGIC_1280 is not set | 678 | # CONFIG_SCSI_QLOGIC_1280 is not set |
669 | # CONFIG_SCSI_QLA_FC is not set | 679 | # CONFIG_SCSI_QLA_FC is not set |
670 | # CONFIG_SCSI_LPFC is not set | 680 | # CONFIG_SCSI_LPFC is not set |
@@ -694,16 +704,17 @@ CONFIG_BLK_DEV_MD=m | |||
694 | CONFIG_MD_LINEAR=m | 704 | CONFIG_MD_LINEAR=m |
695 | CONFIG_MD_RAID0=m | 705 | CONFIG_MD_RAID0=m |
696 | CONFIG_MD_RAID1=m | 706 | CONFIG_MD_RAID1=m |
697 | # CONFIG_MD_RAID10 is not set | 707 | CONFIG_MD_RAID10=m |
698 | CONFIG_MD_RAID5=m | 708 | CONFIG_MD_RAID5=m |
709 | CONFIG_MD_RAID5_RESHAPE=y | ||
699 | CONFIG_MD_RAID6=m | 710 | CONFIG_MD_RAID6=m |
700 | CONFIG_MD_MULTIPATH=m | 711 | CONFIG_MD_MULTIPATH=m |
701 | CONFIG_MD_FAULTY=m | 712 | CONFIG_MD_FAULTY=m |
702 | CONFIG_BLK_DEV_DM=m | 713 | CONFIG_BLK_DEV_DM=m |
703 | CONFIG_DM_CRYPT=m | 714 | CONFIG_DM_CRYPT=m |
704 | # CONFIG_DM_SNAPSHOT is not set | 715 | CONFIG_DM_SNAPSHOT=m |
705 | # CONFIG_DM_MIRROR is not set | 716 | CONFIG_DM_MIRROR=m |
706 | # CONFIG_DM_ZERO is not set | 717 | CONFIG_DM_ZERO=m |
707 | # CONFIG_DM_MULTIPATH is not set | 718 | # CONFIG_DM_MULTIPATH is not set |
708 | 719 | ||
709 | # | 720 | # |
@@ -740,7 +751,7 @@ CONFIG_IEEE1394_OHCI1394=m | |||
740 | CONFIG_IEEE1394_VIDEO1394=m | 751 | CONFIG_IEEE1394_VIDEO1394=m |
741 | CONFIG_IEEE1394_SBP2=m | 752 | CONFIG_IEEE1394_SBP2=m |
742 | # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set | 753 | # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set |
743 | CONFIG_IEEE1394_ETH1394=m | 754 | # CONFIG_IEEE1394_ETH1394 is not set |
744 | CONFIG_IEEE1394_DV1394=m | 755 | CONFIG_IEEE1394_DV1394=m |
745 | CONFIG_IEEE1394_RAWIO=m | 756 | CONFIG_IEEE1394_RAWIO=m |
746 | 757 | ||
@@ -769,10 +780,10 @@ CONFIG_THERM_ADT746X=m | |||
769 | # Network device support | 780 | # Network device support |
770 | # | 781 | # |
771 | CONFIG_NETDEVICES=y | 782 | CONFIG_NETDEVICES=y |
772 | # CONFIG_DUMMY is not set | 783 | CONFIG_DUMMY=m |
773 | # CONFIG_BONDING is not set | 784 | # CONFIG_BONDING is not set |
774 | # CONFIG_EQUALIZER is not set | 785 | # CONFIG_EQUALIZER is not set |
775 | # CONFIG_TUN is not set | 786 | CONFIG_TUN=m |
776 | 787 | ||
777 | # | 788 | # |
778 | # ARCnet devices | 789 | # ARCnet devices |
@@ -857,6 +868,7 @@ CONFIG_PCNET32=y | |||
857 | # Wireless LAN (non-hamradio) | 868 | # Wireless LAN (non-hamradio) |
858 | # | 869 | # |
859 | CONFIG_NET_RADIO=y | 870 | CONFIG_NET_RADIO=y |
871 | # CONFIG_NET_WIRELESS_RTNETLINK is not set | ||
860 | 872 | ||
861 | # | 873 | # |
862 | # Obsolete Wireless cards support (pre-802.11) | 874 | # Obsolete Wireless cards support (pre-802.11) |
@@ -992,6 +1004,7 @@ CONFIG_HW_CONSOLE=y | |||
992 | # Serial drivers | 1004 | # Serial drivers |
993 | # | 1005 | # |
994 | CONFIG_SERIAL_8250=m | 1006 | CONFIG_SERIAL_8250=m |
1007 | CONFIG_SERIAL_8250_PCI=m | ||
995 | # CONFIG_SERIAL_8250_CS is not set | 1008 | # CONFIG_SERIAL_8250_CS is not set |
996 | CONFIG_SERIAL_8250_NR_UARTS=4 | 1009 | CONFIG_SERIAL_8250_NR_UARTS=4 |
997 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | 1010 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 |
@@ -1027,6 +1040,7 @@ CONFIG_GEN_RTC=y | |||
1027 | # Ftape, the floppy tape device driver | 1040 | # Ftape, the floppy tape device driver |
1028 | # | 1041 | # |
1029 | CONFIG_AGP=m | 1042 | CONFIG_AGP=m |
1043 | # CONFIG_AGP_VIA is not set | ||
1030 | CONFIG_AGP_UNINORTH=m | 1044 | CONFIG_AGP_UNINORTH=m |
1031 | CONFIG_DRM=m | 1045 | CONFIG_DRM=m |
1032 | # CONFIG_DRM_TDFX is not set | 1046 | # CONFIG_DRM_TDFX is not set |
@@ -1081,7 +1095,6 @@ CONFIG_I2C_POWERMAC=y | |||
1081 | # CONFIG_I2C_PARPORT_LIGHT is not set | 1095 | # CONFIG_I2C_PARPORT_LIGHT is not set |
1082 | # CONFIG_I2C_PROSAVAGE is not set | 1096 | # CONFIG_I2C_PROSAVAGE is not set |
1083 | # CONFIG_I2C_SAVAGE4 is not set | 1097 | # CONFIG_I2C_SAVAGE4 is not set |
1084 | # CONFIG_SCx200_ACB is not set | ||
1085 | # CONFIG_I2C_SIS5595 is not set | 1098 | # CONFIG_I2C_SIS5595 is not set |
1086 | # CONFIG_I2C_SIS630 is not set | 1099 | # CONFIG_I2C_SIS630 is not set |
1087 | # CONFIG_I2C_SIS96X is not set | 1100 | # CONFIG_I2C_SIS96X is not set |
@@ -1100,10 +1113,8 @@ CONFIG_I2C_POWERMAC=y | |||
1100 | # CONFIG_SENSORS_PCF8574 is not set | 1113 | # CONFIG_SENSORS_PCF8574 is not set |
1101 | # CONFIG_SENSORS_PCA9539 is not set | 1114 | # CONFIG_SENSORS_PCA9539 is not set |
1102 | # CONFIG_SENSORS_PCF8591 is not set | 1115 | # CONFIG_SENSORS_PCF8591 is not set |
1103 | # CONFIG_SENSORS_RTC8564 is not set | ||
1104 | # CONFIG_SENSORS_M41T00 is not set | 1116 | # CONFIG_SENSORS_M41T00 is not set |
1105 | # CONFIG_SENSORS_MAX6875 is not set | 1117 | # CONFIG_SENSORS_MAX6875 is not set |
1106 | # CONFIG_RTC_X1205_I2C is not set | ||
1107 | # CONFIG_I2C_DEBUG_CORE is not set | 1118 | # CONFIG_I2C_DEBUG_CORE is not set |
1108 | # CONFIG_I2C_DEBUG_ALGO is not set | 1119 | # CONFIG_I2C_DEBUG_ALGO is not set |
1109 | # CONFIG_I2C_DEBUG_BUS is not set | 1120 | # CONFIG_I2C_DEBUG_BUS is not set |
@@ -1131,18 +1142,16 @@ CONFIG_I2C_POWERMAC=y | |||
1131 | # | 1142 | # |
1132 | 1143 | ||
1133 | # | 1144 | # |
1134 | # Multimedia Capabilities Port drivers | ||
1135 | # | ||
1136 | |||
1137 | # | ||
1138 | # Multimedia devices | 1145 | # Multimedia devices |
1139 | # | 1146 | # |
1140 | # CONFIG_VIDEO_DEV is not set | 1147 | # CONFIG_VIDEO_DEV is not set |
1148 | CONFIG_VIDEO_V4L2=y | ||
1141 | 1149 | ||
1142 | # | 1150 | # |
1143 | # Digital Video Broadcasting Devices | 1151 | # Digital Video Broadcasting Devices |
1144 | # | 1152 | # |
1145 | # CONFIG_DVB is not set | 1153 | # CONFIG_DVB is not set |
1154 | # CONFIG_USB_DABUSB is not set | ||
1146 | 1155 | ||
1147 | # | 1156 | # |
1148 | # Graphics support | 1157 | # Graphics support |
@@ -1152,6 +1161,7 @@ CONFIG_FB_CFB_FILLRECT=y | |||
1152 | CONFIG_FB_CFB_COPYAREA=y | 1161 | CONFIG_FB_CFB_COPYAREA=y |
1153 | CONFIG_FB_CFB_IMAGEBLIT=y | 1162 | CONFIG_FB_CFB_IMAGEBLIT=y |
1154 | CONFIG_FB_MACMODES=y | 1163 | CONFIG_FB_MACMODES=y |
1164 | CONFIG_FB_FIRMWARE_EDID=y | ||
1155 | CONFIG_FB_MODE_HELPERS=y | 1165 | CONFIG_FB_MODE_HELPERS=y |
1156 | CONFIG_FB_TILEBLITTING=y | 1166 | CONFIG_FB_TILEBLITTING=y |
1157 | # CONFIG_FB_CIRRUS is not set | 1167 | # CONFIG_FB_CIRRUS is not set |
@@ -1175,7 +1185,6 @@ CONFIG_FB_MATROX_MYSTIQUE=y | |||
1175 | # CONFIG_FB_MATROX_G is not set | 1185 | # CONFIG_FB_MATROX_G is not set |
1176 | # CONFIG_FB_MATROX_I2C is not set | 1186 | # CONFIG_FB_MATROX_I2C is not set |
1177 | # CONFIG_FB_MATROX_MULTIHEAD is not set | 1187 | # CONFIG_FB_MATROX_MULTIHEAD is not set |
1178 | # CONFIG_FB_RADEON_OLD is not set | ||
1179 | CONFIG_FB_RADEON=y | 1188 | CONFIG_FB_RADEON=y |
1180 | CONFIG_FB_RADEON_I2C=y | 1189 | CONFIG_FB_RADEON_I2C=y |
1181 | # CONFIG_FB_RADEON_DEBUG is not set | 1190 | # CONFIG_FB_RADEON_DEBUG is not set |
@@ -1234,9 +1243,11 @@ CONFIG_SND_SEQ_DUMMY=m | |||
1234 | CONFIG_SND_OSSEMUL=y | 1243 | CONFIG_SND_OSSEMUL=y |
1235 | CONFIG_SND_MIXER_OSS=m | 1244 | CONFIG_SND_MIXER_OSS=m |
1236 | CONFIG_SND_PCM_OSS=m | 1245 | CONFIG_SND_PCM_OSS=m |
1246 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
1237 | CONFIG_SND_SEQUENCER_OSS=y | 1247 | CONFIG_SND_SEQUENCER_OSS=y |
1238 | # CONFIG_SND_DYNAMIC_MINORS is not set | 1248 | # CONFIG_SND_DYNAMIC_MINORS is not set |
1239 | CONFIG_SND_SUPPORT_OLD_API=y | 1249 | CONFIG_SND_SUPPORT_OLD_API=y |
1250 | CONFIG_SND_VERBOSE_PROCFS=y | ||
1240 | # CONFIG_SND_VERBOSE_PRINTK is not set | 1251 | # CONFIG_SND_VERBOSE_PRINTK is not set |
1241 | # CONFIG_SND_DEBUG is not set | 1252 | # CONFIG_SND_DEBUG is not set |
1242 | 1253 | ||
@@ -1253,6 +1264,7 @@ CONFIG_SND_DUMMY=m | |||
1253 | # PCI devices | 1264 | # PCI devices |
1254 | # | 1265 | # |
1255 | # CONFIG_SND_AD1889 is not set | 1266 | # CONFIG_SND_AD1889 is not set |
1267 | # CONFIG_SND_ALS300 is not set | ||
1256 | # CONFIG_SND_ALS4000 is not set | 1268 | # CONFIG_SND_ALS4000 is not set |
1257 | # CONFIG_SND_ALI5451 is not set | 1269 | # CONFIG_SND_ALI5451 is not set |
1258 | # CONFIG_SND_ATIIXP is not set | 1270 | # CONFIG_SND_ATIIXP is not set |
@@ -1285,6 +1297,7 @@ CONFIG_SND_DUMMY=m | |||
1285 | # CONFIG_SND_MIXART is not set | 1297 | # CONFIG_SND_MIXART is not set |
1286 | # CONFIG_SND_NM256 is not set | 1298 | # CONFIG_SND_NM256 is not set |
1287 | # CONFIG_SND_PCXHR is not set | 1299 | # CONFIG_SND_PCXHR is not set |
1300 | # CONFIG_SND_RIPTIDE is not set | ||
1288 | # CONFIG_SND_RME32 is not set | 1301 | # CONFIG_SND_RME32 is not set |
1289 | # CONFIG_SND_RME96 is not set | 1302 | # CONFIG_SND_RME96 is not set |
1290 | # CONFIG_SND_RME9652 is not set | 1303 | # CONFIG_SND_RME9652 is not set |
@@ -1310,6 +1323,8 @@ CONFIG_SND_USB_AUDIO=m | |||
1310 | # | 1323 | # |
1311 | # PCMCIA devices | 1324 | # PCMCIA devices |
1312 | # | 1325 | # |
1326 | # CONFIG_SND_VXPOCKET is not set | ||
1327 | # CONFIG_SND_PDAUDIOCF is not set | ||
1313 | 1328 | ||
1314 | # | 1329 | # |
1315 | # Open Sound System | 1330 | # Open Sound System |
@@ -1321,6 +1336,7 @@ CONFIG_SND_USB_AUDIO=m | |||
1321 | # | 1336 | # |
1322 | CONFIG_USB_ARCH_HAS_HCD=y | 1337 | CONFIG_USB_ARCH_HAS_HCD=y |
1323 | CONFIG_USB_ARCH_HAS_OHCI=y | 1338 | CONFIG_USB_ARCH_HAS_OHCI=y |
1339 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
1324 | CONFIG_USB=y | 1340 | CONFIG_USB=y |
1325 | # CONFIG_USB_DEBUG is not set | 1341 | # CONFIG_USB_DEBUG is not set |
1326 | 1342 | ||
@@ -1336,7 +1352,9 @@ CONFIG_USB_DYNAMIC_MINORS=y | |||
1336 | # | 1352 | # |
1337 | # USB Host Controller Drivers | 1353 | # USB Host Controller Drivers |
1338 | # | 1354 | # |
1339 | # CONFIG_USB_EHCI_HCD is not set | 1355 | CONFIG_USB_EHCI_HCD=m |
1356 | CONFIG_USB_EHCI_SPLIT_ISO=y | ||
1357 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
1340 | # CONFIG_USB_ISP116X_HCD is not set | 1358 | # CONFIG_USB_ISP116X_HCD is not set |
1341 | CONFIG_USB_OHCI_HCD=y | 1359 | CONFIG_USB_OHCI_HCD=y |
1342 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1360 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set |
@@ -1347,7 +1365,6 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
1347 | # | 1365 | # |
1348 | # USB Device Class drivers | 1366 | # USB Device Class drivers |
1349 | # | 1367 | # |
1350 | # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set | ||
1351 | CONFIG_USB_ACM=m | 1368 | CONFIG_USB_ACM=m |
1352 | CONFIG_USB_PRINTER=m | 1369 | CONFIG_USB_PRINTER=m |
1353 | 1370 | ||
@@ -1358,7 +1375,17 @@ CONFIG_USB_PRINTER=m | |||
1358 | # | 1375 | # |
1359 | # may also be needed; see USB_STORAGE Help for more information | 1376 | # may also be needed; see USB_STORAGE Help for more information |
1360 | # | 1377 | # |
1361 | # CONFIG_USB_STORAGE is not set | 1378 | CONFIG_USB_STORAGE=m |
1379 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
1380 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
1381 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
1382 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
1383 | # CONFIG_USB_STORAGE_DPCM is not set | ||
1384 | # CONFIG_USB_STORAGE_USBAT is not set | ||
1385 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
1386 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
1387 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
1388 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
1362 | # CONFIG_USB_LIBUSUAL is not set | 1389 | # CONFIG_USB_LIBUSUAL is not set |
1363 | 1390 | ||
1364 | # | 1391 | # |
@@ -1374,9 +1401,7 @@ CONFIG_USB_HIDINPUT_POWERBOOK=y | |||
1374 | # CONFIG_USB_ACECAD is not set | 1401 | # CONFIG_USB_ACECAD is not set |
1375 | # CONFIG_USB_KBTAB is not set | 1402 | # CONFIG_USB_KBTAB is not set |
1376 | # CONFIG_USB_POWERMATE is not set | 1403 | # CONFIG_USB_POWERMATE is not set |
1377 | # CONFIG_USB_MTOUCH is not set | 1404 | # CONFIG_USB_TOUCHSCREEN is not set |
1378 | # CONFIG_USB_ITMTOUCH is not set | ||
1379 | # CONFIG_USB_EGALAX is not set | ||
1380 | # CONFIG_USB_YEALINK is not set | 1405 | # CONFIG_USB_YEALINK is not set |
1381 | # CONFIG_USB_XPAD is not set | 1406 | # CONFIG_USB_XPAD is not set |
1382 | # CONFIG_USB_ATI_REMOTE is not set | 1407 | # CONFIG_USB_ATI_REMOTE is not set |
@@ -1391,15 +1416,6 @@ CONFIG_USB_APPLETOUCH=y | |||
1391 | # CONFIG_USB_MICROTEK is not set | 1416 | # CONFIG_USB_MICROTEK is not set |
1392 | 1417 | ||
1393 | # | 1418 | # |
1394 | # USB Multimedia devices | ||
1395 | # | ||
1396 | # CONFIG_USB_DABUSB is not set | ||
1397 | |||
1398 | # | ||
1399 | # Video4Linux support is needed for USB Multimedia device support | ||
1400 | # | ||
1401 | |||
1402 | # | ||
1403 | # USB Network Adapters | 1419 | # USB Network Adapters |
1404 | # | 1420 | # |
1405 | # CONFIG_USB_CATC is not set | 1421 | # CONFIG_USB_CATC is not set |
@@ -1429,6 +1445,7 @@ CONFIG_USB_SERIAL=m | |||
1429 | # CONFIG_USB_SERIAL_GENERIC is not set | 1445 | # CONFIG_USB_SERIAL_GENERIC is not set |
1430 | # CONFIG_USB_SERIAL_AIRPRIME is not set | 1446 | # CONFIG_USB_SERIAL_AIRPRIME is not set |
1431 | # CONFIG_USB_SERIAL_ANYDATA is not set | 1447 | # CONFIG_USB_SERIAL_ANYDATA is not set |
1448 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
1432 | # CONFIG_USB_SERIAL_BELKIN is not set | 1449 | # CONFIG_USB_SERIAL_BELKIN is not set |
1433 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | 1450 | # CONFIG_USB_SERIAL_WHITEHEAT is not set |
1434 | # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set | 1451 | # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set |
@@ -1436,6 +1453,7 @@ CONFIG_USB_SERIAL=m | |||
1436 | # CONFIG_USB_SERIAL_CYPRESS_M8 is not set | 1453 | # CONFIG_USB_SERIAL_CYPRESS_M8 is not set |
1437 | # CONFIG_USB_SERIAL_EMPEG is not set | 1454 | # CONFIG_USB_SERIAL_EMPEG is not set |
1438 | # CONFIG_USB_SERIAL_FTDI_SIO is not set | 1455 | # CONFIG_USB_SERIAL_FTDI_SIO is not set |
1456 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
1439 | CONFIG_USB_SERIAL_VISOR=m | 1457 | CONFIG_USB_SERIAL_VISOR=m |
1440 | CONFIG_USB_SERIAL_IPAQ=m | 1458 | CONFIG_USB_SERIAL_IPAQ=m |
1441 | # CONFIG_USB_SERIAL_IR is not set | 1459 | # CONFIG_USB_SERIAL_IR is not set |
@@ -1460,6 +1478,7 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y | |||
1460 | # CONFIG_USB_SERIAL_KLSI is not set | 1478 | # CONFIG_USB_SERIAL_KLSI is not set |
1461 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set | 1479 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set |
1462 | # CONFIG_USB_SERIAL_MCT_U232 is not set | 1480 | # CONFIG_USB_SERIAL_MCT_U232 is not set |
1481 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
1463 | # CONFIG_USB_SERIAL_PL2303 is not set | 1482 | # CONFIG_USB_SERIAL_PL2303 is not set |
1464 | # CONFIG_USB_SERIAL_HP4X is not set | 1483 | # CONFIG_USB_SERIAL_HP4X is not set |
1465 | # CONFIG_USB_SERIAL_SAFE is not set | 1484 | # CONFIG_USB_SERIAL_SAFE is not set |
@@ -1484,6 +1503,7 @@ CONFIG_USB_EZUSB=y | |||
1484 | # CONFIG_USB_PHIDGETKIT is not set | 1503 | # CONFIG_USB_PHIDGETKIT is not set |
1485 | # CONFIG_USB_PHIDGETSERVO is not set | 1504 | # CONFIG_USB_PHIDGETSERVO is not set |
1486 | # CONFIG_USB_IDMOUSE is not set | 1505 | # CONFIG_USB_IDMOUSE is not set |
1506 | # CONFIG_USB_SISUSBVGA is not set | ||
1487 | # CONFIG_USB_LD is not set | 1507 | # CONFIG_USB_LD is not set |
1488 | # CONFIG_USB_TEST is not set | 1508 | # CONFIG_USB_TEST is not set |
1489 | 1509 | ||
@@ -1502,6 +1522,19 @@ CONFIG_USB_EZUSB=y | |||
1502 | # CONFIG_MMC is not set | 1522 | # CONFIG_MMC is not set |
1503 | 1523 | ||
1504 | # | 1524 | # |
1525 | # LED devices | ||
1526 | # | ||
1527 | # CONFIG_NEW_LEDS is not set | ||
1528 | |||
1529 | # | ||
1530 | # LED drivers | ||
1531 | # | ||
1532 | |||
1533 | # | ||
1534 | # LED Triggers | ||
1535 | # | ||
1536 | |||
1537 | # | ||
1505 | # InfiniBand support | 1538 | # InfiniBand support |
1506 | # | 1539 | # |
1507 | # CONFIG_INFINIBAND is not set | 1540 | # CONFIG_INFINIBAND is not set |
@@ -1511,6 +1544,11 @@ CONFIG_USB_EZUSB=y | |||
1511 | # | 1544 | # |
1512 | 1545 | ||
1513 | # | 1546 | # |
1547 | # Real Time Clock | ||
1548 | # | ||
1549 | # CONFIG_RTC_CLASS is not set | ||
1550 | |||
1551 | # | ||
1514 | # File systems | 1552 | # File systems |
1515 | # | 1553 | # |
1516 | CONFIG_EXT2_FS=y | 1554 | CONFIG_EXT2_FS=y |
@@ -1518,14 +1556,14 @@ CONFIG_EXT2_FS=y | |||
1518 | # CONFIG_EXT2_FS_XIP is not set | 1556 | # CONFIG_EXT2_FS_XIP is not set |
1519 | CONFIG_EXT3_FS=y | 1557 | CONFIG_EXT3_FS=y |
1520 | CONFIG_EXT3_FS_XATTR=y | 1558 | CONFIG_EXT3_FS_XATTR=y |
1521 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 1559 | CONFIG_EXT3_FS_POSIX_ACL=y |
1522 | # CONFIG_EXT3_FS_SECURITY is not set | 1560 | # CONFIG_EXT3_FS_SECURITY is not set |
1523 | CONFIG_JBD=y | 1561 | CONFIG_JBD=y |
1524 | # CONFIG_JBD_DEBUG is not set | 1562 | # CONFIG_JBD_DEBUG is not set |
1525 | CONFIG_FS_MBCACHE=y | 1563 | CONFIG_FS_MBCACHE=y |
1526 | # CONFIG_REISERFS_FS is not set | 1564 | # CONFIG_REISERFS_FS is not set |
1527 | # CONFIG_JFS_FS is not set | 1565 | # CONFIG_JFS_FS is not set |
1528 | # CONFIG_FS_POSIX_ACL is not set | 1566 | CONFIG_FS_POSIX_ACL=y |
1529 | # CONFIG_XFS_FS is not set | 1567 | # CONFIG_XFS_FS is not set |
1530 | # CONFIG_OCFS2_FS is not set | 1568 | # CONFIG_OCFS2_FS is not set |
1531 | # CONFIG_MINIX_FS is not set | 1569 | # CONFIG_MINIX_FS is not set |
@@ -1534,7 +1572,7 @@ CONFIG_INOTIFY=y | |||
1534 | # CONFIG_QUOTA is not set | 1572 | # CONFIG_QUOTA is not set |
1535 | CONFIG_DNOTIFY=y | 1573 | CONFIG_DNOTIFY=y |
1536 | # CONFIG_AUTOFS_FS is not set | 1574 | # CONFIG_AUTOFS_FS is not set |
1537 | # CONFIG_AUTOFS4_FS is not set | 1575 | CONFIG_AUTOFS4_FS=m |
1538 | CONFIG_FUSE_FS=m | 1576 | CONFIG_FUSE_FS=m |
1539 | 1577 | ||
1540 | # | 1578 | # |
@@ -1566,7 +1604,6 @@ CONFIG_SYSFS=y | |||
1566 | CONFIG_TMPFS=y | 1604 | CONFIG_TMPFS=y |
1567 | # CONFIG_HUGETLB_PAGE is not set | 1605 | # CONFIG_HUGETLB_PAGE is not set |
1568 | CONFIG_RAMFS=y | 1606 | CONFIG_RAMFS=y |
1569 | CONFIG_RELAYFS_FS=m | ||
1570 | # CONFIG_CONFIGFS_FS is not set | 1607 | # CONFIG_CONFIGFS_FS is not set |
1571 | 1608 | ||
1572 | # | 1609 | # |
@@ -1590,17 +1627,24 @@ CONFIG_HFSPLUS_FS=m | |||
1590 | # Network File Systems | 1627 | # Network File Systems |
1591 | # | 1628 | # |
1592 | CONFIG_NFS_FS=y | 1629 | CONFIG_NFS_FS=y |
1593 | # CONFIG_NFS_V3 is not set | 1630 | CONFIG_NFS_V3=y |
1594 | # CONFIG_NFS_V4 is not set | 1631 | CONFIG_NFS_V3_ACL=y |
1632 | CONFIG_NFS_V4=y | ||
1595 | # CONFIG_NFS_DIRECTIO is not set | 1633 | # CONFIG_NFS_DIRECTIO is not set |
1596 | CONFIG_NFSD=y | 1634 | CONFIG_NFSD=m |
1597 | # CONFIG_NFSD_V3 is not set | 1635 | CONFIG_NFSD_V2_ACL=y |
1598 | # CONFIG_NFSD_TCP is not set | 1636 | CONFIG_NFSD_V3=y |
1637 | CONFIG_NFSD_V3_ACL=y | ||
1638 | CONFIG_NFSD_V4=y | ||
1639 | CONFIG_NFSD_TCP=y | ||
1599 | CONFIG_LOCKD=y | 1640 | CONFIG_LOCKD=y |
1600 | CONFIG_EXPORTFS=y | 1641 | CONFIG_LOCKD_V4=y |
1642 | CONFIG_EXPORTFS=m | ||
1643 | CONFIG_NFS_ACL_SUPPORT=y | ||
1601 | CONFIG_NFS_COMMON=y | 1644 | CONFIG_NFS_COMMON=y |
1602 | CONFIG_SUNRPC=y | 1645 | CONFIG_SUNRPC=y |
1603 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 1646 | CONFIG_SUNRPC_GSS=y |
1647 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1604 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1648 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1605 | CONFIG_SMB_FS=m | 1649 | CONFIG_SMB_FS=m |
1606 | # CONFIG_SMB_NLS_DEFAULT is not set | 1650 | # CONFIG_SMB_NLS_DEFAULT is not set |
@@ -1681,7 +1725,7 @@ CONFIG_NLS_UTF8=m | |||
1681 | CONFIG_CRC_CCITT=y | 1725 | CONFIG_CRC_CCITT=y |
1682 | CONFIG_CRC16=y | 1726 | CONFIG_CRC16=y |
1683 | CONFIG_CRC32=y | 1727 | CONFIG_CRC32=y |
1684 | # CONFIG_LIBCRC32C is not set | 1728 | CONFIG_LIBCRC32C=m |
1685 | CONFIG_ZLIB_INFLATE=y | 1729 | CONFIG_ZLIB_INFLATE=y |
1686 | CONFIG_ZLIB_DEFLATE=y | 1730 | CONFIG_ZLIB_DEFLATE=y |
1687 | CONFIG_TEXTSEARCH=y | 1731 | CONFIG_TEXTSEARCH=y |
@@ -1735,29 +1779,29 @@ CONFIG_BOOTX_TEXT=y | |||
1735 | # Cryptographic options | 1779 | # Cryptographic options |
1736 | # | 1780 | # |
1737 | CONFIG_CRYPTO=y | 1781 | CONFIG_CRYPTO=y |
1738 | # CONFIG_CRYPTO_HMAC is not set | 1782 | CONFIG_CRYPTO_HMAC=y |
1739 | # CONFIG_CRYPTO_NULL is not set | 1783 | CONFIG_CRYPTO_NULL=m |
1740 | # CONFIG_CRYPTO_MD4 is not set | 1784 | CONFIG_CRYPTO_MD4=m |
1741 | # CONFIG_CRYPTO_MD5 is not set | 1785 | CONFIG_CRYPTO_MD5=y |
1742 | # CONFIG_CRYPTO_SHA1 is not set | 1786 | CONFIG_CRYPTO_SHA1=y |
1743 | # CONFIG_CRYPTO_SHA256 is not set | 1787 | CONFIG_CRYPTO_SHA256=m |
1744 | # CONFIG_CRYPTO_SHA512 is not set | 1788 | CONFIG_CRYPTO_SHA512=m |
1745 | # CONFIG_CRYPTO_WP512 is not set | 1789 | CONFIG_CRYPTO_WP512=m |
1746 | # CONFIG_CRYPTO_TGR192 is not set | 1790 | CONFIG_CRYPTO_TGR192=m |
1747 | # CONFIG_CRYPTO_DES is not set | 1791 | CONFIG_CRYPTO_DES=y |
1748 | # CONFIG_CRYPTO_BLOWFISH is not set | 1792 | CONFIG_CRYPTO_BLOWFISH=m |
1749 | # CONFIG_CRYPTO_TWOFISH is not set | 1793 | CONFIG_CRYPTO_TWOFISH=m |
1750 | # CONFIG_CRYPTO_SERPENT is not set | 1794 | CONFIG_CRYPTO_SERPENT=m |
1751 | CONFIG_CRYPTO_AES=m | 1795 | CONFIG_CRYPTO_AES=m |
1752 | # CONFIG_CRYPTO_CAST5 is not set | 1796 | CONFIG_CRYPTO_CAST5=m |
1753 | # CONFIG_CRYPTO_CAST6 is not set | 1797 | CONFIG_CRYPTO_CAST6=m |
1754 | # CONFIG_CRYPTO_TEA is not set | 1798 | CONFIG_CRYPTO_TEA=m |
1755 | CONFIG_CRYPTO_ARC4=m | 1799 | CONFIG_CRYPTO_ARC4=m |
1756 | # CONFIG_CRYPTO_KHAZAD is not set | 1800 | CONFIG_CRYPTO_KHAZAD=m |
1757 | # CONFIG_CRYPTO_ANUBIS is not set | 1801 | CONFIG_CRYPTO_ANUBIS=m |
1758 | # CONFIG_CRYPTO_DEFLATE is not set | 1802 | CONFIG_CRYPTO_DEFLATE=m |
1759 | CONFIG_CRYPTO_MICHAEL_MIC=m | 1803 | CONFIG_CRYPTO_MICHAEL_MIC=m |
1760 | # CONFIG_CRYPTO_CRC32C is not set | 1804 | CONFIG_CRYPTO_CRC32C=m |
1761 | # CONFIG_CRYPTO_TEST is not set | 1805 | # CONFIG_CRYPTO_TEST is not set |
1762 | 1806 | ||
1763 | # | 1807 | # |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 58e68ce09b0f..31708ad4574e 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc1 | 3 | # Linux kernel version: 2.6.17-rc4 |
4 | # Wed Apr 19 11:48:00 2006 | 4 | # Sun May 28 07:26:56 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -11,6 +11,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
14 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_PPC=y | 15 | CONFIG_PPC=y |
15 | CONFIG_EARLY_PRINTK=y | 16 | CONFIG_EARLY_PRINTK=y |
16 | CONFIG_COMPAT=y | 17 | CONFIG_COMPAT=y |
@@ -126,8 +127,9 @@ CONFIG_RTAS_PROC=y | |||
126 | CONFIG_RTAS_FLASH=m | 127 | CONFIG_RTAS_FLASH=m |
127 | # CONFIG_MMIO_NVRAM is not set | 128 | # CONFIG_MMIO_NVRAM is not set |
128 | CONFIG_IBMVIO=y | 129 | CONFIG_IBMVIO=y |
129 | # CONFIG_IBMEBUS is not set | 130 | CONFIG_IBMEBUS=y |
130 | # CONFIG_PPC_MPC106 is not set | 131 | # CONFIG_PPC_MPC106 is not set |
132 | # CONFIG_PPC_970_NAP is not set | ||
131 | # CONFIG_CPU_FREQ is not set | 133 | # CONFIG_CPU_FREQ is not set |
132 | # CONFIG_WANT_EARLY_SERIAL is not set | 134 | # CONFIG_WANT_EARLY_SERIAL is not set |
133 | 135 | ||
@@ -143,7 +145,7 @@ CONFIG_PREEMPT_NONE=y | |||
143 | # CONFIG_PREEMPT is not set | 145 | # CONFIG_PREEMPT is not set |
144 | # CONFIG_PREEMPT_BKL is not set | 146 | # CONFIG_PREEMPT_BKL is not set |
145 | CONFIG_BINFMT_ELF=y | 147 | CONFIG_BINFMT_ELF=y |
146 | # CONFIG_BINFMT_MISC is not set | 148 | CONFIG_BINFMT_MISC=m |
147 | CONFIG_FORCE_MAX_ZONEORDER=13 | 149 | CONFIG_FORCE_MAX_ZONEORDER=13 |
148 | CONFIG_IOMMU_VMERGE=y | 150 | CONFIG_IOMMU_VMERGE=y |
149 | CONFIG_HOTPLUG_CPU=y | 151 | CONFIG_HOTPLUG_CPU=y |
@@ -155,6 +157,7 @@ CONFIG_EEH=y | |||
155 | CONFIG_SCANLOG=m | 157 | CONFIG_SCANLOG=m |
156 | CONFIG_LPARCFG=y | 158 | CONFIG_LPARCFG=y |
157 | CONFIG_NUMA=y | 159 | CONFIG_NUMA=y |
160 | CONFIG_NODES_SHIFT=4 | ||
158 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 161 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
159 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 162 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
160 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | 163 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y |
@@ -467,7 +470,7 @@ CONFIG_SCSI_CONSTANTS=y | |||
467 | CONFIG_SCSI_SPI_ATTRS=y | 470 | CONFIG_SCSI_SPI_ATTRS=y |
468 | CONFIG_SCSI_FC_ATTRS=y | 471 | CONFIG_SCSI_FC_ATTRS=y |
469 | CONFIG_SCSI_ISCSI_ATTRS=m | 472 | CONFIG_SCSI_ISCSI_ATTRS=m |
470 | # CONFIG_SCSI_SAS_ATTRS is not set | 473 | CONFIG_SCSI_SAS_ATTRS=m |
471 | 474 | ||
472 | # | 475 | # |
473 | # SCSI low-level drivers | 476 | # SCSI low-level drivers |
@@ -499,13 +502,18 @@ CONFIG_SCSI_SYM53C8XX_2=y | |||
499 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 | 502 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 |
500 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | 503 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 |
501 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | 504 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 |
502 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | 505 | CONFIG_SCSI_SYM53C8XX_MMIO=y |
503 | CONFIG_SCSI_IPR=y | 506 | CONFIG_SCSI_IPR=y |
504 | CONFIG_SCSI_IPR_TRACE=y | 507 | CONFIG_SCSI_IPR_TRACE=y |
505 | CONFIG_SCSI_IPR_DUMP=y | 508 | CONFIG_SCSI_IPR_DUMP=y |
506 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
507 | # CONFIG_SCSI_QLOGIC_1280 is not set | 509 | # CONFIG_SCSI_QLOGIC_1280 is not set |
508 | # CONFIG_SCSI_QLA_FC is not set | 510 | CONFIG_SCSI_QLA_FC=m |
511 | CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE=y | ||
512 | CONFIG_SCSI_QLA21XX=m | ||
513 | CONFIG_SCSI_QLA22XX=m | ||
514 | CONFIG_SCSI_QLA2300=m | ||
515 | CONFIG_SCSI_QLA2322=m | ||
516 | CONFIG_SCSI_QLA24XX=m | ||
509 | CONFIG_SCSI_LPFC=m | 517 | CONFIG_SCSI_LPFC=m |
510 | # CONFIG_SCSI_DC395x is not set | 518 | # CONFIG_SCSI_DC395x is not set |
511 | # CONFIG_SCSI_DC390T is not set | 519 | # CONFIG_SCSI_DC390T is not set |
@@ -521,7 +529,7 @@ CONFIG_MD_RAID0=y | |||
521 | CONFIG_MD_RAID1=y | 529 | CONFIG_MD_RAID1=y |
522 | CONFIG_MD_RAID10=m | 530 | CONFIG_MD_RAID10=m |
523 | CONFIG_MD_RAID5=y | 531 | CONFIG_MD_RAID5=y |
524 | # CONFIG_MD_RAID5_RESHAPE is not set | 532 | CONFIG_MD_RAID5_RESHAPE=y |
525 | CONFIG_MD_RAID6=m | 533 | CONFIG_MD_RAID6=m |
526 | CONFIG_MD_MULTIPATH=m | 534 | CONFIG_MD_MULTIPATH=m |
527 | CONFIG_MD_FAULTY=m | 535 | CONFIG_MD_FAULTY=m |
@@ -764,7 +772,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | |||
764 | CONFIG_SERIAL_CORE=y | 772 | CONFIG_SERIAL_CORE=y |
765 | CONFIG_SERIAL_CORE_CONSOLE=y | 773 | CONFIG_SERIAL_CORE_CONSOLE=y |
766 | CONFIG_SERIAL_ICOM=m | 774 | CONFIG_SERIAL_ICOM=m |
767 | # CONFIG_SERIAL_JSM is not set | 775 | CONFIG_SERIAL_JSM=m |
768 | CONFIG_UNIX98_PTYS=y | 776 | CONFIG_UNIX98_PTYS=y |
769 | CONFIG_LEGACY_PTYS=y | 777 | CONFIG_LEGACY_PTYS=y |
770 | CONFIG_LEGACY_PTY_COUNT=256 | 778 | CONFIG_LEGACY_PTY_COUNT=256 |
@@ -773,7 +781,7 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
773 | # CONFIG_TIPAR is not set | 781 | # CONFIG_TIPAR is not set |
774 | CONFIG_HVC_DRIVER=y | 782 | CONFIG_HVC_DRIVER=y |
775 | CONFIG_HVC_CONSOLE=y | 783 | CONFIG_HVC_CONSOLE=y |
776 | # CONFIG_HVC_RTAS is not set | 784 | CONFIG_HVC_RTAS=y |
777 | CONFIG_HVCS=m | 785 | CONFIG_HVCS=m |
778 | 786 | ||
779 | # | 787 | # |
@@ -1031,9 +1039,7 @@ CONFIG_USB_HIDDEV=y | |||
1031 | # CONFIG_USB_ACECAD is not set | 1039 | # CONFIG_USB_ACECAD is not set |
1032 | # CONFIG_USB_KBTAB is not set | 1040 | # CONFIG_USB_KBTAB is not set |
1033 | # CONFIG_USB_POWERMATE is not set | 1041 | # CONFIG_USB_POWERMATE is not set |
1034 | # CONFIG_USB_MTOUCH is not set | 1042 | # CONFIG_USB_TOUCHSCREEN is not set |
1035 | # CONFIG_USB_ITMTOUCH is not set | ||
1036 | # CONFIG_USB_EGALAX is not set | ||
1037 | # CONFIG_USB_YEALINK is not set | 1043 | # CONFIG_USB_YEALINK is not set |
1038 | # CONFIG_USB_XPAD is not set | 1044 | # CONFIG_USB_XPAD is not set |
1039 | # CONFIG_USB_ATI_REMOTE is not set | 1045 | # CONFIG_USB_ATI_REMOTE is not set |
@@ -1105,16 +1111,25 @@ CONFIG_USB_MON=y | |||
1105 | # CONFIG_NEW_LEDS is not set | 1111 | # CONFIG_NEW_LEDS is not set |
1106 | 1112 | ||
1107 | # | 1113 | # |
1114 | # LED drivers | ||
1115 | # | ||
1116 | |||
1117 | # | ||
1118 | # LED Triggers | ||
1119 | # | ||
1120 | |||
1121 | # | ||
1108 | # InfiniBand support | 1122 | # InfiniBand support |
1109 | # | 1123 | # |
1110 | CONFIG_INFINIBAND=m | 1124 | CONFIG_INFINIBAND=m |
1111 | # CONFIG_INFINIBAND_USER_MAD is not set | 1125 | CONFIG_INFINIBAND_USER_MAD=m |
1112 | # CONFIG_INFINIBAND_USER_ACCESS is not set | 1126 | CONFIG_INFINIBAND_USER_ACCESS=m |
1113 | CONFIG_INFINIBAND_MTHCA=m | 1127 | CONFIG_INFINIBAND_MTHCA=m |
1114 | # CONFIG_INFINIBAND_MTHCA_DEBUG is not set | 1128 | CONFIG_INFINIBAND_MTHCA_DEBUG=y |
1115 | CONFIG_INFINIBAND_IPOIB=m | 1129 | CONFIG_INFINIBAND_IPOIB=m |
1116 | # CONFIG_INFINIBAND_IPOIB_DEBUG is not set | 1130 | CONFIG_INFINIBAND_IPOIB_DEBUG=y |
1117 | # CONFIG_INFINIBAND_SRP is not set | 1131 | # CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set |
1132 | CONFIG_INFINIBAND_SRP=m | ||
1118 | 1133 | ||
1119 | # | 1134 | # |
1120 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | 1135 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) |
@@ -1159,15 +1174,15 @@ CONFIG_XFS_EXPORT=y | |||
1159 | CONFIG_XFS_SECURITY=y | 1174 | CONFIG_XFS_SECURITY=y |
1160 | CONFIG_XFS_POSIX_ACL=y | 1175 | CONFIG_XFS_POSIX_ACL=y |
1161 | # CONFIG_XFS_RT is not set | 1176 | # CONFIG_XFS_RT is not set |
1162 | # CONFIG_OCFS2_FS is not set | 1177 | CONFIG_OCFS2_FS=m |
1163 | # CONFIG_MINIX_FS is not set | 1178 | # CONFIG_MINIX_FS is not set |
1164 | # CONFIG_ROMFS_FS is not set | 1179 | # CONFIG_ROMFS_FS is not set |
1165 | CONFIG_INOTIFY=y | 1180 | CONFIG_INOTIFY=y |
1166 | # CONFIG_QUOTA is not set | 1181 | # CONFIG_QUOTA is not set |
1167 | CONFIG_DNOTIFY=y | 1182 | CONFIG_DNOTIFY=y |
1168 | CONFIG_AUTOFS_FS=m | 1183 | # CONFIG_AUTOFS_FS is not set |
1169 | # CONFIG_AUTOFS4_FS is not set | 1184 | CONFIG_AUTOFS4_FS=m |
1170 | # CONFIG_FUSE_FS is not set | 1185 | CONFIG_FUSE_FS=m |
1171 | 1186 | ||
1172 | # | 1187 | # |
1173 | # CD-ROM/DVD Filesystems | 1188 | # CD-ROM/DVD Filesystems |
@@ -1199,7 +1214,7 @@ CONFIG_TMPFS=y | |||
1199 | CONFIG_HUGETLBFS=y | 1214 | CONFIG_HUGETLBFS=y |
1200 | CONFIG_HUGETLB_PAGE=y | 1215 | CONFIG_HUGETLB_PAGE=y |
1201 | CONFIG_RAMFS=y | 1216 | CONFIG_RAMFS=y |
1202 | # CONFIG_CONFIGFS_FS is not set | 1217 | CONFIG_CONFIGFS_FS=m |
1203 | 1218 | ||
1204 | # | 1219 | # |
1205 | # Miscellaneous filesystems | 1220 | # Miscellaneous filesystems |
@@ -1317,7 +1332,7 @@ CONFIG_ZLIB_DEFLATE=m | |||
1317 | # | 1332 | # |
1318 | CONFIG_PROFILING=y | 1333 | CONFIG_PROFILING=y |
1319 | CONFIG_OPROFILE=y | 1334 | CONFIG_OPROFILE=y |
1320 | # CONFIG_KPROBES is not set | 1335 | CONFIG_KPROBES=y |
1321 | 1336 | ||
1322 | # | 1337 | # |
1323 | # Kernel hacking | 1338 | # Kernel hacking |
@@ -1329,7 +1344,7 @@ CONFIG_LOG_BUF_SHIFT=17 | |||
1329 | CONFIG_DETECT_SOFTLOCKUP=y | 1344 | CONFIG_DETECT_SOFTLOCKUP=y |
1330 | # CONFIG_SCHEDSTATS is not set | 1345 | # CONFIG_SCHEDSTATS is not set |
1331 | # CONFIG_DEBUG_SLAB is not set | 1346 | # CONFIG_DEBUG_SLAB is not set |
1332 | CONFIG_DEBUG_MUTEXES=y | 1347 | # CONFIG_DEBUG_MUTEXES is not set |
1333 | # CONFIG_DEBUG_SPINLOCK is not set | 1348 | # CONFIG_DEBUG_SPINLOCK is not set |
1334 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1349 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1335 | # CONFIG_DEBUG_KOBJECT is not set | 1350 | # CONFIG_DEBUG_KOBJECT is not set |
@@ -1339,17 +1354,13 @@ CONFIG_DEBUG_FS=y | |||
1339 | CONFIG_FORCED_INLINING=y | 1354 | CONFIG_FORCED_INLINING=y |
1340 | # CONFIG_RCU_TORTURE_TEST is not set | 1355 | # CONFIG_RCU_TORTURE_TEST is not set |
1341 | CONFIG_DEBUG_STACKOVERFLOW=y | 1356 | CONFIG_DEBUG_STACKOVERFLOW=y |
1342 | CONFIG_DEBUG_STACK_USAGE=y | 1357 | # CONFIG_DEBUG_STACK_USAGE is not set |
1343 | CONFIG_DEBUGGER=y | 1358 | CONFIG_DEBUGGER=y |
1344 | CONFIG_XMON=y | 1359 | CONFIG_XMON=y |
1345 | CONFIG_XMON_DEFAULT=y | 1360 | CONFIG_XMON_DEFAULT=y |
1346 | CONFIG_IRQSTACKS=y | 1361 | CONFIG_IRQSTACKS=y |
1347 | # CONFIG_BOOTX_TEXT is not set | 1362 | # CONFIG_BOOTX_TEXT is not set |
1348 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | 1363 | # CONFIG_PPC_EARLY_DEBUG is not set |
1349 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
1350 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
1351 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
1352 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
1353 | 1364 | ||
1354 | # | 1365 | # |
1355 | # Security options | 1366 | # Security options |
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index faaec9c6f78f..4734b5de599d 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
@@ -35,17 +35,19 @@ struct aligninfo { | |||
35 | 35 | ||
36 | #define INVALID { 0, 0 } | 36 | #define INVALID { 0, 0 } |
37 | 37 | ||
38 | #define LD 1 /* load */ | 38 | /* Bits in the flags field */ |
39 | #define ST 2 /* store */ | 39 | #define LD 0 /* load */ |
40 | #define SE 4 /* sign-extend value */ | 40 | #define ST 1 /* store */ |
41 | #define F 8 /* to/from fp regs */ | 41 | #define SE 2 /* sign-extend value */ |
42 | #define U 0x10 /* update index register */ | 42 | #define F 4 /* to/from fp regs */ |
43 | #define M 0x20 /* multiple load/store */ | 43 | #define U 8 /* update index register */ |
44 | #define SW 0x40 /* byte swap int or ... */ | 44 | #define M 0x10 /* multiple load/store */ |
45 | #define S 0x40 /* ... single-precision fp */ | 45 | #define SW 0x20 /* byte swap */ |
46 | #define SX 0x40 /* byte count in XER */ | 46 | #define S 0x40 /* single-precision fp or... */ |
47 | #define SX 0x40 /* ... byte count in XER */ | ||
47 | #define HARD 0x80 /* string, stwcx. */ | 48 | #define HARD 0x80 /* string, stwcx. */ |
48 | 49 | ||
50 | /* DSISR bits reported for a DCBZ instruction: */ | ||
49 | #define DCBZ 0x5f /* 8xx/82xx dcbz faults when cache not enabled */ | 51 | #define DCBZ 0x5f /* 8xx/82xx dcbz faults when cache not enabled */ |
50 | 52 | ||
51 | #define SWAP(a, b) (t = (a), (a) = (b), (b) = t) | 53 | #define SWAP(a, b) (t = (a), (a) = (b), (b) = t) |
@@ -256,12 +258,16 @@ static int emulate_dcbz(struct pt_regs *regs, unsigned char __user *addr) | |||
256 | #define REG_BYTE(rp, i) *((u8 *)(rp) + (i)) | 258 | #define REG_BYTE(rp, i) *((u8 *)(rp) + (i)) |
257 | #endif | 259 | #endif |
258 | 260 | ||
261 | #define SWIZ_PTR(p) ((unsigned char __user *)((p) ^ swiz)) | ||
262 | |||
259 | static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, | 263 | static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, |
260 | unsigned int reg, unsigned int nb, | 264 | unsigned int reg, unsigned int nb, |
261 | unsigned int flags, unsigned int instr) | 265 | unsigned int flags, unsigned int instr, |
266 | unsigned long swiz) | ||
262 | { | 267 | { |
263 | unsigned long *rptr; | 268 | unsigned long *rptr; |
264 | unsigned int nb0, i; | 269 | unsigned int nb0, i, bswiz; |
270 | unsigned long p; | ||
265 | 271 | ||
266 | /* | 272 | /* |
267 | * We do not try to emulate 8 bytes multiple as they aren't really | 273 | * We do not try to emulate 8 bytes multiple as they aren't really |
@@ -280,9 +286,12 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, | |||
280 | if (nb == 0) | 286 | if (nb == 0) |
281 | return 1; | 287 | return 1; |
282 | } else { | 288 | } else { |
283 | if (__get_user(instr, | 289 | unsigned long pc = regs->nip ^ (swiz & 4); |
284 | (unsigned int __user *)regs->nip)) | 290 | |
291 | if (__get_user(instr, (unsigned int __user *)pc)) | ||
285 | return -EFAULT; | 292 | return -EFAULT; |
293 | if (swiz == 0 && (flags & SW)) | ||
294 | instr = cpu_to_le32(instr); | ||
286 | nb = (instr >> 11) & 0x1f; | 295 | nb = (instr >> 11) & 0x1f; |
287 | if (nb == 0) | 296 | if (nb == 0) |
288 | nb = 32; | 297 | nb = 32; |
@@ -300,7 +309,10 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, | |||
300 | return -EFAULT; /* bad address */ | 309 | return -EFAULT; /* bad address */ |
301 | 310 | ||
302 | rptr = ®s->gpr[reg]; | 311 | rptr = ®s->gpr[reg]; |
303 | if (flags & LD) { | 312 | p = (unsigned long) addr; |
313 | bswiz = (flags & SW)? 3: 0; | ||
314 | |||
315 | if (!(flags & ST)) { | ||
304 | /* | 316 | /* |
305 | * This zeroes the top 4 bytes of the affected registers | 317 | * This zeroes the top 4 bytes of the affected registers |
306 | * in 64-bit mode, and also zeroes out any remaining | 318 | * in 64-bit mode, and also zeroes out any remaining |
@@ -311,26 +323,28 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, | |||
311 | memset(®s->gpr[0], 0, | 323 | memset(®s->gpr[0], 0, |
312 | ((nb0 + 3) / 4) * sizeof(unsigned long)); | 324 | ((nb0 + 3) / 4) * sizeof(unsigned long)); |
313 | 325 | ||
314 | for (i = 0; i < nb; ++i) | 326 | for (i = 0; i < nb; ++i, ++p) |
315 | if (__get_user(REG_BYTE(rptr, i), addr + i)) | 327 | if (__get_user(REG_BYTE(rptr, i ^ bswiz), SWIZ_PTR(p))) |
316 | return -EFAULT; | 328 | return -EFAULT; |
317 | if (nb0 > 0) { | 329 | if (nb0 > 0) { |
318 | rptr = ®s->gpr[0]; | 330 | rptr = ®s->gpr[0]; |
319 | addr += nb; | 331 | addr += nb; |
320 | for (i = 0; i < nb0; ++i) | 332 | for (i = 0; i < nb0; ++i, ++p) |
321 | if (__get_user(REG_BYTE(rptr, i), addr + i)) | 333 | if (__get_user(REG_BYTE(rptr, i ^ bswiz), |
334 | SWIZ_PTR(p))) | ||
322 | return -EFAULT; | 335 | return -EFAULT; |
323 | } | 336 | } |
324 | 337 | ||
325 | } else { | 338 | } else { |
326 | for (i = 0; i < nb; ++i) | 339 | for (i = 0; i < nb; ++i, ++p) |
327 | if (__put_user(REG_BYTE(rptr, i), addr + i)) | 340 | if (__put_user(REG_BYTE(rptr, i ^ bswiz), SWIZ_PTR(p))) |
328 | return -EFAULT; | 341 | return -EFAULT; |
329 | if (nb0 > 0) { | 342 | if (nb0 > 0) { |
330 | rptr = ®s->gpr[0]; | 343 | rptr = ®s->gpr[0]; |
331 | addr += nb; | 344 | addr += nb; |
332 | for (i = 0; i < nb0; ++i) | 345 | for (i = 0; i < nb0; ++i, ++p) |
333 | if (__put_user(REG_BYTE(rptr, i), addr + i)) | 346 | if (__put_user(REG_BYTE(rptr, i ^ bswiz), |
347 | SWIZ_PTR(p))) | ||
334 | return -EFAULT; | 348 | return -EFAULT; |
335 | } | 349 | } |
336 | } | 350 | } |
@@ -352,7 +366,7 @@ int fix_alignment(struct pt_regs *regs) | |||
352 | unsigned int reg, areg; | 366 | unsigned int reg, areg; |
353 | unsigned int dsisr; | 367 | unsigned int dsisr; |
354 | unsigned char __user *addr; | 368 | unsigned char __user *addr; |
355 | unsigned char __user *p; | 369 | unsigned long p, swiz; |
356 | int ret, t; | 370 | int ret, t; |
357 | union { | 371 | union { |
358 | u64 ll; | 372 | u64 ll; |
@@ -380,11 +394,15 @@ int fix_alignment(struct pt_regs *regs) | |||
380 | * let's make one up from the instruction | 394 | * let's make one up from the instruction |
381 | */ | 395 | */ |
382 | if (cpu_has_feature(CPU_FTR_NODSISRALIGN)) { | 396 | if (cpu_has_feature(CPU_FTR_NODSISRALIGN)) { |
383 | unsigned int real_instr; | 397 | unsigned long pc = regs->nip; |
384 | if (unlikely(__get_user(real_instr, | 398 | |
385 | (unsigned int __user *)regs->nip))) | 399 | if (cpu_has_feature(CPU_FTR_PPC_LE) && (regs->msr & MSR_LE)) |
400 | pc ^= 4; | ||
401 | if (unlikely(__get_user(instr, (unsigned int __user *)pc))) | ||
386 | return -EFAULT; | 402 | return -EFAULT; |
387 | dsisr = make_dsisr(real_instr); | 403 | if (cpu_has_feature(CPU_FTR_REAL_LE) && (regs->msr & MSR_LE)) |
404 | instr = cpu_to_le32(instr); | ||
405 | dsisr = make_dsisr(instr); | ||
388 | } | 406 | } |
389 | 407 | ||
390 | /* extract the operation and registers from the dsisr */ | 408 | /* extract the operation and registers from the dsisr */ |
@@ -397,6 +415,24 @@ int fix_alignment(struct pt_regs *regs) | |||
397 | nb = aligninfo[instr].len; | 415 | nb = aligninfo[instr].len; |
398 | flags = aligninfo[instr].flags; | 416 | flags = aligninfo[instr].flags; |
399 | 417 | ||
418 | /* Byteswap little endian loads and stores */ | ||
419 | swiz = 0; | ||
420 | if (regs->msr & MSR_LE) { | ||
421 | flags ^= SW; | ||
422 | /* | ||
423 | * So-called "PowerPC little endian" mode works by | ||
424 | * swizzling addresses rather than by actually doing | ||
425 | * any byte-swapping. To emulate this, we XOR each | ||
426 | * byte address with 7. We also byte-swap, because | ||
427 | * the processor's address swizzling depends on the | ||
428 | * operand size (it xors the address with 7 for bytes, | ||
429 | * 6 for halfwords, 4 for words, 0 for doublewords) but | ||
430 | * we will xor with 7 and load/store each byte separately. | ||
431 | */ | ||
432 | if (cpu_has_feature(CPU_FTR_PPC_LE)) | ||
433 | swiz = 7; | ||
434 | } | ||
435 | |||
400 | /* DAR has the operand effective address */ | 436 | /* DAR has the operand effective address */ |
401 | addr = (unsigned char __user *)regs->dar; | 437 | addr = (unsigned char __user *)regs->dar; |
402 | 438 | ||
@@ -412,7 +448,8 @@ int fix_alignment(struct pt_regs *regs) | |||
412 | * function | 448 | * function |
413 | */ | 449 | */ |
414 | if (flags & M) | 450 | if (flags & M) |
415 | return emulate_multiple(regs, addr, reg, nb, flags, instr); | 451 | return emulate_multiple(regs, addr, reg, nb, |
452 | flags, instr, swiz); | ||
416 | 453 | ||
417 | /* Verify the address of the operand */ | 454 | /* Verify the address of the operand */ |
418 | if (unlikely(user_mode(regs) && | 455 | if (unlikely(user_mode(regs) && |
@@ -431,51 +468,71 @@ int fix_alignment(struct pt_regs *regs) | |||
431 | /* If we are loading, get the data from user space, else | 468 | /* If we are loading, get the data from user space, else |
432 | * get it from register values | 469 | * get it from register values |
433 | */ | 470 | */ |
434 | if (flags & LD) { | 471 | if (!(flags & ST)) { |
435 | data.ll = 0; | 472 | data.ll = 0; |
436 | ret = 0; | 473 | ret = 0; |
437 | p = addr; | 474 | p = (unsigned long) addr; |
438 | switch (nb) { | 475 | switch (nb) { |
439 | case 8: | 476 | case 8: |
440 | ret |= __get_user(data.v[0], p++); | 477 | ret |= __get_user(data.v[0], SWIZ_PTR(p++)); |
441 | ret |= __get_user(data.v[1], p++); | 478 | ret |= __get_user(data.v[1], SWIZ_PTR(p++)); |
442 | ret |= __get_user(data.v[2], p++); | 479 | ret |= __get_user(data.v[2], SWIZ_PTR(p++)); |
443 | ret |= __get_user(data.v[3], p++); | 480 | ret |= __get_user(data.v[3], SWIZ_PTR(p++)); |
444 | case 4: | 481 | case 4: |
445 | ret |= __get_user(data.v[4], p++); | 482 | ret |= __get_user(data.v[4], SWIZ_PTR(p++)); |
446 | ret |= __get_user(data.v[5], p++); | 483 | ret |= __get_user(data.v[5], SWIZ_PTR(p++)); |
447 | case 2: | 484 | case 2: |
448 | ret |= __get_user(data.v[6], p++); | 485 | ret |= __get_user(data.v[6], SWIZ_PTR(p++)); |
449 | ret |= __get_user(data.v[7], p++); | 486 | ret |= __get_user(data.v[7], SWIZ_PTR(p++)); |
450 | if (unlikely(ret)) | 487 | if (unlikely(ret)) |
451 | return -EFAULT; | 488 | return -EFAULT; |
452 | } | 489 | } |
453 | } else if (flags & F) | 490 | } else if (flags & F) { |
454 | data.dd = current->thread.fpr[reg]; | 491 | data.dd = current->thread.fpr[reg]; |
455 | else | 492 | if (flags & S) { |
493 | /* Single-precision FP store requires conversion... */ | ||
494 | #ifdef CONFIG_PPC_FPU | ||
495 | preempt_disable(); | ||
496 | enable_kernel_fp(); | ||
497 | cvt_df(&data.dd, (float *)&data.v[4], ¤t->thread); | ||
498 | preempt_enable(); | ||
499 | #else | ||
500 | return 0; | ||
501 | #endif | ||
502 | } | ||
503 | } else | ||
456 | data.ll = regs->gpr[reg]; | 504 | data.ll = regs->gpr[reg]; |
457 | 505 | ||
458 | /* Perform other misc operations like sign extension, byteswap, | 506 | if (flags & SW) { |
507 | switch (nb) { | ||
508 | case 8: | ||
509 | SWAP(data.v[0], data.v[7]); | ||
510 | SWAP(data.v[1], data.v[6]); | ||
511 | SWAP(data.v[2], data.v[5]); | ||
512 | SWAP(data.v[3], data.v[4]); | ||
513 | break; | ||
514 | case 4: | ||
515 | SWAP(data.v[4], data.v[7]); | ||
516 | SWAP(data.v[5], data.v[6]); | ||
517 | break; | ||
518 | case 2: | ||
519 | SWAP(data.v[6], data.v[7]); | ||
520 | break; | ||
521 | } | ||
522 | } | ||
523 | |||
524 | /* Perform other misc operations like sign extension | ||
459 | * or floating point single precision conversion | 525 | * or floating point single precision conversion |
460 | */ | 526 | */ |
461 | switch (flags & ~U) { | 527 | switch (flags & ~(U|SW)) { |
462 | case LD+SE: /* sign extend */ | 528 | case LD+SE: /* sign extend */ |
463 | if ( nb == 2 ) | 529 | if ( nb == 2 ) |
464 | data.ll = data.x16.low16; | 530 | data.ll = data.x16.low16; |
465 | else /* nb must be 4 */ | 531 | else /* nb must be 4 */ |
466 | data.ll = data.x32.low32; | 532 | data.ll = data.x32.low32; |
467 | break; | 533 | break; |
468 | case LD+S: /* byte-swap */ | ||
469 | case ST+S: | ||
470 | if (nb == 2) { | ||
471 | SWAP(data.v[6], data.v[7]); | ||
472 | } else { | ||
473 | SWAP(data.v[4], data.v[7]); | ||
474 | SWAP(data.v[5], data.v[6]); | ||
475 | } | ||
476 | break; | ||
477 | 534 | ||
478 | /* Single-precision FP load and store require conversions... */ | 535 | /* Single-precision FP load requires conversion... */ |
479 | case LD+F+S: | 536 | case LD+F+S: |
480 | #ifdef CONFIG_PPC_FPU | 537 | #ifdef CONFIG_PPC_FPU |
481 | preempt_disable(); | 538 | preempt_disable(); |
@@ -486,34 +543,24 @@ int fix_alignment(struct pt_regs *regs) | |||
486 | return 0; | 543 | return 0; |
487 | #endif | 544 | #endif |
488 | break; | 545 | break; |
489 | case ST+F+S: | ||
490 | #ifdef CONFIG_PPC_FPU | ||
491 | preempt_disable(); | ||
492 | enable_kernel_fp(); | ||
493 | cvt_df(&data.dd, (float *)&data.v[4], ¤t->thread); | ||
494 | preempt_enable(); | ||
495 | #else | ||
496 | return 0; | ||
497 | #endif | ||
498 | break; | ||
499 | } | 546 | } |
500 | 547 | ||
501 | /* Store result to memory or update registers */ | 548 | /* Store result to memory or update registers */ |
502 | if (flags & ST) { | 549 | if (flags & ST) { |
503 | ret = 0; | 550 | ret = 0; |
504 | p = addr; | 551 | p = (unsigned long) addr; |
505 | switch (nb) { | 552 | switch (nb) { |
506 | case 8: | 553 | case 8: |
507 | ret |= __put_user(data.v[0], p++); | 554 | ret |= __put_user(data.v[0], SWIZ_PTR(p++)); |
508 | ret |= __put_user(data.v[1], p++); | 555 | ret |= __put_user(data.v[1], SWIZ_PTR(p++)); |
509 | ret |= __put_user(data.v[2], p++); | 556 | ret |= __put_user(data.v[2], SWIZ_PTR(p++)); |
510 | ret |= __put_user(data.v[3], p++); | 557 | ret |= __put_user(data.v[3], SWIZ_PTR(p++)); |
511 | case 4: | 558 | case 4: |
512 | ret |= __put_user(data.v[4], p++); | 559 | ret |= __put_user(data.v[4], SWIZ_PTR(p++)); |
513 | ret |= __put_user(data.v[5], p++); | 560 | ret |= __put_user(data.v[5], SWIZ_PTR(p++)); |
514 | case 2: | 561 | case 2: |
515 | ret |= __put_user(data.v[6], p++); | 562 | ret |= __put_user(data.v[6], SWIZ_PTR(p++)); |
516 | ret |= __put_user(data.v[7], p++); | 563 | ret |= __put_user(data.v[7], SWIZ_PTR(p++)); |
517 | } | 564 | } |
518 | if (unlikely(ret)) | 565 | if (unlikely(ret)) |
519 | return -EFAULT; | 566 | return -EFAULT; |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 8f85c5e8a55a..ff2940548929 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -122,9 +122,8 @@ int main(void) | |||
122 | DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache)); | 122 | DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache)); |
123 | DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr)); | 123 | DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr)); |
124 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); | 124 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); |
125 | #ifdef CONFIG_PPC_64K_PAGES | 125 | DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct, context.sllp)); |
126 | DEFINE(PACAPGDIR, offsetof(struct paca_struct, pgdir)); | 126 | DEFINE(PACAVMALLOCSLLP, offsetof(struct paca_struct, vmalloc_sllp)); |
127 | #endif | ||
128 | #ifdef CONFIG_HUGETLB_PAGE | 127 | #ifdef CONFIG_HUGETLB_PAGE |
129 | DEFINE(PACALOWHTLBAREAS, offsetof(struct paca_struct, context.low_htlb_areas)); | 128 | DEFINE(PACALOWHTLBAREAS, offsetof(struct paca_struct, context.low_htlb_areas)); |
130 | DEFINE(PACAHIGHHTLBAREAS, offsetof(struct paca_struct, context.high_htlb_areas)); | 129 | DEFINE(PACAHIGHHTLBAREAS, offsetof(struct paca_struct, context.high_htlb_areas)); |
diff --git a/arch/powerpc/kernel/cpu_setup_6xx.S b/arch/powerpc/kernel/cpu_setup_6xx.S index 55ed7716636f..365381fcb27c 100644 --- a/arch/powerpc/kernel/cpu_setup_6xx.S +++ b/arch/powerpc/kernel/cpu_setup_6xx.S | |||
@@ -210,9 +210,11 @@ setup_745x_specifics: | |||
210 | * the firmware. If any, we disable NAP capability as | 210 | * the firmware. If any, we disable NAP capability as |
211 | * it's known to be bogus on rev 2.1 and earlier | 211 | * it's known to be bogus on rev 2.1 and earlier |
212 | */ | 212 | */ |
213 | BEGIN_FTR_SECTION | ||
213 | mfspr r11,SPRN_L3CR | 214 | mfspr r11,SPRN_L3CR |
214 | andis. r11,r11,L3CR_L3E@h | 215 | andis. r11,r11,L3CR_L3E@h |
215 | beq 1f | 216 | beq 1f |
217 | END_FTR_SECTION_IFSET(CPU_FTR_L3CR) | ||
216 | lwz r6,CPU_SPEC_FEATURES(r5) | 218 | lwz r6,CPU_SPEC_FEATURES(r5) |
217 | andi. r0,r6,CPU_FTR_L3_DISABLE_NAP | 219 | andi. r0,r6,CPU_FTR_L3_DISABLE_NAP |
218 | beq 1f | 220 | beq 1f |
diff --git a/arch/powerpc/kernel/cpu_setup_power4.S b/arch/powerpc/kernel/cpu_setup_power4.S index b61d86e7ceb6..271418308d53 100644 --- a/arch/powerpc/kernel/cpu_setup_power4.S +++ b/arch/powerpc/kernel/cpu_setup_power4.S | |||
@@ -73,23 +73,6 @@ _GLOBAL(__970_cpu_preinit) | |||
73 | isync | 73 | isync |
74 | blr | 74 | blr |
75 | 75 | ||
76 | _GLOBAL(__setup_cpu_power4) | ||
77 | blr | ||
78 | |||
79 | _GLOBAL(__setup_cpu_be) | ||
80 | /* Set large page sizes LP=0: 16MB, LP=1: 64KB */ | ||
81 | addi r3, 0, 0 | ||
82 | ori r3, r3, HID6_LB | ||
83 | sldi r3, r3, 32 | ||
84 | nor r3, r3, r3 | ||
85 | mfspr r4, SPRN_HID6 | ||
86 | and r4, r4, r3 | ||
87 | addi r3, 0, 0x02000 | ||
88 | sldi r3, r3, 32 | ||
89 | or r4, r4, r3 | ||
90 | mtspr SPRN_HID6, r4 | ||
91 | blr | ||
92 | |||
93 | _GLOBAL(__setup_cpu_ppc970) | 76 | _GLOBAL(__setup_cpu_ppc970) |
94 | mfspr r0,SPRN_HID0 | 77 | mfspr r0,SPRN_HID0 |
95 | li r11,5 /* clear DOZE and SLEEP */ | 78 | li r11,5 /* clear DOZE and SLEEP */ |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 3f7182db9ed5..1c114880dc05 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -30,11 +30,7 @@ EXPORT_SYMBOL(cur_cpu_spec); | |||
30 | * part of the cputable though. That has to be fixed for both ppc32 | 30 | * part of the cputable though. That has to be fixed for both ppc32 |
31 | * and ppc64 | 31 | * and ppc64 |
32 | */ | 32 | */ |
33 | #ifdef CONFIG_PPC64 | 33 | #ifdef CONFIG_PPC32 |
34 | extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec); | ||
35 | extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec); | ||
36 | extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec); | ||
37 | #else | ||
38 | extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec); | 34 | extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec); |
39 | extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec); | 35 | extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec); |
40 | extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec); | 36 | extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec); |
@@ -58,7 +54,8 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); | |||
58 | #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\ | 54 | #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\ |
59 | PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) | 55 | PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) |
60 | #define COMMON_USER_POWER6 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\ | 56 | #define COMMON_USER_POWER6 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\ |
61 | PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) | 57 | PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \ |
58 | PPC_FEATURE_TRUE_LE) | ||
62 | #define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ | 59 | #define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ |
63 | PPC_FEATURE_BOOKE) | 60 | PPC_FEATURE_BOOKE) |
64 | 61 | ||
@@ -78,11 +75,10 @@ struct cpu_spec cpu_specs[] = { | |||
78 | .pvr_value = 0x00400000, | 75 | .pvr_value = 0x00400000, |
79 | .cpu_name = "POWER3 (630)", | 76 | .cpu_name = "POWER3 (630)", |
80 | .cpu_features = CPU_FTRS_POWER3, | 77 | .cpu_features = CPU_FTRS_POWER3, |
81 | .cpu_user_features = COMMON_USER_PPC64, | 78 | .cpu_user_features = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE, |
82 | .icache_bsize = 128, | 79 | .icache_bsize = 128, |
83 | .dcache_bsize = 128, | 80 | .dcache_bsize = 128, |
84 | .num_pmcs = 8, | 81 | .num_pmcs = 8, |
85 | .cpu_setup = __setup_cpu_power3, | ||
86 | .oprofile_cpu_type = "ppc64/power3", | 82 | .oprofile_cpu_type = "ppc64/power3", |
87 | .oprofile_type = PPC_OPROFILE_RS64, | 83 | .oprofile_type = PPC_OPROFILE_RS64, |
88 | .platform = "power3", | 84 | .platform = "power3", |
@@ -92,11 +88,10 @@ struct cpu_spec cpu_specs[] = { | |||
92 | .pvr_value = 0x00410000, | 88 | .pvr_value = 0x00410000, |
93 | .cpu_name = "POWER3 (630+)", | 89 | .cpu_name = "POWER3 (630+)", |
94 | .cpu_features = CPU_FTRS_POWER3, | 90 | .cpu_features = CPU_FTRS_POWER3, |
95 | .cpu_user_features = COMMON_USER_PPC64, | 91 | .cpu_user_features = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE, |
96 | .icache_bsize = 128, | 92 | .icache_bsize = 128, |
97 | .dcache_bsize = 128, | 93 | .dcache_bsize = 128, |
98 | .num_pmcs = 8, | 94 | .num_pmcs = 8, |
99 | .cpu_setup = __setup_cpu_power3, | ||
100 | .oprofile_cpu_type = "ppc64/power3", | 95 | .oprofile_cpu_type = "ppc64/power3", |
101 | .oprofile_type = PPC_OPROFILE_RS64, | 96 | .oprofile_type = PPC_OPROFILE_RS64, |
102 | .platform = "power3", | 97 | .platform = "power3", |
@@ -110,7 +105,6 @@ struct cpu_spec cpu_specs[] = { | |||
110 | .icache_bsize = 128, | 105 | .icache_bsize = 128, |
111 | .dcache_bsize = 128, | 106 | .dcache_bsize = 128, |
112 | .num_pmcs = 8, | 107 | .num_pmcs = 8, |
113 | .cpu_setup = __setup_cpu_power3, | ||
114 | .oprofile_cpu_type = "ppc64/rs64", | 108 | .oprofile_cpu_type = "ppc64/rs64", |
115 | .oprofile_type = PPC_OPROFILE_RS64, | 109 | .oprofile_type = PPC_OPROFILE_RS64, |
116 | .platform = "rs64", | 110 | .platform = "rs64", |
@@ -124,7 +118,6 @@ struct cpu_spec cpu_specs[] = { | |||
124 | .icache_bsize = 128, | 118 | .icache_bsize = 128, |
125 | .dcache_bsize = 128, | 119 | .dcache_bsize = 128, |
126 | .num_pmcs = 8, | 120 | .num_pmcs = 8, |
127 | .cpu_setup = __setup_cpu_power3, | ||
128 | .oprofile_cpu_type = "ppc64/rs64", | 121 | .oprofile_cpu_type = "ppc64/rs64", |
129 | .oprofile_type = PPC_OPROFILE_RS64, | 122 | .oprofile_type = PPC_OPROFILE_RS64, |
130 | .platform = "rs64", | 123 | .platform = "rs64", |
@@ -138,7 +131,6 @@ struct cpu_spec cpu_specs[] = { | |||
138 | .icache_bsize = 128, | 131 | .icache_bsize = 128, |
139 | .dcache_bsize = 128, | 132 | .dcache_bsize = 128, |
140 | .num_pmcs = 8, | 133 | .num_pmcs = 8, |
141 | .cpu_setup = __setup_cpu_power3, | ||
142 | .oprofile_cpu_type = "ppc64/rs64", | 134 | .oprofile_cpu_type = "ppc64/rs64", |
143 | .oprofile_type = PPC_OPROFILE_RS64, | 135 | .oprofile_type = PPC_OPROFILE_RS64, |
144 | .platform = "rs64", | 136 | .platform = "rs64", |
@@ -152,7 +144,6 @@ struct cpu_spec cpu_specs[] = { | |||
152 | .icache_bsize = 128, | 144 | .icache_bsize = 128, |
153 | .dcache_bsize = 128, | 145 | .dcache_bsize = 128, |
154 | .num_pmcs = 8, | 146 | .num_pmcs = 8, |
155 | .cpu_setup = __setup_cpu_power3, | ||
156 | .oprofile_cpu_type = "ppc64/rs64", | 147 | .oprofile_cpu_type = "ppc64/rs64", |
157 | .oprofile_type = PPC_OPROFILE_RS64, | 148 | .oprofile_type = PPC_OPROFILE_RS64, |
158 | .platform = "rs64", | 149 | .platform = "rs64", |
@@ -166,7 +157,6 @@ struct cpu_spec cpu_specs[] = { | |||
166 | .icache_bsize = 128, | 157 | .icache_bsize = 128, |
167 | .dcache_bsize = 128, | 158 | .dcache_bsize = 128, |
168 | .num_pmcs = 8, | 159 | .num_pmcs = 8, |
169 | .cpu_setup = __setup_cpu_power4, | ||
170 | .oprofile_cpu_type = "ppc64/power4", | 160 | .oprofile_cpu_type = "ppc64/power4", |
171 | .oprofile_type = PPC_OPROFILE_POWER4, | 161 | .oprofile_type = PPC_OPROFILE_POWER4, |
172 | .platform = "power4", | 162 | .platform = "power4", |
@@ -180,7 +170,6 @@ struct cpu_spec cpu_specs[] = { | |||
180 | .icache_bsize = 128, | 170 | .icache_bsize = 128, |
181 | .dcache_bsize = 128, | 171 | .dcache_bsize = 128, |
182 | .num_pmcs = 8, | 172 | .num_pmcs = 8, |
183 | .cpu_setup = __setup_cpu_power4, | ||
184 | .oprofile_cpu_type = "ppc64/power4", | 173 | .oprofile_cpu_type = "ppc64/power4", |
185 | .oprofile_type = PPC_OPROFILE_POWER4, | 174 | .oprofile_type = PPC_OPROFILE_POWER4, |
186 | .platform = "power4", | 175 | .platform = "power4", |
@@ -200,17 +189,11 @@ struct cpu_spec cpu_specs[] = { | |||
200 | .oprofile_type = PPC_OPROFILE_POWER4, | 189 | .oprofile_type = PPC_OPROFILE_POWER4, |
201 | .platform = "ppc970", | 190 | .platform = "ppc970", |
202 | }, | 191 | }, |
203 | #endif /* CONFIG_PPC64 */ | ||
204 | #if defined(CONFIG_PPC64) || defined(CONFIG_POWER4) | ||
205 | { /* PPC970FX */ | 192 | { /* PPC970FX */ |
206 | .pvr_mask = 0xffff0000, | 193 | .pvr_mask = 0xffff0000, |
207 | .pvr_value = 0x003c0000, | 194 | .pvr_value = 0x003c0000, |
208 | .cpu_name = "PPC970FX", | 195 | .cpu_name = "PPC970FX", |
209 | #ifdef CONFIG_PPC32 | ||
210 | .cpu_features = CPU_FTRS_970_32, | ||
211 | #else | ||
212 | .cpu_features = CPU_FTRS_PPC970, | 196 | .cpu_features = CPU_FTRS_PPC970, |
213 | #endif | ||
214 | .cpu_user_features = COMMON_USER_POWER4 | | 197 | .cpu_user_features = COMMON_USER_POWER4 | |
215 | PPC_FEATURE_HAS_ALTIVEC_COMP, | 198 | PPC_FEATURE_HAS_ALTIVEC_COMP, |
216 | .icache_bsize = 128, | 199 | .icache_bsize = 128, |
@@ -221,8 +204,6 @@ struct cpu_spec cpu_specs[] = { | |||
221 | .oprofile_type = PPC_OPROFILE_POWER4, | 204 | .oprofile_type = PPC_OPROFILE_POWER4, |
222 | .platform = "ppc970", | 205 | .platform = "ppc970", |
223 | }, | 206 | }, |
224 | #endif /* defined(CONFIG_PPC64) || defined(CONFIG_POWER4) */ | ||
225 | #ifdef CONFIG_PPC64 | ||
226 | { /* PPC970MP */ | 207 | { /* PPC970MP */ |
227 | .pvr_mask = 0xffff0000, | 208 | .pvr_mask = 0xffff0000, |
228 | .pvr_value = 0x00440000, | 209 | .pvr_value = 0x00440000, |
@@ -232,6 +213,7 @@ struct cpu_spec cpu_specs[] = { | |||
232 | PPC_FEATURE_HAS_ALTIVEC_COMP, | 213 | PPC_FEATURE_HAS_ALTIVEC_COMP, |
233 | .icache_bsize = 128, | 214 | .icache_bsize = 128, |
234 | .dcache_bsize = 128, | 215 | .dcache_bsize = 128, |
216 | .num_pmcs = 8, | ||
235 | .cpu_setup = __setup_cpu_ppc970, | 217 | .cpu_setup = __setup_cpu_ppc970, |
236 | .oprofile_cpu_type = "ppc64/970", | 218 | .oprofile_cpu_type = "ppc64/970", |
237 | .oprofile_type = PPC_OPROFILE_POWER4, | 219 | .oprofile_type = PPC_OPROFILE_POWER4, |
@@ -246,9 +228,13 @@ struct cpu_spec cpu_specs[] = { | |||
246 | .icache_bsize = 128, | 228 | .icache_bsize = 128, |
247 | .dcache_bsize = 128, | 229 | .dcache_bsize = 128, |
248 | .num_pmcs = 6, | 230 | .num_pmcs = 6, |
249 | .cpu_setup = __setup_cpu_power4, | ||
250 | .oprofile_cpu_type = "ppc64/power5", | 231 | .oprofile_cpu_type = "ppc64/power5", |
251 | .oprofile_type = PPC_OPROFILE_POWER4, | 232 | .oprofile_type = PPC_OPROFILE_POWER4, |
233 | /* SIHV / SIPR bits are implemented on POWER4+ (GQ) | ||
234 | * and above but only works on POWER5 and above | ||
235 | */ | ||
236 | .oprofile_mmcra_sihv = MMCRA_SIHV, | ||
237 | .oprofile_mmcra_sipr = MMCRA_SIPR, | ||
252 | .platform = "power5", | 238 | .platform = "power5", |
253 | }, | 239 | }, |
254 | { /* Power5 GS */ | 240 | { /* Power5 GS */ |
@@ -260,9 +246,10 @@ struct cpu_spec cpu_specs[] = { | |||
260 | .icache_bsize = 128, | 246 | .icache_bsize = 128, |
261 | .dcache_bsize = 128, | 247 | .dcache_bsize = 128, |
262 | .num_pmcs = 6, | 248 | .num_pmcs = 6, |
263 | .cpu_setup = __setup_cpu_power4, | ||
264 | .oprofile_cpu_type = "ppc64/power5+", | 249 | .oprofile_cpu_type = "ppc64/power5+", |
265 | .oprofile_type = PPC_OPROFILE_POWER4, | 250 | .oprofile_type = PPC_OPROFILE_POWER4, |
251 | .oprofile_mmcra_sihv = MMCRA_SIHV, | ||
252 | .oprofile_mmcra_sipr = MMCRA_SIPR, | ||
266 | .platform = "power5+", | 253 | .platform = "power5+", |
267 | }, | 254 | }, |
268 | { /* Power6 */ | 255 | { /* Power6 */ |
@@ -273,10 +260,13 @@ struct cpu_spec cpu_specs[] = { | |||
273 | .cpu_user_features = COMMON_USER_POWER6, | 260 | .cpu_user_features = COMMON_USER_POWER6, |
274 | .icache_bsize = 128, | 261 | .icache_bsize = 128, |
275 | .dcache_bsize = 128, | 262 | .dcache_bsize = 128, |
276 | .num_pmcs = 6, | 263 | .num_pmcs = 8, |
277 | .cpu_setup = __setup_cpu_power4, | ||
278 | .oprofile_cpu_type = "ppc64/power6", | 264 | .oprofile_cpu_type = "ppc64/power6", |
279 | .oprofile_type = PPC_OPROFILE_POWER4, | 265 | .oprofile_type = PPC_OPROFILE_POWER4, |
266 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, | ||
267 | .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, | ||
268 | .oprofile_mmcra_clear = POWER6_MMCRA_THRM | | ||
269 | POWER6_MMCRA_OTHER, | ||
280 | .platform = "power6", | 270 | .platform = "power6", |
281 | }, | 271 | }, |
282 | { /* Cell Broadband Engine */ | 272 | { /* Cell Broadband Engine */ |
@@ -289,7 +279,6 @@ struct cpu_spec cpu_specs[] = { | |||
289 | PPC_FEATURE_SMT, | 279 | PPC_FEATURE_SMT, |
290 | .icache_bsize = 128, | 280 | .icache_bsize = 128, |
291 | .dcache_bsize = 128, | 281 | .dcache_bsize = 128, |
292 | .cpu_setup = __setup_cpu_be, | ||
293 | .platform = "ppc-cell-be", | 282 | .platform = "ppc-cell-be", |
294 | }, | 283 | }, |
295 | { /* default match */ | 284 | { /* default match */ |
@@ -301,7 +290,6 @@ struct cpu_spec cpu_specs[] = { | |||
301 | .icache_bsize = 128, | 290 | .icache_bsize = 128, |
302 | .dcache_bsize = 128, | 291 | .dcache_bsize = 128, |
303 | .num_pmcs = 6, | 292 | .num_pmcs = 6, |
304 | .cpu_setup = __setup_cpu_power4, | ||
305 | .platform = "power4", | 293 | .platform = "power4", |
306 | } | 294 | } |
307 | #endif /* CONFIG_PPC64 */ | 295 | #endif /* CONFIG_PPC64 */ |
@@ -323,7 +311,7 @@ struct cpu_spec cpu_specs[] = { | |||
323 | .pvr_value = 0x00030000, | 311 | .pvr_value = 0x00030000, |
324 | .cpu_name = "603", | 312 | .cpu_name = "603", |
325 | .cpu_features = CPU_FTRS_603, | 313 | .cpu_features = CPU_FTRS_603, |
326 | .cpu_user_features = COMMON_USER, | 314 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
327 | .icache_bsize = 32, | 315 | .icache_bsize = 32, |
328 | .dcache_bsize = 32, | 316 | .dcache_bsize = 32, |
329 | .cpu_setup = __setup_cpu_603, | 317 | .cpu_setup = __setup_cpu_603, |
@@ -334,7 +322,7 @@ struct cpu_spec cpu_specs[] = { | |||
334 | .pvr_value = 0x00060000, | 322 | .pvr_value = 0x00060000, |
335 | .cpu_name = "603e", | 323 | .cpu_name = "603e", |
336 | .cpu_features = CPU_FTRS_603, | 324 | .cpu_features = CPU_FTRS_603, |
337 | .cpu_user_features = COMMON_USER, | 325 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
338 | .icache_bsize = 32, | 326 | .icache_bsize = 32, |
339 | .dcache_bsize = 32, | 327 | .dcache_bsize = 32, |
340 | .cpu_setup = __setup_cpu_603, | 328 | .cpu_setup = __setup_cpu_603, |
@@ -345,7 +333,7 @@ struct cpu_spec cpu_specs[] = { | |||
345 | .pvr_value = 0x00070000, | 333 | .pvr_value = 0x00070000, |
346 | .cpu_name = "603ev", | 334 | .cpu_name = "603ev", |
347 | .cpu_features = CPU_FTRS_603, | 335 | .cpu_features = CPU_FTRS_603, |
348 | .cpu_user_features = COMMON_USER, | 336 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
349 | .icache_bsize = 32, | 337 | .icache_bsize = 32, |
350 | .dcache_bsize = 32, | 338 | .dcache_bsize = 32, |
351 | .cpu_setup = __setup_cpu_603, | 339 | .cpu_setup = __setup_cpu_603, |
@@ -356,7 +344,7 @@ struct cpu_spec cpu_specs[] = { | |||
356 | .pvr_value = 0x00040000, | 344 | .pvr_value = 0x00040000, |
357 | .cpu_name = "604", | 345 | .cpu_name = "604", |
358 | .cpu_features = CPU_FTRS_604, | 346 | .cpu_features = CPU_FTRS_604, |
359 | .cpu_user_features = COMMON_USER, | 347 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
360 | .icache_bsize = 32, | 348 | .icache_bsize = 32, |
361 | .dcache_bsize = 32, | 349 | .dcache_bsize = 32, |
362 | .num_pmcs = 2, | 350 | .num_pmcs = 2, |
@@ -368,7 +356,7 @@ struct cpu_spec cpu_specs[] = { | |||
368 | .pvr_value = 0x00090000, | 356 | .pvr_value = 0x00090000, |
369 | .cpu_name = "604e", | 357 | .cpu_name = "604e", |
370 | .cpu_features = CPU_FTRS_604, | 358 | .cpu_features = CPU_FTRS_604, |
371 | .cpu_user_features = COMMON_USER, | 359 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
372 | .icache_bsize = 32, | 360 | .icache_bsize = 32, |
373 | .dcache_bsize = 32, | 361 | .dcache_bsize = 32, |
374 | .num_pmcs = 4, | 362 | .num_pmcs = 4, |
@@ -380,7 +368,7 @@ struct cpu_spec cpu_specs[] = { | |||
380 | .pvr_value = 0x00090000, | 368 | .pvr_value = 0x00090000, |
381 | .cpu_name = "604r", | 369 | .cpu_name = "604r", |
382 | .cpu_features = CPU_FTRS_604, | 370 | .cpu_features = CPU_FTRS_604, |
383 | .cpu_user_features = COMMON_USER, | 371 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
384 | .icache_bsize = 32, | 372 | .icache_bsize = 32, |
385 | .dcache_bsize = 32, | 373 | .dcache_bsize = 32, |
386 | .num_pmcs = 4, | 374 | .num_pmcs = 4, |
@@ -392,7 +380,7 @@ struct cpu_spec cpu_specs[] = { | |||
392 | .pvr_value = 0x000a0000, | 380 | .pvr_value = 0x000a0000, |
393 | .cpu_name = "604ev", | 381 | .cpu_name = "604ev", |
394 | .cpu_features = CPU_FTRS_604, | 382 | .cpu_features = CPU_FTRS_604, |
395 | .cpu_user_features = COMMON_USER, | 383 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
396 | .icache_bsize = 32, | 384 | .icache_bsize = 32, |
397 | .dcache_bsize = 32, | 385 | .dcache_bsize = 32, |
398 | .num_pmcs = 4, | 386 | .num_pmcs = 4, |
@@ -404,7 +392,7 @@ struct cpu_spec cpu_specs[] = { | |||
404 | .pvr_value = 0x00084202, | 392 | .pvr_value = 0x00084202, |
405 | .cpu_name = "740/750", | 393 | .cpu_name = "740/750", |
406 | .cpu_features = CPU_FTRS_740_NOTAU, | 394 | .cpu_features = CPU_FTRS_740_NOTAU, |
407 | .cpu_user_features = COMMON_USER, | 395 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
408 | .icache_bsize = 32, | 396 | .icache_bsize = 32, |
409 | .dcache_bsize = 32, | 397 | .dcache_bsize = 32, |
410 | .num_pmcs = 4, | 398 | .num_pmcs = 4, |
@@ -416,7 +404,7 @@ struct cpu_spec cpu_specs[] = { | |||
416 | .pvr_value = 0x00080100, | 404 | .pvr_value = 0x00080100, |
417 | .cpu_name = "750CX", | 405 | .cpu_name = "750CX", |
418 | .cpu_features = CPU_FTRS_750, | 406 | .cpu_features = CPU_FTRS_750, |
419 | .cpu_user_features = COMMON_USER, | 407 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
420 | .icache_bsize = 32, | 408 | .icache_bsize = 32, |
421 | .dcache_bsize = 32, | 409 | .dcache_bsize = 32, |
422 | .num_pmcs = 4, | 410 | .num_pmcs = 4, |
@@ -428,7 +416,7 @@ struct cpu_spec cpu_specs[] = { | |||
428 | .pvr_value = 0x00082200, | 416 | .pvr_value = 0x00082200, |
429 | .cpu_name = "750CX", | 417 | .cpu_name = "750CX", |
430 | .cpu_features = CPU_FTRS_750, | 418 | .cpu_features = CPU_FTRS_750, |
431 | .cpu_user_features = COMMON_USER, | 419 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
432 | .icache_bsize = 32, | 420 | .icache_bsize = 32, |
433 | .dcache_bsize = 32, | 421 | .dcache_bsize = 32, |
434 | .num_pmcs = 4, | 422 | .num_pmcs = 4, |
@@ -440,7 +428,7 @@ struct cpu_spec cpu_specs[] = { | |||
440 | .pvr_value = 0x00082210, | 428 | .pvr_value = 0x00082210, |
441 | .cpu_name = "750CXe", | 429 | .cpu_name = "750CXe", |
442 | .cpu_features = CPU_FTRS_750, | 430 | .cpu_features = CPU_FTRS_750, |
443 | .cpu_user_features = COMMON_USER, | 431 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
444 | .icache_bsize = 32, | 432 | .icache_bsize = 32, |
445 | .dcache_bsize = 32, | 433 | .dcache_bsize = 32, |
446 | .num_pmcs = 4, | 434 | .num_pmcs = 4, |
@@ -452,7 +440,7 @@ struct cpu_spec cpu_specs[] = { | |||
452 | .pvr_value = 0x00083214, | 440 | .pvr_value = 0x00083214, |
453 | .cpu_name = "750CXe", | 441 | .cpu_name = "750CXe", |
454 | .cpu_features = CPU_FTRS_750, | 442 | .cpu_features = CPU_FTRS_750, |
455 | .cpu_user_features = COMMON_USER, | 443 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
456 | .icache_bsize = 32, | 444 | .icache_bsize = 32, |
457 | .dcache_bsize = 32, | 445 | .dcache_bsize = 32, |
458 | .num_pmcs = 4, | 446 | .num_pmcs = 4, |
@@ -464,7 +452,7 @@ struct cpu_spec cpu_specs[] = { | |||
464 | .pvr_value = 0x00083000, | 452 | .pvr_value = 0x00083000, |
465 | .cpu_name = "745/755", | 453 | .cpu_name = "745/755", |
466 | .cpu_features = CPU_FTRS_750, | 454 | .cpu_features = CPU_FTRS_750, |
467 | .cpu_user_features = COMMON_USER, | 455 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
468 | .icache_bsize = 32, | 456 | .icache_bsize = 32, |
469 | .dcache_bsize = 32, | 457 | .dcache_bsize = 32, |
470 | .num_pmcs = 4, | 458 | .num_pmcs = 4, |
@@ -476,7 +464,7 @@ struct cpu_spec cpu_specs[] = { | |||
476 | .pvr_value = 0x70000100, | 464 | .pvr_value = 0x70000100, |
477 | .cpu_name = "750FX", | 465 | .cpu_name = "750FX", |
478 | .cpu_features = CPU_FTRS_750FX1, | 466 | .cpu_features = CPU_FTRS_750FX1, |
479 | .cpu_user_features = COMMON_USER, | 467 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
480 | .icache_bsize = 32, | 468 | .icache_bsize = 32, |
481 | .dcache_bsize = 32, | 469 | .dcache_bsize = 32, |
482 | .num_pmcs = 4, | 470 | .num_pmcs = 4, |
@@ -488,7 +476,7 @@ struct cpu_spec cpu_specs[] = { | |||
488 | .pvr_value = 0x70000200, | 476 | .pvr_value = 0x70000200, |
489 | .cpu_name = "750FX", | 477 | .cpu_name = "750FX", |
490 | .cpu_features = CPU_FTRS_750FX2, | 478 | .cpu_features = CPU_FTRS_750FX2, |
491 | .cpu_user_features = COMMON_USER, | 479 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
492 | .icache_bsize = 32, | 480 | .icache_bsize = 32, |
493 | .dcache_bsize = 32, | 481 | .dcache_bsize = 32, |
494 | .num_pmcs = 4, | 482 | .num_pmcs = 4, |
@@ -500,7 +488,7 @@ struct cpu_spec cpu_specs[] = { | |||
500 | .pvr_value = 0x70000000, | 488 | .pvr_value = 0x70000000, |
501 | .cpu_name = "750FX", | 489 | .cpu_name = "750FX", |
502 | .cpu_features = CPU_FTRS_750FX, | 490 | .cpu_features = CPU_FTRS_750FX, |
503 | .cpu_user_features = COMMON_USER, | 491 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
504 | .icache_bsize = 32, | 492 | .icache_bsize = 32, |
505 | .dcache_bsize = 32, | 493 | .dcache_bsize = 32, |
506 | .num_pmcs = 4, | 494 | .num_pmcs = 4, |
@@ -512,7 +500,7 @@ struct cpu_spec cpu_specs[] = { | |||
512 | .pvr_value = 0x70020000, | 500 | .pvr_value = 0x70020000, |
513 | .cpu_name = "750GX", | 501 | .cpu_name = "750GX", |
514 | .cpu_features = CPU_FTRS_750GX, | 502 | .cpu_features = CPU_FTRS_750GX, |
515 | .cpu_user_features = COMMON_USER, | 503 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
516 | .icache_bsize = 32, | 504 | .icache_bsize = 32, |
517 | .dcache_bsize = 32, | 505 | .dcache_bsize = 32, |
518 | .num_pmcs = 4, | 506 | .num_pmcs = 4, |
@@ -524,7 +512,7 @@ struct cpu_spec cpu_specs[] = { | |||
524 | .pvr_value = 0x00080000, | 512 | .pvr_value = 0x00080000, |
525 | .cpu_name = "740/750", | 513 | .cpu_name = "740/750", |
526 | .cpu_features = CPU_FTRS_740, | 514 | .cpu_features = CPU_FTRS_740, |
527 | .cpu_user_features = COMMON_USER, | 515 | .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, |
528 | .icache_bsize = 32, | 516 | .icache_bsize = 32, |
529 | .dcache_bsize = 32, | 517 | .dcache_bsize = 32, |
530 | .num_pmcs = 4, | 518 | .num_pmcs = 4, |
@@ -536,7 +524,8 @@ struct cpu_spec cpu_specs[] = { | |||
536 | .pvr_value = 0x000c1101, | 524 | .pvr_value = 0x000c1101, |
537 | .cpu_name = "7400 (1.1)", | 525 | .cpu_name = "7400 (1.1)", |
538 | .cpu_features = CPU_FTRS_7400_NOTAU, | 526 | .cpu_features = CPU_FTRS_7400_NOTAU, |
539 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 527 | .cpu_user_features = COMMON_USER | |
528 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
540 | .icache_bsize = 32, | 529 | .icache_bsize = 32, |
541 | .dcache_bsize = 32, | 530 | .dcache_bsize = 32, |
542 | .num_pmcs = 4, | 531 | .num_pmcs = 4, |
@@ -548,7 +537,8 @@ struct cpu_spec cpu_specs[] = { | |||
548 | .pvr_value = 0x000c0000, | 537 | .pvr_value = 0x000c0000, |
549 | .cpu_name = "7400", | 538 | .cpu_name = "7400", |
550 | .cpu_features = CPU_FTRS_7400, | 539 | .cpu_features = CPU_FTRS_7400, |
551 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 540 | .cpu_user_features = COMMON_USER | |
541 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
552 | .icache_bsize = 32, | 542 | .icache_bsize = 32, |
553 | .dcache_bsize = 32, | 543 | .dcache_bsize = 32, |
554 | .num_pmcs = 4, | 544 | .num_pmcs = 4, |
@@ -560,7 +550,8 @@ struct cpu_spec cpu_specs[] = { | |||
560 | .pvr_value = 0x800c0000, | 550 | .pvr_value = 0x800c0000, |
561 | .cpu_name = "7410", | 551 | .cpu_name = "7410", |
562 | .cpu_features = CPU_FTRS_7400, | 552 | .cpu_features = CPU_FTRS_7400, |
563 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 553 | .cpu_user_features = COMMON_USER | |
554 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
564 | .icache_bsize = 32, | 555 | .icache_bsize = 32, |
565 | .dcache_bsize = 32, | 556 | .dcache_bsize = 32, |
566 | .num_pmcs = 4, | 557 | .num_pmcs = 4, |
@@ -572,7 +563,8 @@ struct cpu_spec cpu_specs[] = { | |||
572 | .pvr_value = 0x80000200, | 563 | .pvr_value = 0x80000200, |
573 | .cpu_name = "7450", | 564 | .cpu_name = "7450", |
574 | .cpu_features = CPU_FTRS_7450_20, | 565 | .cpu_features = CPU_FTRS_7450_20, |
575 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 566 | .cpu_user_features = COMMON_USER | |
567 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
576 | .icache_bsize = 32, | 568 | .icache_bsize = 32, |
577 | .dcache_bsize = 32, | 569 | .dcache_bsize = 32, |
578 | .num_pmcs = 6, | 570 | .num_pmcs = 6, |
@@ -586,7 +578,8 @@ struct cpu_spec cpu_specs[] = { | |||
586 | .pvr_value = 0x80000201, | 578 | .pvr_value = 0x80000201, |
587 | .cpu_name = "7450", | 579 | .cpu_name = "7450", |
588 | .cpu_features = CPU_FTRS_7450_21, | 580 | .cpu_features = CPU_FTRS_7450_21, |
589 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 581 | .cpu_user_features = COMMON_USER | |
582 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
590 | .icache_bsize = 32, | 583 | .icache_bsize = 32, |
591 | .dcache_bsize = 32, | 584 | .dcache_bsize = 32, |
592 | .num_pmcs = 6, | 585 | .num_pmcs = 6, |
@@ -600,7 +593,8 @@ struct cpu_spec cpu_specs[] = { | |||
600 | .pvr_value = 0x80000000, | 593 | .pvr_value = 0x80000000, |
601 | .cpu_name = "7450", | 594 | .cpu_name = "7450", |
602 | .cpu_features = CPU_FTRS_7450_23, | 595 | .cpu_features = CPU_FTRS_7450_23, |
603 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 596 | .cpu_user_features = COMMON_USER | |
597 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
604 | .icache_bsize = 32, | 598 | .icache_bsize = 32, |
605 | .dcache_bsize = 32, | 599 | .dcache_bsize = 32, |
606 | .num_pmcs = 6, | 600 | .num_pmcs = 6, |
@@ -614,7 +608,8 @@ struct cpu_spec cpu_specs[] = { | |||
614 | .pvr_value = 0x80010100, | 608 | .pvr_value = 0x80010100, |
615 | .cpu_name = "7455", | 609 | .cpu_name = "7455", |
616 | .cpu_features = CPU_FTRS_7455_1, | 610 | .cpu_features = CPU_FTRS_7455_1, |
617 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 611 | .cpu_user_features = COMMON_USER | |
612 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
618 | .icache_bsize = 32, | 613 | .icache_bsize = 32, |
619 | .dcache_bsize = 32, | 614 | .dcache_bsize = 32, |
620 | .num_pmcs = 6, | 615 | .num_pmcs = 6, |
@@ -628,7 +623,8 @@ struct cpu_spec cpu_specs[] = { | |||
628 | .pvr_value = 0x80010200, | 623 | .pvr_value = 0x80010200, |
629 | .cpu_name = "7455", | 624 | .cpu_name = "7455", |
630 | .cpu_features = CPU_FTRS_7455_20, | 625 | .cpu_features = CPU_FTRS_7455_20, |
631 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 626 | .cpu_user_features = COMMON_USER | |
627 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
632 | .icache_bsize = 32, | 628 | .icache_bsize = 32, |
633 | .dcache_bsize = 32, | 629 | .dcache_bsize = 32, |
634 | .num_pmcs = 6, | 630 | .num_pmcs = 6, |
@@ -642,7 +638,8 @@ struct cpu_spec cpu_specs[] = { | |||
642 | .pvr_value = 0x80010000, | 638 | .pvr_value = 0x80010000, |
643 | .cpu_name = "7455", | 639 | .cpu_name = "7455", |
644 | .cpu_features = CPU_FTRS_7455, | 640 | .cpu_features = CPU_FTRS_7455, |
645 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 641 | .cpu_user_features = COMMON_USER | |
642 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
646 | .icache_bsize = 32, | 643 | .icache_bsize = 32, |
647 | .dcache_bsize = 32, | 644 | .dcache_bsize = 32, |
648 | .num_pmcs = 6, | 645 | .num_pmcs = 6, |
@@ -656,7 +653,8 @@ struct cpu_spec cpu_specs[] = { | |||
656 | .pvr_value = 0x80020100, | 653 | .pvr_value = 0x80020100, |
657 | .cpu_name = "7447/7457", | 654 | .cpu_name = "7447/7457", |
658 | .cpu_features = CPU_FTRS_7447_10, | 655 | .cpu_features = CPU_FTRS_7447_10, |
659 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 656 | .cpu_user_features = COMMON_USER | |
657 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
660 | .icache_bsize = 32, | 658 | .icache_bsize = 32, |
661 | .dcache_bsize = 32, | 659 | .dcache_bsize = 32, |
662 | .num_pmcs = 6, | 660 | .num_pmcs = 6, |
@@ -670,7 +668,8 @@ struct cpu_spec cpu_specs[] = { | |||
670 | .pvr_value = 0x80020101, | 668 | .pvr_value = 0x80020101, |
671 | .cpu_name = "7447/7457", | 669 | .cpu_name = "7447/7457", |
672 | .cpu_features = CPU_FTRS_7447_10, | 670 | .cpu_features = CPU_FTRS_7447_10, |
673 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 671 | .cpu_user_features = COMMON_USER | |
672 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
674 | .icache_bsize = 32, | 673 | .icache_bsize = 32, |
675 | .dcache_bsize = 32, | 674 | .dcache_bsize = 32, |
676 | .num_pmcs = 6, | 675 | .num_pmcs = 6, |
@@ -684,7 +683,7 @@ struct cpu_spec cpu_specs[] = { | |||
684 | .pvr_value = 0x80020000, | 683 | .pvr_value = 0x80020000, |
685 | .cpu_name = "7447/7457", | 684 | .cpu_name = "7447/7457", |
686 | .cpu_features = CPU_FTRS_7447, | 685 | .cpu_features = CPU_FTRS_7447, |
687 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 686 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, |
688 | .icache_bsize = 32, | 687 | .icache_bsize = 32, |
689 | .dcache_bsize = 32, | 688 | .dcache_bsize = 32, |
690 | .num_pmcs = 6, | 689 | .num_pmcs = 6, |
@@ -698,7 +697,8 @@ struct cpu_spec cpu_specs[] = { | |||
698 | .pvr_value = 0x80030000, | 697 | .pvr_value = 0x80030000, |
699 | .cpu_name = "7447A", | 698 | .cpu_name = "7447A", |
700 | .cpu_features = CPU_FTRS_7447A, | 699 | .cpu_features = CPU_FTRS_7447A, |
701 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 700 | .cpu_user_features = COMMON_USER | |
701 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
702 | .icache_bsize = 32, | 702 | .icache_bsize = 32, |
703 | .dcache_bsize = 32, | 703 | .dcache_bsize = 32, |
704 | .num_pmcs = 6, | 704 | .num_pmcs = 6, |
@@ -712,7 +712,8 @@ struct cpu_spec cpu_specs[] = { | |||
712 | .pvr_value = 0x80040000, | 712 | .pvr_value = 0x80040000, |
713 | .cpu_name = "7448", | 713 | .cpu_name = "7448", |
714 | .cpu_features = CPU_FTRS_7447A, | 714 | .cpu_features = CPU_FTRS_7447A, |
715 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | 715 | .cpu_user_features = COMMON_USER | |
716 | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, | ||
716 | .icache_bsize = 32, | 717 | .icache_bsize = 32, |
717 | .dcache_bsize = 32, | 718 | .dcache_bsize = 32, |
718 | .num_pmcs = 6, | 719 | .num_pmcs = 6, |
@@ -721,6 +722,18 @@ struct cpu_spec cpu_specs[] = { | |||
721 | .oprofile_type = PPC_OPROFILE_G4, | 722 | .oprofile_type = PPC_OPROFILE_G4, |
722 | .platform = "ppc7450", | 723 | .platform = "ppc7450", |
723 | }, | 724 | }, |
725 | { /* 8641 */ | ||
726 | .pvr_mask = 0xffffffff, | ||
727 | .pvr_value = 0x80040010, | ||
728 | .cpu_name = "8641", | ||
729 | .cpu_features = CPU_FTRS_7447A, | ||
730 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
731 | .icache_bsize = 32, | ||
732 | .dcache_bsize = 32, | ||
733 | .num_pmcs = 6, | ||
734 | .cpu_setup = __setup_cpu_745x | ||
735 | }, | ||
736 | |||
724 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ | 737 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ |
725 | .pvr_mask = 0x7fff0000, | 738 | .pvr_mask = 0x7fff0000, |
726 | .pvr_value = 0x00810000, | 739 | .pvr_value = 0x00810000, |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 778f22fd85d2..dbcb85994f46 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/elf.h> | 22 | #include <linux/elf.h> |
23 | #include <linux/elfcore.h> | 23 | #include <linux/elfcore.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/irq.h> | ||
25 | #include <linux/types.h> | 26 | #include <linux/types.h> |
26 | 27 | ||
27 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
@@ -174,6 +175,8 @@ static void crash_kexec_prepare_cpus(void) | |||
174 | 175 | ||
175 | void default_machine_crash_shutdown(struct pt_regs *regs) | 176 | void default_machine_crash_shutdown(struct pt_regs *regs) |
176 | { | 177 | { |
178 | unsigned int irq; | ||
179 | |||
177 | /* | 180 | /* |
178 | * This function is only called after the system | 181 | * This function is only called after the system |
179 | * has paniced or is otherwise in a critical state. | 182 | * has paniced or is otherwise in a critical state. |
@@ -186,6 +189,16 @@ void default_machine_crash_shutdown(struct pt_regs *regs) | |||
186 | */ | 189 | */ |
187 | local_irq_disable(); | 190 | local_irq_disable(); |
188 | 191 | ||
192 | for_each_irq(irq) { | ||
193 | struct irq_desc *desc = irq_descp(irq); | ||
194 | |||
195 | if (desc->status & IRQ_INPROGRESS) | ||
196 | desc->handler->end(irq); | ||
197 | |||
198 | if (!(desc->status & IRQ_DISABLED)) | ||
199 | desc->handler->disable(irq); | ||
200 | } | ||
201 | |||
189 | if (ppc_md.kexec_cpu_down) | 202 | if (ppc_md.kexec_cpu_down) |
190 | ppc_md.kexec_cpu_down(1, 0); | 203 | ppc_md.kexec_cpu_down(1, 0); |
191 | 204 | ||
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 764d07329716..371973be8d71 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -25,6 +25,11 @@ | |||
25 | #define DBG(fmt...) | 25 | #define DBG(fmt...) |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | void reserve_kdump_trampoline(void) | ||
29 | { | ||
30 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); | ||
31 | } | ||
32 | |||
28 | static void __init create_trampoline(unsigned long addr) | 33 | static void __init create_trampoline(unsigned long addr) |
29 | { | 34 | { |
30 | /* The maximum range of a single instruction branch, is the current | 35 | /* The maximum range of a single instruction branch, is the current |
@@ -39,11 +44,11 @@ static void __init create_trampoline(unsigned long addr) | |||
39 | create_branch(addr + 4, addr + PHYSICAL_START, 0); | 44 | create_branch(addr + 4, addr + PHYSICAL_START, 0); |
40 | } | 45 | } |
41 | 46 | ||
42 | void __init kdump_setup(void) | 47 | void __init setup_kdump_trampoline(void) |
43 | { | 48 | { |
44 | unsigned long i; | 49 | unsigned long i; |
45 | 50 | ||
46 | DBG(" -> kdump_setup()\n"); | 51 | DBG(" -> setup_kdump_trampoline()\n"); |
47 | 52 | ||
48 | for (i = KDUMP_TRAMPOLINE_START; i < KDUMP_TRAMPOLINE_END; i += 8) { | 53 | for (i = KDUMP_TRAMPOLINE_START; i < KDUMP_TRAMPOLINE_END; i += 8) { |
49 | create_trampoline(i); | 54 | create_trampoline(i); |
@@ -52,7 +57,7 @@ void __init kdump_setup(void) | |||
52 | create_trampoline(__pa(system_reset_fwnmi) - PHYSICAL_START); | 57 | create_trampoline(__pa(system_reset_fwnmi) - PHYSICAL_START); |
53 | create_trampoline(__pa(machine_check_fwnmi) - PHYSICAL_START); | 58 | create_trampoline(__pa(machine_check_fwnmi) - PHYSICAL_START); |
54 | 59 | ||
55 | DBG(" <- kdump_setup()\n"); | 60 | DBG(" <- setup_kdump_trampoline()\n"); |
56 | } | 61 | } |
57 | 62 | ||
58 | #ifdef CONFIG_PROC_VMCORE | 63 | #ifdef CONFIG_PROC_VMCORE |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 19ad5c6b1818..221062c960c9 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -57,6 +57,7 @@ system_call_common: | |||
57 | beq- 1f | 57 | beq- 1f |
58 | ld r1,PACAKSAVE(r13) | 58 | ld r1,PACAKSAVE(r13) |
59 | 1: std r10,0(r1) | 59 | 1: std r10,0(r1) |
60 | crclr so | ||
60 | std r11,_NIP(r1) | 61 | std r11,_NIP(r1) |
61 | std r12,_MSR(r1) | 62 | std r12,_MSR(r1) |
62 | std r0,GPR0(r1) | 63 | std r0,GPR0(r1) |
@@ -75,7 +76,6 @@ system_call_common: | |||
75 | std r11,GPR11(r1) | 76 | std r11,GPR11(r1) |
76 | std r11,GPR12(r1) | 77 | std r11,GPR12(r1) |
77 | std r9,GPR13(r1) | 78 | std r9,GPR13(r1) |
78 | crclr so | ||
79 | mfcr r9 | 79 | mfcr r9 |
80 | mflr r10 | 80 | mflr r10 |
81 | li r11,0xc01 | 81 | li r11,0xc01 |
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index 340730fb8c91..01f71200c603 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
@@ -72,7 +72,7 @@ _GLOBAL(load_up_fpu) | |||
72 | std r12,_MSR(r1) | 72 | std r12,_MSR(r1) |
73 | #endif | 73 | #endif |
74 | lfd fr0,THREAD_FPSCR(r5) | 74 | lfd fr0,THREAD_FPSCR(r5) |
75 | mtfsf 0xff,fr0 | 75 | MTFSF_L(fr0) |
76 | REST_32FPRS(0, r5) | 76 | REST_32FPRS(0, r5) |
77 | #ifndef CONFIG_SMP | 77 | #ifndef CONFIG_SMP |
78 | subi r4,r5,THREAD | 78 | subi r4,r5,THREAD |
@@ -127,7 +127,7 @@ _GLOBAL(giveup_fpu) | |||
127 | 127 | ||
128 | _GLOBAL(cvt_fd) | 128 | _GLOBAL(cvt_fd) |
129 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ | 129 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ |
130 | mtfsf 0xff,0 | 130 | MTFSF_L(0) |
131 | lfs 0,0(r3) | 131 | lfs 0,0(r3) |
132 | stfd 0,0(r4) | 132 | stfd 0,0(r4) |
133 | mffs 0 | 133 | mffs 0 |
@@ -136,7 +136,7 @@ _GLOBAL(cvt_fd) | |||
136 | 136 | ||
137 | _GLOBAL(cvt_df) | 137 | _GLOBAL(cvt_df) |
138 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ | 138 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ |
139 | mtfsf 0xff,0 | 139 | MTFSF_L(0) |
140 | lfd 0,0(r3) | 140 | lfd 0,0(r3) |
141 | stfs 0,0(r4) | 141 | stfs 0,0(r4) |
142 | mffs 0 | 142 | mffs 0 |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index a0579e859b21..b25b25902d15 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -973,6 +973,13 @@ __secondary_start_gemini: | |||
973 | b __secondary_start | 973 | b __secondary_start |
974 | #endif /* CONFIG_GEMINI */ | 974 | #endif /* CONFIG_GEMINI */ |
975 | 975 | ||
976 | .globl __secondary_start_mpc86xx | ||
977 | __secondary_start_mpc86xx: | ||
978 | mfspr r3, SPRN_PIR | ||
979 | stw r3, __secondary_hold_acknowledge@l(0) | ||
980 | mr r24, r3 /* cpu # */ | ||
981 | b __secondary_start | ||
982 | |||
976 | .globl __secondary_start_pmac_0 | 983 | .globl __secondary_start_pmac_0 |
977 | __secondary_start_pmac_0: | 984 | __secondary_start_pmac_0: |
978 | /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */ | 985 | /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */ |
@@ -1088,7 +1095,12 @@ load_up_mmu: | |||
1088 | LOAD_BAT(1,r3,r4,r5) | 1095 | LOAD_BAT(1,r3,r4,r5) |
1089 | LOAD_BAT(2,r3,r4,r5) | 1096 | LOAD_BAT(2,r3,r4,r5) |
1090 | LOAD_BAT(3,r3,r4,r5) | 1097 | LOAD_BAT(3,r3,r4,r5) |
1091 | 1098 | BEGIN_FTR_SECTION | |
1099 | LOAD_BAT(4,r3,r4,r5) | ||
1100 | LOAD_BAT(5,r3,r4,r5) | ||
1101 | LOAD_BAT(6,r3,r4,r5) | ||
1102 | LOAD_BAT(7,r3,r4,r5) | ||
1103 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_HIGH_BATS) | ||
1092 | blr | 1104 | blr |
1093 | 1105 | ||
1094 | /* | 1106 | /* |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index b7d140430a41..831acbdf2592 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -316,6 +316,21 @@ label##_pSeries: \ | |||
316 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 316 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ |
317 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 317 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) |
318 | 318 | ||
319 | #define HSTD_EXCEPTION_PSERIES(n, label) \ | ||
320 | . = n; \ | ||
321 | .globl label##_pSeries; \ | ||
322 | label##_pSeries: \ | ||
323 | HMT_MEDIUM; \ | ||
324 | mtspr SPRN_SPRG1,r20; /* save r20 */ \ | ||
325 | mfspr r20,SPRN_HSRR0; /* copy HSRR0 to SRR0 */ \ | ||
326 | mtspr SPRN_SRR0,r20; \ | ||
327 | mfspr r20,SPRN_HSRR1; /* copy HSRR0 to SRR0 */ \ | ||
328 | mtspr SPRN_SRR1,r20; \ | ||
329 | mfspr r20,SPRN_SPRG1; /* restore r20 */ \ | ||
330 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | ||
331 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | ||
332 | |||
333 | |||
319 | #define STD_EXCEPTION_ISERIES(n, label, area) \ | 334 | #define STD_EXCEPTION_ISERIES(n, label, area) \ |
320 | .globl label##_iSeries; \ | 335 | .globl label##_iSeries; \ |
321 | label##_iSeries: \ | 336 | label##_iSeries: \ |
@@ -544,8 +559,17 @@ system_call_pSeries: | |||
544 | 559 | ||
545 | STD_EXCEPTION_PSERIES(0xf20, altivec_unavailable) | 560 | STD_EXCEPTION_PSERIES(0xf20, altivec_unavailable) |
546 | 561 | ||
562 | #ifdef CONFIG_CBE_RAS | ||
563 | HSTD_EXCEPTION_PSERIES(0x1200, cbe_system_error) | ||
564 | #endif /* CONFIG_CBE_RAS */ | ||
547 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) | 565 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) |
566 | #ifdef CONFIG_CBE_RAS | ||
567 | HSTD_EXCEPTION_PSERIES(0x1600, cbe_maintenance) | ||
568 | #endif /* CONFIG_CBE_RAS */ | ||
548 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) | 569 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) |
570 | #ifdef CONFIG_CBE_RAS | ||
571 | HSTD_EXCEPTION_PSERIES(0x1800, cbe_thermal) | ||
572 | #endif /* CONFIG_CBE_RAS */ | ||
549 | 573 | ||
550 | . = 0x3000 | 574 | . = 0x3000 |
551 | 575 | ||
@@ -827,6 +851,11 @@ machine_check_common: | |||
827 | #else | 851 | #else |
828 | STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) | 852 | STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) |
829 | #endif | 853 | #endif |
854 | #ifdef CONFIG_CBE_RAS | ||
855 | STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception) | ||
856 | STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception) | ||
857 | STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception) | ||
858 | #endif /* CONFIG_CBE_RAS */ | ||
830 | 859 | ||
831 | /* | 860 | /* |
832 | * Here we have detected that the kernel stack pointer is bad. | 861 | * Here we have detected that the kernel stack pointer is bad. |
diff --git a/arch/powerpc/kernel/iomap.c b/arch/powerpc/kernel/iomap.c index fd8214caedee..a13a93dfc655 100644 --- a/arch/powerpc/kernel/iomap.c +++ b/arch/powerpc/kernel/iomap.c | |||
@@ -106,8 +106,6 @@ EXPORT_SYMBOL(iowrite32_rep); | |||
106 | 106 | ||
107 | void __iomem *ioport_map(unsigned long port, unsigned int len) | 107 | void __iomem *ioport_map(unsigned long port, unsigned int len) |
108 | { | 108 | { |
109 | if (!_IO_IS_VALID(port)) | ||
110 | return NULL; | ||
111 | return (void __iomem *) (port+pci_io_base); | 109 | return (void __iomem *) (port+pci_io_base); |
112 | } | 110 | } |
113 | 111 | ||
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 4eba60a32890..7cb77c20fc5d 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -418,10 +418,11 @@ void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
418 | * Build a iommu_table structure. This contains a bit map which | 418 | * Build a iommu_table structure. This contains a bit map which |
419 | * is used to manage allocation of the tce space. | 419 | * is used to manage allocation of the tce space. |
420 | */ | 420 | */ |
421 | struct iommu_table *iommu_init_table(struct iommu_table *tbl) | 421 | struct iommu_table *iommu_init_table(struct iommu_table *tbl, int nid) |
422 | { | 422 | { |
423 | unsigned long sz; | 423 | unsigned long sz; |
424 | static int welcomed = 0; | 424 | static int welcomed = 0; |
425 | struct page *page; | ||
425 | 426 | ||
426 | /* Set aside 1/4 of the table for large allocations. */ | 427 | /* Set aside 1/4 of the table for large allocations. */ |
427 | tbl->it_halfpoint = tbl->it_size * 3 / 4; | 428 | tbl->it_halfpoint = tbl->it_size * 3 / 4; |
@@ -429,10 +430,10 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl) | |||
429 | /* number of bytes needed for the bitmap */ | 430 | /* number of bytes needed for the bitmap */ |
430 | sz = (tbl->it_size + 7) >> 3; | 431 | sz = (tbl->it_size + 7) >> 3; |
431 | 432 | ||
432 | tbl->it_map = (unsigned long *)__get_free_pages(GFP_ATOMIC, get_order(sz)); | 433 | page = alloc_pages_node(nid, GFP_ATOMIC, get_order(sz)); |
433 | if (!tbl->it_map) | 434 | if (!page) |
434 | panic("iommu_init_table: Can't allocate %ld bytes\n", sz); | 435 | panic("iommu_init_table: Can't allocate %ld bytes\n", sz); |
435 | 436 | tbl->it_map = page_address(page); | |
436 | memset(tbl->it_map, 0, sz); | 437 | memset(tbl->it_map, 0, sz); |
437 | 438 | ||
438 | tbl->it_hint = 0; | 439 | tbl->it_hint = 0; |
@@ -536,11 +537,12 @@ void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, | |||
536 | * to the dma address (mapping) of the first page. | 537 | * to the dma address (mapping) of the first page. |
537 | */ | 538 | */ |
538 | void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | 539 | void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, |
539 | dma_addr_t *dma_handle, unsigned long mask, gfp_t flag) | 540 | dma_addr_t *dma_handle, unsigned long mask, gfp_t flag, int node) |
540 | { | 541 | { |
541 | void *ret = NULL; | 542 | void *ret = NULL; |
542 | dma_addr_t mapping; | 543 | dma_addr_t mapping; |
543 | unsigned int npages, order; | 544 | unsigned int npages, order; |
545 | struct page *page; | ||
544 | 546 | ||
545 | size = PAGE_ALIGN(size); | 547 | size = PAGE_ALIGN(size); |
546 | npages = size >> PAGE_SHIFT; | 548 | npages = size >> PAGE_SHIFT; |
@@ -560,9 +562,10 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | |||
560 | return NULL; | 562 | return NULL; |
561 | 563 | ||
562 | /* Alloc enough pages (and possibly more) */ | 564 | /* Alloc enough pages (and possibly more) */ |
563 | ret = (void *)__get_free_pages(flag, order); | 565 | page = alloc_pages_node(node, flag, order); |
564 | if (!ret) | 566 | if (!page) |
565 | return NULL; | 567 | return NULL; |
568 | ret = page_address(page); | ||
566 | memset(ret, 0, size); | 569 | memset(ret, 0, size); |
567 | 570 | ||
568 | /* Set up tces to cover the allocated range */ | 571 | /* Set up tces to cover the allocated range */ |
@@ -570,9 +573,9 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | |||
570 | mask >> PAGE_SHIFT, order); | 573 | mask >> PAGE_SHIFT, order); |
571 | if (mapping == DMA_ERROR_CODE) { | 574 | if (mapping == DMA_ERROR_CODE) { |
572 | free_pages((unsigned long)ret, order); | 575 | free_pages((unsigned long)ret, order); |
573 | ret = NULL; | 576 | return NULL; |
574 | } else | 577 | } |
575 | *dma_handle = mapping; | 578 | *dma_handle = mapping; |
576 | return ret; | 579 | return ret; |
577 | } | 580 | } |
578 | 581 | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 57d560c68897..bfcec4cc70a7 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <linux/cpumask.h> | 47 | #include <linux/cpumask.h> |
48 | #include <linux/profile.h> | 48 | #include <linux/profile.h> |
49 | #include <linux/bitops.h> | 49 | #include <linux/bitops.h> |
50 | #include <linux/pci.h> | ||
50 | 51 | ||
51 | #include <asm/uaccess.h> | 52 | #include <asm/uaccess.h> |
52 | #include <asm/system.h> | 53 | #include <asm/system.h> |
@@ -436,6 +437,30 @@ void do_softirq(void) | |||
436 | } | 437 | } |
437 | EXPORT_SYMBOL(do_softirq); | 438 | EXPORT_SYMBOL(do_softirq); |
438 | 439 | ||
440 | #ifdef CONFIG_PCI_MSI | ||
441 | int pci_enable_msi(struct pci_dev * pdev) | ||
442 | { | ||
443 | if (ppc_md.enable_msi) | ||
444 | return ppc_md.enable_msi(pdev); | ||
445 | else | ||
446 | return -1; | ||
447 | } | ||
448 | |||
449 | void pci_disable_msi(struct pci_dev * pdev) | ||
450 | { | ||
451 | if (ppc_md.disable_msi) | ||
452 | ppc_md.disable_msi(pdev); | ||
453 | } | ||
454 | |||
455 | void pci_scan_msi_device(struct pci_dev *dev) {} | ||
456 | int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) {return -1;} | ||
457 | void pci_disable_msix(struct pci_dev *dev) {} | ||
458 | void msi_remove_pci_irq_vectors(struct pci_dev *dev) {} | ||
459 | void disable_msi_mode(struct pci_dev *dev, int pos, int type) {} | ||
460 | void pci_no_msi(void) {} | ||
461 | |||
462 | #endif | ||
463 | |||
439 | #ifdef CONFIG_PPC64 | 464 | #ifdef CONFIG_PPC64 |
440 | static int __init setup_noirqdistrib(char *str) | 465 | static int __init setup_noirqdistrib(char *str) |
441 | { | 466 | { |
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 2cbde865d4f5..c02deaab26c7 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
@@ -521,10 +521,10 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf, | |||
521 | 521 | ||
522 | current_weight = (resource >> 5 * 8) & 0xFF; | 522 | current_weight = (resource >> 5 * 8) & 0xFF; |
523 | 523 | ||
524 | pr_debug("%s: current_entitled = %lu, current_weight = %lu\n", | 524 | pr_debug("%s: current_entitled = %lu, current_weight = %u\n", |
525 | __FUNCTION__, current_entitled, current_weight); | 525 | __FUNCTION__, current_entitled, current_weight); |
526 | 526 | ||
527 | pr_debug("%s: new_entitled = %lu, new_weight = %lu\n", | 527 | pr_debug("%s: new_entitled = %lu, new_weight = %u\n", |
528 | __FUNCTION__, *new_entitled_ptr, *new_weight_ptr); | 528 | __FUNCTION__, *new_entitled_ptr, *new_weight_ptr); |
529 | 529 | ||
530 | retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr, | 530 | retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr, |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index ee166c586642..a8fa04ef27cd 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/machdep.h> | 21 | #include <asm/machdep.h> |
22 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
23 | #include <asm/paca.h> | 23 | #include <asm/paca.h> |
24 | #include <asm/lmb.h> | ||
24 | #include <asm/mmu.h> | 25 | #include <asm/mmu.h> |
25 | #include <asm/sections.h> /* _end */ | 26 | #include <asm/sections.h> /* _end */ |
26 | #include <asm/prom.h> | 27 | #include <asm/prom.h> |
@@ -335,7 +336,105 @@ static void __init export_htab_values(void) | |||
335 | of_node_put(node); | 336 | of_node_put(node); |
336 | } | 337 | } |
337 | 338 | ||
339 | static struct property crashk_base_prop = { | ||
340 | .name = "linux,crashkernel-base", | ||
341 | .length = sizeof(unsigned long), | ||
342 | .value = (unsigned char *)&crashk_res.start, | ||
343 | }; | ||
344 | |||
345 | static unsigned long crashk_size; | ||
346 | |||
347 | static struct property crashk_size_prop = { | ||
348 | .name = "linux,crashkernel-size", | ||
349 | .length = sizeof(unsigned long), | ||
350 | .value = (unsigned char *)&crashk_size, | ||
351 | }; | ||
352 | |||
353 | static void __init export_crashk_values(void) | ||
354 | { | ||
355 | struct device_node *node; | ||
356 | struct property *prop; | ||
357 | |||
358 | node = of_find_node_by_path("/chosen"); | ||
359 | if (!node) | ||
360 | return; | ||
361 | |||
362 | /* There might be existing crash kernel properties, but we can't | ||
363 | * be sure what's in them, so remove them. */ | ||
364 | prop = of_find_property(node, "linux,crashkernel-base", NULL); | ||
365 | if (prop) | ||
366 | prom_remove_property(node, prop); | ||
367 | |||
368 | prop = of_find_property(node, "linux,crashkernel-size", NULL); | ||
369 | if (prop) | ||
370 | prom_remove_property(node, prop); | ||
371 | |||
372 | if (crashk_res.start != 0) { | ||
373 | prom_add_property(node, &crashk_base_prop); | ||
374 | crashk_size = crashk_res.end - crashk_res.start + 1; | ||
375 | prom_add_property(node, &crashk_size_prop); | ||
376 | } | ||
377 | |||
378 | of_node_put(node); | ||
379 | } | ||
380 | |||
338 | void __init kexec_setup(void) | 381 | void __init kexec_setup(void) |
339 | { | 382 | { |
340 | export_htab_values(); | 383 | export_htab_values(); |
384 | export_crashk_values(); | ||
385 | } | ||
386 | |||
387 | static int __init early_parse_crashk(char *p) | ||
388 | { | ||
389 | unsigned long size; | ||
390 | |||
391 | if (!p) | ||
392 | return 1; | ||
393 | |||
394 | size = memparse(p, &p); | ||
395 | |||
396 | if (*p == '@') | ||
397 | crashk_res.start = memparse(p + 1, &p); | ||
398 | else | ||
399 | crashk_res.start = KDUMP_KERNELBASE; | ||
400 | |||
401 | crashk_res.end = crashk_res.start + size - 1; | ||
402 | |||
403 | return 0; | ||
404 | } | ||
405 | early_param("crashkernel", early_parse_crashk); | ||
406 | |||
407 | void __init reserve_crashkernel(void) | ||
408 | { | ||
409 | unsigned long size; | ||
410 | |||
411 | if (crashk_res.start == 0) | ||
412 | return; | ||
413 | |||
414 | /* We might have got these values via the command line or the | ||
415 | * device tree, either way sanitise them now. */ | ||
416 | |||
417 | size = crashk_res.end - crashk_res.start + 1; | ||
418 | |||
419 | if (crashk_res.start != KDUMP_KERNELBASE) | ||
420 | printk("Crash kernel location must be 0x%x\n", | ||
421 | KDUMP_KERNELBASE); | ||
422 | |||
423 | crashk_res.start = KDUMP_KERNELBASE; | ||
424 | size = PAGE_ALIGN(size); | ||
425 | crashk_res.end = crashk_res.start + size - 1; | ||
426 | |||
427 | /* Crash kernel trumps memory limit */ | ||
428 | if (memory_limit && memory_limit <= crashk_res.end) { | ||
429 | memory_limit = crashk_res.end + 1; | ||
430 | printk("Adjusted memory limit for crashkernel, now 0x%lx\n", | ||
431 | memory_limit); | ||
432 | } | ||
433 | |||
434 | lmb_reserve(crashk_res.start, size); | ||
435 | } | ||
436 | |||
437 | int overlaps_crashkernel(unsigned long start, unsigned long size) | ||
438 | { | ||
439 | return (start + size) > crashk_res.start && start <= crashk_res.end; | ||
341 | } | 440 | } |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index be982023409e..01d3916c4cb1 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -216,7 +216,7 @@ _GLOBAL(call_setup_cpu) | |||
216 | lwz r4,0(r4) | 216 | lwz r4,0(r4) |
217 | add r4,r4,r3 | 217 | add r4,r4,r3 |
218 | lwz r5,CPU_SPEC_SETUP(r4) | 218 | lwz r5,CPU_SPEC_SETUP(r4) |
219 | cmpi 0,r5,0 | 219 | cmpwi 0,r5,0 |
220 | add r5,r5,r3 | 220 | add r5,r5,r3 |
221 | beqlr | 221 | beqlr |
222 | mtctr r5 | 222 | mtctr r5 |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 2778cce058e2..e8883d42c43c 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -482,7 +482,9 @@ _GLOBAL(identify_cpu) | |||
482 | sub r0,r3,r5 | 482 | sub r0,r3,r5 |
483 | std r0,0(r4) | 483 | std r0,0(r4) |
484 | ld r4,CPU_SPEC_SETUP(r3) | 484 | ld r4,CPU_SPEC_SETUP(r3) |
485 | cmpdi 0,r4,0 | ||
485 | add r4,r4,r5 | 486 | add r4,r4,r5 |
487 | beqlr | ||
486 | ld r4,0(r4) | 488 | ld r4,0(r4) |
487 | add r4,r4,r5 | 489 | add r4,r4,r5 |
488 | mtctr r4 | 490 | mtctr r4 |
@@ -768,9 +770,6 @@ _GLOBAL(giveup_altivec) | |||
768 | 770 | ||
769 | #endif /* CONFIG_ALTIVEC */ | 771 | #endif /* CONFIG_ALTIVEC */ |
770 | 772 | ||
771 | _GLOBAL(__setup_cpu_power3) | ||
772 | blr | ||
773 | |||
774 | _GLOBAL(execve) | 773 | _GLOBAL(execve) |
775 | li r0,__NR_execve | 774 | li r0,__NR_execve |
776 | sc | 775 | sc |
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c index ada50aa5b600..6960f090991e 100644 --- a/arch/powerpc/kernel/nvram_64.c +++ b/arch/powerpc/kernel/nvram_64.c | |||
@@ -204,7 +204,7 @@ static void nvram_print_partitions(char * label) | |||
204 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); | 204 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); |
205 | list_for_each(p, &nvram_part->partition) { | 205 | list_for_each(p, &nvram_part->partition) { |
206 | tmp_part = list_entry(p, struct nvram_partition, partition); | 206 | tmp_part = list_entry(p, struct nvram_partition, partition); |
207 | printk(KERN_WARNING "%d \t%02x\t%02x\t%d\t%s\n", | 207 | printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%s\n", |
208 | tmp_part->index, tmp_part->header.signature, | 208 | tmp_part->index, tmp_part->header.signature, |
209 | tmp_part->header.checksum, tmp_part->header.length, | 209 | tmp_part->header.checksum, tmp_part->header.length, |
210 | tmp_part->header.name); | 210 | tmp_part->header.name); |
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index b129d2e4b759..c858eb4bef17 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c | |||
@@ -1113,9 +1113,10 @@ check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga) | |||
1113 | int i; | 1113 | int i; |
1114 | int rc = 0; | 1114 | int rc = 0; |
1115 | 1115 | ||
1116 | #define push_end(res, size) do { unsigned long __sz = (size) ; \ | 1116 | #define push_end(res, mask) do { \ |
1117 | res->end = ((res->end + __sz) / (__sz + 1)) * (__sz + 1) + __sz; \ | 1117 | BUG_ON((mask+1) & mask); \ |
1118 | } while (0) | 1118 | res->end = (res->end + mask) | mask; \ |
1119 | } while (0) | ||
1119 | 1120 | ||
1120 | list_for_each_entry(dev, &bus->devices, bus_list) { | 1121 | list_for_each_entry(dev, &bus->devices, bus_list) { |
1121 | u16 class = dev->class >> 8; | 1122 | u16 class = dev->class >> 8; |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 4c4449be81ce..5ad87c426bed 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -42,14 +42,6 @@ | |||
42 | unsigned long pci_probe_only = 1; | 42 | unsigned long pci_probe_only = 1; |
43 | int pci_assign_all_buses = 0; | 43 | int pci_assign_all_buses = 0; |
44 | 44 | ||
45 | /* | ||
46 | * legal IO pages under MAX_ISA_PORT. This is to ensure we don't touch | ||
47 | * devices we don't have access to. | ||
48 | */ | ||
49 | unsigned long io_page_mask; | ||
50 | |||
51 | EXPORT_SYMBOL(io_page_mask); | ||
52 | |||
53 | #ifdef CONFIG_PPC_MULTIPLATFORM | 45 | #ifdef CONFIG_PPC_MULTIPLATFORM |
54 | static void fixup_resource(struct resource *res, struct pci_dev *dev); | 46 | static void fixup_resource(struct resource *res, struct pci_dev *dev); |
55 | static void do_bus_setup(struct pci_bus *bus); | 47 | static void do_bus_setup(struct pci_bus *bus); |
@@ -235,8 +227,10 @@ struct pci_controller * pcibios_alloc_controller(struct device_node *dev) | |||
235 | pci_setup_pci_controller(phb); | 227 | pci_setup_pci_controller(phb); |
236 | phb->arch_data = dev; | 228 | phb->arch_data = dev; |
237 | phb->is_dynamic = mem_init_done; | 229 | phb->is_dynamic = mem_init_done; |
238 | if (dev) | 230 | if (dev) { |
231 | PHB_SET_NODE(phb, of_node_to_nid(dev)); | ||
239 | add_linux_pci_domain(dev, phb); | 232 | add_linux_pci_domain(dev, phb); |
233 | } | ||
240 | return phb; | 234 | return phb; |
241 | } | 235 | } |
242 | 236 | ||
@@ -396,7 +390,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node, | |||
396 | 390 | ||
397 | dev->current_state = 4; /* unknown power state */ | 391 | dev->current_state = 4; /* unknown power state */ |
398 | 392 | ||
399 | if (!strcmp(type, "pci")) { | 393 | if (!strcmp(type, "pci") || !strcmp(type, "pciex")) { |
400 | /* a PCI-PCI bridge */ | 394 | /* a PCI-PCI bridge */ |
401 | dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; | 395 | dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; |
402 | dev->rom_base_reg = PCI_ROM_ADDRESS1; | 396 | dev->rom_base_reg = PCI_ROM_ADDRESS1; |
@@ -605,7 +599,7 @@ static int __init pcibios_init(void) | |||
605 | iSeries_pcibios_init(); | 599 | iSeries_pcibios_init(); |
606 | #endif | 600 | #endif |
607 | 601 | ||
608 | printk("PCI: Probing PCI hardware\n"); | 602 | printk(KERN_DEBUG "PCI: Probing PCI hardware\n"); |
609 | 603 | ||
610 | /* Scan all of the recorded PCI controllers. */ | 604 | /* Scan all of the recorded PCI controllers. */ |
611 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { | 605 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { |
@@ -630,14 +624,14 @@ static int __init pcibios_init(void) | |||
630 | /* Cache the location of the ISA bridge (if we have one) */ | 624 | /* Cache the location of the ISA bridge (if we have one) */ |
631 | ppc64_isabridge_dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); | 625 | ppc64_isabridge_dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); |
632 | if (ppc64_isabridge_dev != NULL) | 626 | if (ppc64_isabridge_dev != NULL) |
633 | printk("ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); | 627 | printk(KERN_DEBUG "ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); |
634 | 628 | ||
635 | #ifdef CONFIG_PPC_MULTIPLATFORM | 629 | #ifdef CONFIG_PPC_MULTIPLATFORM |
636 | /* map in PCI I/O space */ | 630 | /* map in PCI I/O space */ |
637 | phbs_remap_io(); | 631 | phbs_remap_io(); |
638 | #endif | 632 | #endif |
639 | 633 | ||
640 | printk("PCI: Probing PCI hardware done\n"); | 634 | printk(KERN_DEBUG "PCI: Probing PCI hardware done\n"); |
641 | 635 | ||
642 | return 0; | 636 | return 0; |
643 | } | 637 | } |
@@ -804,7 +798,7 @@ static pgprot_t __pci_mmap_set_pgprot(struct pci_dev *dev, struct resource *rp, | |||
804 | else | 798 | else |
805 | prot |= _PAGE_GUARDED; | 799 | prot |= _PAGE_GUARDED; |
806 | 800 | ||
807 | printk("PCI map for %s:%lx, prot: %lx\n", pci_name(dev), rp->start, | 801 | printk(KERN_DEBUG "PCI map for %s:%lx, prot: %lx\n", pci_name(dev), rp->start, |
808 | prot); | 802 | prot); |
809 | 803 | ||
810 | return __pgprot(prot); | 804 | return __pgprot(prot); |
@@ -894,8 +888,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
894 | return ret; | 888 | return ret; |
895 | } | 889 | } |
896 | 890 | ||
897 | #ifdef CONFIG_PPC_MULTIPLATFORM | 891 | static ssize_t pci_show_devspec(struct device *dev, |
898 | static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf) | 892 | struct device_attribute *attr, char *buf) |
899 | { | 893 | { |
900 | struct pci_dev *pdev; | 894 | struct pci_dev *pdev; |
901 | struct device_node *np; | 895 | struct device_node *np; |
@@ -907,13 +901,10 @@ static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *att | |||
907 | return sprintf(buf, "%s", np->full_name); | 901 | return sprintf(buf, "%s", np->full_name); |
908 | } | 902 | } |
909 | static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); | 903 | static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); |
910 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||
911 | 904 | ||
912 | void pcibios_add_platform_entries(struct pci_dev *pdev) | 905 | void pcibios_add_platform_entries(struct pci_dev *pdev) |
913 | { | 906 | { |
914 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
915 | device_create_file(&pdev->dev, &dev_attr_devspec); | 907 | device_create_file(&pdev->dev, &dev_attr_devspec); |
916 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||
917 | } | 908 | } |
918 | 909 | ||
919 | #ifdef CONFIG_PPC_MULTIPLATFORM | 910 | #ifdef CONFIG_PPC_MULTIPLATFORM |
@@ -1104,8 +1095,6 @@ void __init pci_setup_phb_io(struct pci_controller *hose, int primary) | |||
1104 | pci_process_ISA_OF_ranges(isa_dn, hose->io_base_phys, | 1095 | pci_process_ISA_OF_ranges(isa_dn, hose->io_base_phys, |
1105 | hose->io_base_virt); | 1096 | hose->io_base_virt); |
1106 | of_node_put(isa_dn); | 1097 | of_node_put(isa_dn); |
1107 | /* Allow all IO */ | ||
1108 | io_page_mask = -1; | ||
1109 | } | 1098 | } |
1110 | } | 1099 | } |
1111 | 1100 | ||
@@ -1212,7 +1201,7 @@ int remap_bus_range(struct pci_bus *bus) | |||
1212 | return 1; | 1201 | return 1; |
1213 | if (start_phys == 0) | 1202 | if (start_phys == 0) |
1214 | return 1; | 1203 | return 1; |
1215 | printk("mapping IO %lx -> %lx, size: %lx\n", start_phys, start_virt, size); | 1204 | printk(KERN_DEBUG "mapping IO %lx -> %lx, size: %lx\n", start_phys, start_virt, size); |
1216 | if (__ioremap_explicit(start_phys, start_virt, size, | 1205 | if (__ioremap_explicit(start_phys, start_virt, size, |
1217 | _PAGE_NO_CACHE | _PAGE_GUARDED)) | 1206 | _PAGE_NO_CACHE | _PAGE_GUARDED)) |
1218 | return 1; | 1207 | return 1; |
@@ -1232,27 +1221,13 @@ static void phbs_remap_io(void) | |||
1232 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) | 1221 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) |
1233 | { | 1222 | { |
1234 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | 1223 | struct pci_controller *hose = pci_bus_to_host(dev->bus); |
1235 | unsigned long start, end, mask, offset; | 1224 | unsigned long offset; |
1236 | 1225 | ||
1237 | if (res->flags & IORESOURCE_IO) { | 1226 | if (res->flags & IORESOURCE_IO) { |
1238 | offset = (unsigned long)hose->io_base_virt - pci_io_base; | 1227 | offset = (unsigned long)hose->io_base_virt - pci_io_base; |
1239 | 1228 | ||
1240 | start = res->start += offset; | 1229 | res->start += offset; |
1241 | end = res->end += offset; | 1230 | res->end += offset; |
1242 | |||
1243 | /* Need to allow IO access to pages that are in the | ||
1244 | ISA range */ | ||
1245 | if (start < MAX_ISA_PORT) { | ||
1246 | if (end > MAX_ISA_PORT) | ||
1247 | end = MAX_ISA_PORT; | ||
1248 | |||
1249 | start >>= PAGE_SHIFT; | ||
1250 | end >>= PAGE_SHIFT; | ||
1251 | |||
1252 | /* get the range of pages for the map */ | ||
1253 | mask = ((1 << (end+1)) - 1) ^ ((1 << start) - 1); | ||
1254 | io_page_mask |= mask; | ||
1255 | } | ||
1256 | } else if (res->flags & IORESOURCE_MEM) { | 1231 | } else if (res->flags & IORESOURCE_MEM) { |
1257 | res->start += hose->pci_mem_offset; | 1232 | res->start += hose->pci_mem_offset; |
1258 | res->end += hose->pci_mem_offset; | 1233 | res->end += hose->pci_mem_offset; |
@@ -1442,3 +1417,12 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus, | |||
1442 | 1417 | ||
1443 | return -EOPNOTSUPP; | 1418 | return -EOPNOTSUPP; |
1444 | } | 1419 | } |
1420 | |||
1421 | #ifdef CONFIG_NUMA | ||
1422 | int pcibus_to_node(struct pci_bus *bus) | ||
1423 | { | ||
1424 | struct pci_controller *phb = pci_bus_to_host(bus); | ||
1425 | return phb->node; | ||
1426 | } | ||
1427 | EXPORT_SYMBOL(pcibus_to_node); | ||
1428 | #endif | ||
diff --git a/arch/powerpc/kernel/pci_direct_iommu.c b/arch/powerpc/kernel/pci_direct_iommu.c index e1a32f802c0b..72ce082ce738 100644 --- a/arch/powerpc/kernel/pci_direct_iommu.c +++ b/arch/powerpc/kernel/pci_direct_iommu.c | |||
@@ -82,13 +82,17 @@ static int pci_direct_dma_supported(struct device *dev, u64 mask) | |||
82 | return mask < 0x100000000ull; | 82 | return mask < 0x100000000ull; |
83 | } | 83 | } |
84 | 84 | ||
85 | static struct dma_mapping_ops pci_direct_ops = { | ||
86 | .alloc_coherent = pci_direct_alloc_coherent, | ||
87 | .free_coherent = pci_direct_free_coherent, | ||
88 | .map_single = pci_direct_map_single, | ||
89 | .unmap_single = pci_direct_unmap_single, | ||
90 | .map_sg = pci_direct_map_sg, | ||
91 | .unmap_sg = pci_direct_unmap_sg, | ||
92 | .dma_supported = pci_direct_dma_supported, | ||
93 | }; | ||
94 | |||
85 | void __init pci_direct_iommu_init(void) | 95 | void __init pci_direct_iommu_init(void) |
86 | { | 96 | { |
87 | pci_dma_ops.alloc_coherent = pci_direct_alloc_coherent; | 97 | pci_dma_ops = pci_direct_ops; |
88 | pci_dma_ops.free_coherent = pci_direct_free_coherent; | ||
89 | pci_dma_ops.map_single = pci_direct_map_single; | ||
90 | pci_dma_ops.unmap_single = pci_direct_unmap_single; | ||
91 | pci_dma_ops.map_sg = pci_direct_map_sg; | ||
92 | pci_dma_ops.unmap_sg = pci_direct_unmap_sg; | ||
93 | pci_dma_ops.dma_supported = pci_direct_dma_supported; | ||
94 | } | 98 | } |
diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c index 12c4c9e9bbc7..1c18953514c3 100644 --- a/arch/powerpc/kernel/pci_dn.c +++ b/arch/powerpc/kernel/pci_dn.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/pci-bridge.h> | 31 | #include <asm/pci-bridge.h> |
32 | #include <asm/pSeries_reconfig.h> | 32 | #include <asm/pSeries_reconfig.h> |
33 | #include <asm/ppc-pci.h> | 33 | #include <asm/ppc-pci.h> |
34 | #include <asm/firmware.h> | ||
34 | 35 | ||
35 | /* | 36 | /* |
36 | * Traverse_func that inits the PCI fields of the device node. | 37 | * Traverse_func that inits the PCI fields of the device node. |
@@ -59,6 +60,11 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data) | |||
59 | pdn->busno = (regs[0] >> 16) & 0xff; | 60 | pdn->busno = (regs[0] >> 16) & 0xff; |
60 | pdn->devfn = (regs[0] >> 8) & 0xff; | 61 | pdn->devfn = (regs[0] >> 8) & 0xff; |
61 | } | 62 | } |
63 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
64 | u32 *busp = (u32 *)get_property(dn, "linux,subbus", NULL); | ||
65 | if (busp) | ||
66 | pdn->bussubno = *busp; | ||
67 | } | ||
62 | 68 | ||
63 | pdn->pci_ext_config_space = (type && *type == 1); | 69 | pdn->pci_ext_config_space = (type && *type == 1); |
64 | return NULL; | 70 | return NULL; |
diff --git a/arch/powerpc/kernel/pci_iommu.c b/arch/powerpc/kernel/pci_iommu.c index c1d95e14bbed..0688b2534acb 100644 --- a/arch/powerpc/kernel/pci_iommu.c +++ b/arch/powerpc/kernel/pci_iommu.c | |||
@@ -44,16 +44,16 @@ | |||
44 | */ | 44 | */ |
45 | #define PCI_GET_DN(dev) ((struct device_node *)((dev)->sysdata)) | 45 | #define PCI_GET_DN(dev) ((struct device_node *)((dev)->sysdata)) |
46 | 46 | ||
47 | static inline struct iommu_table *devnode_table(struct device *dev) | 47 | static inline struct iommu_table *device_to_table(struct device *hwdev) |
48 | { | 48 | { |
49 | struct pci_dev *pdev; | 49 | struct pci_dev *pdev; |
50 | 50 | ||
51 | if (!dev) { | 51 | if (!hwdev) { |
52 | pdev = ppc64_isabridge_dev; | 52 | pdev = ppc64_isabridge_dev; |
53 | if (!pdev) | 53 | if (!pdev) |
54 | return NULL; | 54 | return NULL; |
55 | } else | 55 | } else |
56 | pdev = to_pci_dev(dev); | 56 | pdev = to_pci_dev(hwdev); |
57 | 57 | ||
58 | return PCI_DN(PCI_GET_DN(pdev))->iommu_table; | 58 | return PCI_DN(PCI_GET_DN(pdev))->iommu_table; |
59 | } | 59 | } |
@@ -85,14 +85,15 @@ static inline unsigned long device_to_mask(struct device *hwdev) | |||
85 | static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size, | 85 | static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size, |
86 | dma_addr_t *dma_handle, gfp_t flag) | 86 | dma_addr_t *dma_handle, gfp_t flag) |
87 | { | 87 | { |
88 | return iommu_alloc_coherent(devnode_table(hwdev), size, dma_handle, | 88 | return iommu_alloc_coherent(device_to_table(hwdev), size, dma_handle, |
89 | device_to_mask(hwdev), flag); | 89 | device_to_mask(hwdev), flag, |
90 | pcibus_to_node(to_pci_dev(hwdev)->bus)); | ||
90 | } | 91 | } |
91 | 92 | ||
92 | static void pci_iommu_free_coherent(struct device *hwdev, size_t size, | 93 | static void pci_iommu_free_coherent(struct device *hwdev, size_t size, |
93 | void *vaddr, dma_addr_t dma_handle) | 94 | void *vaddr, dma_addr_t dma_handle) |
94 | { | 95 | { |
95 | iommu_free_coherent(devnode_table(hwdev), size, vaddr, dma_handle); | 96 | iommu_free_coherent(device_to_table(hwdev), size, vaddr, dma_handle); |
96 | } | 97 | } |
97 | 98 | ||
98 | /* Creates TCEs for a user provided buffer. The user buffer must be | 99 | /* Creates TCEs for a user provided buffer. The user buffer must be |
@@ -104,7 +105,7 @@ static void pci_iommu_free_coherent(struct device *hwdev, size_t size, | |||
104 | static dma_addr_t pci_iommu_map_single(struct device *hwdev, void *vaddr, | 105 | static dma_addr_t pci_iommu_map_single(struct device *hwdev, void *vaddr, |
105 | size_t size, enum dma_data_direction direction) | 106 | size_t size, enum dma_data_direction direction) |
106 | { | 107 | { |
107 | return iommu_map_single(devnode_table(hwdev), vaddr, size, | 108 | return iommu_map_single(device_to_table(hwdev), vaddr, size, |
108 | device_to_mask(hwdev), direction); | 109 | device_to_mask(hwdev), direction); |
109 | } | 110 | } |
110 | 111 | ||
@@ -112,27 +113,27 @@ static dma_addr_t pci_iommu_map_single(struct device *hwdev, void *vaddr, | |||
112 | static void pci_iommu_unmap_single(struct device *hwdev, dma_addr_t dma_handle, | 113 | static void pci_iommu_unmap_single(struct device *hwdev, dma_addr_t dma_handle, |
113 | size_t size, enum dma_data_direction direction) | 114 | size_t size, enum dma_data_direction direction) |
114 | { | 115 | { |
115 | iommu_unmap_single(devnode_table(hwdev), dma_handle, size, direction); | 116 | iommu_unmap_single(device_to_table(hwdev), dma_handle, size, direction); |
116 | } | 117 | } |
117 | 118 | ||
118 | 119 | ||
119 | static int pci_iommu_map_sg(struct device *pdev, struct scatterlist *sglist, | 120 | static int pci_iommu_map_sg(struct device *pdev, struct scatterlist *sglist, |
120 | int nelems, enum dma_data_direction direction) | 121 | int nelems, enum dma_data_direction direction) |
121 | { | 122 | { |
122 | return iommu_map_sg(pdev, devnode_table(pdev), sglist, | 123 | return iommu_map_sg(pdev, device_to_table(pdev), sglist, |
123 | nelems, device_to_mask(pdev), direction); | 124 | nelems, device_to_mask(pdev), direction); |
124 | } | 125 | } |
125 | 126 | ||
126 | static void pci_iommu_unmap_sg(struct device *pdev, struct scatterlist *sglist, | 127 | static void pci_iommu_unmap_sg(struct device *pdev, struct scatterlist *sglist, |
127 | int nelems, enum dma_data_direction direction) | 128 | int nelems, enum dma_data_direction direction) |
128 | { | 129 | { |
129 | iommu_unmap_sg(devnode_table(pdev), sglist, nelems, direction); | 130 | iommu_unmap_sg(device_to_table(pdev), sglist, nelems, direction); |
130 | } | 131 | } |
131 | 132 | ||
132 | /* We support DMA to/from any memory page via the iommu */ | 133 | /* We support DMA to/from any memory page via the iommu */ |
133 | static int pci_iommu_dma_supported(struct device *dev, u64 mask) | 134 | static int pci_iommu_dma_supported(struct device *dev, u64 mask) |
134 | { | 135 | { |
135 | struct iommu_table *tbl = devnode_table(dev); | 136 | struct iommu_table *tbl = device_to_table(dev); |
136 | 137 | ||
137 | if (!tbl || tbl->it_offset > mask) { | 138 | if (!tbl || tbl->it_offset > mask) { |
138 | printk(KERN_INFO "Warning: IOMMU table offset too big for device mask\n"); | 139 | printk(KERN_INFO "Warning: IOMMU table offset too big for device mask\n"); |
@@ -147,13 +148,17 @@ static int pci_iommu_dma_supported(struct device *dev, u64 mask) | |||
147 | return 1; | 148 | return 1; |
148 | } | 149 | } |
149 | 150 | ||
151 | struct dma_mapping_ops pci_iommu_ops = { | ||
152 | .alloc_coherent = pci_iommu_alloc_coherent, | ||
153 | .free_coherent = pci_iommu_free_coherent, | ||
154 | .map_single = pci_iommu_map_single, | ||
155 | .unmap_single = pci_iommu_unmap_single, | ||
156 | .map_sg = pci_iommu_map_sg, | ||
157 | .unmap_sg = pci_iommu_unmap_sg, | ||
158 | .dma_supported = pci_iommu_dma_supported, | ||
159 | }; | ||
160 | |||
150 | void pci_iommu_init(void) | 161 | void pci_iommu_init(void) |
151 | { | 162 | { |
152 | pci_dma_ops.alloc_coherent = pci_iommu_alloc_coherent; | 163 | pci_dma_ops = pci_iommu_ops; |
153 | pci_dma_ops.free_coherent = pci_iommu_free_coherent; | ||
154 | pci_dma_ops.map_single = pci_iommu_map_single; | ||
155 | pci_dma_ops.unmap_single = pci_iommu_unmap_single; | ||
156 | pci_dma_ops.map_sg = pci_iommu_map_sg; | ||
157 | pci_dma_ops.unmap_sg = pci_iommu_unmap_sg; | ||
158 | pci_dma_ops.dma_supported = pci_iommu_dma_supported; | ||
159 | } | 164 | } |
diff --git a/arch/powerpc/kernel/proc_ppc64.c b/arch/powerpc/kernel/proc_ppc64.c index 3c2cf661f6d9..2b87f82df135 100644 --- a/arch/powerpc/kernel/proc_ppc64.c +++ b/arch/powerpc/kernel/proc_ppc64.c | |||
@@ -52,7 +52,7 @@ static int __init proc_ppc64_create(void) | |||
52 | if (!root) | 52 | if (!root) |
53 | return 1; | 53 | return 1; |
54 | 54 | ||
55 | if (!machine_is(pseries) && !machine_is(cell)) | 55 | if (!of_find_node_by_path("/rtas")) |
56 | return 0; | 56 | return 0; |
57 | 57 | ||
58 | if (!proc_mkdir("rtas", root)) | 58 | if (!proc_mkdir("rtas", root)) |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 2dd47d2dd998..e4732459c485 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -708,6 +708,61 @@ int get_fpexc_mode(struct task_struct *tsk, unsigned long adr) | |||
708 | return put_user(val, (unsigned int __user *) adr); | 708 | return put_user(val, (unsigned int __user *) adr); |
709 | } | 709 | } |
710 | 710 | ||
711 | int set_endian(struct task_struct *tsk, unsigned int val) | ||
712 | { | ||
713 | struct pt_regs *regs = tsk->thread.regs; | ||
714 | |||
715 | if ((val == PR_ENDIAN_LITTLE && !cpu_has_feature(CPU_FTR_REAL_LE)) || | ||
716 | (val == PR_ENDIAN_PPC_LITTLE && !cpu_has_feature(CPU_FTR_PPC_LE))) | ||
717 | return -EINVAL; | ||
718 | |||
719 | if (regs == NULL) | ||
720 | return -EINVAL; | ||
721 | |||
722 | if (val == PR_ENDIAN_BIG) | ||
723 | regs->msr &= ~MSR_LE; | ||
724 | else if (val == PR_ENDIAN_LITTLE || val == PR_ENDIAN_PPC_LITTLE) | ||
725 | regs->msr |= MSR_LE; | ||
726 | else | ||
727 | return -EINVAL; | ||
728 | |||
729 | return 0; | ||
730 | } | ||
731 | |||
732 | int get_endian(struct task_struct *tsk, unsigned long adr) | ||
733 | { | ||
734 | struct pt_regs *regs = tsk->thread.regs; | ||
735 | unsigned int val; | ||
736 | |||
737 | if (!cpu_has_feature(CPU_FTR_PPC_LE) && | ||
738 | !cpu_has_feature(CPU_FTR_REAL_LE)) | ||
739 | return -EINVAL; | ||
740 | |||
741 | if (regs == NULL) | ||
742 | return -EINVAL; | ||
743 | |||
744 | if (regs->msr & MSR_LE) { | ||
745 | if (cpu_has_feature(CPU_FTR_REAL_LE)) | ||
746 | val = PR_ENDIAN_LITTLE; | ||
747 | else | ||
748 | val = PR_ENDIAN_PPC_LITTLE; | ||
749 | } else | ||
750 | val = PR_ENDIAN_BIG; | ||
751 | |||
752 | return put_user(val, (unsigned int __user *)adr); | ||
753 | } | ||
754 | |||
755 | int set_unalign_ctl(struct task_struct *tsk, unsigned int val) | ||
756 | { | ||
757 | tsk->thread.align_ctl = val; | ||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | int get_unalign_ctl(struct task_struct *tsk, unsigned long adr) | ||
762 | { | ||
763 | return put_user(tsk->thread.align_ctl, (unsigned int __user *)adr); | ||
764 | } | ||
765 | |||
711 | #define TRUNC_PTR(x) ((typeof(x))(((unsigned long)(x)) & 0xffffffff)) | 766 | #define TRUNC_PTR(x) ((typeof(x))(((unsigned long)(x)) & 0xffffffff)) |
712 | 767 | ||
713 | int sys_clone(unsigned long clone_flags, unsigned long usp, | 768 | int sys_clone(unsigned long clone_flags, unsigned long usp, |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 9a07f97f0712..483455c5bb02 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <asm/machdep.h> | 50 | #include <asm/machdep.h> |
51 | #include <asm/pSeries_reconfig.h> | 51 | #include <asm/pSeries_reconfig.h> |
52 | #include <asm/pci-bridge.h> | 52 | #include <asm/pci-bridge.h> |
53 | #include <asm/kexec.h> | ||
53 | 54 | ||
54 | #ifdef DEBUG | 55 | #ifdef DEBUG |
55 | #define DBG(fmt...) printk(KERN_ERR fmt) | 56 | #define DBG(fmt...) printk(KERN_ERR fmt) |
@@ -836,6 +837,42 @@ static unsigned long __init unflatten_dt_node(unsigned long mem, | |||
836 | return mem; | 837 | return mem; |
837 | } | 838 | } |
838 | 839 | ||
840 | static int __init early_parse_mem(char *p) | ||
841 | { | ||
842 | if (!p) | ||
843 | return 1; | ||
844 | |||
845 | memory_limit = PAGE_ALIGN(memparse(p, &p)); | ||
846 | DBG("memory limit = 0x%lx\n", memory_limit); | ||
847 | |||
848 | return 0; | ||
849 | } | ||
850 | early_param("mem", early_parse_mem); | ||
851 | |||
852 | /* | ||
853 | * The device tree may be allocated below our memory limit, or inside the | ||
854 | * crash kernel region for kdump. If so, move it out now. | ||
855 | */ | ||
856 | static void move_device_tree(void) | ||
857 | { | ||
858 | unsigned long start, size; | ||
859 | void *p; | ||
860 | |||
861 | DBG("-> move_device_tree\n"); | ||
862 | |||
863 | start = __pa(initial_boot_params); | ||
864 | size = initial_boot_params->totalsize; | ||
865 | |||
866 | if ((memory_limit && (start + size) > memory_limit) || | ||
867 | overlaps_crashkernel(start, size)) { | ||
868 | p = __va(lmb_alloc_base(size, PAGE_SIZE, lmb.rmo_size)); | ||
869 | memcpy(p, initial_boot_params, size); | ||
870 | initial_boot_params = (struct boot_param_header *)p; | ||
871 | DBG("Moved device tree to 0x%p\n", p); | ||
872 | } | ||
873 | |||
874 | DBG("<- move_device_tree\n"); | ||
875 | } | ||
839 | 876 | ||
840 | /** | 877 | /** |
841 | * unflattens the device-tree passed by the firmware, creating the | 878 | * unflattens the device-tree passed by the firmware, creating the |
@@ -911,7 +948,10 @@ static struct ibm_pa_feature { | |||
911 | {CPU_FTR_CTRL, 0, 0, 3, 0}, | 948 | {CPU_FTR_CTRL, 0, 0, 3, 0}, |
912 | {CPU_FTR_NOEXECUTE, 0, 0, 6, 0}, | 949 | {CPU_FTR_NOEXECUTE, 0, 0, 6, 0}, |
913 | {CPU_FTR_NODSISRALIGN, 0, 1, 1, 1}, | 950 | {CPU_FTR_NODSISRALIGN, 0, 1, 1, 1}, |
951 | #if 0 | ||
952 | /* put this back once we know how to test if firmware does 64k IO */ | ||
914 | {CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, | 953 | {CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, |
954 | #endif | ||
915 | }; | 955 | }; |
916 | 956 | ||
917 | static void __init check_cpu_pa_features(unsigned long node) | 957 | static void __init check_cpu_pa_features(unsigned long node) |
@@ -1070,6 +1110,7 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
1070 | iommu_force_on = 1; | 1110 | iommu_force_on = 1; |
1071 | #endif | 1111 | #endif |
1072 | 1112 | ||
1113 | /* mem=x on the command line is the preferred mechanism */ | ||
1073 | lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL); | 1114 | lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL); |
1074 | if (lprop) | 1115 | if (lprop) |
1075 | memory_limit = *lprop; | 1116 | memory_limit = *lprop; |
@@ -1123,17 +1164,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
1123 | 1164 | ||
1124 | DBG("Command line is: %s\n", cmd_line); | 1165 | DBG("Command line is: %s\n", cmd_line); |
1125 | 1166 | ||
1126 | if (strstr(cmd_line, "mem=")) { | ||
1127 | char *p, *q; | ||
1128 | |||
1129 | for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) { | ||
1130 | q = p + 4; | ||
1131 | if (p > cmd_line && p[-1] != ' ') | ||
1132 | continue; | ||
1133 | memory_limit = memparse(q, &q); | ||
1134 | } | ||
1135 | } | ||
1136 | |||
1137 | /* break now */ | 1167 | /* break now */ |
1138 | return 1; | 1168 | return 1; |
1139 | } | 1169 | } |
@@ -1237,9 +1267,17 @@ static void __init early_reserve_mem(void) | |||
1237 | { | 1267 | { |
1238 | u64 base, size; | 1268 | u64 base, size; |
1239 | u64 *reserve_map; | 1269 | u64 *reserve_map; |
1270 | unsigned long self_base; | ||
1271 | unsigned long self_size; | ||
1240 | 1272 | ||
1241 | reserve_map = (u64 *)(((unsigned long)initial_boot_params) + | 1273 | reserve_map = (u64 *)(((unsigned long)initial_boot_params) + |
1242 | initial_boot_params->off_mem_rsvmap); | 1274 | initial_boot_params->off_mem_rsvmap); |
1275 | |||
1276 | /* before we do anything, lets reserve the dt blob */ | ||
1277 | self_base = __pa((unsigned long)initial_boot_params); | ||
1278 | self_size = initial_boot_params->totalsize; | ||
1279 | lmb_reserve(self_base, self_size); | ||
1280 | |||
1243 | #ifdef CONFIG_PPC32 | 1281 | #ifdef CONFIG_PPC32 |
1244 | /* | 1282 | /* |
1245 | * Handle the case where we might be booting from an old kexec | 1283 | * Handle the case where we might be booting from an old kexec |
@@ -1254,6 +1292,9 @@ static void __init early_reserve_mem(void) | |||
1254 | size_32 = *(reserve_map_32++); | 1292 | size_32 = *(reserve_map_32++); |
1255 | if (size_32 == 0) | 1293 | if (size_32 == 0) |
1256 | break; | 1294 | break; |
1295 | /* skip if the reservation is for the blob */ | ||
1296 | if (base_32 == self_base && size_32 == self_size) | ||
1297 | continue; | ||
1257 | DBG("reserving: %x -> %x\n", base_32, size_32); | 1298 | DBG("reserving: %x -> %x\n", base_32, size_32); |
1258 | lmb_reserve(base_32, size_32); | 1299 | lmb_reserve(base_32, size_32); |
1259 | } | 1300 | } |
@@ -1265,6 +1306,9 @@ static void __init early_reserve_mem(void) | |||
1265 | size = *(reserve_map++); | 1306 | size = *(reserve_map++); |
1266 | if (size == 0) | 1307 | if (size == 0) |
1267 | break; | 1308 | break; |
1309 | /* skip if the reservation is for the blob */ | ||
1310 | if (base == self_base && size == self_size) | ||
1311 | continue; | ||
1268 | DBG("reserving: %llx -> %llx\n", base, size); | 1312 | DBG("reserving: %llx -> %llx\n", base, size); |
1269 | lmb_reserve(base, size); | 1313 | lmb_reserve(base, size); |
1270 | } | 1314 | } |
@@ -1292,18 +1336,26 @@ void __init early_init_devtree(void *params) | |||
1292 | lmb_init(); | 1336 | lmb_init(); |
1293 | of_scan_flat_dt(early_init_dt_scan_root, NULL); | 1337 | of_scan_flat_dt(early_init_dt_scan_root, NULL); |
1294 | of_scan_flat_dt(early_init_dt_scan_memory, NULL); | 1338 | of_scan_flat_dt(early_init_dt_scan_memory, NULL); |
1295 | lmb_enforce_memory_limit(memory_limit); | ||
1296 | lmb_analyze(); | ||
1297 | 1339 | ||
1298 | DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); | 1340 | /* Save command line for /proc/cmdline and then parse parameters */ |
1341 | strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); | ||
1342 | parse_early_param(); | ||
1299 | 1343 | ||
1300 | /* Reserve LMB regions used by kernel, initrd, dt, etc... */ | 1344 | /* Reserve LMB regions used by kernel, initrd, dt, etc... */ |
1301 | lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); | 1345 | lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); |
1302 | #ifdef CONFIG_CRASH_DUMP | 1346 | reserve_kdump_trampoline(); |
1303 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); | 1347 | reserve_crashkernel(); |
1304 | #endif | ||
1305 | early_reserve_mem(); | 1348 | early_reserve_mem(); |
1306 | 1349 | ||
1350 | lmb_enforce_memory_limit(memory_limit); | ||
1351 | lmb_analyze(); | ||
1352 | |||
1353 | DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); | ||
1354 | |||
1355 | /* We may need to relocate the flat tree, do it now. | ||
1356 | * FIXME .. and the initrd too? */ | ||
1357 | move_device_tree(); | ||
1358 | |||
1307 | DBG("Scanning CPUs ...\n"); | 1359 | DBG("Scanning CPUs ...\n"); |
1308 | 1360 | ||
1309 | /* Retreive CPU related informations from the flat tree | 1361 | /* Retreive CPU related informations from the flat tree |
@@ -2053,29 +2105,46 @@ int prom_update_property(struct device_node *np, | |||
2053 | return 0; | 2105 | return 0; |
2054 | } | 2106 | } |
2055 | 2107 | ||
2056 | #ifdef CONFIG_KEXEC | ||
2057 | /* We may have allocated the flat device tree inside the crash kernel region | ||
2058 | * in prom_init. If so we need to move it out into regular memory. */ | ||
2059 | void kdump_move_device_tree(void) | ||
2060 | { | ||
2061 | unsigned long start, end; | ||
2062 | struct boot_param_header *new; | ||
2063 | |||
2064 | start = __pa((unsigned long)initial_boot_params); | ||
2065 | end = start + initial_boot_params->totalsize; | ||
2066 | |||
2067 | if (end < crashk_res.start || start > crashk_res.end) | ||
2068 | return; | ||
2069 | 2108 | ||
2070 | new = (struct boot_param_header*) | 2109 | /* Find the device node for a given logical cpu number, also returns the cpu |
2071 | __va(lmb_alloc(initial_boot_params->totalsize, PAGE_SIZE)); | 2110 | * local thread number (index in ibm,interrupt-server#s) if relevant and |
2072 | 2111 | * asked for (non NULL) | |
2073 | memcpy(new, initial_boot_params, initial_boot_params->totalsize); | 2112 | */ |
2113 | struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) | ||
2114 | { | ||
2115 | int hardid; | ||
2116 | struct device_node *np; | ||
2074 | 2117 | ||
2075 | initial_boot_params = new; | 2118 | hardid = get_hard_smp_processor_id(cpu); |
2076 | 2119 | ||
2077 | DBG("Flat device tree blob moved to %p\n", initial_boot_params); | 2120 | for_each_node_by_type(np, "cpu") { |
2121 | u32 *intserv; | ||
2122 | unsigned int plen, t; | ||
2078 | 2123 | ||
2079 | /* XXX should we unreserve the old DT? */ | 2124 | /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist |
2125 | * fallback to "reg" property and assume no threads | ||
2126 | */ | ||
2127 | intserv = (u32 *)get_property(np, "ibm,ppc-interrupt-server#s", | ||
2128 | &plen); | ||
2129 | if (intserv == NULL) { | ||
2130 | u32 *reg = (u32 *)get_property(np, "reg", NULL); | ||
2131 | if (reg == NULL) | ||
2132 | continue; | ||
2133 | if (*reg == hardid) { | ||
2134 | if (thread) | ||
2135 | *thread = 0; | ||
2136 | return np; | ||
2137 | } | ||
2138 | } else { | ||
2139 | plen /= sizeof(u32); | ||
2140 | for (t = 0; t < plen; t++) { | ||
2141 | if (hardid == intserv[t]) { | ||
2142 | if (thread) | ||
2143 | *thread = t; | ||
2144 | return np; | ||
2145 | } | ||
2146 | } | ||
2147 | } | ||
2148 | } | ||
2149 | return NULL; | ||
2080 | } | 2150 | } |
2081 | #endif /* CONFIG_KEXEC */ | ||
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index f70bd090dacd..8c28eb0cbdac 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -194,19 +194,12 @@ static int __initdata of_platform; | |||
194 | 194 | ||
195 | static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; | 195 | static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; |
196 | 196 | ||
197 | static unsigned long __initdata prom_memory_limit; | ||
198 | |||
199 | static unsigned long __initdata alloc_top; | 197 | static unsigned long __initdata alloc_top; |
200 | static unsigned long __initdata alloc_top_high; | 198 | static unsigned long __initdata alloc_top_high; |
201 | static unsigned long __initdata alloc_bottom; | 199 | static unsigned long __initdata alloc_bottom; |
202 | static unsigned long __initdata rmo_top; | 200 | static unsigned long __initdata rmo_top; |
203 | static unsigned long __initdata ram_top; | 201 | static unsigned long __initdata ram_top; |
204 | 202 | ||
205 | #ifdef CONFIG_KEXEC | ||
206 | static unsigned long __initdata prom_crashk_base; | ||
207 | static unsigned long __initdata prom_crashk_size; | ||
208 | #endif | ||
209 | |||
210 | static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE]; | 203 | static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE]; |
211 | static int __initdata mem_reserve_cnt; | 204 | static int __initdata mem_reserve_cnt; |
212 | 205 | ||
@@ -574,7 +567,7 @@ static void __init early_cmdline_parse(void) | |||
574 | if ((long)_prom->chosen > 0) | 567 | if ((long)_prom->chosen > 0) |
575 | l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1); | 568 | l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1); |
576 | #ifdef CONFIG_CMDLINE | 569 | #ifdef CONFIG_CMDLINE |
577 | if (l == 0) /* dbl check */ | 570 | if (l <= 0 || p[0] == '\0') /* dbl check */ |
578 | strlcpy(RELOC(prom_cmd_line), | 571 | strlcpy(RELOC(prom_cmd_line), |
579 | RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line)); | 572 | RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line)); |
580 | #endif /* CONFIG_CMDLINE */ | 573 | #endif /* CONFIG_CMDLINE */ |
@@ -593,45 +586,6 @@ static void __init early_cmdline_parse(void) | |||
593 | RELOC(iommu_force_on) = 1; | 586 | RELOC(iommu_force_on) = 1; |
594 | } | 587 | } |
595 | #endif | 588 | #endif |
596 | |||
597 | opt = strstr(RELOC(prom_cmd_line), RELOC("mem=")); | ||
598 | if (opt) { | ||
599 | opt += 4; | ||
600 | RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt); | ||
601 | #ifdef CONFIG_PPC64 | ||
602 | /* Align to 16 MB == size of ppc64 large page */ | ||
603 | RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); | ||
604 | #endif | ||
605 | } | ||
606 | |||
607 | #ifdef CONFIG_KEXEC | ||
608 | /* | ||
609 | * crashkernel=size@addr specifies the location to reserve for | ||
610 | * crash kernel. | ||
611 | */ | ||
612 | opt = strstr(RELOC(prom_cmd_line), RELOC("crashkernel=")); | ||
613 | if (opt) { | ||
614 | opt += 12; | ||
615 | RELOC(prom_crashk_size) = | ||
616 | prom_memparse(opt, (const char **)&opt); | ||
617 | |||
618 | if (ALIGN(RELOC(prom_crashk_size), 0x1000000) != | ||
619 | RELOC(prom_crashk_size)) { | ||
620 | prom_printf("Warning: crashkernel size is not " | ||
621 | "aligned to 16MB\n"); | ||
622 | } | ||
623 | |||
624 | /* | ||
625 | * At present, the crash kernel always run at 32MB. | ||
626 | * Just ignore whatever user passed. | ||
627 | */ | ||
628 | RELOC(prom_crashk_base) = 0x2000000; | ||
629 | if (*opt == '@') { | ||
630 | prom_printf("Warning: PPC64 kdump kernel always runs " | ||
631 | "at 32 MB\n"); | ||
632 | } | ||
633 | } | ||
634 | #endif | ||
635 | } | 589 | } |
636 | 590 | ||
637 | #ifdef CONFIG_PPC_PSERIES | 591 | #ifdef CONFIG_PPC_PSERIES |
@@ -1116,29 +1070,6 @@ static void __init prom_init_mem(void) | |||
1116 | } | 1070 | } |
1117 | 1071 | ||
1118 | /* | 1072 | /* |
1119 | * If prom_memory_limit is set we reduce the upper limits *except* for | ||
1120 | * alloc_top_high. This must be the real top of RAM so we can put | ||
1121 | * TCE's up there. | ||
1122 | */ | ||
1123 | |||
1124 | RELOC(alloc_top_high) = RELOC(ram_top); | ||
1125 | |||
1126 | if (RELOC(prom_memory_limit)) { | ||
1127 | if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) { | ||
1128 | prom_printf("Ignoring mem=%x <= alloc_bottom.\n", | ||
1129 | RELOC(prom_memory_limit)); | ||
1130 | RELOC(prom_memory_limit) = 0; | ||
1131 | } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) { | ||
1132 | prom_printf("Ignoring mem=%x >= ram_top.\n", | ||
1133 | RELOC(prom_memory_limit)); | ||
1134 | RELOC(prom_memory_limit) = 0; | ||
1135 | } else { | ||
1136 | RELOC(ram_top) = RELOC(prom_memory_limit); | ||
1137 | RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit)); | ||
1138 | } | ||
1139 | } | ||
1140 | |||
1141 | /* | ||
1142 | * Setup our top alloc point, that is top of RMO or top of | 1073 | * Setup our top alloc point, that is top of RMO or top of |
1143 | * segment 0 when running non-LPAR. | 1074 | * segment 0 when running non-LPAR. |
1144 | * Some RS64 machines have buggy firmware where claims up at | 1075 | * Some RS64 machines have buggy firmware where claims up at |
@@ -1150,20 +1081,14 @@ static void __init prom_init_mem(void) | |||
1150 | RELOC(rmo_top) = RELOC(ram_top); | 1081 | RELOC(rmo_top) = RELOC(ram_top); |
1151 | RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top)); | 1082 | RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top)); |
1152 | RELOC(alloc_top) = RELOC(rmo_top); | 1083 | RELOC(alloc_top) = RELOC(rmo_top); |
1084 | RELOC(alloc_top_high) = RELOC(ram_top); | ||
1153 | 1085 | ||
1154 | prom_printf("memory layout at init:\n"); | 1086 | prom_printf("memory layout at init:\n"); |
1155 | prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit)); | ||
1156 | prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); | 1087 | prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); |
1157 | prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); | 1088 | prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); |
1158 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1089 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); |
1159 | prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); | 1090 | prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); |
1160 | prom_printf(" ram_top : %x\n", RELOC(ram_top)); | 1091 | prom_printf(" ram_top : %x\n", RELOC(ram_top)); |
1161 | #ifdef CONFIG_KEXEC | ||
1162 | if (RELOC(prom_crashk_base)) { | ||
1163 | prom_printf(" crashk_base : %x\n", RELOC(prom_crashk_base)); | ||
1164 | prom_printf(" crashk_size : %x\n", RELOC(prom_crashk_size)); | ||
1165 | } | ||
1166 | #endif | ||
1167 | } | 1092 | } |
1168 | 1093 | ||
1169 | 1094 | ||
@@ -1349,16 +1274,10 @@ static void __init prom_initialize_tce_table(void) | |||
1349 | 1274 | ||
1350 | reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom); | 1275 | reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom); |
1351 | 1276 | ||
1352 | if (RELOC(prom_memory_limit)) { | 1277 | /* These are only really needed if there is a memory limit in |
1353 | /* | 1278 | * effect, but we don't know so export them always. */ |
1354 | * We align the start to a 16MB boundary so we can map | 1279 | RELOC(prom_tce_alloc_start) = local_alloc_bottom; |
1355 | * the TCE area using large pages if possible. | 1280 | RELOC(prom_tce_alloc_end) = local_alloc_top; |
1356 | * The end should be the top of RAM so no need to align it. | ||
1357 | */ | ||
1358 | RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom, | ||
1359 | 0x1000000); | ||
1360 | RELOC(prom_tce_alloc_end) = local_alloc_top; | ||
1361 | } | ||
1362 | 1281 | ||
1363 | /* Flag the first invalid entry */ | 1282 | /* Flag the first invalid entry */ |
1364 | prom_debug("ending prom_initialize_tce_table\n"); | 1283 | prom_debug("ending prom_initialize_tce_table\n"); |
@@ -2041,11 +1960,7 @@ static void __init flatten_device_tree(void) | |||
2041 | /* Version 16 is not backward compatible */ | 1960 | /* Version 16 is not backward compatible */ |
2042 | hdr->last_comp_version = 0x10; | 1961 | hdr->last_comp_version = 0x10; |
2043 | 1962 | ||
2044 | /* Reserve the whole thing and copy the reserve map in, we | 1963 | /* Copy the reserve map in */ |
2045 | * also bump mem_reserve_cnt to cause further reservations to | ||
2046 | * fail since it's too late. | ||
2047 | */ | ||
2048 | reserve_mem(RELOC(dt_header_start), hdr->totalsize); | ||
2049 | memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map)); | 1964 | memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map)); |
2050 | 1965 | ||
2051 | #ifdef DEBUG_PROM | 1966 | #ifdef DEBUG_PROM |
@@ -2058,6 +1973,9 @@ static void __init flatten_device_tree(void) | |||
2058 | RELOC(mem_reserve_map)[i].size); | 1973 | RELOC(mem_reserve_map)[i].size); |
2059 | } | 1974 | } |
2060 | #endif | 1975 | #endif |
1976 | /* Bump mem_reserve_cnt to cause further reservations to fail | ||
1977 | * since it's too late. | ||
1978 | */ | ||
2061 | RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE; | 1979 | RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE; |
2062 | 1980 | ||
2063 | prom_printf("Device tree strings 0x%x -> 0x%x\n", | 1981 | prom_printf("Device tree strings 0x%x -> 0x%x\n", |
@@ -2280,10 +2198,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2280 | */ | 2198 | */ |
2281 | prom_init_mem(); | 2199 | prom_init_mem(); |
2282 | 2200 | ||
2283 | #ifdef CONFIG_KEXEC | ||
2284 | if (RELOC(prom_crashk_base)) | ||
2285 | reserve_mem(RELOC(prom_crashk_base), RELOC(prom_crashk_size)); | ||
2286 | #endif | ||
2287 | /* | 2201 | /* |
2288 | * Determine which cpu is actually running right _now_ | 2202 | * Determine which cpu is actually running right _now_ |
2289 | */ | 2203 | */ |
@@ -2317,10 +2231,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2317 | /* | 2231 | /* |
2318 | * Fill in some infos for use by the kernel later on | 2232 | * Fill in some infos for use by the kernel later on |
2319 | */ | 2233 | */ |
2320 | if (RELOC(prom_memory_limit)) | ||
2321 | prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit", | ||
2322 | &RELOC(prom_memory_limit), | ||
2323 | sizeof(prom_memory_limit)); | ||
2324 | #ifdef CONFIG_PPC64 | 2234 | #ifdef CONFIG_PPC64 |
2325 | if (RELOC(ppc64_iommu_off)) | 2235 | if (RELOC(ppc64_iommu_off)) |
2326 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", | 2236 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", |
@@ -2340,16 +2250,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2340 | } | 2250 | } |
2341 | #endif | 2251 | #endif |
2342 | 2252 | ||
2343 | #ifdef CONFIG_KEXEC | ||
2344 | if (RELOC(prom_crashk_base)) { | ||
2345 | prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-base", | ||
2346 | PTRRELOC(&prom_crashk_base), | ||
2347 | sizeof(RELOC(prom_crashk_base))); | ||
2348 | prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-size", | ||
2349 | PTRRELOC(&prom_crashk_size), | ||
2350 | sizeof(RELOC(prom_crashk_size))); | ||
2351 | } | ||
2352 | #endif | ||
2353 | /* | 2253 | /* |
2354 | * Fixup any known bugs in the device-tree | 2254 | * Fixup any known bugs in the device-tree |
2355 | */ | 2255 | */ |
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 3934c227549b..45df420383cc 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c | |||
@@ -548,3 +548,28 @@ int of_pci_address_to_resource(struct device_node *dev, int bar, | |||
548 | return __of_address_to_resource(dev, addrp, size, flags, r); | 548 | return __of_address_to_resource(dev, addrp, size, flags, r); |
549 | } | 549 | } |
550 | EXPORT_SYMBOL_GPL(of_pci_address_to_resource); | 550 | EXPORT_SYMBOL_GPL(of_pci_address_to_resource); |
551 | |||
552 | void of_parse_dma_window(struct device_node *dn, unsigned char *dma_window_prop, | ||
553 | unsigned long *busno, unsigned long *phys, unsigned long *size) | ||
554 | { | ||
555 | u32 *dma_window, cells; | ||
556 | unsigned char *prop; | ||
557 | |||
558 | dma_window = (u32 *)dma_window_prop; | ||
559 | |||
560 | /* busno is always one cell */ | ||
561 | *busno = *(dma_window++); | ||
562 | |||
563 | prop = get_property(dn, "ibm,#dma-address-cells", NULL); | ||
564 | if (!prop) | ||
565 | prop = get_property(dn, "#address-cells", NULL); | ||
566 | |||
567 | cells = prop ? *(u32 *)prop : prom_n_addr_cells(dn); | ||
568 | *phys = of_read_addr(dma_window, cells); | ||
569 | |||
570 | dma_window += cells; | ||
571 | |||
572 | prop = get_property(dn, "ibm,#dma-size-cells", NULL); | ||
573 | cells = prop ? *(u32 *)prop : prom_n_size_cells(dn); | ||
574 | *size = of_read_addr(dma_window, cells); | ||
575 | } | ||
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 4a677d1bd4ef..5563e2e7d89c 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -404,7 +404,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
404 | ret = ptrace_detach(child, data); | 404 | ret = ptrace_detach(child, data); |
405 | break; | 405 | break; |
406 | 406 | ||
407 | #ifdef CONFIG_PPC64 | ||
408 | case PPC_PTRACE_GETREGS: { /* Get GPRs 0 - 31. */ | 407 | case PPC_PTRACE_GETREGS: { /* Get GPRs 0 - 31. */ |
409 | int i; | 408 | int i; |
410 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; | 409 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; |
@@ -468,7 +467,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
468 | } | 467 | } |
469 | break; | 468 | break; |
470 | } | 469 | } |
471 | #endif /* CONFIG_PPC64 */ | ||
472 | 470 | ||
473 | #ifdef CONFIG_ALTIVEC | 471 | #ifdef CONFIG_ALTIVEC |
474 | case PTRACE_GETVRREGS: | 472 | case PTRACE_GETVRREGS: |
diff --git a/arch/powerpc/kernel/rtas-rtc.c b/arch/powerpc/kernel/rtas-rtc.c index 34d073fb6091..77578c093dda 100644 --- a/arch/powerpc/kernel/rtas-rtc.c +++ b/arch/powerpc/kernel/rtas-rtc.c | |||
@@ -14,19 +14,20 @@ | |||
14 | unsigned long __init rtas_get_boot_time(void) | 14 | unsigned long __init rtas_get_boot_time(void) |
15 | { | 15 | { |
16 | int ret[8]; | 16 | int ret[8]; |
17 | int error, wait_time; | 17 | int error; |
18 | unsigned int wait_time; | ||
18 | u64 max_wait_tb; | 19 | u64 max_wait_tb; |
19 | 20 | ||
20 | max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; | 21 | max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; |
21 | do { | 22 | do { |
22 | error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret); | 23 | error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret); |
23 | if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) { | 24 | |
24 | wait_time = rtas_extended_busy_delay_time(error); | 25 | wait_time = rtas_busy_delay_time(error); |
26 | if (wait_time) { | ||
25 | /* This is boot time so we spin. */ | 27 | /* This is boot time so we spin. */ |
26 | udelay(wait_time*1000); | 28 | udelay(wait_time*1000); |
27 | error = RTAS_CLOCK_BUSY; | ||
28 | } | 29 | } |
29 | } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb)); | 30 | } while (wait_time && (get_tb() < max_wait_tb)); |
30 | 31 | ||
31 | if (error != 0 && printk_ratelimit()) { | 32 | if (error != 0 && printk_ratelimit()) { |
32 | printk(KERN_WARNING "error: reading the clock failed (%d)\n", | 33 | printk(KERN_WARNING "error: reading the clock failed (%d)\n", |
@@ -44,24 +45,25 @@ unsigned long __init rtas_get_boot_time(void) | |||
44 | void rtas_get_rtc_time(struct rtc_time *rtc_tm) | 45 | void rtas_get_rtc_time(struct rtc_time *rtc_tm) |
45 | { | 46 | { |
46 | int ret[8]; | 47 | int ret[8]; |
47 | int error, wait_time; | 48 | int error; |
49 | unsigned int wait_time; | ||
48 | u64 max_wait_tb; | 50 | u64 max_wait_tb; |
49 | 51 | ||
50 | max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; | 52 | max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; |
51 | do { | 53 | do { |
52 | error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret); | 54 | error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret); |
53 | if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) { | 55 | |
56 | wait_time = rtas_busy_delay_time(error); | ||
57 | if (wait_time) { | ||
54 | if (in_interrupt() && printk_ratelimit()) { | 58 | if (in_interrupt() && printk_ratelimit()) { |
55 | memset(rtc_tm, 0, sizeof(struct rtc_time)); | 59 | memset(rtc_tm, 0, sizeof(struct rtc_time)); |
56 | printk(KERN_WARNING "error: reading clock" | 60 | printk(KERN_WARNING "error: reading clock" |
57 | " would delay interrupt\n"); | 61 | " would delay interrupt\n"); |
58 | return; /* delay not allowed */ | 62 | return; /* delay not allowed */ |
59 | } | 63 | } |
60 | wait_time = rtas_extended_busy_delay_time(error); | ||
61 | msleep(wait_time); | 64 | msleep(wait_time); |
62 | error = RTAS_CLOCK_BUSY; | ||
63 | } | 65 | } |
64 | } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb)); | 66 | } while (wait_time && (get_tb() < max_wait_tb)); |
65 | 67 | ||
66 | if (error != 0 && printk_ratelimit()) { | 68 | if (error != 0 && printk_ratelimit()) { |
67 | printk(KERN_WARNING "error: reading the clock failed (%d)\n", | 69 | printk(KERN_WARNING "error: reading the clock failed (%d)\n", |
@@ -88,14 +90,14 @@ int rtas_set_rtc_time(struct rtc_time *tm) | |||
88 | tm->tm_year + 1900, tm->tm_mon + 1, | 90 | tm->tm_year + 1900, tm->tm_mon + 1, |
89 | tm->tm_mday, tm->tm_hour, tm->tm_min, | 91 | tm->tm_mday, tm->tm_hour, tm->tm_min, |
90 | tm->tm_sec, 0); | 92 | tm->tm_sec, 0); |
91 | if (error == RTAS_CLOCK_BUSY || rtas_is_extended_busy(error)) { | 93 | |
94 | wait_time = rtas_busy_delay_time(error); | ||
95 | if (wait_time) { | ||
92 | if (in_interrupt()) | 96 | if (in_interrupt()) |
93 | return 1; /* probably decrementer */ | 97 | return 1; /* probably decrementer */ |
94 | wait_time = rtas_extended_busy_delay_time(error); | ||
95 | msleep(wait_time); | 98 | msleep(wait_time); |
96 | error = RTAS_CLOCK_BUSY; | ||
97 | } | 99 | } |
98 | } while (error == RTAS_CLOCK_BUSY && (get_tb() < max_wait_tb)); | 100 | } while (wait_time && (get_tb() < max_wait_tb)); |
99 | 101 | ||
100 | if (error != 0 && printk_ratelimit()) | 102 | if (error != 0 && printk_ratelimit()) |
101 | printk(KERN_WARNING "error: setting the clock failed (%d)\n", | 103 | printk(KERN_WARNING "error: setting the clock failed (%d)\n", |
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 0112318213ab..17dc79198515 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -370,24 +370,36 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
370 | return ret; | 370 | return ret; |
371 | } | 371 | } |
372 | 372 | ||
373 | /* Given an RTAS status code of 990n compute the hinted delay of 10^n | 373 | /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status |
374 | * (last digit) milliseconds. For now we bound at n=5 (100 sec). | 374 | * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds. |
375 | */ | 375 | */ |
376 | unsigned int rtas_extended_busy_delay_time(int status) | 376 | unsigned int rtas_busy_delay_time(int status) |
377 | { | 377 | { |
378 | int order = status - 9900; | 378 | int order; |
379 | unsigned long ms; | 379 | unsigned int ms = 0; |
380 | |||
381 | if (status == RTAS_BUSY) { | ||
382 | ms = 1; | ||
383 | } else if (status >= 9900 && status <= 9905) { | ||
384 | order = status - 9900; | ||
385 | for (ms = 1; order > 0; order--) | ||
386 | ms *= 10; | ||
387 | } | ||
380 | 388 | ||
381 | if (order < 0) | 389 | return ms; |
382 | order = 0; /* RTC depends on this for -2 clock busy */ | 390 | } |
383 | else if (order > 5) | ||
384 | order = 5; /* bound */ | ||
385 | 391 | ||
386 | /* Use microseconds for reasonable accuracy */ | 392 | /* For an RTAS busy status code, perform the hinted delay. */ |
387 | for (ms = 1; order > 0; order--) | 393 | unsigned int rtas_busy_delay(int status) |
388 | ms *= 10; | 394 | { |
395 | unsigned int ms; | ||
389 | 396 | ||
390 | return ms; | 397 | might_sleep(); |
398 | ms = rtas_busy_delay_time(status); | ||
399 | if (ms) | ||
400 | msleep(ms); | ||
401 | |||
402 | return ms; | ||
391 | } | 403 | } |
392 | 404 | ||
393 | int rtas_error_rc(int rtas_rc) | 405 | int rtas_error_rc(int rtas_rc) |
@@ -438,22 +450,14 @@ int rtas_get_power_level(int powerdomain, int *level) | |||
438 | int rtas_set_power_level(int powerdomain, int level, int *setlevel) | 450 | int rtas_set_power_level(int powerdomain, int level, int *setlevel) |
439 | { | 451 | { |
440 | int token = rtas_token("set-power-level"); | 452 | int token = rtas_token("set-power-level"); |
441 | unsigned int wait_time; | ||
442 | int rc; | 453 | int rc; |
443 | 454 | ||
444 | if (token == RTAS_UNKNOWN_SERVICE) | 455 | if (token == RTAS_UNKNOWN_SERVICE) |
445 | return -ENOENT; | 456 | return -ENOENT; |
446 | 457 | ||
447 | while (1) { | 458 | do { |
448 | rc = rtas_call(token, 2, 2, setlevel, powerdomain, level); | 459 | rc = rtas_call(token, 2, 2, setlevel, powerdomain, level); |
449 | if (rc == RTAS_BUSY) | 460 | } while (rtas_busy_delay(rc)); |
450 | udelay(1); | ||
451 | else if (rtas_is_extended_busy(rc)) { | ||
452 | wait_time = rtas_extended_busy_delay_time(rc); | ||
453 | udelay(wait_time * 1000); | ||
454 | } else | ||
455 | break; | ||
456 | } | ||
457 | 461 | ||
458 | if (rc < 0) | 462 | if (rc < 0) |
459 | return rtas_error_rc(rc); | 463 | return rtas_error_rc(rc); |
@@ -463,22 +467,14 @@ int rtas_set_power_level(int powerdomain, int level, int *setlevel) | |||
463 | int rtas_get_sensor(int sensor, int index, int *state) | 467 | int rtas_get_sensor(int sensor, int index, int *state) |
464 | { | 468 | { |
465 | int token = rtas_token("get-sensor-state"); | 469 | int token = rtas_token("get-sensor-state"); |
466 | unsigned int wait_time; | ||
467 | int rc; | 470 | int rc; |
468 | 471 | ||
469 | if (token == RTAS_UNKNOWN_SERVICE) | 472 | if (token == RTAS_UNKNOWN_SERVICE) |
470 | return -ENOENT; | 473 | return -ENOENT; |
471 | 474 | ||
472 | while (1) { | 475 | do { |
473 | rc = rtas_call(token, 2, 2, state, sensor, index); | 476 | rc = rtas_call(token, 2, 2, state, sensor, index); |
474 | if (rc == RTAS_BUSY) | 477 | } while (rtas_busy_delay(rc)); |
475 | udelay(1); | ||
476 | else if (rtas_is_extended_busy(rc)) { | ||
477 | wait_time = rtas_extended_busy_delay_time(rc); | ||
478 | udelay(wait_time * 1000); | ||
479 | } else | ||
480 | break; | ||
481 | } | ||
482 | 478 | ||
483 | if (rc < 0) | 479 | if (rc < 0) |
484 | return rtas_error_rc(rc); | 480 | return rtas_error_rc(rc); |
@@ -488,23 +484,14 @@ int rtas_get_sensor(int sensor, int index, int *state) | |||
488 | int rtas_set_indicator(int indicator, int index, int new_value) | 484 | int rtas_set_indicator(int indicator, int index, int new_value) |
489 | { | 485 | { |
490 | int token = rtas_token("set-indicator"); | 486 | int token = rtas_token("set-indicator"); |
491 | unsigned int wait_time; | ||
492 | int rc; | 487 | int rc; |
493 | 488 | ||
494 | if (token == RTAS_UNKNOWN_SERVICE) | 489 | if (token == RTAS_UNKNOWN_SERVICE) |
495 | return -ENOENT; | 490 | return -ENOENT; |
496 | 491 | ||
497 | while (1) { | 492 | do { |
498 | rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); | 493 | rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); |
499 | if (rc == RTAS_BUSY) | 494 | } while (rtas_busy_delay(rc)); |
500 | udelay(1); | ||
501 | else if (rtas_is_extended_busy(rc)) { | ||
502 | wait_time = rtas_extended_busy_delay_time(rc); | ||
503 | udelay(wait_time * 1000); | ||
504 | } | ||
505 | else | ||
506 | break; | ||
507 | } | ||
508 | 495 | ||
509 | if (rc < 0) | 496 | if (rc < 0) |
510 | return rtas_error_rc(rc); | 497 | return rtas_error_rc(rc); |
@@ -555,13 +542,11 @@ void rtas_os_term(char *str) | |||
555 | do { | 542 | do { |
556 | status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, | 543 | status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, |
557 | __pa(rtas_os_term_buf)); | 544 | __pa(rtas_os_term_buf)); |
545 | } while (rtas_busy_delay(status)); | ||
558 | 546 | ||
559 | if (status == RTAS_BUSY) | 547 | if (status != 0) |
560 | udelay(1); | 548 | printk(KERN_EMERG "ibm,os-term call failed %d\n", |
561 | else if (status != 0) | ||
562 | printk(KERN_EMERG "ibm,os-term call failed %d\n", | ||
563 | status); | 549 | status); |
564 | } while (status == RTAS_BUSY); | ||
565 | } | 550 | } |
566 | 551 | ||
567 | static int ibm_suspend_me_token = RTAS_UNKNOWN_SERVICE; | 552 | static int ibm_suspend_me_token = RTAS_UNKNOWN_SERVICE; |
@@ -608,9 +593,31 @@ out: | |||
608 | static int rtas_ibm_suspend_me(struct rtas_args *args) | 593 | static int rtas_ibm_suspend_me(struct rtas_args *args) |
609 | { | 594 | { |
610 | int i; | 595 | int i; |
596 | long state; | ||
597 | long rc; | ||
598 | unsigned long dummy; | ||
611 | 599 | ||
612 | struct rtas_suspend_me_data data; | 600 | struct rtas_suspend_me_data data; |
613 | 601 | ||
602 | /* Make sure the state is valid */ | ||
603 | rc = plpar_hcall(H_VASI_STATE, | ||
604 | ((u64)args->args[0] << 32) | args->args[1], | ||
605 | 0, 0, 0, | ||
606 | &state, &dummy, &dummy); | ||
607 | |||
608 | if (rc) { | ||
609 | printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc); | ||
610 | return rc; | ||
611 | } else if (state == H_VASI_ENABLED) { | ||
612 | args->args[args->nargs] = RTAS_NOT_SUSPENDABLE; | ||
613 | return 0; | ||
614 | } else if (state != H_VASI_SUSPENDING) { | ||
615 | printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned state %ld\n", | ||
616 | state); | ||
617 | args->args[args->nargs] = -1; | ||
618 | return 0; | ||
619 | } | ||
620 | |||
614 | data.waiting = 1; | 621 | data.waiting = 1; |
615 | data.args = args; | 622 | data.args = args; |
616 | 623 | ||
@@ -789,7 +796,8 @@ EXPORT_SYMBOL(rtas_token); | |||
789 | EXPORT_SYMBOL(rtas_call); | 796 | EXPORT_SYMBOL(rtas_call); |
790 | EXPORT_SYMBOL(rtas_data_buf); | 797 | EXPORT_SYMBOL(rtas_data_buf); |
791 | EXPORT_SYMBOL(rtas_data_buf_lock); | 798 | EXPORT_SYMBOL(rtas_data_buf_lock); |
792 | EXPORT_SYMBOL(rtas_extended_busy_delay_time); | 799 | EXPORT_SYMBOL(rtas_busy_delay_time); |
800 | EXPORT_SYMBOL(rtas_busy_delay); | ||
793 | EXPORT_SYMBOL(rtas_get_sensor); | 801 | EXPORT_SYMBOL(rtas_get_sensor); |
794 | EXPORT_SYMBOL(rtas_get_power_level); | 802 | EXPORT_SYMBOL(rtas_get_power_level); |
795 | EXPORT_SYMBOL(rtas_set_power_level); | 803 | EXPORT_SYMBOL(rtas_set_power_level); |
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index aaf384c3f04a..1442b63a75da 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
@@ -365,20 +365,12 @@ static int rtas_excl_release(struct inode *inode, struct file *file) | |||
365 | 365 | ||
366 | static void manage_flash(struct rtas_manage_flash_t *args_buf) | 366 | static void manage_flash(struct rtas_manage_flash_t *args_buf) |
367 | { | 367 | { |
368 | unsigned int wait_time; | ||
369 | s32 rc; | 368 | s32 rc; |
370 | 369 | ||
371 | while (1) { | 370 | do { |
372 | rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1, | 371 | rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1, |
373 | 1, NULL, args_buf->op); | 372 | 1, NULL, args_buf->op); |
374 | if (rc == RTAS_RC_BUSY) | 373 | } while (rtas_busy_delay(rc)); |
375 | udelay(1); | ||
376 | else if (rtas_is_extended_busy(rc)) { | ||
377 | wait_time = rtas_extended_busy_delay_time(rc); | ||
378 | udelay(wait_time * 1000); | ||
379 | } else | ||
380 | break; | ||
381 | } | ||
382 | 374 | ||
383 | args_buf->status = rc; | 375 | args_buf->status = rc; |
384 | } | 376 | } |
@@ -451,27 +443,18 @@ static ssize_t manage_flash_write(struct file *file, const char __user *buf, | |||
451 | static void validate_flash(struct rtas_validate_flash_t *args_buf) | 443 | static void validate_flash(struct rtas_validate_flash_t *args_buf) |
452 | { | 444 | { |
453 | int token = rtas_token("ibm,validate-flash-image"); | 445 | int token = rtas_token("ibm,validate-flash-image"); |
454 | unsigned int wait_time; | ||
455 | int update_results; | 446 | int update_results; |
456 | s32 rc; | 447 | s32 rc; |
457 | 448 | ||
458 | rc = 0; | 449 | rc = 0; |
459 | while(1) { | 450 | do { |
460 | spin_lock(&rtas_data_buf_lock); | 451 | spin_lock(&rtas_data_buf_lock); |
461 | memcpy(rtas_data_buf, args_buf->buf, VALIDATE_BUF_SIZE); | 452 | memcpy(rtas_data_buf, args_buf->buf, VALIDATE_BUF_SIZE); |
462 | rc = rtas_call(token, 2, 2, &update_results, | 453 | rc = rtas_call(token, 2, 2, &update_results, |
463 | (u32) __pa(rtas_data_buf), args_buf->buf_size); | 454 | (u32) __pa(rtas_data_buf), args_buf->buf_size); |
464 | memcpy(args_buf->buf, rtas_data_buf, VALIDATE_BUF_SIZE); | 455 | memcpy(args_buf->buf, rtas_data_buf, VALIDATE_BUF_SIZE); |
465 | spin_unlock(&rtas_data_buf_lock); | 456 | spin_unlock(&rtas_data_buf_lock); |
466 | 457 | } while (rtas_busy_delay(rc)); | |
467 | if (rc == RTAS_RC_BUSY) | ||
468 | udelay(1); | ||
469 | else if (rtas_is_extended_busy(rc)) { | ||
470 | wait_time = rtas_extended_busy_delay_time(rc); | ||
471 | udelay(wait_time * 1000); | ||
472 | } else | ||
473 | break; | ||
474 | } | ||
475 | 458 | ||
476 | args_buf->status = rc; | 459 | args_buf->status = rc; |
477 | args_buf->update_results = update_results; | 460 | args_buf->update_results = update_results; |
diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index 57b539a03fa9..6eb7e49b394a 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c | |||
@@ -313,7 +313,9 @@ unsigned long __init find_and_init_phbs(void) | |||
313 | for (node = of_get_next_child(root, NULL); | 313 | for (node = of_get_next_child(root, NULL); |
314 | node != NULL; | 314 | node != NULL; |
315 | node = of_get_next_child(root, node)) { | 315 | node = of_get_next_child(root, node)) { |
316 | if (node->type == NULL || strcmp(node->type, "pci") != 0) | 316 | |
317 | if (node->type == NULL || (strcmp(node->type, "pci") != 0 && | ||
318 | strcmp(node->type, "pciex") != 0)) | ||
317 | continue; | 319 | continue; |
318 | 320 | ||
319 | phb = pcibios_alloc_controller(node); | 321 | phb = pcibios_alloc_controller(node); |
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 684ab1d49c65..bd328123af75 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -443,6 +443,7 @@ void __init smp_setup_cpu_maps(void) | |||
443 | } | 443 | } |
444 | #endif /* CONFIG_SMP */ | 444 | #endif /* CONFIG_SMP */ |
445 | 445 | ||
446 | int __initdata do_early_xmon; | ||
446 | #ifdef CONFIG_XMON | 447 | #ifdef CONFIG_XMON |
447 | static int __init early_xmon(char *p) | 448 | static int __init early_xmon(char *p) |
448 | { | 449 | { |
@@ -456,7 +457,7 @@ static int __init early_xmon(char *p) | |||
456 | return 0; | 457 | return 0; |
457 | } | 458 | } |
458 | xmon_init(1); | 459 | xmon_init(1); |
459 | debugger(NULL); | 460 | do_early_xmon = 1; |
460 | 461 | ||
461 | return 0; | 462 | return 0; |
462 | } | 463 | } |
@@ -524,3 +525,20 @@ int check_legacy_ioport(unsigned long base_port) | |||
524 | return ppc_md.check_legacy_ioport(base_port); | 525 | return ppc_md.check_legacy_ioport(base_port); |
525 | } | 526 | } |
526 | EXPORT_SYMBOL(check_legacy_ioport); | 527 | EXPORT_SYMBOL(check_legacy_ioport); |
528 | |||
529 | static int ppc_panic_event(struct notifier_block *this, | ||
530 | unsigned long event, void *ptr) | ||
531 | { | ||
532 | ppc_md.panic(ptr); /* May not return */ | ||
533 | return NOTIFY_DONE; | ||
534 | } | ||
535 | |||
536 | static struct notifier_block ppc_panic_block = { | ||
537 | .notifier_call = ppc_panic_event, | ||
538 | .priority = INT_MIN /* may not return; must be done last */ | ||
539 | }; | ||
540 | |||
541 | void __init setup_panic(void) | ||
542 | { | ||
543 | atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block); | ||
544 | } | ||
diff --git a/arch/powerpc/kernel/setup.h b/arch/powerpc/kernel/setup.h index 2ebba755272e..4c67ad7fae08 100644 --- a/arch/powerpc/kernel/setup.h +++ b/arch/powerpc/kernel/setup.h | |||
@@ -2,5 +2,8 @@ | |||
2 | #define _POWERPC_KERNEL_SETUP_H | 2 | #define _POWERPC_KERNEL_SETUP_H |
3 | 3 | ||
4 | void check_for_initrd(void); | 4 | void check_for_initrd(void); |
5 | void do_init_bootmem(void); | ||
6 | void setup_panic(void); | ||
7 | extern int do_early_xmon; | ||
5 | 8 | ||
6 | #endif /* _POWERPC_KERNEL_SETUP_H */ | 9 | #endif /* _POWERPC_KERNEL_SETUP_H */ |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 69ac25701344..e5a44812441a 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -131,12 +131,6 @@ void __init machine_init(unsigned long dt_ptr, unsigned long phys) | |||
131 | /* Do some early initialization based on the flat device tree */ | 131 | /* Do some early initialization based on the flat device tree */ |
132 | early_init_devtree(__va(dt_ptr)); | 132 | early_init_devtree(__va(dt_ptr)); |
133 | 133 | ||
134 | /* Check default command line */ | ||
135 | #ifdef CONFIG_CMDLINE | ||
136 | if (cmd_line[0] == 0) | ||
137 | strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line)); | ||
138 | #endif /* CONFIG_CMDLINE */ | ||
139 | |||
140 | probe_machine(); | 134 | probe_machine(); |
141 | 135 | ||
142 | #ifdef CONFIG_6xx | 136 | #ifdef CONFIG_6xx |
@@ -235,7 +229,7 @@ arch_initcall(ppc_init); | |||
235 | /* Warning, IO base is not yet inited */ | 229 | /* Warning, IO base is not yet inited */ |
236 | void __init setup_arch(char **cmdline_p) | 230 | void __init setup_arch(char **cmdline_p) |
237 | { | 231 | { |
238 | extern void do_init_bootmem(void); | 232 | *cmdline_p = cmd_line; |
239 | 233 | ||
240 | /* so udelay does something sensible, assume <= 1000 bogomips */ | 234 | /* so udelay does something sensible, assume <= 1000 bogomips */ |
241 | loops_per_jiffy = 500000000 / HZ; | 235 | loops_per_jiffy = 500000000 / HZ; |
@@ -285,16 +279,16 @@ void __init setup_arch(char **cmdline_p) | |||
285 | /* reboot on panic */ | 279 | /* reboot on panic */ |
286 | panic_timeout = 180; | 280 | panic_timeout = 180; |
287 | 281 | ||
282 | if (ppc_md.panic) | ||
283 | setup_panic(); | ||
284 | |||
288 | init_mm.start_code = PAGE_OFFSET; | 285 | init_mm.start_code = PAGE_OFFSET; |
289 | init_mm.end_code = (unsigned long) _etext; | 286 | init_mm.end_code = (unsigned long) _etext; |
290 | init_mm.end_data = (unsigned long) _edata; | 287 | init_mm.end_data = (unsigned long) _edata; |
291 | init_mm.brk = klimit; | 288 | init_mm.brk = klimit; |
292 | 289 | ||
293 | /* Save unparsed command line copy for /proc/cmdline */ | 290 | if (do_early_xmon) |
294 | strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); | 291 | debugger(NULL); |
295 | *cmdline_p = cmd_line; | ||
296 | |||
297 | parse_early_param(); | ||
298 | 292 | ||
299 | /* set up the bootmem stuff with available memory */ | 293 | /* set up the bootmem stuff with available memory */ |
300 | do_init_bootmem(); | 294 | do_init_bootmem(); |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 4467c49903b6..78f3a5fd43f6 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -100,12 +100,6 @@ unsigned long SYSRQ_KEY; | |||
100 | #endif /* CONFIG_MAGIC_SYSRQ */ | 100 | #endif /* CONFIG_MAGIC_SYSRQ */ |
101 | 101 | ||
102 | 102 | ||
103 | static int ppc64_panic_event(struct notifier_block *, unsigned long, void *); | ||
104 | static struct notifier_block ppc64_panic_block = { | ||
105 | .notifier_call = ppc64_panic_event, | ||
106 | .priority = INT_MIN /* may not return; must be done last */ | ||
107 | }; | ||
108 | |||
109 | #ifdef CONFIG_SMP | 103 | #ifdef CONFIG_SMP |
110 | 104 | ||
111 | static int smt_enabled_cmdline; | 105 | static int smt_enabled_cmdline; |
@@ -199,9 +193,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
199 | /* Probe the machine type */ | 193 | /* Probe the machine type */ |
200 | probe_machine(); | 194 | probe_machine(); |
201 | 195 | ||
202 | #ifdef CONFIG_CRASH_DUMP | 196 | setup_kdump_trampoline(); |
203 | kdump_setup(); | ||
204 | #endif | ||
205 | 197 | ||
206 | DBG("Found, Initializing memory management...\n"); | 198 | DBG("Found, Initializing memory management...\n"); |
207 | 199 | ||
@@ -353,9 +345,6 @@ void __init setup_system(void) | |||
353 | { | 345 | { |
354 | DBG(" -> setup_system()\n"); | 346 | DBG(" -> setup_system()\n"); |
355 | 347 | ||
356 | #ifdef CONFIG_KEXEC | ||
357 | kdump_move_device_tree(); | ||
358 | #endif | ||
359 | /* | 348 | /* |
360 | * Unflatten the device-tree passed by prom_init or kexec | 349 | * Unflatten the device-tree passed by prom_init or kexec |
361 | */ | 350 | */ |
@@ -420,10 +409,8 @@ void __init setup_system(void) | |||
420 | */ | 409 | */ |
421 | register_early_udbg_console(); | 410 | register_early_udbg_console(); |
422 | 411 | ||
423 | /* Save unparsed command line copy for /proc/cmdline */ | 412 | if (do_early_xmon) |
424 | strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); | 413 | debugger(NULL); |
425 | |||
426 | parse_early_param(); | ||
427 | 414 | ||
428 | check_smt_enabled(); | 415 | check_smt_enabled(); |
429 | smp_setup_cpu_maps(); | 416 | smp_setup_cpu_maps(); |
@@ -456,13 +443,6 @@ void __init setup_system(void) | |||
456 | DBG(" <- setup_system()\n"); | 443 | DBG(" <- setup_system()\n"); |
457 | } | 444 | } |
458 | 445 | ||
459 | static int ppc64_panic_event(struct notifier_block *this, | ||
460 | unsigned long event, void *ptr) | ||
461 | { | ||
462 | ppc_md.panic((char *)ptr); /* May not return */ | ||
463 | return NOTIFY_DONE; | ||
464 | } | ||
465 | |||
466 | #ifdef CONFIG_IRQSTACKS | 446 | #ifdef CONFIG_IRQSTACKS |
467 | static void __init irqstack_early_init(void) | 447 | static void __init irqstack_early_init(void) |
468 | { | 448 | { |
@@ -517,8 +497,6 @@ static void __init emergency_stack_init(void) | |||
517 | */ | 497 | */ |
518 | void __init setup_arch(char **cmdline_p) | 498 | void __init setup_arch(char **cmdline_p) |
519 | { | 499 | { |
520 | extern void do_init_bootmem(void); | ||
521 | |||
522 | ppc64_boot_msg(0x12, "Setup Arch"); | 500 | ppc64_boot_msg(0x12, "Setup Arch"); |
523 | 501 | ||
524 | *cmdline_p = cmd_line; | 502 | *cmdline_p = cmd_line; |
@@ -535,8 +513,7 @@ void __init setup_arch(char **cmdline_p) | |||
535 | panic_timeout = 180; | 513 | panic_timeout = 180; |
536 | 514 | ||
537 | if (ppc_md.panic) | 515 | if (ppc_md.panic) |
538 | atomic_notifier_chain_register(&panic_notifier_list, | 516 | setup_panic(); |
539 | &ppc64_panic_block); | ||
540 | 517 | ||
541 | init_mm.start_code = PAGE_OFFSET; | 518 | init_mm.start_code = PAGE_OFFSET; |
542 | init_mm.end_code = (unsigned long) _etext; | 519 | init_mm.end_code = (unsigned long) _etext; |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 8fdeca2d4597..d73b25e22fca 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -419,9 +419,7 @@ static long restore_user_regs(struct pt_regs *regs, | |||
419 | { | 419 | { |
420 | long err; | 420 | long err; |
421 | unsigned int save_r2 = 0; | 421 | unsigned int save_r2 = 0; |
422 | #if defined(CONFIG_ALTIVEC) || defined(CONFIG_SPE) | ||
423 | unsigned long msr; | 422 | unsigned long msr; |
424 | #endif | ||
425 | 423 | ||
426 | /* | 424 | /* |
427 | * restore general registers but not including MSR or SOFTE. Also | 425 | * restore general registers but not including MSR or SOFTE. Also |
@@ -430,11 +428,16 @@ static long restore_user_regs(struct pt_regs *regs, | |||
430 | if (!sig) | 428 | if (!sig) |
431 | save_r2 = (unsigned int)regs->gpr[2]; | 429 | save_r2 = (unsigned int)regs->gpr[2]; |
432 | err = restore_general_regs(regs, sr); | 430 | err = restore_general_regs(regs, sr); |
431 | err |= __get_user(msr, &sr->mc_gregs[PT_MSR]); | ||
433 | if (!sig) | 432 | if (!sig) |
434 | regs->gpr[2] = (unsigned long) save_r2; | 433 | regs->gpr[2] = (unsigned long) save_r2; |
435 | if (err) | 434 | if (err) |
436 | return 1; | 435 | return 1; |
437 | 436 | ||
437 | /* if doing signal return, restore the previous little-endian mode */ | ||
438 | if (sig) | ||
439 | regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE); | ||
440 | |||
438 | /* | 441 | /* |
439 | * Do this before updating the thread state in | 442 | * Do this before updating the thread state in |
440 | * current->thread.fpr/vr/evr. That way, if we get preempted | 443 | * current->thread.fpr/vr/evr. That way, if we get preempted |
@@ -455,7 +458,7 @@ static long restore_user_regs(struct pt_regs *regs, | |||
455 | /* force the process to reload the altivec registers from | 458 | /* force the process to reload the altivec registers from |
456 | current->thread when it next does altivec instructions */ | 459 | current->thread when it next does altivec instructions */ |
457 | regs->msr &= ~MSR_VEC; | 460 | regs->msr &= ~MSR_VEC; |
458 | if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_VEC) != 0) { | 461 | if (msr & MSR_VEC) { |
459 | /* restore altivec registers from the stack */ | 462 | /* restore altivec registers from the stack */ |
460 | if (__copy_from_user(current->thread.vr, &sr->mc_vregs, | 463 | if (__copy_from_user(current->thread.vr, &sr->mc_vregs, |
461 | sizeof(sr->mc_vregs))) | 464 | sizeof(sr->mc_vregs))) |
@@ -472,7 +475,7 @@ static long restore_user_regs(struct pt_regs *regs, | |||
472 | /* force the process to reload the spe registers from | 475 | /* force the process to reload the spe registers from |
473 | current->thread when it next does spe instructions */ | 476 | current->thread when it next does spe instructions */ |
474 | regs->msr &= ~MSR_SPE; | 477 | regs->msr &= ~MSR_SPE; |
475 | if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_SPE) != 0) { | 478 | if (msr & MSR_SPE) { |
476 | /* restore spe registers from the stack */ | 479 | /* restore spe registers from the stack */ |
477 | if (__copy_from_user(current->thread.evr, &sr->mc_vregs, | 480 | if (__copy_from_user(current->thread.evr, &sr->mc_vregs, |
478 | ELF_NEVRREG * sizeof(u32))) | 481 | ELF_NEVRREG * sizeof(u32))) |
@@ -757,10 +760,10 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka, | |||
757 | 760 | ||
758 | /* Save user registers on the stack */ | 761 | /* Save user registers on the stack */ |
759 | frame = &rt_sf->uc.uc_mcontext; | 762 | frame = &rt_sf->uc.uc_mcontext; |
760 | if (vdso32_rt_sigtramp && current->thread.vdso_base) { | 763 | if (vdso32_rt_sigtramp && current->mm->context.vdso_base) { |
761 | if (save_user_regs(regs, frame, 0)) | 764 | if (save_user_regs(regs, frame, 0)) |
762 | goto badframe; | 765 | goto badframe; |
763 | regs->link = current->thread.vdso_base + vdso32_rt_sigtramp; | 766 | regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp; |
764 | } else { | 767 | } else { |
765 | if (save_user_regs(regs, frame, __NR_rt_sigreturn)) | 768 | if (save_user_regs(regs, frame, __NR_rt_sigreturn)) |
766 | goto badframe; | 769 | goto badframe; |
@@ -777,6 +780,8 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka, | |||
777 | regs->gpr[5] = (unsigned long) &rt_sf->uc; | 780 | regs->gpr[5] = (unsigned long) &rt_sf->uc; |
778 | regs->gpr[6] = (unsigned long) rt_sf; | 781 | regs->gpr[6] = (unsigned long) rt_sf; |
779 | regs->nip = (unsigned long) ka->sa.sa_handler; | 782 | regs->nip = (unsigned long) ka->sa.sa_handler; |
783 | /* enter the signal handler in big-endian mode */ | ||
784 | regs->msr &= ~MSR_LE; | ||
780 | regs->trap = 0; | 785 | regs->trap = 0; |
781 | return 1; | 786 | return 1; |
782 | 787 | ||
@@ -1038,10 +1043,10 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka, | |||
1038 | || __put_user(sig, &sc->signal)) | 1043 | || __put_user(sig, &sc->signal)) |
1039 | goto badframe; | 1044 | goto badframe; |
1040 | 1045 | ||
1041 | if (vdso32_sigtramp && current->thread.vdso_base) { | 1046 | if (vdso32_sigtramp && current->mm->context.vdso_base) { |
1042 | if (save_user_regs(regs, &frame->mctx, 0)) | 1047 | if (save_user_regs(regs, &frame->mctx, 0)) |
1043 | goto badframe; | 1048 | goto badframe; |
1044 | regs->link = current->thread.vdso_base + vdso32_sigtramp; | 1049 | regs->link = current->mm->context.vdso_base + vdso32_sigtramp; |
1045 | } else { | 1050 | } else { |
1046 | if (save_user_regs(regs, &frame->mctx, __NR_sigreturn)) | 1051 | if (save_user_regs(regs, &frame->mctx, __NR_sigreturn)) |
1047 | goto badframe; | 1052 | goto badframe; |
@@ -1056,6 +1061,8 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka, | |||
1056 | regs->gpr[3] = sig; | 1061 | regs->gpr[3] = sig; |
1057 | regs->gpr[4] = (unsigned long) sc; | 1062 | regs->gpr[4] = (unsigned long) sc; |
1058 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1063 | regs->nip = (unsigned long) ka->sa.sa_handler; |
1064 | /* enter the signal handler in big-endian mode */ | ||
1065 | regs->msr &= ~MSR_LE; | ||
1059 | regs->trap = 0; | 1066 | regs->trap = 0; |
1060 | 1067 | ||
1061 | return 1; | 1068 | return 1; |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index c2db642f4cdd..6e75d7ab6d4d 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -141,9 +141,7 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
141 | unsigned long err = 0; | 141 | unsigned long err = 0; |
142 | unsigned long save_r13 = 0; | 142 | unsigned long save_r13 = 0; |
143 | elf_greg_t *gregs = (elf_greg_t *)regs; | 143 | elf_greg_t *gregs = (elf_greg_t *)regs; |
144 | #ifdef CONFIG_ALTIVEC | ||
145 | unsigned long msr; | 144 | unsigned long msr; |
146 | #endif | ||
147 | int i; | 145 | int i; |
148 | 146 | ||
149 | /* If this is not a signal return, we preserve the TLS in r13 */ | 147 | /* If this is not a signal return, we preserve the TLS in r13 */ |
@@ -154,7 +152,12 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
154 | err |= __copy_from_user(regs, &sc->gp_regs, | 152 | err |= __copy_from_user(regs, &sc->gp_regs, |
155 | PT_MSR*sizeof(unsigned long)); | 153 | PT_MSR*sizeof(unsigned long)); |
156 | 154 | ||
157 | /* skip MSR and SOFTE */ | 155 | /* get MSR separately, transfer the LE bit if doing signal return */ |
156 | err |= __get_user(msr, &sc->gp_regs[PT_MSR]); | ||
157 | if (sig) | ||
158 | regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE); | ||
159 | |||
160 | /* skip SOFTE */ | ||
158 | for (i = PT_MSR+1; i <= PT_RESULT; i++) { | 161 | for (i = PT_MSR+1; i <= PT_RESULT; i++) { |
159 | if (i == PT_SOFTE) | 162 | if (i == PT_SOFTE) |
160 | continue; | 163 | continue; |
@@ -179,7 +182,6 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
179 | 182 | ||
180 | #ifdef CONFIG_ALTIVEC | 183 | #ifdef CONFIG_ALTIVEC |
181 | err |= __get_user(v_regs, &sc->v_regs); | 184 | err |= __get_user(v_regs, &sc->v_regs); |
182 | err |= __get_user(msr, &sc->gp_regs[PT_MSR]); | ||
183 | if (err) | 185 | if (err) |
184 | return err; | 186 | return err; |
185 | if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128))) | 187 | if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128))) |
@@ -396,8 +398,8 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
396 | current->thread.fpscr.val = 0; | 398 | current->thread.fpscr.val = 0; |
397 | 399 | ||
398 | /* Set up to return from userspace. */ | 400 | /* Set up to return from userspace. */ |
399 | if (vdso64_rt_sigtramp && current->thread.vdso_base) { | 401 | if (vdso64_rt_sigtramp && current->mm->context.vdso_base) { |
400 | regs->link = current->thread.vdso_base + vdso64_rt_sigtramp; | 402 | regs->link = current->mm->context.vdso_base + vdso64_rt_sigtramp; |
401 | } else { | 403 | } else { |
402 | err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]); | 404 | err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]); |
403 | if (err) | 405 | if (err) |
@@ -412,6 +414,8 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
412 | 414 | ||
413 | /* Set up "regs" so we "return" to the signal handler. */ | 415 | /* Set up "regs" so we "return" to the signal handler. */ |
414 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | 416 | err |= get_user(regs->nip, &funct_desc_ptr->entry); |
417 | /* enter the signal handler in big-endian mode */ | ||
418 | regs->msr &= ~MSR_LE; | ||
415 | regs->gpr[1] = newsp; | 419 | regs->gpr[1] = newsp; |
416 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | 420 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); |
417 | regs->gpr[3] = signr; | 421 | regs->gpr[3] = signr; |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 530f7dba0bd2..c5d179d4f818 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -492,7 +492,7 @@ int __devinit __cpu_up(unsigned int cpu) | |||
492 | * -- Cort | 492 | * -- Cort |
493 | */ | 493 | */ |
494 | if (system_state < SYSTEM_RUNNING) | 494 | if (system_state < SYSTEM_RUNNING) |
495 | for (c = 5000; c && !cpu_callin_map[cpu]; c--) | 495 | for (c = 50000; c && !cpu_callin_map[cpu]; c--) |
496 | udelay(100); | 496 | udelay(100); |
497 | #ifdef CONFIG_HOTPLUG_CPU | 497 | #ifdef CONFIG_HOTPLUG_CPU |
498 | else | 498 | else |
diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S index 26ed1f5ef16e..ee75ccf1a802 100644 --- a/arch/powerpc/kernel/systbl.S +++ b/arch/powerpc/kernel/systbl.S | |||
@@ -32,6 +32,10 @@ | |||
32 | #define SYS32ONLY(func) .long sys_##func | 32 | #define SYS32ONLY(func) .long sys_##func |
33 | #define SYSX(f, f3264, f32) .long f32 | 33 | #define SYSX(f, f3264, f32) .long f32 |
34 | #endif | 34 | #endif |
35 | #define SYSCALL_SPU(func) SYSCALL(func) | ||
36 | #define COMPAT_SYS_SPU(func) COMPAT_SYS(func) | ||
37 | #define PPC_SYS_SPU(func) PPC_SYS(func) | ||
38 | #define SYSX_SPU(f, f3264, f32) SYSX(f, f3264, f32) | ||
35 | 39 | ||
36 | #ifdef CONFIG_PPC64 | 40 | #ifdef CONFIG_PPC64 |
37 | #define sys_sigpending sys_ni_syscall | 41 | #define sys_sigpending sys_ni_syscall |
@@ -39,309 +43,4 @@ | |||
39 | #endif | 43 | #endif |
40 | 44 | ||
41 | _GLOBAL(sys_call_table) | 45 | _GLOBAL(sys_call_table) |
42 | SYSCALL(restart_syscall) | 46 | #include <asm/systbl.h> |
43 | SYSCALL(exit) | ||
44 | PPC_SYS(fork) | ||
45 | SYSCALL(read) | ||
46 | SYSCALL(write) | ||
47 | COMPAT_SYS(open) | ||
48 | SYSCALL(close) | ||
49 | COMPAT_SYS(waitpid) | ||
50 | COMPAT_SYS(creat) | ||
51 | SYSCALL(link) | ||
52 | SYSCALL(unlink) | ||
53 | COMPAT_SYS(execve) | ||
54 | SYSCALL(chdir) | ||
55 | COMPAT_SYS(time) | ||
56 | SYSCALL(mknod) | ||
57 | SYSCALL(chmod) | ||
58 | SYSCALL(lchown) | ||
59 | SYSCALL(ni_syscall) | ||
60 | OLDSYS(stat) | ||
61 | SYSX(sys_lseek,ppc32_lseek,sys_lseek) | ||
62 | SYSCALL(getpid) | ||
63 | COMPAT_SYS(mount) | ||
64 | SYSX(sys_ni_syscall,sys_oldumount,sys_oldumount) | ||
65 | SYSCALL(setuid) | ||
66 | SYSCALL(getuid) | ||
67 | COMPAT_SYS(stime) | ||
68 | COMPAT_SYS(ptrace) | ||
69 | SYSCALL(alarm) | ||
70 | OLDSYS(fstat) | ||
71 | COMPAT_SYS(pause) | ||
72 | COMPAT_SYS(utime) | ||
73 | SYSCALL(ni_syscall) | ||
74 | SYSCALL(ni_syscall) | ||
75 | COMPAT_SYS(access) | ||
76 | COMPAT_SYS(nice) | ||
77 | SYSCALL(ni_syscall) | ||
78 | SYSCALL(sync) | ||
79 | COMPAT_SYS(kill) | ||
80 | SYSCALL(rename) | ||
81 | COMPAT_SYS(mkdir) | ||
82 | SYSCALL(rmdir) | ||
83 | SYSCALL(dup) | ||
84 | SYSCALL(pipe) | ||
85 | COMPAT_SYS(times) | ||
86 | SYSCALL(ni_syscall) | ||
87 | SYSCALL(brk) | ||
88 | SYSCALL(setgid) | ||
89 | SYSCALL(getgid) | ||
90 | SYSCALL(signal) | ||
91 | SYSCALL(geteuid) | ||
92 | SYSCALL(getegid) | ||
93 | SYSCALL(acct) | ||
94 | SYSCALL(umount) | ||
95 | SYSCALL(ni_syscall) | ||
96 | COMPAT_SYS(ioctl) | ||
97 | COMPAT_SYS(fcntl) | ||
98 | SYSCALL(ni_syscall) | ||
99 | COMPAT_SYS(setpgid) | ||
100 | SYSCALL(ni_syscall) | ||
101 | SYSX(sys_ni_syscall,sys_olduname, sys_olduname) | ||
102 | COMPAT_SYS(umask) | ||
103 | SYSCALL(chroot) | ||
104 | SYSCALL(ustat) | ||
105 | SYSCALL(dup2) | ||
106 | SYSCALL(getppid) | ||
107 | SYSCALL(getpgrp) | ||
108 | SYSCALL(setsid) | ||
109 | SYS32ONLY(sigaction) | ||
110 | SYSCALL(sgetmask) | ||
111 | COMPAT_SYS(ssetmask) | ||
112 | SYSCALL(setreuid) | ||
113 | SYSCALL(setregid) | ||
114 | SYS32ONLY(sigsuspend) | ||
115 | COMPAT_SYS(sigpending) | ||
116 | COMPAT_SYS(sethostname) | ||
117 | COMPAT_SYS(setrlimit) | ||
118 | COMPAT_SYS(old_getrlimit) | ||
119 | COMPAT_SYS(getrusage) | ||
120 | COMPAT_SYS(gettimeofday) | ||
121 | COMPAT_SYS(settimeofday) | ||
122 | COMPAT_SYS(getgroups) | ||
123 | COMPAT_SYS(setgroups) | ||
124 | SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select) | ||
125 | SYSCALL(symlink) | ||
126 | OLDSYS(lstat) | ||
127 | COMPAT_SYS(readlink) | ||
128 | SYSCALL(uselib) | ||
129 | SYSCALL(swapon) | ||
130 | SYSCALL(reboot) | ||
131 | SYSX(sys_ni_syscall,old32_readdir,old_readdir) | ||
132 | SYSCALL(mmap) | ||
133 | SYSCALL(munmap) | ||
134 | SYSCALL(truncate) | ||
135 | SYSCALL(ftruncate) | ||
136 | SYSCALL(fchmod) | ||
137 | SYSCALL(fchown) | ||
138 | COMPAT_SYS(getpriority) | ||
139 | COMPAT_SYS(setpriority) | ||
140 | SYSCALL(ni_syscall) | ||
141 | COMPAT_SYS(statfs) | ||
142 | COMPAT_SYS(fstatfs) | ||
143 | SYSCALL(ni_syscall) | ||
144 | COMPAT_SYS(socketcall) | ||
145 | COMPAT_SYS(syslog) | ||
146 | COMPAT_SYS(setitimer) | ||
147 | COMPAT_SYS(getitimer) | ||
148 | COMPAT_SYS(newstat) | ||
149 | COMPAT_SYS(newlstat) | ||
150 | COMPAT_SYS(newfstat) | ||
151 | SYSX(sys_ni_syscall,sys_uname,sys_uname) | ||
152 | SYSCALL(ni_syscall) | ||
153 | SYSCALL(vhangup) | ||
154 | SYSCALL(ni_syscall) | ||
155 | SYSCALL(ni_syscall) | ||
156 | COMPAT_SYS(wait4) | ||
157 | SYSCALL(swapoff) | ||
158 | COMPAT_SYS(sysinfo) | ||
159 | COMPAT_SYS(ipc) | ||
160 | SYSCALL(fsync) | ||
161 | SYS32ONLY(sigreturn) | ||
162 | PPC_SYS(clone) | ||
163 | COMPAT_SYS(setdomainname) | ||
164 | PPC_SYS(newuname) | ||
165 | SYSCALL(ni_syscall) | ||
166 | COMPAT_SYS(adjtimex) | ||
167 | SYSCALL(mprotect) | ||
168 | SYSX(sys_ni_syscall,compat_sys_sigprocmask,sys_sigprocmask) | ||
169 | SYSCALL(ni_syscall) | ||
170 | SYSCALL(init_module) | ||
171 | SYSCALL(delete_module) | ||
172 | SYSCALL(ni_syscall) | ||
173 | SYSCALL(quotactl) | ||
174 | COMPAT_SYS(getpgid) | ||
175 | SYSCALL(fchdir) | ||
176 | SYSCALL(bdflush) | ||
177 | COMPAT_SYS(sysfs) | ||
178 | SYSX(ppc64_personality,ppc64_personality,sys_personality) | ||
179 | SYSCALL(ni_syscall) | ||
180 | SYSCALL(setfsuid) | ||
181 | SYSCALL(setfsgid) | ||
182 | SYSCALL(llseek) | ||
183 | COMPAT_SYS(getdents) | ||
184 | SYSX(sys_select,ppc32_select,ppc_select) | ||
185 | SYSCALL(flock) | ||
186 | SYSCALL(msync) | ||
187 | COMPAT_SYS(readv) | ||
188 | COMPAT_SYS(writev) | ||
189 | COMPAT_SYS(getsid) | ||
190 | SYSCALL(fdatasync) | ||
191 | COMPAT_SYS(sysctl) | ||
192 | SYSCALL(mlock) | ||
193 | SYSCALL(munlock) | ||
194 | SYSCALL(mlockall) | ||
195 | SYSCALL(munlockall) | ||
196 | COMPAT_SYS(sched_setparam) | ||
197 | COMPAT_SYS(sched_getparam) | ||
198 | COMPAT_SYS(sched_setscheduler) | ||
199 | COMPAT_SYS(sched_getscheduler) | ||
200 | SYSCALL(sched_yield) | ||
201 | COMPAT_SYS(sched_get_priority_max) | ||
202 | COMPAT_SYS(sched_get_priority_min) | ||
203 | COMPAT_SYS(sched_rr_get_interval) | ||
204 | COMPAT_SYS(nanosleep) | ||
205 | SYSCALL(mremap) | ||
206 | SYSCALL(setresuid) | ||
207 | SYSCALL(getresuid) | ||
208 | SYSCALL(ni_syscall) | ||
209 | SYSCALL(poll) | ||
210 | COMPAT_SYS(nfsservctl) | ||
211 | SYSCALL(setresgid) | ||
212 | SYSCALL(getresgid) | ||
213 | COMPAT_SYS(prctl) | ||
214 | COMPAT_SYS(rt_sigreturn) | ||
215 | COMPAT_SYS(rt_sigaction) | ||
216 | COMPAT_SYS(rt_sigprocmask) | ||
217 | COMPAT_SYS(rt_sigpending) | ||
218 | COMPAT_SYS(rt_sigtimedwait) | ||
219 | COMPAT_SYS(rt_sigqueueinfo) | ||
220 | COMPAT_SYS(rt_sigsuspend) | ||
221 | COMPAT_SYS(pread64) | ||
222 | COMPAT_SYS(pwrite64) | ||
223 | SYSCALL(chown) | ||
224 | SYSCALL(getcwd) | ||
225 | SYSCALL(capget) | ||
226 | SYSCALL(capset) | ||
227 | COMPAT_SYS(sigaltstack) | ||
228 | SYSX(sys_sendfile64,compat_sys_sendfile,sys_sendfile) | ||
229 | SYSCALL(ni_syscall) | ||
230 | SYSCALL(ni_syscall) | ||
231 | PPC_SYS(vfork) | ||
232 | COMPAT_SYS(getrlimit) | ||
233 | COMPAT_SYS(readahead) | ||
234 | SYS32ONLY(mmap2) | ||
235 | SYS32ONLY(truncate64) | ||
236 | SYS32ONLY(ftruncate64) | ||
237 | SYSX(sys_ni_syscall,sys_stat64,sys_stat64) | ||
238 | SYSX(sys_ni_syscall,sys_lstat64,sys_lstat64) | ||
239 | SYSX(sys_ni_syscall,sys_fstat64,sys_fstat64) | ||
240 | SYSCALL(pciconfig_read) | ||
241 | SYSCALL(pciconfig_write) | ||
242 | SYSCALL(pciconfig_iobase) | ||
243 | SYSCALL(ni_syscall) | ||
244 | SYSCALL(getdents64) | ||
245 | SYSCALL(pivot_root) | ||
246 | SYSX(sys_ni_syscall,compat_sys_fcntl64,sys_fcntl64) | ||
247 | SYSCALL(madvise) | ||
248 | SYSCALL(mincore) | ||
249 | SYSCALL(gettid) | ||
250 | SYSCALL(tkill) | ||
251 | SYSCALL(setxattr) | ||
252 | SYSCALL(lsetxattr) | ||
253 | SYSCALL(fsetxattr) | ||
254 | SYSCALL(getxattr) | ||
255 | SYSCALL(lgetxattr) | ||
256 | SYSCALL(fgetxattr) | ||
257 | SYSCALL(listxattr) | ||
258 | SYSCALL(llistxattr) | ||
259 | SYSCALL(flistxattr) | ||
260 | SYSCALL(removexattr) | ||
261 | SYSCALL(lremovexattr) | ||
262 | SYSCALL(fremovexattr) | ||
263 | COMPAT_SYS(futex) | ||
264 | COMPAT_SYS(sched_setaffinity) | ||
265 | COMPAT_SYS(sched_getaffinity) | ||
266 | SYSCALL(ni_syscall) | ||
267 | SYSCALL(ni_syscall) | ||
268 | SYS32ONLY(sendfile64) | ||
269 | COMPAT_SYS(io_setup) | ||
270 | SYSCALL(io_destroy) | ||
271 | COMPAT_SYS(io_getevents) | ||
272 | COMPAT_SYS(io_submit) | ||
273 | SYSCALL(io_cancel) | ||
274 | SYSCALL(set_tid_address) | ||
275 | SYSX(sys_fadvise64,ppc32_fadvise64,sys_fadvise64) | ||
276 | SYSCALL(exit_group) | ||
277 | SYSX(sys_lookup_dcookie,ppc32_lookup_dcookie,sys_lookup_dcookie) | ||
278 | SYSCALL(epoll_create) | ||
279 | SYSCALL(epoll_ctl) | ||
280 | SYSCALL(epoll_wait) | ||
281 | SYSCALL(remap_file_pages) | ||
282 | SYSX(sys_timer_create,compat_sys_timer_create,sys_timer_create) | ||
283 | COMPAT_SYS(timer_settime) | ||
284 | COMPAT_SYS(timer_gettime) | ||
285 | SYSCALL(timer_getoverrun) | ||
286 | SYSCALL(timer_delete) | ||
287 | COMPAT_SYS(clock_settime) | ||
288 | COMPAT_SYS(clock_gettime) | ||
289 | COMPAT_SYS(clock_getres) | ||
290 | COMPAT_SYS(clock_nanosleep) | ||
291 | SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) | ||
292 | COMPAT_SYS(tgkill) | ||
293 | COMPAT_SYS(utimes) | ||
294 | COMPAT_SYS(statfs64) | ||
295 | COMPAT_SYS(fstatfs64) | ||
296 | SYSX(sys_ni_syscall, ppc_fadvise64_64, ppc_fadvise64_64) | ||
297 | PPC_SYS(rtas) | ||
298 | OLDSYS(debug_setcontext) | ||
299 | SYSCALL(ni_syscall) | ||
300 | SYSCALL(ni_syscall) | ||
301 | COMPAT_SYS(mbind) | ||
302 | COMPAT_SYS(get_mempolicy) | ||
303 | COMPAT_SYS(set_mempolicy) | ||
304 | COMPAT_SYS(mq_open) | ||
305 | SYSCALL(mq_unlink) | ||
306 | COMPAT_SYS(mq_timedsend) | ||
307 | COMPAT_SYS(mq_timedreceive) | ||
308 | COMPAT_SYS(mq_notify) | ||
309 | COMPAT_SYS(mq_getsetattr) | ||
310 | COMPAT_SYS(kexec_load) | ||
311 | COMPAT_SYS(add_key) | ||
312 | COMPAT_SYS(request_key) | ||
313 | COMPAT_SYS(keyctl) | ||
314 | COMPAT_SYS(waitid) | ||
315 | COMPAT_SYS(ioprio_set) | ||
316 | COMPAT_SYS(ioprio_get) | ||
317 | SYSCALL(inotify_init) | ||
318 | SYSCALL(inotify_add_watch) | ||
319 | SYSCALL(inotify_rm_watch) | ||
320 | SYSCALL(spu_run) | ||
321 | SYSCALL(spu_create) | ||
322 | COMPAT_SYS(pselect6) | ||
323 | COMPAT_SYS(ppoll) | ||
324 | SYSCALL(unshare) | ||
325 | SYSCALL(splice) | ||
326 | SYSCALL(tee) | ||
327 | SYSCALL(vmsplice) | ||
328 | COMPAT_SYS(openat) | ||
329 | SYSCALL(mkdirat) | ||
330 | SYSCALL(mknodat) | ||
331 | SYSCALL(fchownat) | ||
332 | COMPAT_SYS(futimesat) | ||
333 | SYSX(sys_newfstatat, sys_fstatat64, sys_fstatat64) | ||
334 | SYSCALL(unlinkat) | ||
335 | SYSCALL(renameat) | ||
336 | SYSCALL(linkat) | ||
337 | SYSCALL(symlinkat) | ||
338 | SYSCALL(readlinkat) | ||
339 | SYSCALL(fchmodat) | ||
340 | SYSCALL(faccessat) | ||
341 | COMPAT_SYS(get_robust_list) | ||
342 | COMPAT_SYS(set_robust_list) | ||
343 | |||
344 | /* | ||
345 | * please add new calls to arch/powerpc/platforms/cell/spu_callbacks.c | ||
346 | * as well when appropriate. | ||
347 | */ | ||
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 24e3ad756de0..d20907561f46 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -76,7 +76,6 @@ | |||
76 | 76 | ||
77 | /* keep track of when we need to update the rtc */ | 77 | /* keep track of when we need to update the rtc */ |
78 | time_t last_rtc_update; | 78 | time_t last_rtc_update; |
79 | extern int piranha_simulator; | ||
80 | #ifdef CONFIG_PPC_ISERIES | 79 | #ifdef CONFIG_PPC_ISERIES |
81 | unsigned long iSeries_recal_titan = 0; | 80 | unsigned long iSeries_recal_titan = 0; |
82 | unsigned long iSeries_recal_tb = 0; | 81 | unsigned long iSeries_recal_tb = 0; |
@@ -858,42 +857,50 @@ int do_settimeofday(struct timespec *tv) | |||
858 | 857 | ||
859 | EXPORT_SYMBOL(do_settimeofday); | 858 | EXPORT_SYMBOL(do_settimeofday); |
860 | 859 | ||
861 | void __init generic_calibrate_decr(void) | 860 | static int __init get_freq(char *name, int cells, unsigned long *val) |
862 | { | 861 | { |
863 | struct device_node *cpu; | 862 | struct device_node *cpu; |
864 | unsigned int *fp; | 863 | unsigned int *fp; |
865 | int node_found; | 864 | int found = 0; |
866 | 865 | ||
867 | /* | 866 | /* The cpu node should have timebase and clock frequency properties */ |
868 | * The cpu node should have a timebase-frequency property | ||
869 | * to tell us the rate at which the decrementer counts. | ||
870 | */ | ||
871 | cpu = of_find_node_by_type(NULL, "cpu"); | 867 | cpu = of_find_node_by_type(NULL, "cpu"); |
872 | 868 | ||
873 | ppc_tb_freq = DEFAULT_TB_FREQ; /* hardcoded default */ | ||
874 | node_found = 0; | ||
875 | if (cpu) { | 869 | if (cpu) { |
876 | fp = (unsigned int *)get_property(cpu, "timebase-frequency", | 870 | fp = (unsigned int *)get_property(cpu, name, NULL); |
877 | NULL); | ||
878 | if (fp) { | 871 | if (fp) { |
879 | node_found = 1; | 872 | found = 1; |
880 | ppc_tb_freq = *fp; | 873 | *val = 0; |
874 | while (cells--) | ||
875 | *val = (*val << 32) | *fp++; | ||
881 | } | 876 | } |
877 | |||
878 | of_node_put(cpu); | ||
882 | } | 879 | } |
883 | if (!node_found) | 880 | |
881 | return found; | ||
882 | } | ||
883 | |||
884 | void __init generic_calibrate_decr(void) | ||
885 | { | ||
886 | ppc_tb_freq = DEFAULT_TB_FREQ; /* hardcoded default */ | ||
887 | |||
888 | if (!get_freq("ibm,extended-timebase-frequency", 2, &ppc_tb_freq) && | ||
889 | !get_freq("timebase-frequency", 1, &ppc_tb_freq)) { | ||
890 | |||
884 | printk(KERN_ERR "WARNING: Estimating decrementer frequency " | 891 | printk(KERN_ERR "WARNING: Estimating decrementer frequency " |
885 | "(not found)\n"); | 892 | "(not found)\n"); |
893 | } | ||
886 | 894 | ||
887 | ppc_proc_freq = DEFAULT_PROC_FREQ; | 895 | ppc_proc_freq = DEFAULT_PROC_FREQ; /* hardcoded default */ |
888 | node_found = 0; | 896 | |
889 | if (cpu) { | 897 | if (!get_freq("ibm,extended-clock-frequency", 2, &ppc_proc_freq) && |
890 | fp = (unsigned int *)get_property(cpu, "clock-frequency", | 898 | !get_freq("clock-frequency", 1, &ppc_proc_freq)) { |
891 | NULL); | 899 | |
892 | if (fp) { | 900 | printk(KERN_ERR "WARNING: Estimating processor frequency " |
893 | node_found = 1; | 901 | "(not found)\n"); |
894 | ppc_proc_freq = *fp; | ||
895 | } | ||
896 | } | 902 | } |
903 | |||
897 | #ifdef CONFIG_BOOKE | 904 | #ifdef CONFIG_BOOKE |
898 | /* Set the time base to zero */ | 905 | /* Set the time base to zero */ |
899 | mtspr(SPRN_TBWL, 0); | 906 | mtspr(SPRN_TBWL, 0); |
@@ -905,11 +912,6 @@ void __init generic_calibrate_decr(void) | |||
905 | /* Enable decrementer interrupt */ | 912 | /* Enable decrementer interrupt */ |
906 | mtspr(SPRN_TCR, TCR_DIE); | 913 | mtspr(SPRN_TCR, TCR_DIE); |
907 | #endif | 914 | #endif |
908 | if (!node_found) | ||
909 | printk(KERN_ERR "WARNING: Estimating processor frequency " | ||
910 | "(not found)\n"); | ||
911 | |||
912 | of_node_put(cpu); | ||
913 | } | 915 | } |
914 | 916 | ||
915 | unsigned long get_boot_time(void) | 917 | unsigned long get_boot_time(void) |
@@ -945,9 +947,9 @@ void __init time_init(void) | |||
945 | } else { | 947 | } else { |
946 | /* Normal PowerPC with timebase register */ | 948 | /* Normal PowerPC with timebase register */ |
947 | ppc_md.calibrate_decr(); | 949 | ppc_md.calibrate_decr(); |
948 | printk(KERN_INFO "time_init: decrementer frequency = %lu.%.6lu MHz\n", | 950 | printk(KERN_DEBUG "time_init: decrementer frequency = %lu.%.6lu MHz\n", |
949 | ppc_tb_freq / 1000000, ppc_tb_freq % 1000000); | 951 | ppc_tb_freq / 1000000, ppc_tb_freq % 1000000); |
950 | printk(KERN_INFO "time_init: processor frequency = %lu.%.6lu MHz\n", | 952 | printk(KERN_DEBUG "time_init: processor frequency = %lu.%.6lu MHz\n", |
951 | ppc_proc_freq / 1000000, ppc_proc_freq % 1000000); | 953 | ppc_proc_freq / 1000000, ppc_proc_freq % 1000000); |
952 | tb_last_stamp = tb_last_jiffy = get_tb(); | 954 | tb_last_stamp = tb_last_jiffy = get_tb(); |
953 | } | 955 | } |
@@ -1010,10 +1012,7 @@ void __init time_init(void) | |||
1010 | tb_to_ns_scale = scale; | 1012 | tb_to_ns_scale = scale; |
1011 | tb_to_ns_shift = shift; | 1013 | tb_to_ns_shift = shift; |
1012 | 1014 | ||
1013 | #ifdef CONFIG_PPC_ISERIES | 1015 | tm = get_boot_time(); |
1014 | if (!piranha_simulator) | ||
1015 | #endif | ||
1016 | tm = get_boot_time(); | ||
1017 | 1016 | ||
1018 | write_seqlock_irqsave(&xtime_lock, flags); | 1017 | write_seqlock_irqsave(&xtime_lock, flags); |
1019 | 1018 | ||
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 064a52564692..91a6e04d9741 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -658,7 +658,7 @@ static int emulate_instruction(struct pt_regs *regs) | |||
658 | u32 instword; | 658 | u32 instword; |
659 | u32 rd; | 659 | u32 rd; |
660 | 660 | ||
661 | if (!user_mode(regs)) | 661 | if (!user_mode(regs) || (regs->msr & MSR_LE)) |
662 | return -EINVAL; | 662 | return -EINVAL; |
663 | CHECK_FULL_REGS(regs); | 663 | CHECK_FULL_REGS(regs); |
664 | 664 | ||
@@ -805,9 +805,11 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
805 | 805 | ||
806 | void alignment_exception(struct pt_regs *regs) | 806 | void alignment_exception(struct pt_regs *regs) |
807 | { | 807 | { |
808 | int fixed; | 808 | int fixed = 0; |
809 | 809 | ||
810 | fixed = fix_alignment(regs); | 810 | /* we don't implement logging of alignment exceptions */ |
811 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | ||
812 | fixed = fix_alignment(regs); | ||
811 | 813 | ||
812 | if (fixed == 1) { | 814 | if (fixed == 1) { |
813 | regs->nip += 4; /* skip over emulated instruction */ | 815 | regs->nip += 4; /* skip over emulated instruction */ |
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index 3774e80094f5..67d9fd9ae2b5 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/console.h> | 16 | #include <linux/console.h> |
17 | #include <linux/init.h> | ||
17 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
18 | #include <asm/udbg.h> | 19 | #include <asm/udbg.h> |
19 | 20 | ||
@@ -141,12 +142,14 @@ static int early_console_initialized; | |||
141 | 142 | ||
142 | void __init disable_early_printk(void) | 143 | void __init disable_early_printk(void) |
143 | { | 144 | { |
144 | #if 1 | ||
145 | if (!early_console_initialized) | 145 | if (!early_console_initialized) |
146 | return; | 146 | return; |
147 | if (strstr(saved_command_line, "udbg-immortal")) { | ||
148 | printk(KERN_INFO "early console immortal !\n"); | ||
149 | return; | ||
150 | } | ||
147 | unregister_console(&udbg_console); | 151 | unregister_console(&udbg_console); |
148 | early_console_initialized = 0; | 152 | early_console_initialized = 0; |
149 | #endif | ||
150 | } | 153 | } |
151 | 154 | ||
152 | /* called by setup_system */ | 155 | /* called by setup_system */ |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 573afb68d69e..bc3e15be3087 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -223,6 +223,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, | |||
223 | struct vm_area_struct *vma; | 223 | struct vm_area_struct *vma; |
224 | unsigned long vdso_pages; | 224 | unsigned long vdso_pages; |
225 | unsigned long vdso_base; | 225 | unsigned long vdso_base; |
226 | int rc; | ||
226 | 227 | ||
227 | #ifdef CONFIG_PPC64 | 228 | #ifdef CONFIG_PPC64 |
228 | if (test_thread_flag(TIF_32BIT)) { | 229 | if (test_thread_flag(TIF_32BIT)) { |
@@ -237,20 +238,13 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, | |||
237 | vdso_base = VDSO32_MBASE; | 238 | vdso_base = VDSO32_MBASE; |
238 | #endif | 239 | #endif |
239 | 240 | ||
240 | current->thread.vdso_base = 0; | 241 | current->mm->context.vdso_base = 0; |
241 | 242 | ||
242 | /* vDSO has a problem and was disabled, just don't "enable" it for the | 243 | /* vDSO has a problem and was disabled, just don't "enable" it for the |
243 | * process | 244 | * process |
244 | */ | 245 | */ |
245 | if (vdso_pages == 0) | 246 | if (vdso_pages == 0) |
246 | return 0; | 247 | return 0; |
247 | |||
248 | vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); | ||
249 | if (vma == NULL) | ||
250 | return -ENOMEM; | ||
251 | |||
252 | memset(vma, 0, sizeof(*vma)); | ||
253 | |||
254 | /* Add a page to the vdso size for the data page */ | 248 | /* Add a page to the vdso size for the data page */ |
255 | vdso_pages ++; | 249 | vdso_pages ++; |
256 | 250 | ||
@@ -259,17 +253,23 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, | |||
259 | * at vdso_base which is the "natural" base for it, but we might fail | 253 | * at vdso_base which is the "natural" base for it, but we might fail |
260 | * and end up putting it elsewhere. | 254 | * and end up putting it elsewhere. |
261 | */ | 255 | */ |
256 | down_write(&mm->mmap_sem); | ||
262 | vdso_base = get_unmapped_area(NULL, vdso_base, | 257 | vdso_base = get_unmapped_area(NULL, vdso_base, |
263 | vdso_pages << PAGE_SHIFT, 0, 0); | 258 | vdso_pages << PAGE_SHIFT, 0, 0); |
264 | if (vdso_base & ~PAGE_MASK) { | 259 | if (IS_ERR_VALUE(vdso_base)) { |
265 | kmem_cache_free(vm_area_cachep, vma); | 260 | rc = vdso_base; |
266 | return (int)vdso_base; | 261 | goto fail_mmapsem; |
267 | } | 262 | } |
268 | 263 | ||
269 | current->thread.vdso_base = vdso_base; | ||
270 | 264 | ||
265 | /* Allocate a VMA structure and fill it up */ | ||
266 | vma = kmem_cache_zalloc(vm_area_cachep, SLAB_KERNEL); | ||
267 | if (vma == NULL) { | ||
268 | rc = -ENOMEM; | ||
269 | goto fail_mmapsem; | ||
270 | } | ||
271 | vma->vm_mm = mm; | 271 | vma->vm_mm = mm; |
272 | vma->vm_start = current->thread.vdso_base; | 272 | vma->vm_start = vdso_base; |
273 | vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT); | 273 | vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT); |
274 | 274 | ||
275 | /* | 275 | /* |
@@ -282,23 +282,38 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, | |||
282 | * It's fine to use that for setting breakpoints in the vDSO code | 282 | * It's fine to use that for setting breakpoints in the vDSO code |
283 | * pages though | 283 | * pages though |
284 | */ | 284 | */ |
285 | vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; | 285 | vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC; |
286 | vma->vm_flags |= mm->def_flags; | 286 | vma->vm_flags |= mm->def_flags; |
287 | vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; | 287 | vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; |
288 | vma->vm_ops = &vdso_vmops; | 288 | vma->vm_ops = &vdso_vmops; |
289 | 289 | ||
290 | down_write(&mm->mmap_sem); | 290 | /* Insert new VMA */ |
291 | if (insert_vm_struct(mm, vma)) { | 291 | rc = insert_vm_struct(mm, vma); |
292 | up_write(&mm->mmap_sem); | 292 | if (rc) |
293 | kmem_cache_free(vm_area_cachep, vma); | 293 | goto fail_vma; |
294 | return -ENOMEM; | 294 | |
295 | } | 295 | /* Put vDSO base into mm struct and account for memory usage */ |
296 | current->mm->context.vdso_base = vdso_base; | ||
296 | mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 297 | mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
297 | up_write(&mm->mmap_sem); | 298 | up_write(&mm->mmap_sem); |
298 | |||
299 | return 0; | 299 | return 0; |
300 | |||
301 | fail_vma: | ||
302 | kmem_cache_free(vm_area_cachep, vma); | ||
303 | fail_mmapsem: | ||
304 | up_write(&mm->mmap_sem); | ||
305 | return rc; | ||
306 | } | ||
307 | |||
308 | const char *arch_vma_name(struct vm_area_struct *vma) | ||
309 | { | ||
310 | if (vma->vm_mm && vma->vm_start == vma->vm_mm->context.vdso_base) | ||
311 | return "[vdso]"; | ||
312 | return NULL; | ||
300 | } | 313 | } |
301 | 314 | ||
315 | |||
316 | |||
302 | static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname, | 317 | static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname, |
303 | unsigned long *size) | 318 | unsigned long *size) |
304 | { | 319 | { |
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index 66b3d03c5fa5..9416b4ab92ec 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S | |||
@@ -53,12 +53,12 @@ fpenable: | |||
53 | stfd fr31,8(r1) | 53 | stfd fr31,8(r1) |
54 | LDCONST(fr1, fpzero) | 54 | LDCONST(fr1, fpzero) |
55 | mffs fr31 | 55 | mffs fr31 |
56 | mtfsf 0xff,fr1 | 56 | MTFSF_L(fr1) |
57 | blr | 57 | blr |
58 | 58 | ||
59 | fpdisable: | 59 | fpdisable: |
60 | mtlr r12 | 60 | mtlr r12 |
61 | mtfsf 0xff,fr31 | 61 | MTFSF_L(fr31) |
62 | lfd fr31,8(r1) | 62 | lfd fr31,8(r1) |
63 | lfd fr1,16(r1) | 63 | lfd fr1,16(r1) |
64 | lfd fr0,24(r1) | 64 | lfd fr0,24(r1) |
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index 971020cf3f7d..cdf5867838a6 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c | |||
@@ -13,27 +13,116 @@ | |||
13 | * 2 of the License, or (at your option) any later version. | 13 | * 2 of the License, or (at your option) any later version. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/device.h> | ||
16 | #include <linux/init.h> | 18 | #include <linux/init.h> |
17 | #include <linux/console.h> | 19 | #include <linux/console.h> |
18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
19 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
20 | #include <linux/dma-mapping.h> | 22 | #include <linux/dma-mapping.h> |
23 | #include <linux/kobject.h> | ||
24 | |||
21 | #include <asm/iommu.h> | 25 | #include <asm/iommu.h> |
22 | #include <asm/dma.h> | 26 | #include <asm/dma.h> |
23 | #include <asm/vio.h> | 27 | #include <asm/vio.h> |
24 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
25 | 29 | #include <asm/firmware.h> | |
26 | static const struct vio_device_id *vio_match_device( | 30 | #include <asm/tce.h> |
27 | const struct vio_device_id *, const struct vio_dev *); | 31 | #include <asm/abs_addr.h> |
28 | 32 | #include <asm/page.h> | |
29 | struct vio_dev vio_bus_device = { /* fake "parent" device */ | 33 | #include <asm/hvcall.h> |
34 | #include <asm/iseries/vio.h> | ||
35 | #include <asm/iseries/hv_types.h> | ||
36 | #include <asm/iseries/hv_lp_config.h> | ||
37 | #include <asm/iseries/hv_call_xm.h> | ||
38 | #include <asm/iseries/iommu.h> | ||
39 | |||
40 | extern struct subsystem devices_subsys; /* needed for vio_find_name() */ | ||
41 | |||
42 | static struct vio_dev vio_bus_device = { /* fake "parent" device */ | ||
30 | .name = vio_bus_device.dev.bus_id, | 43 | .name = vio_bus_device.dev.bus_id, |
31 | .type = "", | 44 | .type = "", |
32 | .dev.bus_id = "vio", | 45 | .dev.bus_id = "vio", |
33 | .dev.bus = &vio_bus_type, | 46 | .dev.bus = &vio_bus_type, |
34 | }; | 47 | }; |
35 | 48 | ||
36 | static struct vio_bus_ops vio_bus_ops; | 49 | #ifdef CONFIG_PPC_ISERIES |
50 | struct device *iSeries_vio_dev = &vio_bus_device.dev; | ||
51 | EXPORT_SYMBOL(iSeries_vio_dev); | ||
52 | |||
53 | static struct iommu_table veth_iommu_table; | ||
54 | static struct iommu_table vio_iommu_table; | ||
55 | |||
56 | static void __init iommu_vio_init(void) | ||
57 | { | ||
58 | iommu_table_getparms_iSeries(255, 0, 0xff, &veth_iommu_table); | ||
59 | veth_iommu_table.it_size /= 2; | ||
60 | vio_iommu_table = veth_iommu_table; | ||
61 | vio_iommu_table.it_offset += veth_iommu_table.it_size; | ||
62 | |||
63 | if (!iommu_init_table(&veth_iommu_table, -1)) | ||
64 | printk("Virtual Bus VETH TCE table failed.\n"); | ||
65 | if (!iommu_init_table(&vio_iommu_table, -1)) | ||
66 | printk("Virtual Bus VIO TCE table failed.\n"); | ||
67 | } | ||
68 | #endif | ||
69 | |||
70 | static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev) | ||
71 | { | ||
72 | #ifdef CONFIG_PPC_ISERIES | ||
73 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
74 | if (strcmp(dev->type, "network") == 0) | ||
75 | return &veth_iommu_table; | ||
76 | return &vio_iommu_table; | ||
77 | } else | ||
78 | #endif | ||
79 | { | ||
80 | unsigned char *dma_window; | ||
81 | struct iommu_table *tbl; | ||
82 | unsigned long offset, size; | ||
83 | |||
84 | dma_window = get_property(dev->dev.platform_data, | ||
85 | "ibm,my-dma-window", NULL); | ||
86 | if (!dma_window) | ||
87 | return NULL; | ||
88 | |||
89 | tbl = kmalloc(sizeof(*tbl), GFP_KERNEL); | ||
90 | |||
91 | of_parse_dma_window(dev->dev.platform_data, dma_window, | ||
92 | &tbl->it_index, &offset, &size); | ||
93 | |||
94 | /* TCE table size - measured in tce entries */ | ||
95 | tbl->it_size = size >> PAGE_SHIFT; | ||
96 | /* offset for VIO should always be 0 */ | ||
97 | tbl->it_offset = offset >> PAGE_SHIFT; | ||
98 | tbl->it_busno = 0; | ||
99 | tbl->it_type = TCE_VB; | ||
100 | |||
101 | return iommu_init_table(tbl, -1); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | /** | ||
106 | * vio_match_device: - Tell if a VIO device has a matching | ||
107 | * VIO device id structure. | ||
108 | * @ids: array of VIO device id structures to search in | ||
109 | * @dev: the VIO device structure to match against | ||
110 | * | ||
111 | * Used by a driver to check whether a VIO device present in the | ||
112 | * system is in its list of supported devices. Returns the matching | ||
113 | * vio_device_id structure or NULL if there is no match. | ||
114 | */ | ||
115 | static const struct vio_device_id *vio_match_device( | ||
116 | const struct vio_device_id *ids, const struct vio_dev *dev) | ||
117 | { | ||
118 | while (ids->type[0] != '\0') { | ||
119 | if ((strncmp(dev->type, ids->type, strlen(ids->type)) == 0) && | ||
120 | device_is_compatible(dev->dev.platform_data, ids->compat)) | ||
121 | return ids; | ||
122 | ids++; | ||
123 | } | ||
124 | return NULL; | ||
125 | } | ||
37 | 126 | ||
38 | /* | 127 | /* |
39 | * Convert from struct device to struct vio_dev and pass to driver. | 128 | * Convert from struct device to struct vio_dev and pass to driver. |
@@ -106,35 +195,110 @@ void vio_unregister_driver(struct vio_driver *viodrv) | |||
106 | } | 195 | } |
107 | EXPORT_SYMBOL(vio_unregister_driver); | 196 | EXPORT_SYMBOL(vio_unregister_driver); |
108 | 197 | ||
198 | /* vio_dev refcount hit 0 */ | ||
199 | static void __devinit vio_dev_release(struct device *dev) | ||
200 | { | ||
201 | if (dev->platform_data) { | ||
202 | /* XXX free TCE table */ | ||
203 | of_node_put(dev->platform_data); | ||
204 | } | ||
205 | kfree(to_vio_dev(dev)); | ||
206 | } | ||
207 | |||
109 | /** | 208 | /** |
110 | * vio_match_device: - Tell if a VIO device has a matching | 209 | * vio_register_device_node: - Register a new vio device. |
111 | * VIO device id structure. | 210 | * @of_node: The OF node for this device. |
112 | * @ids: array of VIO device id structures to search in | ||
113 | * @dev: the VIO device structure to match against | ||
114 | * | 211 | * |
115 | * Used by a driver to check whether a VIO device present in the | 212 | * Creates and initializes a vio_dev structure from the data in |
116 | * system is in its list of supported devices. Returns the matching | 213 | * of_node (dev.platform_data) and adds it to the list of virtual devices. |
117 | * vio_device_id structure or NULL if there is no match. | 214 | * Returns a pointer to the created vio_dev or NULL if node has |
215 | * NULL device_type or compatible fields. | ||
118 | */ | 216 | */ |
119 | static const struct vio_device_id *vio_match_device( | 217 | struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node) |
120 | const struct vio_device_id *ids, const struct vio_dev *dev) | ||
121 | { | 218 | { |
122 | while (ids->type[0] != '\0') { | 219 | struct vio_dev *viodev; |
123 | if (vio_bus_ops.match(ids, dev)) | 220 | unsigned int *unit_address; |
124 | return ids; | 221 | unsigned int *irq_p; |
125 | ids++; | 222 | |
223 | /* we need the 'device_type' property, in order to match with drivers */ | ||
224 | if (of_node->type == NULL) { | ||
225 | printk(KERN_WARNING "%s: node %s missing 'device_type'\n", | ||
226 | __FUNCTION__, | ||
227 | of_node->name ? of_node->name : "<unknown>"); | ||
228 | return NULL; | ||
126 | } | 229 | } |
127 | return NULL; | 230 | |
231 | unit_address = (unsigned int *)get_property(of_node, "reg", NULL); | ||
232 | if (unit_address == NULL) { | ||
233 | printk(KERN_WARNING "%s: node %s missing 'reg'\n", | ||
234 | __FUNCTION__, | ||
235 | of_node->name ? of_node->name : "<unknown>"); | ||
236 | return NULL; | ||
237 | } | ||
238 | |||
239 | /* allocate a vio_dev for this node */ | ||
240 | viodev = kzalloc(sizeof(struct vio_dev), GFP_KERNEL); | ||
241 | if (viodev == NULL) | ||
242 | return NULL; | ||
243 | |||
244 | viodev->dev.platform_data = of_node_get(of_node); | ||
245 | |||
246 | viodev->irq = NO_IRQ; | ||
247 | irq_p = (unsigned int *)get_property(of_node, "interrupts", NULL); | ||
248 | if (irq_p) { | ||
249 | int virq = virt_irq_create_mapping(*irq_p); | ||
250 | if (virq == NO_IRQ) { | ||
251 | printk(KERN_ERR "Unable to allocate interrupt " | ||
252 | "number for %s\n", of_node->full_name); | ||
253 | } else | ||
254 | viodev->irq = irq_offset_up(virq); | ||
255 | } | ||
256 | |||
257 | snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%x", *unit_address); | ||
258 | viodev->name = of_node->name; | ||
259 | viodev->type = of_node->type; | ||
260 | viodev->unit_address = *unit_address; | ||
261 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
262 | unit_address = (unsigned int *)get_property(of_node, | ||
263 | "linux,unit_address", NULL); | ||
264 | if (unit_address != NULL) | ||
265 | viodev->unit_address = *unit_address; | ||
266 | } | ||
267 | viodev->iommu_table = vio_build_iommu_table(viodev); | ||
268 | |||
269 | /* init generic 'struct device' fields: */ | ||
270 | viodev->dev.parent = &vio_bus_device.dev; | ||
271 | viodev->dev.bus = &vio_bus_type; | ||
272 | viodev->dev.release = vio_dev_release; | ||
273 | |||
274 | /* register with generic device framework */ | ||
275 | if (device_register(&viodev->dev)) { | ||
276 | printk(KERN_ERR "%s: failed to register device %s\n", | ||
277 | __FUNCTION__, viodev->dev.bus_id); | ||
278 | /* XXX free TCE table */ | ||
279 | kfree(viodev); | ||
280 | return NULL; | ||
281 | } | ||
282 | |||
283 | return viodev; | ||
128 | } | 284 | } |
285 | EXPORT_SYMBOL(vio_register_device_node); | ||
129 | 286 | ||
130 | /** | 287 | /** |
131 | * vio_bus_init: - Initialize the virtual IO bus | 288 | * vio_bus_init: - Initialize the virtual IO bus |
132 | */ | 289 | */ |
133 | int __init vio_bus_init(struct vio_bus_ops *ops) | 290 | static int __init vio_bus_init(void) |
134 | { | 291 | { |
135 | int err; | 292 | int err; |
293 | struct device_node *node_vroot; | ||
136 | 294 | ||
137 | vio_bus_ops = *ops; | 295 | #ifdef CONFIG_PPC_ISERIES |
296 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
297 | iommu_vio_init(); | ||
298 | vio_bus_device.iommu_table = &vio_iommu_table; | ||
299 | iSeries_vio_dev = &vio_bus_device.dev; | ||
300 | } | ||
301 | #endif | ||
138 | 302 | ||
139 | err = bus_register(&vio_bus_type); | 303 | err = bus_register(&vio_bus_type); |
140 | if (err) { | 304 | if (err) { |
@@ -153,47 +317,48 @@ int __init vio_bus_init(struct vio_bus_ops *ops) | |||
153 | return err; | 317 | return err; |
154 | } | 318 | } |
155 | 319 | ||
156 | return 0; | 320 | node_vroot = find_devices("vdevice"); |
157 | } | 321 | if (node_vroot) { |
322 | struct device_node *of_node; | ||
323 | |||
324 | /* | ||
325 | * Create struct vio_devices for each virtual device in | ||
326 | * the device tree. Drivers will associate with them later. | ||
327 | */ | ||
328 | for (of_node = node_vroot->child; of_node != NULL; | ||
329 | of_node = of_node->sibling) { | ||
330 | printk(KERN_DEBUG "%s: processing %p\n", | ||
331 | __FUNCTION__, of_node); | ||
332 | vio_register_device_node(of_node); | ||
333 | } | ||
334 | } | ||
158 | 335 | ||
159 | /* vio_dev refcount hit 0 */ | 336 | return 0; |
160 | static void __devinit vio_dev_release(struct device *dev) | ||
161 | { | ||
162 | if (vio_bus_ops.release_device) | ||
163 | vio_bus_ops.release_device(dev); | ||
164 | kfree(to_vio_dev(dev)); | ||
165 | } | 337 | } |
338 | __initcall(vio_bus_init); | ||
166 | 339 | ||
167 | static ssize_t viodev_show_name(struct device *dev, | 340 | static ssize_t name_show(struct device *dev, |
168 | struct device_attribute *attr, char *buf) | 341 | struct device_attribute *attr, char *buf) |
169 | { | 342 | { |
170 | return sprintf(buf, "%s\n", to_vio_dev(dev)->name); | 343 | return sprintf(buf, "%s\n", to_vio_dev(dev)->name); |
171 | } | 344 | } |
172 | DEVICE_ATTR(name, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_name, NULL); | ||
173 | 345 | ||
174 | struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev) | 346 | static ssize_t devspec_show(struct device *dev, |
347 | struct device_attribute *attr, char *buf) | ||
175 | { | 348 | { |
176 | /* init generic 'struct device' fields: */ | 349 | struct device_node *of_node = dev->platform_data; |
177 | viodev->dev.parent = &vio_bus_device.dev; | ||
178 | viodev->dev.bus = &vio_bus_type; | ||
179 | viodev->dev.release = vio_dev_release; | ||
180 | |||
181 | /* register with generic device framework */ | ||
182 | if (device_register(&viodev->dev)) { | ||
183 | printk(KERN_ERR "%s: failed to register device %s\n", | ||
184 | __FUNCTION__, viodev->dev.bus_id); | ||
185 | return NULL; | ||
186 | } | ||
187 | device_create_file(&viodev->dev, &dev_attr_name); | ||
188 | 350 | ||
189 | return viodev; | 351 | return sprintf(buf, "%s\n", of_node ? of_node->full_name : "none"); |
190 | } | 352 | } |
191 | 353 | ||
354 | static struct device_attribute vio_dev_attrs[] = { | ||
355 | __ATTR_RO(name), | ||
356 | __ATTR_RO(devspec), | ||
357 | __ATTR_NULL | ||
358 | }; | ||
359 | |||
192 | void __devinit vio_unregister_device(struct vio_dev *viodev) | 360 | void __devinit vio_unregister_device(struct vio_dev *viodev) |
193 | { | 361 | { |
194 | if (vio_bus_ops.unregister_device) | ||
195 | vio_bus_ops.unregister_device(viodev); | ||
196 | device_remove_file(&viodev->dev, &dev_attr_name); | ||
197 | device_unregister(&viodev->dev); | 362 | device_unregister(&viodev->dev); |
198 | } | 363 | } |
199 | EXPORT_SYMBOL(vio_unregister_device); | 364 | EXPORT_SYMBOL(vio_unregister_device); |
@@ -229,7 +394,7 @@ static void *vio_alloc_coherent(struct device *dev, size_t size, | |||
229 | dma_addr_t *dma_handle, gfp_t flag) | 394 | dma_addr_t *dma_handle, gfp_t flag) |
230 | { | 395 | { |
231 | return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size, | 396 | return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size, |
232 | dma_handle, ~0ul, flag); | 397 | dma_handle, ~0ul, flag, -1); |
233 | } | 398 | } |
234 | 399 | ||
235 | static void vio_free_coherent(struct device *dev, size_t size, | 400 | static void vio_free_coherent(struct device *dev, size_t size, |
@@ -267,22 +432,23 @@ static int vio_hotplug(struct device *dev, char **envp, int num_envp, | |||
267 | char *buffer, int buffer_size) | 432 | char *buffer, int buffer_size) |
268 | { | 433 | { |
269 | const struct vio_dev *vio_dev = to_vio_dev(dev); | 434 | const struct vio_dev *vio_dev = to_vio_dev(dev); |
435 | struct device_node *dn = dev->platform_data; | ||
270 | char *cp; | 436 | char *cp; |
271 | int length; | 437 | int length; |
272 | 438 | ||
273 | if (!num_envp) | 439 | if (!num_envp) |
274 | return -ENOMEM; | 440 | return -ENOMEM; |
275 | 441 | ||
276 | if (!vio_dev->dev.platform_data) | 442 | if (!dn) |
277 | return -ENODEV; | 443 | return -ENODEV; |
278 | cp = (char *)get_property(vio_dev->dev.platform_data, "compatible", &length); | 444 | cp = (char *)get_property(dn, "compatible", &length); |
279 | if (!cp) | 445 | if (!cp) |
280 | return -ENODEV; | 446 | return -ENODEV; |
281 | 447 | ||
282 | envp[0] = buffer; | 448 | envp[0] = buffer; |
283 | length = scnprintf(buffer, buffer_size, "MODALIAS=vio:T%sS%s", | 449 | length = scnprintf(buffer, buffer_size, "MODALIAS=vio:T%sS%s", |
284 | vio_dev->type, cp); | 450 | vio_dev->type, cp); |
285 | if (buffer_size - length <= 0) | 451 | if ((buffer_size - length) <= 0) |
286 | return -ENOMEM; | 452 | return -ENOMEM; |
287 | envp[1] = NULL; | 453 | envp[1] = NULL; |
288 | return 0; | 454 | return 0; |
@@ -290,9 +456,81 @@ static int vio_hotplug(struct device *dev, char **envp, int num_envp, | |||
290 | 456 | ||
291 | struct bus_type vio_bus_type = { | 457 | struct bus_type vio_bus_type = { |
292 | .name = "vio", | 458 | .name = "vio", |
459 | .dev_attrs = vio_dev_attrs, | ||
293 | .uevent = vio_hotplug, | 460 | .uevent = vio_hotplug, |
294 | .match = vio_bus_match, | 461 | .match = vio_bus_match, |
295 | .probe = vio_bus_probe, | 462 | .probe = vio_bus_probe, |
296 | .remove = vio_bus_remove, | 463 | .remove = vio_bus_remove, |
297 | .shutdown = vio_bus_shutdown, | 464 | .shutdown = vio_bus_shutdown, |
298 | }; | 465 | }; |
466 | |||
467 | /** | ||
468 | * vio_get_attribute: - get attribute for virtual device | ||
469 | * @vdev: The vio device to get property. | ||
470 | * @which: The property/attribute to be extracted. | ||
471 | * @length: Pointer to length of returned data size (unused if NULL). | ||
472 | * | ||
473 | * Calls prom.c's get_property() to return the value of the | ||
474 | * attribute specified by @which | ||
475 | */ | ||
476 | const void *vio_get_attribute(struct vio_dev *vdev, char *which, int *length) | ||
477 | { | ||
478 | return get_property(vdev->dev.platform_data, which, length); | ||
479 | } | ||
480 | EXPORT_SYMBOL(vio_get_attribute); | ||
481 | |||
482 | #ifdef CONFIG_PPC_PSERIES | ||
483 | /* vio_find_name() - internal because only vio.c knows how we formatted the | ||
484 | * kobject name | ||
485 | * XXX once vio_bus_type.devices is actually used as a kset in | ||
486 | * drivers/base/bus.c, this function should be removed in favor of | ||
487 | * "device_find(kobj_name, &vio_bus_type)" | ||
488 | */ | ||
489 | static struct vio_dev *vio_find_name(const char *kobj_name) | ||
490 | { | ||
491 | struct kobject *found; | ||
492 | |||
493 | found = kset_find_obj(&devices_subsys.kset, kobj_name); | ||
494 | if (!found) | ||
495 | return NULL; | ||
496 | |||
497 | return to_vio_dev(container_of(found, struct device, kobj)); | ||
498 | } | ||
499 | |||
500 | /** | ||
501 | * vio_find_node - find an already-registered vio_dev | ||
502 | * @vnode: device_node of the virtual device we're looking for | ||
503 | */ | ||
504 | struct vio_dev *vio_find_node(struct device_node *vnode) | ||
505 | { | ||
506 | uint32_t *unit_address; | ||
507 | char kobj_name[BUS_ID_SIZE]; | ||
508 | |||
509 | /* construct the kobject name from the device node */ | ||
510 | unit_address = (uint32_t *)get_property(vnode, "reg", NULL); | ||
511 | if (!unit_address) | ||
512 | return NULL; | ||
513 | snprintf(kobj_name, BUS_ID_SIZE, "%x", *unit_address); | ||
514 | |||
515 | return vio_find_name(kobj_name); | ||
516 | } | ||
517 | EXPORT_SYMBOL(vio_find_node); | ||
518 | |||
519 | int vio_enable_interrupts(struct vio_dev *dev) | ||
520 | { | ||
521 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_ENABLE); | ||
522 | if (rc != H_SUCCESS) | ||
523 | printk(KERN_ERR "vio: Error 0x%x enabling interrupts\n", rc); | ||
524 | return rc; | ||
525 | } | ||
526 | EXPORT_SYMBOL(vio_enable_interrupts); | ||
527 | |||
528 | int vio_disable_interrupts(struct vio_dev *dev) | ||
529 | { | ||
530 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_DISABLE); | ||
531 | if (rc != H_SUCCESS) | ||
532 | printk(KERN_ERR "vio: Error 0x%x disabling interrupts\n", rc); | ||
533 | return rc; | ||
534 | } | ||
535 | EXPORT_SYMBOL(vio_disable_interrupts); | ||
536 | #endif /* CONFIG_PPC_PSERIES */ | ||
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index fe79c2584cb0..8b25953dc4f0 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -93,6 +93,11 @@ SECTIONS | |||
93 | __ptov_table_begin = .; | 93 | __ptov_table_begin = .; |
94 | *(.ptov_fixup); | 94 | *(.ptov_fixup); |
95 | __ptov_table_end = .; | 95 | __ptov_table_end = .; |
96 | #ifdef CONFIG_PPC_ISERIES | ||
97 | __dt_strings_start = .; | ||
98 | *(.dt_strings); | ||
99 | __dt_strings_end = .; | ||
100 | #endif | ||
96 | } | 101 | } |
97 | 102 | ||
98 | . = ALIGN(16); | 103 | . = ALIGN(16); |
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 34f5c2e074c9..ff7096458249 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile | |||
@@ -2,12 +2,15 @@ | |||
2 | # Makefile for ppc-specific library files.. | 2 | # Makefile for ppc-specific library files.. |
3 | # | 3 | # |
4 | 4 | ||
5 | ifeq ($(CONFIG_PPC64),y) | ||
6 | EXTRA_CFLAGS += -mno-minimal-toc | ||
7 | endif | ||
8 | |||
5 | ifeq ($(CONFIG_PPC_MERGE),y) | 9 | ifeq ($(CONFIG_PPC_MERGE),y) |
6 | obj-y := string.o strcase.o | 10 | obj-y := string.o strcase.o |
7 | obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o | 11 | obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o |
8 | endif | 12 | endif |
9 | 13 | ||
10 | obj-y += bitops.o | ||
11 | obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ | 14 | obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ |
12 | memcpy_64.o usercopy_64.o mem_64.o string.o \ | 15 | memcpy_64.o usercopy_64.o mem_64.o string.o \ |
13 | strcase.o | 16 | strcase.o |
diff --git a/arch/powerpc/lib/bitops.c b/arch/powerpc/lib/bitops.c deleted file mode 100644 index f68ad71a0187..000000000000 --- a/arch/powerpc/lib/bitops.c +++ /dev/null | |||
@@ -1,150 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <asm/byteorder.h> | ||
4 | #include <asm/bitops.h> | ||
5 | |||
6 | /** | ||
7 | * find_next_bit - find the next set bit in a memory region | ||
8 | * @addr: The address to base the search on | ||
9 | * @offset: The bitnumber to start searching at | ||
10 | * @size: The maximum size to search | ||
11 | */ | ||
12 | unsigned long find_next_bit(const unsigned long *addr, unsigned long size, | ||
13 | unsigned long offset) | ||
14 | { | ||
15 | const unsigned long *p = addr + BITOP_WORD(offset); | ||
16 | unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
17 | unsigned long tmp; | ||
18 | |||
19 | if (offset >= size) | ||
20 | return size; | ||
21 | size -= result; | ||
22 | offset %= BITS_PER_LONG; | ||
23 | if (offset) { | ||
24 | tmp = *(p++); | ||
25 | tmp &= (~0UL << offset); | ||
26 | if (size < BITS_PER_LONG) | ||
27 | goto found_first; | ||
28 | if (tmp) | ||
29 | goto found_middle; | ||
30 | size -= BITS_PER_LONG; | ||
31 | result += BITS_PER_LONG; | ||
32 | } | ||
33 | while (size & ~(BITS_PER_LONG-1)) { | ||
34 | if ((tmp = *(p++))) | ||
35 | goto found_middle; | ||
36 | result += BITS_PER_LONG; | ||
37 | size -= BITS_PER_LONG; | ||
38 | } | ||
39 | if (!size) | ||
40 | return result; | ||
41 | tmp = *p; | ||
42 | |||
43 | found_first: | ||
44 | tmp &= (~0UL >> (BITS_PER_LONG - size)); | ||
45 | if (tmp == 0UL) /* Are any bits set? */ | ||
46 | return result + size; /* Nope. */ | ||
47 | found_middle: | ||
48 | return result + __ffs(tmp); | ||
49 | } | ||
50 | EXPORT_SYMBOL(find_next_bit); | ||
51 | |||
52 | /* | ||
53 | * This implementation of find_{first,next}_zero_bit was stolen from | ||
54 | * Linus' asm-alpha/bitops.h. | ||
55 | */ | ||
56 | unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, | ||
57 | unsigned long offset) | ||
58 | { | ||
59 | const unsigned long *p = addr + BITOP_WORD(offset); | ||
60 | unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
61 | unsigned long tmp; | ||
62 | |||
63 | if (offset >= size) | ||
64 | return size; | ||
65 | size -= result; | ||
66 | offset %= BITS_PER_LONG; | ||
67 | if (offset) { | ||
68 | tmp = *(p++); | ||
69 | tmp |= ~0UL >> (BITS_PER_LONG - offset); | ||
70 | if (size < BITS_PER_LONG) | ||
71 | goto found_first; | ||
72 | if (~tmp) | ||
73 | goto found_middle; | ||
74 | size -= BITS_PER_LONG; | ||
75 | result += BITS_PER_LONG; | ||
76 | } | ||
77 | while (size & ~(BITS_PER_LONG-1)) { | ||
78 | if (~(tmp = *(p++))) | ||
79 | goto found_middle; | ||
80 | result += BITS_PER_LONG; | ||
81 | size -= BITS_PER_LONG; | ||
82 | } | ||
83 | if (!size) | ||
84 | return result; | ||
85 | tmp = *p; | ||
86 | |||
87 | found_first: | ||
88 | tmp |= ~0UL << size; | ||
89 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
90 | return result + size; /* Nope. */ | ||
91 | found_middle: | ||
92 | return result + ffz(tmp); | ||
93 | } | ||
94 | EXPORT_SYMBOL(find_next_zero_bit); | ||
95 | |||
96 | static inline unsigned int ext2_ilog2(unsigned int x) | ||
97 | { | ||
98 | int lz; | ||
99 | |||
100 | asm("cntlzw %0,%1": "=r"(lz):"r"(x)); | ||
101 | return 31 - lz; | ||
102 | } | ||
103 | |||
104 | static inline unsigned int ext2_ffz(unsigned int x) | ||
105 | { | ||
106 | u32 rc; | ||
107 | if ((x = ~x) == 0) | ||
108 | return 32; | ||
109 | rc = ext2_ilog2(x & -x); | ||
110 | return rc; | ||
111 | } | ||
112 | |||
113 | unsigned long find_next_zero_le_bit(const unsigned long *addr, | ||
114 | unsigned long size, unsigned long offset) | ||
115 | { | ||
116 | const unsigned int *p = ((const unsigned int *)addr) + (offset >> 5); | ||
117 | unsigned int result = offset & ~31; | ||
118 | unsigned int tmp; | ||
119 | |||
120 | if (offset >= size) | ||
121 | return size; | ||
122 | size -= result; | ||
123 | offset &= 31; | ||
124 | if (offset) { | ||
125 | tmp = cpu_to_le32p(p++); | ||
126 | tmp |= ~0U >> (32 - offset); /* bug or feature ? */ | ||
127 | if (size < 32) | ||
128 | goto found_first; | ||
129 | if (tmp != ~0) | ||
130 | goto found_middle; | ||
131 | size -= 32; | ||
132 | result += 32; | ||
133 | } | ||
134 | while (size >= 32) { | ||
135 | if ((tmp = cpu_to_le32p(p++)) != ~0) | ||
136 | goto found_middle; | ||
137 | result += 32; | ||
138 | size -= 32; | ||
139 | } | ||
140 | if (!size) | ||
141 | return result; | ||
142 | tmp = cpu_to_le32p(p); | ||
143 | found_first: | ||
144 | tmp |= ~0 << size; | ||
145 | if (tmp == ~0) /* Are any bits zero? */ | ||
146 | return result + size; /* Nope. */ | ||
147 | found_middle: | ||
148 | return result + ext2_ffz(tmp); | ||
149 | } | ||
150 | EXPORT_SYMBOL(find_next_zero_le_bit); | ||
diff --git a/arch/powerpc/mm/hash_low_32.S b/arch/powerpc/mm/hash_low_32.S index ea469eefa146..94255beeecd3 100644 --- a/arch/powerpc/mm/hash_low_32.S +++ b/arch/powerpc/mm/hash_low_32.S | |||
@@ -74,12 +74,6 @@ _GLOBAL(hash_page_sync) | |||
74 | */ | 74 | */ |
75 | .text | 75 | .text |
76 | _GLOBAL(hash_page) | 76 | _GLOBAL(hash_page) |
77 | #ifdef CONFIG_PPC64BRIDGE | ||
78 | mfmsr r0 | ||
79 | clrldi r0,r0,1 /* make sure it's in 32-bit mode */ | ||
80 | MTMSRD(r0) | ||
81 | isync | ||
82 | #endif | ||
83 | tophys(r7,0) /* gets -KERNELBASE into r7 */ | 77 | tophys(r7,0) /* gets -KERNELBASE into r7 */ |
84 | #ifdef CONFIG_SMP | 78 | #ifdef CONFIG_SMP |
85 | addis r8,r7,mmu_hash_lock@h | 79 | addis r8,r7,mmu_hash_lock@h |
@@ -285,7 +279,6 @@ Hash_base = 0xc0180000 | |||
285 | Hash_bits = 12 /* e.g. 256kB hash table */ | 279 | Hash_bits = 12 /* e.g. 256kB hash table */ |
286 | Hash_msk = (((1 << Hash_bits) - 1) * 64) | 280 | Hash_msk = (((1 << Hash_bits) - 1) * 64) |
287 | 281 | ||
288 | #ifndef CONFIG_PPC64BRIDGE | ||
289 | /* defines for the PTE format for 32-bit PPCs */ | 282 | /* defines for the PTE format for 32-bit PPCs */ |
290 | #define PTE_SIZE 8 | 283 | #define PTE_SIZE 8 |
291 | #define PTEG_SIZE 64 | 284 | #define PTEG_SIZE 64 |
@@ -299,21 +292,6 @@ Hash_msk = (((1 << Hash_bits) - 1) * 64) | |||
299 | #define SET_V(r) oris r,r,PTE_V@h | 292 | #define SET_V(r) oris r,r,PTE_V@h |
300 | #define CLR_V(r,t) rlwinm r,r,0,1,31 | 293 | #define CLR_V(r,t) rlwinm r,r,0,1,31 |
301 | 294 | ||
302 | #else | ||
303 | /* defines for the PTE format for 64-bit PPCs */ | ||
304 | #define PTE_SIZE 16 | ||
305 | #define PTEG_SIZE 128 | ||
306 | #define LG_PTEG_SIZE 7 | ||
307 | #define LDPTEu ldu | ||
308 | #define STPTE std | ||
309 | #define CMPPTE cmpd | ||
310 | #define PTE_H 2 | ||
311 | #define PTE_V 1 | ||
312 | #define TST_V(r) andi. r,r,PTE_V | ||
313 | #define SET_V(r) ori r,r,PTE_V | ||
314 | #define CLR_V(r,t) li t,PTE_V; andc r,r,t | ||
315 | #endif /* CONFIG_PPC64BRIDGE */ | ||
316 | |||
317 | #define HASH_LEFT 31-(LG_PTEG_SIZE+Hash_bits-1) | 295 | #define HASH_LEFT 31-(LG_PTEG_SIZE+Hash_bits-1) |
318 | #define HASH_RIGHT 31-LG_PTEG_SIZE | 296 | #define HASH_RIGHT 31-LG_PTEG_SIZE |
319 | 297 | ||
@@ -331,14 +309,8 @@ BEGIN_FTR_SECTION | |||
331 | END_FTR_SECTION_IFSET(CPU_FTR_NEED_COHERENT) | 309 | END_FTR_SECTION_IFSET(CPU_FTR_NEED_COHERENT) |
332 | 310 | ||
333 | /* Construct the high word of the PPC-style PTE (r5) */ | 311 | /* Construct the high word of the PPC-style PTE (r5) */ |
334 | #ifndef CONFIG_PPC64BRIDGE | ||
335 | rlwinm r5,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ | 312 | rlwinm r5,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ |
336 | rlwimi r5,r4,10,26,31 /* put in API (abbrev page index) */ | 313 | rlwimi r5,r4,10,26,31 /* put in API (abbrev page index) */ |
337 | #else /* CONFIG_PPC64BRIDGE */ | ||
338 | clrlwi r3,r3,8 /* reduce vsid to 24 bits */ | ||
339 | sldi r5,r3,12 /* shift vsid into position */ | ||
340 | rlwimi r5,r4,16,20,24 /* put in API (abbrev page index) */ | ||
341 | #endif /* CONFIG_PPC64BRIDGE */ | ||
342 | SET_V(r5) /* set V (valid) bit */ | 314 | SET_V(r5) /* set V (valid) bit */ |
343 | 315 | ||
344 | /* Get the address of the primary PTE group in the hash table (r3) */ | 316 | /* Get the address of the primary PTE group in the hash table (r3) */ |
@@ -516,14 +488,8 @@ _GLOBAL(flush_hash_pages) | |||
516 | add r3,r3,r0 /* note code below trims to 24 bits */ | 488 | add r3,r3,r0 /* note code below trims to 24 bits */ |
517 | 489 | ||
518 | /* Construct the high word of the PPC-style PTE (r11) */ | 490 | /* Construct the high word of the PPC-style PTE (r11) */ |
519 | #ifndef CONFIG_PPC64BRIDGE | ||
520 | rlwinm r11,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ | 491 | rlwinm r11,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ |
521 | rlwimi r11,r4,10,26,31 /* put in API (abbrev page index) */ | 492 | rlwimi r11,r4,10,26,31 /* put in API (abbrev page index) */ |
522 | #else /* CONFIG_PPC64BRIDGE */ | ||
523 | clrlwi r3,r3,8 /* reduce vsid to 24 bits */ | ||
524 | sldi r11,r3,12 /* shift vsid into position */ | ||
525 | rlwimi r11,r4,16,20,24 /* put in API (abbrev page index) */ | ||
526 | #endif /* CONFIG_PPC64BRIDGE */ | ||
527 | SET_V(r11) /* set V (valid) bit */ | 493 | SET_V(r11) /* set V (valid) bit */ |
528 | 494 | ||
529 | #ifdef CONFIG_SMP | 495 | #ifdef CONFIG_SMP |
diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S index e0d02c4a2615..52e914238959 100644 --- a/arch/powerpc/mm/hash_low_64.S +++ b/arch/powerpc/mm/hash_low_64.S | |||
@@ -136,6 +136,7 @@ _GLOBAL(__hash_page_4K) | |||
136 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ | 136 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ |
137 | andc r0,r30,r0 /* r0 = pte & ~r0 */ | 137 | andc r0,r30,r0 /* r0 = pte & ~r0 */ |
138 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ | 138 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ |
139 | ori r3,r3,HPTE_R_C /* Always add "C" bit for perf. */ | ||
139 | 140 | ||
140 | /* We eventually do the icache sync here (maybe inline that | 141 | /* We eventually do the icache sync here (maybe inline that |
141 | * code rather than call a C function...) | 142 | * code rather than call a C function...) |
@@ -368,6 +369,7 @@ _GLOBAL(__hash_page_4K) | |||
368 | rlwinm r30,r4,32-9+7,31-7,31-7 /* _PAGE_RW -> _PAGE_DIRTY */ | 369 | rlwinm r30,r4,32-9+7,31-7,31-7 /* _PAGE_RW -> _PAGE_DIRTY */ |
369 | or r30,r30,r31 | 370 | or r30,r30,r31 |
370 | ori r30,r30,_PAGE_BUSY | _PAGE_ACCESSED | _PAGE_HASHPTE | 371 | ori r30,r30,_PAGE_BUSY | _PAGE_ACCESSED | _PAGE_HASHPTE |
372 | oris r30,r30,_PAGE_COMBO@h | ||
371 | /* Write the linux PTE atomically (setting busy) */ | 373 | /* Write the linux PTE atomically (setting busy) */ |
372 | stdcx. r30,0,r6 | 374 | stdcx. r30,0,r6 |
373 | bne- 1b | 375 | bne- 1b |
@@ -400,6 +402,7 @@ _GLOBAL(__hash_page_4K) | |||
400 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ | 402 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ |
401 | andc r0,r30,r0 /* r0 = pte & ~r0 */ | 403 | andc r0,r30,r0 /* r0 = pte & ~r0 */ |
402 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ | 404 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ |
405 | ori r3,r3,HPTE_R_C /* Always add "C" bit for perf. */ | ||
403 | 406 | ||
404 | /* We eventually do the icache sync here (maybe inline that | 407 | /* We eventually do the icache sync here (maybe inline that |
405 | * code rather than call a C function...) | 408 | * code rather than call a C function...) |
@@ -426,6 +429,14 @@ END_FTR_SECTION(CPU_FTR_NOEXECUTE|CPU_FTR_COHERENT_ICACHE, CPU_FTR_NOEXECUTE) | |||
426 | andi. r0,r31,_PAGE_HASHPTE | 429 | andi. r0,r31,_PAGE_HASHPTE |
427 | li r26,0 /* Default hidx */ | 430 | li r26,0 /* Default hidx */ |
428 | beq htab_insert_pte | 431 | beq htab_insert_pte |
432 | |||
433 | /* | ||
434 | * Check if the pte was already inserted into the hash table | ||
435 | * as a 64k HW page, and invalidate the 64k HPTE if so. | ||
436 | */ | ||
437 | andis. r0,r31,_PAGE_COMBO@h | ||
438 | beq htab_inval_old_hpte | ||
439 | |||
429 | ld r6,STK_PARM(r6)(r1) | 440 | ld r6,STK_PARM(r6)(r1) |
430 | ori r26,r6,0x8000 /* Load the hidx mask */ | 441 | ori r26,r6,0x8000 /* Load the hidx mask */ |
431 | ld r26,0(r26) | 442 | ld r26,0(r26) |
@@ -496,6 +507,19 @@ _GLOBAL(htab_call_hpte_remove) | |||
496 | /* Try all again */ | 507 | /* Try all again */ |
497 | b htab_insert_pte | 508 | b htab_insert_pte |
498 | 509 | ||
510 | /* | ||
511 | * Call out to C code to invalidate an 64k HW HPTE that is | ||
512 | * useless now that the segment has been switched to 4k pages. | ||
513 | */ | ||
514 | htab_inval_old_hpte: | ||
515 | mr r3,r29 /* virtual addr */ | ||
516 | mr r4,r31 /* PTE.pte */ | ||
517 | li r5,0 /* PTE.hidx */ | ||
518 | li r6,MMU_PAGE_64K /* psize */ | ||
519 | ld r7,STK_PARM(r8)(r1) /* local */ | ||
520 | bl .flush_hash_page | ||
521 | b htab_insert_pte | ||
522 | |||
499 | htab_bail_ok: | 523 | htab_bail_ok: |
500 | li r3,0 | 524 | li r3,0 |
501 | b htab_bail | 525 | b htab_bail |
@@ -636,6 +660,12 @@ _GLOBAL(__hash_page_64K) | |||
636 | * is changing this PTE anyway and might hash it. | 660 | * is changing this PTE anyway and might hash it. |
637 | */ | 661 | */ |
638 | bne- ht64_bail_ok | 662 | bne- ht64_bail_ok |
663 | BEGIN_FTR_SECTION | ||
664 | /* Check if PTE has the cache-inhibit bit set */ | ||
665 | andi. r0,r31,_PAGE_NO_CACHE | ||
666 | /* If so, bail out and refault as a 4k page */ | ||
667 | bne- ht64_bail_ok | ||
668 | END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE) | ||
639 | /* Prepare new PTE value (turn access RW into DIRTY, then | 669 | /* Prepare new PTE value (turn access RW into DIRTY, then |
640 | * add BUSY,HASHPTE and ACCESSED) | 670 | * add BUSY,HASHPTE and ACCESSED) |
641 | */ | 671 | */ |
@@ -671,6 +701,7 @@ _GLOBAL(__hash_page_64K) | |||
671 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ | 701 | and r0,r0,r4 /* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/ |
672 | andc r0,r30,r0 /* r0 = pte & ~r0 */ | 702 | andc r0,r30,r0 /* r0 = pte & ~r0 */ |
673 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ | 703 | rlwimi r3,r0,32-1,31,31 /* Insert result into PP lsb */ |
704 | ori r3,r3,HPTE_R_C /* Always add "C" bit for perf. */ | ||
674 | 705 | ||
675 | /* We eventually do the icache sync here (maybe inline that | 706 | /* We eventually do the icache sync here (maybe inline that |
676 | * code rather than call a C function...) | 707 | * code rather than call a C function...) |
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index 994856e55b7c..a0f3cbd00d39 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
@@ -238,7 +238,7 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp, | |||
238 | DBG_LOW(" -> hit\n"); | 238 | DBG_LOW(" -> hit\n"); |
239 | /* Update the HPTE */ | 239 | /* Update the HPTE */ |
240 | hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) | | 240 | hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) | |
241 | (newpp & (HPTE_R_PP | HPTE_R_N)); | 241 | (newpp & (HPTE_R_PP | HPTE_R_N | HPTE_R_C)); |
242 | native_unlock_hpte(hptep); | 242 | native_unlock_hpte(hptep); |
243 | } | 243 | } |
244 | 244 | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index c006d9039633..d03fd2b4445e 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -92,10 +92,15 @@ unsigned long htab_size_bytes; | |||
92 | unsigned long htab_hash_mask; | 92 | unsigned long htab_hash_mask; |
93 | int mmu_linear_psize = MMU_PAGE_4K; | 93 | int mmu_linear_psize = MMU_PAGE_4K; |
94 | int mmu_virtual_psize = MMU_PAGE_4K; | 94 | int mmu_virtual_psize = MMU_PAGE_4K; |
95 | int mmu_vmalloc_psize = MMU_PAGE_4K; | ||
96 | int mmu_io_psize = MMU_PAGE_4K; | ||
95 | #ifdef CONFIG_HUGETLB_PAGE | 97 | #ifdef CONFIG_HUGETLB_PAGE |
96 | int mmu_huge_psize = MMU_PAGE_16M; | 98 | int mmu_huge_psize = MMU_PAGE_16M; |
97 | unsigned int HPAGE_SHIFT; | 99 | unsigned int HPAGE_SHIFT; |
98 | #endif | 100 | #endif |
101 | #ifdef CONFIG_PPC_64K_PAGES | ||
102 | int mmu_ci_restrictions; | ||
103 | #endif | ||
99 | 104 | ||
100 | /* There are definitions of page sizes arrays to be used when none | 105 | /* There are definitions of page sizes arrays to be used when none |
101 | * is provided by the firmware. | 106 | * is provided by the firmware. |
@@ -308,20 +313,31 @@ static void __init htab_init_page_sizes(void) | |||
308 | else if (mmu_psize_defs[MMU_PAGE_1M].shift) | 313 | else if (mmu_psize_defs[MMU_PAGE_1M].shift) |
309 | mmu_linear_psize = MMU_PAGE_1M; | 314 | mmu_linear_psize = MMU_PAGE_1M; |
310 | 315 | ||
316 | #ifdef CONFIG_PPC_64K_PAGES | ||
311 | /* | 317 | /* |
312 | * Pick a size for the ordinary pages. Default is 4K, we support | 318 | * Pick a size for the ordinary pages. Default is 4K, we support |
313 | * 64K if cache inhibited large pages are supported by the | 319 | * 64K for user mappings and vmalloc if supported by the processor. |
314 | * processor | 320 | * We only use 64k for ioremap if the processor |
321 | * (and firmware) support cache-inhibited large pages. | ||
322 | * If not, we use 4k and set mmu_ci_restrictions so that | ||
323 | * hash_page knows to switch processes that use cache-inhibited | ||
324 | * mappings to 4k pages. | ||
315 | */ | 325 | */ |
316 | #ifdef CONFIG_PPC_64K_PAGES | 326 | if (mmu_psize_defs[MMU_PAGE_64K].shift) { |
317 | if (mmu_psize_defs[MMU_PAGE_64K].shift && | ||
318 | cpu_has_feature(CPU_FTR_CI_LARGE_PAGE)) | ||
319 | mmu_virtual_psize = MMU_PAGE_64K; | 327 | mmu_virtual_psize = MMU_PAGE_64K; |
328 | mmu_vmalloc_psize = MMU_PAGE_64K; | ||
329 | if (cpu_has_feature(CPU_FTR_CI_LARGE_PAGE)) | ||
330 | mmu_io_psize = MMU_PAGE_64K; | ||
331 | else | ||
332 | mmu_ci_restrictions = 1; | ||
333 | } | ||
320 | #endif | 334 | #endif |
321 | 335 | ||
322 | printk(KERN_INFO "Page orders: linear mapping = %d, others = %d\n", | 336 | printk(KERN_DEBUG "Page orders: linear mapping = %d, " |
337 | "virtual = %d, io = %d\n", | ||
323 | mmu_psize_defs[mmu_linear_psize].shift, | 338 | mmu_psize_defs[mmu_linear_psize].shift, |
324 | mmu_psize_defs[mmu_virtual_psize].shift); | 339 | mmu_psize_defs[mmu_virtual_psize].shift, |
340 | mmu_psize_defs[mmu_io_psize].shift); | ||
325 | 341 | ||
326 | #ifdef CONFIG_HUGETLB_PAGE | 342 | #ifdef CONFIG_HUGETLB_PAGE |
327 | /* Init large page size. Currently, we pick 16M or 1M depending | 343 | /* Init large page size. Currently, we pick 16M or 1M depending |
@@ -556,6 +572,7 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) | |||
556 | pte_t *ptep; | 572 | pte_t *ptep; |
557 | cpumask_t tmp; | 573 | cpumask_t tmp; |
558 | int rc, user_region = 0, local = 0; | 574 | int rc, user_region = 0, local = 0; |
575 | int psize; | ||
559 | 576 | ||
560 | DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n", | 577 | DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n", |
561 | ea, access, trap); | 578 | ea, access, trap); |
@@ -575,10 +592,15 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) | |||
575 | return 1; | 592 | return 1; |
576 | } | 593 | } |
577 | vsid = get_vsid(mm->context.id, ea); | 594 | vsid = get_vsid(mm->context.id, ea); |
595 | psize = mm->context.user_psize; | ||
578 | break; | 596 | break; |
579 | case VMALLOC_REGION_ID: | 597 | case VMALLOC_REGION_ID: |
580 | mm = &init_mm; | 598 | mm = &init_mm; |
581 | vsid = get_kernel_vsid(ea); | 599 | vsid = get_kernel_vsid(ea); |
600 | if (ea < VMALLOC_END) | ||
601 | psize = mmu_vmalloc_psize; | ||
602 | else | ||
603 | psize = mmu_io_psize; | ||
582 | break; | 604 | break; |
583 | default: | 605 | default: |
584 | /* Not a valid range | 606 | /* Not a valid range |
@@ -629,7 +651,40 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) | |||
629 | #ifndef CONFIG_PPC_64K_PAGES | 651 | #ifndef CONFIG_PPC_64K_PAGES |
630 | rc = __hash_page_4K(ea, access, vsid, ptep, trap, local); | 652 | rc = __hash_page_4K(ea, access, vsid, ptep, trap, local); |
631 | #else | 653 | #else |
632 | if (mmu_virtual_psize == MMU_PAGE_64K) | 654 | if (mmu_ci_restrictions) { |
655 | /* If this PTE is non-cacheable, switch to 4k */ | ||
656 | if (psize == MMU_PAGE_64K && | ||
657 | (pte_val(*ptep) & _PAGE_NO_CACHE)) { | ||
658 | if (user_region) { | ||
659 | psize = MMU_PAGE_4K; | ||
660 | mm->context.user_psize = MMU_PAGE_4K; | ||
661 | mm->context.sllp = SLB_VSID_USER | | ||
662 | mmu_psize_defs[MMU_PAGE_4K].sllp; | ||
663 | } else if (ea < VMALLOC_END) { | ||
664 | /* | ||
665 | * some driver did a non-cacheable mapping | ||
666 | * in vmalloc space, so switch vmalloc | ||
667 | * to 4k pages | ||
668 | */ | ||
669 | printk(KERN_ALERT "Reducing vmalloc segment " | ||
670 | "to 4kB pages because of " | ||
671 | "non-cacheable mapping\n"); | ||
672 | psize = mmu_vmalloc_psize = MMU_PAGE_4K; | ||
673 | } | ||
674 | } | ||
675 | if (user_region) { | ||
676 | if (psize != get_paca()->context.user_psize) { | ||
677 | get_paca()->context = mm->context; | ||
678 | slb_flush_and_rebolt(); | ||
679 | } | ||
680 | } else if (get_paca()->vmalloc_sllp != | ||
681 | mmu_psize_defs[mmu_vmalloc_psize].sllp) { | ||
682 | get_paca()->vmalloc_sllp = | ||
683 | mmu_psize_defs[mmu_vmalloc_psize].sllp; | ||
684 | slb_flush_and_rebolt(); | ||
685 | } | ||
686 | } | ||
687 | if (psize == MMU_PAGE_64K) | ||
633 | rc = __hash_page_64K(ea, access, vsid, ptep, trap, local); | 688 | rc = __hash_page_64K(ea, access, vsid, ptep, trap, local); |
634 | else | 689 | else |
635 | rc = __hash_page_4K(ea, access, vsid, ptep, trap, local); | 690 | rc = __hash_page_4K(ea, access, vsid, ptep, trap, local); |
@@ -681,7 +736,18 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, | |||
681 | #ifndef CONFIG_PPC_64K_PAGES | 736 | #ifndef CONFIG_PPC_64K_PAGES |
682 | __hash_page_4K(ea, access, vsid, ptep, trap, local); | 737 | __hash_page_4K(ea, access, vsid, ptep, trap, local); |
683 | #else | 738 | #else |
684 | if (mmu_virtual_psize == MMU_PAGE_64K) | 739 | if (mmu_ci_restrictions) { |
740 | /* If this PTE is non-cacheable, switch to 4k */ | ||
741 | if (mm->context.user_psize == MMU_PAGE_64K && | ||
742 | (pte_val(*ptep) & _PAGE_NO_CACHE)) { | ||
743 | mm->context.user_psize = MMU_PAGE_4K; | ||
744 | mm->context.sllp = SLB_VSID_USER | | ||
745 | mmu_psize_defs[MMU_PAGE_4K].sllp; | ||
746 | get_paca()->context = mm->context; | ||
747 | slb_flush_and_rebolt(); | ||
748 | } | ||
749 | } | ||
750 | if (mm->context.user_psize == MMU_PAGE_64K) | ||
685 | __hash_page_64K(ea, access, vsid, ptep, trap, local); | 751 | __hash_page_64K(ea, access, vsid, ptep, trap, local); |
686 | else | 752 | else |
687 | __hash_page_4K(ea, access, vsid, ptep, trap, local); | 753 | __hash_page_4K(ea, access, vsid, ptep, trap, local); |
diff --git a/arch/powerpc/mm/lmb.c b/arch/powerpc/mm/lmb.c index 417d58518558..8b6f522655a6 100644 --- a/arch/powerpc/mm/lmb.c +++ b/arch/powerpc/mm/lmb.c | |||
@@ -89,20 +89,25 @@ static long __init lmb_regions_adjacent(struct lmb_region *rgn, | |||
89 | return lmb_addrs_adjacent(base1, size1, base2, size2); | 89 | return lmb_addrs_adjacent(base1, size1, base2, size2); |
90 | } | 90 | } |
91 | 91 | ||
92 | /* Assumption: base addr of region 1 < base addr of region 2 */ | 92 | static void __init lmb_remove_region(struct lmb_region *rgn, unsigned long r) |
93 | static void __init lmb_coalesce_regions(struct lmb_region *rgn, | ||
94 | unsigned long r1, unsigned long r2) | ||
95 | { | 93 | { |
96 | unsigned long i; | 94 | unsigned long i; |
97 | 95 | ||
98 | rgn->region[r1].size += rgn->region[r2].size; | 96 | for (i = r; i < rgn->cnt - 1; i++) { |
99 | for (i=r2; i < rgn->cnt-1; i++) { | 97 | rgn->region[i].base = rgn->region[i + 1].base; |
100 | rgn->region[i].base = rgn->region[i+1].base; | 98 | rgn->region[i].size = rgn->region[i + 1].size; |
101 | rgn->region[i].size = rgn->region[i+1].size; | ||
102 | } | 99 | } |
103 | rgn->cnt--; | 100 | rgn->cnt--; |
104 | } | 101 | } |
105 | 102 | ||
103 | /* Assumption: base addr of region 1 < base addr of region 2 */ | ||
104 | static void __init lmb_coalesce_regions(struct lmb_region *rgn, | ||
105 | unsigned long r1, unsigned long r2) | ||
106 | { | ||
107 | rgn->region[r1].size += rgn->region[r2].size; | ||
108 | lmb_remove_region(rgn, r2); | ||
109 | } | ||
110 | |||
106 | /* This routine called with relocation disabled. */ | 111 | /* This routine called with relocation disabled. */ |
107 | void __init lmb_init(void) | 112 | void __init lmb_init(void) |
108 | { | 113 | { |
@@ -294,17 +299,16 @@ unsigned long __init lmb_end_of_DRAM(void) | |||
294 | return (lmb.memory.region[idx].base + lmb.memory.region[idx].size); | 299 | return (lmb.memory.region[idx].base + lmb.memory.region[idx].size); |
295 | } | 300 | } |
296 | 301 | ||
297 | /* | 302 | /* You must call lmb_analyze() after this. */ |
298 | * Truncate the lmb list to memory_limit if it's set | ||
299 | * You must call lmb_analyze() after this. | ||
300 | */ | ||
301 | void __init lmb_enforce_memory_limit(unsigned long memory_limit) | 303 | void __init lmb_enforce_memory_limit(unsigned long memory_limit) |
302 | { | 304 | { |
303 | unsigned long i, limit; | 305 | unsigned long i, limit; |
306 | struct lmb_property *p; | ||
304 | 307 | ||
305 | if (! memory_limit) | 308 | if (! memory_limit) |
306 | return; | 309 | return; |
307 | 310 | ||
311 | /* Truncate the lmb regions to satisfy the memory limit. */ | ||
308 | limit = memory_limit; | 312 | limit = memory_limit; |
309 | for (i = 0; i < lmb.memory.cnt; i++) { | 313 | for (i = 0; i < lmb.memory.cnt; i++) { |
310 | if (limit > lmb.memory.region[i].size) { | 314 | if (limit > lmb.memory.region[i].size) { |
@@ -316,4 +320,21 @@ void __init lmb_enforce_memory_limit(unsigned long memory_limit) | |||
316 | lmb.memory.cnt = i + 1; | 320 | lmb.memory.cnt = i + 1; |
317 | break; | 321 | break; |
318 | } | 322 | } |
323 | |||
324 | lmb.rmo_size = lmb.memory.region[0].size; | ||
325 | |||
326 | /* And truncate any reserves above the limit also. */ | ||
327 | for (i = 0; i < lmb.reserved.cnt; i++) { | ||
328 | p = &lmb.reserved.region[i]; | ||
329 | |||
330 | if (p->base > memory_limit) | ||
331 | p->size = 0; | ||
332 | else if ((p->base + p->size) > memory_limit) | ||
333 | p->size = memory_limit - p->base; | ||
334 | |||
335 | if (p->size == 0) { | ||
336 | lmb_remove_region(&lmb.reserved, i); | ||
337 | i--; | ||
338 | } | ||
339 | } | ||
319 | } | 340 | } |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 741dd8802d49..69f3b9a20beb 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -299,9 +299,9 @@ void __init paging_init(void) | |||
299 | kmap_prot = PAGE_KERNEL; | 299 | kmap_prot = PAGE_KERNEL; |
300 | #endif /* CONFIG_HIGHMEM */ | 300 | #endif /* CONFIG_HIGHMEM */ |
301 | 301 | ||
302 | printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", | 302 | printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", |
303 | top_of_ram, total_ram); | 303 | top_of_ram, total_ram); |
304 | printk(KERN_INFO "Memory hole size: %ldMB\n", | 304 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", |
305 | (top_of_ram - total_ram) >> 20); | 305 | (top_of_ram - total_ram) >> 20); |
306 | /* | 306 | /* |
307 | * All pages are DMA-able so we put them all in the DMA zone. | 307 | * All pages are DMA-able so we put them all in the DMA zone. |
@@ -380,7 +380,7 @@ void __init mem_init(void) | |||
380 | totalhigh_pages++; | 380 | totalhigh_pages++; |
381 | } | 381 | } |
382 | totalram_pages += totalhigh_pages; | 382 | totalram_pages += totalhigh_pages; |
383 | printk(KERN_INFO "High memory: %luk\n", | 383 | printk(KERN_DEBUG "High memory: %luk\n", |
384 | totalhigh_pages << (PAGE_SHIFT-10)); | 384 | totalhigh_pages << (PAGE_SHIFT-10)); |
385 | } | 385 | } |
386 | #endif /* CONFIG_HIGHMEM */ | 386 | #endif /* CONFIG_HIGHMEM */ |
diff --git a/arch/powerpc/mm/mmu_context_32.c b/arch/powerpc/mm/mmu_context_32.c index a8816e0f6a86..e326e4249e1a 100644 --- a/arch/powerpc/mm/mmu_context_32.c +++ b/arch/powerpc/mm/mmu_context_32.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <asm/mmu_context.h> | 30 | #include <asm/mmu_context.h> |
31 | #include <asm/tlbflush.h> | 31 | #include <asm/tlbflush.h> |
32 | 32 | ||
33 | mm_context_t next_mmu_context; | 33 | unsigned long next_mmu_context; |
34 | unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; | 34 | unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; |
35 | #ifdef FEW_CONTEXTS | 35 | #ifdef FEW_CONTEXTS |
36 | atomic_t nr_free_contexts; | 36 | atomic_t nr_free_contexts; |
diff --git a/arch/powerpc/mm/mmu_context_64.c b/arch/powerpc/mm/mmu_context_64.c index 714a84dd8d5d..65d18dca266f 100644 --- a/arch/powerpc/mm/mmu_context_64.c +++ b/arch/powerpc/mm/mmu_context_64.c | |||
@@ -49,6 +49,9 @@ again: | |||
49 | } | 49 | } |
50 | 50 | ||
51 | mm->context.id = index; | 51 | mm->context.id = index; |
52 | mm->context.user_psize = mmu_virtual_psize; | ||
53 | mm->context.sllp = SLB_VSID_USER | | ||
54 | mmu_psize_defs[mmu_virtual_psize].sllp; | ||
52 | 55 | ||
53 | return 0; | 56 | return 0; |
54 | } | 57 | } |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 092355f37399..aa98cb3b59d8 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -487,9 +487,9 @@ static void __init setup_nonnuma(void) | |||
487 | unsigned long total_ram = lmb_phys_mem_size(); | 487 | unsigned long total_ram = lmb_phys_mem_size(); |
488 | unsigned int i; | 488 | unsigned int i; |
489 | 489 | ||
490 | printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", | 490 | printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", |
491 | top_of_ram, total_ram); | 491 | top_of_ram, total_ram); |
492 | printk(KERN_INFO "Memory hole size: %ldMB\n", | 492 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", |
493 | (top_of_ram - total_ram) >> 20); | 493 | (top_of_ram - total_ram) >> 20); |
494 | 494 | ||
495 | for (i = 0; i < lmb.memory.cnt; ++i) | 495 | for (i = 0; i < lmb.memory.cnt; ++i) |
@@ -507,7 +507,7 @@ void __init dump_numa_cpu_topology(void) | |||
507 | return; | 507 | return; |
508 | 508 | ||
509 | for_each_online_node(node) { | 509 | for_each_online_node(node) { |
510 | printk(KERN_INFO "Node %d CPUs:", node); | 510 | printk(KERN_DEBUG "Node %d CPUs:", node); |
511 | 511 | ||
512 | count = 0; | 512 | count = 0; |
513 | /* | 513 | /* |
@@ -543,7 +543,7 @@ static void __init dump_numa_memory_topology(void) | |||
543 | for_each_online_node(node) { | 543 | for_each_online_node(node) { |
544 | unsigned long i; | 544 | unsigned long i; |
545 | 545 | ||
546 | printk(KERN_INFO "Node %d Memory:", node); | 546 | printk(KERN_DEBUG "Node %d Memory:", node); |
547 | 547 | ||
548 | count = 0; | 548 | count = 0; |
549 | 549 | ||
diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c index ed7fcfe5fd37..2ed43a493b31 100644 --- a/arch/powerpc/mm/ppc_mmu_32.c +++ b/arch/powerpc/mm/ppc_mmu_32.c | |||
@@ -42,18 +42,14 @@ unsigned long _SDR1; | |||
42 | 42 | ||
43 | union ubat { /* BAT register values to be loaded */ | 43 | union ubat { /* BAT register values to be loaded */ |
44 | BAT bat; | 44 | BAT bat; |
45 | #ifdef CONFIG_PPC64BRIDGE | ||
46 | u64 word[2]; | ||
47 | #else | ||
48 | u32 word[2]; | 45 | u32 word[2]; |
49 | #endif | 46 | } BATS[8][2]; /* 8 pairs of IBAT, DBAT */ |
50 | } BATS[4][2]; /* 4 pairs of IBAT, DBAT */ | ||
51 | 47 | ||
52 | struct batrange { /* stores address ranges mapped by BATs */ | 48 | struct batrange { /* stores address ranges mapped by BATs */ |
53 | unsigned long start; | 49 | unsigned long start; |
54 | unsigned long limit; | 50 | unsigned long limit; |
55 | unsigned long phys; | 51 | unsigned long phys; |
56 | } bat_addrs[4]; | 52 | } bat_addrs[8]; |
57 | 53 | ||
58 | /* | 54 | /* |
59 | * Return PA for this VA if it is mapped by a BAT, or 0 | 55 | * Return PA for this VA if it is mapped by a BAT, or 0 |
@@ -190,7 +186,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, | |||
190 | return; | 186 | return; |
191 | pmd = pmd_offset(pgd_offset(mm, ea), ea); | 187 | pmd = pmd_offset(pgd_offset(mm, ea), ea); |
192 | if (!pmd_none(*pmd)) | 188 | if (!pmd_none(*pmd)) |
193 | add_hash_page(mm->context, ea, pmd_val(*pmd)); | 189 | add_hash_page(mm->context.id, ea, pmd_val(*pmd)); |
194 | } | 190 | } |
195 | 191 | ||
196 | /* | 192 | /* |
@@ -220,15 +216,9 @@ void __init MMU_init_hw(void) | |||
220 | 216 | ||
221 | if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105); | 217 | if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105); |
222 | 218 | ||
223 | #ifdef CONFIG_PPC64BRIDGE | ||
224 | #define LG_HPTEG_SIZE 7 /* 128 bytes per HPTEG */ | ||
225 | #define SDR1_LOW_BITS (lg_n_hpteg - 11) | ||
226 | #define MIN_N_HPTEG 2048 /* min 256kB hash table */ | ||
227 | #else | ||
228 | #define LG_HPTEG_SIZE 6 /* 64 bytes per HPTEG */ | 219 | #define LG_HPTEG_SIZE 6 /* 64 bytes per HPTEG */ |
229 | #define SDR1_LOW_BITS ((n_hpteg - 1) >> 10) | 220 | #define SDR1_LOW_BITS ((n_hpteg - 1) >> 10) |
230 | #define MIN_N_HPTEG 1024 /* min 64kB hash table */ | 221 | #define MIN_N_HPTEG 1024 /* min 64kB hash table */ |
231 | #endif | ||
232 | 222 | ||
233 | /* | 223 | /* |
234 | * Allow 1 HPTE (1/8 HPTEG) for each page of memory. | 224 | * Allow 1 HPTE (1/8 HPTEG) for each page of memory. |
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index ffc8ed4de62d..6a8bf6c6000e 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
@@ -60,19 +60,19 @@ static inline void create_slbe(unsigned long ea, unsigned long flags, | |||
60 | : "memory" ); | 60 | : "memory" ); |
61 | } | 61 | } |
62 | 62 | ||
63 | static void slb_flush_and_rebolt(void) | 63 | void slb_flush_and_rebolt(void) |
64 | { | 64 | { |
65 | /* If you change this make sure you change SLB_NUM_BOLTED | 65 | /* If you change this make sure you change SLB_NUM_BOLTED |
66 | * appropriately too. */ | 66 | * appropriately too. */ |
67 | unsigned long linear_llp, virtual_llp, lflags, vflags; | 67 | unsigned long linear_llp, vmalloc_llp, lflags, vflags; |
68 | unsigned long ksp_esid_data; | 68 | unsigned long ksp_esid_data; |
69 | 69 | ||
70 | WARN_ON(!irqs_disabled()); | 70 | WARN_ON(!irqs_disabled()); |
71 | 71 | ||
72 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; | 72 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; |
73 | virtual_llp = mmu_psize_defs[mmu_virtual_psize].sllp; | 73 | vmalloc_llp = mmu_psize_defs[mmu_vmalloc_psize].sllp; |
74 | lflags = SLB_VSID_KERNEL | linear_llp; | 74 | lflags = SLB_VSID_KERNEL | linear_llp; |
75 | vflags = SLB_VSID_KERNEL | virtual_llp; | 75 | vflags = SLB_VSID_KERNEL | vmalloc_llp; |
76 | 76 | ||
77 | ksp_esid_data = mk_esid_data(get_paca()->kstack, 2); | 77 | ksp_esid_data = mk_esid_data(get_paca()->kstack, 2); |
78 | if ((ksp_esid_data & ESID_MASK) == PAGE_OFFSET) | 78 | if ((ksp_esid_data & ESID_MASK) == PAGE_OFFSET) |
@@ -122,9 +122,6 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) | |||
122 | 122 | ||
123 | get_paca()->slb_cache_ptr = 0; | 123 | get_paca()->slb_cache_ptr = 0; |
124 | get_paca()->context = mm->context; | 124 | get_paca()->context = mm->context; |
125 | #ifdef CONFIG_PPC_64K_PAGES | ||
126 | get_paca()->pgdir = mm->pgd; | ||
127 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
128 | 125 | ||
129 | /* | 126 | /* |
130 | * preload some userspace segments into the SLB. | 127 | * preload some userspace segments into the SLB. |
@@ -167,11 +164,10 @@ static inline void patch_slb_encoding(unsigned int *insn_addr, | |||
167 | 164 | ||
168 | void slb_initialize(void) | 165 | void slb_initialize(void) |
169 | { | 166 | { |
170 | unsigned long linear_llp, virtual_llp; | 167 | unsigned long linear_llp, vmalloc_llp, io_llp; |
171 | static int slb_encoding_inited; | 168 | static int slb_encoding_inited; |
172 | extern unsigned int *slb_miss_kernel_load_linear; | 169 | extern unsigned int *slb_miss_kernel_load_linear; |
173 | extern unsigned int *slb_miss_kernel_load_virtual; | 170 | extern unsigned int *slb_miss_kernel_load_io; |
174 | extern unsigned int *slb_miss_user_load_normal; | ||
175 | #ifdef CONFIG_HUGETLB_PAGE | 171 | #ifdef CONFIG_HUGETLB_PAGE |
176 | extern unsigned int *slb_miss_user_load_huge; | 172 | extern unsigned int *slb_miss_user_load_huge; |
177 | unsigned long huge_llp; | 173 | unsigned long huge_llp; |
@@ -181,18 +177,19 @@ void slb_initialize(void) | |||
181 | 177 | ||
182 | /* Prepare our SLB miss handler based on our page size */ | 178 | /* Prepare our SLB miss handler based on our page size */ |
183 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; | 179 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; |
184 | virtual_llp = mmu_psize_defs[mmu_virtual_psize].sllp; | 180 | io_llp = mmu_psize_defs[mmu_io_psize].sllp; |
181 | vmalloc_llp = mmu_psize_defs[mmu_vmalloc_psize].sllp; | ||
182 | get_paca()->vmalloc_sllp = SLB_VSID_KERNEL | vmalloc_llp; | ||
183 | |||
185 | if (!slb_encoding_inited) { | 184 | if (!slb_encoding_inited) { |
186 | slb_encoding_inited = 1; | 185 | slb_encoding_inited = 1; |
187 | patch_slb_encoding(slb_miss_kernel_load_linear, | 186 | patch_slb_encoding(slb_miss_kernel_load_linear, |
188 | SLB_VSID_KERNEL | linear_llp); | 187 | SLB_VSID_KERNEL | linear_llp); |
189 | patch_slb_encoding(slb_miss_kernel_load_virtual, | 188 | patch_slb_encoding(slb_miss_kernel_load_io, |
190 | SLB_VSID_KERNEL | virtual_llp); | 189 | SLB_VSID_KERNEL | io_llp); |
191 | patch_slb_encoding(slb_miss_user_load_normal, | ||
192 | SLB_VSID_USER | virtual_llp); | ||
193 | 190 | ||
194 | DBG("SLB: linear LLP = %04x\n", linear_llp); | 191 | DBG("SLB: linear LLP = %04x\n", linear_llp); |
195 | DBG("SLB: virtual LLP = %04x\n", virtual_llp); | 192 | DBG("SLB: io LLP = %04x\n", io_llp); |
196 | #ifdef CONFIG_HUGETLB_PAGE | 193 | #ifdef CONFIG_HUGETLB_PAGE |
197 | patch_slb_encoding(slb_miss_user_load_huge, | 194 | patch_slb_encoding(slb_miss_user_load_huge, |
198 | SLB_VSID_USER | huge_llp); | 195 | SLB_VSID_USER | huge_llp); |
@@ -207,7 +204,7 @@ void slb_initialize(void) | |||
207 | unsigned long lflags, vflags; | 204 | unsigned long lflags, vflags; |
208 | 205 | ||
209 | lflags = SLB_VSID_KERNEL | linear_llp; | 206 | lflags = SLB_VSID_KERNEL | linear_llp; |
210 | vflags = SLB_VSID_KERNEL | virtual_llp; | 207 | vflags = SLB_VSID_KERNEL | vmalloc_llp; |
211 | 208 | ||
212 | /* Invalidate the entire SLB (even slot 0) & all the ERATS */ | 209 | /* Invalidate the entire SLB (even slot 0) & all the ERATS */ |
213 | asm volatile("isync":::"memory"); | 210 | asm volatile("isync":::"memory"); |
@@ -215,7 +212,6 @@ void slb_initialize(void) | |||
215 | asm volatile("isync; slbia; isync":::"memory"); | 212 | asm volatile("isync; slbia; isync":::"memory"); |
216 | create_slbe(PAGE_OFFSET, lflags, 0); | 213 | create_slbe(PAGE_OFFSET, lflags, 0); |
217 | 214 | ||
218 | /* VMALLOC space has 4K pages always for now */ | ||
219 | create_slbe(VMALLOC_START, vflags, 1); | 215 | create_slbe(VMALLOC_START, vflags, 1); |
220 | 216 | ||
221 | /* We don't bolt the stack for the time being - we're in boot, | 217 | /* We don't bolt the stack for the time being - we're in boot, |
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S index abfaabf667bf..8548dcf8ef8b 100644 --- a/arch/powerpc/mm/slb_low.S +++ b/arch/powerpc/mm/slb_low.S | |||
@@ -59,10 +59,19 @@ _GLOBAL(slb_miss_kernel_load_linear) | |||
59 | li r11,0 | 59 | li r11,0 |
60 | b slb_finish_load | 60 | b slb_finish_load |
61 | 61 | ||
62 | 1: /* vmalloc/ioremap mapping encoding bits, the "li" instruction below | 62 | 1: /* vmalloc/ioremap mapping encoding bits, the "li" instructions below |
63 | * will be patched by the kernel at boot | 63 | * will be patched by the kernel at boot |
64 | */ | 64 | */ |
65 | _GLOBAL(slb_miss_kernel_load_virtual) | 65 | BEGIN_FTR_SECTION |
66 | /* check whether this is in vmalloc or ioremap space */ | ||
67 | clrldi r11,r10,48 | ||
68 | cmpldi r11,(VMALLOC_SIZE >> 28) - 1 | ||
69 | bgt 5f | ||
70 | lhz r11,PACAVMALLOCSLLP(r13) | ||
71 | b slb_finish_load | ||
72 | 5: | ||
73 | END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE) | ||
74 | _GLOBAL(slb_miss_kernel_load_io) | ||
66 | li r11,0 | 75 | li r11,0 |
67 | b slb_finish_load | 76 | b slb_finish_load |
68 | 77 | ||
@@ -96,9 +105,7 @@ _GLOBAL(slb_miss_user_load_huge) | |||
96 | 1: | 105 | 1: |
97 | #endif /* CONFIG_HUGETLB_PAGE */ | 106 | #endif /* CONFIG_HUGETLB_PAGE */ |
98 | 107 | ||
99 | _GLOBAL(slb_miss_user_load_normal) | 108 | lhz r11,PACACONTEXTSLLP(r13) |
100 | li r11,0 | ||
101 | |||
102 | 2: | 109 | 2: |
103 | ld r9,PACACONTEXTID(r13) | 110 | ld r9,PACACONTEXTID(r13) |
104 | rldimi r10,r9,USER_ESID_BITS,0 | 111 | rldimi r10,r9,USER_ESID_BITS,0 |
diff --git a/arch/powerpc/mm/stab.c b/arch/powerpc/mm/stab.c index 4a9291d9fef8..691320c90b78 100644 --- a/arch/powerpc/mm/stab.c +++ b/arch/powerpc/mm/stab.c | |||
@@ -200,10 +200,6 @@ void switch_stab(struct task_struct *tsk, struct mm_struct *mm) | |||
200 | 200 | ||
201 | __get_cpu_var(stab_cache_ptr) = 0; | 201 | __get_cpu_var(stab_cache_ptr) = 0; |
202 | 202 | ||
203 | #ifdef CONFIG_PPC_64K_PAGES | ||
204 | get_paca()->pgdir = mm->pgd; | ||
205 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
206 | |||
207 | /* Now preload some entries for the new task */ | 203 | /* Now preload some entries for the new task */ |
208 | if (test_tsk_thread_flag(tsk, TIF_32BIT)) | 204 | if (test_tsk_thread_flag(tsk, TIF_32BIT)) |
209 | unmapped_base = TASK_UNMAPPED_BASE_USER32; | 205 | unmapped_base = TASK_UNMAPPED_BASE_USER32; |
diff --git a/arch/powerpc/mm/tlb_32.c b/arch/powerpc/mm/tlb_32.c index ad580f3742e5..02eb23e036d5 100644 --- a/arch/powerpc/mm/tlb_32.c +++ b/arch/powerpc/mm/tlb_32.c | |||
@@ -42,7 +42,7 @@ void flush_hash_entry(struct mm_struct *mm, pte_t *ptep, unsigned long addr) | |||
42 | 42 | ||
43 | if (Hash != 0) { | 43 | if (Hash != 0) { |
44 | ptephys = __pa(ptep) & PAGE_MASK; | 44 | ptephys = __pa(ptep) & PAGE_MASK; |
45 | flush_hash_pages(mm->context, addr, ptephys, 1); | 45 | flush_hash_pages(mm->context.id, addr, ptephys, 1); |
46 | } | 46 | } |
47 | } | 47 | } |
48 | 48 | ||
@@ -102,7 +102,7 @@ static void flush_range(struct mm_struct *mm, unsigned long start, | |||
102 | pmd_t *pmd; | 102 | pmd_t *pmd; |
103 | unsigned long pmd_end; | 103 | unsigned long pmd_end; |
104 | int count; | 104 | int count; |
105 | unsigned int ctx = mm->context; | 105 | unsigned int ctx = mm->context.id; |
106 | 106 | ||
107 | if (Hash == 0) { | 107 | if (Hash == 0) { |
108 | _tlbia(); | 108 | _tlbia(); |
@@ -172,7 +172,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | |||
172 | mm = (vmaddr < TASK_SIZE)? vma->vm_mm: &init_mm; | 172 | mm = (vmaddr < TASK_SIZE)? vma->vm_mm: &init_mm; |
173 | pmd = pmd_offset(pgd_offset(mm, vmaddr), vmaddr); | 173 | pmd = pmd_offset(pgd_offset(mm, vmaddr), vmaddr); |
174 | if (!pmd_none(*pmd)) | 174 | if (!pmd_none(*pmd)) |
175 | flush_hash_pages(mm->context, vmaddr, pmd_val(*pmd), 1); | 175 | flush_hash_pages(mm->context.id, vmaddr, pmd_val(*pmd), 1); |
176 | FINISH_FLUSH; | 176 | FINISH_FLUSH; |
177 | } | 177 | } |
178 | 178 | ||
diff --git a/arch/powerpc/mm/tlb_64.c b/arch/powerpc/mm/tlb_64.c index f734b11566c2..e7449b068c82 100644 --- a/arch/powerpc/mm/tlb_64.c +++ b/arch/powerpc/mm/tlb_64.c | |||
@@ -131,7 +131,7 @@ void hpte_update(struct mm_struct *mm, unsigned long addr, | |||
131 | { | 131 | { |
132 | struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); | 132 | struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); |
133 | unsigned long vsid; | 133 | unsigned long vsid; |
134 | unsigned int psize = mmu_virtual_psize; | 134 | unsigned int psize; |
135 | int i; | 135 | int i; |
136 | 136 | ||
137 | i = batch->index; | 137 | i = batch->index; |
@@ -148,7 +148,8 @@ void hpte_update(struct mm_struct *mm, unsigned long addr, | |||
148 | #else | 148 | #else |
149 | BUG(); | 149 | BUG(); |
150 | #endif | 150 | #endif |
151 | } | 151 | } else |
152 | psize = pte_pagesize_index(pte); | ||
152 | 153 | ||
153 | /* | 154 | /* |
154 | * This can happen when we are in the middle of a TLB batch and | 155 | * This can happen when we are in the middle of a TLB batch and |
diff --git a/arch/powerpc/oprofile/Kconfig b/arch/powerpc/oprofile/Kconfig index d03c0e5ca870..eb2dece76a54 100644 --- a/arch/powerpc/oprofile/Kconfig +++ b/arch/powerpc/oprofile/Kconfig | |||
@@ -1,5 +1,4 @@ | |||
1 | config PROFILING | 1 | config PROFILING |
2 | depends on !PPC_ISERIES | ||
3 | bool "Profiling support (EXPERIMENTAL)" | 2 | bool "Profiling support (EXPERIMENTAL)" |
4 | help | 3 | help |
5 | Say Y here to enable the extended profiling support mechanisms used | 4 | Say Y here to enable the extended profiling support mechanisms used |
diff --git a/arch/powerpc/oprofile/Makefile b/arch/powerpc/oprofile/Makefile index f5f9859a8338..3145d610b5b0 100644 --- a/arch/powerpc/oprofile/Makefile +++ b/arch/powerpc/oprofile/Makefile | |||
@@ -1,3 +1,7 @@ | |||
1 | ifeq ($(CONFIG_PPC64),y) | ||
2 | EXTRA_CFLAGS += -mno-minimal-toc | ||
3 | endif | ||
4 | |||
1 | obj-$(CONFIG_OPROFILE) += oprofile.o | 5 | obj-$(CONFIG_OPROFILE) += oprofile.o |
2 | 6 | ||
3 | DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \ | 7 | DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \ |
diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c index 5b1de7e8041e..27ad56bd227e 100644 --- a/arch/powerpc/oprofile/common.c +++ b/arch/powerpc/oprofile/common.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/pmc.h> | 22 | #include <asm/pmc.h> |
23 | #include <asm/cputable.h> | 23 | #include <asm/cputable.h> |
24 | #include <asm/oprofile_impl.h> | 24 | #include <asm/oprofile_impl.h> |
25 | #include <asm/firmware.h> | ||
25 | 26 | ||
26 | static struct op_powerpc_model *model; | 27 | static struct op_powerpc_model *model; |
27 | 28 | ||
@@ -130,6 +131,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
130 | if (!cur_cpu_spec->oprofile_cpu_type) | 131 | if (!cur_cpu_spec->oprofile_cpu_type) |
131 | return -ENODEV; | 132 | return -ENODEV; |
132 | 133 | ||
134 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
135 | return -ENODEV; | ||
136 | |||
133 | switch (cur_cpu_spec->oprofile_type) { | 137 | switch (cur_cpu_spec->oprofile_type) { |
134 | #ifdef CONFIG_PPC64 | 138 | #ifdef CONFIG_PPC64 |
135 | case PPC_OPROFILE_RS64: | 139 | case PPC_OPROFILE_RS64: |
@@ -162,7 +166,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
162 | ops->stop = op_powerpc_stop; | 166 | ops->stop = op_powerpc_stop; |
163 | ops->backtrace = op_powerpc_backtrace; | 167 | ops->backtrace = op_powerpc_backtrace; |
164 | 168 | ||
165 | printk(KERN_INFO "oprofile: using %s performance monitoring.\n", | 169 | printk(KERN_DEBUG "oprofile: using %s performance monitoring.\n", |
166 | ops->cpu_type); | 170 | ops->cpu_type); |
167 | 171 | ||
168 | return 0; | 172 | return 0; |
diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 4c2beab1fdc1..506f6b79f893 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c | |||
@@ -24,10 +24,6 @@ | |||
24 | static unsigned long reset_value[OP_MAX_COUNTER]; | 24 | static unsigned long reset_value[OP_MAX_COUNTER]; |
25 | 25 | ||
26 | static int oprofile_running; | 26 | static int oprofile_running; |
27 | static int mmcra_has_sihv; | ||
28 | /* Unfortunately these bits vary between CPUs */ | ||
29 | static unsigned long mmcra_sihv = MMCRA_SIHV; | ||
30 | static unsigned long mmcra_sipr = MMCRA_SIPR; | ||
31 | 27 | ||
32 | /* mmcr values are set in power4_reg_setup, used in power4_cpu_setup */ | 28 | /* mmcr values are set in power4_reg_setup, used in power4_cpu_setup */ |
33 | static u32 mmcr0_val; | 29 | static u32 mmcr0_val; |
@@ -41,16 +37,6 @@ static void power4_reg_setup(struct op_counter_config *ctr, | |||
41 | int i; | 37 | int i; |
42 | 38 | ||
43 | /* | 39 | /* |
44 | * SIHV / SIPR bits are only implemented on POWER4+ (GQ) and above. | ||
45 | * However we disable it on all POWER4 until we verify it works | ||
46 | * (I was seeing some strange behaviour last time I tried). | ||
47 | * | ||
48 | * It has been verified to work on POWER5 so we enable it there. | ||
49 | */ | ||
50 | if (cpu_has_feature(CPU_FTR_MMCRA_SIHV)) | ||
51 | mmcra_has_sihv = 1; | ||
52 | |||
53 | /* | ||
54 | * The performance counter event settings are given in the mmcr0, | 40 | * The performance counter event settings are given in the mmcr0, |
55 | * mmcr1 and mmcra values passed from the user in the | 41 | * mmcr1 and mmcra values passed from the user in the |
56 | * op_system_config structure (sys variable). | 42 | * op_system_config structure (sys variable). |
@@ -202,18 +188,19 @@ static unsigned long get_pc(struct pt_regs *regs) | |||
202 | unsigned long mmcra; | 188 | unsigned long mmcra; |
203 | 189 | ||
204 | /* Cant do much about it */ | 190 | /* Cant do much about it */ |
205 | if (!mmcra_has_sihv) | 191 | if (!cur_cpu_spec->oprofile_mmcra_sihv) |
206 | return pc; | 192 | return pc; |
207 | 193 | ||
208 | mmcra = mfspr(SPRN_MMCRA); | 194 | mmcra = mfspr(SPRN_MMCRA); |
209 | 195 | ||
210 | /* Were we in the hypervisor? */ | 196 | /* Were we in the hypervisor? */ |
211 | if (firmware_has_feature(FW_FEATURE_LPAR) && (mmcra & mmcra_sihv)) | 197 | if (firmware_has_feature(FW_FEATURE_LPAR) && |
198 | (mmcra & cur_cpu_spec->oprofile_mmcra_sihv)) | ||
212 | /* function descriptor madness */ | 199 | /* function descriptor madness */ |
213 | return *((unsigned long *)hypervisor_bucket); | 200 | return *((unsigned long *)hypervisor_bucket); |
214 | 201 | ||
215 | /* We were in userspace, nothing to do */ | 202 | /* We were in userspace, nothing to do */ |
216 | if (mmcra & mmcra_sipr) | 203 | if (mmcra & cur_cpu_spec->oprofile_mmcra_sipr) |
217 | return pc; | 204 | return pc; |
218 | 205 | ||
219 | #ifdef CONFIG_PPC_RTAS | 206 | #ifdef CONFIG_PPC_RTAS |
@@ -235,15 +222,14 @@ static unsigned long get_pc(struct pt_regs *regs) | |||
235 | return pc; | 222 | return pc; |
236 | } | 223 | } |
237 | 224 | ||
238 | static int get_kernel(unsigned long pc) | 225 | static int get_kernel(unsigned long pc, unsigned long mmcra) |
239 | { | 226 | { |
240 | int is_kernel; | 227 | int is_kernel; |
241 | 228 | ||
242 | if (!mmcra_has_sihv) { | 229 | if (!cur_cpu_spec->oprofile_mmcra_sihv) { |
243 | is_kernel = is_kernel_addr(pc); | 230 | is_kernel = is_kernel_addr(pc); |
244 | } else { | 231 | } else { |
245 | unsigned long mmcra = mfspr(SPRN_MMCRA); | 232 | is_kernel = ((mmcra & cur_cpu_spec->oprofile_mmcra_sipr) == 0); |
246 | is_kernel = ((mmcra & mmcra_sipr) == 0); | ||
247 | } | 233 | } |
248 | 234 | ||
249 | return is_kernel; | 235 | return is_kernel; |
@@ -257,9 +243,12 @@ static void power4_handle_interrupt(struct pt_regs *regs, | |||
257 | int val; | 243 | int val; |
258 | int i; | 244 | int i; |
259 | unsigned int mmcr0; | 245 | unsigned int mmcr0; |
246 | unsigned long mmcra; | ||
247 | |||
248 | mmcra = mfspr(SPRN_MMCRA); | ||
260 | 249 | ||
261 | pc = get_pc(regs); | 250 | pc = get_pc(regs); |
262 | is_kernel = get_kernel(pc); | 251 | is_kernel = get_kernel(pc, mmcra); |
263 | 252 | ||
264 | /* set the PMM bit (see comment below) */ | 253 | /* set the PMM bit (see comment below) */ |
265 | mtmsrd(mfmsr() | MSR_PMM); | 254 | mtmsrd(mfmsr() | MSR_PMM); |
@@ -287,6 +276,10 @@ static void power4_handle_interrupt(struct pt_regs *regs, | |||
287 | */ | 276 | */ |
288 | mmcr0 &= ~MMCR0_PMAO; | 277 | mmcr0 &= ~MMCR0_PMAO; |
289 | 278 | ||
279 | /* Clear the appropriate bits in the MMCRA */ | ||
280 | mmcra &= ~cur_cpu_spec->oprofile_mmcra_clear; | ||
281 | mtspr(SPRN_MMCRA, mmcra); | ||
282 | |||
290 | /* | 283 | /* |
291 | * now clear the freeze bit, counting will not start until we | 284 | * now clear the freeze bit, counting will not start until we |
292 | * rfid from this exception, because only at that point will | 285 | * rfid from this exception, because only at that point will |
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 06e371282f57..454fc53289ab 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
@@ -11,13 +11,20 @@ config MPC8540_ADS | |||
11 | help | 11 | help |
12 | This option enables support for the MPC 8540 ADS board | 12 | This option enables support for the MPC 8540 ADS board |
13 | 13 | ||
14 | config MPC85xx_CDS | ||
15 | bool "Freescale MPC85xx CDS" | ||
16 | select DEFAULT_UIMAGE | ||
17 | select PPC_I8259 if PCI | ||
18 | help | ||
19 | This option enables support for the MPC85xx CDS board | ||
20 | |||
14 | endchoice | 21 | endchoice |
15 | 22 | ||
16 | config MPC8540 | 23 | config MPC8540 |
17 | bool | 24 | bool |
18 | select PPC_UDBG_16550 | 25 | select PPC_UDBG_16550 |
19 | select PPC_INDIRECT_PCI | 26 | select PPC_INDIRECT_PCI |
20 | default y if MPC8540_ADS | 27 | default y if MPC8540_ADS || MPC85xx_CDS |
21 | 28 | ||
22 | config PPC_INDIRECT_PCI_BE | 29 | config PPC_INDIRECT_PCI_BE |
23 | bool | 30 | bool |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index ffc4139cb214..7615aa59c78b 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
@@ -3,3 +3,4 @@ | |||
3 | # | 3 | # |
4 | obj-$(CONFIG_PPC_85xx) += misc.o pci.o | 4 | obj-$(CONFIG_PPC_85xx) += misc.o pci.o |
5 | obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o | 5 | obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o |
6 | obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c new file mode 100644 index 000000000000..18e6e11f7020 --- /dev/null +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c | |||
@@ -0,0 +1,359 @@ | |||
1 | /* | ||
2 | * MPC85xx setup and early boot code plus other random bits. | ||
3 | * | ||
4 | * Maintained by Kumar Gala (see MAINTAINERS for contact information) | ||
5 | * | ||
6 | * Copyright 2005 Freescale Semiconductor Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/stddef.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/reboot.h> | ||
20 | #include <linux/pci.h> | ||
21 | #include <linux/kdev_t.h> | ||
22 | #include <linux/major.h> | ||
23 | #include <linux/console.h> | ||
24 | #include <linux/delay.h> | ||
25 | #include <linux/seq_file.h> | ||
26 | #include <linux/root_dev.h> | ||
27 | #include <linux/initrd.h> | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/fsl_devices.h> | ||
30 | |||
31 | #include <asm/system.h> | ||
32 | #include <asm/pgtable.h> | ||
33 | #include <asm/page.h> | ||
34 | #include <asm/atomic.h> | ||
35 | #include <asm/time.h> | ||
36 | #include <asm/io.h> | ||
37 | #include <asm/machdep.h> | ||
38 | #include <asm/ipic.h> | ||
39 | #include <asm/bootinfo.h> | ||
40 | #include <asm/pci-bridge.h> | ||
41 | #include <asm/mpc85xx.h> | ||
42 | #include <asm/irq.h> | ||
43 | #include <mm/mmu_decl.h> | ||
44 | #include <asm/prom.h> | ||
45 | #include <asm/udbg.h> | ||
46 | #include <asm/mpic.h> | ||
47 | #include <asm/i8259.h> | ||
48 | |||
49 | #include <sysdev/fsl_soc.h> | ||
50 | #include "mpc85xx.h" | ||
51 | |||
52 | #ifndef CONFIG_PCI | ||
53 | unsigned long isa_io_base = 0; | ||
54 | unsigned long isa_mem_base = 0; | ||
55 | #endif | ||
56 | |||
57 | static int cds_pci_slot = 2; | ||
58 | static volatile u8 *cadmus; | ||
59 | |||
60 | /* | ||
61 | * Internal interrupts are all Level Sensitive, and Positive Polarity | ||
62 | * | ||
63 | * Note: Likely, this table and the following function should be | ||
64 | * obtained and derived from the OF Device Tree. | ||
65 | */ | ||
66 | static u_char mpc85xx_cds_openpic_initsenses[] __initdata = { | ||
67 | MPC85XX_INTERNAL_IRQ_SENSES, | ||
68 | #if defined(CONFIG_PCI) | ||
69 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Ext 0: PCI slot 0 */ | ||
70 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext 1: PCI slot 1 */ | ||
71 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext 2: PCI slot 2 */ | ||
72 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext 3: PCI slot 3 */ | ||
73 | #else | ||
74 | 0x0, /* External 0: */ | ||
75 | 0x0, /* External 1: */ | ||
76 | 0x0, /* External 2: */ | ||
77 | 0x0, /* External 3: */ | ||
78 | #endif | ||
79 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* External 5: PHY */ | ||
80 | 0x0, /* External 6: */ | ||
81 | 0x0, /* External 7: */ | ||
82 | 0x0, /* External 8: */ | ||
83 | 0x0, /* External 9: */ | ||
84 | 0x0, /* External 10: */ | ||
85 | #ifdef CONFIG_PCI | ||
86 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext 11: PCI2 slot 0 */ | ||
87 | #else | ||
88 | 0x0, /* External 11: */ | ||
89 | #endif | ||
90 | }; | ||
91 | |||
92 | |||
93 | #ifdef CONFIG_PCI | ||
94 | /* | ||
95 | * interrupt routing | ||
96 | */ | ||
97 | int | ||
98 | mpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | ||
99 | { | ||
100 | struct pci_controller *hose = pci_bus_to_hose(dev->bus->number); | ||
101 | |||
102 | if (!hose->index) | ||
103 | { | ||
104 | /* Handle PCI1 interrupts */ | ||
105 | char pci_irq_table[][4] = | ||
106 | /* | ||
107 | * PCI IDSEL/INTPIN->INTLINE | ||
108 | * A B C D | ||
109 | */ | ||
110 | |||
111 | /* Note IRQ assignment for slots is based on which slot the elysium is | ||
112 | * in -- in this setup elysium is in slot #2 (this PIRQA as first | ||
113 | * interrupt on slot */ | ||
114 | { | ||
115 | { 0, 1, 2, 3 }, /* 16 - PMC */ | ||
116 | { 0, 1, 2, 3 }, /* 17 P2P (Tsi320) */ | ||
117 | { 0, 1, 2, 3 }, /* 18 - Slot 1 */ | ||
118 | { 1, 2, 3, 0 }, /* 19 - Slot 2 */ | ||
119 | { 2, 3, 0, 1 }, /* 20 - Slot 3 */ | ||
120 | { 3, 0, 1, 2 }, /* 21 - Slot 4 */ | ||
121 | }; | ||
122 | |||
123 | const long min_idsel = 16, max_idsel = 21, irqs_per_slot = 4; | ||
124 | int i, j; | ||
125 | |||
126 | for (i = 0; i < 6; i++) | ||
127 | for (j = 0; j < 4; j++) | ||
128 | pci_irq_table[i][j] = | ||
129 | ((pci_irq_table[i][j] + 5 - | ||
130 | cds_pci_slot) & 0x3) + PIRQ0A; | ||
131 | |||
132 | return PCI_IRQ_TABLE_LOOKUP; | ||
133 | } else { | ||
134 | /* Handle PCI2 interrupts (if we have one) */ | ||
135 | char pci_irq_table[][4] = | ||
136 | { | ||
137 | /* | ||
138 | * We only have one slot and one interrupt | ||
139 | * going to PIRQA - PIRQD */ | ||
140 | { PIRQ1A, PIRQ1A, PIRQ1A, PIRQ1A }, /* 21 - slot 0 */ | ||
141 | }; | ||
142 | |||
143 | const long min_idsel = 21, max_idsel = 21, irqs_per_slot = 4; | ||
144 | |||
145 | return PCI_IRQ_TABLE_LOOKUP; | ||
146 | } | ||
147 | } | ||
148 | |||
149 | #define ARCADIA_HOST_BRIDGE_IDSEL 17 | ||
150 | #define ARCADIA_2ND_BRIDGE_IDSEL 3 | ||
151 | |||
152 | extern int mpc85xx_pci2_busno; | ||
153 | |||
154 | int | ||
155 | mpc85xx_exclude_device(u_char bus, u_char devfn) | ||
156 | { | ||
157 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
158 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
159 | if (mpc85xx_pci2_busno) | ||
160 | if (bus == (mpc85xx_pci2_busno) && PCI_SLOT(devfn) == 0) | ||
161 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
162 | /* We explicitly do not go past the Tundra 320 Bridge */ | ||
163 | if ((bus == 1) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL)) | ||
164 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
165 | if ((bus == 0) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL)) | ||
166 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
167 | else | ||
168 | return PCIBIOS_SUCCESSFUL; | ||
169 | } | ||
170 | |||
171 | void __init | ||
172 | mpc85xx_cds_pcibios_fixup(void) | ||
173 | { | ||
174 | struct pci_dev *dev; | ||
175 | u_char c; | ||
176 | |||
177 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | ||
178 | PCI_DEVICE_ID_VIA_82C586_1, NULL))) { | ||
179 | /* | ||
180 | * U-Boot does not set the enable bits | ||
181 | * for the IDE device. Force them on here. | ||
182 | */ | ||
183 | pci_read_config_byte(dev, 0x40, &c); | ||
184 | c |= 0x03; /* IDE: Chip Enable Bits */ | ||
185 | pci_write_config_byte(dev, 0x40, c); | ||
186 | |||
187 | /* | ||
188 | * Since only primary interface works, force the | ||
189 | * IDE function to standard primary IDE interrupt | ||
190 | * w/ 8259 offset | ||
191 | */ | ||
192 | dev->irq = 14; | ||
193 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
194 | pci_dev_put(dev); | ||
195 | } | ||
196 | |||
197 | /* | ||
198 | * Force legacy USB interrupt routing | ||
199 | */ | ||
200 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | ||
201 | PCI_DEVICE_ID_VIA_82C586_2, NULL))) { | ||
202 | dev->irq = 10; | ||
203 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 10); | ||
204 | pci_dev_put(dev); | ||
205 | } | ||
206 | |||
207 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | ||
208 | PCI_DEVICE_ID_VIA_82C586_2, dev))) { | ||
209 | dev->irq = 11; | ||
210 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11); | ||
211 | pci_dev_put(dev); | ||
212 | } | ||
213 | } | ||
214 | #endif /* CONFIG_PCI */ | ||
215 | |||
216 | void __init mpc85xx_cds_pic_init(void) | ||
217 | { | ||
218 | struct mpic *mpic1; | ||
219 | phys_addr_t OpenPIC_PAddr; | ||
220 | |||
221 | /* Determine the Physical Address of the OpenPIC regs */ | ||
222 | OpenPIC_PAddr = get_immrbase() + MPC85xx_OPENPIC_OFFSET; | ||
223 | |||
224 | mpic1 = mpic_alloc(OpenPIC_PAddr, | ||
225 | MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
226 | 4, MPC85xx_OPENPIC_IRQ_OFFSET, 0, 250, | ||
227 | mpc85xx_cds_openpic_initsenses, | ||
228 | sizeof(mpc85xx_cds_openpic_initsenses), " OpenPIC "); | ||
229 | BUG_ON(mpic1 == NULL); | ||
230 | mpic_assign_isu(mpic1, 0, OpenPIC_PAddr + 0x10200); | ||
231 | mpic_assign_isu(mpic1, 1, OpenPIC_PAddr + 0x10280); | ||
232 | mpic_assign_isu(mpic1, 2, OpenPIC_PAddr + 0x10300); | ||
233 | mpic_assign_isu(mpic1, 3, OpenPIC_PAddr + 0x10380); | ||
234 | mpic_assign_isu(mpic1, 4, OpenPIC_PAddr + 0x10400); | ||
235 | mpic_assign_isu(mpic1, 5, OpenPIC_PAddr + 0x10480); | ||
236 | mpic_assign_isu(mpic1, 6, OpenPIC_PAddr + 0x10500); | ||
237 | mpic_assign_isu(mpic1, 7, OpenPIC_PAddr + 0x10580); | ||
238 | |||
239 | /* dummy mappings to get to 48 */ | ||
240 | mpic_assign_isu(mpic1, 8, OpenPIC_PAddr + 0x10600); | ||
241 | mpic_assign_isu(mpic1, 9, OpenPIC_PAddr + 0x10680); | ||
242 | mpic_assign_isu(mpic1, 10, OpenPIC_PAddr + 0x10700); | ||
243 | mpic_assign_isu(mpic1, 11, OpenPIC_PAddr + 0x10780); | ||
244 | |||
245 | /* External ints */ | ||
246 | mpic_assign_isu(mpic1, 12, OpenPIC_PAddr + 0x10000); | ||
247 | mpic_assign_isu(mpic1, 13, OpenPIC_PAddr + 0x10080); | ||
248 | mpic_assign_isu(mpic1, 14, OpenPIC_PAddr + 0x10100); | ||
249 | |||
250 | mpic_init(mpic1); | ||
251 | |||
252 | #ifdef CONFIG_PCI | ||
253 | mpic_setup_cascade(PIRQ0A, i8259_irq_cascade, NULL); | ||
254 | |||
255 | i8259_init(0,0); | ||
256 | #endif | ||
257 | } | ||
258 | |||
259 | |||
260 | /* | ||
261 | * Setup the architecture | ||
262 | */ | ||
263 | static void __init | ||
264 | mpc85xx_cds_setup_arch(void) | ||
265 | { | ||
266 | struct device_node *cpu; | ||
267 | #ifdef CONFIG_PCI | ||
268 | struct device_node *np; | ||
269 | #endif | ||
270 | |||
271 | if (ppc_md.progress) | ||
272 | ppc_md.progress("mpc85xx_cds_setup_arch()", 0); | ||
273 | |||
274 | cpu = of_find_node_by_type(NULL, "cpu"); | ||
275 | if (cpu != 0) { | ||
276 | unsigned int *fp; | ||
277 | |||
278 | fp = (int *)get_property(cpu, "clock-frequency", NULL); | ||
279 | if (fp != 0) | ||
280 | loops_per_jiffy = *fp / HZ; | ||
281 | else | ||
282 | loops_per_jiffy = 500000000 / HZ; | ||
283 | of_node_put(cpu); | ||
284 | } | ||
285 | |||
286 | cadmus = ioremap(CADMUS_BASE, CADMUS_SIZE); | ||
287 | cds_pci_slot = ((cadmus[CM_CSR] >> 6) & 0x3) + 1; | ||
288 | |||
289 | if (ppc_md.progress) { | ||
290 | char buf[40]; | ||
291 | snprintf(buf, 40, "CDS Version = 0x%x in slot %d\n", | ||
292 | cadmus[CM_VER], cds_pci_slot); | ||
293 | ppc_md.progress(buf, 0); | ||
294 | } | ||
295 | |||
296 | #ifdef CONFIG_PCI | ||
297 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | ||
298 | add_bridge(np); | ||
299 | |||
300 | ppc_md.pcibios_fixup = mpc85xx_cds_pcibios_fixup; | ||
301 | ppc_md.pci_swizzle = common_swizzle; | ||
302 | ppc_md.pci_map_irq = mpc85xx_map_irq; | ||
303 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; | ||
304 | #endif | ||
305 | |||
306 | #ifdef CONFIG_ROOT_NFS | ||
307 | ROOT_DEV = Root_NFS; | ||
308 | #else | ||
309 | ROOT_DEV = Root_HDA1; | ||
310 | #endif | ||
311 | } | ||
312 | |||
313 | |||
314 | void | ||
315 | mpc85xx_cds_show_cpuinfo(struct seq_file *m) | ||
316 | { | ||
317 | uint pvid, svid, phid1; | ||
318 | uint memsize = total_memory; | ||
319 | |||
320 | pvid = mfspr(SPRN_PVR); | ||
321 | svid = mfspr(SPRN_SVR); | ||
322 | |||
323 | seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n"); | ||
324 | seq_printf(m, "Machine\t\t: MPC85xx CDS (0x%x)\n", cadmus[CM_VER]); | ||
325 | seq_printf(m, "PVR\t\t: 0x%x\n", pvid); | ||
326 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); | ||
327 | |||
328 | /* Display cpu Pll setting */ | ||
329 | phid1 = mfspr(SPRN_HID1); | ||
330 | seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f)); | ||
331 | |||
332 | /* Display the amount of memory */ | ||
333 | seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024)); | ||
334 | } | ||
335 | |||
336 | |||
337 | /* | ||
338 | * Called very early, device-tree isn't unflattened | ||
339 | */ | ||
340 | static int __init mpc85xx_cds_probe(void) | ||
341 | { | ||
342 | /* We always match for now, eventually we should look at | ||
343 | * the flat dev tree to ensure this is the board we are | ||
344 | * supposed to run on | ||
345 | */ | ||
346 | return 1; | ||
347 | } | ||
348 | |||
349 | define_machine(mpc85xx_cds) { | ||
350 | .name = "MPC85xx CDS", | ||
351 | .probe = mpc85xx_cds_probe, | ||
352 | .setup_arch = mpc85xx_cds_setup_arch, | ||
353 | .init_IRQ = mpc85xx_cds_pic_init, | ||
354 | .show_cpuinfo = mpc85xx_cds_show_cpuinfo, | ||
355 | .get_irq = mpic_get_irq, | ||
356 | .restart = mpc85xx_restart, | ||
357 | .calibrate_decr = generic_calibrate_decr, | ||
358 | .progress = udbg_progress, | ||
359 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.h b/arch/powerpc/platforms/85xx/mpc85xx_cds.h new file mode 100644 index 000000000000..671f54ff185a --- /dev/null +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.h | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * arch/ppc/platforms/85xx/mpc85xx_cds_common.h | ||
3 | * | ||
4 | * MPC85xx CDS board definitions | ||
5 | * | ||
6 | * Maintainer: Kumar Gala <galak@kernel.crashing.org> | ||
7 | * | ||
8 | * Copyright 2004 Freescale Semiconductor, Inc | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the | ||
12 | * Free Software Foundation; either version 2 of the License, or (at your | ||
13 | * option) any later version. | ||
14 | * | ||
15 | */ | ||
16 | |||
17 | #ifndef __MACH_MPC85XX_CDS_H__ | ||
18 | #define __MACH_MPC85XX_CDS_H__ | ||
19 | |||
20 | /* CADMUS info */ | ||
21 | #define CADMUS_BASE (0xf8004000) | ||
22 | #define CADMUS_SIZE (256) | ||
23 | #define CM_VER (0) | ||
24 | #define CM_CSR (1) | ||
25 | #define CM_RST (2) | ||
26 | |||
27 | /* CDS NVRAM/RTC */ | ||
28 | #define CDS_RTC_ADDR (0xf8000000) | ||
29 | #define CDS_RTC_SIZE (8 * 1024) | ||
30 | |||
31 | /* PCI interrupt controller */ | ||
32 | #define PIRQ0A MPC85xx_IRQ_EXT0 | ||
33 | #define PIRQ0B MPC85xx_IRQ_EXT1 | ||
34 | #define PIRQ0C MPC85xx_IRQ_EXT2 | ||
35 | #define PIRQ0D MPC85xx_IRQ_EXT3 | ||
36 | #define PIRQ1A MPC85xx_IRQ_EXT11 | ||
37 | |||
38 | #define NR_8259_INTS 16 | ||
39 | #define CPM_IRQ_OFFSET NR_8259_INTS | ||
40 | |||
41 | #define MPC85xx_OPENPIC_IRQ_OFFSET 80 | ||
42 | |||
43 | #endif /* __MACH_MPC85XX_CDS_H__ */ | ||
diff --git a/arch/powerpc/platforms/86xx/Kconfig b/arch/powerpc/platforms/86xx/Kconfig new file mode 100644 index 000000000000..3a87863d2876 --- /dev/null +++ b/arch/powerpc/platforms/86xx/Kconfig | |||
@@ -0,0 +1,36 @@ | |||
1 | menu "Platform Support" | ||
2 | depends on PPC_86xx | ||
3 | |||
4 | choice | ||
5 | prompt "Machine Type" | ||
6 | default MPC8641_HPCN | ||
7 | |||
8 | config MPC8641_HPCN | ||
9 | bool "Freescale MPC8641 HPCN" | ||
10 | help | ||
11 | This option enables support for the MPC8641 HPCN board. | ||
12 | |||
13 | endchoice | ||
14 | |||
15 | |||
16 | config MPC8641 | ||
17 | bool | ||
18 | select PPC_INDIRECT_PCI | ||
19 | select PPC_UDBG_16550 | ||
20 | default y if MPC8641_HPCN | ||
21 | |||
22 | config MPIC | ||
23 | bool | ||
24 | default y | ||
25 | |||
26 | config PPC_INDIRECT_PCI_BE | ||
27 | bool | ||
28 | depends on PPC_86xx | ||
29 | default y | ||
30 | |||
31 | config PPC_STD_MMU | ||
32 | bool | ||
33 | depends on PPC_86xx | ||
34 | default y | ||
35 | |||
36 | endmenu | ||
diff --git a/arch/powerpc/platforms/86xx/Makefile b/arch/powerpc/platforms/86xx/Makefile new file mode 100644 index 000000000000..7be796c5d5c9 --- /dev/null +++ b/arch/powerpc/platforms/86xx/Makefile | |||
@@ -0,0 +1,10 @@ | |||
1 | # | ||
2 | # Makefile for the PowerPC 86xx linux kernel. | ||
3 | # | ||
4 | |||
5 | |||
6 | ifeq ($(CONFIG_PPC_86xx),y) | ||
7 | obj-$(CONFIG_SMP) += mpc86xx_smp.o | ||
8 | endif | ||
9 | obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o | ||
10 | obj-$(CONFIG_PCI) += pci.o mpc86xx_pcie.o | ||
diff --git a/arch/powerpc/platforms/86xx/mpc8641_hpcn.h b/arch/powerpc/platforms/86xx/mpc8641_hpcn.h new file mode 100644 index 000000000000..5042253758b7 --- /dev/null +++ b/arch/powerpc/platforms/86xx/mpc8641_hpcn.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * MPC8641 HPCN board definitions | ||
3 | * | ||
4 | * Copyright 2006 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | * | ||
11 | * Author: Xianghua Xiao <x.xiao@freescale.com> | ||
12 | */ | ||
13 | |||
14 | #ifndef __MPC8641_HPCN_H__ | ||
15 | #define __MPC8641_HPCN_H__ | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/init.h> | ||
19 | |||
20 | /* PCI interrupt controller */ | ||
21 | #define PIRQA 3 | ||
22 | #define PIRQB 4 | ||
23 | #define PIRQC 5 | ||
24 | #define PIRQD 6 | ||
25 | #define PIRQ7 7 | ||
26 | #define PIRQE 9 | ||
27 | #define PIRQF 10 | ||
28 | #define PIRQG 11 | ||
29 | #define PIRQH 12 | ||
30 | |||
31 | /* PCI-Express memory map */ | ||
32 | #define MPC86XX_PCIE_LOWER_IO 0x00000000 | ||
33 | #define MPC86XX_PCIE_UPPER_IO 0x00ffffff | ||
34 | |||
35 | #define MPC86XX_PCIE_LOWER_MEM 0x80000000 | ||
36 | #define MPC86XX_PCIE_UPPER_MEM 0x9fffffff | ||
37 | |||
38 | #define MPC86XX_PCIE_IO_BASE 0xe2000000 | ||
39 | #define MPC86XX_PCIE_MEM_OFFSET 0x00000000 | ||
40 | |||
41 | #define MPC86XX_PCIE_IO_SIZE 0x01000000 | ||
42 | |||
43 | #define PCIE1_CFG_ADDR_OFFSET (0x8000) | ||
44 | #define PCIE1_CFG_DATA_OFFSET (0x8004) | ||
45 | |||
46 | #define PCIE2_CFG_ADDR_OFFSET (0x9000) | ||
47 | #define PCIE2_CFG_DATA_OFFSET (0x9004) | ||
48 | |||
49 | #define MPC86xx_PCIE_OFFSET PCIE1_CFG_ADDR_OFFSET | ||
50 | #define MPC86xx_PCIE_SIZE (0x1000) | ||
51 | |||
52 | #define MPC86XX_RSTCR_OFFSET (0xe00b0) /* Reset Control Register */ | ||
53 | |||
54 | #endif /* __MPC8641_HPCN_H__ */ | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx.h b/arch/powerpc/platforms/86xx/mpc86xx.h new file mode 100644 index 000000000000..e3c9e4f417d3 --- /dev/null +++ b/arch/powerpc/platforms/86xx/mpc86xx.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * Copyright 2006 Freescale Semiconductor Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | */ | ||
9 | |||
10 | #ifndef __MPC86XX_H__ | ||
11 | #define __MPC86XX_H__ | ||
12 | |||
13 | /* | ||
14 | * Declaration for the various functions exported by the | ||
15 | * mpc86xx_* files. Mostly for use by mpc86xx_setup(). | ||
16 | */ | ||
17 | |||
18 | extern int __init add_bridge(struct device_node *dev); | ||
19 | |||
20 | extern void __init setup_indirect_pcie(struct pci_controller *hose, | ||
21 | u32 cfg_addr, u32 cfg_data); | ||
22 | extern void __init setup_indirect_pcie_nomap(struct pci_controller *hose, | ||
23 | void __iomem *cfg_addr, | ||
24 | void __iomem *cfg_data); | ||
25 | |||
26 | extern void __init mpc86xx_smp_init(void); | ||
27 | |||
28 | #endif /* __MPC86XX_H__ */ | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c new file mode 100644 index 000000000000..483c21df181e --- /dev/null +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
@@ -0,0 +1,326 @@ | |||
1 | /* | ||
2 | * MPC86xx HPCN board specific routines | ||
3 | * | ||
4 | * Recode: ZHANG WEI <wei.zhang@freescale.com> | ||
5 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> | ||
6 | * | ||
7 | * Copyright 2006 Freescale Semiconductor Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/stddef.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/pci.h> | ||
19 | #include <linux/kdev_t.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/seq_file.h> | ||
22 | #include <linux/root_dev.h> | ||
23 | |||
24 | #include <asm/system.h> | ||
25 | #include <asm/time.h> | ||
26 | #include <asm/machdep.h> | ||
27 | #include <asm/pci-bridge.h> | ||
28 | #include <asm/mpc86xx.h> | ||
29 | #include <asm/prom.h> | ||
30 | #include <mm/mmu_decl.h> | ||
31 | #include <asm/udbg.h> | ||
32 | #include <asm/i8259.h> | ||
33 | |||
34 | #include <asm/mpic.h> | ||
35 | |||
36 | #include <sysdev/fsl_soc.h> | ||
37 | |||
38 | #include "mpc86xx.h" | ||
39 | |||
40 | #ifndef CONFIG_PCI | ||
41 | unsigned long isa_io_base = 0; | ||
42 | unsigned long isa_mem_base = 0; | ||
43 | unsigned long pci_dram_offset = 0; | ||
44 | #endif | ||
45 | |||
46 | |||
47 | /* | ||
48 | * Internal interrupts are all Level Sensitive, and Positive Polarity | ||
49 | */ | ||
50 | |||
51 | static u_char mpc86xx_hpcn_openpic_initsenses[] __initdata = { | ||
52 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 0: Reserved */ | ||
53 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 1: MCM */ | ||
54 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 2: DDR DRAM */ | ||
55 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 3: LBIU */ | ||
56 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 4: DMA 0 */ | ||
57 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 5: DMA 1 */ | ||
58 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 6: DMA 2 */ | ||
59 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 7: DMA 3 */ | ||
60 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 8: PCIE1 */ | ||
61 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 9: PCIE2 */ | ||
62 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 10: Reserved */ | ||
63 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 11: Reserved */ | ||
64 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 12: DUART2 */ | ||
65 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 13: TSEC 1 Transmit */ | ||
66 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 14: TSEC 1 Receive */ | ||
67 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 15: TSEC 3 transmit */ | ||
68 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 16: TSEC 3 receive */ | ||
69 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 17: TSEC 3 error */ | ||
70 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 18: TSEC 1 Receive/Transmit Error */ | ||
71 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 19: TSEC 2 Transmit */ | ||
72 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 20: TSEC 2 Receive */ | ||
73 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 21: TSEC 4 transmit */ | ||
74 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 22: TSEC 4 receive */ | ||
75 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 23: TSEC 4 error */ | ||
76 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 24: TSEC 2 Receive/Transmit Error */ | ||
77 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 25: Unused */ | ||
78 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 26: DUART1 */ | ||
79 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 27: I2C */ | ||
80 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 28: Performance Monitor */ | ||
81 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 29: Unused */ | ||
82 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 30: Unused */ | ||
83 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 31: Unused */ | ||
84 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 32: SRIO error/write-port unit */ | ||
85 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 33: SRIO outbound doorbell */ | ||
86 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 34: SRIO inbound doorbell */ | ||
87 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 35: Unused */ | ||
88 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 36: Unused */ | ||
89 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 37: SRIO outbound message unit 1 */ | ||
90 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 38: SRIO inbound message unit 1 */ | ||
91 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 39: SRIO outbound message unit 2 */ | ||
92 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 40: SRIO inbound message unit 2 */ | ||
93 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 41: Unused */ | ||
94 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 42: Unused */ | ||
95 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 43: Unused */ | ||
96 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 44: Unused */ | ||
97 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 45: Unused */ | ||
98 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 46: Unused */ | ||
99 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 47: Unused */ | ||
100 | 0x0, /* External 0: */ | ||
101 | 0x0, /* External 1: */ | ||
102 | 0x0, /* External 2: */ | ||
103 | 0x0, /* External 3: */ | ||
104 | 0x0, /* External 4: */ | ||
105 | 0x0, /* External 5: */ | ||
106 | 0x0, /* External 6: */ | ||
107 | 0x0, /* External 7: */ | ||
108 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* External 8: Pixis FPGA */ | ||
109 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* External 9: ULI 8259 INTR Cascade */ | ||
110 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* External 10: Quad ETH PHY */ | ||
111 | 0x0, /* External 11: */ | ||
112 | 0x0, | ||
113 | 0x0, | ||
114 | 0x0, | ||
115 | 0x0, | ||
116 | }; | ||
117 | |||
118 | |||
119 | void __init | ||
120 | mpc86xx_hpcn_init_irq(void) | ||
121 | { | ||
122 | struct mpic *mpic1; | ||
123 | phys_addr_t openpic_paddr; | ||
124 | |||
125 | /* Determine the Physical Address of the OpenPIC regs */ | ||
126 | openpic_paddr = get_immrbase() + MPC86xx_OPENPIC_OFFSET; | ||
127 | |||
128 | /* Alloc mpic structure and per isu has 16 INT entries. */ | ||
129 | mpic1 = mpic_alloc(openpic_paddr, | ||
130 | MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
131 | 16, MPC86xx_OPENPIC_IRQ_OFFSET, 0, 250, | ||
132 | mpc86xx_hpcn_openpic_initsenses, | ||
133 | sizeof(mpc86xx_hpcn_openpic_initsenses), | ||
134 | " MPIC "); | ||
135 | BUG_ON(mpic1 == NULL); | ||
136 | |||
137 | /* 48 Internal Interrupts */ | ||
138 | mpic_assign_isu(mpic1, 0, openpic_paddr + 0x10200); | ||
139 | mpic_assign_isu(mpic1, 1, openpic_paddr + 0x10400); | ||
140 | mpic_assign_isu(mpic1, 2, openpic_paddr + 0x10600); | ||
141 | |||
142 | /* 16 External interrupts */ | ||
143 | mpic_assign_isu(mpic1, 3, openpic_paddr + 0x10000); | ||
144 | |||
145 | mpic_init(mpic1); | ||
146 | |||
147 | #ifdef CONFIG_PCI | ||
148 | mpic_setup_cascade(MPC86xx_IRQ_EXT9, i8259_irq_cascade, NULL); | ||
149 | i8259_init(0, I8259_OFFSET); | ||
150 | #endif | ||
151 | } | ||
152 | |||
153 | |||
154 | |||
155 | #ifdef CONFIG_PCI | ||
156 | /* | ||
157 | * interrupt routing | ||
158 | */ | ||
159 | |||
160 | int | ||
161 | mpc86xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | ||
162 | { | ||
163 | static char pci_irq_table[][4] = { | ||
164 | /* | ||
165 | * PCI IDSEL/INTPIN->INTLINE | ||
166 | * A B C D | ||
167 | */ | ||
168 | {PIRQA, PIRQB, PIRQC, PIRQD}, /* IDSEL 17 -- PCI Slot 1 */ | ||
169 | {PIRQB, PIRQC, PIRQD, PIRQA}, /* IDSEL 18 -- PCI Slot 2 */ | ||
170 | {0, 0, 0, 0}, /* IDSEL 19 */ | ||
171 | {0, 0, 0, 0}, /* IDSEL 20 */ | ||
172 | {0, 0, 0, 0}, /* IDSEL 21 */ | ||
173 | {0, 0, 0, 0}, /* IDSEL 22 */ | ||
174 | {0, 0, 0, 0}, /* IDSEL 23 */ | ||
175 | {0, 0, 0, 0}, /* IDSEL 24 */ | ||
176 | {0, 0, 0, 0}, /* IDSEL 25 */ | ||
177 | {PIRQD, PIRQA, PIRQB, PIRQC}, /* IDSEL 26 -- PCI Bridge*/ | ||
178 | {PIRQC, 0, 0, 0}, /* IDSEL 27 -- LAN */ | ||
179 | {PIRQE, PIRQF, PIRQH, PIRQ7}, /* IDSEL 28 -- USB 1.1 */ | ||
180 | {PIRQE, PIRQF, PIRQG, 0}, /* IDSEL 29 -- Audio & Modem */ | ||
181 | {PIRQH, 0, 0, 0}, /* IDSEL 30 -- LPC & PMU*/ | ||
182 | {PIRQD, 0, 0, 0}, /* IDSEL 31 -- ATA */ | ||
183 | }; | ||
184 | |||
185 | const long min_idsel = 17, max_idsel = 31, irqs_per_slot = 4; | ||
186 | return PCI_IRQ_TABLE_LOOKUP + I8259_OFFSET; | ||
187 | } | ||
188 | |||
189 | |||
190 | int | ||
191 | mpc86xx_exclude_device(u_char bus, u_char devfn) | ||
192 | { | ||
193 | #if !defined(CONFIG_PCI) | ||
194 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
195 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
196 | #endif | ||
197 | |||
198 | return PCIBIOS_SUCCESSFUL; | ||
199 | } | ||
200 | #endif /* CONFIG_PCI */ | ||
201 | |||
202 | |||
203 | static void __init | ||
204 | mpc86xx_hpcn_setup_arch(void) | ||
205 | { | ||
206 | struct device_node *np; | ||
207 | |||
208 | if (ppc_md.progress) | ||
209 | ppc_md.progress("mpc86xx_hpcn_setup_arch()", 0); | ||
210 | |||
211 | np = of_find_node_by_type(NULL, "cpu"); | ||
212 | if (np != 0) { | ||
213 | unsigned int *fp; | ||
214 | |||
215 | fp = (int *)get_property(np, "clock-frequency", NULL); | ||
216 | if (fp != 0) | ||
217 | loops_per_jiffy = *fp / HZ; | ||
218 | else | ||
219 | loops_per_jiffy = 50000000 / HZ; | ||
220 | of_node_put(np); | ||
221 | } | ||
222 | |||
223 | #ifdef CONFIG_PCI | ||
224 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | ||
225 | add_bridge(np); | ||
226 | |||
227 | ppc_md.pci_swizzle = common_swizzle; | ||
228 | ppc_md.pci_map_irq = mpc86xx_map_irq; | ||
229 | ppc_md.pci_exclude_device = mpc86xx_exclude_device; | ||
230 | #endif | ||
231 | |||
232 | printk("MPC86xx HPCN board from Freescale Semiconductor\n"); | ||
233 | |||
234 | #ifdef CONFIG_ROOT_NFS | ||
235 | ROOT_DEV = Root_NFS; | ||
236 | #else | ||
237 | ROOT_DEV = Root_HDA1; | ||
238 | #endif | ||
239 | |||
240 | #ifdef CONFIG_SMP | ||
241 | mpc86xx_smp_init(); | ||
242 | #endif | ||
243 | } | ||
244 | |||
245 | |||
246 | void | ||
247 | mpc86xx_hpcn_show_cpuinfo(struct seq_file *m) | ||
248 | { | ||
249 | struct device_node *root; | ||
250 | uint memsize = total_memory; | ||
251 | const char *model = ""; | ||
252 | uint svid = mfspr(SPRN_SVR); | ||
253 | |||
254 | seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n"); | ||
255 | |||
256 | root = of_find_node_by_path("/"); | ||
257 | if (root) | ||
258 | model = get_property(root, "model", NULL); | ||
259 | seq_printf(m, "Machine\t\t: %s\n", model); | ||
260 | of_node_put(root); | ||
261 | |||
262 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); | ||
263 | seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024)); | ||
264 | } | ||
265 | |||
266 | |||
267 | /* | ||
268 | * Called very early, device-tree isn't unflattened | ||
269 | */ | ||
270 | static int __init mpc86xx_hpcn_probe(void) | ||
271 | { | ||
272 | unsigned long root = of_get_flat_dt_root(); | ||
273 | |||
274 | if (of_flat_dt_is_compatible(root, "mpc86xx")) | ||
275 | return 1; /* Looks good */ | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | |||
281 | void | ||
282 | mpc86xx_restart(char *cmd) | ||
283 | { | ||
284 | void __iomem *rstcr; | ||
285 | |||
286 | rstcr = ioremap(get_immrbase() + MPC86XX_RSTCR_OFFSET, 0x100); | ||
287 | |||
288 | local_irq_disable(); | ||
289 | |||
290 | /* Assert reset request to Reset Control Register */ | ||
291 | out_be32(rstcr, 0x2); | ||
292 | |||
293 | /* not reached */ | ||
294 | } | ||
295 | |||
296 | |||
297 | long __init | ||
298 | mpc86xx_time_init(void) | ||
299 | { | ||
300 | unsigned int temp; | ||
301 | |||
302 | /* Set the time base to zero */ | ||
303 | mtspr(SPRN_TBWL, 0); | ||
304 | mtspr(SPRN_TBWU, 0); | ||
305 | |||
306 | temp = mfspr(SPRN_HID0); | ||
307 | temp |= HID0_TBEN; | ||
308 | mtspr(SPRN_HID0, temp); | ||
309 | asm volatile("isync"); | ||
310 | |||
311 | return 0; | ||
312 | } | ||
313 | |||
314 | |||
315 | define_machine(mpc86xx_hpcn) { | ||
316 | .name = "MPC86xx HPCN", | ||
317 | .probe = mpc86xx_hpcn_probe, | ||
318 | .setup_arch = mpc86xx_hpcn_setup_arch, | ||
319 | .init_IRQ = mpc86xx_hpcn_init_irq, | ||
320 | .show_cpuinfo = mpc86xx_hpcn_show_cpuinfo, | ||
321 | .get_irq = mpic_get_irq, | ||
322 | .restart = mpc86xx_restart, | ||
323 | .time_init = mpc86xx_time_init, | ||
324 | .calibrate_decr = generic_calibrate_decr, | ||
325 | .progress = udbg_progress, | ||
326 | }; | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_pcie.c b/arch/powerpc/platforms/86xx/mpc86xx_pcie.c new file mode 100644 index 000000000000..a2f4f730213e --- /dev/null +++ b/arch/powerpc/platforms/86xx/mpc86xx_pcie.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Support for indirect PCI bridges. | ||
3 | * | ||
4 | * Copyright (C) 1998 Gabriel Paubert. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * "Temporary" MPC8548 Errata file - | ||
12 | * The standard indirect_pci code should work with future silicon versions. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/pci.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/string.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/bootmem.h> | ||
21 | |||
22 | #include <asm/io.h> | ||
23 | #include <asm/prom.h> | ||
24 | #include <asm/pci-bridge.h> | ||
25 | #include <asm/machdep.h> | ||
26 | |||
27 | #include "mpc86xx.h" | ||
28 | |||
29 | #define PCI_CFG_OUT out_be32 | ||
30 | |||
31 | /* ERRATA PCI-Ex 14 PCIE Controller timeout */ | ||
32 | #define PCIE_FIX out_be32(hose->cfg_addr+0x4, 0x0400ffff) | ||
33 | |||
34 | |||
35 | static int | ||
36 | indirect_read_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
37 | int len, u32 *val) | ||
38 | { | ||
39 | struct pci_controller *hose = bus->sysdata; | ||
40 | volatile void __iomem *cfg_data; | ||
41 | u32 temp; | ||
42 | |||
43 | if (ppc_md.pci_exclude_device) | ||
44 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | ||
45 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
46 | |||
47 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
48 | if (devfn != 0x0 && bus->number == 0xff) | ||
49 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
50 | |||
51 | PCIE_FIX; | ||
52 | if (bus->number == 0xff) { | ||
53 | PCI_CFG_OUT(hose->cfg_addr, | ||
54 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
55 | ((bus->number - hose->bus_offset) << 16) | ||
56 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
57 | } else { | ||
58 | PCI_CFG_OUT(hose->cfg_addr, | ||
59 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
60 | ((bus->number - hose->bus_offset) << 16) | ||
61 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * Note: the caller has already checked that offset is | ||
66 | * suitably aligned and that len is 1, 2 or 4. | ||
67 | */ | ||
68 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
69 | cfg_data = hose->cfg_data; | ||
70 | PCIE_FIX; | ||
71 | temp = in_le32(cfg_data); | ||
72 | switch (len) { | ||
73 | case 1: | ||
74 | *val = (temp >> (((offset & 3))*8)) & 0xff; | ||
75 | break; | ||
76 | case 2: | ||
77 | *val = (temp >> (((offset & 3))*8)) & 0xffff; | ||
78 | break; | ||
79 | default: | ||
80 | *val = temp; | ||
81 | break; | ||
82 | } | ||
83 | return PCIBIOS_SUCCESSFUL; | ||
84 | } | ||
85 | |||
86 | static int | ||
87 | indirect_write_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
88 | int len, u32 val) | ||
89 | { | ||
90 | struct pci_controller *hose = bus->sysdata; | ||
91 | volatile void __iomem *cfg_data; | ||
92 | u32 temp; | ||
93 | |||
94 | if (ppc_md.pci_exclude_device) | ||
95 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | ||
96 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
97 | |||
98 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
99 | if (devfn != 0x0 && bus->number == 0xff) | ||
100 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
101 | |||
102 | PCIE_FIX; | ||
103 | if (bus->number == 0xff) { | ||
104 | PCI_CFG_OUT(hose->cfg_addr, | ||
105 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
106 | ((bus->number - hose->bus_offset) << 16) | ||
107 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
108 | } else { | ||
109 | PCI_CFG_OUT(hose->cfg_addr, | ||
110 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
111 | ((bus->number - hose->bus_offset) << 16) | ||
112 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
113 | } | ||
114 | |||
115 | /* | ||
116 | * Note: the caller has already checked that offset is | ||
117 | * suitably aligned and that len is 1, 2 or 4. | ||
118 | */ | ||
119 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
120 | cfg_data = hose->cfg_data; | ||
121 | switch (len) { | ||
122 | case 1: | ||
123 | PCIE_FIX; | ||
124 | temp = in_le32(cfg_data); | ||
125 | temp = (temp & ~(0xff << ((offset & 3) * 8))) | | ||
126 | (val << ((offset & 3) * 8)); | ||
127 | PCIE_FIX; | ||
128 | out_le32(cfg_data, temp); | ||
129 | break; | ||
130 | case 2: | ||
131 | PCIE_FIX; | ||
132 | temp = in_le32(cfg_data); | ||
133 | temp = (temp & ~(0xffff << ((offset & 3) * 8))); | ||
134 | temp |= (val << ((offset & 3) * 8)) ; | ||
135 | PCIE_FIX; | ||
136 | out_le32(cfg_data, temp); | ||
137 | break; | ||
138 | default: | ||
139 | PCIE_FIX; | ||
140 | out_le32(cfg_data, val); | ||
141 | break; | ||
142 | } | ||
143 | PCIE_FIX; | ||
144 | return PCIBIOS_SUCCESSFUL; | ||
145 | } | ||
146 | |||
147 | static struct pci_ops indirect_pcie_ops = { | ||
148 | indirect_read_config_pcie, | ||
149 | indirect_write_config_pcie | ||
150 | }; | ||
151 | |||
152 | void __init | ||
153 | setup_indirect_pcie_nomap(struct pci_controller* hose, void __iomem * cfg_addr, | ||
154 | void __iomem * cfg_data) | ||
155 | { | ||
156 | hose->cfg_addr = cfg_addr; | ||
157 | hose->cfg_data = cfg_data; | ||
158 | hose->ops = &indirect_pcie_ops; | ||
159 | } | ||
160 | |||
161 | void __init | ||
162 | setup_indirect_pcie(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data) | ||
163 | { | ||
164 | unsigned long base = cfg_addr & PAGE_MASK; | ||
165 | void __iomem *mbase, *addr, *data; | ||
166 | |||
167 | mbase = ioremap(base, PAGE_SIZE); | ||
168 | addr = mbase + (cfg_addr & ~PAGE_MASK); | ||
169 | if ((cfg_data & PAGE_MASK) != base) | ||
170 | mbase = ioremap(cfg_data & PAGE_MASK, PAGE_SIZE); | ||
171 | data = mbase + (cfg_data & ~PAGE_MASK); | ||
172 | setup_indirect_pcie_nomap(hose, addr, data); | ||
173 | } | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_smp.c b/arch/powerpc/platforms/86xx/mpc86xx_smp.c new file mode 100644 index 000000000000..944ec4b71416 --- /dev/null +++ b/arch/powerpc/platforms/86xx/mpc86xx_smp.c | |||
@@ -0,0 +1,117 @@ | |||
1 | /* | ||
2 | * Author: Xianghua Xiao <x.xiao@freescale.com> | ||
3 | * Zhang Wei <wei.zhang@freescale.com> | ||
4 | * | ||
5 | * Copyright 2006 Freescale Semiconductor Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | #include <linux/stddef.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/delay.h> | ||
18 | |||
19 | #include <asm/pgtable.h> | ||
20 | #include <asm/page.h> | ||
21 | #include <asm/pci-bridge.h> | ||
22 | #include <asm-powerpc/mpic.h> | ||
23 | #include <asm/mpc86xx.h> | ||
24 | #include <asm/cacheflush.h> | ||
25 | |||
26 | #include <sysdev/fsl_soc.h> | ||
27 | |||
28 | #include "mpc86xx.h" | ||
29 | |||
30 | extern void __secondary_start_mpc86xx(void); | ||
31 | extern unsigned long __secondary_hold_acknowledge; | ||
32 | |||
33 | |||
34 | static void __init | ||
35 | smp_86xx_release_core(int nr) | ||
36 | { | ||
37 | void *mcm_vaddr; | ||
38 | unsigned long vaddr, pcr; | ||
39 | |||
40 | if (nr < 0 || nr >= NR_CPUS) | ||
41 | return; | ||
42 | |||
43 | /* | ||
44 | * Startup Core #nr. | ||
45 | */ | ||
46 | mcm_vaddr = ioremap(get_immrbase() + MPC86xx_MCM_OFFSET, | ||
47 | MPC86xx_MCM_SIZE); | ||
48 | vaddr = (unsigned long)mcm_vaddr + MCM_PORT_CONFIG_OFFSET; | ||
49 | pcr = in_be32((volatile unsigned *)vaddr); | ||
50 | pcr |= 1 << (nr + 24); | ||
51 | out_be32((volatile unsigned *)vaddr, pcr); | ||
52 | } | ||
53 | |||
54 | |||
55 | static void __init | ||
56 | smp_86xx_kick_cpu(int nr) | ||
57 | { | ||
58 | unsigned int save_vector; | ||
59 | unsigned long target, flags; | ||
60 | int n = 0; | ||
61 | volatile unsigned int *vector | ||
62 | = (volatile unsigned int *)(KERNELBASE + 0x100); | ||
63 | |||
64 | if (nr < 0 || nr >= NR_CPUS) | ||
65 | return; | ||
66 | |||
67 | pr_debug("smp_86xx_kick_cpu: kick CPU #%d\n", nr); | ||
68 | |||
69 | local_irq_save(flags); | ||
70 | local_irq_disable(); | ||
71 | |||
72 | /* Save reset vector */ | ||
73 | save_vector = *vector; | ||
74 | |||
75 | /* Setup fake reset vector to call __secondary_start_mpc86xx. */ | ||
76 | target = (unsigned long) __secondary_start_mpc86xx; | ||
77 | create_branch((unsigned long)vector, target, BRANCH_SET_LINK); | ||
78 | |||
79 | /* Kick that CPU */ | ||
80 | smp_86xx_release_core(nr); | ||
81 | |||
82 | /* Wait a bit for the CPU to take the exception. */ | ||
83 | while ((__secondary_hold_acknowledge != nr) && (n++, n < 1000)) | ||
84 | mdelay(1); | ||
85 | |||
86 | /* Restore the exception vector */ | ||
87 | *vector = save_vector; | ||
88 | flush_icache_range((unsigned long) vector, (unsigned long) vector + 4); | ||
89 | |||
90 | local_irq_restore(flags); | ||
91 | |||
92 | pr_debug("wait CPU #%d for %d msecs.\n", nr, n); | ||
93 | } | ||
94 | |||
95 | |||
96 | static void __init | ||
97 | smp_86xx_setup_cpu(int cpu_nr) | ||
98 | { | ||
99 | mpic_setup_this_cpu(); | ||
100 | } | ||
101 | |||
102 | |||
103 | struct smp_ops_t smp_86xx_ops = { | ||
104 | .message_pass = smp_mpic_message_pass, | ||
105 | .probe = smp_mpic_probe, | ||
106 | .kick_cpu = smp_86xx_kick_cpu, | ||
107 | .setup_cpu = smp_86xx_setup_cpu, | ||
108 | .take_timebase = smp_generic_take_timebase, | ||
109 | .give_timebase = smp_generic_give_timebase, | ||
110 | }; | ||
111 | |||
112 | |||
113 | void __init | ||
114 | mpc86xx_smp_init(void) | ||
115 | { | ||
116 | smp_ops = &smp_86xx_ops; | ||
117 | } | ||
diff --git a/arch/powerpc/platforms/86xx/pci.c b/arch/powerpc/platforms/86xx/pci.c new file mode 100644 index 000000000000..5180df7c75bc --- /dev/null +++ b/arch/powerpc/platforms/86xx/pci.c | |||
@@ -0,0 +1,325 @@ | |||
1 | /* | ||
2 | * MPC86XX pci setup code | ||
3 | * | ||
4 | * Recode: ZHANG WEI <wei.zhang@freescale.com> | ||
5 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> | ||
6 | * | ||
7 | * Copyright 2006 Freescale Semiconductor Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <linux/serial.h> | ||
21 | |||
22 | #include <asm/system.h> | ||
23 | #include <asm/atomic.h> | ||
24 | #include <asm/io.h> | ||
25 | #include <asm/prom.h> | ||
26 | #include <asm/immap_86xx.h> | ||
27 | #include <asm/pci-bridge.h> | ||
28 | #include <sysdev/fsl_soc.h> | ||
29 | |||
30 | #include "mpc86xx.h" | ||
31 | |||
32 | #undef DEBUG | ||
33 | |||
34 | #ifdef DEBUG | ||
35 | #define DBG(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args) | ||
36 | #else | ||
37 | #define DBG(fmt, args...) | ||
38 | #endif | ||
39 | |||
40 | struct pcie_outbound_window_regs { | ||
41 | uint pexotar; /* 0x.0 - PCI Express outbound translation address register */ | ||
42 | uint pexotear; /* 0x.4 - PCI Express outbound translation extended address register */ | ||
43 | uint pexowbar; /* 0x.8 - PCI Express outbound window base address register */ | ||
44 | char res1[4]; | ||
45 | uint pexowar; /* 0x.10 - PCI Express outbound window attributes register */ | ||
46 | char res2[12]; | ||
47 | }; | ||
48 | |||
49 | struct pcie_inbound_window_regs { | ||
50 | uint pexitar; /* 0x.0 - PCI Express inbound translation address register */ | ||
51 | char res1[4]; | ||
52 | uint pexiwbar; /* 0x.8 - PCI Express inbound window base address register */ | ||
53 | uint pexiwbear; /* 0x.c - PCI Express inbound window base extended address register */ | ||
54 | uint pexiwar; /* 0x.10 - PCI Express inbound window attributes register */ | ||
55 | char res2[12]; | ||
56 | }; | ||
57 | |||
58 | static void __init setup_pcie_atmu(struct pci_controller *hose, struct resource *rsrc) | ||
59 | { | ||
60 | volatile struct ccsr_pex *pcie; | ||
61 | volatile struct pcie_outbound_window_regs *pcieow; | ||
62 | volatile struct pcie_inbound_window_regs *pcieiw; | ||
63 | int i = 0; | ||
64 | |||
65 | DBG("PCIE memory map start 0x%x, size 0x%x\n", rsrc->start, | ||
66 | rsrc->end - rsrc->start + 1); | ||
67 | pcie = ioremap(rsrc->start, rsrc->end - rsrc->start + 1); | ||
68 | |||
69 | /* Disable all windows (except pexowar0 since its ignored) */ | ||
70 | pcie->pexowar1 = 0; | ||
71 | pcie->pexowar2 = 0; | ||
72 | pcie->pexowar3 = 0; | ||
73 | pcie->pexowar4 = 0; | ||
74 | pcie->pexiwar1 = 0; | ||
75 | pcie->pexiwar2 = 0; | ||
76 | pcie->pexiwar3 = 0; | ||
77 | |||
78 | pcieow = (struct pcie_outbound_window_regs *)&pcie->pexotar1; | ||
79 | pcieiw = (struct pcie_inbound_window_regs *)&pcie->pexitar1; | ||
80 | |||
81 | /* Setup outbound MEM window */ | ||
82 | for(i = 0; i < 3; i++) | ||
83 | if (hose->mem_resources[i].flags & IORESOURCE_MEM){ | ||
84 | DBG("PCIE MEM resource start 0x%08x, size 0x%08x.\n", | ||
85 | hose->mem_resources[i].start, | ||
86 | hose->mem_resources[i].end | ||
87 | - hose->mem_resources[i].start + 1); | ||
88 | pcieow->pexotar = (hose->mem_resources[i].start) >> 12 | ||
89 | & 0x000fffff; | ||
90 | pcieow->pexotear = 0; | ||
91 | pcieow->pexowbar = (hose->mem_resources[i].start) >> 12 | ||
92 | & 0x000fffff; | ||
93 | /* Enable, Mem R/W */ | ||
94 | pcieow->pexowar = 0x80044000 | | ||
95 | (__ilog2(hose->mem_resources[i].end | ||
96 | - hose->mem_resources[i].start + 1) | ||
97 | - 1); | ||
98 | pcieow++; | ||
99 | } | ||
100 | |||
101 | /* Setup outbound IO window */ | ||
102 | if (hose->io_resource.flags & IORESOURCE_IO){ | ||
103 | DBG("PCIE IO resource start 0x%08x, size 0x%08x, phy base 0x%08x.\n", | ||
104 | hose->io_resource.start, | ||
105 | hose->io_resource.end - hose->io_resource.start + 1, | ||
106 | hose->io_base_phys); | ||
107 | pcieow->pexotar = (hose->io_resource.start) >> 12 & 0x000fffff; | ||
108 | pcieow->pexotear = 0; | ||
109 | pcieow->pexowbar = (hose->io_base_phys) >> 12 & 0x000fffff; | ||
110 | /* Enable, IO R/W */ | ||
111 | pcieow->pexowar = 0x80088000 | (__ilog2(hose->io_resource.end | ||
112 | - hose->io_resource.start + 1) - 1); | ||
113 | } | ||
114 | |||
115 | /* Setup 2G inbound Memory Window @ 0 */ | ||
116 | pcieiw->pexitar = 0x00000000; | ||
117 | pcieiw->pexiwbar = 0x00000000; | ||
118 | /* Enable, Prefetch, Local Mem, Snoop R/W, 2G */ | ||
119 | pcieiw->pexiwar = 0xa0f5501e; | ||
120 | } | ||
121 | |||
122 | static void __init | ||
123 | mpc86xx_setup_pcie(struct pci_controller *hose, u32 pcie_offset, u32 pcie_size) | ||
124 | { | ||
125 | volatile struct ccsr_pex *pcie; | ||
126 | u16 cmd; | ||
127 | unsigned int temps; | ||
128 | |||
129 | DBG("PCIE host controller register offset 0x%08x, size 0x%08x.\n", | ||
130 | pcie_offset, pcie_size); | ||
131 | |||
132 | pcie = ioremap(pcie_offset, pcie_size); | ||
133 | |||
134 | early_read_config_word(hose, 0, 0, PCI_COMMAND, &cmd); | ||
135 | cmd |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | ||
136 | | PCI_COMMAND_IO; | ||
137 | early_write_config_word(hose, 0, 0, PCI_COMMAND, cmd); | ||
138 | |||
139 | early_write_config_byte(hose, 0, 0, PCI_LATENCY_TIMER, 0x80); | ||
140 | |||
141 | /* PCIE Bus, Fix the MPC8641D host bridge's location to bus 0xFF. */ | ||
142 | early_read_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, &temps); | ||
143 | temps = (temps & 0xff000000) | (0xff) | (0x0 << 8) | (0xfe << 16); | ||
144 | early_write_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, temps); | ||
145 | } | ||
146 | |||
147 | int __init add_bridge(struct device_node *dev) | ||
148 | { | ||
149 | int len; | ||
150 | struct pci_controller *hose; | ||
151 | struct resource rsrc; | ||
152 | int *bus_range; | ||
153 | int has_address = 0; | ||
154 | int primary = 0; | ||
155 | |||
156 | DBG("Adding PCIE host bridge %s\n", dev->full_name); | ||
157 | |||
158 | /* Fetch host bridge registers address */ | ||
159 | has_address = (of_address_to_resource(dev, 0, &rsrc) == 0); | ||
160 | |||
161 | /* Get bus range if any */ | ||
162 | bus_range = (int *) get_property(dev, "bus-range", &len); | ||
163 | if (bus_range == NULL || len < 2 * sizeof(int)) | ||
164 | printk(KERN_WARNING "Can't get bus-range for %s, assume" | ||
165 | " bus 0\n", dev->full_name); | ||
166 | |||
167 | hose = pcibios_alloc_controller(); | ||
168 | if (!hose) | ||
169 | return -ENOMEM; | ||
170 | hose->arch_data = dev; | ||
171 | hose->set_cfg_type = 1; | ||
172 | |||
173 | /* last_busno = 0xfe cause by MPC8641 PCIE bug */ | ||
174 | hose->first_busno = bus_range ? bus_range[0] : 0x0; | ||
175 | hose->last_busno = bus_range ? bus_range[1] : 0xfe; | ||
176 | |||
177 | setup_indirect_pcie(hose, rsrc.start, rsrc.start + 0x4); | ||
178 | |||
179 | /* Setup the PCIE host controller. */ | ||
180 | mpc86xx_setup_pcie(hose, rsrc.start, rsrc.end - rsrc.start + 1); | ||
181 | |||
182 | if ((rsrc.start & 0xfffff) == 0x8000) | ||
183 | primary = 1; | ||
184 | |||
185 | printk(KERN_INFO "Found MPC86xx PCIE host bridge at 0x%08lx. " | ||
186 | "Firmware bus number: %d->%d\n", | ||
187 | rsrc.start, hose->first_busno, hose->last_busno); | ||
188 | |||
189 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | ||
190 | hose, hose->cfg_addr, hose->cfg_data); | ||
191 | |||
192 | /* Interpret the "ranges" property */ | ||
193 | /* This also maps the I/O region and sets isa_io/mem_base */ | ||
194 | pci_process_bridge_OF_ranges(hose, dev, primary); | ||
195 | |||
196 | /* Setup PEX window registers */ | ||
197 | setup_pcie_atmu(hose, &rsrc); | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static void __devinit quirk_ali1575(struct pci_dev *dev) | ||
203 | { | ||
204 | unsigned short temp; | ||
205 | |||
206 | /* | ||
207 | * ALI1575 interrupts route table setup: | ||
208 | * | ||
209 | * IRQ pin IRQ# | ||
210 | * PIRQA ---- 3 | ||
211 | * PIRQB ---- 4 | ||
212 | * PIRQC ---- 5 | ||
213 | * PIRQD ---- 6 | ||
214 | * PIRQE ---- 9 | ||
215 | * PIRQF ---- 10 | ||
216 | * PIRQG ---- 11 | ||
217 | * PIRQH ---- 12 | ||
218 | * | ||
219 | * interrupts for PCI slot0 -- PIRQA / PIRQB / PIRQC / PIRQD | ||
220 | * PCI slot1 -- PIRQB / PIRQC / PIRQD / PIRQA | ||
221 | */ | ||
222 | pci_write_config_dword(dev, 0x48, 0xb9317542); | ||
223 | |||
224 | /* USB 1.1 OHCI controller 1, interrupt: PIRQE */ | ||
225 | pci_write_config_byte(dev, 0x86, 0x0c); | ||
226 | |||
227 | /* USB 1.1 OHCI controller 2, interrupt: PIRQF */ | ||
228 | pci_write_config_byte(dev, 0x87, 0x0d); | ||
229 | |||
230 | /* USB 1.1 OHCI controller 3, interrupt: PIRQH */ | ||
231 | pci_write_config_byte(dev, 0x88, 0x0f); | ||
232 | |||
233 | /* USB 2.0 controller, interrupt: PIRQ7 */ | ||
234 | pci_write_config_byte(dev, 0x74, 0x06); | ||
235 | |||
236 | /* Audio controller, interrupt: PIRQE */ | ||
237 | pci_write_config_byte(dev, 0x8a, 0x0c); | ||
238 | |||
239 | /* Modem controller, interrupt: PIRQF */ | ||
240 | pci_write_config_byte(dev, 0x8b, 0x0d); | ||
241 | |||
242 | /* HD audio controller, interrupt: PIRQG */ | ||
243 | pci_write_config_byte(dev, 0x8c, 0x0e); | ||
244 | |||
245 | /* Serial ATA interrupt: PIRQD */ | ||
246 | pci_write_config_byte(dev, 0x8d, 0x0b); | ||
247 | |||
248 | /* SMB interrupt: PIRQH */ | ||
249 | pci_write_config_byte(dev, 0x8e, 0x0f); | ||
250 | |||
251 | /* PMU ACPI SCI interrupt: PIRQH */ | ||
252 | pci_write_config_byte(dev, 0x8f, 0x0f); | ||
253 | |||
254 | /* Primary PATA IDE IRQ: 14 | ||
255 | * Secondary PATA IDE IRQ: 15 | ||
256 | */ | ||
257 | pci_write_config_byte(dev, 0x44, 0x3d); | ||
258 | pci_write_config_byte(dev, 0x75, 0x0f); | ||
259 | |||
260 | /* Set IRQ14 and IRQ15 to legacy IRQs */ | ||
261 | pci_read_config_word(dev, 0x46, &temp); | ||
262 | temp |= 0xc000; | ||
263 | pci_write_config_word(dev, 0x46, temp); | ||
264 | |||
265 | /* Set i8259 interrupt trigger | ||
266 | * IRQ 3: Level | ||
267 | * IRQ 4: Level | ||
268 | * IRQ 5: Level | ||
269 | * IRQ 6: Level | ||
270 | * IRQ 7: Level | ||
271 | * IRQ 9: Level | ||
272 | * IRQ 10: Level | ||
273 | * IRQ 11: Level | ||
274 | * IRQ 12: Level | ||
275 | * IRQ 14: Edge | ||
276 | * IRQ 15: Edge | ||
277 | */ | ||
278 | outb(0xfa, 0x4d0); | ||
279 | outb(0x1e, 0x4d1); | ||
280 | } | ||
281 | |||
282 | static void __devinit quirk_uli5288(struct pci_dev *dev) | ||
283 | { | ||
284 | unsigned char c; | ||
285 | |||
286 | pci_read_config_byte(dev,0x83,&c); | ||
287 | c |= 0x80; | ||
288 | pci_write_config_byte(dev, 0x83, c); | ||
289 | |||
290 | pci_write_config_byte(dev, 0x09, 0x01); | ||
291 | pci_write_config_byte(dev, 0x0a, 0x06); | ||
292 | |||
293 | pci_read_config_byte(dev,0x83,&c); | ||
294 | c &= 0x7f; | ||
295 | pci_write_config_byte(dev, 0x83, c); | ||
296 | |||
297 | pci_read_config_byte(dev,0x84,&c); | ||
298 | c |= 0x01; | ||
299 | pci_write_config_byte(dev, 0x84, c); | ||
300 | } | ||
301 | |||
302 | static void __devinit quirk_uli5229(struct pci_dev *dev) | ||
303 | { | ||
304 | unsigned short temp; | ||
305 | pci_write_config_word(dev, 0x04, 0x0405); | ||
306 | pci_read_config_word(dev, 0x4a, &temp); | ||
307 | temp |= 0x1000; | ||
308 | pci_write_config_word(dev, 0x4a, temp); | ||
309 | } | ||
310 | |||
311 | static void __devinit early_uli5249(struct pci_dev *dev) | ||
312 | { | ||
313 | unsigned char temp; | ||
314 | pci_write_config_word(dev, 0x04, 0x0007); | ||
315 | pci_read_config_byte(dev, 0x7c, &temp); | ||
316 | pci_write_config_byte(dev, 0x7c, 0x80); | ||
317 | pci_write_config_byte(dev, 0x09, 0x01); | ||
318 | pci_write_config_byte(dev, 0x7c, temp); | ||
319 | dev->class |= 0x1; | ||
320 | } | ||
321 | |||
322 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_ali1575); | ||
323 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288); | ||
324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229); | ||
325 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249); | ||
diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index c4f6b0d2d140..292863694562 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile | |||
@@ -9,6 +9,7 @@ obj-$(CONFIG_PPC_CHRP) += chrp/ | |||
9 | obj-$(CONFIG_4xx) += 4xx/ | 9 | obj-$(CONFIG_4xx) += 4xx/ |
10 | obj-$(CONFIG_PPC_83xx) += 83xx/ | 10 | obj-$(CONFIG_PPC_83xx) += 83xx/ |
11 | obj-$(CONFIG_PPC_85xx) += 85xx/ | 11 | obj-$(CONFIG_PPC_85xx) += 85xx/ |
12 | obj-$(CONFIG_PPC_86xx) += 86xx/ | ||
12 | obj-$(CONFIG_PPC_PSERIES) += pseries/ | 13 | obj-$(CONFIG_PPC_PSERIES) += pseries/ |
13 | obj-$(CONFIG_PPC_ISERIES) += iseries/ | 14 | obj-$(CONFIG_PPC_ISERIES) += iseries/ |
14 | obj-$(CONFIG_PPC_MAPLE) += maple/ | 15 | obj-$(CONFIG_PPC_MAPLE) += maple/ |
diff --git a/arch/powerpc/platforms/cell/Kconfig b/arch/powerpc/platforms/cell/Kconfig index 6a02d51086c8..352bbbacde9a 100644 --- a/arch/powerpc/platforms/cell/Kconfig +++ b/arch/powerpc/platforms/cell/Kconfig | |||
@@ -5,15 +5,24 @@ config SPU_FS | |||
5 | tristate "SPU file system" | 5 | tristate "SPU file system" |
6 | default m | 6 | default m |
7 | depends on PPC_CELL | 7 | depends on PPC_CELL |
8 | select SPU_BASE | ||
8 | help | 9 | help |
9 | The SPU file system is used to access Synergistic Processing | 10 | The SPU file system is used to access Synergistic Processing |
10 | Units on machines implementing the Broadband Processor | 11 | Units on machines implementing the Broadband Processor |
11 | Architecture. | 12 | Architecture. |
12 | 13 | ||
14 | config SPU_BASE | ||
15 | bool | ||
16 | default n | ||
17 | |||
13 | config SPUFS_MMAP | 18 | config SPUFS_MMAP |
14 | bool | 19 | bool |
15 | depends on SPU_FS && SPARSEMEM | 20 | depends on SPU_FS && SPARSEMEM |
16 | select MEMORY_HOTPLUG | 21 | select MEMORY_HOTPLUG |
17 | default y | 22 | default y |
18 | 23 | ||
24 | config CBE_RAS | ||
25 | bool "RAS features for bare metal Cell BE" | ||
26 | default y | ||
27 | |||
19 | endmenu | 28 | endmenu |
diff --git a/arch/powerpc/platforms/cell/Makefile b/arch/powerpc/platforms/cell/Makefile index e570bad06394..c89cdd67383b 100644 --- a/arch/powerpc/platforms/cell/Makefile +++ b/arch/powerpc/platforms/cell/Makefile | |||
@@ -1,16 +1,15 @@ | |||
1 | obj-y += interrupt.o iommu.o setup.o spider-pic.o | 1 | obj-$(CONFIG_PPC_CELL_NATIVE) += interrupt.o iommu.o setup.o \ |
2 | obj-y += pervasive.o | 2 | cbe_regs.o spider-pic.o pervasive.o |
3 | obj-$(CONFIG_CBE_RAS) += ras.o | ||
3 | 4 | ||
4 | obj-$(CONFIG_SMP) += smp.o | 5 | ifeq ($(CONFIG_SMP),y) |
5 | obj-$(CONFIG_SPU_FS) += spu-base.o spufs/ | 6 | obj-$(CONFIG_PPC_CELL_NATIVE) += smp.o |
6 | 7 | endif | |
7 | spu-base-y += spu_base.o spu_priv1.o | ||
8 | 8 | ||
9 | # needed only when building loadable spufs.ko | 9 | # needed only when building loadable spufs.ko |
10 | spufs-modular-$(CONFIG_SPU_FS) += spu_syscalls.o | 10 | spufs-modular-$(CONFIG_SPU_FS) += spu_syscalls.o |
11 | obj-y += $(spufs-modular-m) | 11 | spu-priv1-$(CONFIG_PPC_CELL_NATIVE) += spu_priv1_mmio.o |
12 | |||
13 | # always needed in kernel | ||
14 | spufs-builtin-$(CONFIG_SPU_FS) += spu_callbacks.o | ||
15 | obj-y += $(spufs-builtin-y) $(spufs-builtin-m) | ||
16 | 12 | ||
13 | obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \ | ||
14 | $(spufs-modular-m) \ | ||
15 | $(spu-priv1-y) spufs/ | ||
diff --git a/arch/powerpc/platforms/cell/cbe_regs.c b/arch/powerpc/platforms/cell/cbe_regs.c new file mode 100644 index 000000000000..2dfde61c8412 --- /dev/null +++ b/arch/powerpc/platforms/cell/cbe_regs.c | |||
@@ -0,0 +1,128 @@ | |||
1 | /* | ||
2 | * cbe_regs.c | ||
3 | * | ||
4 | * Accessor routines for the various MMIO register blocks of the CBE | ||
5 | * | ||
6 | * (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp. | ||
7 | */ | ||
8 | |||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/percpu.h> | ||
12 | #include <linux/types.h> | ||
13 | |||
14 | #include <asm/io.h> | ||
15 | #include <asm/pgtable.h> | ||
16 | #include <asm/prom.h> | ||
17 | #include <asm/ptrace.h> | ||
18 | |||
19 | #include "cbe_regs.h" | ||
20 | |||
21 | #define MAX_CBE 2 | ||
22 | |||
23 | /* | ||
24 | * Current implementation uses "cpu" nodes. We build our own mapping | ||
25 | * array of cpu numbers to cpu nodes locally for now to allow interrupt | ||
26 | * time code to have a fast path rather than call of_get_cpu_node(). If | ||
27 | * we implement cpu hotplug, we'll have to install an appropriate norifier | ||
28 | * in order to release references to the cpu going away | ||
29 | */ | ||
30 | static struct cbe_regs_map | ||
31 | { | ||
32 | struct device_node *cpu_node; | ||
33 | struct cbe_pmd_regs __iomem *pmd_regs; | ||
34 | struct cbe_iic_regs __iomem *iic_regs; | ||
35 | } cbe_regs_maps[MAX_CBE]; | ||
36 | static int cbe_regs_map_count; | ||
37 | |||
38 | static struct cbe_thread_map | ||
39 | { | ||
40 | struct device_node *cpu_node; | ||
41 | struct cbe_regs_map *regs; | ||
42 | } cbe_thread_map[NR_CPUS]; | ||
43 | |||
44 | static struct cbe_regs_map *cbe_find_map(struct device_node *np) | ||
45 | { | ||
46 | int i; | ||
47 | |||
48 | for (i = 0; i < cbe_regs_map_count; i++) | ||
49 | if (cbe_regs_maps[i].cpu_node == np) | ||
50 | return &cbe_regs_maps[i]; | ||
51 | return NULL; | ||
52 | } | ||
53 | |||
54 | struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np) | ||
55 | { | ||
56 | struct cbe_regs_map *map = cbe_find_map(np); | ||
57 | if (map == NULL) | ||
58 | return NULL; | ||
59 | return map->pmd_regs; | ||
60 | } | ||
61 | |||
62 | struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu) | ||
63 | { | ||
64 | struct cbe_regs_map *map = cbe_thread_map[cpu].regs; | ||
65 | if (map == NULL) | ||
66 | return NULL; | ||
67 | return map->pmd_regs; | ||
68 | } | ||
69 | |||
70 | |||
71 | struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np) | ||
72 | { | ||
73 | struct cbe_regs_map *map = cbe_find_map(np); | ||
74 | if (map == NULL) | ||
75 | return NULL; | ||
76 | return map->iic_regs; | ||
77 | } | ||
78 | struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu) | ||
79 | { | ||
80 | struct cbe_regs_map *map = cbe_thread_map[cpu].regs; | ||
81 | if (map == NULL) | ||
82 | return NULL; | ||
83 | return map->iic_regs; | ||
84 | } | ||
85 | |||
86 | void __init cbe_regs_init(void) | ||
87 | { | ||
88 | int i; | ||
89 | struct device_node *cpu; | ||
90 | |||
91 | /* Build local fast map of CPUs */ | ||
92 | for_each_cpu(i) | ||
93 | cbe_thread_map[i].cpu_node = of_get_cpu_node(i, NULL); | ||
94 | |||
95 | /* Find maps for each device tree CPU */ | ||
96 | for_each_node_by_type(cpu, "cpu") { | ||
97 | struct cbe_regs_map *map = &cbe_regs_maps[cbe_regs_map_count++]; | ||
98 | |||
99 | /* That hack must die die die ! */ | ||
100 | struct address_prop { | ||
101 | unsigned long address; | ||
102 | unsigned int len; | ||
103 | } __attribute__((packed)) *prop; | ||
104 | |||
105 | |||
106 | if (cbe_regs_map_count > MAX_CBE) { | ||
107 | printk(KERN_ERR "cbe_regs: More BE chips than supported" | ||
108 | "!\n"); | ||
109 | cbe_regs_map_count--; | ||
110 | return; | ||
111 | } | ||
112 | map->cpu_node = cpu; | ||
113 | for_each_cpu(i) | ||
114 | if (cbe_thread_map[i].cpu_node == cpu) | ||
115 | cbe_thread_map[i].regs = map; | ||
116 | |||
117 | prop = (struct address_prop *)get_property(cpu, "pervasive", | ||
118 | NULL); | ||
119 | if (prop != NULL) | ||
120 | map->pmd_regs = ioremap(prop->address, prop->len); | ||
121 | |||
122 | prop = (struct address_prop *)get_property(cpu, "iic", | ||
123 | NULL); | ||
124 | if (prop != NULL) | ||
125 | map->iic_regs = ioremap(prop->address, prop->len); | ||
126 | } | ||
127 | } | ||
128 | |||
diff --git a/arch/powerpc/platforms/cell/cbe_regs.h b/arch/powerpc/platforms/cell/cbe_regs.h new file mode 100644 index 000000000000..e76e4a6af5bc --- /dev/null +++ b/arch/powerpc/platforms/cell/cbe_regs.h | |||
@@ -0,0 +1,129 @@ | |||
1 | /* | ||
2 | * cbe_regs.h | ||
3 | * | ||
4 | * This file is intended to hold the various register definitions for CBE | ||
5 | * on-chip system devices (memory controller, IO controller, etc...) | ||
6 | * | ||
7 | * (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp. | ||
8 | */ | ||
9 | |||
10 | #ifndef CBE_REGS_H | ||
11 | #define CBE_REGS_H | ||
12 | |||
13 | /* | ||
14 | * | ||
15 | * Some HID register definitions | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | /* CBE specific HID0 bits */ | ||
20 | #define HID0_CBE_THERM_WAKEUP 0x0000020000000000ul | ||
21 | #define HID0_CBE_SYSERR_WAKEUP 0x0000008000000000ul | ||
22 | #define HID0_CBE_THERM_INT_EN 0x0000000400000000ul | ||
23 | #define HID0_CBE_SYSERR_INT_EN 0x0000000200000000ul | ||
24 | |||
25 | |||
26 | /* | ||
27 | * | ||
28 | * Pervasive unit register definitions | ||
29 | * | ||
30 | */ | ||
31 | |||
32 | struct cbe_pmd_regs { | ||
33 | u8 pad_0x0000_0x0800[0x0800 - 0x0000]; /* 0x0000 */ | ||
34 | |||
35 | /* Thermal Sensor Registers */ | ||
36 | u64 ts_ctsr1; /* 0x0800 */ | ||
37 | u64 ts_ctsr2; /* 0x0808 */ | ||
38 | u64 ts_mtsr1; /* 0x0810 */ | ||
39 | u64 ts_mtsr2; /* 0x0818 */ | ||
40 | u64 ts_itr1; /* 0x0820 */ | ||
41 | u64 ts_itr2; /* 0x0828 */ | ||
42 | u64 ts_gitr; /* 0x0830 */ | ||
43 | u64 ts_isr; /* 0x0838 */ | ||
44 | u64 ts_imr; /* 0x0840 */ | ||
45 | u64 tm_cr1; /* 0x0848 */ | ||
46 | u64 tm_cr2; /* 0x0850 */ | ||
47 | u64 tm_simr; /* 0x0858 */ | ||
48 | u64 tm_tpr; /* 0x0860 */ | ||
49 | u64 tm_str1; /* 0x0868 */ | ||
50 | u64 tm_str2; /* 0x0870 */ | ||
51 | u64 tm_tsr; /* 0x0878 */ | ||
52 | |||
53 | /* Power Management */ | ||
54 | u64 pm_control; /* 0x0880 */ | ||
55 | #define CBE_PMD_PAUSE_ZERO_CONTROL 0x10000 | ||
56 | u64 pm_status; /* 0x0888 */ | ||
57 | |||
58 | /* Time Base Register */ | ||
59 | u64 tbr; /* 0x0890 */ | ||
60 | |||
61 | u8 pad_0x0898_0x0c00 [0x0c00 - 0x0898]; /* 0x0898 */ | ||
62 | |||
63 | /* Fault Isolation Registers */ | ||
64 | u64 checkstop_fir; /* 0x0c00 */ | ||
65 | u64 recoverable_fir; | ||
66 | u64 spec_att_mchk_fir; | ||
67 | u64 fir_mode_reg; | ||
68 | u64 fir_enable_mask; | ||
69 | |||
70 | u8 pad_0x0c28_0x1000 [0x1000 - 0x0c28]; /* 0x0c28 */ | ||
71 | }; | ||
72 | |||
73 | extern struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np); | ||
74 | extern struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu); | ||
75 | |||
76 | /* | ||
77 | * | ||
78 | * IIC unit register definitions | ||
79 | * | ||
80 | */ | ||
81 | |||
82 | struct cbe_iic_pending_bits { | ||
83 | u32 data; | ||
84 | u8 flags; | ||
85 | u8 class; | ||
86 | u8 source; | ||
87 | u8 prio; | ||
88 | }; | ||
89 | |||
90 | #define CBE_IIC_IRQ_VALID 0x80 | ||
91 | #define CBE_IIC_IRQ_IPI 0x40 | ||
92 | |||
93 | struct cbe_iic_thread_regs { | ||
94 | struct cbe_iic_pending_bits pending; | ||
95 | struct cbe_iic_pending_bits pending_destr; | ||
96 | u64 generate; | ||
97 | u64 prio; | ||
98 | }; | ||
99 | |||
100 | struct cbe_iic_regs { | ||
101 | u8 pad_0x0000_0x0400[0x0400 - 0x0000]; /* 0x0000 */ | ||
102 | |||
103 | /* IIC interrupt registers */ | ||
104 | struct cbe_iic_thread_regs thread[2]; /* 0x0400 */ | ||
105 | u64 iic_ir; /* 0x0440 */ | ||
106 | u64 iic_is; /* 0x0448 */ | ||
107 | |||
108 | u8 pad_0x0450_0x0500[0x0500 - 0x0450]; /* 0x0450 */ | ||
109 | |||
110 | /* IOC FIR */ | ||
111 | u64 ioc_fir_reset; /* 0x0500 */ | ||
112 | u64 ioc_fir_set; | ||
113 | u64 ioc_checkstop_enable; | ||
114 | u64 ioc_fir_error_mask; | ||
115 | u64 ioc_syserr_enable; | ||
116 | u64 ioc_fir; | ||
117 | |||
118 | u8 pad_0x0530_0x1000[0x1000 - 0x0530]; /* 0x0530 */ | ||
119 | }; | ||
120 | |||
121 | extern struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np); | ||
122 | extern struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu); | ||
123 | |||
124 | |||
125 | /* Init this module early */ | ||
126 | extern void cbe_regs_init(void); | ||
127 | |||
128 | |||
129 | #endif /* CBE_REGS_H */ | ||
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 978be1c30c1b..f4e2d8805c9e 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -33,29 +33,10 @@ | |||
33 | #include <asm/ptrace.h> | 33 | #include <asm/ptrace.h> |
34 | 34 | ||
35 | #include "interrupt.h" | 35 | #include "interrupt.h" |
36 | 36 | #include "cbe_regs.h" | |
37 | struct iic_pending_bits { | ||
38 | u32 data; | ||
39 | u8 flags; | ||
40 | u8 class; | ||
41 | u8 source; | ||
42 | u8 prio; | ||
43 | }; | ||
44 | |||
45 | enum iic_pending_flags { | ||
46 | IIC_VALID = 0x80, | ||
47 | IIC_IPI = 0x40, | ||
48 | }; | ||
49 | |||
50 | struct iic_regs { | ||
51 | struct iic_pending_bits pending; | ||
52 | struct iic_pending_bits pending_destr; | ||
53 | u64 generate; | ||
54 | u64 prio; | ||
55 | }; | ||
56 | 37 | ||
57 | struct iic { | 38 | struct iic { |
58 | struct iic_regs __iomem *regs; | 39 | struct cbe_iic_thread_regs __iomem *regs; |
59 | u8 target_id; | 40 | u8 target_id; |
60 | }; | 41 | }; |
61 | 42 | ||
@@ -115,7 +96,7 @@ static struct hw_interrupt_type iic_pic = { | |||
115 | .end = iic_end, | 96 | .end = iic_end, |
116 | }; | 97 | }; |
117 | 98 | ||
118 | static int iic_external_get_irq(struct iic_pending_bits pending) | 99 | static int iic_external_get_irq(struct cbe_iic_pending_bits pending) |
119 | { | 100 | { |
120 | int irq; | 101 | int irq; |
121 | unsigned char node, unit; | 102 | unsigned char node, unit; |
@@ -136,8 +117,7 @@ static int iic_external_get_irq(struct iic_pending_bits pending) | |||
136 | * One of these units can be connected | 117 | * One of these units can be connected |
137 | * to an external interrupt controller. | 118 | * to an external interrupt controller. |
138 | */ | 119 | */ |
139 | if (pending.prio > 0x3f || | 120 | if (pending.class != 2) |
140 | pending.class != 2) | ||
141 | break; | 121 | break; |
142 | irq = IIC_EXT_OFFSET | 122 | irq = IIC_EXT_OFFSET |
143 | + spider_get_irq(node) | 123 | + spider_get_irq(node) |
@@ -168,15 +148,15 @@ int iic_get_irq(struct pt_regs *regs) | |||
168 | { | 148 | { |
169 | struct iic *iic; | 149 | struct iic *iic; |
170 | int irq; | 150 | int irq; |
171 | struct iic_pending_bits pending; | 151 | struct cbe_iic_pending_bits pending; |
172 | 152 | ||
173 | iic = &__get_cpu_var(iic); | 153 | iic = &__get_cpu_var(iic); |
174 | *(unsigned long *) &pending = | 154 | *(unsigned long *) &pending = |
175 | in_be64((unsigned long __iomem *) &iic->regs->pending_destr); | 155 | in_be64((unsigned long __iomem *) &iic->regs->pending_destr); |
176 | 156 | ||
177 | irq = -1; | 157 | irq = -1; |
178 | if (pending.flags & IIC_VALID) { | 158 | if (pending.flags & CBE_IIC_IRQ_VALID) { |
179 | if (pending.flags & IIC_IPI) { | 159 | if (pending.flags & CBE_IIC_IRQ_IPI) { |
180 | irq = IIC_IPI_OFFSET + (pending.prio >> 4); | 160 | irq = IIC_IPI_OFFSET + (pending.prio >> 4); |
181 | /* | 161 | /* |
182 | if (irq > 0x80) | 162 | if (irq > 0x80) |
@@ -226,7 +206,7 @@ static int setup_iic_hardcoded(void) | |||
226 | regs += 0x20; | 206 | regs += 0x20; |
227 | 207 | ||
228 | printk(KERN_INFO "IIC for CPU %d at %lx\n", cpu, regs); | 208 | printk(KERN_INFO "IIC for CPU %d at %lx\n", cpu, regs); |
229 | iic->regs = ioremap(regs, sizeof(struct iic_regs)); | 209 | iic->regs = ioremap(regs, sizeof(struct cbe_iic_thread_regs)); |
230 | iic->target_id = (nodeid << 4) + ((cpu & 1) ? 0xf : 0xe); | 210 | iic->target_id = (nodeid << 4) + ((cpu & 1) ? 0xf : 0xe); |
231 | } | 211 | } |
232 | 212 | ||
@@ -267,12 +247,12 @@ static int setup_iic(void) | |||
267 | } | 247 | } |
268 | 248 | ||
269 | iic = &per_cpu(iic, np[0]); | 249 | iic = &per_cpu(iic, np[0]); |
270 | iic->regs = ioremap(regs[0], sizeof(struct iic_regs)); | 250 | iic->regs = ioremap(regs[0], sizeof(struct cbe_iic_thread_regs)); |
271 | iic->target_id = ((np[0] & 2) << 3) + ((np[0] & 1) ? 0xf : 0xe); | 251 | iic->target_id = ((np[0] & 2) << 3) + ((np[0] & 1) ? 0xf : 0xe); |
272 | printk("IIC for CPU %d at %lx mapped to %p\n", np[0], regs[0], iic->regs); | 252 | printk("IIC for CPU %d at %lx mapped to %p\n", np[0], regs[0], iic->regs); |
273 | 253 | ||
274 | iic = &per_cpu(iic, np[1]); | 254 | iic = &per_cpu(iic, np[1]); |
275 | iic->regs = ioremap(regs[2], sizeof(struct iic_regs)); | 255 | iic->regs = ioremap(regs[2], sizeof(struct cbe_iic_thread_regs)); |
276 | iic->target_id = ((np[1] & 2) << 3) + ((np[1] & 1) ? 0xf : 0xe); | 256 | iic->target_id = ((np[1] & 2) << 3) + ((np[1] & 1) ? 0xf : 0xe); |
277 | printk("IIC for CPU %d at %lx mapped to %p\n", np[1], regs[2], iic->regs); | 257 | printk("IIC for CPU %d at %lx mapped to %p\n", np[1], regs[2], iic->regs); |
278 | 258 | ||
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index a49ceb799a8e..a35004e14c69 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
@@ -473,6 +473,16 @@ static int cell_dma_supported(struct device *dev, u64 mask) | |||
473 | return mask < 0x100000000ull; | 473 | return mask < 0x100000000ull; |
474 | } | 474 | } |
475 | 475 | ||
476 | static struct dma_mapping_ops cell_iommu_ops = { | ||
477 | .alloc_coherent = cell_alloc_coherent, | ||
478 | .free_coherent = cell_free_coherent, | ||
479 | .map_single = cell_map_single, | ||
480 | .unmap_single = cell_unmap_single, | ||
481 | .map_sg = cell_map_sg, | ||
482 | .unmap_sg = cell_unmap_sg, | ||
483 | .dma_supported = cell_dma_supported, | ||
484 | }; | ||
485 | |||
476 | void cell_init_iommu(void) | 486 | void cell_init_iommu(void) |
477 | { | 487 | { |
478 | int setup_bus = 0; | 488 | int setup_bus = 0; |
@@ -498,11 +508,5 @@ void cell_init_iommu(void) | |||
498 | } | 508 | } |
499 | } | 509 | } |
500 | 510 | ||
501 | pci_dma_ops.alloc_coherent = cell_alloc_coherent; | 511 | pci_dma_ops = cell_iommu_ops; |
502 | pci_dma_ops.free_coherent = cell_free_coherent; | ||
503 | pci_dma_ops.map_single = cell_map_single; | ||
504 | pci_dma_ops.unmap_single = cell_unmap_single; | ||
505 | pci_dma_ops.map_sg = cell_map_sg; | ||
506 | pci_dma_ops.unmap_sg = cell_unmap_sg; | ||
507 | pci_dma_ops.dma_supported = cell_dma_supported; | ||
508 | } | 512 | } |
diff --git a/arch/powerpc/platforms/cell/pervasive.c b/arch/powerpc/platforms/cell/pervasive.c index 7eed8c624517..695ac4e1617e 100644 --- a/arch/powerpc/platforms/cell/pervasive.c +++ b/arch/powerpc/platforms/cell/pervasive.c | |||
@@ -37,36 +37,28 @@ | |||
37 | #include <asm/reg.h> | 37 | #include <asm/reg.h> |
38 | 38 | ||
39 | #include "pervasive.h" | 39 | #include "pervasive.h" |
40 | #include "cbe_regs.h" | ||
40 | 41 | ||
41 | static DEFINE_SPINLOCK(cbe_pervasive_lock); | 42 | static DEFINE_SPINLOCK(cbe_pervasive_lock); |
42 | struct cbe_pervasive { | ||
43 | struct pmd_regs __iomem *regs; | ||
44 | unsigned int thread; | ||
45 | }; | ||
46 | |||
47 | /* can't use per_cpu from setup_arch */ | ||
48 | static struct cbe_pervasive cbe_pervasive[NR_CPUS]; | ||
49 | 43 | ||
50 | static void __init cbe_enable_pause_zero(void) | 44 | static void __init cbe_enable_pause_zero(void) |
51 | { | 45 | { |
52 | unsigned long thread_switch_control; | 46 | unsigned long thread_switch_control; |
53 | unsigned long temp_register; | 47 | unsigned long temp_register; |
54 | struct cbe_pervasive *p; | 48 | struct cbe_pmd_regs __iomem *pregs; |
55 | int thread; | ||
56 | 49 | ||
57 | spin_lock_irq(&cbe_pervasive_lock); | 50 | spin_lock_irq(&cbe_pervasive_lock); |
58 | p = &cbe_pervasive[smp_processor_id()]; | 51 | pregs = cbe_get_cpu_pmd_regs(smp_processor_id()); |
59 | 52 | if (pregs == NULL) | |
60 | if (!cbe_pervasive->regs) | ||
61 | goto out; | 53 | goto out; |
62 | 54 | ||
63 | pr_debug("Power Management: CPU %d\n", smp_processor_id()); | 55 | pr_debug("Power Management: CPU %d\n", smp_processor_id()); |
64 | 56 | ||
65 | /* Enable Pause(0) control bit */ | 57 | /* Enable Pause(0) control bit */ |
66 | temp_register = in_be64(&p->regs->pm_control); | 58 | temp_register = in_be64(&pregs->pm_control); |
67 | 59 | ||
68 | out_be64(&p->regs->pm_control, | 60 | out_be64(&pregs->pm_control, |
69 | temp_register|PMD_PAUSE_ZERO_CONTROL); | 61 | temp_register | CBE_PMD_PAUSE_ZERO_CONTROL); |
70 | 62 | ||
71 | /* Enable DEC and EE interrupt request */ | 63 | /* Enable DEC and EE interrupt request */ |
72 | thread_switch_control = mfspr(SPRN_TSC_CELL); | 64 | thread_switch_control = mfspr(SPRN_TSC_CELL); |
@@ -75,25 +67,16 @@ static void __init cbe_enable_pause_zero(void) | |||
75 | switch ((mfspr(SPRN_CTRLF) & CTRL_CT)) { | 67 | switch ((mfspr(SPRN_CTRLF) & CTRL_CT)) { |
76 | case CTRL_CT0: | 68 | case CTRL_CT0: |
77 | thread_switch_control |= TSC_CELL_DEC_ENABLE_0; | 69 | thread_switch_control |= TSC_CELL_DEC_ENABLE_0; |
78 | thread = 0; | ||
79 | break; | 70 | break; |
80 | case CTRL_CT1: | 71 | case CTRL_CT1: |
81 | thread_switch_control |= TSC_CELL_DEC_ENABLE_1; | 72 | thread_switch_control |= TSC_CELL_DEC_ENABLE_1; |
82 | thread = 1; | ||
83 | break; | 73 | break; |
84 | default: | 74 | default: |
85 | printk(KERN_WARNING "%s: unknown configuration\n", | 75 | printk(KERN_WARNING "%s: unknown configuration\n", |
86 | __FUNCTION__); | 76 | __FUNCTION__); |
87 | thread = -1; | ||
88 | break; | 77 | break; |
89 | } | 78 | } |
90 | 79 | ||
91 | if (p->thread != thread) | ||
92 | printk(KERN_WARNING "%s: device tree inconsistant, " | ||
93 | "cpu %i: %d/%d\n", __FUNCTION__, | ||
94 | smp_processor_id(), | ||
95 | p->thread, thread); | ||
96 | |||
97 | mtspr(SPRN_TSC_CELL, thread_switch_control); | 80 | mtspr(SPRN_TSC_CELL, thread_switch_control); |
98 | 81 | ||
99 | out: | 82 | out: |
@@ -104,6 +87,11 @@ static void cbe_idle(void) | |||
104 | { | 87 | { |
105 | unsigned long ctrl; | 88 | unsigned long ctrl; |
106 | 89 | ||
90 | /* Why do we do that on every idle ? Couldn't that be done once for | ||
91 | * all or do we lose the state some way ? Also, the pm_control | ||
92 | * register setting, that can't be set once at boot ? We really want | ||
93 | * to move that away in order to implement a simple powersave | ||
94 | */ | ||
107 | cbe_enable_pause_zero(); | 95 | cbe_enable_pause_zero(); |
108 | 96 | ||
109 | while (1) { | 97 | while (1) { |
@@ -152,8 +140,15 @@ static int cbe_system_reset_exception(struct pt_regs *regs) | |||
152 | timer_interrupt(regs); | 140 | timer_interrupt(regs); |
153 | break; | 141 | break; |
154 | case SRR1_WAKEMT: | 142 | case SRR1_WAKEMT: |
155 | /* no action required */ | ||
156 | break; | 143 | break; |
144 | #ifdef CONFIG_CBE_RAS | ||
145 | case SRR1_WAKESYSERR: | ||
146 | cbe_system_error_exception(regs); | ||
147 | break; | ||
148 | case SRR1_WAKETHERM: | ||
149 | cbe_thermal_exception(regs); | ||
150 | break; | ||
151 | #endif /* CONFIG_CBE_RAS */ | ||
157 | default: | 152 | default: |
158 | /* do system reset */ | 153 | /* do system reset */ |
159 | return 0; | 154 | return 0; |
@@ -162,68 +157,11 @@ static int cbe_system_reset_exception(struct pt_regs *regs) | |||
162 | return 1; | 157 | return 1; |
163 | } | 158 | } |
164 | 159 | ||
165 | static int __init cbe_find_pmd_mmio(int cpu, struct cbe_pervasive *p) | 160 | void __init cbe_pervasive_init(void) |
166 | { | ||
167 | struct device_node *node; | ||
168 | unsigned int *int_servers; | ||
169 | char *addr; | ||
170 | unsigned long real_address; | ||
171 | unsigned int size; | ||
172 | |||
173 | struct pmd_regs __iomem *pmd_mmio_area; | ||
174 | int hardid, thread; | ||
175 | int proplen; | ||
176 | |||
177 | pmd_mmio_area = NULL; | ||
178 | hardid = get_hard_smp_processor_id(cpu); | ||
179 | for (node = NULL; (node = of_find_node_by_type(node, "cpu"));) { | ||
180 | int_servers = (void *) get_property(node, | ||
181 | "ibm,ppc-interrupt-server#s", &proplen); | ||
182 | if (!int_servers) { | ||
183 | printk(KERN_WARNING "%s misses " | ||
184 | "ibm,ppc-interrupt-server#s property", | ||
185 | node->full_name); | ||
186 | continue; | ||
187 | } | ||
188 | for (thread = 0; thread < proplen / sizeof (int); thread++) { | ||
189 | if (hardid == int_servers[thread]) { | ||
190 | addr = get_property(node, "pervasive", NULL); | ||
191 | goto found; | ||
192 | } | ||
193 | } | ||
194 | } | ||
195 | |||
196 | printk(KERN_WARNING "%s: CPU %d not found\n", __FUNCTION__, cpu); | ||
197 | return -EINVAL; | ||
198 | |||
199 | found: | ||
200 | real_address = *(unsigned long*) addr; | ||
201 | addr += sizeof (unsigned long); | ||
202 | size = *(unsigned int*) addr; | ||
203 | |||
204 | pr_debug("pervasive area for CPU %d at %lx, size %x\n", | ||
205 | cpu, real_address, size); | ||
206 | p->regs = ioremap(real_address, size); | ||
207 | p->thread = thread; | ||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | void __init cell_pervasive_init(void) | ||
212 | { | 161 | { |
213 | struct cbe_pervasive *p; | ||
214 | int cpu; | ||
215 | int ret; | ||
216 | |||
217 | if (!cpu_has_feature(CPU_FTR_PAUSE_ZERO)) | 162 | if (!cpu_has_feature(CPU_FTR_PAUSE_ZERO)) |
218 | return; | 163 | return; |
219 | 164 | ||
220 | for_each_possible_cpu(cpu) { | ||
221 | p = &cbe_pervasive[cpu]; | ||
222 | ret = cbe_find_pmd_mmio(cpu, p); | ||
223 | if (ret) | ||
224 | return; | ||
225 | } | ||
226 | |||
227 | ppc_md.idle_loop = cbe_idle; | 165 | ppc_md.idle_loop = cbe_idle; |
228 | ppc_md.system_reset_exception = cbe_system_reset_exception; | 166 | ppc_md.system_reset_exception = cbe_system_reset_exception; |
229 | } | 167 | } |
diff --git a/arch/powerpc/platforms/cell/pervasive.h b/arch/powerpc/platforms/cell/pervasive.h index da1fb85ca3e8..7b50947f8044 100644 --- a/arch/powerpc/platforms/cell/pervasive.h +++ b/arch/powerpc/platforms/cell/pervasive.h | |||
@@ -25,38 +25,9 @@ | |||
25 | #ifndef PERVASIVE_H | 25 | #ifndef PERVASIVE_H |
26 | #define PERVASIVE_H | 26 | #define PERVASIVE_H |
27 | 27 | ||
28 | struct pmd_regs { | 28 | extern void cbe_pervasive_init(void); |
29 | u8 pad_0x0000_0x0800[0x0800 - 0x0000]; /* 0x0000 */ | 29 | extern void cbe_system_error_exception(struct pt_regs *regs); |
30 | 30 | extern void cbe_maintenance_exception(struct pt_regs *regs); | |
31 | /* Thermal Sensor Registers */ | 31 | extern void cbe_thermal_exception(struct pt_regs *regs); |
32 | u64 ts_ctsr1; /* 0x0800 */ | ||
33 | u64 ts_ctsr2; /* 0x0808 */ | ||
34 | u64 ts_mtsr1; /* 0x0810 */ | ||
35 | u64 ts_mtsr2; /* 0x0818 */ | ||
36 | u64 ts_itr1; /* 0x0820 */ | ||
37 | u64 ts_itr2; /* 0x0828 */ | ||
38 | u64 ts_gitr; /* 0x0830 */ | ||
39 | u64 ts_isr; /* 0x0838 */ | ||
40 | u64 ts_imr; /* 0x0840 */ | ||
41 | u64 tm_cr1; /* 0x0848 */ | ||
42 | u64 tm_cr2; /* 0x0850 */ | ||
43 | u64 tm_simr; /* 0x0858 */ | ||
44 | u64 tm_tpr; /* 0x0860 */ | ||
45 | u64 tm_str1; /* 0x0868 */ | ||
46 | u64 tm_str2; /* 0x0870 */ | ||
47 | u64 tm_tsr; /* 0x0878 */ | ||
48 | |||
49 | /* Power Management */ | ||
50 | u64 pm_control; /* 0x0880 */ | ||
51 | #define PMD_PAUSE_ZERO_CONTROL 0x10000 | ||
52 | u64 pm_status; /* 0x0888 */ | ||
53 | |||
54 | /* Time Base Register */ | ||
55 | u64 tbr; /* 0x0890 */ | ||
56 | |||
57 | u8 pad_0x0898_0x1000 [0x1000 - 0x0898]; /* 0x0898 */ | ||
58 | }; | ||
59 | |||
60 | void __init cell_pervasive_init(void); | ||
61 | 32 | ||
62 | #endif | 33 | #endif |
diff --git a/arch/powerpc/platforms/cell/ras.c b/arch/powerpc/platforms/cell/ras.c new file mode 100644 index 000000000000..033ad6e2827b --- /dev/null +++ b/arch/powerpc/platforms/cell/ras.c | |||
@@ -0,0 +1,112 @@ | |||
1 | #define DEBUG | ||
2 | |||
3 | #include <linux/config.h> | ||
4 | #include <linux/types.h> | ||
5 | #include <linux/kernel.h> | ||
6 | #include <linux/smp.h> | ||
7 | |||
8 | #include <asm/reg.h> | ||
9 | #include <asm/io.h> | ||
10 | #include <asm/prom.h> | ||
11 | #include <asm/machdep.h> | ||
12 | |||
13 | #include "ras.h" | ||
14 | #include "cbe_regs.h" | ||
15 | |||
16 | |||
17 | static void dump_fir(int cpu) | ||
18 | { | ||
19 | struct cbe_pmd_regs __iomem *pregs = cbe_get_cpu_pmd_regs(cpu); | ||
20 | struct cbe_iic_regs __iomem *iregs = cbe_get_cpu_iic_regs(cpu); | ||
21 | |||
22 | if (pregs == NULL) | ||
23 | return; | ||
24 | |||
25 | /* Todo: do some nicer parsing of bits and based on them go down | ||
26 | * to other sub-units FIRs and not only IIC | ||
27 | */ | ||
28 | printk(KERN_ERR "Global Checkstop FIR : 0x%016lx\n", | ||
29 | in_be64(&pregs->checkstop_fir)); | ||
30 | printk(KERN_ERR "Global Recoverable FIR : 0x%016lx\n", | ||
31 | in_be64(&pregs->checkstop_fir)); | ||
32 | printk(KERN_ERR "Global MachineCheck FIR : 0x%016lx\n", | ||
33 | in_be64(&pregs->spec_att_mchk_fir)); | ||
34 | |||
35 | if (iregs == NULL) | ||
36 | return; | ||
37 | printk(KERN_ERR "IOC FIR : 0x%016lx\n", | ||
38 | in_be64(&iregs->ioc_fir)); | ||
39 | |||
40 | } | ||
41 | |||
42 | void cbe_system_error_exception(struct pt_regs *regs) | ||
43 | { | ||
44 | int cpu = smp_processor_id(); | ||
45 | |||
46 | printk(KERN_ERR "System Error Interrupt on CPU %d !\n", cpu); | ||
47 | dump_fir(cpu); | ||
48 | dump_stack(); | ||
49 | } | ||
50 | |||
51 | void cbe_maintenance_exception(struct pt_regs *regs) | ||
52 | { | ||
53 | int cpu = smp_processor_id(); | ||
54 | |||
55 | /* | ||
56 | * Nothing implemented for the maintenance interrupt at this point | ||
57 | */ | ||
58 | |||
59 | printk(KERN_ERR "Unhandled Maintenance interrupt on CPU %d !\n", cpu); | ||
60 | dump_stack(); | ||
61 | } | ||
62 | |||
63 | void cbe_thermal_exception(struct pt_regs *regs) | ||
64 | { | ||
65 | int cpu = smp_processor_id(); | ||
66 | |||
67 | /* | ||
68 | * Nothing implemented for the thermal interrupt at this point | ||
69 | */ | ||
70 | |||
71 | printk(KERN_ERR "Unhandled Thermal interrupt on CPU %d !\n", cpu); | ||
72 | dump_stack(); | ||
73 | } | ||
74 | |||
75 | static int cbe_machine_check_handler(struct pt_regs *regs) | ||
76 | { | ||
77 | int cpu = smp_processor_id(); | ||
78 | |||
79 | printk(KERN_ERR "Machine Check Interrupt on CPU %d !\n", cpu); | ||
80 | dump_fir(cpu); | ||
81 | |||
82 | /* No recovery from this code now, lets continue */ | ||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | void __init cbe_ras_init(void) | ||
87 | { | ||
88 | unsigned long hid0; | ||
89 | |||
90 | /* | ||
91 | * Enable System Error & thermal interrupts and wakeup conditions | ||
92 | */ | ||
93 | |||
94 | hid0 = mfspr(SPRN_HID0); | ||
95 | hid0 |= HID0_CBE_THERM_INT_EN | HID0_CBE_THERM_WAKEUP | | ||
96 | HID0_CBE_SYSERR_INT_EN | HID0_CBE_SYSERR_WAKEUP; | ||
97 | mtspr(SPRN_HID0, hid0); | ||
98 | mb(); | ||
99 | |||
100 | /* | ||
101 | * Install machine check handler. Leave setting of precise mode to | ||
102 | * what the firmware did for now | ||
103 | */ | ||
104 | ppc_md.machine_check_exception = cbe_machine_check_handler; | ||
105 | mb(); | ||
106 | |||
107 | /* | ||
108 | * For now, we assume that IOC_FIR is already set to forward some | ||
109 | * error conditions to the System Error handler. If that is not true | ||
110 | * then it will have to be fixed up here. | ||
111 | */ | ||
112 | } | ||
diff --git a/arch/powerpc/platforms/cell/ras.h b/arch/powerpc/platforms/cell/ras.h new file mode 100644 index 000000000000..eb7ee54c82a0 --- /dev/null +++ b/arch/powerpc/platforms/cell/ras.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef RAS_H | ||
2 | #define RAS_H | ||
3 | |||
4 | extern void cbe_system_error_exception(struct pt_regs *regs); | ||
5 | extern void cbe_maintenance_exception(struct pt_regs *regs); | ||
6 | extern void cbe_thermal_exception(struct pt_regs *regs); | ||
7 | extern void cbe_ras_init(void); | ||
8 | |||
9 | #endif /* RAS_H */ | ||
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index fd3e5609e3e0..3d1831d331e5 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c | |||
@@ -49,10 +49,13 @@ | |||
49 | #include <asm/ppc-pci.h> | 49 | #include <asm/ppc-pci.h> |
50 | #include <asm/irq.h> | 50 | #include <asm/irq.h> |
51 | #include <asm/spu.h> | 51 | #include <asm/spu.h> |
52 | #include <asm/spu_priv1.h> | ||
52 | 53 | ||
53 | #include "interrupt.h" | 54 | #include "interrupt.h" |
54 | #include "iommu.h" | 55 | #include "iommu.h" |
56 | #include "cbe_regs.h" | ||
55 | #include "pervasive.h" | 57 | #include "pervasive.h" |
58 | #include "ras.h" | ||
56 | 59 | ||
57 | #ifdef DEBUG | 60 | #ifdef DEBUG |
58 | #define DBG(fmt...) udbg_printf(fmt) | 61 | #define DBG(fmt...) udbg_printf(fmt) |
@@ -81,6 +84,15 @@ static void __init cell_setup_arch(void) | |||
81 | { | 84 | { |
82 | ppc_md.init_IRQ = iic_init_IRQ; | 85 | ppc_md.init_IRQ = iic_init_IRQ; |
83 | ppc_md.get_irq = iic_get_irq; | 86 | ppc_md.get_irq = iic_get_irq; |
87 | #ifdef CONFIG_SPU_BASE | ||
88 | spu_priv1_ops = &spu_priv1_mmio_ops; | ||
89 | #endif | ||
90 | |||
91 | cbe_regs_init(); | ||
92 | |||
93 | #ifdef CONFIG_CBE_RAS | ||
94 | cbe_ras_init(); | ||
95 | #endif | ||
84 | 96 | ||
85 | #ifdef CONFIG_SMP | 97 | #ifdef CONFIG_SMP |
86 | smp_init_cell(); | 98 | smp_init_cell(); |
@@ -98,7 +110,7 @@ static void __init cell_setup_arch(void) | |||
98 | init_pci_config_tokens(); | 110 | init_pci_config_tokens(); |
99 | find_and_init_phbs(); | 111 | find_and_init_phbs(); |
100 | spider_init_IRQ(); | 112 | spider_init_IRQ(); |
101 | cell_pervasive_init(); | 113 | cbe_pervasive_init(); |
102 | #ifdef CONFIG_DUMMY_CONSOLE | 114 | #ifdef CONFIG_DUMMY_CONSOLE |
103 | conswitchp = &dummy_con; | 115 | conswitchp = &dummy_con; |
104 | #endif | 116 | #endif |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index ad141fe8d52d..db82f503ba2c 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -34,10 +34,15 @@ | |||
34 | #include <asm/prom.h> | 34 | #include <asm/prom.h> |
35 | #include <linux/mutex.h> | 35 | #include <linux/mutex.h> |
36 | #include <asm/spu.h> | 36 | #include <asm/spu.h> |
37 | #include <asm/spu_priv1.h> | ||
37 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
38 | 39 | ||
39 | #include "interrupt.h" | 40 | #include "interrupt.h" |
40 | 41 | ||
42 | const struct spu_priv1_ops *spu_priv1_ops; | ||
43 | |||
44 | EXPORT_SYMBOL_GPL(spu_priv1_ops); | ||
45 | |||
41 | static int __spu_trap_invalid_dma(struct spu *spu) | 46 | static int __spu_trap_invalid_dma(struct spu *spu) |
42 | { | 47 | { |
43 | pr_debug("%s\n", __FUNCTION__); | 48 | pr_debug("%s\n", __FUNCTION__); |
@@ -71,7 +76,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea) | |||
71 | { | 76 | { |
72 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 77 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
73 | struct mm_struct *mm = spu->mm; | 78 | struct mm_struct *mm = spu->mm; |
74 | u64 esid, vsid; | 79 | u64 esid, vsid, llp; |
75 | 80 | ||
76 | pr_debug("%s\n", __FUNCTION__); | 81 | pr_debug("%s\n", __FUNCTION__); |
77 | 82 | ||
@@ -91,9 +96,14 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea) | |||
91 | } | 96 | } |
92 | 97 | ||
93 | esid = (ea & ESID_MASK) | SLB_ESID_V; | 98 | esid = (ea & ESID_MASK) | SLB_ESID_V; |
94 | vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | SLB_VSID_USER; | 99 | #ifdef CONFIG_HUGETLB_PAGE |
95 | if (in_hugepage_area(mm->context, ea)) | 100 | if (in_hugepage_area(mm->context, ea)) |
96 | vsid |= SLB_VSID_L; | 101 | llp = mmu_psize_defs[mmu_huge_psize].sllp; |
102 | else | ||
103 | #endif | ||
104 | llp = mmu_psize_defs[mmu_virtual_psize].sllp; | ||
105 | vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | | ||
106 | SLB_VSID_USER | llp; | ||
97 | 107 | ||
98 | out_be64(&priv2->slb_index_W, spu->slb_replace); | 108 | out_be64(&priv2->slb_index_W, spu->slb_replace); |
99 | out_be64(&priv2->slb_vsid_RW, vsid); | 109 | out_be64(&priv2->slb_vsid_RW, vsid); |
@@ -130,57 +140,7 @@ static int __spu_trap_data_map(struct spu *spu, unsigned long ea, u64 dsisr) | |||
130 | spu->dar = ea; | 140 | spu->dar = ea; |
131 | spu->dsisr = dsisr; | 141 | spu->dsisr = dsisr; |
132 | mb(); | 142 | mb(); |
133 | if (spu->stop_callback) | 143 | spu->stop_callback(spu); |
134 | spu->stop_callback(spu); | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static int __spu_trap_mailbox(struct spu *spu) | ||
139 | { | ||
140 | if (spu->ibox_callback) | ||
141 | spu->ibox_callback(spu); | ||
142 | |||
143 | /* atomically disable SPU mailbox interrupts */ | ||
144 | spin_lock(&spu->register_lock); | ||
145 | spu_int_mask_and(spu, 2, ~0x1); | ||
146 | spin_unlock(&spu->register_lock); | ||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | static int __spu_trap_stop(struct spu *spu) | ||
151 | { | ||
152 | pr_debug("%s\n", __FUNCTION__); | ||
153 | spu->stop_code = in_be32(&spu->problem->spu_status_R); | ||
154 | if (spu->stop_callback) | ||
155 | spu->stop_callback(spu); | ||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static int __spu_trap_halt(struct spu *spu) | ||
160 | { | ||
161 | pr_debug("%s\n", __FUNCTION__); | ||
162 | spu->stop_code = in_be32(&spu->problem->spu_status_R); | ||
163 | if (spu->stop_callback) | ||
164 | spu->stop_callback(spu); | ||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | static int __spu_trap_tag_group(struct spu *spu) | ||
169 | { | ||
170 | pr_debug("%s\n", __FUNCTION__); | ||
171 | spu->mfc_callback(spu); | ||
172 | return 0; | ||
173 | } | ||
174 | |||
175 | static int __spu_trap_spubox(struct spu *spu) | ||
176 | { | ||
177 | if (spu->wbox_callback) | ||
178 | spu->wbox_callback(spu); | ||
179 | |||
180 | /* atomically disable SPU mailbox interrupts */ | ||
181 | spin_lock(&spu->register_lock); | ||
182 | spu_int_mask_and(spu, 2, ~0x10); | ||
183 | spin_unlock(&spu->register_lock); | ||
184 | return 0; | 144 | return 0; |
185 | } | 145 | } |
186 | 146 | ||
@@ -191,8 +151,7 @@ spu_irq_class_0(int irq, void *data, struct pt_regs *regs) | |||
191 | 151 | ||
192 | spu = data; | 152 | spu = data; |
193 | spu->class_0_pending = 1; | 153 | spu->class_0_pending = 1; |
194 | if (spu->stop_callback) | 154 | spu->stop_callback(spu); |
195 | spu->stop_callback(spu); | ||
196 | 155 | ||
197 | return IRQ_HANDLED; | 156 | return IRQ_HANDLED; |
198 | } | 157 | } |
@@ -270,29 +229,38 @@ spu_irq_class_2(int irq, void *data, struct pt_regs *regs) | |||
270 | unsigned long mask; | 229 | unsigned long mask; |
271 | 230 | ||
272 | spu = data; | 231 | spu = data; |
232 | spin_lock(&spu->register_lock); | ||
273 | stat = spu_int_stat_get(spu, 2); | 233 | stat = spu_int_stat_get(spu, 2); |
274 | mask = spu_int_mask_get(spu, 2); | 234 | mask = spu_int_mask_get(spu, 2); |
235 | /* ignore interrupts we're not waiting for */ | ||
236 | stat &= mask; | ||
237 | /* | ||
238 | * mailbox interrupts (0x1 and 0x10) are level triggered. | ||
239 | * mask them now before acknowledging. | ||
240 | */ | ||
241 | if (stat & 0x11) | ||
242 | spu_int_mask_and(spu, 2, ~(stat & 0x11)); | ||
243 | /* acknowledge all interrupts before the callbacks */ | ||
244 | spu_int_stat_clear(spu, 2, stat); | ||
245 | spin_unlock(&spu->register_lock); | ||
275 | 246 | ||
276 | pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask); | 247 | pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask); |
277 | 248 | ||
278 | stat &= mask; | ||
279 | |||
280 | if (stat & 1) /* PPC core mailbox */ | 249 | if (stat & 1) /* PPC core mailbox */ |
281 | __spu_trap_mailbox(spu); | 250 | spu->ibox_callback(spu); |
282 | 251 | ||
283 | if (stat & 2) /* SPU stop-and-signal */ | 252 | if (stat & 2) /* SPU stop-and-signal */ |
284 | __spu_trap_stop(spu); | 253 | spu->stop_callback(spu); |
285 | 254 | ||
286 | if (stat & 4) /* SPU halted */ | 255 | if (stat & 4) /* SPU halted */ |
287 | __spu_trap_halt(spu); | 256 | spu->stop_callback(spu); |
288 | 257 | ||
289 | if (stat & 8) /* DMA tag group complete */ | 258 | if (stat & 8) /* DMA tag group complete */ |
290 | __spu_trap_tag_group(spu); | 259 | spu->mfc_callback(spu); |
291 | 260 | ||
292 | if (stat & 0x10) /* SPU mailbox threshold */ | 261 | if (stat & 0x10) /* SPU mailbox threshold */ |
293 | __spu_trap_spubox(spu); | 262 | spu->wbox_callback(spu); |
294 | 263 | ||
295 | spu_int_stat_clear(spu, 2, stat); | ||
296 | return stat ? IRQ_HANDLED : IRQ_NONE; | 264 | return stat ? IRQ_HANDLED : IRQ_NONE; |
297 | } | 265 | } |
298 | 266 | ||
@@ -512,14 +480,6 @@ int spu_irq_class_1_bottom(struct spu *spu) | |||
512 | return ret; | 480 | return ret; |
513 | } | 481 | } |
514 | 482 | ||
515 | void spu_irq_setaffinity(struct spu *spu, int cpu) | ||
516 | { | ||
517 | u64 target = iic_get_target_id(cpu); | ||
518 | u64 route = target << 48 | target << 32 | target << 16; | ||
519 | spu_int_route_set(spu, route); | ||
520 | } | ||
521 | EXPORT_SYMBOL_GPL(spu_irq_setaffinity); | ||
522 | |||
523 | static int __init find_spu_node_id(struct device_node *spe) | 483 | static int __init find_spu_node_id(struct device_node *spe) |
524 | { | 484 | { |
525 | unsigned int *id; | 485 | unsigned int *id; |
@@ -649,6 +609,46 @@ out: | |||
649 | return ret; | 609 | return ret; |
650 | } | 610 | } |
651 | 611 | ||
612 | struct sysdev_class spu_sysdev_class = { | ||
613 | set_kset_name("spu") | ||
614 | }; | ||
615 | |||
616 | static ssize_t spu_show_isrc(struct sys_device *sysdev, char *buf) | ||
617 | { | ||
618 | struct spu *spu = container_of(sysdev, struct spu, sysdev); | ||
619 | return sprintf(buf, "%d\n", spu->isrc); | ||
620 | |||
621 | } | ||
622 | static SYSDEV_ATTR(isrc, 0400, spu_show_isrc, NULL); | ||
623 | |||
624 | extern int attach_sysdev_to_node(struct sys_device *dev, int nid); | ||
625 | |||
626 | static int spu_create_sysdev(struct spu *spu) | ||
627 | { | ||
628 | int ret; | ||
629 | |||
630 | spu->sysdev.id = spu->number; | ||
631 | spu->sysdev.cls = &spu_sysdev_class; | ||
632 | ret = sysdev_register(&spu->sysdev); | ||
633 | if (ret) { | ||
634 | printk(KERN_ERR "Can't register SPU %d with sysfs\n", | ||
635 | spu->number); | ||
636 | return ret; | ||
637 | } | ||
638 | |||
639 | sysdev_create_file(&spu->sysdev, &attr_isrc); | ||
640 | sysfs_add_device_to_node(&spu->sysdev, spu->nid); | ||
641 | |||
642 | return 0; | ||
643 | } | ||
644 | |||
645 | static void spu_destroy_sysdev(struct spu *spu) | ||
646 | { | ||
647 | sysdev_remove_file(&spu->sysdev, &attr_isrc); | ||
648 | sysfs_remove_device_from_node(&spu->sysdev, spu->nid); | ||
649 | sysdev_unregister(&spu->sysdev); | ||
650 | } | ||
651 | |||
652 | static int __init create_spu(struct device_node *spe) | 652 | static int __init create_spu(struct device_node *spe) |
653 | { | 653 | { |
654 | struct spu *spu; | 654 | struct spu *spu; |
@@ -656,7 +656,7 @@ static int __init create_spu(struct device_node *spe) | |||
656 | static int number; | 656 | static int number; |
657 | 657 | ||
658 | ret = -ENOMEM; | 658 | ret = -ENOMEM; |
659 | spu = kmalloc(sizeof (*spu), GFP_KERNEL); | 659 | spu = kzalloc(sizeof (*spu), GFP_KERNEL); |
660 | if (!spu) | 660 | if (!spu) |
661 | goto out; | 661 | goto out; |
662 | 662 | ||
@@ -668,33 +668,20 @@ static int __init create_spu(struct device_node *spe) | |||
668 | spu->nid = of_node_to_nid(spe); | 668 | spu->nid = of_node_to_nid(spe); |
669 | if (spu->nid == -1) | 669 | if (spu->nid == -1) |
670 | spu->nid = 0; | 670 | spu->nid = 0; |
671 | |||
672 | spu->stop_code = 0; | ||
673 | spu->slb_replace = 0; | ||
674 | spu->mm = NULL; | ||
675 | spu->ctx = NULL; | ||
676 | spu->rq = NULL; | ||
677 | spu->pid = 0; | ||
678 | spu->class_0_pending = 0; | ||
679 | spu->flags = 0UL; | ||
680 | spu->dar = 0UL; | ||
681 | spu->dsisr = 0UL; | ||
682 | spin_lock_init(&spu->register_lock); | 671 | spin_lock_init(&spu->register_lock); |
683 | |||
684 | spu_mfc_sdr_set(spu, mfspr(SPRN_SDR1)); | 672 | spu_mfc_sdr_set(spu, mfspr(SPRN_SDR1)); |
685 | spu_mfc_sr1_set(spu, 0x33); | 673 | spu_mfc_sr1_set(spu, 0x33); |
686 | |||
687 | spu->ibox_callback = NULL; | ||
688 | spu->wbox_callback = NULL; | ||
689 | spu->stop_callback = NULL; | ||
690 | spu->mfc_callback = NULL; | ||
691 | |||
692 | mutex_lock(&spu_mutex); | 674 | mutex_lock(&spu_mutex); |
675 | |||
693 | spu->number = number++; | 676 | spu->number = number++; |
694 | ret = spu_request_irqs(spu); | 677 | ret = spu_request_irqs(spu); |
695 | if (ret) | 678 | if (ret) |
696 | goto out_unmap; | 679 | goto out_unmap; |
697 | 680 | ||
681 | ret = spu_create_sysdev(spu); | ||
682 | if (ret) | ||
683 | goto out_free_irqs; | ||
684 | |||
698 | list_add(&spu->list, &spu_list); | 685 | list_add(&spu->list, &spu_list); |
699 | mutex_unlock(&spu_mutex); | 686 | mutex_unlock(&spu_mutex); |
700 | 687 | ||
@@ -703,6 +690,9 @@ static int __init create_spu(struct device_node *spe) | |||
703 | spu->problem, spu->priv1, spu->priv2, spu->number); | 690 | spu->problem, spu->priv1, spu->priv2, spu->number); |
704 | goto out; | 691 | goto out; |
705 | 692 | ||
693 | out_free_irqs: | ||
694 | spu_free_irqs(spu); | ||
695 | |||
706 | out_unmap: | 696 | out_unmap: |
707 | mutex_unlock(&spu_mutex); | 697 | mutex_unlock(&spu_mutex); |
708 | spu_unmap(spu); | 698 | spu_unmap(spu); |
@@ -716,6 +706,7 @@ static void destroy_spu(struct spu *spu) | |||
716 | { | 706 | { |
717 | list_del_init(&spu->list); | 707 | list_del_init(&spu->list); |
718 | 708 | ||
709 | spu_destroy_sysdev(spu); | ||
719 | spu_free_irqs(spu); | 710 | spu_free_irqs(spu); |
720 | spu_unmap(spu); | 711 | spu_unmap(spu); |
721 | kfree(spu); | 712 | kfree(spu); |
@@ -728,6 +719,7 @@ static void cleanup_spu_base(void) | |||
728 | list_for_each_entry_safe(spu, tmp, &spu_list, list) | 719 | list_for_each_entry_safe(spu, tmp, &spu_list, list) |
729 | destroy_spu(spu); | 720 | destroy_spu(spu); |
730 | mutex_unlock(&spu_mutex); | 721 | mutex_unlock(&spu_mutex); |
722 | sysdev_class_unregister(&spu_sysdev_class); | ||
731 | } | 723 | } |
732 | module_exit(cleanup_spu_base); | 724 | module_exit(cleanup_spu_base); |
733 | 725 | ||
@@ -736,6 +728,11 @@ static int __init init_spu_base(void) | |||
736 | struct device_node *node; | 728 | struct device_node *node; |
737 | int ret; | 729 | int ret; |
738 | 730 | ||
731 | /* create sysdev class for spus */ | ||
732 | ret = sysdev_class_register(&spu_sysdev_class); | ||
733 | if (ret) | ||
734 | return ret; | ||
735 | |||
739 | ret = -ENODEV; | 736 | ret = -ENODEV; |
740 | for (node = of_find_node_by_type(NULL, "spe"); | 737 | for (node = of_find_node_by_type(NULL, "spe"); |
741 | node; node = of_find_node_by_type(node, "spe")) { | 738 | node; node = of_find_node_by_type(node, "spe")) { |
diff --git a/arch/powerpc/platforms/cell/spu_callbacks.c b/arch/powerpc/platforms/cell/spu_callbacks.c index b47fcc5ddb78..47ec3be3edcd 100644 --- a/arch/powerpc/platforms/cell/spu_callbacks.c +++ b/arch/powerpc/platforms/cell/spu_callbacks.c | |||
@@ -34,307 +34,19 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | void *spu_syscall_table[] = { | 36 | void *spu_syscall_table[] = { |
37 | [__NR_restart_syscall] sys_ni_syscall, /* sys_restart_syscall */ | 37 | #define SYSCALL(func) sys_ni_syscall, |
38 | [__NR_exit] sys_ni_syscall, /* sys_exit */ | 38 | #define COMPAT_SYS(func) sys_ni_syscall, |
39 | [__NR_fork] sys_ni_syscall, /* ppc_fork */ | 39 | #define PPC_SYS(func) sys_ni_syscall, |
40 | [__NR_read] sys_read, | 40 | #define OLDSYS(func) sys_ni_syscall, |
41 | [__NR_write] sys_write, | 41 | #define SYS32ONLY(func) sys_ni_syscall, |
42 | [__NR_open] sys_open, | 42 | #define SYSX(f, f3264, f32) sys_ni_syscall, |
43 | [__NR_close] sys_close, | 43 | |
44 | [__NR_waitpid] sys_waitpid, | 44 | #define SYSCALL_SPU(func) sys_##func, |
45 | [__NR_creat] sys_creat, | 45 | #define COMPAT_SYS_SPU(func) sys_##func, |
46 | [__NR_link] sys_link, | 46 | #define PPC_SYS_SPU(func) ppc_##func, |
47 | [__NR_unlink] sys_unlink, | 47 | #define SYSX_SPU(f, f3264, f32) f, |
48 | [__NR_execve] sys_ni_syscall, /* sys_execve */ | 48 | |
49 | [__NR_chdir] sys_chdir, | 49 | #include <asm/systbl.h> |
50 | [__NR_time] sys_time, | ||
51 | [__NR_mknod] sys_mknod, | ||
52 | [__NR_chmod] sys_chmod, | ||
53 | [__NR_lchown] sys_lchown, | ||
54 | [__NR_break] sys_ni_syscall, | ||
55 | [__NR_oldstat] sys_ni_syscall, | ||
56 | [__NR_lseek] sys_lseek, | ||
57 | [__NR_getpid] sys_getpid, | ||
58 | [__NR_mount] sys_ni_syscall, /* sys_mount */ | ||
59 | [__NR_umount] sys_ni_syscall, | ||
60 | [__NR_setuid] sys_setuid, | ||
61 | [__NR_getuid] sys_getuid, | ||
62 | [__NR_stime] sys_stime, | ||
63 | [__NR_ptrace] sys_ni_syscall, /* sys_ptrace */ | ||
64 | [__NR_alarm] sys_alarm, | ||
65 | [__NR_oldfstat] sys_ni_syscall, | ||
66 | [__NR_pause] sys_ni_syscall, /* sys_pause */ | ||
67 | [__NR_utime] sys_ni_syscall, /* sys_utime */ | ||
68 | [__NR_stty] sys_ni_syscall, | ||
69 | [__NR_gtty] sys_ni_syscall, | ||
70 | [__NR_access] sys_access, | ||
71 | [__NR_nice] sys_nice, | ||
72 | [__NR_ftime] sys_ni_syscall, | ||
73 | [__NR_sync] sys_sync, | ||
74 | [__NR_kill] sys_kill, | ||
75 | [__NR_rename] sys_rename, | ||
76 | [__NR_mkdir] sys_mkdir, | ||
77 | [__NR_rmdir] sys_rmdir, | ||
78 | [__NR_dup] sys_dup, | ||
79 | [__NR_pipe] sys_pipe, | ||
80 | [__NR_times] sys_times, | ||
81 | [__NR_prof] sys_ni_syscall, | ||
82 | [__NR_brk] sys_brk, | ||
83 | [__NR_setgid] sys_setgid, | ||
84 | [__NR_getgid] sys_getgid, | ||
85 | [__NR_signal] sys_ni_syscall, /* sys_signal */ | ||
86 | [__NR_geteuid] sys_geteuid, | ||
87 | [__NR_getegid] sys_getegid, | ||
88 | [__NR_acct] sys_ni_syscall, /* sys_acct */ | ||
89 | [__NR_umount2] sys_ni_syscall, /* sys_umount */ | ||
90 | [__NR_lock] sys_ni_syscall, | ||
91 | [__NR_ioctl] sys_ioctl, | ||
92 | [__NR_fcntl] sys_fcntl, | ||
93 | [__NR_mpx] sys_ni_syscall, | ||
94 | [__NR_setpgid] sys_setpgid, | ||
95 | [__NR_ulimit] sys_ni_syscall, | ||
96 | [__NR_oldolduname] sys_ni_syscall, | ||
97 | [__NR_umask] sys_umask, | ||
98 | [__NR_chroot] sys_chroot, | ||
99 | [__NR_ustat] sys_ni_syscall, /* sys_ustat */ | ||
100 | [__NR_dup2] sys_dup2, | ||
101 | [__NR_getppid] sys_getppid, | ||
102 | [__NR_getpgrp] sys_getpgrp, | ||
103 | [__NR_setsid] sys_setsid, | ||
104 | [__NR_sigaction] sys_ni_syscall, | ||
105 | [__NR_sgetmask] sys_sgetmask, | ||
106 | [__NR_ssetmask] sys_ssetmask, | ||
107 | [__NR_setreuid] sys_setreuid, | ||
108 | [__NR_setregid] sys_setregid, | ||
109 | [__NR_sigsuspend] sys_ni_syscall, | ||
110 | [__NR_sigpending] sys_ni_syscall, | ||
111 | [__NR_sethostname] sys_sethostname, | ||
112 | [__NR_setrlimit] sys_setrlimit, | ||
113 | [__NR_getrlimit] sys_ni_syscall, | ||
114 | [__NR_getrusage] sys_getrusage, | ||
115 | [__NR_gettimeofday] sys_gettimeofday, | ||
116 | [__NR_settimeofday] sys_settimeofday, | ||
117 | [__NR_getgroups] sys_getgroups, | ||
118 | [__NR_setgroups] sys_setgroups, | ||
119 | [__NR_select] sys_ni_syscall, | ||
120 | [__NR_symlink] sys_symlink, | ||
121 | [__NR_oldlstat] sys_ni_syscall, | ||
122 | [__NR_readlink] sys_readlink, | ||
123 | [__NR_uselib] sys_ni_syscall, /* sys_uselib */ | ||
124 | [__NR_swapon] sys_ni_syscall, /* sys_swapon */ | ||
125 | [__NR_reboot] sys_ni_syscall, /* sys_reboot */ | ||
126 | [__NR_readdir] sys_ni_syscall, | ||
127 | [__NR_mmap] sys_mmap, | ||
128 | [__NR_munmap] sys_munmap, | ||
129 | [__NR_truncate] sys_truncate, | ||
130 | [__NR_ftruncate] sys_ftruncate, | ||
131 | [__NR_fchmod] sys_fchmod, | ||
132 | [__NR_fchown] sys_fchown, | ||
133 | [__NR_getpriority] sys_getpriority, | ||
134 | [__NR_setpriority] sys_setpriority, | ||
135 | [__NR_profil] sys_ni_syscall, | ||
136 | [__NR_statfs] sys_ni_syscall, /* sys_statfs */ | ||
137 | [__NR_fstatfs] sys_ni_syscall, /* sys_fstatfs */ | ||
138 | [__NR_ioperm] sys_ni_syscall, | ||
139 | [__NR_socketcall] sys_socketcall, | ||
140 | [__NR_syslog] sys_syslog, | ||
141 | [__NR_setitimer] sys_setitimer, | ||
142 | [__NR_getitimer] sys_getitimer, | ||
143 | [__NR_stat] sys_newstat, | ||
144 | [__NR_lstat] sys_newlstat, | ||
145 | [__NR_fstat] sys_newfstat, | ||
146 | [__NR_olduname] sys_ni_syscall, | ||
147 | [__NR_iopl] sys_ni_syscall, | ||
148 | [__NR_vhangup] sys_vhangup, | ||
149 | [__NR_idle] sys_ni_syscall, | ||
150 | [__NR_vm86] sys_ni_syscall, | ||
151 | [__NR_wait4] sys_wait4, | ||
152 | [__NR_swapoff] sys_ni_syscall, /* sys_swapoff */ | ||
153 | [__NR_sysinfo] sys_sysinfo, | ||
154 | [__NR_ipc] sys_ni_syscall, /* sys_ipc */ | ||
155 | [__NR_fsync] sys_fsync, | ||
156 | [__NR_sigreturn] sys_ni_syscall, | ||
157 | [__NR_clone] sys_ni_syscall, /* ppc_clone */ | ||
158 | [__NR_setdomainname] sys_setdomainname, | ||
159 | [__NR_uname] ppc_newuname, | ||
160 | [__NR_modify_ldt] sys_ni_syscall, | ||
161 | [__NR_adjtimex] sys_adjtimex, | ||
162 | [__NR_mprotect] sys_mprotect, | ||
163 | [__NR_sigprocmask] sys_ni_syscall, | ||
164 | [__NR_create_module] sys_ni_syscall, | ||
165 | [__NR_init_module] sys_ni_syscall, /* sys_init_module */ | ||
166 | [__NR_delete_module] sys_ni_syscall, /* sys_delete_module */ | ||
167 | [__NR_get_kernel_syms] sys_ni_syscall, | ||
168 | [__NR_quotactl] sys_ni_syscall, /* sys_quotactl */ | ||
169 | [__NR_getpgid] sys_getpgid, | ||
170 | [__NR_fchdir] sys_fchdir, | ||
171 | [__NR_bdflush] sys_bdflush, | ||
172 | [__NR_sysfs] sys_ni_syscall, /* sys_sysfs */ | ||
173 | [__NR_personality] ppc64_personality, | ||
174 | [__NR_afs_syscall] sys_ni_syscall, | ||
175 | [__NR_setfsuid] sys_setfsuid, | ||
176 | [__NR_setfsgid] sys_setfsgid, | ||
177 | [__NR__llseek] sys_llseek, | ||
178 | [__NR_getdents] sys_getdents, | ||
179 | [__NR__newselect] sys_select, | ||
180 | [__NR_flock] sys_flock, | ||
181 | [__NR_msync] sys_msync, | ||
182 | [__NR_readv] sys_readv, | ||
183 | [__NR_writev] sys_writev, | ||
184 | [__NR_getsid] sys_getsid, | ||
185 | [__NR_fdatasync] sys_fdatasync, | ||
186 | [__NR__sysctl] sys_ni_syscall, /* sys_sysctl */ | ||
187 | [__NR_mlock] sys_mlock, | ||
188 | [__NR_munlock] sys_munlock, | ||
189 | [__NR_mlockall] sys_mlockall, | ||
190 | [__NR_munlockall] sys_munlockall, | ||
191 | [__NR_sched_setparam] sys_sched_setparam, | ||
192 | [__NR_sched_getparam] sys_sched_getparam, | ||
193 | [__NR_sched_setscheduler] sys_sched_setscheduler, | ||
194 | [__NR_sched_getscheduler] sys_sched_getscheduler, | ||
195 | [__NR_sched_yield] sys_sched_yield, | ||
196 | [__NR_sched_get_priority_max] sys_sched_get_priority_max, | ||
197 | [__NR_sched_get_priority_min] sys_sched_get_priority_min, | ||
198 | [__NR_sched_rr_get_interval] sys_sched_rr_get_interval, | ||
199 | [__NR_nanosleep] sys_nanosleep, | ||
200 | [__NR_mremap] sys_mremap, | ||
201 | [__NR_setresuid] sys_setresuid, | ||
202 | [__NR_getresuid] sys_getresuid, | ||
203 | [__NR_query_module] sys_ni_syscall, | ||
204 | [__NR_poll] sys_poll, | ||
205 | [__NR_nfsservctl] sys_ni_syscall, /* sys_nfsservctl */ | ||
206 | [__NR_setresgid] sys_setresgid, | ||
207 | [__NR_getresgid] sys_getresgid, | ||
208 | [__NR_prctl] sys_prctl, | ||
209 | [__NR_rt_sigreturn] sys_ni_syscall, /* ppc64_rt_sigreturn */ | ||
210 | [__NR_rt_sigaction] sys_ni_syscall, /* sys_rt_sigaction */ | ||
211 | [__NR_rt_sigprocmask] sys_ni_syscall, /* sys_rt_sigprocmask */ | ||
212 | [__NR_rt_sigpending] sys_ni_syscall, /* sys_rt_sigpending */ | ||
213 | [__NR_rt_sigtimedwait] sys_ni_syscall, /* sys_rt_sigtimedwait */ | ||
214 | [__NR_rt_sigqueueinfo] sys_ni_syscall, /* sys_rt_sigqueueinfo */ | ||
215 | [__NR_rt_sigsuspend] sys_ni_syscall, /* sys_rt_sigsuspend */ | ||
216 | [__NR_pread64] sys_pread64, | ||
217 | [__NR_pwrite64] sys_pwrite64, | ||
218 | [__NR_chown] sys_chown, | ||
219 | [__NR_getcwd] sys_getcwd, | ||
220 | [__NR_capget] sys_capget, | ||
221 | [__NR_capset] sys_capset, | ||
222 | [__NR_sigaltstack] sys_ni_syscall, /* sys_sigaltstack */ | ||
223 | [__NR_sendfile] sys_sendfile64, | ||
224 | [__NR_getpmsg] sys_ni_syscall, | ||
225 | [__NR_putpmsg] sys_ni_syscall, | ||
226 | [__NR_vfork] sys_ni_syscall, /* ppc_vfork */ | ||
227 | [__NR_ugetrlimit] sys_getrlimit, | ||
228 | [__NR_readahead] sys_readahead, | ||
229 | [192] sys_ni_syscall, | ||
230 | [193] sys_ni_syscall, | ||
231 | [194] sys_ni_syscall, | ||
232 | [195] sys_ni_syscall, | ||
233 | [196] sys_ni_syscall, | ||
234 | [197] sys_ni_syscall, | ||
235 | [__NR_pciconfig_read] sys_ni_syscall, /* sys_pciconfig_read */ | ||
236 | [__NR_pciconfig_write] sys_ni_syscall, /* sys_pciconfig_write */ | ||
237 | [__NR_pciconfig_iobase] sys_ni_syscall, /* sys_pciconfig_iobase */ | ||
238 | [__NR_multiplexer] sys_ni_syscall, | ||
239 | [__NR_getdents64] sys_getdents64, | ||
240 | [__NR_pivot_root] sys_pivot_root, | ||
241 | [204] sys_ni_syscall, | ||
242 | [__NR_madvise] sys_madvise, | ||
243 | [__NR_mincore] sys_mincore, | ||
244 | [__NR_gettid] sys_gettid, | ||
245 | [__NR_tkill] sys_tkill, | ||
246 | [__NR_setxattr] sys_setxattr, | ||
247 | [__NR_lsetxattr] sys_lsetxattr, | ||
248 | [__NR_fsetxattr] sys_fsetxattr, | ||
249 | [__NR_getxattr] sys_getxattr, | ||
250 | [__NR_lgetxattr] sys_lgetxattr, | ||
251 | [__NR_fgetxattr] sys_fgetxattr, | ||
252 | [__NR_listxattr] sys_listxattr, | ||
253 | [__NR_llistxattr] sys_llistxattr, | ||
254 | [__NR_flistxattr] sys_flistxattr, | ||
255 | [__NR_removexattr] sys_removexattr, | ||
256 | [__NR_lremovexattr] sys_lremovexattr, | ||
257 | [__NR_fremovexattr] sys_fremovexattr, | ||
258 | [__NR_futex] sys_futex, | ||
259 | [__NR_sched_setaffinity] sys_sched_setaffinity, | ||
260 | [__NR_sched_getaffinity] sys_sched_getaffinity, | ||
261 | [224] sys_ni_syscall, | ||
262 | [__NR_tuxcall] sys_ni_syscall, | ||
263 | [226] sys_ni_syscall, | ||
264 | [__NR_io_setup] sys_io_setup, | ||
265 | [__NR_io_destroy] sys_io_destroy, | ||
266 | [__NR_io_getevents] sys_io_getevents, | ||
267 | [__NR_io_submit] sys_io_submit, | ||
268 | [__NR_io_cancel] sys_io_cancel, | ||
269 | [__NR_set_tid_address] sys_ni_syscall, /* sys_set_tid_address */ | ||
270 | [__NR_fadvise64] sys_fadvise64, | ||
271 | [__NR_exit_group] sys_ni_syscall, /* sys_exit_group */ | ||
272 | [__NR_lookup_dcookie] sys_ni_syscall, /* sys_lookup_dcookie */ | ||
273 | [__NR_epoll_create] sys_epoll_create, | ||
274 | [__NR_epoll_ctl] sys_epoll_ctl, | ||
275 | [__NR_epoll_wait] sys_epoll_wait, | ||
276 | [__NR_remap_file_pages] sys_remap_file_pages, | ||
277 | [__NR_timer_create] sys_timer_create, | ||
278 | [__NR_timer_settime] sys_timer_settime, | ||
279 | [__NR_timer_gettime] sys_timer_gettime, | ||
280 | [__NR_timer_getoverrun] sys_timer_getoverrun, | ||
281 | [__NR_timer_delete] sys_timer_delete, | ||
282 | [__NR_clock_settime] sys_clock_settime, | ||
283 | [__NR_clock_gettime] sys_clock_gettime, | ||
284 | [__NR_clock_getres] sys_clock_getres, | ||
285 | [__NR_clock_nanosleep] sys_clock_nanosleep, | ||
286 | [__NR_swapcontext] sys_ni_syscall, /* ppc64_swapcontext */ | ||
287 | [__NR_tgkill] sys_tgkill, | ||
288 | [__NR_utimes] sys_utimes, | ||
289 | [__NR_statfs64] sys_statfs64, | ||
290 | [__NR_fstatfs64] sys_fstatfs64, | ||
291 | [254] sys_ni_syscall, | ||
292 | [__NR_rtas] ppc_rtas, | ||
293 | [256] sys_ni_syscall, | ||
294 | [257] sys_ni_syscall, | ||
295 | [258] sys_ni_syscall, | ||
296 | [__NR_mbind] sys_ni_syscall, /* sys_mbind */ | ||
297 | [__NR_get_mempolicy] sys_ni_syscall, /* sys_get_mempolicy */ | ||
298 | [__NR_set_mempolicy] sys_ni_syscall, /* sys_set_mempolicy */ | ||
299 | [__NR_mq_open] sys_ni_syscall, /* sys_mq_open */ | ||
300 | [__NR_mq_unlink] sys_ni_syscall, /* sys_mq_unlink */ | ||
301 | [__NR_mq_timedsend] sys_ni_syscall, /* sys_mq_timedsend */ | ||
302 | [__NR_mq_timedreceive] sys_ni_syscall, /* sys_mq_timedreceive */ | ||
303 | [__NR_mq_notify] sys_ni_syscall, /* sys_mq_notify */ | ||
304 | [__NR_mq_getsetattr] sys_ni_syscall, /* sys_mq_getsetattr */ | ||
305 | [__NR_kexec_load] sys_ni_syscall, /* sys_kexec_load */ | ||
306 | [__NR_add_key] sys_ni_syscall, /* sys_add_key */ | ||
307 | [__NR_request_key] sys_ni_syscall, /* sys_request_key */ | ||
308 | [__NR_keyctl] sys_ni_syscall, /* sys_keyctl */ | ||
309 | [__NR_waitid] sys_ni_syscall, /* sys_waitid */ | ||
310 | [__NR_ioprio_set] sys_ni_syscall, /* sys_ioprio_set */ | ||
311 | [__NR_ioprio_get] sys_ni_syscall, /* sys_ioprio_get */ | ||
312 | [__NR_inotify_init] sys_ni_syscall, /* sys_inotify_init */ | ||
313 | [__NR_inotify_add_watch] sys_ni_syscall, /* sys_inotify_add_watch */ | ||
314 | [__NR_inotify_rm_watch] sys_ni_syscall, /* sys_inotify_rm_watch */ | ||
315 | [__NR_spu_run] sys_ni_syscall, /* sys_spu_run */ | ||
316 | [__NR_spu_create] sys_ni_syscall, /* sys_spu_create */ | ||
317 | [__NR_pselect6] sys_ni_syscall, /* sys_pselect */ | ||
318 | [__NR_ppoll] sys_ni_syscall, /* sys_ppoll */ | ||
319 | [__NR_unshare] sys_unshare, | ||
320 | [__NR_splice] sys_splice, | ||
321 | [__NR_tee] sys_tee, | ||
322 | [__NR_vmsplice] sys_vmsplice, | ||
323 | [__NR_openat] sys_openat, | ||
324 | [__NR_mkdirat] sys_mkdirat, | ||
325 | [__NR_mknodat] sys_mknodat, | ||
326 | [__NR_fchownat] sys_fchownat, | ||
327 | [__NR_futimesat] sys_futimesat, | ||
328 | [__NR_newfstatat] sys_newfstatat, | ||
329 | [__NR_unlinkat] sys_unlinkat, | ||
330 | [__NR_renameat] sys_renameat, | ||
331 | [__NR_linkat] sys_linkat, | ||
332 | [__NR_symlinkat] sys_symlinkat, | ||
333 | [__NR_readlinkat] sys_readlinkat, | ||
334 | [__NR_fchmodat] sys_fchmodat, | ||
335 | [__NR_faccessat] sys_faccessat, | ||
336 | [__NR_get_robust_list] sys_get_robust_list, | ||
337 | [__NR_set_robust_list] sys_set_robust_list, | ||
338 | }; | 50 | }; |
339 | 51 | ||
340 | long spu_sys_callback(struct spu_syscall_block *s) | 52 | long spu_sys_callback(struct spu_syscall_block *s) |
diff --git a/arch/powerpc/platforms/cell/spu_priv1.c b/arch/powerpc/platforms/cell/spu_priv1.c deleted file mode 100644 index b2656421c7b5..000000000000 --- a/arch/powerpc/platforms/cell/spu_priv1.c +++ /dev/null | |||
@@ -1,133 +0,0 @@ | |||
1 | /* | ||
2 | * access to SPU privileged registers | ||
3 | */ | ||
4 | #include <linux/module.h> | ||
5 | |||
6 | #include <asm/io.h> | ||
7 | #include <asm/spu.h> | ||
8 | |||
9 | void spu_int_mask_and(struct spu *spu, int class, u64 mask) | ||
10 | { | ||
11 | u64 old_mask; | ||
12 | |||
13 | old_mask = in_be64(&spu->priv1->int_mask_RW[class]); | ||
14 | out_be64(&spu->priv1->int_mask_RW[class], old_mask & mask); | ||
15 | } | ||
16 | EXPORT_SYMBOL_GPL(spu_int_mask_and); | ||
17 | |||
18 | void spu_int_mask_or(struct spu *spu, int class, u64 mask) | ||
19 | { | ||
20 | u64 old_mask; | ||
21 | |||
22 | old_mask = in_be64(&spu->priv1->int_mask_RW[class]); | ||
23 | out_be64(&spu->priv1->int_mask_RW[class], old_mask | mask); | ||
24 | } | ||
25 | EXPORT_SYMBOL_GPL(spu_int_mask_or); | ||
26 | |||
27 | void spu_int_mask_set(struct spu *spu, int class, u64 mask) | ||
28 | { | ||
29 | out_be64(&spu->priv1->int_mask_RW[class], mask); | ||
30 | } | ||
31 | EXPORT_SYMBOL_GPL(spu_int_mask_set); | ||
32 | |||
33 | u64 spu_int_mask_get(struct spu *spu, int class) | ||
34 | { | ||
35 | return in_be64(&spu->priv1->int_mask_RW[class]); | ||
36 | } | ||
37 | EXPORT_SYMBOL_GPL(spu_int_mask_get); | ||
38 | |||
39 | void spu_int_stat_clear(struct spu *spu, int class, u64 stat) | ||
40 | { | ||
41 | out_be64(&spu->priv1->int_stat_RW[class], stat); | ||
42 | } | ||
43 | EXPORT_SYMBOL_GPL(spu_int_stat_clear); | ||
44 | |||
45 | u64 spu_int_stat_get(struct spu *spu, int class) | ||
46 | { | ||
47 | return in_be64(&spu->priv1->int_stat_RW[class]); | ||
48 | } | ||
49 | EXPORT_SYMBOL_GPL(spu_int_stat_get); | ||
50 | |||
51 | void spu_int_route_set(struct spu *spu, u64 route) | ||
52 | { | ||
53 | out_be64(&spu->priv1->int_route_RW, route); | ||
54 | } | ||
55 | EXPORT_SYMBOL_GPL(spu_int_route_set); | ||
56 | |||
57 | u64 spu_mfc_dar_get(struct spu *spu) | ||
58 | { | ||
59 | return in_be64(&spu->priv1->mfc_dar_RW); | ||
60 | } | ||
61 | EXPORT_SYMBOL_GPL(spu_mfc_dar_get); | ||
62 | |||
63 | u64 spu_mfc_dsisr_get(struct spu *spu) | ||
64 | { | ||
65 | return in_be64(&spu->priv1->mfc_dsisr_RW); | ||
66 | } | ||
67 | EXPORT_SYMBOL_GPL(spu_mfc_dsisr_get); | ||
68 | |||
69 | void spu_mfc_dsisr_set(struct spu *spu, u64 dsisr) | ||
70 | { | ||
71 | out_be64(&spu->priv1->mfc_dsisr_RW, dsisr); | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(spu_mfc_dsisr_set); | ||
74 | |||
75 | void spu_mfc_sdr_set(struct spu *spu, u64 sdr) | ||
76 | { | ||
77 | out_be64(&spu->priv1->mfc_sdr_RW, sdr); | ||
78 | } | ||
79 | EXPORT_SYMBOL_GPL(spu_mfc_sdr_set); | ||
80 | |||
81 | void spu_mfc_sr1_set(struct spu *spu, u64 sr1) | ||
82 | { | ||
83 | out_be64(&spu->priv1->mfc_sr1_RW, sr1); | ||
84 | } | ||
85 | EXPORT_SYMBOL_GPL(spu_mfc_sr1_set); | ||
86 | |||
87 | u64 spu_mfc_sr1_get(struct spu *spu) | ||
88 | { | ||
89 | return in_be64(&spu->priv1->mfc_sr1_RW); | ||
90 | } | ||
91 | EXPORT_SYMBOL_GPL(spu_mfc_sr1_get); | ||
92 | |||
93 | void spu_mfc_tclass_id_set(struct spu *spu, u64 tclass_id) | ||
94 | { | ||
95 | out_be64(&spu->priv1->mfc_tclass_id_RW, tclass_id); | ||
96 | } | ||
97 | EXPORT_SYMBOL_GPL(spu_mfc_tclass_id_set); | ||
98 | |||
99 | u64 spu_mfc_tclass_id_get(struct spu *spu) | ||
100 | { | ||
101 | return in_be64(&spu->priv1->mfc_tclass_id_RW); | ||
102 | } | ||
103 | EXPORT_SYMBOL_GPL(spu_mfc_tclass_id_get); | ||
104 | |||
105 | void spu_tlb_invalidate(struct spu *spu) | ||
106 | { | ||
107 | out_be64(&spu->priv1->tlb_invalidate_entry_W, 0ul); | ||
108 | } | ||
109 | EXPORT_SYMBOL_GPL(spu_tlb_invalidate); | ||
110 | |||
111 | void spu_resource_allocation_groupID_set(struct spu *spu, u64 id) | ||
112 | { | ||
113 | out_be64(&spu->priv1->resource_allocation_groupID_RW, id); | ||
114 | } | ||
115 | EXPORT_SYMBOL_GPL(spu_resource_allocation_groupID_set); | ||
116 | |||
117 | u64 spu_resource_allocation_groupID_get(struct spu *spu) | ||
118 | { | ||
119 | return in_be64(&spu->priv1->resource_allocation_groupID_RW); | ||
120 | } | ||
121 | EXPORT_SYMBOL_GPL(spu_resource_allocation_groupID_get); | ||
122 | |||
123 | void spu_resource_allocation_enable_set(struct spu *spu, u64 enable) | ||
124 | { | ||
125 | out_be64(&spu->priv1->resource_allocation_enable_RW, enable); | ||
126 | } | ||
127 | EXPORT_SYMBOL_GPL(spu_resource_allocation_enable_set); | ||
128 | |||
129 | u64 spu_resource_allocation_enable_get(struct spu *spu) | ||
130 | { | ||
131 | return in_be64(&spu->priv1->resource_allocation_enable_RW); | ||
132 | } | ||
133 | EXPORT_SYMBOL_GPL(spu_resource_allocation_enable_get); | ||
diff --git a/arch/powerpc/platforms/cell/spu_priv1_mmio.c b/arch/powerpc/platforms/cell/spu_priv1_mmio.c new file mode 100644 index 000000000000..71b69f0a1a48 --- /dev/null +++ b/arch/powerpc/platforms/cell/spu_priv1_mmio.c | |||
@@ -0,0 +1,159 @@ | |||
1 | /* | ||
2 | * spu hypervisor abstraction for direct hardware access. | ||
3 | * | ||
4 | * (C) Copyright IBM Deutschland Entwicklung GmbH 2005 | ||
5 | * Copyright 2006 Sony Corp. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; version 2 of the License. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | |||
23 | #include <asm/io.h> | ||
24 | #include <asm/spu.h> | ||
25 | #include <asm/spu_priv1.h> | ||
26 | |||
27 | #include "interrupt.h" | ||
28 | |||
29 | static void int_mask_and(struct spu *spu, int class, u64 mask) | ||
30 | { | ||
31 | u64 old_mask; | ||
32 | |||
33 | old_mask = in_be64(&spu->priv1->int_mask_RW[class]); | ||
34 | out_be64(&spu->priv1->int_mask_RW[class], old_mask & mask); | ||
35 | } | ||
36 | |||
37 | static void int_mask_or(struct spu *spu, int class, u64 mask) | ||
38 | { | ||
39 | u64 old_mask; | ||
40 | |||
41 | old_mask = in_be64(&spu->priv1->int_mask_RW[class]); | ||
42 | out_be64(&spu->priv1->int_mask_RW[class], old_mask | mask); | ||
43 | } | ||
44 | |||
45 | static void int_mask_set(struct spu *spu, int class, u64 mask) | ||
46 | { | ||
47 | out_be64(&spu->priv1->int_mask_RW[class], mask); | ||
48 | } | ||
49 | |||
50 | static u64 int_mask_get(struct spu *spu, int class) | ||
51 | { | ||
52 | return in_be64(&spu->priv1->int_mask_RW[class]); | ||
53 | } | ||
54 | |||
55 | static void int_stat_clear(struct spu *spu, int class, u64 stat) | ||
56 | { | ||
57 | out_be64(&spu->priv1->int_stat_RW[class], stat); | ||
58 | } | ||
59 | |||
60 | static u64 int_stat_get(struct spu *spu, int class) | ||
61 | { | ||
62 | return in_be64(&spu->priv1->int_stat_RW[class]); | ||
63 | } | ||
64 | |||
65 | static void cpu_affinity_set(struct spu *spu, int cpu) | ||
66 | { | ||
67 | u64 target = iic_get_target_id(cpu); | ||
68 | u64 route = target << 48 | target << 32 | target << 16; | ||
69 | out_be64(&spu->priv1->int_route_RW, route); | ||
70 | } | ||
71 | |||
72 | static u64 mfc_dar_get(struct spu *spu) | ||
73 | { | ||
74 | return in_be64(&spu->priv1->mfc_dar_RW); | ||
75 | } | ||
76 | |||
77 | static u64 mfc_dsisr_get(struct spu *spu) | ||
78 | { | ||
79 | return in_be64(&spu->priv1->mfc_dsisr_RW); | ||
80 | } | ||
81 | |||
82 | static void mfc_dsisr_set(struct spu *spu, u64 dsisr) | ||
83 | { | ||
84 | out_be64(&spu->priv1->mfc_dsisr_RW, dsisr); | ||
85 | } | ||
86 | |||
87 | static void mfc_sdr_set(struct spu *spu, u64 sdr) | ||
88 | { | ||
89 | out_be64(&spu->priv1->mfc_sdr_RW, sdr); | ||
90 | } | ||
91 | |||
92 | static void mfc_sr1_set(struct spu *spu, u64 sr1) | ||
93 | { | ||
94 | out_be64(&spu->priv1->mfc_sr1_RW, sr1); | ||
95 | } | ||
96 | |||
97 | static u64 mfc_sr1_get(struct spu *spu) | ||
98 | { | ||
99 | return in_be64(&spu->priv1->mfc_sr1_RW); | ||
100 | } | ||
101 | |||
102 | static void mfc_tclass_id_set(struct spu *spu, u64 tclass_id) | ||
103 | { | ||
104 | out_be64(&spu->priv1->mfc_tclass_id_RW, tclass_id); | ||
105 | } | ||
106 | |||
107 | static u64 mfc_tclass_id_get(struct spu *spu) | ||
108 | { | ||
109 | return in_be64(&spu->priv1->mfc_tclass_id_RW); | ||
110 | } | ||
111 | |||
112 | static void tlb_invalidate(struct spu *spu) | ||
113 | { | ||
114 | out_be64(&spu->priv1->tlb_invalidate_entry_W, 0ul); | ||
115 | } | ||
116 | |||
117 | static void resource_allocation_groupID_set(struct spu *spu, u64 id) | ||
118 | { | ||
119 | out_be64(&spu->priv1->resource_allocation_groupID_RW, id); | ||
120 | } | ||
121 | |||
122 | static u64 resource_allocation_groupID_get(struct spu *spu) | ||
123 | { | ||
124 | return in_be64(&spu->priv1->resource_allocation_groupID_RW); | ||
125 | } | ||
126 | |||
127 | static void resource_allocation_enable_set(struct spu *spu, u64 enable) | ||
128 | { | ||
129 | out_be64(&spu->priv1->resource_allocation_enable_RW, enable); | ||
130 | } | ||
131 | |||
132 | static u64 resource_allocation_enable_get(struct spu *spu) | ||
133 | { | ||
134 | return in_be64(&spu->priv1->resource_allocation_enable_RW); | ||
135 | } | ||
136 | |||
137 | const struct spu_priv1_ops spu_priv1_mmio_ops = | ||
138 | { | ||
139 | .int_mask_and = int_mask_and, | ||
140 | .int_mask_or = int_mask_or, | ||
141 | .int_mask_set = int_mask_set, | ||
142 | .int_mask_get = int_mask_get, | ||
143 | .int_stat_clear = int_stat_clear, | ||
144 | .int_stat_get = int_stat_get, | ||
145 | .cpu_affinity_set = cpu_affinity_set, | ||
146 | .mfc_dar_get = mfc_dar_get, | ||
147 | .mfc_dsisr_get = mfc_dsisr_get, | ||
148 | .mfc_dsisr_set = mfc_dsisr_set, | ||
149 | .mfc_sdr_set = mfc_sdr_set, | ||
150 | .mfc_sr1_set = mfc_sr1_set, | ||
151 | .mfc_sr1_get = mfc_sr1_get, | ||
152 | .mfc_tclass_id_set = mfc_tclass_id_set, | ||
153 | .mfc_tclass_id_get = mfc_tclass_id_get, | ||
154 | .tlb_invalidate = tlb_invalidate, | ||
155 | .resource_allocation_groupID_set = resource_allocation_groupID_set, | ||
156 | .resource_allocation_groupID_get = resource_allocation_groupID_get, | ||
157 | .resource_allocation_enable_set = resource_allocation_enable_set, | ||
158 | .resource_allocation_enable_get = resource_allocation_enable_get, | ||
159 | }; | ||
diff --git a/arch/powerpc/platforms/cell/spufs/Makefile b/arch/powerpc/platforms/cell/spufs/Makefile index a7cddf40e3d9..bb5dc634272c 100644 --- a/arch/powerpc/platforms/cell/spufs/Makefile +++ b/arch/powerpc/platforms/cell/spufs/Makefile | |||
@@ -1,5 +1,7 @@ | |||
1 | obj-y += switch.o | ||
2 | |||
1 | obj-$(CONFIG_SPU_FS) += spufs.o | 3 | obj-$(CONFIG_SPU_FS) += spufs.o |
2 | spufs-y += inode.o file.o context.o switch.o syscalls.o | 4 | spufs-y += inode.o file.o context.o syscalls.o |
3 | spufs-y += sched.o backing_ops.o hw_ops.o run.o | 5 | spufs-y += sched.o backing_ops.o hw_ops.o run.o |
4 | 6 | ||
5 | # Rules to build switch.o with the help of SPU tool chain | 7 | # Rules to build switch.o with the help of SPU tool chain |
@@ -8,11 +10,14 @@ SPU_CC := $(SPU_CROSS)gcc | |||
8 | SPU_AS := $(SPU_CROSS)gcc | 10 | SPU_AS := $(SPU_CROSS)gcc |
9 | SPU_LD := $(SPU_CROSS)ld | 11 | SPU_LD := $(SPU_CROSS)ld |
10 | SPU_OBJCOPY := $(SPU_CROSS)objcopy | 12 | SPU_OBJCOPY := $(SPU_CROSS)objcopy |
11 | SPU_CFLAGS := -O2 -Wall -I$(srctree)/include -I$(objtree)/include2 | 13 | SPU_CFLAGS := -O2 -Wall -I$(srctree)/include \ |
12 | SPU_AFLAGS := -c -D__ASSEMBLY__ -I$(srctree)/include -I$(objtree)/include2 | 14 | -I$(objtree)/include2 -D__KERNEL__ |
15 | SPU_AFLAGS := -c -D__ASSEMBLY__ -I$(srctree)/include \ | ||
16 | -I$(objtree)/include2 -D__KERNEL__ | ||
13 | SPU_LDFLAGS := -N -Ttext=0x0 | 17 | SPU_LDFLAGS := -N -Ttext=0x0 |
14 | 18 | ||
15 | $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h | 19 | $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h |
20 | clean-files := spu_save_dump.h spu_restore_dump.h | ||
16 | 21 | ||
17 | # Compile SPU files | 22 | # Compile SPU files |
18 | cmd_spu_cc = $(SPU_CC) $(SPU_CFLAGS) -c -o $@ $< | 23 | cmd_spu_cc = $(SPU_CC) $(SPU_CFLAGS) -c -o $@ $< |
@@ -45,7 +50,8 @@ cmd_hexdump = ( \ | |||
45 | echo " * Hex-dump auto generated from $*.c." ; \ | 50 | echo " * Hex-dump auto generated from $*.c." ; \ |
46 | echo " * Do not edit!" ; \ | 51 | echo " * Do not edit!" ; \ |
47 | echo " */" ; \ | 52 | echo " */" ; \ |
48 | echo "static unsigned int $*_code[] __page_aligned = {" ; \ | 53 | echo "static unsigned int $*_code[] " \ |
54 | "__attribute__((__aligned__(128))) = {" ; \ | ||
49 | hexdump -v -e '"0x" 4/1 "%02x" "," "\n"' $< ; \ | 55 | hexdump -v -e '"0x" 4/1 "%02x" "," "\n"' $< ; \ |
50 | echo "};" ; \ | 56 | echo "};" ; \ |
51 | ) > $@ | 57 | ) > $@ |
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index 8bb33abfad17..36439c5e9f2d 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
@@ -30,7 +30,7 @@ | |||
30 | struct spu_context *alloc_spu_context(void) | 30 | struct spu_context *alloc_spu_context(void) |
31 | { | 31 | { |
32 | struct spu_context *ctx; | 32 | struct spu_context *ctx; |
33 | ctx = kmalloc(sizeof *ctx, GFP_KERNEL); | 33 | ctx = kzalloc(sizeof *ctx, GFP_KERNEL); |
34 | if (!ctx) | 34 | if (!ctx) |
35 | goto out; | 35 | goto out; |
36 | /* Binding to physical processor deferred | 36 | /* Binding to physical processor deferred |
@@ -48,17 +48,7 @@ struct spu_context *alloc_spu_context(void) | |||
48 | init_waitqueue_head(&ctx->wbox_wq); | 48 | init_waitqueue_head(&ctx->wbox_wq); |
49 | init_waitqueue_head(&ctx->stop_wq); | 49 | init_waitqueue_head(&ctx->stop_wq); |
50 | init_waitqueue_head(&ctx->mfc_wq); | 50 | init_waitqueue_head(&ctx->mfc_wq); |
51 | ctx->ibox_fasync = NULL; | ||
52 | ctx->wbox_fasync = NULL; | ||
53 | ctx->mfc_fasync = NULL; | ||
54 | ctx->mfc = NULL; | ||
55 | ctx->tagwait = 0; | ||
56 | ctx->state = SPU_STATE_SAVED; | 51 | ctx->state = SPU_STATE_SAVED; |
57 | ctx->local_store = NULL; | ||
58 | ctx->cntl = NULL; | ||
59 | ctx->signal1 = NULL; | ||
60 | ctx->signal2 = NULL; | ||
61 | ctx->spu = NULL; | ||
62 | ctx->ops = &spu_backing_ops; | 52 | ctx->ops = &spu_backing_ops; |
63 | ctx->owner = get_task_mm(current); | 53 | ctx->owner = get_task_mm(current); |
64 | goto out; | 54 | goto out; |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 366185e92667..80c02660e617 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -825,6 +825,55 @@ DEFINE_SIMPLE_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get, | |||
825 | spufs_signal2_type_set, "%llu"); | 825 | spufs_signal2_type_set, "%llu"); |
826 | 826 | ||
827 | #ifdef CONFIG_SPUFS_MMAP | 827 | #ifdef CONFIG_SPUFS_MMAP |
828 | static struct page *spufs_mss_mmap_nopage(struct vm_area_struct *vma, | ||
829 | unsigned long address, int *type) | ||
830 | { | ||
831 | return spufs_ps_nopage(vma, address, type, 0x0000); | ||
832 | } | ||
833 | |||
834 | static struct vm_operations_struct spufs_mss_mmap_vmops = { | ||
835 | .nopage = spufs_mss_mmap_nopage, | ||
836 | }; | ||
837 | |||
838 | /* | ||
839 | * mmap support for problem state MFC DMA area [0x0000 - 0x0fff]. | ||
840 | * Mapping this area requires that the application have CAP_SYS_RAWIO, | ||
841 | * as these registers require special care when read/writing. | ||
842 | */ | ||
843 | static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma) | ||
844 | { | ||
845 | if (!(vma->vm_flags & VM_SHARED)) | ||
846 | return -EINVAL; | ||
847 | |||
848 | if (!capable(CAP_SYS_RAWIO)) | ||
849 | return -EPERM; | ||
850 | |||
851 | vma->vm_flags |= VM_RESERVED; | ||
852 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | ||
853 | | _PAGE_NO_CACHE); | ||
854 | |||
855 | vma->vm_ops = &spufs_mss_mmap_vmops; | ||
856 | return 0; | ||
857 | } | ||
858 | #endif | ||
859 | |||
860 | static int spufs_mss_open(struct inode *inode, struct file *file) | ||
861 | { | ||
862 | struct spufs_inode_info *i = SPUFS_I(inode); | ||
863 | |||
864 | file->private_data = i->i_ctx; | ||
865 | return nonseekable_open(inode, file); | ||
866 | } | ||
867 | |||
868 | static struct file_operations spufs_mss_fops = { | ||
869 | .open = spufs_mss_open, | ||
870 | #ifdef CONFIG_SPUFS_MMAP | ||
871 | .mmap = spufs_mss_mmap, | ||
872 | #endif | ||
873 | }; | ||
874 | |||
875 | |||
876 | #ifdef CONFIG_SPUFS_MMAP | ||
828 | static struct page *spufs_mfc_mmap_nopage(struct vm_area_struct *vma, | 877 | static struct page *spufs_mfc_mmap_nopage(struct vm_area_struct *vma, |
829 | unsigned long address, int *type) | 878 | unsigned long address, int *type) |
830 | { | 879 | { |
@@ -1279,6 +1328,22 @@ static u64 spufs_srr0_get(void *data) | |||
1279 | DEFINE_SIMPLE_ATTRIBUTE(spufs_srr0_ops, spufs_srr0_get, spufs_srr0_set, | 1328 | DEFINE_SIMPLE_ATTRIBUTE(spufs_srr0_ops, spufs_srr0_get, spufs_srr0_set, |
1280 | "%llx\n") | 1329 | "%llx\n") |
1281 | 1330 | ||
1331 | static u64 spufs_id_get(void *data) | ||
1332 | { | ||
1333 | struct spu_context *ctx = data; | ||
1334 | u64 num; | ||
1335 | |||
1336 | spu_acquire(ctx); | ||
1337 | if (ctx->state == SPU_STATE_RUNNABLE) | ||
1338 | num = ctx->spu->number; | ||
1339 | else | ||
1340 | num = (unsigned int)-1; | ||
1341 | spu_release(ctx); | ||
1342 | |||
1343 | return num; | ||
1344 | } | ||
1345 | DEFINE_SIMPLE_ATTRIBUTE(spufs_id_ops, spufs_id_get, 0, "0x%llx\n") | ||
1346 | |||
1282 | struct tree_descr spufs_dir_contents[] = { | 1347 | struct tree_descr spufs_dir_contents[] = { |
1283 | { "mem", &spufs_mem_fops, 0666, }, | 1348 | { "mem", &spufs_mem_fops, 0666, }, |
1284 | { "regs", &spufs_regs_fops, 0666, }, | 1349 | { "regs", &spufs_regs_fops, 0666, }, |
@@ -1292,6 +1357,7 @@ struct tree_descr spufs_dir_contents[] = { | |||
1292 | { "signal2", &spufs_signal2_fops, 0666, }, | 1357 | { "signal2", &spufs_signal2_fops, 0666, }, |
1293 | { "signal1_type", &spufs_signal1_type, 0666, }, | 1358 | { "signal1_type", &spufs_signal1_type, 0666, }, |
1294 | { "signal2_type", &spufs_signal2_type, 0666, }, | 1359 | { "signal2_type", &spufs_signal2_type, 0666, }, |
1360 | { "mss", &spufs_mss_fops, 0666, }, | ||
1295 | { "mfc", &spufs_mfc_fops, 0666, }, | 1361 | { "mfc", &spufs_mfc_fops, 0666, }, |
1296 | { "cntl", &spufs_cntl_fops, 0666, }, | 1362 | { "cntl", &spufs_cntl_fops, 0666, }, |
1297 | { "npc", &spufs_npc_ops, 0666, }, | 1363 | { "npc", &spufs_npc_ops, 0666, }, |
@@ -1301,5 +1367,6 @@ struct tree_descr spufs_dir_contents[] = { | |||
1301 | { "spu_tag_mask", &spufs_spu_tag_mask_ops, 0666, }, | 1367 | { "spu_tag_mask", &spufs_spu_tag_mask_ops, 0666, }, |
1302 | { "event_mask", &spufs_event_mask_ops, 0666, }, | 1368 | { "event_mask", &spufs_event_mask_ops, 0666, }, |
1303 | { "srr0", &spufs_srr0_ops, 0666, }, | 1369 | { "srr0", &spufs_srr0_ops, 0666, }, |
1370 | { "phys-id", &spufs_id_ops, 0666, }, | ||
1304 | {}, | 1371 | {}, |
1305 | }; | 1372 | }; |
diff --git a/arch/powerpc/platforms/cell/spufs/hw_ops.c b/arch/powerpc/platforms/cell/spufs/hw_ops.c index a13a8b5a014d..ede2cac46b6d 100644 --- a/arch/powerpc/platforms/cell/spufs/hw_ops.c +++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #include <asm/io.h> | 33 | #include <asm/io.h> |
34 | #include <asm/spu.h> | 34 | #include <asm/spu.h> |
35 | #include <asm/spu_priv1.h> | ||
35 | #include <asm/spu_csa.h> | 36 | #include <asm/spu_csa.h> |
36 | #include <asm/mmu_context.h> | 37 | #include <asm/mmu_context.h> |
37 | #include "spufs.h" | 38 | #include "spufs.h" |
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index d9554199afa7..1987697b23a0 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c | |||
@@ -157,20 +157,12 @@ static void spufs_prune_dir(struct dentry *dir) | |||
157 | mutex_unlock(&dir->d_inode->i_mutex); | 157 | mutex_unlock(&dir->d_inode->i_mutex); |
158 | } | 158 | } |
159 | 159 | ||
160 | /* Caller must hold root->i_mutex */ | ||
160 | static int spufs_rmdir(struct inode *root, struct dentry *dir_dentry) | 161 | static int spufs_rmdir(struct inode *root, struct dentry *dir_dentry) |
161 | { | 162 | { |
162 | struct spu_context *ctx; | ||
163 | |||
164 | /* remove all entries */ | 163 | /* remove all entries */ |
165 | mutex_lock(&root->i_mutex); | ||
166 | spufs_prune_dir(dir_dentry); | 164 | spufs_prune_dir(dir_dentry); |
167 | mutex_unlock(&root->i_mutex); | ||
168 | |||
169 | /* We have to give up the mm_struct */ | ||
170 | ctx = SPUFS_I(dir_dentry->d_inode)->i_ctx; | ||
171 | spu_forget(ctx); | ||
172 | 165 | ||
173 | /* XXX Do we need to hold i_mutex here ? */ | ||
174 | return simple_rmdir(root, dir_dentry); | 166 | return simple_rmdir(root, dir_dentry); |
175 | } | 167 | } |
176 | 168 | ||
@@ -199,16 +191,23 @@ out: | |||
199 | 191 | ||
200 | static int spufs_dir_close(struct inode *inode, struct file *file) | 192 | static int spufs_dir_close(struct inode *inode, struct file *file) |
201 | { | 193 | { |
194 | struct spu_context *ctx; | ||
202 | struct inode *dir; | 195 | struct inode *dir; |
203 | struct dentry *dentry; | 196 | struct dentry *dentry; |
204 | int ret; | 197 | int ret; |
205 | 198 | ||
206 | dentry = file->f_dentry; | 199 | dentry = file->f_dentry; |
207 | dir = dentry->d_parent->d_inode; | 200 | dir = dentry->d_parent->d_inode; |
201 | ctx = SPUFS_I(dentry->d_inode)->i_ctx; | ||
208 | 202 | ||
203 | mutex_lock(&dir->i_mutex); | ||
209 | ret = spufs_rmdir(dir, dentry); | 204 | ret = spufs_rmdir(dir, dentry); |
205 | mutex_unlock(&dir->i_mutex); | ||
210 | WARN_ON(ret); | 206 | WARN_ON(ret); |
211 | 207 | ||
208 | /* We have to give up the mm_struct */ | ||
209 | spu_forget(ctx); | ||
210 | |||
212 | return dcache_dir_close(inode, file); | 211 | return dcache_dir_close(inode, file); |
213 | } | 212 | } |
214 | 213 | ||
@@ -305,6 +304,10 @@ long spufs_create_thread(struct nameidata *nd, | |||
305 | nd->dentry != nd->dentry->d_sb->s_root) | 304 | nd->dentry != nd->dentry->d_sb->s_root) |
306 | goto out; | 305 | goto out; |
307 | 306 | ||
307 | /* all flags are reserved */ | ||
308 | if (flags) | ||
309 | goto out; | ||
310 | |||
308 | dentry = lookup_create(nd, 1); | 311 | dentry = lookup_create(nd, 1); |
309 | ret = PTR_ERR(dentry); | 312 | ret = PTR_ERR(dentry); |
310 | if (IS_ERR(dentry)) | 313 | if (IS_ERR(dentry)) |
@@ -324,8 +327,13 @@ long spufs_create_thread(struct nameidata *nd, | |||
324 | * in error path of *_open(). | 327 | * in error path of *_open(). |
325 | */ | 328 | */ |
326 | ret = spufs_context_open(dget(dentry), mntget(nd->mnt)); | 329 | ret = spufs_context_open(dget(dentry), mntget(nd->mnt)); |
327 | if (ret < 0) | 330 | if (ret < 0) { |
328 | spufs_rmdir(nd->dentry->d_inode, dentry); | 331 | WARN_ON(spufs_rmdir(nd->dentry->d_inode, dentry)); |
332 | mutex_unlock(&nd->dentry->d_inode->i_mutex); | ||
333 | spu_forget(SPUFS_I(dentry->d_inode)->i_ctx); | ||
334 | dput(dentry); | ||
335 | goto out; | ||
336 | } | ||
329 | 337 | ||
330 | out_dput: | 338 | out_dput: |
331 | dput(dentry); | 339 | dput(dentry); |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index bf652cd77000..3dcc5d8d66b9 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/mmu_context.h> | 43 | #include <asm/mmu_context.h> |
44 | #include <asm/spu.h> | 44 | #include <asm/spu.h> |
45 | #include <asm/spu_csa.h> | 45 | #include <asm/spu_csa.h> |
46 | #include <asm/spu_priv1.h> | ||
46 | #include "spufs.h" | 47 | #include "spufs.h" |
47 | 48 | ||
48 | #define SPU_MIN_TIMESLICE (100 * HZ / 1000) | 49 | #define SPU_MIN_TIMESLICE (100 * HZ / 1000) |
@@ -363,7 +364,7 @@ int spu_activate(struct spu_context *ctx, u64 flags) | |||
363 | * We're likely to wait for interrupts on the same | 364 | * We're likely to wait for interrupts on the same |
364 | * CPU that we are now on, so send them here. | 365 | * CPU that we are now on, so send them here. |
365 | */ | 366 | */ |
366 | spu_irq_setaffinity(spu, raw_smp_processor_id()); | 367 | spu_cpu_affinity_set(spu, raw_smp_processor_id()); |
367 | put_active_spu(spu); | 368 | put_active_spu(spu); |
368 | return 0; | 369 | return 0; |
369 | } | 370 | } |
diff --git a/arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped b/arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped index 1b2355ff7036..15183d209b58 100644 --- a/arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped +++ b/arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped | |||
@@ -3,229 +3,901 @@ | |||
3 | * Hex-dump auto generated from spu_restore.c. | 3 | * Hex-dump auto generated from spu_restore.c. |
4 | * Do not edit! | 4 | * Do not edit! |
5 | */ | 5 | */ |
6 | static unsigned int spu_restore_code[] __page_aligned = { | 6 | static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = { |
7 | 0x40800000, 0x409ff801, 0x24000080, 0x24fd8081, | 7 | 0x40800000, |
8 | 0x1cd80081, 0x33001180, 0x42030003, 0x33800284, | 8 | 0x409ff801, |
9 | 0x1c010204, 0x40200000, 0x40200000, 0x40200000, | 9 | 0x24000080, |
10 | 0x34000190, 0x34004191, 0x34008192, 0x3400c193, | 10 | 0x24fd8081, |
11 | 0x141fc205, 0x23fffd84, 0x1c100183, 0x217ffa85, | 11 | 0x1cd80081, |
12 | 0x3080a000, 0x3080a201, 0x3080a402, 0x3080a603, | 12 | 0x33001180, |
13 | 0x3080a804, 0x3080aa05, 0x3080ac06, 0x3080ae07, | 13 | 0x42030003, |
14 | 0x3080b008, 0x3080b209, 0x3080b40a, 0x3080b60b, | 14 | 0x33800284, |
15 | 0x3080b80c, 0x3080ba0d, 0x3080bc0e, 0x3080be0f, | 15 | 0x1c010204, |
16 | 0x00003ffc, 0x00000000, 0x00000000, 0x00000000, | 16 | 0x40200000, |
17 | 0x01a00182, 0x3ec00083, 0xb0a14103, 0x01a00204, | 17 | 0x40200000, |
18 | 0x3ec10082, 0x4202800e, 0x04000703, 0xb0a14202, | 18 | 0x40200000, |
19 | 0x21a00803, 0x3fbf028d, 0x3f20068d, 0x3fbe0682, | 19 | 0x34000190, |
20 | 0x3fe30102, 0x21a00882, 0x3f82028f, 0x3fe3078f, | 20 | 0x34004191, |
21 | 0x3fbf0784, 0x3f200204, 0x3fbe0204, 0x3fe30204, | 21 | 0x34008192, |
22 | 0x04000203, 0x21a00903, 0x40848002, 0x21a00982, | 22 | 0x3400c193, |
23 | 0x40800003, 0x21a00a03, 0x40802002, 0x21a00a82, | 23 | 0x141fc205, |
24 | 0x21a00083, 0x40800082, 0x21a00b02, 0x10002818, | 24 | 0x23fffd84, |
25 | 0x40a80002, 0x32800007, 0x4207000c, 0x18008208, | 25 | 0x1c100183, |
26 | 0x40a0000b, 0x4080020a, 0x40800709, 0x00200000, | 26 | 0x217ffa85, |
27 | 0x42070002, 0x3ac30384, 0x1cffc489, 0x00200000, | 27 | 0x3080a000, |
28 | 0x18008383, 0x38830382, 0x4cffc486, 0x3ac28185, | 28 | 0x3080a201, |
29 | 0xb0408584, 0x28830382, 0x1c020387, 0x38828182, | 29 | 0x3080a402, |
30 | 0xb0408405, 0x1802c408, 0x28828182, 0x217ff886, | 30 | 0x3080a603, |
31 | 0x04000583, 0x21a00803, 0x3fbe0682, 0x3fe30102, | 31 | 0x3080a804, |
32 | 0x04000106, 0x21a00886, 0x04000603, 0x21a00903, | 32 | 0x3080aa05, |
33 | 0x40803c02, 0x21a00982, 0x40800003, 0x04000184, | 33 | 0x3080ac06, |
34 | 0x21a00a04, 0x40802202, 0x21a00a82, 0x42028005, | 34 | 0x3080ae07, |
35 | 0x34208702, 0x21002282, 0x21a00804, 0x21a00886, | 35 | 0x3080b008, |
36 | 0x3fbf0782, 0x3f200102, 0x3fbe0102, 0x3fe30102, | 36 | 0x3080b209, |
37 | 0x21a00902, 0x40804003, 0x21a00983, 0x21a00a04, | 37 | 0x3080b40a, |
38 | 0x40805a02, 0x21a00a82, 0x40800083, 0x21a00b83, | 38 | 0x3080b60b, |
39 | 0x01a00c02, 0x01a00d83, 0x3420c282, 0x21a00e02, | 39 | 0x3080b80c, |
40 | 0x34210283, 0x21a00f03, 0x34200284, 0x77400200, | 40 | 0x3080ba0d, |
41 | 0x3421c282, 0x21a00702, 0x34218283, 0x21a00083, | 41 | 0x3080bc0e, |
42 | 0x34214282, 0x21a00b02, 0x4200480c, 0x00200000, | 42 | 0x3080be0f, |
43 | 0x1c010286, 0x34220284, 0x34220302, 0x0f608203, | 43 | 0x00003ffc, |
44 | 0x5c024204, 0x3b81810b, 0x42013c02, 0x00200000, | 44 | 0x00000000, |
45 | 0x18008185, 0x38808183, 0x3b814182, 0x21004e84, | 45 | 0x00000000, |
46 | 0x4020007f, 0x35000100, 0x000004e0, 0x000002a0, | 46 | 0x00000000, |
47 | 0x000002e8, 0x00000428, 0x00000360, 0x000002e8, | 47 | 0x01a00182, |
48 | 0x000004a0, 0x00000468, 0x000003c8, 0x00000360, | 48 | 0x3ec00083, |
49 | 0x409ffe02, 0x30801203, 0x40800204, 0x3ec40085, | 49 | 0xb0a14103, |
50 | 0x10009c09, 0x3ac10606, 0xb060c105, 0x4020007f, | 50 | 0x01a00204, |
51 | 0x4020007f, 0x20801203, 0x38810602, 0xb0408586, | 51 | 0x3ec10082, |
52 | 0x28810602, 0x32004180, 0x34204702, 0x21a00382, | 52 | 0x4202800e, |
53 | 0x4020007f, 0x327fdc80, 0x409ffe02, 0x30801203, | 53 | 0x04000703, |
54 | 0x40800204, 0x3ec40087, 0x40800405, 0x00200000, | 54 | 0xb0a14202, |
55 | 0x40800606, 0x3ac10608, 0x3ac14609, 0x3ac1860a, | 55 | 0x21a00803, |
56 | 0xb060c107, 0x20801203, 0x41004003, 0x38810602, | 56 | 0x3fbf028d, |
57 | 0x4020007f, 0xb0408188, 0x4020007f, 0x28810602, | 57 | 0x3f20068d, |
58 | 0x41201002, 0x38814603, 0x10009c09, 0xb060c109, | 58 | 0x3fbe0682, |
59 | 0x4020007f, 0x28814603, 0x41193f83, 0x38818602, | 59 | 0x3fe30102, |
60 | 0x60ffc003, 0xb040818a, 0x28818602, 0x32003080, | 60 | 0x21a00882, |
61 | 0x409ffe02, 0x30801203, 0x40800204, 0x3ec40087, | 61 | 0x3f82028f, |
62 | 0x41201008, 0x10009c14, 0x40800405, 0x3ac10609, | 62 | 0x3fe3078f, |
63 | 0x40800606, 0x3ac1460a, 0xb060c107, 0x3ac1860b, | 63 | 0x3fbf0784, |
64 | 0x20801203, 0x38810602, 0xb0408409, 0x28810602, | 64 | 0x3f200204, |
65 | 0x38814603, 0xb060c40a, 0x4020007f, 0x28814603, | 65 | 0x3fbe0204, |
66 | 0x41193f83, 0x38818602, 0x60ffc003, 0xb040818b, | 66 | 0x3fe30204, |
67 | 0x28818602, 0x32002380, 0x409ffe02, 0x30801204, | 67 | 0x04000203, |
68 | 0x40800205, 0x3ec40083, 0x40800406, 0x3ac14607, | 68 | 0x21a00903, |
69 | 0x3ac18608, 0xb0810103, 0x41004002, 0x20801204, | 69 | 0x40848002, |
70 | 0x4020007f, 0x38814603, 0x10009c0b, 0xb060c107, | 70 | 0x21a00982, |
71 | 0x4020007f, 0x4020007f, 0x28814603, 0x38818602, | 71 | 0x40800003, |
72 | 0x4020007f, 0x4020007f, 0xb0408588, 0x28818602, | 72 | 0x21a00a03, |
73 | 0x4020007f, 0x32001780, 0x409ffe02, 0x1000640e, | 73 | 0x40802002, |
74 | 0x40800204, 0x30801203, 0x40800405, 0x3ec40087, | 74 | 0x21a00a82, |
75 | 0x40800606, 0x3ac10608, 0x3ac14609, 0x3ac1860a, | 75 | 0x21a00083, |
76 | 0xb060c107, 0x20801203, 0x413d8003, 0x38810602, | 76 | 0x40800082, |
77 | 0x4020007f, 0x327fd780, 0x409ffe02, 0x10007f0c, | 77 | 0x21a00b02, |
78 | 0x40800205, 0x30801204, 0x40800406, 0x3ec40083, | 78 | 0x10002818, |
79 | 0x3ac14607, 0x3ac18608, 0xb0810103, 0x413d8002, | 79 | 0x42a00002, |
80 | 0x20801204, 0x38814603, 0x4020007f, 0x327feb80, | 80 | 0x32800007, |
81 | 0x409ffe02, 0x30801203, 0x40800204, 0x3ec40087, | 81 | 0x4207000c, |
82 | 0x40800405, 0x1000650a, 0x40800606, 0x3ac10608, | 82 | 0x18008208, |
83 | 0x3ac14609, 0x3ac1860a, 0xb060c107, 0x20801203, | 83 | 0x40a0000b, |
84 | 0x38810602, 0xb0408588, 0x4020007f, 0x327fc980, | 84 | 0x4080020a, |
85 | 0x00400000, 0x40800003, 0x4020007f, 0x35000000, | 85 | 0x40800709, |
86 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 86 | 0x00200000, |
87 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 87 | 0x42070002, |
88 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 88 | 0x3ac30384, |
89 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 89 | 0x1cffc489, |
90 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 90 | 0x00200000, |
91 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 91 | 0x18008383, |
92 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 92 | 0x38830382, |
93 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 93 | 0x4cffc486, |
94 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 94 | 0x3ac28185, |
95 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 95 | 0xb0408584, |
96 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 96 | 0x28830382, |
97 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 97 | 0x1c020387, |
98 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 98 | 0x38828182, |
99 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 99 | 0xb0408405, |
100 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 100 | 0x1802c408, |
101 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 101 | 0x28828182, |
102 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 102 | 0x217ff886, |
103 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 103 | 0x04000583, |
104 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 104 | 0x21a00803, |
105 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 105 | 0x3fbe0682, |
106 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 106 | 0x3fe30102, |
107 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 107 | 0x04000106, |
108 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 108 | 0x21a00886, |
109 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 109 | 0x04000603, |
110 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 110 | 0x21a00903, |
111 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 111 | 0x40803c02, |
112 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 112 | 0x21a00982, |
113 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 113 | 0x40800003, |
114 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 114 | 0x04000184, |
115 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 115 | 0x21a00a04, |
116 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 116 | 0x40802202, |
117 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 117 | 0x21a00a82, |
118 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 118 | 0x42028005, |
119 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 119 | 0x34208702, |
120 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 120 | 0x21002282, |
121 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 121 | 0x21a00804, |
122 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 122 | 0x21a00886, |
123 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 123 | 0x3fbf0782, |
124 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 124 | 0x3f200102, |
125 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 125 | 0x3fbe0102, |
126 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 126 | 0x3fe30102, |
127 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 127 | 0x21a00902, |
128 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 128 | 0x40804003, |
129 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 129 | 0x21a00983, |
130 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 130 | 0x21a00a04, |
131 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 131 | 0x40805a02, |
132 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 132 | 0x21a00a82, |
133 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 133 | 0x40800083, |
134 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 134 | 0x21a00b83, |
135 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 135 | 0x01a00c02, |
136 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 136 | 0x01a00d83, |
137 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 137 | 0x3420c282, |
138 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 138 | 0x21a00e02, |
139 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 139 | 0x34210283, |
140 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 140 | 0x21a00f03, |
141 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 141 | 0x34200284, |
142 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 142 | 0x77400200, |
143 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 143 | 0x3421c282, |
144 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 144 | 0x21a00702, |
145 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 145 | 0x34218283, |
146 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 146 | 0x21a00083, |
147 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 147 | 0x34214282, |
148 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 148 | 0x21a00b02, |
149 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 149 | 0x4200480c, |
150 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 150 | 0x00200000, |
151 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 151 | 0x1c010286, |
152 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 152 | 0x34220284, |
153 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 153 | 0x34220302, |
154 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 154 | 0x0f608203, |
155 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 155 | 0x5c024204, |
156 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 156 | 0x3b81810b, |
157 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 157 | 0x42013c02, |
158 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 158 | 0x00200000, |
159 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 159 | 0x18008185, |
160 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 160 | 0x38808183, |
161 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 161 | 0x3b814182, |
162 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 162 | 0x21004e84, |
163 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 163 | 0x4020007f, |
164 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 164 | 0x35000100, |
165 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 165 | 0x000004e0, |
166 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 166 | 0x000002a0, |
167 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 167 | 0x000002e8, |
168 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 168 | 0x00000428, |
169 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 169 | 0x00000360, |
170 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 170 | 0x000002e8, |
171 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 171 | 0x000004a0, |
172 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 172 | 0x00000468, |
173 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 173 | 0x000003c8, |
174 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 174 | 0x00000360, |
175 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 175 | 0x409ffe02, |
176 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 176 | 0x30801203, |
177 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 177 | 0x40800204, |
178 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 178 | 0x3ec40085, |
179 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 179 | 0x10009c09, |
180 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 180 | 0x3ac10606, |
181 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 181 | 0xb060c105, |
182 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 182 | 0x4020007f, |
183 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 183 | 0x4020007f, |
184 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 184 | 0x20801203, |
185 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 185 | 0x38810602, |
186 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 186 | 0xb0408586, |
187 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 187 | 0x28810602, |
188 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 188 | 0x32004180, |
189 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 189 | 0x34204702, |
190 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 190 | 0x21a00382, |
191 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 191 | 0x4020007f, |
192 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 192 | 0x327fdc80, |
193 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 193 | 0x409ffe02, |
194 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 194 | 0x30801203, |
195 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 195 | 0x40800204, |
196 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 196 | 0x3ec40087, |
197 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 197 | 0x40800405, |
198 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 198 | 0x00200000, |
199 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 199 | 0x40800606, |
200 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 200 | 0x3ac10608, |
201 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 201 | 0x3ac14609, |
202 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 202 | 0x3ac1860a, |
203 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 203 | 0xb060c107, |
204 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 204 | 0x20801203, |
205 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 205 | 0x41004003, |
206 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 206 | 0x38810602, |
207 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 207 | 0x4020007f, |
208 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 208 | 0xb0408188, |
209 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 209 | 0x4020007f, |
210 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 210 | 0x28810602, |
211 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 211 | 0x41201002, |
212 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 212 | 0x38814603, |
213 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 213 | 0x10009c09, |
214 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 214 | 0xb060c109, |
215 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 215 | 0x4020007f, |
216 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 216 | 0x28814603, |
217 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 217 | 0x41193f83, |
218 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 218 | 0x38818602, |
219 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 219 | 0x60ffc003, |
220 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 220 | 0xb040818a, |
221 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 221 | 0x28818602, |
222 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 222 | 0x32003080, |
223 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 223 | 0x409ffe02, |
224 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 224 | 0x30801203, |
225 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 225 | 0x40800204, |
226 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 226 | 0x3ec40087, |
227 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 227 | 0x41201008, |
228 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 228 | 0x10009c14, |
229 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 229 | 0x40800405, |
230 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 230 | 0x3ac10609, |
231 | 0x40800606, | ||
232 | 0x3ac1460a, | ||
233 | 0xb060c107, | ||
234 | 0x3ac1860b, | ||
235 | 0x20801203, | ||
236 | 0x38810602, | ||
237 | 0xb0408409, | ||
238 | 0x28810602, | ||
239 | 0x38814603, | ||
240 | 0xb060c40a, | ||
241 | 0x4020007f, | ||
242 | 0x28814603, | ||
243 | 0x41193f83, | ||
244 | 0x38818602, | ||
245 | 0x60ffc003, | ||
246 | 0xb040818b, | ||
247 | 0x28818602, | ||
248 | 0x32002380, | ||
249 | 0x409ffe02, | ||
250 | 0x30801204, | ||
251 | 0x40800205, | ||
252 | 0x3ec40083, | ||
253 | 0x40800406, | ||
254 | 0x3ac14607, | ||
255 | 0x3ac18608, | ||
256 | 0xb0810103, | ||
257 | 0x41004002, | ||
258 | 0x20801204, | ||
259 | 0x4020007f, | ||
260 | 0x38814603, | ||
261 | 0x10009c0b, | ||
262 | 0xb060c107, | ||
263 | 0x4020007f, | ||
264 | 0x4020007f, | ||
265 | 0x28814603, | ||
266 | 0x38818602, | ||
267 | 0x4020007f, | ||
268 | 0x4020007f, | ||
269 | 0xb0408588, | ||
270 | 0x28818602, | ||
271 | 0x4020007f, | ||
272 | 0x32001780, | ||
273 | 0x409ffe02, | ||
274 | 0x1000640e, | ||
275 | 0x40800204, | ||
276 | 0x30801203, | ||
277 | 0x40800405, | ||
278 | 0x3ec40087, | ||
279 | 0x40800606, | ||
280 | 0x3ac10608, | ||
281 | 0x3ac14609, | ||
282 | 0x3ac1860a, | ||
283 | 0xb060c107, | ||
284 | 0x20801203, | ||
285 | 0x413d8003, | ||
286 | 0x38810602, | ||
287 | 0x4020007f, | ||
288 | 0x327fd780, | ||
289 | 0x409ffe02, | ||
290 | 0x10007f0c, | ||
291 | 0x40800205, | ||
292 | 0x30801204, | ||
293 | 0x40800406, | ||
294 | 0x3ec40083, | ||
295 | 0x3ac14607, | ||
296 | 0x3ac18608, | ||
297 | 0xb0810103, | ||
298 | 0x413d8002, | ||
299 | 0x20801204, | ||
300 | 0x38814603, | ||
301 | 0x4020007f, | ||
302 | 0x327feb80, | ||
303 | 0x409ffe02, | ||
304 | 0x30801203, | ||
305 | 0x40800204, | ||
306 | 0x3ec40087, | ||
307 | 0x40800405, | ||
308 | 0x1000650a, | ||
309 | 0x40800606, | ||
310 | 0x3ac10608, | ||
311 | 0x3ac14609, | ||
312 | 0x3ac1860a, | ||
313 | 0xb060c107, | ||
314 | 0x20801203, | ||
315 | 0x38810602, | ||
316 | 0xb0408588, | ||
317 | 0x4020007f, | ||
318 | 0x327fc980, | ||
319 | 0x00400000, | ||
320 | 0x40800003, | ||
321 | 0x4020007f, | ||
322 | 0x35000000, | ||
323 | 0x00000000, | ||
324 | 0x00000000, | ||
325 | 0x00000000, | ||
326 | 0x00000000, | ||
327 | 0x00000000, | ||
328 | 0x00000000, | ||
329 | 0x00000000, | ||
330 | 0x00000000, | ||
331 | 0x00000000, | ||
332 | 0x00000000, | ||
333 | 0x00000000, | ||
334 | 0x00000000, | ||
335 | 0x00000000, | ||
336 | 0x00000000, | ||
337 | 0x00000000, | ||
338 | 0x00000000, | ||
339 | 0x00000000, | ||
340 | 0x00000000, | ||
341 | 0x00000000, | ||
342 | 0x00000000, | ||
343 | 0x00000000, | ||
344 | 0x00000000, | ||
345 | 0x00000000, | ||
346 | 0x00000000, | ||
347 | 0x00000000, | ||
348 | 0x00000000, | ||
349 | 0x00000000, | ||
350 | 0x00000000, | ||
351 | 0x00000000, | ||
352 | 0x00000000, | ||
353 | 0x00000000, | ||
354 | 0x00000000, | ||
355 | 0x00000000, | ||
356 | 0x00000000, | ||
357 | 0x00000000, | ||
358 | 0x00000000, | ||
359 | 0x00000000, | ||
360 | 0x00000000, | ||
361 | 0x00000000, | ||
362 | 0x00000000, | ||
363 | 0x00000000, | ||
364 | 0x00000000, | ||
365 | 0x00000000, | ||
366 | 0x00000000, | ||
367 | 0x00000000, | ||
368 | 0x00000000, | ||
369 | 0x00000000, | ||
370 | 0x00000000, | ||
371 | 0x00000000, | ||
372 | 0x00000000, | ||
373 | 0x00000000, | ||
374 | 0x00000000, | ||
375 | 0x00000000, | ||
376 | 0x00000000, | ||
377 | 0x00000000, | ||
378 | 0x00000000, | ||
379 | 0x00000000, | ||
380 | 0x00000000, | ||
381 | 0x00000000, | ||
382 | 0x00000000, | ||
383 | 0x00000000, | ||
384 | 0x00000000, | ||
385 | 0x00000000, | ||
386 | 0x00000000, | ||
387 | 0x00000000, | ||
388 | 0x00000000, | ||
389 | 0x00000000, | ||
390 | 0x00000000, | ||
391 | 0x00000000, | ||
392 | 0x00000000, | ||
393 | 0x00000000, | ||
394 | 0x00000000, | ||
395 | 0x00000000, | ||
396 | 0x00000000, | ||
397 | 0x00000000, | ||
398 | 0x00000000, | ||
399 | 0x00000000, | ||
400 | 0x00000000, | ||
401 | 0x00000000, | ||
402 | 0x00000000, | ||
403 | 0x00000000, | ||
404 | 0x00000000, | ||
405 | 0x00000000, | ||
406 | 0x00000000, | ||
407 | 0x00000000, | ||
408 | 0x00000000, | ||
409 | 0x00000000, | ||
410 | 0x00000000, | ||
411 | 0x00000000, | ||
412 | 0x00000000, | ||
413 | 0x00000000, | ||
414 | 0x00000000, | ||
415 | 0x00000000, | ||
416 | 0x00000000, | ||
417 | 0x00000000, | ||
418 | 0x00000000, | ||
419 | 0x00000000, | ||
420 | 0x00000000, | ||
421 | 0x00000000, | ||
422 | 0x00000000, | ||
423 | 0x00000000, | ||
424 | 0x00000000, | ||
425 | 0x00000000, | ||
426 | 0x00000000, | ||
427 | 0x00000000, | ||
428 | 0x00000000, | ||
429 | 0x00000000, | ||
430 | 0x00000000, | ||
431 | 0x00000000, | ||
432 | 0x00000000, | ||
433 | 0x00000000, | ||
434 | 0x00000000, | ||
435 | 0x00000000, | ||
436 | 0x00000000, | ||
437 | 0x00000000, | ||
438 | 0x00000000, | ||
439 | 0x00000000, | ||
440 | 0x00000000, | ||
441 | 0x00000000, | ||
442 | 0x00000000, | ||
443 | 0x00000000, | ||
444 | 0x00000000, | ||
445 | 0x00000000, | ||
446 | 0x00000000, | ||
447 | 0x00000000, | ||
448 | 0x00000000, | ||
449 | 0x00000000, | ||
450 | 0x00000000, | ||
451 | 0x00000000, | ||
452 | 0x00000000, | ||
453 | 0x00000000, | ||
454 | 0x00000000, | ||
455 | 0x00000000, | ||
456 | 0x00000000, | ||
457 | 0x00000000, | ||
458 | 0x00000000, | ||
459 | 0x00000000, | ||
460 | 0x00000000, | ||
461 | 0x00000000, | ||
462 | 0x00000000, | ||
463 | 0x00000000, | ||
464 | 0x00000000, | ||
465 | 0x00000000, | ||
466 | 0x00000000, | ||
467 | 0x00000000, | ||
468 | 0x00000000, | ||
469 | 0x00000000, | ||
470 | 0x00000000, | ||
471 | 0x00000000, | ||
472 | 0x00000000, | ||
473 | 0x00000000, | ||
474 | 0x00000000, | ||
475 | 0x00000000, | ||
476 | 0x00000000, | ||
477 | 0x00000000, | ||
478 | 0x00000000, | ||
479 | 0x00000000, | ||
480 | 0x00000000, | ||
481 | 0x00000000, | ||
482 | 0x00000000, | ||
483 | 0x00000000, | ||
484 | 0x00000000, | ||
485 | 0x00000000, | ||
486 | 0x00000000, | ||
487 | 0x00000000, | ||
488 | 0x00000000, | ||
489 | 0x00000000, | ||
490 | 0x00000000, | ||
491 | 0x00000000, | ||
492 | 0x00000000, | ||
493 | 0x00000000, | ||
494 | 0x00000000, | ||
495 | 0x00000000, | ||
496 | 0x00000000, | ||
497 | 0x00000000, | ||
498 | 0x00000000, | ||
499 | 0x00000000, | ||
500 | 0x00000000, | ||
501 | 0x00000000, | ||
502 | 0x00000000, | ||
503 | 0x00000000, | ||
504 | 0x00000000, | ||
505 | 0x00000000, | ||
506 | 0x00000000, | ||
507 | 0x00000000, | ||
508 | 0x00000000, | ||
509 | 0x00000000, | ||
510 | 0x00000000, | ||
511 | 0x00000000, | ||
512 | 0x00000000, | ||
513 | 0x00000000, | ||
514 | 0x00000000, | ||
515 | 0x00000000, | ||
516 | 0x00000000, | ||
517 | 0x00000000, | ||
518 | 0x00000000, | ||
519 | 0x00000000, | ||
520 | 0x00000000, | ||
521 | 0x00000000, | ||
522 | 0x00000000, | ||
523 | 0x00000000, | ||
524 | 0x00000000, | ||
525 | 0x00000000, | ||
526 | 0x00000000, | ||
527 | 0x00000000, | ||
528 | 0x00000000, | ||
529 | 0x00000000, | ||
530 | 0x00000000, | ||
531 | 0x00000000, | ||
532 | 0x00000000, | ||
533 | 0x00000000, | ||
534 | 0x00000000, | ||
535 | 0x00000000, | ||
536 | 0x00000000, | ||
537 | 0x00000000, | ||
538 | 0x00000000, | ||
539 | 0x00000000, | ||
540 | 0x00000000, | ||
541 | 0x00000000, | ||
542 | 0x00000000, | ||
543 | 0x00000000, | ||
544 | 0x00000000, | ||
545 | 0x00000000, | ||
546 | 0x00000000, | ||
547 | 0x00000000, | ||
548 | 0x00000000, | ||
549 | 0x00000000, | ||
550 | 0x00000000, | ||
551 | 0x00000000, | ||
552 | 0x00000000, | ||
553 | 0x00000000, | ||
554 | 0x00000000, | ||
555 | 0x00000000, | ||
556 | 0x00000000, | ||
557 | 0x00000000, | ||
558 | 0x00000000, | ||
559 | 0x00000000, | ||
560 | 0x00000000, | ||
561 | 0x00000000, | ||
562 | 0x00000000, | ||
563 | 0x00000000, | ||
564 | 0x00000000, | ||
565 | 0x00000000, | ||
566 | 0x00000000, | ||
567 | 0x00000000, | ||
568 | 0x00000000, | ||
569 | 0x00000000, | ||
570 | 0x00000000, | ||
571 | 0x00000000, | ||
572 | 0x00000000, | ||
573 | 0x00000000, | ||
574 | 0x00000000, | ||
575 | 0x00000000, | ||
576 | 0x00000000, | ||
577 | 0x00000000, | ||
578 | 0x00000000, | ||
579 | 0x00000000, | ||
580 | 0x00000000, | ||
581 | 0x00000000, | ||
582 | 0x00000000, | ||
583 | 0x00000000, | ||
584 | 0x00000000, | ||
585 | 0x00000000, | ||
586 | 0x00000000, | ||
587 | 0x00000000, | ||
588 | 0x00000000, | ||
589 | 0x00000000, | ||
590 | 0x00000000, | ||
591 | 0x00000000, | ||
592 | 0x00000000, | ||
593 | 0x00000000, | ||
594 | 0x00000000, | ||
595 | 0x00000000, | ||
596 | 0x00000000, | ||
597 | 0x00000000, | ||
598 | 0x00000000, | ||
599 | 0x00000000, | ||
600 | 0x00000000, | ||
601 | 0x00000000, | ||
602 | 0x00000000, | ||
603 | 0x00000000, | ||
604 | 0x00000000, | ||
605 | 0x00000000, | ||
606 | 0x00000000, | ||
607 | 0x00000000, | ||
608 | 0x00000000, | ||
609 | 0x00000000, | ||
610 | 0x00000000, | ||
611 | 0x00000000, | ||
612 | 0x00000000, | ||
613 | 0x00000000, | ||
614 | 0x00000000, | ||
615 | 0x00000000, | ||
616 | 0x00000000, | ||
617 | 0x00000000, | ||
618 | 0x00000000, | ||
619 | 0x00000000, | ||
620 | 0x00000000, | ||
621 | 0x00000000, | ||
622 | 0x00000000, | ||
623 | 0x00000000, | ||
624 | 0x00000000, | ||
625 | 0x00000000, | ||
626 | 0x00000000, | ||
627 | 0x00000000, | ||
628 | 0x00000000, | ||
629 | 0x00000000, | ||
630 | 0x00000000, | ||
631 | 0x00000000, | ||
632 | 0x00000000, | ||
633 | 0x00000000, | ||
634 | 0x00000000, | ||
635 | 0x00000000, | ||
636 | 0x00000000, | ||
637 | 0x00000000, | ||
638 | 0x00000000, | ||
639 | 0x00000000, | ||
640 | 0x00000000, | ||
641 | 0x00000000, | ||
642 | 0x00000000, | ||
643 | 0x00000000, | ||
644 | 0x00000000, | ||
645 | 0x00000000, | ||
646 | 0x00000000, | ||
647 | 0x00000000, | ||
648 | 0x00000000, | ||
649 | 0x00000000, | ||
650 | 0x00000000, | ||
651 | 0x00000000, | ||
652 | 0x00000000, | ||
653 | 0x00000000, | ||
654 | 0x00000000, | ||
655 | 0x00000000, | ||
656 | 0x00000000, | ||
657 | 0x00000000, | ||
658 | 0x00000000, | ||
659 | 0x00000000, | ||
660 | 0x00000000, | ||
661 | 0x00000000, | ||
662 | 0x00000000, | ||
663 | 0x00000000, | ||
664 | 0x00000000, | ||
665 | 0x00000000, | ||
666 | 0x00000000, | ||
667 | 0x00000000, | ||
668 | 0x00000000, | ||
669 | 0x00000000, | ||
670 | 0x00000000, | ||
671 | 0x00000000, | ||
672 | 0x00000000, | ||
673 | 0x00000000, | ||
674 | 0x00000000, | ||
675 | 0x00000000, | ||
676 | 0x00000000, | ||
677 | 0x00000000, | ||
678 | 0x00000000, | ||
679 | 0x00000000, | ||
680 | 0x00000000, | ||
681 | 0x00000000, | ||
682 | 0x00000000, | ||
683 | 0x00000000, | ||
684 | 0x00000000, | ||
685 | 0x00000000, | ||
686 | 0x00000000, | ||
687 | 0x00000000, | ||
688 | 0x00000000, | ||
689 | 0x00000000, | ||
690 | 0x00000000, | ||
691 | 0x00000000, | ||
692 | 0x00000000, | ||
693 | 0x00000000, | ||
694 | 0x00000000, | ||
695 | 0x00000000, | ||
696 | 0x00000000, | ||
697 | 0x00000000, | ||
698 | 0x00000000, | ||
699 | 0x00000000, | ||
700 | 0x00000000, | ||
701 | 0x00000000, | ||
702 | 0x00000000, | ||
703 | 0x00000000, | ||
704 | 0x00000000, | ||
705 | 0x00000000, | ||
706 | 0x00000000, | ||
707 | 0x00000000, | ||
708 | 0x00000000, | ||
709 | 0x00000000, | ||
710 | 0x00000000, | ||
711 | 0x00000000, | ||
712 | 0x00000000, | ||
713 | 0x00000000, | ||
714 | 0x00000000, | ||
715 | 0x00000000, | ||
716 | 0x00000000, | ||
717 | 0x00000000, | ||
718 | 0x00000000, | ||
719 | 0x00000000, | ||
720 | 0x00000000, | ||
721 | 0x00000000, | ||
722 | 0x00000000, | ||
723 | 0x00000000, | ||
724 | 0x00000000, | ||
725 | 0x00000000, | ||
726 | 0x00000000, | ||
727 | 0x00000000, | ||
728 | 0x00000000, | ||
729 | 0x00000000, | ||
730 | 0x00000000, | ||
731 | 0x00000000, | ||
732 | 0x00000000, | ||
733 | 0x00000000, | ||
734 | 0x00000000, | ||
735 | 0x00000000, | ||
736 | 0x00000000, | ||
737 | 0x00000000, | ||
738 | 0x00000000, | ||
739 | 0x00000000, | ||
740 | 0x00000000, | ||
741 | 0x00000000, | ||
742 | 0x00000000, | ||
743 | 0x00000000, | ||
744 | 0x00000000, | ||
745 | 0x00000000, | ||
746 | 0x00000000, | ||
747 | 0x00000000, | ||
748 | 0x00000000, | ||
749 | 0x00000000, | ||
750 | 0x00000000, | ||
751 | 0x00000000, | ||
752 | 0x00000000, | ||
753 | 0x00000000, | ||
754 | 0x00000000, | ||
755 | 0x00000000, | ||
756 | 0x00000000, | ||
757 | 0x00000000, | ||
758 | 0x00000000, | ||
759 | 0x00000000, | ||
760 | 0x00000000, | ||
761 | 0x00000000, | ||
762 | 0x00000000, | ||
763 | 0x00000000, | ||
764 | 0x00000000, | ||
765 | 0x00000000, | ||
766 | 0x00000000, | ||
767 | 0x00000000, | ||
768 | 0x00000000, | ||
769 | 0x00000000, | ||
770 | 0x00000000, | ||
771 | 0x00000000, | ||
772 | 0x00000000, | ||
773 | 0x00000000, | ||
774 | 0x00000000, | ||
775 | 0x00000000, | ||
776 | 0x00000000, | ||
777 | 0x00000000, | ||
778 | 0x00000000, | ||
779 | 0x00000000, | ||
780 | 0x00000000, | ||
781 | 0x00000000, | ||
782 | 0x00000000, | ||
783 | 0x00000000, | ||
784 | 0x00000000, | ||
785 | 0x00000000, | ||
786 | 0x00000000, | ||
787 | 0x00000000, | ||
788 | 0x00000000, | ||
789 | 0x00000000, | ||
790 | 0x00000000, | ||
791 | 0x00000000, | ||
792 | 0x00000000, | ||
793 | 0x00000000, | ||
794 | 0x00000000, | ||
795 | 0x00000000, | ||
796 | 0x00000000, | ||
797 | 0x00000000, | ||
798 | 0x00000000, | ||
799 | 0x00000000, | ||
800 | 0x00000000, | ||
801 | 0x00000000, | ||
802 | 0x00000000, | ||
803 | 0x00000000, | ||
804 | 0x00000000, | ||
805 | 0x00000000, | ||
806 | 0x00000000, | ||
807 | 0x00000000, | ||
808 | 0x00000000, | ||
809 | 0x00000000, | ||
810 | 0x00000000, | ||
811 | 0x00000000, | ||
812 | 0x00000000, | ||
813 | 0x00000000, | ||
814 | 0x00000000, | ||
815 | 0x00000000, | ||
816 | 0x00000000, | ||
817 | 0x00000000, | ||
818 | 0x00000000, | ||
819 | 0x00000000, | ||
820 | 0x00000000, | ||
821 | 0x00000000, | ||
822 | 0x00000000, | ||
823 | 0x00000000, | ||
824 | 0x00000000, | ||
825 | 0x00000000, | ||
826 | 0x00000000, | ||
827 | 0x00000000, | ||
828 | 0x00000000, | ||
829 | 0x00000000, | ||
830 | 0x00000000, | ||
831 | 0x00000000, | ||
832 | 0x00000000, | ||
833 | 0x00000000, | ||
834 | 0x00000000, | ||
835 | 0x00000000, | ||
836 | 0x00000000, | ||
837 | 0x00000000, | ||
838 | 0x00000000, | ||
839 | 0x00000000, | ||
840 | 0x00000000, | ||
841 | 0x00000000, | ||
842 | 0x00000000, | ||
843 | 0x00000000, | ||
844 | 0x00000000, | ||
845 | 0x00000000, | ||
846 | 0x00000000, | ||
847 | 0x00000000, | ||
848 | 0x00000000, | ||
849 | 0x00000000, | ||
850 | 0x00000000, | ||
851 | 0x00000000, | ||
852 | 0x00000000, | ||
853 | 0x00000000, | ||
854 | 0x00000000, | ||
855 | 0x00000000, | ||
856 | 0x00000000, | ||
857 | 0x00000000, | ||
858 | 0x00000000, | ||
859 | 0x00000000, | ||
860 | 0x00000000, | ||
861 | 0x00000000, | ||
862 | 0x00000000, | ||
863 | 0x00000000, | ||
864 | 0x00000000, | ||
865 | 0x00000000, | ||
866 | 0x00000000, | ||
867 | 0x00000000, | ||
868 | 0x00000000, | ||
869 | 0x00000000, | ||
870 | 0x00000000, | ||
871 | 0x00000000, | ||
872 | 0x00000000, | ||
873 | 0x00000000, | ||
874 | 0x00000000, | ||
875 | 0x00000000, | ||
876 | 0x00000000, | ||
877 | 0x00000000, | ||
878 | 0x00000000, | ||
879 | 0x00000000, | ||
880 | 0x00000000, | ||
881 | 0x00000000, | ||
882 | 0x00000000, | ||
883 | 0x00000000, | ||
884 | 0x00000000, | ||
885 | 0x00000000, | ||
886 | 0x00000000, | ||
887 | 0x00000000, | ||
888 | 0x00000000, | ||
889 | 0x00000000, | ||
890 | 0x00000000, | ||
891 | 0x00000000, | ||
892 | 0x00000000, | ||
893 | 0x00000000, | ||
894 | 0x00000000, | ||
895 | 0x00000000, | ||
896 | 0x00000000, | ||
897 | 0x00000000, | ||
898 | 0x00000000, | ||
899 | 0x00000000, | ||
900 | 0x00000000, | ||
901 | 0x00000000, | ||
902 | 0x00000000, | ||
231 | }; | 903 | }; |
diff --git a/arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped b/arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped index 39e54003f1df..b9f81ac8a632 100644 --- a/arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped +++ b/arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped | |||
@@ -3,189 +3,741 @@ | |||
3 | * Hex-dump auto generated from spu_save.c. | 3 | * Hex-dump auto generated from spu_save.c. |
4 | * Do not edit! | 4 | * Do not edit! |
5 | */ | 5 | */ |
6 | static unsigned int spu_save_code[] __page_aligned = { | 6 | static unsigned int spu_save_code[] __attribute__((__aligned__(128))) = { |
7 | 0x20805000, 0x20805201, 0x20805402, 0x20805603, | 7 | 0x20805000, |
8 | 0x20805804, 0x20805a05, 0x20805c06, 0x20805e07, | 8 | 0x20805201, |
9 | 0x20806008, 0x20806209, 0x2080640a, 0x2080660b, | 9 | 0x20805402, |
10 | 0x2080680c, 0x20806a0d, 0x20806c0e, 0x20806e0f, | 10 | 0x20805603, |
11 | 0x4201c003, 0x33800184, 0x1c010204, 0x40200000, | 11 | 0x20805804, |
12 | 0x24000190, 0x24004191, 0x24008192, 0x2400c193, | 12 | 0x20805a05, |
13 | 0x141fc205, 0x23fffd84, 0x1c100183, 0x217ffb85, | 13 | 0x20805c06, |
14 | 0x40800000, 0x409ff801, 0x24000080, 0x24fd8081, | 14 | 0x20805e07, |
15 | 0x1cd80081, 0x33000180, 0x00000000, 0x00000000, | 15 | 0x20806008, |
16 | 0x01a00182, 0x3ec00083, 0xb1c38103, 0x01a00204, | 16 | 0x20806209, |
17 | 0x3ec10082, 0x4201400d, 0xb1c38202, 0x01a00583, | 17 | 0x2080640a, |
18 | 0x34218682, 0x3ed80684, 0xb0408184, 0x24218682, | 18 | 0x2080660b, |
19 | 0x01a00603, 0x00200000, 0x34214682, 0x3ed40684, | 19 | 0x2080680c, |
20 | 0xb0408184, 0x40800003, 0x24214682, 0x21a00083, | 20 | 0x20806a0d, |
21 | 0x40800082, 0x21a00b02, 0x4020007f, 0x1000251e, | 21 | 0x20806c0e, |
22 | 0x40a80002, 0x32800008, 0x4205c00c, 0x00200000, | 22 | 0x20806e0f, |
23 | 0x40a0000b, 0x3f82070f, 0x4080020a, 0x40800709, | 23 | 0x4201c003, |
24 | 0x3fe3078f, 0x3fbf0783, 0x3f200183, 0x3fbe0183, | 24 | 0x33800184, |
25 | 0x3fe30187, 0x18008387, 0x4205c002, 0x3ac30404, | 25 | 0x1c010204, |
26 | 0x1cffc489, 0x00200000, 0x18008403, 0x38830402, | 26 | 0x40200000, |
27 | 0x4cffc486, 0x3ac28185, 0xb0408584, 0x28830402, | 27 | 0x24000190, |
28 | 0x1c020408, 0x38828182, 0xb0408385, 0x1802c387, | 28 | 0x24004191, |
29 | 0x28828182, 0x217ff886, 0x04000582, 0x32800007, | 29 | 0x24008192, |
30 | 0x21a00802, 0x3fbf0705, 0x3f200285, 0x3fbe0285, | 30 | 0x2400c193, |
31 | 0x3fe30285, 0x21a00885, 0x04000603, 0x21a00903, | 31 | 0x141fc205, |
32 | 0x40803c02, 0x21a00982, 0x04000386, 0x21a00a06, | 32 | 0x23fffd84, |
33 | 0x40801202, 0x21a00a82, 0x73000003, 0x24200683, | 33 | 0x1c100183, |
34 | 0x01a00404, 0x00200000, 0x34204682, 0x3ec40683, | 34 | 0x217ffb85, |
35 | 0xb0408203, 0x24204682, 0x01a00783, 0x00200000, | 35 | 0x40800000, |
36 | 0x3421c682, 0x3edc0684, 0xb0408184, 0x2421c682, | 36 | 0x409ff801, |
37 | 0x21a00806, 0x21a00885, 0x3fbf0784, 0x3f200204, | 37 | 0x24000080, |
38 | 0x3fbe0204, 0x3fe30204, 0x21a00904, 0x40804002, | 38 | 0x24fd8081, |
39 | 0x21a00982, 0x21a00a06, 0x40805a02, 0x21a00a82, | 39 | 0x1cd80081, |
40 | 0x04000683, 0x21a00803, 0x21a00885, 0x21a00904, | 40 | 0x33000180, |
41 | 0x40848002, 0x21a00982, 0x21a00a06, 0x40801002, | 41 | 0x00000000, |
42 | 0x21a00a82, 0x21a00a06, 0x40806602, 0x00200000, | 42 | 0x00000000, |
43 | 0x35800009, 0x21a00a82, 0x40800083, 0x21a00b83, | 43 | 0x01a00182, |
44 | 0x01a00c02, 0x01a00d83, 0x00003ffb, 0x40800003, | 44 | 0x3ec00083, |
45 | 0x4020007f, 0x35000000, 0x00000000, 0x00000000, | 45 | 0xb1c38103, |
46 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 46 | 0x01a00204, |
47 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 47 | 0x3ec10082, |
48 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 48 | 0x4201400d, |
49 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 49 | 0xb1c38202, |
50 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 50 | 0x01a00583, |
51 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 51 | 0x34218682, |
52 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 52 | 0x3ed80684, |
53 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 53 | 0xb0408184, |
54 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 54 | 0x24218682, |
55 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 55 | 0x01a00603, |
56 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 56 | 0x00200000, |
57 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 57 | 0x34214682, |
58 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 58 | 0x3ed40684, |
59 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 59 | 0xb0408184, |
60 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 60 | 0x40800003, |
61 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 61 | 0x24214682, |
62 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 62 | 0x21a00083, |
63 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 63 | 0x40800082, |
64 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 64 | 0x21a00b02, |
65 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 65 | 0x4020007f, |
66 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 66 | 0x1000251e, |
67 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 67 | 0x42a00002, |
68 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 68 | 0x32800008, |
69 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 69 | 0x4205c00c, |
70 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 70 | 0x00200000, |
71 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 71 | 0x40a0000b, |
72 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 72 | 0x3f82070f, |
73 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 73 | 0x4080020a, |
74 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 74 | 0x40800709, |
75 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 75 | 0x3fe3078f, |
76 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 76 | 0x3fbf0783, |
77 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 77 | 0x3f200183, |
78 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 78 | 0x3fbe0183, |
79 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 79 | 0x3fe30187, |
80 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 80 | 0x18008387, |
81 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 81 | 0x4205c002, |
82 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 82 | 0x3ac30404, |
83 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 83 | 0x1cffc489, |
84 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 84 | 0x00200000, |
85 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 85 | 0x18008403, |
86 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 86 | 0x38830402, |
87 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 87 | 0x4cffc486, |
88 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 88 | 0x3ac28185, |
89 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 89 | 0xb0408584, |
90 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 90 | 0x28830402, |
91 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 91 | 0x1c020408, |
92 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 92 | 0x38828182, |
93 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 93 | 0xb0408385, |
94 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 94 | 0x1802c387, |
95 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 95 | 0x28828182, |
96 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 96 | 0x217ff886, |
97 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 97 | 0x04000582, |
98 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 98 | 0x32800007, |
99 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 99 | 0x21a00802, |
100 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 100 | 0x3fbf0705, |
101 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 101 | 0x3f200285, |
102 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 102 | 0x3fbe0285, |
103 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 103 | 0x3fe30285, |
104 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 104 | 0x21a00885, |
105 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 105 | 0x04000603, |
106 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 106 | 0x21a00903, |
107 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 107 | 0x40803c02, |
108 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 108 | 0x21a00982, |
109 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 109 | 0x04000386, |
110 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 110 | 0x21a00a06, |
111 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 111 | 0x40801202, |
112 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 112 | 0x21a00a82, |
113 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 113 | 0x73000003, |
114 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 114 | 0x24200683, |
115 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 115 | 0x01a00404, |
116 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 116 | 0x00200000, |
117 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 117 | 0x34204682, |
118 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 118 | 0x3ec40683, |
119 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 119 | 0xb0408203, |
120 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 120 | 0x24204682, |
121 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 121 | 0x01a00783, |
122 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 122 | 0x00200000, |
123 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 123 | 0x3421c682, |
124 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 124 | 0x3edc0684, |
125 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 125 | 0xb0408184, |
126 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 126 | 0x2421c682, |
127 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 127 | 0x21a00806, |
128 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 128 | 0x21a00885, |
129 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 129 | 0x3fbf0784, |
130 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 130 | 0x3f200204, |
131 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 131 | 0x3fbe0204, |
132 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 132 | 0x3fe30204, |
133 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 133 | 0x21a00904, |
134 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 134 | 0x40804002, |
135 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 135 | 0x21a00982, |
136 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 136 | 0x21a00a06, |
137 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 137 | 0x40805a02, |
138 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 138 | 0x21a00a82, |
139 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 139 | 0x04000683, |
140 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 140 | 0x21a00803, |
141 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 141 | 0x21a00885, |
142 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 142 | 0x21a00904, |
143 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 143 | 0x40848002, |
144 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 144 | 0x21a00982, |
145 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 145 | 0x21a00a06, |
146 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 146 | 0x40801002, |
147 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 147 | 0x21a00a82, |
148 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 148 | 0x21a00a06, |
149 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 149 | 0x40806602, |
150 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 150 | 0x00200000, |
151 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 151 | 0x35800009, |
152 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 152 | 0x21a00a82, |
153 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 153 | 0x40800083, |
154 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 154 | 0x21a00b83, |
155 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 155 | 0x01a00c02, |
156 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 156 | 0x01a00d83, |
157 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 157 | 0x00003ffb, |
158 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 158 | 0x40800003, |
159 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 159 | 0x4020007f, |
160 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 160 | 0x35000000, |
161 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 161 | 0x00000000, |
162 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 162 | 0x00000000, |
163 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 163 | 0x00000000, |
164 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 164 | 0x00000000, |
165 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 165 | 0x00000000, |
166 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 166 | 0x00000000, |
167 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 167 | 0x00000000, |
168 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 168 | 0x00000000, |
169 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 169 | 0x00000000, |
170 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 170 | 0x00000000, |
171 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 171 | 0x00000000, |
172 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 172 | 0x00000000, |
173 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 173 | 0x00000000, |
174 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 174 | 0x00000000, |
175 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 175 | 0x00000000, |
176 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 176 | 0x00000000, |
177 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 177 | 0x00000000, |
178 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 178 | 0x00000000, |
179 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 179 | 0x00000000, |
180 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 180 | 0x00000000, |
181 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 181 | 0x00000000, |
182 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 182 | 0x00000000, |
183 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 183 | 0x00000000, |
184 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 184 | 0x00000000, |
185 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 185 | 0x00000000, |
186 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 186 | 0x00000000, |
187 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 187 | 0x00000000, |
188 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 188 | 0x00000000, |
189 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 189 | 0x00000000, |
190 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 190 | 0x00000000, |
191 | 0x00000000, | ||
192 | 0x00000000, | ||
193 | 0x00000000, | ||
194 | 0x00000000, | ||
195 | 0x00000000, | ||
196 | 0x00000000, | ||
197 | 0x00000000, | ||
198 | 0x00000000, | ||
199 | 0x00000000, | ||
200 | 0x00000000, | ||
201 | 0x00000000, | ||
202 | 0x00000000, | ||
203 | 0x00000000, | ||
204 | 0x00000000, | ||
205 | 0x00000000, | ||
206 | 0x00000000, | ||
207 | 0x00000000, | ||
208 | 0x00000000, | ||
209 | 0x00000000, | ||
210 | 0x00000000, | ||
211 | 0x00000000, | ||
212 | 0x00000000, | ||
213 | 0x00000000, | ||
214 | 0x00000000, | ||
215 | 0x00000000, | ||
216 | 0x00000000, | ||
217 | 0x00000000, | ||
218 | 0x00000000, | ||
219 | 0x00000000, | ||
220 | 0x00000000, | ||
221 | 0x00000000, | ||
222 | 0x00000000, | ||
223 | 0x00000000, | ||
224 | 0x00000000, | ||
225 | 0x00000000, | ||
226 | 0x00000000, | ||
227 | 0x00000000, | ||
228 | 0x00000000, | ||
229 | 0x00000000, | ||
230 | 0x00000000, | ||
231 | 0x00000000, | ||
232 | 0x00000000, | ||
233 | 0x00000000, | ||
234 | 0x00000000, | ||
235 | 0x00000000, | ||
236 | 0x00000000, | ||
237 | 0x00000000, | ||
238 | 0x00000000, | ||
239 | 0x00000000, | ||
240 | 0x00000000, | ||
241 | 0x00000000, | ||
242 | 0x00000000, | ||
243 | 0x00000000, | ||
244 | 0x00000000, | ||
245 | 0x00000000, | ||
246 | 0x00000000, | ||
247 | 0x00000000, | ||
248 | 0x00000000, | ||
249 | 0x00000000, | ||
250 | 0x00000000, | ||
251 | 0x00000000, | ||
252 | 0x00000000, | ||
253 | 0x00000000, | ||
254 | 0x00000000, | ||
255 | 0x00000000, | ||
256 | 0x00000000, | ||
257 | 0x00000000, | ||
258 | 0x00000000, | ||
259 | 0x00000000, | ||
260 | 0x00000000, | ||
261 | 0x00000000, | ||
262 | 0x00000000, | ||
263 | 0x00000000, | ||
264 | 0x00000000, | ||
265 | 0x00000000, | ||
266 | 0x00000000, | ||
267 | 0x00000000, | ||
268 | 0x00000000, | ||
269 | 0x00000000, | ||
270 | 0x00000000, | ||
271 | 0x00000000, | ||
272 | 0x00000000, | ||
273 | 0x00000000, | ||
274 | 0x00000000, | ||
275 | 0x00000000, | ||
276 | 0x00000000, | ||
277 | 0x00000000, | ||
278 | 0x00000000, | ||
279 | 0x00000000, | ||
280 | 0x00000000, | ||
281 | 0x00000000, | ||
282 | 0x00000000, | ||
283 | 0x00000000, | ||
284 | 0x00000000, | ||
285 | 0x00000000, | ||
286 | 0x00000000, | ||
287 | 0x00000000, | ||
288 | 0x00000000, | ||
289 | 0x00000000, | ||
290 | 0x00000000, | ||
291 | 0x00000000, | ||
292 | 0x00000000, | ||
293 | 0x00000000, | ||
294 | 0x00000000, | ||
295 | 0x00000000, | ||
296 | 0x00000000, | ||
297 | 0x00000000, | ||
298 | 0x00000000, | ||
299 | 0x00000000, | ||
300 | 0x00000000, | ||
301 | 0x00000000, | ||
302 | 0x00000000, | ||
303 | 0x00000000, | ||
304 | 0x00000000, | ||
305 | 0x00000000, | ||
306 | 0x00000000, | ||
307 | 0x00000000, | ||
308 | 0x00000000, | ||
309 | 0x00000000, | ||
310 | 0x00000000, | ||
311 | 0x00000000, | ||
312 | 0x00000000, | ||
313 | 0x00000000, | ||
314 | 0x00000000, | ||
315 | 0x00000000, | ||
316 | 0x00000000, | ||
317 | 0x00000000, | ||
318 | 0x00000000, | ||
319 | 0x00000000, | ||
320 | 0x00000000, | ||
321 | 0x00000000, | ||
322 | 0x00000000, | ||
323 | 0x00000000, | ||
324 | 0x00000000, | ||
325 | 0x00000000, | ||
326 | 0x00000000, | ||
327 | 0x00000000, | ||
328 | 0x00000000, | ||
329 | 0x00000000, | ||
330 | 0x00000000, | ||
331 | 0x00000000, | ||
332 | 0x00000000, | ||
333 | 0x00000000, | ||
334 | 0x00000000, | ||
335 | 0x00000000, | ||
336 | 0x00000000, | ||
337 | 0x00000000, | ||
338 | 0x00000000, | ||
339 | 0x00000000, | ||
340 | 0x00000000, | ||
341 | 0x00000000, | ||
342 | 0x00000000, | ||
343 | 0x00000000, | ||
344 | 0x00000000, | ||
345 | 0x00000000, | ||
346 | 0x00000000, | ||
347 | 0x00000000, | ||
348 | 0x00000000, | ||
349 | 0x00000000, | ||
350 | 0x00000000, | ||
351 | 0x00000000, | ||
352 | 0x00000000, | ||
353 | 0x00000000, | ||
354 | 0x00000000, | ||
355 | 0x00000000, | ||
356 | 0x00000000, | ||
357 | 0x00000000, | ||
358 | 0x00000000, | ||
359 | 0x00000000, | ||
360 | 0x00000000, | ||
361 | 0x00000000, | ||
362 | 0x00000000, | ||
363 | 0x00000000, | ||
364 | 0x00000000, | ||
365 | 0x00000000, | ||
366 | 0x00000000, | ||
367 | 0x00000000, | ||
368 | 0x00000000, | ||
369 | 0x00000000, | ||
370 | 0x00000000, | ||
371 | 0x00000000, | ||
372 | 0x00000000, | ||
373 | 0x00000000, | ||
374 | 0x00000000, | ||
375 | 0x00000000, | ||
376 | 0x00000000, | ||
377 | 0x00000000, | ||
378 | 0x00000000, | ||
379 | 0x00000000, | ||
380 | 0x00000000, | ||
381 | 0x00000000, | ||
382 | 0x00000000, | ||
383 | 0x00000000, | ||
384 | 0x00000000, | ||
385 | 0x00000000, | ||
386 | 0x00000000, | ||
387 | 0x00000000, | ||
388 | 0x00000000, | ||
389 | 0x00000000, | ||
390 | 0x00000000, | ||
391 | 0x00000000, | ||
392 | 0x00000000, | ||
393 | 0x00000000, | ||
394 | 0x00000000, | ||
395 | 0x00000000, | ||
396 | 0x00000000, | ||
397 | 0x00000000, | ||
398 | 0x00000000, | ||
399 | 0x00000000, | ||
400 | 0x00000000, | ||
401 | 0x00000000, | ||
402 | 0x00000000, | ||
403 | 0x00000000, | ||
404 | 0x00000000, | ||
405 | 0x00000000, | ||
406 | 0x00000000, | ||
407 | 0x00000000, | ||
408 | 0x00000000, | ||
409 | 0x00000000, | ||
410 | 0x00000000, | ||
411 | 0x00000000, | ||
412 | 0x00000000, | ||
413 | 0x00000000, | ||
414 | 0x00000000, | ||
415 | 0x00000000, | ||
416 | 0x00000000, | ||
417 | 0x00000000, | ||
418 | 0x00000000, | ||
419 | 0x00000000, | ||
420 | 0x00000000, | ||
421 | 0x00000000, | ||
422 | 0x00000000, | ||
423 | 0x00000000, | ||
424 | 0x00000000, | ||
425 | 0x00000000, | ||
426 | 0x00000000, | ||
427 | 0x00000000, | ||
428 | 0x00000000, | ||
429 | 0x00000000, | ||
430 | 0x00000000, | ||
431 | 0x00000000, | ||
432 | 0x00000000, | ||
433 | 0x00000000, | ||
434 | 0x00000000, | ||
435 | 0x00000000, | ||
436 | 0x00000000, | ||
437 | 0x00000000, | ||
438 | 0x00000000, | ||
439 | 0x00000000, | ||
440 | 0x00000000, | ||
441 | 0x00000000, | ||
442 | 0x00000000, | ||
443 | 0x00000000, | ||
444 | 0x00000000, | ||
445 | 0x00000000, | ||
446 | 0x00000000, | ||
447 | 0x00000000, | ||
448 | 0x00000000, | ||
449 | 0x00000000, | ||
450 | 0x00000000, | ||
451 | 0x00000000, | ||
452 | 0x00000000, | ||
453 | 0x00000000, | ||
454 | 0x00000000, | ||
455 | 0x00000000, | ||
456 | 0x00000000, | ||
457 | 0x00000000, | ||
458 | 0x00000000, | ||
459 | 0x00000000, | ||
460 | 0x00000000, | ||
461 | 0x00000000, | ||
462 | 0x00000000, | ||
463 | 0x00000000, | ||
464 | 0x00000000, | ||
465 | 0x00000000, | ||
466 | 0x00000000, | ||
467 | 0x00000000, | ||
468 | 0x00000000, | ||
469 | 0x00000000, | ||
470 | 0x00000000, | ||
471 | 0x00000000, | ||
472 | 0x00000000, | ||
473 | 0x00000000, | ||
474 | 0x00000000, | ||
475 | 0x00000000, | ||
476 | 0x00000000, | ||
477 | 0x00000000, | ||
478 | 0x00000000, | ||
479 | 0x00000000, | ||
480 | 0x00000000, | ||
481 | 0x00000000, | ||
482 | 0x00000000, | ||
483 | 0x00000000, | ||
484 | 0x00000000, | ||
485 | 0x00000000, | ||
486 | 0x00000000, | ||
487 | 0x00000000, | ||
488 | 0x00000000, | ||
489 | 0x00000000, | ||
490 | 0x00000000, | ||
491 | 0x00000000, | ||
492 | 0x00000000, | ||
493 | 0x00000000, | ||
494 | 0x00000000, | ||
495 | 0x00000000, | ||
496 | 0x00000000, | ||
497 | 0x00000000, | ||
498 | 0x00000000, | ||
499 | 0x00000000, | ||
500 | 0x00000000, | ||
501 | 0x00000000, | ||
502 | 0x00000000, | ||
503 | 0x00000000, | ||
504 | 0x00000000, | ||
505 | 0x00000000, | ||
506 | 0x00000000, | ||
507 | 0x00000000, | ||
508 | 0x00000000, | ||
509 | 0x00000000, | ||
510 | 0x00000000, | ||
511 | 0x00000000, | ||
512 | 0x00000000, | ||
513 | 0x00000000, | ||
514 | 0x00000000, | ||
515 | 0x00000000, | ||
516 | 0x00000000, | ||
517 | 0x00000000, | ||
518 | 0x00000000, | ||
519 | 0x00000000, | ||
520 | 0x00000000, | ||
521 | 0x00000000, | ||
522 | 0x00000000, | ||
523 | 0x00000000, | ||
524 | 0x00000000, | ||
525 | 0x00000000, | ||
526 | 0x00000000, | ||
527 | 0x00000000, | ||
528 | 0x00000000, | ||
529 | 0x00000000, | ||
530 | 0x00000000, | ||
531 | 0x00000000, | ||
532 | 0x00000000, | ||
533 | 0x00000000, | ||
534 | 0x00000000, | ||
535 | 0x00000000, | ||
536 | 0x00000000, | ||
537 | 0x00000000, | ||
538 | 0x00000000, | ||
539 | 0x00000000, | ||
540 | 0x00000000, | ||
541 | 0x00000000, | ||
542 | 0x00000000, | ||
543 | 0x00000000, | ||
544 | 0x00000000, | ||
545 | 0x00000000, | ||
546 | 0x00000000, | ||
547 | 0x00000000, | ||
548 | 0x00000000, | ||
549 | 0x00000000, | ||
550 | 0x00000000, | ||
551 | 0x00000000, | ||
552 | 0x00000000, | ||
553 | 0x00000000, | ||
554 | 0x00000000, | ||
555 | 0x00000000, | ||
556 | 0x00000000, | ||
557 | 0x00000000, | ||
558 | 0x00000000, | ||
559 | 0x00000000, | ||
560 | 0x00000000, | ||
561 | 0x00000000, | ||
562 | 0x00000000, | ||
563 | 0x00000000, | ||
564 | 0x00000000, | ||
565 | 0x00000000, | ||
566 | 0x00000000, | ||
567 | 0x00000000, | ||
568 | 0x00000000, | ||
569 | 0x00000000, | ||
570 | 0x00000000, | ||
571 | 0x00000000, | ||
572 | 0x00000000, | ||
573 | 0x00000000, | ||
574 | 0x00000000, | ||
575 | 0x00000000, | ||
576 | 0x00000000, | ||
577 | 0x00000000, | ||
578 | 0x00000000, | ||
579 | 0x00000000, | ||
580 | 0x00000000, | ||
581 | 0x00000000, | ||
582 | 0x00000000, | ||
583 | 0x00000000, | ||
584 | 0x00000000, | ||
585 | 0x00000000, | ||
586 | 0x00000000, | ||
587 | 0x00000000, | ||
588 | 0x00000000, | ||
589 | 0x00000000, | ||
590 | 0x00000000, | ||
591 | 0x00000000, | ||
592 | 0x00000000, | ||
593 | 0x00000000, | ||
594 | 0x00000000, | ||
595 | 0x00000000, | ||
596 | 0x00000000, | ||
597 | 0x00000000, | ||
598 | 0x00000000, | ||
599 | 0x00000000, | ||
600 | 0x00000000, | ||
601 | 0x00000000, | ||
602 | 0x00000000, | ||
603 | 0x00000000, | ||
604 | 0x00000000, | ||
605 | 0x00000000, | ||
606 | 0x00000000, | ||
607 | 0x00000000, | ||
608 | 0x00000000, | ||
609 | 0x00000000, | ||
610 | 0x00000000, | ||
611 | 0x00000000, | ||
612 | 0x00000000, | ||
613 | 0x00000000, | ||
614 | 0x00000000, | ||
615 | 0x00000000, | ||
616 | 0x00000000, | ||
617 | 0x00000000, | ||
618 | 0x00000000, | ||
619 | 0x00000000, | ||
620 | 0x00000000, | ||
621 | 0x00000000, | ||
622 | 0x00000000, | ||
623 | 0x00000000, | ||
624 | 0x00000000, | ||
625 | 0x00000000, | ||
626 | 0x00000000, | ||
627 | 0x00000000, | ||
628 | 0x00000000, | ||
629 | 0x00000000, | ||
630 | 0x00000000, | ||
631 | 0x00000000, | ||
632 | 0x00000000, | ||
633 | 0x00000000, | ||
634 | 0x00000000, | ||
635 | 0x00000000, | ||
636 | 0x00000000, | ||
637 | 0x00000000, | ||
638 | 0x00000000, | ||
639 | 0x00000000, | ||
640 | 0x00000000, | ||
641 | 0x00000000, | ||
642 | 0x00000000, | ||
643 | 0x00000000, | ||
644 | 0x00000000, | ||
645 | 0x00000000, | ||
646 | 0x00000000, | ||
647 | 0x00000000, | ||
648 | 0x00000000, | ||
649 | 0x00000000, | ||
650 | 0x00000000, | ||
651 | 0x00000000, | ||
652 | 0x00000000, | ||
653 | 0x00000000, | ||
654 | 0x00000000, | ||
655 | 0x00000000, | ||
656 | 0x00000000, | ||
657 | 0x00000000, | ||
658 | 0x00000000, | ||
659 | 0x00000000, | ||
660 | 0x00000000, | ||
661 | 0x00000000, | ||
662 | 0x00000000, | ||
663 | 0x00000000, | ||
664 | 0x00000000, | ||
665 | 0x00000000, | ||
666 | 0x00000000, | ||
667 | 0x00000000, | ||
668 | 0x00000000, | ||
669 | 0x00000000, | ||
670 | 0x00000000, | ||
671 | 0x00000000, | ||
672 | 0x00000000, | ||
673 | 0x00000000, | ||
674 | 0x00000000, | ||
675 | 0x00000000, | ||
676 | 0x00000000, | ||
677 | 0x00000000, | ||
678 | 0x00000000, | ||
679 | 0x00000000, | ||
680 | 0x00000000, | ||
681 | 0x00000000, | ||
682 | 0x00000000, | ||
683 | 0x00000000, | ||
684 | 0x00000000, | ||
685 | 0x00000000, | ||
686 | 0x00000000, | ||
687 | 0x00000000, | ||
688 | 0x00000000, | ||
689 | 0x00000000, | ||
690 | 0x00000000, | ||
691 | 0x00000000, | ||
692 | 0x00000000, | ||
693 | 0x00000000, | ||
694 | 0x00000000, | ||
695 | 0x00000000, | ||
696 | 0x00000000, | ||
697 | 0x00000000, | ||
698 | 0x00000000, | ||
699 | 0x00000000, | ||
700 | 0x00000000, | ||
701 | 0x00000000, | ||
702 | 0x00000000, | ||
703 | 0x00000000, | ||
704 | 0x00000000, | ||
705 | 0x00000000, | ||
706 | 0x00000000, | ||
707 | 0x00000000, | ||
708 | 0x00000000, | ||
709 | 0x00000000, | ||
710 | 0x00000000, | ||
711 | 0x00000000, | ||
712 | 0x00000000, | ||
713 | 0x00000000, | ||
714 | 0x00000000, | ||
715 | 0x00000000, | ||
716 | 0x00000000, | ||
717 | 0x00000000, | ||
718 | 0x00000000, | ||
719 | 0x00000000, | ||
720 | 0x00000000, | ||
721 | 0x00000000, | ||
722 | 0x00000000, | ||
723 | 0x00000000, | ||
724 | 0x00000000, | ||
725 | 0x00000000, | ||
726 | 0x00000000, | ||
727 | 0x00000000, | ||
728 | 0x00000000, | ||
729 | 0x00000000, | ||
730 | 0x00000000, | ||
731 | 0x00000000, | ||
732 | 0x00000000, | ||
733 | 0x00000000, | ||
734 | 0x00000000, | ||
735 | 0x00000000, | ||
736 | 0x00000000, | ||
737 | 0x00000000, | ||
738 | 0x00000000, | ||
739 | 0x00000000, | ||
740 | 0x00000000, | ||
741 | 0x00000000, | ||
742 | 0x00000000, | ||
191 | }; | 743 | }; |
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c index 1726bfe38ee0..b30e55dab832 100644 --- a/arch/powerpc/platforms/cell/spufs/switch.c +++ b/arch/powerpc/platforms/cell/spufs/switch.c | |||
@@ -46,6 +46,7 @@ | |||
46 | 46 | ||
47 | #include <asm/io.h> | 47 | #include <asm/io.h> |
48 | #include <asm/spu.h> | 48 | #include <asm/spu.h> |
49 | #include <asm/spu_priv1.h> | ||
49 | #include <asm/spu_csa.h> | 50 | #include <asm/spu_csa.h> |
50 | #include <asm/mmu_context.h> | 51 | #include <asm/mmu_context.h> |
51 | 52 | ||
@@ -622,12 +623,17 @@ static inline void save_ppuint_mb(struct spu_state *csa, struct spu *spu) | |||
622 | static inline void save_ch_part1(struct spu_state *csa, struct spu *spu) | 623 | static inline void save_ch_part1(struct spu_state *csa, struct spu *spu) |
623 | { | 624 | { |
624 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 625 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
625 | u64 idx, ch_indices[7] = { 0UL, 1UL, 3UL, 4UL, 24UL, 25UL, 27UL }; | 626 | u64 idx, ch_indices[7] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; |
626 | int i; | 627 | int i; |
627 | 628 | ||
628 | /* Save, Step 42: | 629 | /* Save, Step 42: |
629 | * Save the following CH: [0,1,3,4,24,25,27] | ||
630 | */ | 630 | */ |
631 | |||
632 | /* Save CH 1, without channel count */ | ||
633 | out_be64(&priv2->spu_chnlcntptr_RW, 1); | ||
634 | csa->spu_chnldata_RW[1] = in_be64(&priv2->spu_chnldata_RW); | ||
635 | |||
636 | /* Save the following CH: [0,3,4,24,25,27] */ | ||
631 | for (i = 0; i < 7; i++) { | 637 | for (i = 0; i < 7; i++) { |
632 | idx = ch_indices[i]; | 638 | idx = ch_indices[i]; |
633 | out_be64(&priv2->spu_chnlcntptr_RW, idx); | 639 | out_be64(&priv2->spu_chnlcntptr_RW, idx); |
@@ -718,13 +724,15 @@ static inline void invalidate_slbs(struct spu_state *csa, struct spu *spu) | |||
718 | 724 | ||
719 | static inline void get_kernel_slb(u64 ea, u64 slb[2]) | 725 | static inline void get_kernel_slb(u64 ea, u64 slb[2]) |
720 | { | 726 | { |
721 | slb[0] = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | SLB_VSID_KERNEL; | 727 | u64 llp; |
722 | slb[1] = (ea & ESID_MASK) | SLB_ESID_V; | ||
723 | 728 | ||
724 | /* Large pages are used for kernel text/data, but not vmalloc. */ | 729 | if (REGION_ID(ea) == KERNEL_REGION_ID) |
725 | if (cpu_has_feature(CPU_FTR_16M_PAGE) | 730 | llp = mmu_psize_defs[mmu_linear_psize].sllp; |
726 | && REGION_ID(ea) == KERNEL_REGION_ID) | 731 | else |
727 | slb[0] |= SLB_VSID_L; | 732 | llp = mmu_psize_defs[mmu_virtual_psize].sllp; |
733 | slb[0] = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | | ||
734 | SLB_VSID_KERNEL | llp; | ||
735 | slb[1] = (ea & ESID_MASK) | SLB_ESID_V; | ||
728 | } | 736 | } |
729 | 737 | ||
730 | static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe) | 738 | static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe) |
@@ -1103,13 +1111,18 @@ static inline void clear_spu_status(struct spu_state *csa, struct spu *spu) | |||
1103 | static inline void reset_ch_part1(struct spu_state *csa, struct spu *spu) | 1111 | static inline void reset_ch_part1(struct spu_state *csa, struct spu *spu) |
1104 | { | 1112 | { |
1105 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 1113 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
1106 | u64 ch_indices[7] = { 0UL, 1UL, 3UL, 4UL, 24UL, 25UL, 27UL }; | 1114 | u64 ch_indices[7] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; |
1107 | u64 idx; | 1115 | u64 idx; |
1108 | int i; | 1116 | int i; |
1109 | 1117 | ||
1110 | /* Restore, Step 20: | 1118 | /* Restore, Step 20: |
1111 | * Reset the following CH: [0,1,3,4,24,25,27] | ||
1112 | */ | 1119 | */ |
1120 | |||
1121 | /* Reset CH 1 */ | ||
1122 | out_be64(&priv2->spu_chnlcntptr_RW, 1); | ||
1123 | out_be64(&priv2->spu_chnldata_RW, 0UL); | ||
1124 | |||
1125 | /* Reset the following CH: [0,3,4,24,25,27] */ | ||
1113 | for (i = 0; i < 7; i++) { | 1126 | for (i = 0; i < 7; i++) { |
1114 | idx = ch_indices[i]; | 1127 | idx = ch_indices[i]; |
1115 | out_be64(&priv2->spu_chnlcntptr_RW, idx); | 1128 | out_be64(&priv2->spu_chnlcntptr_RW, idx); |
@@ -1570,12 +1583,17 @@ static inline void restore_decr_wrapped(struct spu_state *csa, struct spu *spu) | |||
1570 | static inline void restore_ch_part1(struct spu_state *csa, struct spu *spu) | 1583 | static inline void restore_ch_part1(struct spu_state *csa, struct spu *spu) |
1571 | { | 1584 | { |
1572 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 1585 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
1573 | u64 idx, ch_indices[7] = { 0UL, 1UL, 3UL, 4UL, 24UL, 25UL, 27UL }; | 1586 | u64 idx, ch_indices[7] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; |
1574 | int i; | 1587 | int i; |
1575 | 1588 | ||
1576 | /* Restore, Step 59: | 1589 | /* Restore, Step 59: |
1577 | * Restore the following CH: [0,1,3,4,24,25,27] | ||
1578 | */ | 1590 | */ |
1591 | |||
1592 | /* Restore CH 1 without count */ | ||
1593 | out_be64(&priv2->spu_chnlcntptr_RW, 1); | ||
1594 | out_be64(&priv2->spu_chnldata_RW, csa->spu_chnldata_RW[1]); | ||
1595 | |||
1596 | /* Restore the following CH: [0,3,4,24,25,27] */ | ||
1579 | for (i = 0; i < 7; i++) { | 1597 | for (i = 0; i < 7; i++) { |
1580 | idx = ch_indices[i]; | 1598 | idx = ch_indices[i]; |
1581 | out_be64(&priv2->spu_chnlcntptr_RW, idx); | 1599 | out_be64(&priv2->spu_chnlcntptr_RW, idx); |
@@ -2074,6 +2092,7 @@ int spu_save(struct spu_state *prev, struct spu *spu) | |||
2074 | } | 2092 | } |
2075 | return rc; | 2093 | return rc; |
2076 | } | 2094 | } |
2095 | EXPORT_SYMBOL_GPL(spu_save); | ||
2077 | 2096 | ||
2078 | /** | 2097 | /** |
2079 | * spu_restore - SPU context restore, with harvest and locking. | 2098 | * spu_restore - SPU context restore, with harvest and locking. |
@@ -2090,7 +2109,6 @@ int spu_restore(struct spu_state *new, struct spu *spu) | |||
2090 | 2109 | ||
2091 | acquire_spu_lock(spu); | 2110 | acquire_spu_lock(spu); |
2092 | harvest(NULL, spu); | 2111 | harvest(NULL, spu); |
2093 | spu->stop_code = 0; | ||
2094 | spu->dar = 0; | 2112 | spu->dar = 0; |
2095 | spu->dsisr = 0; | 2113 | spu->dsisr = 0; |
2096 | spu->slb_replace = 0; | 2114 | spu->slb_replace = 0; |
@@ -2103,6 +2121,7 @@ int spu_restore(struct spu_state *new, struct spu *spu) | |||
2103 | } | 2121 | } |
2104 | return rc; | 2122 | return rc; |
2105 | } | 2123 | } |
2124 | EXPORT_SYMBOL_GPL(spu_restore); | ||
2106 | 2125 | ||
2107 | /** | 2126 | /** |
2108 | * spu_harvest - SPU harvest (reset) operation | 2127 | * spu_harvest - SPU harvest (reset) operation |
@@ -2125,6 +2144,7 @@ static void init_prob(struct spu_state *csa) | |||
2125 | csa->spu_chnlcnt_RW[28] = 1; | 2144 | csa->spu_chnlcnt_RW[28] = 1; |
2126 | csa->spu_chnlcnt_RW[30] = 1; | 2145 | csa->spu_chnlcnt_RW[30] = 1; |
2127 | csa->prob.spu_runcntl_RW = SPU_RUNCNTL_STOP; | 2146 | csa->prob.spu_runcntl_RW = SPU_RUNCNTL_STOP; |
2147 | csa->prob.mb_stat_R = 0x000400; | ||
2128 | } | 2148 | } |
2129 | 2149 | ||
2130 | static void init_priv1(struct spu_state *csa) | 2150 | static void init_priv1(struct spu_state *csa) |
@@ -2193,6 +2213,7 @@ void spu_init_csa(struct spu_state *csa) | |||
2193 | init_priv1(csa); | 2213 | init_priv1(csa); |
2194 | init_priv2(csa); | 2214 | init_priv2(csa); |
2195 | } | 2215 | } |
2216 | EXPORT_SYMBOL_GPL(spu_init_csa); | ||
2196 | 2217 | ||
2197 | void spu_fini_csa(struct spu_state *csa) | 2218 | void spu_fini_csa(struct spu_state *csa) |
2198 | { | 2219 | { |
@@ -2203,3 +2224,4 @@ void spu_fini_csa(struct spu_state *csa) | |||
2203 | 2224 | ||
2204 | vfree(csa->lscsa); | 2225 | vfree(csa->lscsa); |
2205 | } | 2226 | } |
2227 | EXPORT_SYMBOL_GPL(spu_fini_csa); | ||
diff --git a/arch/powerpc/platforms/iseries/Makefile b/arch/powerpc/platforms/iseries/Makefile index ce8c0b943fa0..dee4eb4d8bec 100644 --- a/arch/powerpc/platforms/iseries/Makefile +++ b/arch/powerpc/platforms/iseries/Makefile | |||
@@ -1,9 +1,11 @@ | |||
1 | EXTRA_CFLAGS += -mno-minimal-toc | 1 | EXTRA_CFLAGS += -mno-minimal-toc |
2 | 2 | ||
3 | obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o mf.o lpevents.o \ | 3 | obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \ |
4 | hvcall.o proc.o htab.o iommu.o misc.o irq.o | 4 | hvcall.o proc.o htab.o iommu.o misc.o irq.o |
5 | obj-$(CONFIG_PCI) += pci.o vpdinfo.o | 5 | obj-$(CONFIG_PCI) += pci.o vpdinfo.o |
6 | obj-$(CONFIG_IBMVIO) += vio.o | ||
7 | obj-$(CONFIG_SMP) += smp.o | 6 | obj-$(CONFIG_SMP) += smp.o |
8 | obj-$(CONFIG_VIOPATH) += viopath.o | 7 | obj-$(CONFIG_VIOPATH) += viopath.o |
9 | obj-$(CONFIG_MODULES) += ksyms.o | 8 | obj-$(CONFIG_MODULES) += ksyms.o |
9 | |||
10 | $(obj)/dt_mod.o: $(obj)/dt.o | ||
11 | @$(OBJCOPY) --rename-section .rodata.str1.8=.dt_strings $(obj)/dt.o $(obj)/dt_mod.o | ||
diff --git a/arch/powerpc/platforms/iseries/call_pci.h b/arch/powerpc/platforms/iseries/call_pci.h index 59d4e0ad5cf3..dbdf69850ed9 100644 --- a/arch/powerpc/platforms/iseries/call_pci.h +++ b/arch/powerpc/platforms/iseries/call_pci.h | |||
@@ -145,6 +145,25 @@ static inline u64 HvCallPci_configLoad16(u16 busNumber, u8 subBusNumber, | |||
145 | return retVal.rc; | 145 | return retVal.rc; |
146 | } | 146 | } |
147 | 147 | ||
148 | static inline u64 HvCallPci_configLoad32(u16 busNumber, u8 subBusNumber, | ||
149 | u8 deviceId, u32 offset, u32 *value) | ||
150 | { | ||
151 | struct HvCallPci_DsaAddr dsa; | ||
152 | struct HvCallPci_LoadReturn retVal; | ||
153 | |||
154 | *((u64*)&dsa) = 0; | ||
155 | |||
156 | dsa.busNumber = busNumber; | ||
157 | dsa.subBusNumber = subBusNumber; | ||
158 | dsa.deviceId = deviceId; | ||
159 | |||
160 | HvCall3Ret16(HvCallPciConfigLoad32, &retVal, *(u64 *)&dsa, offset, 0); | ||
161 | |||
162 | *value = retVal.value; | ||
163 | |||
164 | return retVal.rc; | ||
165 | } | ||
166 | |||
148 | static inline u64 HvCallPci_configStore8(u16 busNumber, u8 subBusNumber, | 167 | static inline u64 HvCallPci_configStore8(u16 busNumber, u8 subBusNumber, |
149 | u8 deviceId, u32 offset, u8 value) | 168 | u8 deviceId, u32 offset, u8 value) |
150 | { | 169 | { |
diff --git a/arch/powerpc/platforms/iseries/dt.c b/arch/powerpc/platforms/iseries/dt.c new file mode 100644 index 000000000000..d3444aabe76e --- /dev/null +++ b/arch/powerpc/platforms/iseries/dt.c | |||
@@ -0,0 +1,615 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2006 Michael Ellerman, IBM Corporation | ||
3 | * | ||
4 | * Description: | ||
5 | * This file contains all the routines to build a flattened device | ||
6 | * tree for a legacy iSeries machine. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #undef DEBUG | ||
15 | |||
16 | #include <linux/types.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/pci.h> | ||
19 | #include <linux/pci_regs.h> | ||
20 | #include <linux/pci_ids.h> | ||
21 | #include <linux/threads.h> | ||
22 | #include <linux/bitops.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/if_ether.h> /* ETH_ALEN */ | ||
26 | |||
27 | #include <asm/machdep.h> | ||
28 | #include <asm/prom.h> | ||
29 | #include <asm/lppaca.h> | ||
30 | #include <asm/cputable.h> | ||
31 | #include <asm/abs_addr.h> | ||
32 | #include <asm/system.h> | ||
33 | #include <asm/iseries/hv_types.h> | ||
34 | #include <asm/iseries/hv_lp_config.h> | ||
35 | #include <asm/iseries/hv_call_xm.h> | ||
36 | #include <asm/iseries/it_exp_vpd_panel.h> | ||
37 | #include <asm/udbg.h> | ||
38 | |||
39 | #include "processor_vpd.h" | ||
40 | #include "call_hpt.h" | ||
41 | #include "call_pci.h" | ||
42 | #include "pci.h" | ||
43 | |||
44 | #ifdef DEBUG | ||
45 | #define DBG(fmt...) udbg_printf(fmt) | ||
46 | #else | ||
47 | #define DBG(fmt...) | ||
48 | #endif | ||
49 | |||
50 | /* | ||
51 | * These are created by the linker script at the start and end | ||
52 | * of the section containing all the strings from this file. | ||
53 | */ | ||
54 | extern char __dt_strings_start[]; | ||
55 | extern char __dt_strings_end[]; | ||
56 | |||
57 | struct iseries_flat_dt { | ||
58 | struct boot_param_header header; | ||
59 | u64 reserve_map[2]; | ||
60 | }; | ||
61 | |||
62 | static void * __initdata dt_data; | ||
63 | |||
64 | /* | ||
65 | * Putting these strings here keeps them out of the section | ||
66 | * that we rename to .dt_strings using objcopy and capture | ||
67 | * for the strings blob of the flattened device tree. | ||
68 | */ | ||
69 | static char __initdata device_type_cpu[] = "cpu"; | ||
70 | static char __initdata device_type_memory[] = "memory"; | ||
71 | static char __initdata device_type_serial[] = "serial"; | ||
72 | static char __initdata device_type_network[] = "network"; | ||
73 | static char __initdata device_type_block[] = "block"; | ||
74 | static char __initdata device_type_byte[] = "byte"; | ||
75 | static char __initdata device_type_pci[] = "pci"; | ||
76 | static char __initdata device_type_vdevice[] = "vdevice"; | ||
77 | static char __initdata device_type_vscsi[] = "vscsi"; | ||
78 | |||
79 | static struct iseries_flat_dt * __init dt_init(void) | ||
80 | { | ||
81 | struct iseries_flat_dt *dt; | ||
82 | unsigned long str_len; | ||
83 | |||
84 | str_len = __dt_strings_end - __dt_strings_start; | ||
85 | dt = (struct iseries_flat_dt *)ALIGN(klimit, 8); | ||
86 | dt->header.off_mem_rsvmap = | ||
87 | offsetof(struct iseries_flat_dt, reserve_map); | ||
88 | dt->header.off_dt_strings = ALIGN(sizeof(*dt), 8); | ||
89 | dt->header.off_dt_struct = dt->header.off_dt_strings | ||
90 | + ALIGN(str_len, 8); | ||
91 | dt_data = (void *)((unsigned long)dt + dt->header.off_dt_struct); | ||
92 | dt->header.dt_strings_size = str_len; | ||
93 | |||
94 | /* There is no notion of hardware cpu id on iSeries */ | ||
95 | dt->header.boot_cpuid_phys = smp_processor_id(); | ||
96 | |||
97 | memcpy((char *)dt + dt->header.off_dt_strings, __dt_strings_start, | ||
98 | str_len); | ||
99 | |||
100 | dt->header.magic = OF_DT_HEADER; | ||
101 | dt->header.version = 0x10; | ||
102 | dt->header.last_comp_version = 0x10; | ||
103 | |||
104 | dt->reserve_map[0] = 0; | ||
105 | dt->reserve_map[1] = 0; | ||
106 | |||
107 | return dt; | ||
108 | } | ||
109 | |||
110 | static void __init dt_push_u32(struct iseries_flat_dt *dt, u32 value) | ||
111 | { | ||
112 | *((u32 *)dt_data) = value; | ||
113 | dt_data += sizeof(u32); | ||
114 | } | ||
115 | |||
116 | #ifdef notyet | ||
117 | static void __init dt_push_u64(struct iseries_flat_dt *dt, u64 value) | ||
118 | { | ||
119 | *((u64 *)dt_data) = value; | ||
120 | dt_data += sizeof(u64); | ||
121 | } | ||
122 | #endif | ||
123 | |||
124 | static void __init dt_push_bytes(struct iseries_flat_dt *dt, const char *data, | ||
125 | int len) | ||
126 | { | ||
127 | memcpy(dt_data, data, len); | ||
128 | dt_data += ALIGN(len, 4); | ||
129 | } | ||
130 | |||
131 | static void __init dt_start_node(struct iseries_flat_dt *dt, const char *name) | ||
132 | { | ||
133 | dt_push_u32(dt, OF_DT_BEGIN_NODE); | ||
134 | dt_push_bytes(dt, name, strlen(name) + 1); | ||
135 | } | ||
136 | |||
137 | #define dt_end_node(dt) dt_push_u32(dt, OF_DT_END_NODE) | ||
138 | |||
139 | static void __init dt_prop(struct iseries_flat_dt *dt, const char *name, | ||
140 | const void *data, int len) | ||
141 | { | ||
142 | unsigned long offset; | ||
143 | |||
144 | dt_push_u32(dt, OF_DT_PROP); | ||
145 | |||
146 | /* Length of the data */ | ||
147 | dt_push_u32(dt, len); | ||
148 | |||
149 | offset = name - __dt_strings_start; | ||
150 | |||
151 | /* The offset of the properties name in the string blob. */ | ||
152 | dt_push_u32(dt, (u32)offset); | ||
153 | |||
154 | /* The actual data. */ | ||
155 | dt_push_bytes(dt, data, len); | ||
156 | } | ||
157 | |||
158 | static void __init dt_prop_str(struct iseries_flat_dt *dt, const char *name, | ||
159 | const char *data) | ||
160 | { | ||
161 | dt_prop(dt, name, data, strlen(data) + 1); /* + 1 for NULL */ | ||
162 | } | ||
163 | |||
164 | static void __init dt_prop_u32(struct iseries_flat_dt *dt, const char *name, | ||
165 | u32 data) | ||
166 | { | ||
167 | dt_prop(dt, name, &data, sizeof(u32)); | ||
168 | } | ||
169 | |||
170 | #ifdef notyet | ||
171 | static void __init dt_prop_u64(struct iseries_flat_dt *dt, const char *name, | ||
172 | u64 data) | ||
173 | { | ||
174 | dt_prop(dt, name, &data, sizeof(u64)); | ||
175 | } | ||
176 | #endif | ||
177 | |||
178 | static void __init dt_prop_u64_list(struct iseries_flat_dt *dt, | ||
179 | const char *name, u64 *data, int n) | ||
180 | { | ||
181 | dt_prop(dt, name, data, sizeof(u64) * n); | ||
182 | } | ||
183 | |||
184 | static void __init dt_prop_u32_list(struct iseries_flat_dt *dt, | ||
185 | const char *name, u32 *data, int n) | ||
186 | { | ||
187 | dt_prop(dt, name, data, sizeof(u32) * n); | ||
188 | } | ||
189 | |||
190 | #ifdef notyet | ||
191 | static void __init dt_prop_empty(struct iseries_flat_dt *dt, const char *name) | ||
192 | { | ||
193 | dt_prop(dt, name, NULL, 0); | ||
194 | } | ||
195 | #endif | ||
196 | |||
197 | static void __init dt_cpus(struct iseries_flat_dt *dt) | ||
198 | { | ||
199 | unsigned char buf[32]; | ||
200 | unsigned char *p; | ||
201 | unsigned int i, index; | ||
202 | struct IoHriProcessorVpd *d; | ||
203 | u32 pft_size[2]; | ||
204 | |||
205 | /* yuck */ | ||
206 | snprintf(buf, 32, "PowerPC,%s", cur_cpu_spec->cpu_name); | ||
207 | p = strchr(buf, ' '); | ||
208 | if (!p) p = buf + strlen(buf); | ||
209 | |||
210 | dt_start_node(dt, "cpus"); | ||
211 | dt_prop_u32(dt, "#address-cells", 1); | ||
212 | dt_prop_u32(dt, "#size-cells", 0); | ||
213 | |||
214 | pft_size[0] = 0; /* NUMA CEC cookie, 0 for non NUMA */ | ||
215 | pft_size[1] = __ilog2(HvCallHpt_getHptPages() * HW_PAGE_SIZE); | ||
216 | |||
217 | for (i = 0; i < NR_CPUS; i++) { | ||
218 | if (lppaca[i].dyn_proc_status >= 2) | ||
219 | continue; | ||
220 | |||
221 | snprintf(p, 32 - (p - buf), "@%d", i); | ||
222 | dt_start_node(dt, buf); | ||
223 | |||
224 | dt_prop_str(dt, "device_type", device_type_cpu); | ||
225 | |||
226 | index = lppaca[i].dyn_hv_phys_proc_index; | ||
227 | d = &xIoHriProcessorVpd[index]; | ||
228 | |||
229 | dt_prop_u32(dt, "i-cache-size", d->xInstCacheSize * 1024); | ||
230 | dt_prop_u32(dt, "i-cache-line-size", d->xInstCacheOperandSize); | ||
231 | |||
232 | dt_prop_u32(dt, "d-cache-size", d->xDataL1CacheSizeKB * 1024); | ||
233 | dt_prop_u32(dt, "d-cache-line-size", d->xDataCacheOperandSize); | ||
234 | |||
235 | /* magic conversions to Hz copied from old code */ | ||
236 | dt_prop_u32(dt, "clock-frequency", | ||
237 | ((1UL << 34) * 1000000) / d->xProcFreq); | ||
238 | dt_prop_u32(dt, "timebase-frequency", | ||
239 | ((1UL << 32) * 1000000) / d->xTimeBaseFreq); | ||
240 | |||
241 | dt_prop_u32(dt, "reg", i); | ||
242 | |||
243 | dt_prop_u32_list(dt, "ibm,pft-size", pft_size, 2); | ||
244 | |||
245 | dt_end_node(dt); | ||
246 | } | ||
247 | |||
248 | dt_end_node(dt); | ||
249 | } | ||
250 | |||
251 | static void __init dt_model(struct iseries_flat_dt *dt) | ||
252 | { | ||
253 | char buf[16] = "IBM,"; | ||
254 | |||
255 | /* "IBM," + mfgId[2:3] + systemSerial[1:5] */ | ||
256 | strne2a(buf + 4, xItExtVpdPanel.mfgID + 2, 2); | ||
257 | strne2a(buf + 6, xItExtVpdPanel.systemSerial + 1, 5); | ||
258 | buf[11] = '\0'; | ||
259 | dt_prop_str(dt, "system-id", buf); | ||
260 | |||
261 | /* "IBM," + machineType[0:4] */ | ||
262 | strne2a(buf + 4, xItExtVpdPanel.machineType, 4); | ||
263 | buf[8] = '\0'; | ||
264 | dt_prop_str(dt, "model", buf); | ||
265 | |||
266 | dt_prop_str(dt, "compatible", "IBM,iSeries"); | ||
267 | } | ||
268 | |||
269 | static void __init dt_do_vdevice(struct iseries_flat_dt *dt, | ||
270 | const char *name, u32 reg, int unit, | ||
271 | const char *type, const char *compat, int end) | ||
272 | { | ||
273 | char buf[32]; | ||
274 | |||
275 | snprintf(buf, 32, "%s@%08x", name, reg + ((unit >= 0) ? unit : 0)); | ||
276 | dt_start_node(dt, buf); | ||
277 | dt_prop_str(dt, "device_type", type); | ||
278 | if (compat) | ||
279 | dt_prop_str(dt, "compatible", compat); | ||
280 | dt_prop_u32(dt, "reg", reg + ((unit >= 0) ? unit : 0)); | ||
281 | if (unit >= 0) | ||
282 | dt_prop_u32(dt, "linux,unit_address", unit); | ||
283 | if (end) | ||
284 | dt_end_node(dt); | ||
285 | } | ||
286 | |||
287 | static void __init dt_vdevices(struct iseries_flat_dt *dt) | ||
288 | { | ||
289 | u32 reg = 0; | ||
290 | HvLpIndexMap vlan_map; | ||
291 | int i; | ||
292 | |||
293 | dt_start_node(dt, "vdevice"); | ||
294 | dt_prop_str(dt, "device_type", device_type_vdevice); | ||
295 | dt_prop_str(dt, "compatible", "IBM,iSeries-vdevice"); | ||
296 | dt_prop_u32(dt, "#address-cells", 1); | ||
297 | dt_prop_u32(dt, "#size-cells", 0); | ||
298 | |||
299 | dt_do_vdevice(dt, "vty", reg, -1, device_type_serial, NULL, 1); | ||
300 | reg++; | ||
301 | |||
302 | dt_do_vdevice(dt, "v-scsi", reg, -1, device_type_vscsi, | ||
303 | "IBM,v-scsi", 1); | ||
304 | reg++; | ||
305 | |||
306 | vlan_map = HvLpConfig_getVirtualLanIndexMap(); | ||
307 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) { | ||
308 | unsigned char mac_addr[ETH_ALEN]; | ||
309 | |||
310 | if ((vlan_map & (0x8000 >> i)) == 0) | ||
311 | continue; | ||
312 | dt_do_vdevice(dt, "l-lan", reg, i, device_type_network, | ||
313 | "IBM,iSeries-l-lan", 0); | ||
314 | mac_addr[0] = 0x02; | ||
315 | mac_addr[1] = 0x01; | ||
316 | mac_addr[2] = 0xff; | ||
317 | mac_addr[3] = i; | ||
318 | mac_addr[4] = 0xff; | ||
319 | mac_addr[5] = HvLpConfig_getLpIndex_outline(); | ||
320 | dt_prop(dt, "local-mac-address", (char *)mac_addr, ETH_ALEN); | ||
321 | dt_prop(dt, "mac-address", (char *)mac_addr, ETH_ALEN); | ||
322 | dt_prop_u32(dt, "max-frame-size", 9000); | ||
323 | dt_prop_u32(dt, "address-bits", 48); | ||
324 | |||
325 | dt_end_node(dt); | ||
326 | } | ||
327 | reg += HVMAXARCHITECTEDVIRTUALLANS; | ||
328 | |||
329 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALDISKS; i++) | ||
330 | dt_do_vdevice(dt, "viodasd", reg, i, device_type_block, | ||
331 | "IBM,iSeries-viodasd", 1); | ||
332 | reg += HVMAXARCHITECTEDVIRTUALDISKS; | ||
333 | |||
334 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALCDROMS; i++) | ||
335 | dt_do_vdevice(dt, "viocd", reg, i, device_type_block, | ||
336 | "IBM,iSeries-viocd", 1); | ||
337 | reg += HVMAXARCHITECTEDVIRTUALCDROMS; | ||
338 | |||
339 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALTAPES; i++) | ||
340 | dt_do_vdevice(dt, "viotape", reg, i, device_type_byte, | ||
341 | "IBM,iSeries-viotape", 1); | ||
342 | |||
343 | dt_end_node(dt); | ||
344 | } | ||
345 | |||
346 | struct pci_class_name { | ||
347 | u16 code; | ||
348 | const char *name; | ||
349 | const char *type; | ||
350 | }; | ||
351 | |||
352 | static struct pci_class_name __initdata pci_class_name[] = { | ||
353 | { PCI_CLASS_NETWORK_ETHERNET, "ethernet", device_type_network }, | ||
354 | }; | ||
355 | |||
356 | static struct pci_class_name * __init dt_find_pci_class_name(u16 class_code) | ||
357 | { | ||
358 | struct pci_class_name *cp; | ||
359 | |||
360 | for (cp = pci_class_name; | ||
361 | cp < &pci_class_name[ARRAY_SIZE(pci_class_name)]; cp++) | ||
362 | if (cp->code == class_code) | ||
363 | return cp; | ||
364 | return NULL; | ||
365 | } | ||
366 | |||
367 | /* | ||
368 | * This assumes that the node slot is always on the primary bus! | ||
369 | */ | ||
370 | static void __init scan_bridge_slot(struct iseries_flat_dt *dt, | ||
371 | HvBusNumber bus, struct HvCallPci_BridgeInfo *bridge_info) | ||
372 | { | ||
373 | HvSubBusNumber sub_bus = bridge_info->subBusNumber; | ||
374 | u16 vendor_id; | ||
375 | u16 device_id; | ||
376 | u32 class_id; | ||
377 | int err; | ||
378 | char buf[32]; | ||
379 | u32 reg[5]; | ||
380 | int id_sel = ISERIES_GET_DEVICE_FROM_SUBBUS(sub_bus); | ||
381 | int function = ISERIES_GET_FUNCTION_FROM_SUBBUS(sub_bus); | ||
382 | HvAgentId eads_id_sel = ISERIES_PCI_AGENTID(id_sel, function); | ||
383 | u8 devfn; | ||
384 | struct pci_class_name *cp; | ||
385 | |||
386 | /* | ||
387 | * Connect all functions of any device found. | ||
388 | */ | ||
389 | for (id_sel = 1; id_sel <= bridge_info->maxAgents; id_sel++) { | ||
390 | for (function = 0; function < 8; function++) { | ||
391 | HvAgentId agent_id = ISERIES_PCI_AGENTID(id_sel, | ||
392 | function); | ||
393 | err = HvCallXm_connectBusUnit(bus, sub_bus, | ||
394 | agent_id, 0); | ||
395 | if (err) { | ||
396 | if (err != 0x302) | ||
397 | DBG("connectBusUnit(%x, %x, %x) %x\n", | ||
398 | bus, sub_bus, agent_id, err); | ||
399 | continue; | ||
400 | } | ||
401 | |||
402 | err = HvCallPci_configLoad16(bus, sub_bus, agent_id, | ||
403 | PCI_VENDOR_ID, &vendor_id); | ||
404 | if (err) { | ||
405 | DBG("ReadVendor(%x, %x, %x) %x\n", | ||
406 | bus, sub_bus, agent_id, err); | ||
407 | continue; | ||
408 | } | ||
409 | err = HvCallPci_configLoad16(bus, sub_bus, agent_id, | ||
410 | PCI_DEVICE_ID, &device_id); | ||
411 | if (err) { | ||
412 | DBG("ReadDevice(%x, %x, %x) %x\n", | ||
413 | bus, sub_bus, agent_id, err); | ||
414 | continue; | ||
415 | } | ||
416 | err = HvCallPci_configLoad32(bus, sub_bus, agent_id, | ||
417 | PCI_CLASS_REVISION , &class_id); | ||
418 | if (err) { | ||
419 | DBG("ReadClass(%x, %x, %x) %x\n", | ||
420 | bus, sub_bus, agent_id, err); | ||
421 | continue; | ||
422 | } | ||
423 | |||
424 | devfn = PCI_DEVFN(ISERIES_ENCODE_DEVICE(eads_id_sel), | ||
425 | function); | ||
426 | cp = dt_find_pci_class_name(class_id >> 16); | ||
427 | if (cp && cp->name) | ||
428 | strncpy(buf, cp->name, sizeof(buf) - 1); | ||
429 | else | ||
430 | snprintf(buf, sizeof(buf), "pci%x,%x", | ||
431 | vendor_id, device_id); | ||
432 | buf[sizeof(buf) - 1] = '\0'; | ||
433 | snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), | ||
434 | "@%x", PCI_SLOT(devfn)); | ||
435 | buf[sizeof(buf) - 1] = '\0'; | ||
436 | if (function != 0) | ||
437 | snprintf(buf + strlen(buf), | ||
438 | sizeof(buf) - strlen(buf), | ||
439 | ",%x", function); | ||
440 | dt_start_node(dt, buf); | ||
441 | reg[0] = (bus << 16) | (devfn << 8); | ||
442 | reg[1] = 0; | ||
443 | reg[2] = 0; | ||
444 | reg[3] = 0; | ||
445 | reg[4] = 0; | ||
446 | dt_prop_u32_list(dt, "reg", reg, 5); | ||
447 | if (cp && (cp->type || cp->name)) | ||
448 | dt_prop_str(dt, "device_type", | ||
449 | cp->type ? cp->type : cp->name); | ||
450 | dt_prop_u32(dt, "vendor-id", vendor_id); | ||
451 | dt_prop_u32(dt, "device-id", device_id); | ||
452 | dt_prop_u32(dt, "class-code", class_id >> 8); | ||
453 | dt_prop_u32(dt, "revision-id", class_id & 0xff); | ||
454 | dt_prop_u32(dt, "linux,subbus", sub_bus); | ||
455 | dt_prop_u32(dt, "linux,agent-id", agent_id); | ||
456 | dt_prop_u32(dt, "linux,logical-slot-number", | ||
457 | bridge_info->logicalSlotNumber); | ||
458 | dt_end_node(dt); | ||
459 | |||
460 | } | ||
461 | } | ||
462 | } | ||
463 | |||
464 | static void __init scan_bridge(struct iseries_flat_dt *dt, HvBusNumber bus, | ||
465 | HvSubBusNumber sub_bus, int id_sel) | ||
466 | { | ||
467 | struct HvCallPci_BridgeInfo bridge_info; | ||
468 | HvAgentId agent_id; | ||
469 | int function; | ||
470 | int ret; | ||
471 | |||
472 | /* Note: hvSubBus and irq is always be 0 at this level! */ | ||
473 | for (function = 0; function < 8; ++function) { | ||
474 | agent_id = ISERIES_PCI_AGENTID(id_sel, function); | ||
475 | ret = HvCallXm_connectBusUnit(bus, sub_bus, agent_id, 0); | ||
476 | if (ret != 0) { | ||
477 | if (ret != 0xb) | ||
478 | DBG("connectBusUnit(%x, %x, %x) %x\n", | ||
479 | bus, sub_bus, agent_id, ret); | ||
480 | continue; | ||
481 | } | ||
482 | DBG("found device at bus %d idsel %d func %d (AgentId %x)\n", | ||
483 | bus, id_sel, function, agent_id); | ||
484 | ret = HvCallPci_getBusUnitInfo(bus, sub_bus, agent_id, | ||
485 | iseries_hv_addr(&bridge_info), | ||
486 | sizeof(struct HvCallPci_BridgeInfo)); | ||
487 | if (ret != 0) | ||
488 | continue; | ||
489 | DBG("bridge info: type %x subbus %x " | ||
490 | "maxAgents %x maxsubbus %x logslot %x\n", | ||
491 | bridge_info.busUnitInfo.deviceType, | ||
492 | bridge_info.subBusNumber, | ||
493 | bridge_info.maxAgents, | ||
494 | bridge_info.maxSubBusNumber, | ||
495 | bridge_info.logicalSlotNumber); | ||
496 | if (bridge_info.busUnitInfo.deviceType == | ||
497 | HvCallPci_BridgeDevice) | ||
498 | scan_bridge_slot(dt, bus, &bridge_info); | ||
499 | else | ||
500 | DBG("PCI: Invalid Bridge Configuration(0x%02X)", | ||
501 | bridge_info.busUnitInfo.deviceType); | ||
502 | } | ||
503 | } | ||
504 | |||
505 | static void __init scan_phb(struct iseries_flat_dt *dt, HvBusNumber bus) | ||
506 | { | ||
507 | struct HvCallPci_DeviceInfo dev_info; | ||
508 | const HvSubBusNumber sub_bus = 0; /* EADs is always 0. */ | ||
509 | int err; | ||
510 | int id_sel; | ||
511 | const int max_agents = 8; | ||
512 | |||
513 | /* | ||
514 | * Probe for EADs Bridges | ||
515 | */ | ||
516 | for (id_sel = 1; id_sel < max_agents; ++id_sel) { | ||
517 | err = HvCallPci_getDeviceInfo(bus, sub_bus, id_sel, | ||
518 | iseries_hv_addr(&dev_info), | ||
519 | sizeof(struct HvCallPci_DeviceInfo)); | ||
520 | if (err) { | ||
521 | if (err != 0x302) | ||
522 | DBG("getDeviceInfo(%x, %x, %x) %x\n", | ||
523 | bus, sub_bus, id_sel, err); | ||
524 | continue; | ||
525 | } | ||
526 | if (dev_info.deviceType != HvCallPci_NodeDevice) { | ||
527 | DBG("PCI: Invalid System Configuration" | ||
528 | "(0x%02X) for bus 0x%02x id 0x%02x.\n", | ||
529 | dev_info.deviceType, bus, id_sel); | ||
530 | continue; | ||
531 | } | ||
532 | scan_bridge(dt, bus, sub_bus, id_sel); | ||
533 | } | ||
534 | } | ||
535 | |||
536 | static void __init dt_pci_devices(struct iseries_flat_dt *dt) | ||
537 | { | ||
538 | HvBusNumber bus; | ||
539 | char buf[32]; | ||
540 | u32 buses[2]; | ||
541 | int phb_num = 0; | ||
542 | |||
543 | /* Check all possible buses. */ | ||
544 | for (bus = 0; bus < 256; bus++) { | ||
545 | int err = HvCallXm_testBus(bus); | ||
546 | |||
547 | if (err) { | ||
548 | /* | ||
549 | * Check for Unexpected Return code, a clue that | ||
550 | * something has gone wrong. | ||
551 | */ | ||
552 | if (err != 0x0301) | ||
553 | DBG("Unexpected Return on Probe(0x%02X) " | ||
554 | "0x%04X\n", bus, err); | ||
555 | continue; | ||
556 | } | ||
557 | DBG("bus %d appears to exist\n", bus); | ||
558 | snprintf(buf, 32, "pci@%d", phb_num); | ||
559 | dt_start_node(dt, buf); | ||
560 | dt_prop_str(dt, "device_type", device_type_pci); | ||
561 | dt_prop_str(dt, "compatible", "IBM,iSeries-Logical-PHB"); | ||
562 | dt_prop_u32(dt, "#address-cells", 3); | ||
563 | dt_prop_u32(dt, "#size-cells", 2); | ||
564 | buses[0] = buses[1] = bus; | ||
565 | dt_prop_u32_list(dt, "bus-range", buses, 2); | ||
566 | scan_phb(dt, bus); | ||
567 | dt_end_node(dt); | ||
568 | phb_num++; | ||
569 | } | ||
570 | } | ||
571 | |||
572 | static void dt_finish(struct iseries_flat_dt *dt) | ||
573 | { | ||
574 | dt_push_u32(dt, OF_DT_END); | ||
575 | dt->header.totalsize = (unsigned long)dt_data - (unsigned long)dt; | ||
576 | klimit = ALIGN((unsigned long)dt_data, 8); | ||
577 | } | ||
578 | |||
579 | void * __init build_flat_dt(unsigned long phys_mem_size) | ||
580 | { | ||
581 | struct iseries_flat_dt *iseries_dt; | ||
582 | u64 tmp[2]; | ||
583 | |||
584 | iseries_dt = dt_init(); | ||
585 | |||
586 | dt_start_node(iseries_dt, ""); | ||
587 | |||
588 | dt_prop_u32(iseries_dt, "#address-cells", 2); | ||
589 | dt_prop_u32(iseries_dt, "#size-cells", 2); | ||
590 | dt_model(iseries_dt); | ||
591 | |||
592 | /* /memory */ | ||
593 | dt_start_node(iseries_dt, "memory@0"); | ||
594 | dt_prop_str(iseries_dt, "device_type", device_type_memory); | ||
595 | tmp[0] = 0; | ||
596 | tmp[1] = phys_mem_size; | ||
597 | dt_prop_u64_list(iseries_dt, "reg", tmp, 2); | ||
598 | dt_end_node(iseries_dt); | ||
599 | |||
600 | /* /chosen */ | ||
601 | dt_start_node(iseries_dt, "chosen"); | ||
602 | dt_prop_str(iseries_dt, "bootargs", cmd_line); | ||
603 | dt_end_node(iseries_dt); | ||
604 | |||
605 | dt_cpus(iseries_dt); | ||
606 | |||
607 | dt_vdevices(iseries_dt); | ||
608 | dt_pci_devices(iseries_dt); | ||
609 | |||
610 | dt_end_node(iseries_dt); | ||
611 | |||
612 | dt_finish(iseries_dt); | ||
613 | |||
614 | return iseries_dt; | ||
615 | } | ||
diff --git a/arch/powerpc/platforms/iseries/iommu.c b/arch/powerpc/platforms/iseries/iommu.c index bea0b703f409..e3bd2015f2c9 100644 --- a/arch/powerpc/platforms/iseries/iommu.c +++ b/arch/powerpc/platforms/iseries/iommu.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Rewrite, cleanup: | 4 | * Rewrite, cleanup: |
5 | * | 5 | * |
6 | * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation | 6 | * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation |
7 | * Copyright (C) 2006 Olof Johansson <olof@lixom.net> | ||
7 | * | 8 | * |
8 | * Dynamic DMA mapping support, iSeries-specific parts. | 9 | * Dynamic DMA mapping support, iSeries-specific parts. |
9 | * | 10 | * |
@@ -31,42 +32,37 @@ | |||
31 | #include <asm/tce.h> | 32 | #include <asm/tce.h> |
32 | #include <asm/machdep.h> | 33 | #include <asm/machdep.h> |
33 | #include <asm/abs_addr.h> | 34 | #include <asm/abs_addr.h> |
35 | #include <asm/prom.h> | ||
34 | #include <asm/pci-bridge.h> | 36 | #include <asm/pci-bridge.h> |
35 | #include <asm/iseries/hv_call_xm.h> | 37 | #include <asm/iseries/hv_call_xm.h> |
36 | 38 | #include <asm/iseries/iommu.h> | |
37 | #include "iommu.h" | ||
38 | |||
39 | extern struct list_head iSeries_Global_Device_List; | ||
40 | |||
41 | 39 | ||
42 | static void tce_build_iSeries(struct iommu_table *tbl, long index, long npages, | 40 | static void tce_build_iSeries(struct iommu_table *tbl, long index, long npages, |
43 | unsigned long uaddr, enum dma_data_direction direction) | 41 | unsigned long uaddr, enum dma_data_direction direction) |
44 | { | 42 | { |
45 | u64 rc; | 43 | u64 rc; |
46 | union tce_entry tce; | 44 | u64 tce, rpn; |
47 | 45 | ||
48 | index <<= TCE_PAGE_FACTOR; | 46 | index <<= TCE_PAGE_FACTOR; |
49 | npages <<= TCE_PAGE_FACTOR; | 47 | npages <<= TCE_PAGE_FACTOR; |
50 | 48 | ||
51 | while (npages--) { | 49 | while (npages--) { |
52 | tce.te_word = 0; | 50 | rpn = virt_to_abs(uaddr) >> TCE_SHIFT; |
53 | tce.te_bits.tb_rpn = virt_to_abs(uaddr) >> TCE_SHIFT; | 51 | tce = (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; |
54 | 52 | ||
55 | if (tbl->it_type == TCE_VB) { | 53 | if (tbl->it_type == TCE_VB) { |
56 | /* Virtual Bus */ | 54 | /* Virtual Bus */ |
57 | tce.te_bits.tb_valid = 1; | 55 | tce |= TCE_VALID|TCE_ALLIO; |
58 | tce.te_bits.tb_allio = 1; | ||
59 | if (direction != DMA_TO_DEVICE) | 56 | if (direction != DMA_TO_DEVICE) |
60 | tce.te_bits.tb_rdwr = 1; | 57 | tce |= TCE_VB_WRITE; |
61 | } else { | 58 | } else { |
62 | /* PCI Bus */ | 59 | /* PCI Bus */ |
63 | tce.te_bits.tb_rdwr = 1; /* Read allowed */ | 60 | tce |= TCE_PCI_READ; /* Read allowed */ |
64 | if (direction != DMA_TO_DEVICE) | 61 | if (direction != DMA_TO_DEVICE) |
65 | tce.te_bits.tb_pciwr = 1; | 62 | tce |= TCE_PCI_WRITE; |
66 | } | 63 | } |
67 | 64 | ||
68 | rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, | 65 | rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, tce); |
69 | tce.te_word); | ||
70 | if (rc) | 66 | if (rc) |
71 | panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", | 67 | panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", |
72 | rc); | 68 | rc); |
@@ -124,7 +120,7 @@ void iommu_table_getparms_iSeries(unsigned long busno, | |||
124 | 120 | ||
125 | /* itc_size is in pages worth of table, it_size is in # of entries */ | 121 | /* itc_size is in pages worth of table, it_size is in # of entries */ |
126 | tbl->it_size = ((parms->itc_size * TCE_PAGE_SIZE) / | 122 | tbl->it_size = ((parms->itc_size * TCE_PAGE_SIZE) / |
127 | sizeof(union tce_entry)) >> TCE_PAGE_FACTOR; | 123 | TCE_ENTRY_SIZE) >> TCE_PAGE_FACTOR; |
128 | tbl->it_busno = parms->itc_busno; | 124 | tbl->it_busno = parms->itc_busno; |
129 | tbl->it_offset = parms->itc_offset >> TCE_PAGE_FACTOR; | 125 | tbl->it_offset = parms->itc_offset >> TCE_PAGE_FACTOR; |
130 | tbl->it_index = parms->itc_index; | 126 | tbl->it_index = parms->itc_index; |
@@ -142,10 +138,15 @@ void iommu_table_getparms_iSeries(unsigned long busno, | |||
142 | */ | 138 | */ |
143 | static struct iommu_table *iommu_table_find(struct iommu_table * tbl) | 139 | static struct iommu_table *iommu_table_find(struct iommu_table * tbl) |
144 | { | 140 | { |
145 | struct pci_dn *pdn; | 141 | struct device_node *node; |
146 | 142 | ||
147 | list_for_each_entry(pdn, &iSeries_Global_Device_List, Device_List) { | 143 | for (node = NULL; (node = of_find_all_nodes(node)); ) { |
148 | struct iommu_table *it = pdn->iommu_table; | 144 | struct pci_dn *pdn = PCI_DN(node); |
145 | struct iommu_table *it; | ||
146 | |||
147 | if (pdn == NULL) | ||
148 | continue; | ||
149 | it = pdn->iommu_table; | ||
149 | if ((it != NULL) && | 150 | if ((it != NULL) && |
150 | (it->it_type == TCE_PCI) && | 151 | (it->it_type == TCE_PCI) && |
151 | (it->it_offset == tbl->it_offset) && | 152 | (it->it_offset == tbl->it_offset) && |
@@ -161,15 +162,18 @@ void iommu_devnode_init_iSeries(struct device_node *dn) | |||
161 | { | 162 | { |
162 | struct iommu_table *tbl; | 163 | struct iommu_table *tbl; |
163 | struct pci_dn *pdn = PCI_DN(dn); | 164 | struct pci_dn *pdn = PCI_DN(dn); |
165 | u32 *lsn = (u32 *)get_property(dn, "linux,logical-slot-number", NULL); | ||
166 | |||
167 | BUG_ON(lsn == NULL); | ||
164 | 168 | ||
165 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 169 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); |
166 | 170 | ||
167 | iommu_table_getparms_iSeries(pdn->busno, pdn->LogicalSlot, 0, tbl); | 171 | iommu_table_getparms_iSeries(pdn->busno, *lsn, 0, tbl); |
168 | 172 | ||
169 | /* Look for existing tce table */ | 173 | /* Look for existing tce table */ |
170 | pdn->iommu_table = iommu_table_find(tbl); | 174 | pdn->iommu_table = iommu_table_find(tbl); |
171 | if (pdn->iommu_table == NULL) | 175 | if (pdn->iommu_table == NULL) |
172 | pdn->iommu_table = iommu_init_table(tbl); | 176 | pdn->iommu_table = iommu_init_table(tbl, -1); |
173 | else | 177 | else |
174 | kfree(tbl); | 178 | kfree(tbl); |
175 | } | 179 | } |
diff --git a/arch/powerpc/platforms/iseries/iommu.h b/arch/powerpc/platforms/iseries/iommu.h deleted file mode 100644 index cb5658fbe657..000000000000 --- a/arch/powerpc/platforms/iseries/iommu.h +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | #ifndef _PLATFORMS_ISERIES_IOMMU_H | ||
2 | #define _PLATFORMS_ISERIES_IOMMU_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 2005 Stephen Rothwell, IBM Corporation | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the: | ||
19 | * Free Software Foundation, Inc., | ||
20 | * 59 Temple Place, Suite 330, | ||
21 | * Boston, MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | struct device_node; | ||
25 | struct iommu_table; | ||
26 | |||
27 | /* Creates table for an individual device node */ | ||
28 | extern void iommu_devnode_init_iSeries(struct device_node *dn); | ||
29 | |||
30 | /* Get table parameters from HV */ | ||
31 | extern void iommu_table_getparms_iSeries(unsigned long busno, | ||
32 | unsigned char slotno, unsigned char virtbus, | ||
33 | struct iommu_table *tbl); | ||
34 | |||
35 | #endif /* _PLATFORMS_ISERIES_IOMMU_H */ | ||
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c index be3fbfc24e6c..62bbbcf5ded3 100644 --- a/arch/powerpc/platforms/iseries/irq.c +++ b/arch/powerpc/platforms/iseries/irq.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/iseries/it_lp_queue.h> | 42 | #include <asm/iseries/it_lp_queue.h> |
43 | 43 | ||
44 | #include "irq.h" | 44 | #include "irq.h" |
45 | #include "pci.h" | ||
45 | #include "call_pci.h" | 46 | #include "call_pci.h" |
46 | 47 | ||
47 | #if defined(CONFIG_SMP) | 48 | #if defined(CONFIG_SMP) |
@@ -312,12 +313,12 @@ static hw_irq_controller iSeries_IRQ_handler = { | |||
312 | * Note that sub_bus is always 0 (at the moment at least). | 313 | * Note that sub_bus is always 0 (at the moment at least). |
313 | */ | 314 | */ |
314 | int __init iSeries_allocate_IRQ(HvBusNumber bus, | 315 | int __init iSeries_allocate_IRQ(HvBusNumber bus, |
315 | HvSubBusNumber sub_bus, HvAgentId dev_id) | 316 | HvSubBusNumber sub_bus, u32 bsubbus) |
316 | { | 317 | { |
317 | int virtirq; | 318 | int virtirq; |
318 | unsigned int realirq; | 319 | unsigned int realirq; |
319 | u8 idsel = (dev_id >> 4); | 320 | u8 idsel = ISERIES_GET_DEVICE_FROM_SUBBUS(bsubbus); |
320 | u8 function = dev_id & 7; | 321 | u8 function = ISERIES_GET_FUNCTION_FROM_SUBBUS(bsubbus); |
321 | 322 | ||
322 | realirq = (((((sub_bus << 8) + (bus - 1)) << 3) + (idsel - 1)) << 3) | 323 | realirq = (((((sub_bus << 8) + (bus - 1)) << 3) + (idsel - 1)) << 3) |
323 | + function; | 324 | + function; |
diff --git a/arch/powerpc/platforms/iseries/irq.h b/arch/powerpc/platforms/iseries/irq.h index b9c801ba5a47..188aa808abd7 100644 --- a/arch/powerpc/platforms/iseries/irq.h +++ b/arch/powerpc/platforms/iseries/irq.h | |||
@@ -2,7 +2,7 @@ | |||
2 | #define _ISERIES_IRQ_H | 2 | #define _ISERIES_IRQ_H |
3 | 3 | ||
4 | extern void iSeries_init_IRQ(void); | 4 | extern void iSeries_init_IRQ(void); |
5 | extern int iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, HvAgentId); | 5 | extern int iSeries_allocate_IRQ(HvBusNumber, HvSubBusNumber, u32); |
6 | extern void iSeries_activate_IRQs(void); | 6 | extern void iSeries_activate_IRQs(void); |
7 | extern int iSeries_get_irq(struct pt_regs *); | 7 | extern int iSeries_get_irq(struct pt_regs *); |
8 | 8 | ||
diff --git a/arch/powerpc/platforms/iseries/mf.c b/arch/powerpc/platforms/iseries/mf.c index d771b8ee857d..1a2c2a50f922 100644 --- a/arch/powerpc/platforms/iseries/mf.c +++ b/arch/powerpc/platforms/iseries/mf.c | |||
@@ -45,7 +45,6 @@ | |||
45 | 45 | ||
46 | #include "setup.h" | 46 | #include "setup.h" |
47 | 47 | ||
48 | extern int piranha_simulator; | ||
49 | static int mf_initialized; | 48 | static int mf_initialized; |
50 | 49 | ||
51 | /* | 50 | /* |
@@ -658,7 +657,7 @@ static void mf_clear_src(void) | |||
658 | 657 | ||
659 | void __init mf_display_progress(u16 value) | 658 | void __init mf_display_progress(u16 value) |
660 | { | 659 | { |
661 | if (piranha_simulator || !mf_initialized) | 660 | if (!mf_initialized) |
662 | return; | 661 | return; |
663 | 662 | ||
664 | if (0xFFFF == value) | 663 | if (0xFFFF == value) |
@@ -1295,9 +1294,6 @@ __initcall(mf_proc_init); | |||
1295 | */ | 1294 | */ |
1296 | void iSeries_get_rtc_time(struct rtc_time *rtc_tm) | 1295 | void iSeries_get_rtc_time(struct rtc_time *rtc_tm) |
1297 | { | 1296 | { |
1298 | if (piranha_simulator) | ||
1299 | return; | ||
1300 | |||
1301 | mf_get_rtc(rtc_tm); | 1297 | mf_get_rtc(rtc_tm); |
1302 | rtc_tm->tm_mon--; | 1298 | rtc_tm->tm_mon--; |
1303 | } | 1299 | } |
@@ -1316,9 +1312,6 @@ unsigned long iSeries_get_boot_time(void) | |||
1316 | { | 1312 | { |
1317 | struct rtc_time tm; | 1313 | struct rtc_time tm; |
1318 | 1314 | ||
1319 | if (piranha_simulator) | ||
1320 | return 0; | ||
1321 | |||
1322 | mf_get_boot_rtc(&tm); | 1315 | mf_get_boot_rtc(&tm); |
1323 | return mktime(tm.tm_year + 1900, tm.tm_mon, tm.tm_mday, | 1316 | return mktime(tm.tm_year + 1900, tm.tm_mon, tm.tm_mday, |
1324 | tm.tm_hour, tm.tm_min, tm.tm_sec); | 1317 | tm.tm_hour, tm.tm_min, tm.tm_sec); |
diff --git a/arch/powerpc/platforms/iseries/pci.c b/arch/powerpc/platforms/iseries/pci.c index a19833b880e4..35bcc98111f5 100644 --- a/arch/powerpc/platforms/iseries/pci.c +++ b/arch/powerpc/platforms/iseries/pci.c | |||
@@ -37,36 +37,18 @@ | |||
37 | 37 | ||
38 | #include <asm/iseries/hv_call_xm.h> | 38 | #include <asm/iseries/hv_call_xm.h> |
39 | #include <asm/iseries/mf.h> | 39 | #include <asm/iseries/mf.h> |
40 | #include <asm/iseries/iommu.h> | ||
40 | 41 | ||
41 | #include <asm/ppc-pci.h> | 42 | #include <asm/ppc-pci.h> |
42 | 43 | ||
43 | #include "irq.h" | 44 | #include "irq.h" |
44 | #include "pci.h" | 45 | #include "pci.h" |
45 | #include "call_pci.h" | 46 | #include "call_pci.h" |
46 | #include "iommu.h" | ||
47 | |||
48 | extern unsigned long io_page_mask; | ||
49 | 47 | ||
50 | /* | 48 | /* |
51 | * Forward declares of prototypes. | 49 | * Forward declares of prototypes. |
52 | */ | 50 | */ |
53 | static struct device_node *find_Device_Node(int bus, int devfn); | 51 | static struct device_node *find_Device_Node(int bus, int devfn); |
54 | static void scan_PHB_slots(struct pci_controller *Phb); | ||
55 | static void scan_EADS_bridge(HvBusNumber Bus, HvSubBusNumber SubBus, int IdSel); | ||
56 | static int scan_bridge_slot(HvBusNumber Bus, struct HvCallPci_BridgeInfo *Info); | ||
57 | |||
58 | LIST_HEAD(iSeries_Global_Device_List); | ||
59 | |||
60 | static int DeviceCount; | ||
61 | |||
62 | /* Counters and control flags. */ | ||
63 | static long Pci_Io_Read_Count; | ||
64 | static long Pci_Io_Write_Count; | ||
65 | #if 0 | ||
66 | static long Pci_Cfg_Read_Count; | ||
67 | static long Pci_Cfg_Write_Count; | ||
68 | #endif | ||
69 | static long Pci_Error_Count; | ||
70 | 52 | ||
71 | static int Pci_Retry_Max = 3; /* Only retry 3 times */ | 53 | static int Pci_Retry_Max = 3; /* Only retry 3 times */ |
72 | static int Pci_Error_Flag = 1; /* Set Retry Error on. */ | 54 | static int Pci_Error_Flag = 1; /* Set Retry Error on. */ |
@@ -81,41 +63,19 @@ static struct pci_ops iSeries_pci_ops; | |||
81 | #define IOMM_TABLE_ENTRY_SIZE 0x0000000000400000UL | 63 | #define IOMM_TABLE_ENTRY_SIZE 0x0000000000400000UL |
82 | #define BASE_IO_MEMORY 0xE000000000000000UL | 64 | #define BASE_IO_MEMORY 0xE000000000000000UL |
83 | 65 | ||
84 | static unsigned long max_io_memory = 0xE000000000000000UL; | 66 | static unsigned long max_io_memory = BASE_IO_MEMORY; |
85 | static long current_iomm_table_entry; | 67 | static long current_iomm_table_entry; |
86 | 68 | ||
87 | /* | 69 | /* |
88 | * Lookup Tables. | 70 | * Lookup Tables. |
89 | */ | 71 | */ |
90 | static struct device_node **iomm_table; | 72 | static struct device_node *iomm_table[IOMM_TABLE_MAX_ENTRIES]; |
91 | static u8 *iobar_table; | 73 | static u8 iobar_table[IOMM_TABLE_MAX_ENTRIES]; |
92 | 74 | ||
93 | /* | 75 | static const char pci_io_text[] = "iSeries PCI I/O"; |
94 | * Static and Global variables | ||
95 | */ | ||
96 | static char *pci_io_text = "iSeries PCI I/O"; | ||
97 | static DEFINE_SPINLOCK(iomm_table_lock); | 76 | static DEFINE_SPINLOCK(iomm_table_lock); |
98 | 77 | ||
99 | /* | 78 | /* |
100 | * iomm_table_initialize | ||
101 | * | ||
102 | * Allocates and initalizes the Address Translation Table and Bar | ||
103 | * Tables to get them ready for use. Must be called before any | ||
104 | * I/O space is handed out to the device BARs. | ||
105 | */ | ||
106 | static void iomm_table_initialize(void) | ||
107 | { | ||
108 | spin_lock(&iomm_table_lock); | ||
109 | iomm_table = kmalloc(sizeof(*iomm_table) * IOMM_TABLE_MAX_ENTRIES, | ||
110 | GFP_KERNEL); | ||
111 | iobar_table = kmalloc(sizeof(*iobar_table) * IOMM_TABLE_MAX_ENTRIES, | ||
112 | GFP_KERNEL); | ||
113 | spin_unlock(&iomm_table_lock); | ||
114 | if ((iomm_table == NULL) || (iobar_table == NULL)) | ||
115 | panic("PCI: I/O tables allocation failed.\n"); | ||
116 | } | ||
117 | |||
118 | /* | ||
119 | * iomm_table_allocate_entry | 79 | * iomm_table_allocate_entry |
120 | * | 80 | * |
121 | * Adds pci_dev entry in address translation table | 81 | * Adds pci_dev entry in address translation table |
@@ -142,9 +102,8 @@ static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num) | |||
142 | */ | 102 | */ |
143 | spin_lock(&iomm_table_lock); | 103 | spin_lock(&iomm_table_lock); |
144 | bar_res->name = pci_io_text; | 104 | bar_res->name = pci_io_text; |
145 | bar_res->start = | 105 | bar_res->start = BASE_IO_MEMORY + |
146 | IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry; | 106 | IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry; |
147 | bar_res->start += BASE_IO_MEMORY; | ||
148 | bar_res->end = bar_res->start + bar_size - 1; | 107 | bar_res->end = bar_res->start + bar_size - 1; |
149 | /* | 108 | /* |
150 | * Allocate the number of table entries needed for BAR. | 109 | * Allocate the number of table entries needed for BAR. |
@@ -156,7 +115,7 @@ static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num) | |||
156 | ++current_iomm_table_entry; | 115 | ++current_iomm_table_entry; |
157 | } | 116 | } |
158 | max_io_memory = BASE_IO_MEMORY + | 117 | max_io_memory = BASE_IO_MEMORY + |
159 | (IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry); | 118 | IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry; |
160 | spin_unlock(&iomm_table_lock); | 119 | spin_unlock(&iomm_table_lock); |
161 | } | 120 | } |
162 | 121 | ||
@@ -173,13 +132,10 @@ static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num) | |||
173 | */ | 132 | */ |
174 | static void allocate_device_bars(struct pci_dev *dev) | 133 | static void allocate_device_bars(struct pci_dev *dev) |
175 | { | 134 | { |
176 | struct resource *bar_res; | ||
177 | int bar_num; | 135 | int bar_num; |
178 | 136 | ||
179 | for (bar_num = 0; bar_num <= PCI_ROM_RESOURCE; ++bar_num) { | 137 | for (bar_num = 0; bar_num <= PCI_ROM_RESOURCE; ++bar_num) |
180 | bar_res = &dev->resource[bar_num]; | ||
181 | iomm_table_allocate_entry(dev, bar_num); | 138 | iomm_table_allocate_entry(dev, bar_num); |
182 | } | ||
183 | } | 139 | } |
184 | 140 | ||
185 | /* | 141 | /* |
@@ -199,34 +155,7 @@ static void pci_Log_Error(char *Error_Text, int Bus, int SubBus, | |||
199 | } | 155 | } |
200 | 156 | ||
201 | /* | 157 | /* |
202 | * build_device_node(u16 Bus, int SubBus, u8 DevFn) | 158 | * iSeries_pcibios_init |
203 | */ | ||
204 | static struct device_node *build_device_node(HvBusNumber Bus, | ||
205 | HvSubBusNumber SubBus, int AgentId, int Function) | ||
206 | { | ||
207 | struct device_node *node; | ||
208 | struct pci_dn *pdn; | ||
209 | |||
210 | node = kmalloc(sizeof(struct device_node), GFP_KERNEL); | ||
211 | if (node == NULL) | ||
212 | return NULL; | ||
213 | memset(node, 0, sizeof(struct device_node)); | ||
214 | pdn = kzalloc(sizeof(*pdn), GFP_KERNEL); | ||
215 | if (pdn == NULL) { | ||
216 | kfree(node); | ||
217 | return NULL; | ||
218 | } | ||
219 | node->data = pdn; | ||
220 | pdn->node = node; | ||
221 | list_add_tail(&pdn->Device_List, &iSeries_Global_Device_List); | ||
222 | pdn->busno = Bus; | ||
223 | pdn->bussubno = SubBus; | ||
224 | pdn->devfn = PCI_DEVFN(ISERIES_ENCODE_DEVICE(AgentId), Function); | ||
225 | return node; | ||
226 | } | ||
227 | |||
228 | /* | ||
229 | * unsigned long __init find_and_init_phbs(void) | ||
230 | * | 159 | * |
231 | * Description: | 160 | * Description: |
232 | * This function checks for all possible system PCI host bridges that connect | 161 | * This function checks for all possible system PCI host bridges that connect |
@@ -234,50 +163,42 @@ static struct device_node *build_device_node(HvBusNumber Bus, | |||
234 | * ownership status. A pci_controller is built for any bus which is partially | 163 | * ownership status. A pci_controller is built for any bus which is partially |
235 | * owned or fully owned by this guest partition. | 164 | * owned or fully owned by this guest partition. |
236 | */ | 165 | */ |
237 | unsigned long __init find_and_init_phbs(void) | 166 | void iSeries_pcibios_init(void) |
238 | { | 167 | { |
239 | struct pci_controller *phb; | 168 | struct pci_controller *phb; |
240 | HvBusNumber bus; | 169 | struct device_node *root = of_find_node_by_path("/"); |
241 | 170 | struct device_node *node = NULL; | |
242 | /* Check all possible buses. */ | ||
243 | for (bus = 0; bus < 256; bus++) { | ||
244 | int ret = HvCallXm_testBus(bus); | ||
245 | if (ret == 0) { | ||
246 | printk("bus %d appears to exist\n", bus); | ||
247 | 171 | ||
248 | phb = pcibios_alloc_controller(NULL); | 172 | if (root == NULL) { |
249 | if (phb == NULL) | 173 | printk(KERN_CRIT "iSeries_pcibios_init: can't find root " |
250 | return -ENOMEM; | 174 | "of device tree\n"); |
251 | 175 | return; | |
252 | phb->pci_mem_offset = phb->local_number = bus; | 176 | } |
253 | phb->first_busno = bus; | 177 | while ((node = of_get_next_child(root, node)) != NULL) { |
254 | phb->last_busno = bus; | 178 | HvBusNumber bus; |
255 | phb->ops = &iSeries_pci_ops; | 179 | u32 *busp; |
256 | 180 | ||
257 | /* Find and connect the devices. */ | 181 | if ((node->type == NULL) || (strcmp(node->type, "pci") != 0)) |
258 | scan_PHB_slots(phb); | 182 | continue; |
259 | } | 183 | |
260 | /* | 184 | busp = (u32 *)get_property(node, "bus-range", NULL); |
261 | * Check for Unexpected Return code, a clue that something | 185 | if (busp == NULL) |
262 | * has gone wrong. | 186 | continue; |
263 | */ | 187 | bus = *busp; |
264 | else if (ret != 0x0301) | 188 | printk("bus %d appears to exist\n", bus); |
265 | printk(KERN_ERR "Unexpected Return on Probe(0x%04X): 0x%04X", | 189 | phb = pcibios_alloc_controller(node); |
266 | bus, ret); | 190 | if (phb == NULL) |
191 | continue; | ||
192 | |||
193 | phb->pci_mem_offset = phb->local_number = bus; | ||
194 | phb->first_busno = bus; | ||
195 | phb->last_busno = bus; | ||
196 | phb->ops = &iSeries_pci_ops; | ||
267 | } | 197 | } |
268 | return 0; | ||
269 | } | ||
270 | 198 | ||
271 | /* | 199 | of_node_put(root); |
272 | * iSeries_pcibios_init | 200 | |
273 | * | 201 | pci_devs_phb_init(); |
274 | * Chance to initialize and structures or variable before PCI Bus walk. | ||
275 | */ | ||
276 | void iSeries_pcibios_init(void) | ||
277 | { | ||
278 | iomm_table_initialize(); | ||
279 | find_and_init_phbs(); | ||
280 | io_page_mask = -1; | ||
281 | } | 202 | } |
282 | 203 | ||
283 | /* | 204 | /* |
@@ -299,6 +220,34 @@ void __init iSeries_pci_final_fixup(void) | |||
299 | pdev->bus->number, pdev->devfn, node); | 220 | pdev->bus->number, pdev->devfn, node); |
300 | 221 | ||
301 | if (node != NULL) { | 222 | if (node != NULL) { |
223 | struct pci_dn *pdn = PCI_DN(node); | ||
224 | u32 *agent; | ||
225 | |||
226 | agent = (u32 *)get_property(node, "linux,agent-id", | ||
227 | NULL); | ||
228 | if ((pdn != NULL) && (agent != NULL)) { | ||
229 | u8 irq = iSeries_allocate_IRQ(pdn->busno, 0, | ||
230 | pdn->bussubno); | ||
231 | int err; | ||
232 | |||
233 | err = HvCallXm_connectBusUnit(pdn->busno, pdn->bussubno, | ||
234 | *agent, irq); | ||
235 | if (err) | ||
236 | pci_Log_Error("Connect Bus Unit", | ||
237 | pdn->busno, pdn->bussubno, *agent, err); | ||
238 | else { | ||
239 | err = HvCallPci_configStore8(pdn->busno, pdn->bussubno, | ||
240 | *agent, | ||
241 | PCI_INTERRUPT_LINE, | ||
242 | irq); | ||
243 | if (err) | ||
244 | pci_Log_Error("PciCfgStore Irq Failed!", | ||
245 | pdn->busno, pdn->bussubno, *agent, err); | ||
246 | } | ||
247 | if (!err) | ||
248 | pdev->irq = irq; | ||
249 | } | ||
250 | |||
302 | ++DeviceCount; | 251 | ++DeviceCount; |
303 | pdev->sysdata = (void *)node; | 252 | pdev->sysdata = (void *)node; |
304 | PCI_DN(node)->pcidev = pdev; | 253 | PCI_DN(node)->pcidev = pdev; |
@@ -308,7 +257,6 @@ void __init iSeries_pci_final_fixup(void) | |||
308 | } else | 257 | } else |
309 | printk("PCI: Device Tree not found for 0x%016lX\n", | 258 | printk("PCI: Device Tree not found for 0x%016lX\n", |
310 | (unsigned long)pdev); | 259 | (unsigned long)pdev); |
311 | pdev->irq = PCI_DN(node)->Irq; | ||
312 | } | 260 | } |
313 | iSeries_activate_IRQs(); | 261 | iSeries_activate_IRQs(); |
314 | mf_display_src(0xC9000200); | 262 | mf_display_src(0xC9000200); |
@@ -323,148 +271,6 @@ void pcibios_fixup_resources(struct pci_dev *pdev) | |||
323 | } | 271 | } |
324 | 272 | ||
325 | /* | 273 | /* |
326 | * Loop through each node function to find usable EADs bridges. | ||
327 | */ | ||
328 | static void scan_PHB_slots(struct pci_controller *Phb) | ||
329 | { | ||
330 | struct HvCallPci_DeviceInfo *DevInfo; | ||
331 | HvBusNumber bus = Phb->local_number; /* System Bus */ | ||
332 | const HvSubBusNumber SubBus = 0; /* EADs is always 0. */ | ||
333 | int HvRc = 0; | ||
334 | int IdSel; | ||
335 | const int MaxAgents = 8; | ||
336 | |||
337 | DevInfo = (struct HvCallPci_DeviceInfo*) | ||
338 | kmalloc(sizeof(struct HvCallPci_DeviceInfo), GFP_KERNEL); | ||
339 | if (DevInfo == NULL) | ||
340 | return; | ||
341 | |||
342 | /* | ||
343 | * Probe for EADs Bridges | ||
344 | */ | ||
345 | for (IdSel = 1; IdSel < MaxAgents; ++IdSel) { | ||
346 | HvRc = HvCallPci_getDeviceInfo(bus, SubBus, IdSel, | ||
347 | iseries_hv_addr(DevInfo), | ||
348 | sizeof(struct HvCallPci_DeviceInfo)); | ||
349 | if (HvRc == 0) { | ||
350 | if (DevInfo->deviceType == HvCallPci_NodeDevice) | ||
351 | scan_EADS_bridge(bus, SubBus, IdSel); | ||
352 | else | ||
353 | printk("PCI: Invalid System Configuration(0x%02X)" | ||
354 | " for bus 0x%02x id 0x%02x.\n", | ||
355 | DevInfo->deviceType, bus, IdSel); | ||
356 | } | ||
357 | else | ||
358 | pci_Log_Error("getDeviceInfo", bus, SubBus, IdSel, HvRc); | ||
359 | } | ||
360 | kfree(DevInfo); | ||
361 | } | ||
362 | |||
363 | static void scan_EADS_bridge(HvBusNumber bus, HvSubBusNumber SubBus, | ||
364 | int IdSel) | ||
365 | { | ||
366 | struct HvCallPci_BridgeInfo *BridgeInfo; | ||
367 | HvAgentId AgentId; | ||
368 | int Function; | ||
369 | int HvRc; | ||
370 | |||
371 | BridgeInfo = (struct HvCallPci_BridgeInfo *) | ||
372 | kmalloc(sizeof(struct HvCallPci_BridgeInfo), GFP_KERNEL); | ||
373 | if (BridgeInfo == NULL) | ||
374 | return; | ||
375 | |||
376 | /* Note: hvSubBus and irq is always be 0 at this level! */ | ||
377 | for (Function = 0; Function < 8; ++Function) { | ||
378 | AgentId = ISERIES_PCI_AGENTID(IdSel, Function); | ||
379 | HvRc = HvCallXm_connectBusUnit(bus, SubBus, AgentId, 0); | ||
380 | if (HvRc == 0) { | ||
381 | printk("found device at bus %d idsel %d func %d (AgentId %x)\n", | ||
382 | bus, IdSel, Function, AgentId); | ||
383 | /* Connect EADs: 0x18.00.12 = 0x00 */ | ||
384 | HvRc = HvCallPci_getBusUnitInfo(bus, SubBus, AgentId, | ||
385 | iseries_hv_addr(BridgeInfo), | ||
386 | sizeof(struct HvCallPci_BridgeInfo)); | ||
387 | if (HvRc == 0) { | ||
388 | printk("bridge info: type %x subbus %x maxAgents %x maxsubbus %x logslot %x\n", | ||
389 | BridgeInfo->busUnitInfo.deviceType, | ||
390 | BridgeInfo->subBusNumber, | ||
391 | BridgeInfo->maxAgents, | ||
392 | BridgeInfo->maxSubBusNumber, | ||
393 | BridgeInfo->logicalSlotNumber); | ||
394 | if (BridgeInfo->busUnitInfo.deviceType == | ||
395 | HvCallPci_BridgeDevice) { | ||
396 | /* Scan_Bridge_Slot...: 0x18.00.12 */ | ||
397 | scan_bridge_slot(bus, BridgeInfo); | ||
398 | } else | ||
399 | printk("PCI: Invalid Bridge Configuration(0x%02X)", | ||
400 | BridgeInfo->busUnitInfo.deviceType); | ||
401 | } | ||
402 | } else if (HvRc != 0x000B) | ||
403 | pci_Log_Error("EADs Connect", | ||
404 | bus, SubBus, AgentId, HvRc); | ||
405 | } | ||
406 | kfree(BridgeInfo); | ||
407 | } | ||
408 | |||
409 | /* | ||
410 | * This assumes that the node slot is always on the primary bus! | ||
411 | */ | ||
412 | static int scan_bridge_slot(HvBusNumber Bus, | ||
413 | struct HvCallPci_BridgeInfo *BridgeInfo) | ||
414 | { | ||
415 | struct device_node *node; | ||
416 | HvSubBusNumber SubBus = BridgeInfo->subBusNumber; | ||
417 | u16 VendorId = 0; | ||
418 | int HvRc = 0; | ||
419 | u8 Irq = 0; | ||
420 | int IdSel = ISERIES_GET_DEVICE_FROM_SUBBUS(SubBus); | ||
421 | int Function = ISERIES_GET_FUNCTION_FROM_SUBBUS(SubBus); | ||
422 | HvAgentId EADsIdSel = ISERIES_PCI_AGENTID(IdSel, Function); | ||
423 | |||
424 | /* iSeries_allocate_IRQ.: 0x18.00.12(0xA3) */ | ||
425 | Irq = iSeries_allocate_IRQ(Bus, 0, EADsIdSel); | ||
426 | |||
427 | /* | ||
428 | * Connect all functions of any device found. | ||
429 | */ | ||
430 | for (IdSel = 1; IdSel <= BridgeInfo->maxAgents; ++IdSel) { | ||
431 | for (Function = 0; Function < 8; ++Function) { | ||
432 | HvAgentId AgentId = ISERIES_PCI_AGENTID(IdSel, Function); | ||
433 | HvRc = HvCallXm_connectBusUnit(Bus, SubBus, | ||
434 | AgentId, Irq); | ||
435 | if (HvRc != 0) { | ||
436 | pci_Log_Error("Connect Bus Unit", | ||
437 | Bus, SubBus, AgentId, HvRc); | ||
438 | continue; | ||
439 | } | ||
440 | |||
441 | HvRc = HvCallPci_configLoad16(Bus, SubBus, AgentId, | ||
442 | PCI_VENDOR_ID, &VendorId); | ||
443 | if (HvRc != 0) { | ||
444 | pci_Log_Error("Read Vendor", | ||
445 | Bus, SubBus, AgentId, HvRc); | ||
446 | continue; | ||
447 | } | ||
448 | printk("read vendor ID: %x\n", VendorId); | ||
449 | |||
450 | /* FoundDevice: 0x18.28.10 = 0x12AE */ | ||
451 | HvRc = HvCallPci_configStore8(Bus, SubBus, AgentId, | ||
452 | PCI_INTERRUPT_LINE, Irq); | ||
453 | if (HvRc != 0) | ||
454 | pci_Log_Error("PciCfgStore Irq Failed!", | ||
455 | Bus, SubBus, AgentId, HvRc); | ||
456 | |||
457 | ++DeviceCount; | ||
458 | node = build_device_node(Bus, SubBus, EADsIdSel, Function); | ||
459 | PCI_DN(node)->Irq = Irq; | ||
460 | PCI_DN(node)->LogicalSlot = BridgeInfo->logicalSlotNumber; | ||
461 | |||
462 | } /* for (Function = 0; Function < 8; ++Function) */ | ||
463 | } /* for (IdSel = 1; IdSel <= MaxAgents; ++IdSel) */ | ||
464 | return HvRc; | ||
465 | } | ||
466 | |||
467 | /* | ||
468 | * I/0 Memory copy MUST use mmio commands on iSeries | 274 | * I/0 Memory copy MUST use mmio commands on iSeries |
469 | * To do; For performance, include the hv call directly | 275 | * To do; For performance, include the hv call directly |
470 | */ | 276 | */ |
@@ -509,11 +315,13 @@ EXPORT_SYMBOL(iSeries_memcpy_fromio); | |||
509 | */ | 315 | */ |
510 | static struct device_node *find_Device_Node(int bus, int devfn) | 316 | static struct device_node *find_Device_Node(int bus, int devfn) |
511 | { | 317 | { |
512 | struct pci_dn *pdn; | 318 | struct device_node *node; |
319 | |||
320 | for (node = NULL; (node = of_find_all_nodes(node)); ) { | ||
321 | struct pci_dn *pdn = PCI_DN(node); | ||
513 | 322 | ||
514 | list_for_each_entry(pdn, &iSeries_Global_Device_List, Device_List) { | 323 | if (pdn && (bus == pdn->busno) && (devfn == pdn->devfn)) |
515 | if ((bus == pdn->busno) && (devfn == pdn->devfn)) | 324 | return node; |
516 | return pdn->node; | ||
517 | } | 325 | } |
518 | return NULL; | 326 | return NULL; |
519 | } | 327 | } |
@@ -625,7 +433,6 @@ static int CheckReturnCode(char *TextHdr, struct device_node *DevNode, | |||
625 | if (ret != 0) { | 433 | if (ret != 0) { |
626 | struct pci_dn *pdn = PCI_DN(DevNode); | 434 | struct pci_dn *pdn = PCI_DN(DevNode); |
627 | 435 | ||
628 | ++Pci_Error_Count; | ||
629 | (*retry)++; | 436 | (*retry)++; |
630 | printk("PCI: %s: Device 0x%04X:%02X I/O Error(%2d): 0x%04X\n", | 437 | printk("PCI: %s: Device 0x%04X:%02X I/O Error(%2d): 0x%04X\n", |
631 | TextHdr, pdn->busno, pdn->devfn, | 438 | TextHdr, pdn->busno, pdn->devfn, |
@@ -707,7 +514,6 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) | |||
707 | return 0xff; | 514 | return 0xff; |
708 | } | 515 | } |
709 | do { | 516 | do { |
710 | ++Pci_Io_Read_Count; | ||
711 | HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0); | 517 | HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0); |
712 | } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0); | 518 | } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0); |
713 | 519 | ||
@@ -737,7 +543,6 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) | |||
737 | return 0xffff; | 543 | return 0xffff; |
738 | } | 544 | } |
739 | do { | 545 | do { |
740 | ++Pci_Io_Read_Count; | ||
741 | HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa, | 546 | HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa, |
742 | BarOffset, 0); | 547 | BarOffset, 0); |
743 | } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0); | 548 | } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0); |
@@ -768,7 +573,6 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) | |||
768 | return 0xffffffff; | 573 | return 0xffffffff; |
769 | } | 574 | } |
770 | do { | 575 | do { |
771 | ++Pci_Io_Read_Count; | ||
772 | HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa, | 576 | HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa, |
773 | BarOffset, 0); | 577 | BarOffset, 0); |
774 | } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0); | 578 | } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0); |
@@ -806,7 +610,6 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) | |||
806 | return; | 610 | return; |
807 | } | 611 | } |
808 | do { | 612 | do { |
809 | ++Pci_Io_Write_Count; | ||
810 | rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0); | 613 | rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0); |
811 | } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0); | 614 | } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0); |
812 | } | 615 | } |
@@ -834,7 +637,6 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) | |||
834 | return; | 637 | return; |
835 | } | 638 | } |
836 | do { | 639 | do { |
837 | ++Pci_Io_Write_Count; | ||
838 | rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0); | 640 | rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0); |
839 | } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0); | 641 | } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0); |
840 | } | 642 | } |
@@ -862,7 +664,6 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) | |||
862 | return; | 664 | return; |
863 | } | 665 | } |
864 | do { | 666 | do { |
865 | ++Pci_Io_Write_Count; | ||
866 | rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0); | 667 | rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0); |
867 | } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0); | 668 | } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0); |
868 | } | 669 | } |
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index a6fd9bedb074..617c724c4590 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -50,7 +50,6 @@ | |||
50 | #include <asm/iseries/hv_call_xm.h> | 50 | #include <asm/iseries/hv_call_xm.h> |
51 | #include <asm/iseries/it_lp_queue.h> | 51 | #include <asm/iseries/it_lp_queue.h> |
52 | #include <asm/iseries/mf.h> | 52 | #include <asm/iseries/mf.h> |
53 | #include <asm/iseries/it_exp_vpd_panel.h> | ||
54 | #include <asm/iseries/hv_lp_event.h> | 53 | #include <asm/iseries/hv_lp_event.h> |
55 | #include <asm/iseries/lpar_map.h> | 54 | #include <asm/iseries/lpar_map.h> |
56 | #include <asm/udbg.h> | 55 | #include <asm/udbg.h> |
@@ -81,9 +80,6 @@ extern void iSeries_pci_final_fixup(void); | |||
81 | static void iSeries_pci_final_fixup(void) { } | 80 | static void iSeries_pci_final_fixup(void) { } |
82 | #endif | 81 | #endif |
83 | 82 | ||
84 | /* Global Variables */ | ||
85 | int piranha_simulator; | ||
86 | |||
87 | extern int rd_size; /* Defined in drivers/block/rd.c */ | 83 | extern int rd_size; /* Defined in drivers/block/rd.c */ |
88 | extern unsigned long embedded_sysmap_start; | 84 | extern unsigned long embedded_sysmap_start; |
89 | extern unsigned long embedded_sysmap_end; | 85 | extern unsigned long embedded_sysmap_end; |
@@ -91,8 +87,6 @@ extern unsigned long embedded_sysmap_end; | |||
91 | extern unsigned long iSeries_recal_tb; | 87 | extern unsigned long iSeries_recal_tb; |
92 | extern unsigned long iSeries_recal_titan; | 88 | extern unsigned long iSeries_recal_titan; |
93 | 89 | ||
94 | static unsigned long cmd_mem_limit; | ||
95 | |||
96 | struct MemoryBlock { | 90 | struct MemoryBlock { |
97 | unsigned long absStart; | 91 | unsigned long absStart; |
98 | unsigned long absEnd; | 92 | unsigned long absEnd; |
@@ -340,8 +334,6 @@ static void __init iSeries_init_early(void) | |||
340 | #ifdef CONFIG_SMP | 334 | #ifdef CONFIG_SMP |
341 | smp_init_iSeries(); | 335 | smp_init_iSeries(); |
342 | #endif | 336 | #endif |
343 | if (itLpNaca.xPirEnvironMode == 0) | ||
344 | piranha_simulator = 1; | ||
345 | 337 | ||
346 | /* Associate Lp Event Queue 0 with processor 0 */ | 338 | /* Associate Lp Event Queue 0 with processor 0 */ |
347 | HvCallEvent_setLpEventQueueInterruptProc(0, 0); | 339 | HvCallEvent_setLpEventQueueInterruptProc(0, 0); |
@@ -536,10 +528,10 @@ static void __init iSeries_setup_arch(void) | |||
536 | { | 528 | { |
537 | if (get_lppaca()->shared_proc) { | 529 | if (get_lppaca()->shared_proc) { |
538 | ppc_md.idle_loop = iseries_shared_idle; | 530 | ppc_md.idle_loop = iseries_shared_idle; |
539 | printk(KERN_INFO "Using shared processor idle loop\n"); | 531 | printk(KERN_DEBUG "Using shared processor idle loop\n"); |
540 | } else { | 532 | } else { |
541 | ppc_md.idle_loop = iseries_dedicated_idle; | 533 | ppc_md.idle_loop = iseries_dedicated_idle; |
542 | printk(KERN_INFO "Using dedicated idle loop\n"); | 534 | printk(KERN_DEBUG "Using dedicated idle loop\n"); |
543 | } | 535 | } |
544 | 536 | ||
545 | /* Setup the Lp Event Queue */ | 537 | /* Setup the Lp Event Queue */ |
@@ -714,243 +706,6 @@ define_machine(iseries) { | |||
714 | /* XXX Implement enable_pmcs for iSeries */ | 706 | /* XXX Implement enable_pmcs for iSeries */ |
715 | }; | 707 | }; |
716 | 708 | ||
717 | struct blob { | ||
718 | unsigned char data[PAGE_SIZE]; | ||
719 | unsigned long next; | ||
720 | }; | ||
721 | |||
722 | struct iseries_flat_dt { | ||
723 | struct boot_param_header header; | ||
724 | u64 reserve_map[2]; | ||
725 | struct blob dt; | ||
726 | struct blob strings; | ||
727 | }; | ||
728 | |||
729 | struct iseries_flat_dt iseries_dt; | ||
730 | |||
731 | void dt_init(struct iseries_flat_dt *dt) | ||
732 | { | ||
733 | dt->header.off_mem_rsvmap = | ||
734 | offsetof(struct iseries_flat_dt, reserve_map); | ||
735 | dt->header.off_dt_struct = offsetof(struct iseries_flat_dt, dt); | ||
736 | dt->header.off_dt_strings = offsetof(struct iseries_flat_dt, strings); | ||
737 | dt->header.totalsize = sizeof(struct iseries_flat_dt); | ||
738 | dt->header.dt_strings_size = sizeof(struct blob); | ||
739 | |||
740 | /* There is no notion of hardware cpu id on iSeries */ | ||
741 | dt->header.boot_cpuid_phys = smp_processor_id(); | ||
742 | |||
743 | dt->dt.next = (unsigned long)&dt->dt.data; | ||
744 | dt->strings.next = (unsigned long)&dt->strings.data; | ||
745 | |||
746 | dt->header.magic = OF_DT_HEADER; | ||
747 | dt->header.version = 0x10; | ||
748 | dt->header.last_comp_version = 0x10; | ||
749 | |||
750 | dt->reserve_map[0] = 0; | ||
751 | dt->reserve_map[1] = 0; | ||
752 | } | ||
753 | |||
754 | void dt_check_blob(struct blob *b) | ||
755 | { | ||
756 | if (b->next >= (unsigned long)&b->next) { | ||
757 | DBG("Ran out of space in flat device tree blob!\n"); | ||
758 | BUG(); | ||
759 | } | ||
760 | } | ||
761 | |||
762 | void dt_push_u32(struct iseries_flat_dt *dt, u32 value) | ||
763 | { | ||
764 | *((u32*)dt->dt.next) = value; | ||
765 | dt->dt.next += sizeof(u32); | ||
766 | |||
767 | dt_check_blob(&dt->dt); | ||
768 | } | ||
769 | |||
770 | void dt_push_u64(struct iseries_flat_dt *dt, u64 value) | ||
771 | { | ||
772 | *((u64*)dt->dt.next) = value; | ||
773 | dt->dt.next += sizeof(u64); | ||
774 | |||
775 | dt_check_blob(&dt->dt); | ||
776 | } | ||
777 | |||
778 | unsigned long dt_push_bytes(struct blob *blob, char *data, int len) | ||
779 | { | ||
780 | unsigned long start = blob->next - (unsigned long)blob->data; | ||
781 | |||
782 | memcpy((char *)blob->next, data, len); | ||
783 | blob->next = _ALIGN(blob->next + len, 4); | ||
784 | |||
785 | dt_check_blob(blob); | ||
786 | |||
787 | return start; | ||
788 | } | ||
789 | |||
790 | void dt_start_node(struct iseries_flat_dt *dt, char *name) | ||
791 | { | ||
792 | dt_push_u32(dt, OF_DT_BEGIN_NODE); | ||
793 | dt_push_bytes(&dt->dt, name, strlen(name) + 1); | ||
794 | } | ||
795 | |||
796 | #define dt_end_node(dt) dt_push_u32(dt, OF_DT_END_NODE) | ||
797 | |||
798 | void dt_prop(struct iseries_flat_dt *dt, char *name, char *data, int len) | ||
799 | { | ||
800 | unsigned long offset; | ||
801 | |||
802 | dt_push_u32(dt, OF_DT_PROP); | ||
803 | |||
804 | /* Length of the data */ | ||
805 | dt_push_u32(dt, len); | ||
806 | |||
807 | /* Put the property name in the string blob. */ | ||
808 | offset = dt_push_bytes(&dt->strings, name, strlen(name) + 1); | ||
809 | |||
810 | /* The offset of the properties name in the string blob. */ | ||
811 | dt_push_u32(dt, (u32)offset); | ||
812 | |||
813 | /* The actual data. */ | ||
814 | dt_push_bytes(&dt->dt, data, len); | ||
815 | } | ||
816 | |||
817 | void dt_prop_str(struct iseries_flat_dt *dt, char *name, char *data) | ||
818 | { | ||
819 | dt_prop(dt, name, data, strlen(data) + 1); /* + 1 for NULL */ | ||
820 | } | ||
821 | |||
822 | void dt_prop_u32(struct iseries_flat_dt *dt, char *name, u32 data) | ||
823 | { | ||
824 | dt_prop(dt, name, (char *)&data, sizeof(u32)); | ||
825 | } | ||
826 | |||
827 | void dt_prop_u64(struct iseries_flat_dt *dt, char *name, u64 data) | ||
828 | { | ||
829 | dt_prop(dt, name, (char *)&data, sizeof(u64)); | ||
830 | } | ||
831 | |||
832 | void dt_prop_u64_list(struct iseries_flat_dt *dt, char *name, u64 *data, int n) | ||
833 | { | ||
834 | dt_prop(dt, name, (char *)data, sizeof(u64) * n); | ||
835 | } | ||
836 | |||
837 | void dt_prop_u32_list(struct iseries_flat_dt *dt, char *name, u32 *data, int n) | ||
838 | { | ||
839 | dt_prop(dt, name, (char *)data, sizeof(u32) * n); | ||
840 | } | ||
841 | |||
842 | void dt_prop_empty(struct iseries_flat_dt *dt, char *name) | ||
843 | { | ||
844 | dt_prop(dt, name, NULL, 0); | ||
845 | } | ||
846 | |||
847 | void dt_cpus(struct iseries_flat_dt *dt) | ||
848 | { | ||
849 | unsigned char buf[32]; | ||
850 | unsigned char *p; | ||
851 | unsigned int i, index; | ||
852 | struct IoHriProcessorVpd *d; | ||
853 | u32 pft_size[2]; | ||
854 | |||
855 | /* yuck */ | ||
856 | snprintf(buf, 32, "PowerPC,%s", cur_cpu_spec->cpu_name); | ||
857 | p = strchr(buf, ' '); | ||
858 | if (!p) p = buf + strlen(buf); | ||
859 | |||
860 | dt_start_node(dt, "cpus"); | ||
861 | dt_prop_u32(dt, "#address-cells", 1); | ||
862 | dt_prop_u32(dt, "#size-cells", 0); | ||
863 | |||
864 | pft_size[0] = 0; /* NUMA CEC cookie, 0 for non NUMA */ | ||
865 | pft_size[1] = __ilog2(HvCallHpt_getHptPages() * HW_PAGE_SIZE); | ||
866 | |||
867 | for (i = 0; i < NR_CPUS; i++) { | ||
868 | if (lppaca[i].dyn_proc_status >= 2) | ||
869 | continue; | ||
870 | |||
871 | snprintf(p, 32 - (p - buf), "@%d", i); | ||
872 | dt_start_node(dt, buf); | ||
873 | |||
874 | dt_prop_str(dt, "device_type", "cpu"); | ||
875 | |||
876 | index = lppaca[i].dyn_hv_phys_proc_index; | ||
877 | d = &xIoHriProcessorVpd[index]; | ||
878 | |||
879 | dt_prop_u32(dt, "i-cache-size", d->xInstCacheSize * 1024); | ||
880 | dt_prop_u32(dt, "i-cache-line-size", d->xInstCacheOperandSize); | ||
881 | |||
882 | dt_prop_u32(dt, "d-cache-size", d->xDataL1CacheSizeKB * 1024); | ||
883 | dt_prop_u32(dt, "d-cache-line-size", d->xDataCacheOperandSize); | ||
884 | |||
885 | /* magic conversions to Hz copied from old code */ | ||
886 | dt_prop_u32(dt, "clock-frequency", | ||
887 | ((1UL << 34) * 1000000) / d->xProcFreq); | ||
888 | dt_prop_u32(dt, "timebase-frequency", | ||
889 | ((1UL << 32) * 1000000) / d->xTimeBaseFreq); | ||
890 | |||
891 | dt_prop_u32(dt, "reg", i); | ||
892 | |||
893 | dt_prop_u32_list(dt, "ibm,pft-size", pft_size, 2); | ||
894 | |||
895 | dt_end_node(dt); | ||
896 | } | ||
897 | |||
898 | dt_end_node(dt); | ||
899 | } | ||
900 | |||
901 | void dt_model(struct iseries_flat_dt *dt) | ||
902 | { | ||
903 | char buf[16] = "IBM,"; | ||
904 | |||
905 | /* "IBM," + mfgId[2:3] + systemSerial[1:5] */ | ||
906 | strne2a(buf + 4, xItExtVpdPanel.mfgID + 2, 2); | ||
907 | strne2a(buf + 6, xItExtVpdPanel.systemSerial + 1, 5); | ||
908 | buf[11] = '\0'; | ||
909 | dt_prop_str(dt, "system-id", buf); | ||
910 | |||
911 | /* "IBM," + machineType[0:4] */ | ||
912 | strne2a(buf + 4, xItExtVpdPanel.machineType, 4); | ||
913 | buf[8] = '\0'; | ||
914 | dt_prop_str(dt, "model", buf); | ||
915 | |||
916 | dt_prop_str(dt, "compatible", "IBM,iSeries"); | ||
917 | } | ||
918 | |||
919 | void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size) | ||
920 | { | ||
921 | u64 tmp[2]; | ||
922 | |||
923 | dt_init(dt); | ||
924 | |||
925 | dt_start_node(dt, ""); | ||
926 | |||
927 | dt_prop_u32(dt, "#address-cells", 2); | ||
928 | dt_prop_u32(dt, "#size-cells", 2); | ||
929 | dt_model(dt); | ||
930 | |||
931 | /* /memory */ | ||
932 | dt_start_node(dt, "memory@0"); | ||
933 | dt_prop_str(dt, "name", "memory"); | ||
934 | dt_prop_str(dt, "device_type", "memory"); | ||
935 | tmp[0] = 0; | ||
936 | tmp[1] = phys_mem_size; | ||
937 | dt_prop_u64_list(dt, "reg", tmp, 2); | ||
938 | dt_end_node(dt); | ||
939 | |||
940 | /* /chosen */ | ||
941 | dt_start_node(dt, "chosen"); | ||
942 | dt_prop_str(dt, "bootargs", cmd_line); | ||
943 | if (cmd_mem_limit) | ||
944 | dt_prop_u64(dt, "linux,memory-limit", cmd_mem_limit); | ||
945 | dt_end_node(dt); | ||
946 | |||
947 | dt_cpus(dt); | ||
948 | |||
949 | dt_end_node(dt); | ||
950 | |||
951 | dt_push_u32(dt, OF_DT_END); | ||
952 | } | ||
953 | |||
954 | void * __init iSeries_early_setup(void) | 709 | void * __init iSeries_early_setup(void) |
955 | { | 710 | { |
956 | unsigned long phys_mem_size; | 711 | unsigned long phys_mem_size; |
@@ -965,28 +720,8 @@ void * __init iSeries_early_setup(void) | |||
965 | 720 | ||
966 | iSeries_get_cmdline(); | 721 | iSeries_get_cmdline(); |
967 | 722 | ||
968 | /* Save unparsed command line copy for /proc/cmdline */ | 723 | return (void *) __pa(build_flat_dt(phys_mem_size)); |
969 | strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); | ||
970 | |||
971 | /* Parse early parameters, in particular mem=x */ | ||
972 | parse_early_param(); | ||
973 | |||
974 | build_flat_dt(&iseries_dt, phys_mem_size); | ||
975 | |||
976 | return (void *) __pa(&iseries_dt); | ||
977 | } | ||
978 | |||
979 | /* | ||
980 | * On iSeries we just parse the mem=X option from the command line. | ||
981 | * On pSeries it's a bit more complicated, see prom_init_mem() | ||
982 | */ | ||
983 | static int __init early_parsemem(char *p) | ||
984 | { | ||
985 | if (p) | ||
986 | cmd_mem_limit = ALIGN(memparse(p, &p), PAGE_SIZE); | ||
987 | return 0; | ||
988 | } | 724 | } |
989 | early_param("mem", early_parsemem); | ||
990 | 725 | ||
991 | static void hvputc(char c) | 726 | static void hvputc(char c) |
992 | { | 727 | { |
diff --git a/arch/powerpc/platforms/iseries/setup.h b/arch/powerpc/platforms/iseries/setup.h index 5213044ec411..0a47ac53c959 100644 --- a/arch/powerpc/platforms/iseries/setup.h +++ b/arch/powerpc/platforms/iseries/setup.h | |||
@@ -21,4 +21,6 @@ extern unsigned long iSeries_get_boot_time(void); | |||
21 | extern int iSeries_set_rtc_time(struct rtc_time *tm); | 21 | extern int iSeries_set_rtc_time(struct rtc_time *tm); |
22 | extern void iSeries_get_rtc_time(struct rtc_time *tm); | 22 | extern void iSeries_get_rtc_time(struct rtc_time *tm); |
23 | 23 | ||
24 | extern void *build_flat_dt(unsigned long phys_mem_size); | ||
25 | |||
24 | #endif /* __ISERIES_SETUP_H__ */ | 26 | #endif /* __ISERIES_SETUP_H__ */ |
diff --git a/arch/powerpc/platforms/iseries/vio.c b/arch/powerpc/platforms/iseries/vio.c deleted file mode 100644 index ad36ab0639f0..000000000000 --- a/arch/powerpc/platforms/iseries/vio.c +++ /dev/null | |||
@@ -1,131 +0,0 @@ | |||
1 | /* | ||
2 | * IBM PowerPC iSeries Virtual I/O Infrastructure Support. | ||
3 | * | ||
4 | * Copyright (c) 2005 Stephen Rothwell, IBM Corp. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #include <linux/types.h> | ||
12 | #include <linux/device.h> | ||
13 | #include <linux/init.h> | ||
14 | |||
15 | #include <asm/vio.h> | ||
16 | #include <asm/iommu.h> | ||
17 | #include <asm/tce.h> | ||
18 | #include <asm/abs_addr.h> | ||
19 | #include <asm/page.h> | ||
20 | #include <asm/iseries/vio.h> | ||
21 | #include <asm/iseries/hv_types.h> | ||
22 | #include <asm/iseries/hv_lp_config.h> | ||
23 | #include <asm/iseries/hv_call_xm.h> | ||
24 | |||
25 | #include "iommu.h" | ||
26 | |||
27 | struct device *iSeries_vio_dev = &vio_bus_device.dev; | ||
28 | EXPORT_SYMBOL(iSeries_vio_dev); | ||
29 | |||
30 | static struct iommu_table veth_iommu_table; | ||
31 | static struct iommu_table vio_iommu_table; | ||
32 | |||
33 | static void __init iommu_vio_init(void) | ||
34 | { | ||
35 | iommu_table_getparms_iSeries(255, 0, 0xff, &veth_iommu_table); | ||
36 | veth_iommu_table.it_size /= 2; | ||
37 | vio_iommu_table = veth_iommu_table; | ||
38 | vio_iommu_table.it_offset += veth_iommu_table.it_size; | ||
39 | |||
40 | if (!iommu_init_table(&veth_iommu_table)) | ||
41 | printk("Virtual Bus VETH TCE table failed.\n"); | ||
42 | if (!iommu_init_table(&vio_iommu_table)) | ||
43 | printk("Virtual Bus VIO TCE table failed.\n"); | ||
44 | } | ||
45 | |||
46 | /** | ||
47 | * vio_register_device_iseries: - Register a new iSeries vio device. | ||
48 | * @voidev: The device to register. | ||
49 | */ | ||
50 | static struct vio_dev *__init vio_register_device_iseries(char *type, | ||
51 | uint32_t unit_num) | ||
52 | { | ||
53 | struct vio_dev *viodev; | ||
54 | |||
55 | /* allocate a vio_dev for this device */ | ||
56 | viodev = kmalloc(sizeof(struct vio_dev), GFP_KERNEL); | ||
57 | if (!viodev) | ||
58 | return NULL; | ||
59 | memset(viodev, 0, sizeof(struct vio_dev)); | ||
60 | |||
61 | snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%s%d", type, unit_num); | ||
62 | |||
63 | viodev->name = viodev->dev.bus_id; | ||
64 | viodev->type = type; | ||
65 | viodev->unit_address = unit_num; | ||
66 | viodev->iommu_table = &vio_iommu_table; | ||
67 | if (vio_register_device(viodev) == NULL) { | ||
68 | kfree(viodev); | ||
69 | return NULL; | ||
70 | } | ||
71 | return viodev; | ||
72 | } | ||
73 | |||
74 | void __init probe_bus_iseries(void) | ||
75 | { | ||
76 | HvLpIndexMap vlan_map; | ||
77 | struct vio_dev *viodev; | ||
78 | int i; | ||
79 | |||
80 | /* there is only one of each of these */ | ||
81 | vio_register_device_iseries("viocons", 0); | ||
82 | vio_register_device_iseries("vscsi", 0); | ||
83 | |||
84 | vlan_map = HvLpConfig_getVirtualLanIndexMap(); | ||
85 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) { | ||
86 | if ((vlan_map & (0x8000 >> i)) == 0) | ||
87 | continue; | ||
88 | viodev = vio_register_device_iseries("vlan", i); | ||
89 | /* veth is special and has it own iommu_table */ | ||
90 | viodev->iommu_table = &veth_iommu_table; | ||
91 | } | ||
92 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALDISKS; i++) | ||
93 | vio_register_device_iseries("viodasd", i); | ||
94 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALCDROMS; i++) | ||
95 | vio_register_device_iseries("viocd", i); | ||
96 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALTAPES; i++) | ||
97 | vio_register_device_iseries("viotape", i); | ||
98 | } | ||
99 | |||
100 | /** | ||
101 | * vio_match_device_iseries: - Tell if a iSeries VIO device matches a | ||
102 | * vio_device_id | ||
103 | */ | ||
104 | static int vio_match_device_iseries(const struct vio_device_id *id, | ||
105 | const struct vio_dev *dev) | ||
106 | { | ||
107 | return strncmp(dev->type, id->type, strlen(id->type)) == 0; | ||
108 | } | ||
109 | |||
110 | static struct vio_bus_ops vio_bus_ops_iseries = { | ||
111 | .match = vio_match_device_iseries, | ||
112 | }; | ||
113 | |||
114 | /** | ||
115 | * vio_bus_init_iseries: - Initialize the iSeries virtual IO bus | ||
116 | */ | ||
117 | static int __init vio_bus_init_iseries(void) | ||
118 | { | ||
119 | int err; | ||
120 | |||
121 | err = vio_bus_init(&vio_bus_ops_iseries); | ||
122 | if (err == 0) { | ||
123 | iommu_vio_init(); | ||
124 | vio_bus_device.iommu_table = &vio_iommu_table; | ||
125 | iSeries_vio_dev = &vio_bus_device.dev; | ||
126 | probe_bus_iseries(); | ||
127 | } | ||
128 | return err; | ||
129 | } | ||
130 | |||
131 | __initcall(vio_bus_init_iseries); | ||
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 85d6c93659cc..9a4efc0c3b29 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -437,9 +437,6 @@ void __init maple_pci_init(void) | |||
437 | 437 | ||
438 | /* Tell pci.c to not change any resource allocations. */ | 438 | /* Tell pci.c to not change any resource allocations. */ |
439 | pci_probe_only = 1; | 439 | pci_probe_only = 1; |
440 | |||
441 | /* Allow all IO */ | ||
442 | io_page_mask = -1; | ||
443 | } | 440 | } |
444 | 441 | ||
445 | int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel) | 442 | int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel) |
diff --git a/arch/powerpc/platforms/maple/setup.c b/arch/powerpc/platforms/maple/setup.c index 24c0aef4ea39..a0505ea48a86 100644 --- a/arch/powerpc/platforms/maple/setup.c +++ b/arch/powerpc/platforms/maple/setup.c | |||
@@ -189,7 +189,7 @@ void __init maple_setup_arch(void) | |||
189 | conswitchp = &dummy_con; | 189 | conswitchp = &dummy_con; |
190 | #endif | 190 | #endif |
191 | 191 | ||
192 | printk(KERN_INFO "Using native/NAP idle loop\n"); | 192 | printk(KERN_DEBUG "Using native/NAP idle loop\n"); |
193 | } | 193 | } |
194 | 194 | ||
195 | /* | 195 | /* |
diff --git a/arch/powerpc/platforms/powermac/cpufreq_32.c b/arch/powerpc/platforms/powermac/cpufreq_32.c index cfd6527a0d7e..af2a8f9f1222 100644 --- a/arch/powerpc/platforms/powermac/cpufreq_32.c +++ b/arch/powerpc/platforms/powermac/cpufreq_32.c | |||
@@ -314,7 +314,7 @@ static int pmu_set_cpu_speed(int low_speed) | |||
314 | _set_L3CR(save_l3cr); | 314 | _set_L3CR(save_l3cr); |
315 | 315 | ||
316 | /* Restore userland MMU context */ | 316 | /* Restore userland MMU context */ |
317 | set_context(current->active_mm->context, current->active_mm->pgd); | 317 | set_context(current->active_mm->context.id, current->active_mm->pgd); |
318 | 318 | ||
319 | #ifdef DEBUG_FREQ | 319 | #ifdef DEBUG_FREQ |
320 | printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1)); | 320 | printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1)); |
diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c index a5063cd675c5..85e00cb0006e 100644 --- a/arch/powerpc/platforms/powermac/feature.c +++ b/arch/powerpc/platforms/powermac/feature.c | |||
@@ -2510,7 +2510,7 @@ found: | |||
2510 | if (get_property(np, "flush-on-lock", NULL)) | 2510 | if (get_property(np, "flush-on-lock", NULL)) |
2511 | break; | 2511 | break; |
2512 | powersave_nap = 1; | 2512 | powersave_nap = 1; |
2513 | printk(KERN_INFO "Processor NAP mode on idle enabled.\n"); | 2513 | printk(KERN_DEBUG "Processor NAP mode on idle enabled.\n"); |
2514 | break; | 2514 | break; |
2515 | } | 2515 | } |
2516 | 2516 | ||
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index ea179afea632..80035853467b 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -1068,9 +1068,6 @@ void __init pmac_pci_init(void) | |||
1068 | /* Tell pci.c to not use the common resource allocation mechanism */ | 1068 | /* Tell pci.c to not use the common resource allocation mechanism */ |
1069 | pci_probe_only = 1; | 1069 | pci_probe_only = 1; |
1070 | 1070 | ||
1071 | /* Allow all IO */ | ||
1072 | io_page_mask = -1; | ||
1073 | |||
1074 | #else /* CONFIG_PPC64 */ | 1071 | #else /* CONFIG_PPC64 */ |
1075 | init_p2pbridge(); | 1072 | init_p2pbridge(); |
1076 | fixup_nec_usb2(); | 1073 | fixup_nec_usb2(); |
diff --git a/arch/powerpc/platforms/powermac/pfunc_core.c b/arch/powerpc/platforms/powermac/pfunc_core.c index f08173b0f065..047f954a89eb 100644 --- a/arch/powerpc/platforms/powermac/pfunc_core.c +++ b/arch/powerpc/platforms/powermac/pfunc_core.c | |||
@@ -871,10 +871,17 @@ int pmf_register_irq_client(struct device_node *target, | |||
871 | spin_unlock_irqrestore(&pmf_lock, flags); | 871 | spin_unlock_irqrestore(&pmf_lock, flags); |
872 | if (func == NULL) | 872 | if (func == NULL) |
873 | return -ENODEV; | 873 | return -ENODEV; |
874 | |||
875 | /* guard against manipulations of list */ | ||
874 | mutex_lock(&pmf_irq_mutex); | 876 | mutex_lock(&pmf_irq_mutex); |
875 | if (list_empty(&func->irq_clients)) | 877 | if (list_empty(&func->irq_clients)) |
876 | func->dev->handlers->irq_enable(func); | 878 | func->dev->handlers->irq_enable(func); |
879 | |||
880 | /* guard against pmf_do_irq while changing list */ | ||
881 | spin_lock_irqsave(&pmf_lock, flags); | ||
877 | list_add(&client->link, &func->irq_clients); | 882 | list_add(&client->link, &func->irq_clients); |
883 | spin_unlock_irqrestore(&pmf_lock, flags); | ||
884 | |||
878 | client->func = func; | 885 | client->func = func; |
879 | mutex_unlock(&pmf_irq_mutex); | 886 | mutex_unlock(&pmf_irq_mutex); |
880 | 887 | ||
@@ -885,12 +892,19 @@ EXPORT_SYMBOL_GPL(pmf_register_irq_client); | |||
885 | void pmf_unregister_irq_client(struct pmf_irq_client *client) | 892 | void pmf_unregister_irq_client(struct pmf_irq_client *client) |
886 | { | 893 | { |
887 | struct pmf_function *func = client->func; | 894 | struct pmf_function *func = client->func; |
895 | unsigned long flags; | ||
888 | 896 | ||
889 | BUG_ON(func == NULL); | 897 | BUG_ON(func == NULL); |
890 | 898 | ||
899 | /* guard against manipulations of list */ | ||
891 | mutex_lock(&pmf_irq_mutex); | 900 | mutex_lock(&pmf_irq_mutex); |
892 | client->func = NULL; | 901 | client->func = NULL; |
902 | |||
903 | /* guard against pmf_do_irq while changing list */ | ||
904 | spin_lock_irqsave(&pmf_lock, flags); | ||
893 | list_del(&client->link); | 905 | list_del(&client->link); |
906 | spin_unlock_irqrestore(&pmf_lock, flags); | ||
907 | |||
894 | if (list_empty(&func->irq_clients)) | 908 | if (list_empty(&func->irq_clients)) |
895 | func->dev->handlers->irq_disable(func); | 909 | func->dev->handlers->irq_disable(func); |
896 | mutex_unlock(&pmf_irq_mutex); | 910 | mutex_unlock(&pmf_irq_mutex); |
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c index b9200fb07815..9cc7db7a8bdc 100644 --- a/arch/powerpc/platforms/powermac/setup.c +++ b/arch/powerpc/platforms/powermac/setup.c | |||
@@ -458,7 +458,7 @@ static int pmac_pm_finish(suspend_state_t state) | |||
458 | printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state); | 458 | printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state); |
459 | 459 | ||
460 | /* Restore userland MMU context */ | 460 | /* Restore userland MMU context */ |
461 | set_context(current->active_mm->context, current->active_mm->pgd); | 461 | set_context(current->active_mm->context.id, current->active_mm->pgd); |
462 | 462 | ||
463 | return 0; | 463 | return 0; |
464 | } | 464 | } |
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile index 930898635c9f..e5e0ff466904 100644 --- a/arch/powerpc/platforms/pseries/Makefile +++ b/arch/powerpc/platforms/pseries/Makefile | |||
@@ -1,8 +1,11 @@ | |||
1 | ifeq ($(CONFIG_PPC64),y) | ||
2 | EXTRA_CFLAGS += -mno-minimal-toc | ||
3 | endif | ||
4 | |||
1 | obj-y := pci.o lpar.o hvCall.o nvram.o reconfig.o \ | 5 | obj-y := pci.o lpar.o hvCall.o nvram.o reconfig.o \ |
2 | setup.o iommu.o ras.o rtasd.o pci_dlpar.o \ | 6 | setup.o iommu.o ras.o rtasd.o pci_dlpar.o \ |
3 | firmware.o | 7 | firmware.o |
4 | obj-$(CONFIG_SMP) += smp.o | 8 | obj-$(CONFIG_SMP) += smp.o |
5 | obj-$(CONFIG_IBMVIO) += vio.o | ||
6 | obj-$(CONFIG_XICS) += xics.o | 9 | obj-$(CONFIG_XICS) += xics.o |
7 | obj-$(CONFIG_SCANLOG) += scanlog.o | 10 | obj-$(CONFIG_SCANLOG) += scanlog.o |
8 | obj-$(CONFIG_EEH) += eeh.o eeh_cache.o eeh_driver.o eeh_event.o | 11 | obj-$(CONFIG_EEH) += eeh.o eeh_cache.o eeh_driver.o eeh_event.o |
diff --git a/arch/powerpc/platforms/pseries/eeh_cache.c b/arch/powerpc/platforms/pseries/eeh_cache.c index d4a402c5866c..98c23aec85be 100644 --- a/arch/powerpc/platforms/pseries/eeh_cache.c +++ b/arch/powerpc/platforms/pseries/eeh_cache.c | |||
@@ -304,6 +304,8 @@ void __init pci_addr_cache_build(void) | |||
304 | pci_addr_cache_insert_device(dev); | 304 | pci_addr_cache_insert_device(dev); |
305 | 305 | ||
306 | dn = pci_device_to_OF_node(dev); | 306 | dn = pci_device_to_OF_node(dev); |
307 | if (!dn) | ||
308 | continue; | ||
307 | pci_dev_get (dev); /* matching put is in eeh_remove_device() */ | 309 | pci_dev_get (dev); /* matching put is in eeh_remove_device() */ |
308 | PCI_DN(dn)->pcidev = dev; | 310 | PCI_DN(dn)->pcidev = dev; |
309 | } | 311 | } |
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c index 1fba695e32e8..0ec9a5445b95 100644 --- a/arch/powerpc/platforms/pseries/eeh_driver.c +++ b/arch/powerpc/platforms/pseries/eeh_driver.c | |||
@@ -23,9 +23,8 @@ | |||
23 | * | 23 | * |
24 | */ | 24 | */ |
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <linux/irq.h> | ||
27 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
28 | #include <linux/notifier.h> | 27 | #include <linux/irq.h> |
29 | #include <linux/pci.h> | 28 | #include <linux/pci.h> |
30 | #include <asm/eeh.h> | 29 | #include <asm/eeh.h> |
31 | #include <asm/eeh_event.h> | 30 | #include <asm/eeh_event.h> |
@@ -202,7 +201,11 @@ static void eeh_report_failure(struct pci_dev *dev, void *userdata) | |||
202 | 201 | ||
203 | static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus) | 202 | static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus) |
204 | { | 203 | { |
205 | int rc; | 204 | int cnt, rc; |
205 | |||
206 | /* pcibios will clear the counter; save the value */ | ||
207 | cnt = pe_dn->eeh_freeze_count; | ||
208 | |||
206 | if (bus) | 209 | if (bus) |
207 | pcibios_remove_pci_devices(bus); | 210 | pcibios_remove_pci_devices(bus); |
208 | 211 | ||
@@ -241,6 +244,7 @@ static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus) | |||
241 | ssleep (5); | 244 | ssleep (5); |
242 | pcibios_add_pci_devices(bus); | 245 | pcibios_add_pci_devices(bus); |
243 | } | 246 | } |
247 | pe_dn->eeh_freeze_count = cnt; | ||
244 | 248 | ||
245 | return 0; | 249 | return 0; |
246 | } | 250 | } |
@@ -250,23 +254,29 @@ static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus) | |||
250 | */ | 254 | */ |
251 | #define MAX_WAIT_FOR_RECOVERY 15 | 255 | #define MAX_WAIT_FOR_RECOVERY 15 |
252 | 256 | ||
253 | void handle_eeh_events (struct eeh_event *event) | 257 | struct pci_dn * handle_eeh_events (struct eeh_event *event) |
254 | { | 258 | { |
255 | struct device_node *frozen_dn; | 259 | struct device_node *frozen_dn; |
256 | struct pci_dn *frozen_pdn; | 260 | struct pci_dn *frozen_pdn; |
257 | struct pci_bus *frozen_bus; | 261 | struct pci_bus *frozen_bus; |
258 | int rc = 0; | 262 | int rc = 0; |
259 | enum pci_ers_result result = PCI_ERS_RESULT_NONE; | 263 | enum pci_ers_result result = PCI_ERS_RESULT_NONE; |
260 | const char *pci_str, *drv_str; | 264 | const char *location, *pci_str, *drv_str; |
261 | 265 | ||
262 | frozen_dn = find_device_pe(event->dn); | 266 | frozen_dn = find_device_pe(event->dn); |
263 | frozen_bus = pcibios_find_pci_bus(frozen_dn); | 267 | frozen_bus = pcibios_find_pci_bus(frozen_dn); |
264 | 268 | ||
265 | if (!frozen_dn) { | 269 | if (!frozen_dn) { |
266 | printk(KERN_ERR "EEH: Error: Cannot find partition endpoint for %s\n", | 270 | |
267 | pci_name(event->dev)); | 271 | location = (char *) get_property(event->dn, "ibm,loc-code", NULL); |
268 | return; | 272 | location = location ? location : "unknown"; |
273 | printk(KERN_ERR "EEH: Error: Cannot find partition endpoint " | ||
274 | "for location=%s pci addr=%s\n", | ||
275 | location, pci_name(event->dev)); | ||
276 | return NULL; | ||
269 | } | 277 | } |
278 | location = (char *) get_property(frozen_dn, "ibm,loc-code", NULL); | ||
279 | location = location ? location : "unknown"; | ||
270 | 280 | ||
271 | /* There are two different styles for coming up with the PE. | 281 | /* There are two different styles for coming up with the PE. |
272 | * In the old style, it was the highest EEH-capable device | 282 | * In the old style, it was the highest EEH-capable device |
@@ -278,9 +288,10 @@ void handle_eeh_events (struct eeh_event *event) | |||
278 | frozen_bus = pcibios_find_pci_bus (frozen_dn->parent); | 288 | frozen_bus = pcibios_find_pci_bus (frozen_dn->parent); |
279 | 289 | ||
280 | if (!frozen_bus) { | 290 | if (!frozen_bus) { |
281 | printk(KERN_ERR "EEH: Cannot find PCI bus for %s\n", | 291 | printk(KERN_ERR "EEH: Cannot find PCI bus " |
282 | frozen_dn->full_name); | 292 | "for location=%s dn=%s\n", |
283 | return; | 293 | location, frozen_dn->full_name); |
294 | return NULL; | ||
284 | } | 295 | } |
285 | 296 | ||
286 | #if 0 | 297 | #if 0 |
@@ -314,8 +325,9 @@ void handle_eeh_events (struct eeh_event *event) | |||
314 | 325 | ||
315 | eeh_slot_error_detail(frozen_pdn, 1 /* Temporary Error */); | 326 | eeh_slot_error_detail(frozen_pdn, 1 /* Temporary Error */); |
316 | printk(KERN_WARNING | 327 | printk(KERN_WARNING |
317 | "EEH: This PCI device has failed %d times since last reboot: %s - %s\n", | 328 | "EEH: This PCI device has failed %d times since last reboot: " |
318 | frozen_pdn->eeh_freeze_count, drv_str, pci_str); | 329 | "location=%s driver=%s pci addr=%s\n", |
330 | frozen_pdn->eeh_freeze_count, location, drv_str, pci_str); | ||
319 | 331 | ||
320 | /* Walk the various device drivers attached to this slot through | 332 | /* Walk the various device drivers attached to this slot through |
321 | * a reset sequence, giving each an opportunity to do what it needs | 333 | * a reset sequence, giving each an opportunity to do what it needs |
@@ -355,7 +367,7 @@ void handle_eeh_events (struct eeh_event *event) | |||
355 | /* Tell all device drivers that they can resume operations */ | 367 | /* Tell all device drivers that they can resume operations */ |
356 | pci_walk_bus(frozen_bus, eeh_report_resume, NULL); | 368 | pci_walk_bus(frozen_bus, eeh_report_resume, NULL); |
357 | 369 | ||
358 | return; | 370 | return frozen_pdn; |
359 | 371 | ||
360 | excess_failures: | 372 | excess_failures: |
361 | /* | 373 | /* |
@@ -364,17 +376,18 @@ excess_failures: | |||
364 | * due to actual, failed cards. | 376 | * due to actual, failed cards. |
365 | */ | 377 | */ |
366 | printk(KERN_ERR | 378 | printk(KERN_ERR |
367 | "EEH: PCI device %s - %s has failed %d times \n" | 379 | "EEH: PCI device at location=%s driver=%s pci addr=%s \n" |
368 | "and has been permanently disabled. Please try reseating\n" | 380 | "has failed %d times and has been permanently disabled. \n" |
369 | "this device or replacing it.\n", | 381 | "Please try reseating this device or replacing it.\n", |
370 | drv_str, pci_str, frozen_pdn->eeh_freeze_count); | 382 | location, drv_str, pci_str, frozen_pdn->eeh_freeze_count); |
371 | goto perm_error; | 383 | goto perm_error; |
372 | 384 | ||
373 | hard_fail: | 385 | hard_fail: |
374 | printk(KERN_ERR | 386 | printk(KERN_ERR |
375 | "EEH: Unable to recover from failure of PCI device %s - %s\n" | 387 | "EEH: Unable to recover from failure of PCI device " |
388 | "at location=%s driver=%s pci addr=%s \n" | ||
376 | "Please try reseating this device or replacing it.\n", | 389 | "Please try reseating this device or replacing it.\n", |
377 | drv_str, pci_str); | 390 | location, drv_str, pci_str); |
378 | 391 | ||
379 | perm_error: | 392 | perm_error: |
380 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); | 393 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); |
@@ -384,6 +397,8 @@ perm_error: | |||
384 | 397 | ||
385 | /* Shut down the device drivers for good. */ | 398 | /* Shut down the device drivers for good. */ |
386 | pcibios_remove_pci_devices(frozen_bus); | 399 | pcibios_remove_pci_devices(frozen_bus); |
400 | |||
401 | return NULL; | ||
387 | } | 402 | } |
388 | 403 | ||
389 | /* ---------- end of file ---------- */ | 404 | /* ---------- end of file ---------- */ |
diff --git a/arch/powerpc/platforms/pseries/eeh_event.c b/arch/powerpc/platforms/pseries/eeh_event.c index 40020c65c89e..8f2d12935b99 100644 --- a/arch/powerpc/platforms/pseries/eeh_event.c +++ b/arch/powerpc/platforms/pseries/eeh_event.c | |||
@@ -18,6 +18,7 @@ | |||
18 | * Copyright (c) 2005 Linas Vepstas <linas@linas.org> | 18 | * Copyright (c) 2005 Linas Vepstas <linas@linas.org> |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <linux/delay.h> | ||
21 | #include <linux/list.h> | 22 | #include <linux/list.h> |
22 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
23 | #include <linux/pci.h> | 24 | #include <linux/pci.h> |
@@ -56,38 +57,43 @@ static int eeh_event_handler(void * dummy) | |||
56 | { | 57 | { |
57 | unsigned long flags; | 58 | unsigned long flags; |
58 | struct eeh_event *event; | 59 | struct eeh_event *event; |
60 | struct pci_dn *pdn; | ||
59 | 61 | ||
60 | daemonize ("eehd"); | 62 | daemonize ("eehd"); |
63 | set_current_state(TASK_INTERRUPTIBLE); | ||
61 | 64 | ||
62 | while (1) { | 65 | spin_lock_irqsave(&eeh_eventlist_lock, flags); |
63 | set_current_state(TASK_INTERRUPTIBLE); | 66 | event = NULL; |
64 | 67 | ||
65 | spin_lock_irqsave(&eeh_eventlist_lock, flags); | 68 | /* Unqueue the event, get ready to process. */ |
66 | event = NULL; | 69 | if (!list_empty(&eeh_eventlist)) { |
70 | event = list_entry(eeh_eventlist.next, struct eeh_event, list); | ||
71 | list_del(&event->list); | ||
72 | } | ||
73 | spin_unlock_irqrestore(&eeh_eventlist_lock, flags); | ||
67 | 74 | ||
68 | /* Unqueue the event, get ready to process. */ | 75 | if (event == NULL) |
69 | if (!list_empty(&eeh_eventlist)) { | 76 | return 0; |
70 | event = list_entry(eeh_eventlist.next, struct eeh_event, list); | ||
71 | list_del(&event->list); | ||
72 | } | ||
73 | spin_unlock_irqrestore(&eeh_eventlist_lock, flags); | ||
74 | 77 | ||
75 | if (event == NULL) | 78 | /* Serialize processing of EEH events */ |
76 | break; | 79 | mutex_lock(&eeh_event_mutex); |
80 | eeh_mark_slot(event->dn, EEH_MODE_RECOVERING); | ||
77 | 81 | ||
78 | /* Serialize processing of EEH events */ | 82 | printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n", |
79 | mutex_lock(&eeh_event_mutex); | 83 | pci_name(event->dev)); |
80 | eeh_mark_slot(event->dn, EEH_MODE_RECOVERING); | ||
81 | 84 | ||
82 | printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n", | 85 | pdn = handle_eeh_events(event); |
83 | pci_name(event->dev)); | ||
84 | 86 | ||
85 | handle_eeh_events(event); | 87 | eeh_clear_slot(event->dn, EEH_MODE_RECOVERING); |
88 | pci_dev_put(event->dev); | ||
89 | kfree(event); | ||
90 | mutex_unlock(&eeh_event_mutex); | ||
86 | 91 | ||
87 | eeh_clear_slot(event->dn, EEH_MODE_RECOVERING); | 92 | /* If there are no new errors after an hour, clear the counter. */ |
88 | pci_dev_put(event->dev); | 93 | if (pdn && pdn->eeh_freeze_count>0) { |
89 | kfree(event); | 94 | msleep_interruptible (3600*1000); |
90 | mutex_unlock(&eeh_event_mutex); | 95 | if (pdn->eeh_freeze_count>0) |
96 | pdn->eeh_freeze_count--; | ||
91 | } | 97 | } |
92 | 98 | ||
93 | return 0; | 99 | return 0; |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 2643078433f0..d03a8b078f9d 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -1,23 +1,24 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation | 2 | * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation |
3 | * | 3 | * |
4 | * Rewrite, cleanup: | 4 | * Rewrite, cleanup: |
5 | * | 5 | * |
6 | * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation | 6 | * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation |
7 | * Copyright (C) 2006 Olof Johansson <olof@lixom.net> | ||
7 | * | 8 | * |
8 | * Dynamic DMA mapping support, pSeries-specific parts, both SMP and LPAR. | 9 | * Dynamic DMA mapping support, pSeries-specific parts, both SMP and LPAR. |
9 | * | 10 | * |
10 | * | 11 | * |
11 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
13 | * the Free Software Foundation; either version 2 of the License, or | 14 | * the Free Software Foundation; either version 2 of the License, or |
14 | * (at your option) any later version. | 15 | * (at your option) any later version. |
15 | * | 16 | * |
16 | * This program is distributed in the hope that it will be useful, | 17 | * This program is distributed in the hope that it will be useful, |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
20 | * | 21 | * |
21 | * You should have received a copy of the GNU General Public License | 22 | * You should have received a copy of the GNU General Public License |
22 | * along with this program; if not, write to the Free Software | 23 | * along with this program; if not, write to the Free Software |
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
@@ -49,52 +50,46 @@ | |||
49 | 50 | ||
50 | #define DBG(fmt...) | 51 | #define DBG(fmt...) |
51 | 52 | ||
52 | static void tce_build_pSeries(struct iommu_table *tbl, long index, | 53 | static void tce_build_pSeries(struct iommu_table *tbl, long index, |
53 | long npages, unsigned long uaddr, | 54 | long npages, unsigned long uaddr, |
54 | enum dma_data_direction direction) | 55 | enum dma_data_direction direction) |
55 | { | 56 | { |
56 | union tce_entry t; | 57 | u64 proto_tce; |
57 | union tce_entry *tp; | 58 | u64 *tcep; |
59 | u64 rpn; | ||
58 | 60 | ||
59 | index <<= TCE_PAGE_FACTOR; | 61 | index <<= TCE_PAGE_FACTOR; |
60 | npages <<= TCE_PAGE_FACTOR; | 62 | npages <<= TCE_PAGE_FACTOR; |
61 | 63 | ||
62 | t.te_word = 0; | 64 | proto_tce = TCE_PCI_READ; // Read allowed |
63 | t.te_rdwr = 1; // Read allowed | ||
64 | 65 | ||
65 | if (direction != DMA_TO_DEVICE) | 66 | if (direction != DMA_TO_DEVICE) |
66 | t.te_pciwr = 1; | 67 | proto_tce |= TCE_PCI_WRITE; |
67 | 68 | ||
68 | tp = ((union tce_entry *)tbl->it_base) + index; | 69 | tcep = ((u64 *)tbl->it_base) + index; |
69 | 70 | ||
70 | while (npages--) { | 71 | while (npages--) { |
71 | /* can't move this out since we might cross LMB boundary */ | 72 | /* can't move this out since we might cross LMB boundary */ |
72 | t.te_rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; | 73 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; |
73 | 74 | *tcep = proto_tce | (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; | |
74 | tp->te_word = t.te_word; | ||
75 | 75 | ||
76 | uaddr += TCE_PAGE_SIZE; | 76 | uaddr += TCE_PAGE_SIZE; |
77 | tp++; | 77 | tcep++; |
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
81 | 81 | ||
82 | static void tce_free_pSeries(struct iommu_table *tbl, long index, long npages) | 82 | static void tce_free_pSeries(struct iommu_table *tbl, long index, long npages) |
83 | { | 83 | { |
84 | union tce_entry t; | 84 | u64 *tcep; |
85 | union tce_entry *tp; | ||
86 | 85 | ||
87 | npages <<= TCE_PAGE_FACTOR; | 86 | npages <<= TCE_PAGE_FACTOR; |
88 | index <<= TCE_PAGE_FACTOR; | 87 | index <<= TCE_PAGE_FACTOR; |
89 | 88 | ||
90 | t.te_word = 0; | 89 | tcep = ((u64 *)tbl->it_base) + index; |
91 | tp = ((union tce_entry *)tbl->it_base) + index; | 90 | |
92 | 91 | while (npages--) | |
93 | while (npages--) { | 92 | *(tcep++) = 0; |
94 | tp->te_word = t.te_word; | ||
95 | |||
96 | tp++; | ||
97 | } | ||
98 | } | 93 | } |
99 | 94 | ||
100 | 95 | ||
@@ -103,43 +98,44 @@ static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
103 | enum dma_data_direction direction) | 98 | enum dma_data_direction direction) |
104 | { | 99 | { |
105 | u64 rc; | 100 | u64 rc; |
106 | union tce_entry tce; | 101 | u64 proto_tce, tce; |
102 | u64 rpn; | ||
107 | 103 | ||
108 | tcenum <<= TCE_PAGE_FACTOR; | 104 | tcenum <<= TCE_PAGE_FACTOR; |
109 | npages <<= TCE_PAGE_FACTOR; | 105 | npages <<= TCE_PAGE_FACTOR; |
110 | 106 | ||
111 | tce.te_word = 0; | 107 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; |
112 | tce.te_rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; | 108 | proto_tce = TCE_PCI_READ; |
113 | tce.te_rdwr = 1; | ||
114 | if (direction != DMA_TO_DEVICE) | 109 | if (direction != DMA_TO_DEVICE) |
115 | tce.te_pciwr = 1; | 110 | proto_tce |= TCE_PCI_WRITE; |
116 | 111 | ||
117 | while (npages--) { | 112 | while (npages--) { |
118 | rc = plpar_tce_put((u64)tbl->it_index, | 113 | tce = proto_tce | (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; |
119 | (u64)tcenum << 12, | 114 | rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, tce); |
120 | tce.te_word ); | 115 | |
121 | |||
122 | if (rc && printk_ratelimit()) { | 116 | if (rc && printk_ratelimit()) { |
123 | printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); | 117 | printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); |
124 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); | 118 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); |
125 | printk("\ttcenum = 0x%lx\n", (u64)tcenum); | 119 | printk("\ttcenum = 0x%lx\n", (u64)tcenum); |
126 | printk("\ttce val = 0x%lx\n", tce.te_word ); | 120 | printk("\ttce val = 0x%lx\n", tce ); |
127 | show_stack(current, (unsigned long *)__get_SP()); | 121 | show_stack(current, (unsigned long *)__get_SP()); |
128 | } | 122 | } |
129 | 123 | ||
130 | tcenum++; | 124 | tcenum++; |
131 | tce.te_rpn++; | 125 | rpn++; |
132 | } | 126 | } |
133 | } | 127 | } |
134 | 128 | ||
135 | static DEFINE_PER_CPU(void *, tce_page) = NULL; | 129 | static DEFINE_PER_CPU(u64 *, tce_page) = NULL; |
136 | 130 | ||
137 | static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | 131 | static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, |
138 | long npages, unsigned long uaddr, | 132 | long npages, unsigned long uaddr, |
139 | enum dma_data_direction direction) | 133 | enum dma_data_direction direction) |
140 | { | 134 | { |
141 | u64 rc; | 135 | u64 rc; |
142 | union tce_entry tce, *tcep; | 136 | u64 proto_tce; |
137 | u64 *tcep; | ||
138 | u64 rpn; | ||
143 | long l, limit; | 139 | long l, limit; |
144 | 140 | ||
145 | if (TCE_PAGE_FACTOR == 0 && npages == 1) | 141 | if (TCE_PAGE_FACTOR == 0 && npages == 1) |
@@ -152,7 +148,7 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
152 | * from iommu_alloc{,_sg}() | 148 | * from iommu_alloc{,_sg}() |
153 | */ | 149 | */ |
154 | if (!tcep) { | 150 | if (!tcep) { |
155 | tcep = (void *)__get_free_page(GFP_ATOMIC); | 151 | tcep = (u64 *)__get_free_page(GFP_ATOMIC); |
156 | /* If allocation fails, fall back to the loop implementation */ | 152 | /* If allocation fails, fall back to the loop implementation */ |
157 | if (!tcep) | 153 | if (!tcep) |
158 | return tce_build_pSeriesLP(tbl, tcenum, npages, | 154 | return tce_build_pSeriesLP(tbl, tcenum, npages, |
@@ -163,11 +159,10 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
163 | tcenum <<= TCE_PAGE_FACTOR; | 159 | tcenum <<= TCE_PAGE_FACTOR; |
164 | npages <<= TCE_PAGE_FACTOR; | 160 | npages <<= TCE_PAGE_FACTOR; |
165 | 161 | ||
166 | tce.te_word = 0; | 162 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; |
167 | tce.te_rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; | 163 | proto_tce = TCE_PCI_READ; |
168 | tce.te_rdwr = 1; | ||
169 | if (direction != DMA_TO_DEVICE) | 164 | if (direction != DMA_TO_DEVICE) |
170 | tce.te_pciwr = 1; | 165 | proto_tce |= TCE_PCI_WRITE; |
171 | 166 | ||
172 | /* We can map max one pageful of TCEs at a time */ | 167 | /* We can map max one pageful of TCEs at a time */ |
173 | do { | 168 | do { |
@@ -175,11 +170,11 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
175 | * Set up the page with TCE data, looping through and setting | 170 | * Set up the page with TCE data, looping through and setting |
176 | * the values. | 171 | * the values. |
177 | */ | 172 | */ |
178 | limit = min_t(long, npages, 4096/sizeof(union tce_entry)); | 173 | limit = min_t(long, npages, 4096/TCE_ENTRY_SIZE); |
179 | 174 | ||
180 | for (l = 0; l < limit; l++) { | 175 | for (l = 0; l < limit; l++) { |
181 | tcep[l] = tce; | 176 | tcep[l] = proto_tce | (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; |
182 | tce.te_rpn++; | 177 | rpn++; |
183 | } | 178 | } |
184 | 179 | ||
185 | rc = plpar_tce_put_indirect((u64)tbl->it_index, | 180 | rc = plpar_tce_put_indirect((u64)tbl->it_index, |
@@ -195,7 +190,7 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
195 | printk("tce_buildmulti_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); | 190 | printk("tce_buildmulti_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); |
196 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); | 191 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); |
197 | printk("\tnpages = 0x%lx\n", (u64)npages); | 192 | printk("\tnpages = 0x%lx\n", (u64)npages); |
198 | printk("\ttce[0] val = 0x%lx\n", tcep[0].te_word); | 193 | printk("\ttce[0] val = 0x%lx\n", tcep[0]); |
199 | show_stack(current, (unsigned long *)__get_SP()); | 194 | show_stack(current, (unsigned long *)__get_SP()); |
200 | } | 195 | } |
201 | } | 196 | } |
@@ -203,23 +198,17 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
203 | static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) | 198 | static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) |
204 | { | 199 | { |
205 | u64 rc; | 200 | u64 rc; |
206 | union tce_entry tce; | ||
207 | 201 | ||
208 | tcenum <<= TCE_PAGE_FACTOR; | 202 | tcenum <<= TCE_PAGE_FACTOR; |
209 | npages <<= TCE_PAGE_FACTOR; | 203 | npages <<= TCE_PAGE_FACTOR; |
210 | 204 | ||
211 | tce.te_word = 0; | ||
212 | |||
213 | while (npages--) { | 205 | while (npages--) { |
214 | rc = plpar_tce_put((u64)tbl->it_index, | 206 | rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); |
215 | (u64)tcenum << 12, | ||
216 | tce.te_word); | ||
217 | 207 | ||
218 | if (rc && printk_ratelimit()) { | 208 | if (rc && printk_ratelimit()) { |
219 | printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); | 209 | printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); |
220 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); | 210 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); |
221 | printk("\ttcenum = 0x%lx\n", (u64)tcenum); | 211 | printk("\ttcenum = 0x%lx\n", (u64)tcenum); |
222 | printk("\ttce val = 0x%lx\n", tce.te_word ); | ||
223 | show_stack(current, (unsigned long *)__get_SP()); | 212 | show_stack(current, (unsigned long *)__get_SP()); |
224 | } | 213 | } |
225 | 214 | ||
@@ -231,31 +220,24 @@ static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages | |||
231 | static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) | 220 | static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) |
232 | { | 221 | { |
233 | u64 rc; | 222 | u64 rc; |
234 | union tce_entry tce; | ||
235 | 223 | ||
236 | tcenum <<= TCE_PAGE_FACTOR; | 224 | tcenum <<= TCE_PAGE_FACTOR; |
237 | npages <<= TCE_PAGE_FACTOR; | 225 | npages <<= TCE_PAGE_FACTOR; |
238 | 226 | ||
239 | tce.te_word = 0; | 227 | rc = plpar_tce_stuff((u64)tbl->it_index, (u64)tcenum << 12, 0, npages); |
240 | |||
241 | rc = plpar_tce_stuff((u64)tbl->it_index, | ||
242 | (u64)tcenum << 12, | ||
243 | tce.te_word, | ||
244 | npages); | ||
245 | 228 | ||
246 | if (rc && printk_ratelimit()) { | 229 | if (rc && printk_ratelimit()) { |
247 | printk("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n"); | 230 | printk("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n"); |
248 | printk("\trc = %ld\n", rc); | 231 | printk("\trc = %ld\n", rc); |
249 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); | 232 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); |
250 | printk("\tnpages = 0x%lx\n", (u64)npages); | 233 | printk("\tnpages = 0x%lx\n", (u64)npages); |
251 | printk("\ttce val = 0x%lx\n", tce.te_word ); | ||
252 | show_stack(current, (unsigned long *)__get_SP()); | 234 | show_stack(current, (unsigned long *)__get_SP()); |
253 | } | 235 | } |
254 | } | 236 | } |
255 | 237 | ||
256 | static void iommu_table_setparms(struct pci_controller *phb, | 238 | static void iommu_table_setparms(struct pci_controller *phb, |
257 | struct device_node *dn, | 239 | struct device_node *dn, |
258 | struct iommu_table *tbl) | 240 | struct iommu_table *tbl) |
259 | { | 241 | { |
260 | struct device_node *node; | 242 | struct device_node *node; |
261 | unsigned long *basep; | 243 | unsigned long *basep; |
@@ -275,16 +257,16 @@ static void iommu_table_setparms(struct pci_controller *phb, | |||
275 | memset((void *)tbl->it_base, 0, *sizep); | 257 | memset((void *)tbl->it_base, 0, *sizep); |
276 | 258 | ||
277 | tbl->it_busno = phb->bus->number; | 259 | tbl->it_busno = phb->bus->number; |
278 | 260 | ||
279 | /* Units of tce entries */ | 261 | /* Units of tce entries */ |
280 | tbl->it_offset = phb->dma_window_base_cur >> PAGE_SHIFT; | 262 | tbl->it_offset = phb->dma_window_base_cur >> PAGE_SHIFT; |
281 | 263 | ||
282 | /* Test if we are going over 2GB of DMA space */ | 264 | /* Test if we are going over 2GB of DMA space */ |
283 | if (phb->dma_window_base_cur + phb->dma_window_size > 0x80000000ul) { | 265 | if (phb->dma_window_base_cur + phb->dma_window_size > 0x80000000ul) { |
284 | udbg_printf("PCI_DMA: Unexpected number of IOAs under this PHB.\n"); | 266 | udbg_printf("PCI_DMA: Unexpected number of IOAs under this PHB.\n"); |
285 | panic("PCI_DMA: Unexpected number of IOAs under this PHB.\n"); | 267 | panic("PCI_DMA: Unexpected number of IOAs under this PHB.\n"); |
286 | } | 268 | } |
287 | 269 | ||
288 | phb->dma_window_base_cur += phb->dma_window_size; | 270 | phb->dma_window_base_cur += phb->dma_window_size; |
289 | 271 | ||
290 | /* Set the tce table size - measured in entries */ | 272 | /* Set the tce table size - measured in entries */ |
@@ -299,30 +281,22 @@ static void iommu_table_setparms(struct pci_controller *phb, | |||
299 | * iommu_table_setparms_lpar | 281 | * iommu_table_setparms_lpar |
300 | * | 282 | * |
301 | * Function: On pSeries LPAR systems, return TCE table info, given a pci bus. | 283 | * Function: On pSeries LPAR systems, return TCE table info, given a pci bus. |
302 | * | ||
303 | * ToDo: properly interpret the ibm,dma-window property. The definition is: | ||
304 | * logical-bus-number (1 word) | ||
305 | * phys-address (#address-cells words) | ||
306 | * size (#cell-size words) | ||
307 | * | ||
308 | * Currently we hard code these sizes (more or less). | ||
309 | */ | 284 | */ |
310 | static void iommu_table_setparms_lpar(struct pci_controller *phb, | 285 | static void iommu_table_setparms_lpar(struct pci_controller *phb, |
311 | struct device_node *dn, | 286 | struct device_node *dn, |
312 | struct iommu_table *tbl, | 287 | struct iommu_table *tbl, |
313 | unsigned int *dma_window) | 288 | unsigned char *dma_window) |
314 | { | 289 | { |
290 | unsigned long offset, size; | ||
291 | |||
315 | tbl->it_busno = PCI_DN(dn)->bussubno; | 292 | tbl->it_busno = PCI_DN(dn)->bussubno; |
293 | of_parse_dma_window(dn, dma_window, &tbl->it_index, &offset, &size); | ||
316 | 294 | ||
317 | /* TODO: Parse field size properties properly. */ | ||
318 | tbl->it_size = (((unsigned long)dma_window[4] << 32) | | ||
319 | (unsigned long)dma_window[5]) >> PAGE_SHIFT; | ||
320 | tbl->it_offset = (((unsigned long)dma_window[2] << 32) | | ||
321 | (unsigned long)dma_window[3]) >> PAGE_SHIFT; | ||
322 | tbl->it_base = 0; | 295 | tbl->it_base = 0; |
323 | tbl->it_index = dma_window[0]; | ||
324 | tbl->it_blocksize = 16; | 296 | tbl->it_blocksize = 16; |
325 | tbl->it_type = TCE_PCI; | 297 | tbl->it_type = TCE_PCI; |
298 | tbl->it_offset = offset >> PAGE_SHIFT; | ||
299 | tbl->it_size = size >> PAGE_SHIFT; | ||
326 | } | 300 | } |
327 | 301 | ||
328 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) | 302 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) |
@@ -357,13 +331,9 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
357 | if (isa_dn_orig) | 331 | if (isa_dn_orig) |
358 | of_node_put(isa_dn_orig); | 332 | of_node_put(isa_dn_orig); |
359 | 333 | ||
360 | /* Count number of direct PCI children of the PHB. | 334 | /* Count number of direct PCI children of the PHB. */ |
361 | * All PCI device nodes have class-code property, so it's | ||
362 | * an easy way to find them. | ||
363 | */ | ||
364 | for (children = 0, tmp = dn->child; tmp; tmp = tmp->sibling) | 335 | for (children = 0, tmp = dn->child; tmp; tmp = tmp->sibling) |
365 | if (get_property(tmp, "class-code", NULL)) | 336 | children++; |
366 | children++; | ||
367 | 337 | ||
368 | DBG("Children: %d\n", children); | 338 | DBG("Children: %d\n", children); |
369 | 339 | ||
@@ -394,10 +364,11 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
394 | pci->phb->dma_window_size = 0x8000000ul; | 364 | pci->phb->dma_window_size = 0x8000000ul; |
395 | pci->phb->dma_window_base_cur = 0x8000000ul; | 365 | pci->phb->dma_window_base_cur = 0x8000000ul; |
396 | 366 | ||
397 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 367 | tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL, |
368 | pci->phb->node); | ||
398 | 369 | ||
399 | iommu_table_setparms(pci->phb, dn, tbl); | 370 | iommu_table_setparms(pci->phb, dn, tbl); |
400 | pci->iommu_table = iommu_init_table(tbl); | 371 | pci->iommu_table = iommu_init_table(tbl, pci->phb->node); |
401 | 372 | ||
402 | /* Divide the rest (1.75GB) among the children */ | 373 | /* Divide the rest (1.75GB) among the children */ |
403 | pci->phb->dma_window_size = 0x80000000ul; | 374 | pci->phb->dma_window_size = 0x80000000ul; |
@@ -414,7 +385,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus) | |||
414 | struct iommu_table *tbl; | 385 | struct iommu_table *tbl; |
415 | struct device_node *dn, *pdn; | 386 | struct device_node *dn, *pdn; |
416 | struct pci_dn *ppci; | 387 | struct pci_dn *ppci; |
417 | unsigned int *dma_window = NULL; | 388 | unsigned char *dma_window = NULL; |
418 | 389 | ||
419 | DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); | 390 | DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); |
420 | 391 | ||
@@ -422,7 +393,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus) | |||
422 | 393 | ||
423 | /* Find nearest ibm,dma-window, walking up the device tree */ | 394 | /* Find nearest ibm,dma-window, walking up the device tree */ |
424 | for (pdn = dn; pdn != NULL; pdn = pdn->parent) { | 395 | for (pdn = dn; pdn != NULL; pdn = pdn->parent) { |
425 | dma_window = (unsigned int *)get_property(pdn, "ibm,dma-window", NULL); | 396 | dma_window = get_property(pdn, "ibm,dma-window", NULL); |
426 | if (dma_window != NULL) | 397 | if (dma_window != NULL) |
427 | break; | 398 | break; |
428 | } | 399 | } |
@@ -440,12 +411,12 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus) | |||
440 | 411 | ||
441 | ppci->bussubno = bus->number; | 412 | ppci->bussubno = bus->number; |
442 | 413 | ||
443 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), | 414 | tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL, |
444 | GFP_KERNEL); | 415 | ppci->phb->node); |
445 | 416 | ||
446 | iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window); | 417 | iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window); |
447 | 418 | ||
448 | ppci->iommu_table = iommu_init_table(tbl); | 419 | ppci->iommu_table = iommu_init_table(tbl, ppci->phb->node); |
449 | } | 420 | } |
450 | 421 | ||
451 | if (pdn != dn) | 422 | if (pdn != dn) |
@@ -468,9 +439,11 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev) | |||
468 | */ | 439 | */ |
469 | if (!dev->bus->self) { | 440 | if (!dev->bus->self) { |
470 | DBG(" --> first child, no bridge. Allocating iommu table.\n"); | 441 | DBG(" --> first child, no bridge. Allocating iommu table.\n"); |
471 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 442 | tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL, |
443 | PCI_DN(dn)->phb->node); | ||
472 | iommu_table_setparms(PCI_DN(dn)->phb, dn, tbl); | 444 | iommu_table_setparms(PCI_DN(dn)->phb, dn, tbl); |
473 | PCI_DN(mydn)->iommu_table = iommu_init_table(tbl); | 445 | PCI_DN(dn)->iommu_table = iommu_init_table(tbl, |
446 | PCI_DN(dn)->phb->node); | ||
474 | 447 | ||
475 | return; | 448 | return; |
476 | } | 449 | } |
@@ -516,7 +489,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
516 | { | 489 | { |
517 | struct device_node *pdn, *dn; | 490 | struct device_node *pdn, *dn; |
518 | struct iommu_table *tbl; | 491 | struct iommu_table *tbl; |
519 | int *dma_window = NULL; | 492 | unsigned char *dma_window = NULL; |
520 | struct pci_dn *pci; | 493 | struct pci_dn *pci; |
521 | 494 | ||
522 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, pci_name(dev)); | 495 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, pci_name(dev)); |
@@ -531,8 +504,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
531 | 504 | ||
532 | for (pdn = dn; pdn && PCI_DN(pdn) && !PCI_DN(pdn)->iommu_table; | 505 | for (pdn = dn; pdn && PCI_DN(pdn) && !PCI_DN(pdn)->iommu_table; |
533 | pdn = pdn->parent) { | 506 | pdn = pdn->parent) { |
534 | dma_window = (unsigned int *) | 507 | dma_window = get_property(pdn, "ibm,dma-window", NULL); |
535 | get_property(pdn, "ibm,dma-window", NULL); | ||
536 | if (dma_window) | 508 | if (dma_window) |
537 | break; | 509 | break; |
538 | } | 510 | } |
@@ -553,12 +525,12 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
553 | /* iommu_table_setparms_lpar needs bussubno. */ | 525 | /* iommu_table_setparms_lpar needs bussubno. */ |
554 | pci->bussubno = pci->phb->bus->number; | 526 | pci->bussubno = pci->phb->bus->number; |
555 | 527 | ||
556 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), | 528 | tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL, |
557 | GFP_KERNEL); | 529 | pci->phb->node); |
558 | 530 | ||
559 | iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window); | 531 | iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window); |
560 | 532 | ||
561 | pci->iommu_table = iommu_init_table(tbl); | 533 | pci->iommu_table = iommu_init_table(tbl, pci->phb->node); |
562 | } | 534 | } |
563 | 535 | ||
564 | if (pdn != dn) | 536 | if (pdn != dn) |
diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index e0000ce769e5..2e4e04042d85 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c | |||
@@ -348,7 +348,7 @@ static int enable_surveillance(int timeout) | |||
348 | return 0; | 348 | return 0; |
349 | 349 | ||
350 | if (error == -EINVAL) { | 350 | if (error == -EINVAL) { |
351 | printk(KERN_INFO "rtasd: surveillance not supported\n"); | 351 | printk(KERN_DEBUG "rtasd: surveillance not supported\n"); |
352 | return 0; | 352 | return 0; |
353 | } | 353 | } |
354 | 354 | ||
@@ -440,7 +440,7 @@ static int rtasd(void *unused) | |||
440 | goto error; | 440 | goto error; |
441 | } | 441 | } |
442 | 442 | ||
443 | printk(KERN_INFO "RTAS daemon started\n"); | 443 | printk(KERN_DEBUG "RTAS daemon started\n"); |
444 | 444 | ||
445 | DEBUG("will sleep for %d milliseconds\n", (30000/rtas_event_scan_rate)); | 445 | DEBUG("will sleep for %d milliseconds\n", (30000/rtas_event_scan_rate)); |
446 | 446 | ||
@@ -487,7 +487,7 @@ static int __init rtas_init(void) | |||
487 | 487 | ||
488 | /* No RTAS */ | 488 | /* No RTAS */ |
489 | if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) { | 489 | if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) { |
490 | printk(KERN_INFO "rtasd: no event-scan on system\n"); | 490 | printk(KERN_DEBUG "rtasd: no event-scan on system\n"); |
491 | return -ENODEV; | 491 | return -ENODEV; |
492 | } | 492 | } |
493 | 493 | ||
diff --git a/arch/powerpc/platforms/pseries/scanlog.c b/arch/powerpc/platforms/pseries/scanlog.c index 50643496eb63..77a5bb1d9c30 100644 --- a/arch/powerpc/platforms/pseries/scanlog.c +++ b/arch/powerpc/platforms/pseries/scanlog.c | |||
@@ -107,9 +107,9 @@ static ssize_t scanlog_read(struct file *file, char __user *buf, | |||
107 | /* Break to sleep default time */ | 107 | /* Break to sleep default time */ |
108 | break; | 108 | break; |
109 | default: | 109 | default: |
110 | if (status > 9900 && status <= 9905) { | 110 | /* Assume extended busy */ |
111 | wait_time = rtas_extended_busy_delay_time(status); | 111 | wait_time = rtas_busy_delay_time(status); |
112 | } else { | 112 | if (!wait_time) { |
113 | printk(KERN_ERR "scanlog: unknown error from rtas: %d\n", status); | 113 | printk(KERN_ERR "scanlog: unknown error from rtas: %d\n", status); |
114 | return -EIO; | 114 | return -EIO; |
115 | } | 115 | } |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 3ba87835757e..1e28518c6121 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -235,14 +235,14 @@ static void __init pSeries_setup_arch(void) | |||
235 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { | 235 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { |
236 | vpa_init(boot_cpuid); | 236 | vpa_init(boot_cpuid); |
237 | if (get_lppaca()->shared_proc) { | 237 | if (get_lppaca()->shared_proc) { |
238 | printk(KERN_INFO "Using shared processor idle loop\n"); | 238 | printk(KERN_DEBUG "Using shared processor idle loop\n"); |
239 | ppc_md.power_save = pseries_shared_idle_sleep; | 239 | ppc_md.power_save = pseries_shared_idle_sleep; |
240 | } else { | 240 | } else { |
241 | printk(KERN_INFO "Using dedicated idle loop\n"); | 241 | printk(KERN_DEBUG "Using dedicated idle loop\n"); |
242 | ppc_md.power_save = pseries_dedicated_idle_sleep; | 242 | ppc_md.power_save = pseries_dedicated_idle_sleep; |
243 | } | 243 | } |
244 | } else { | 244 | } else { |
245 | printk(KERN_INFO "Using default idle loop\n"); | 245 | printk(KERN_DEBUG "Using default idle loop\n"); |
246 | } | 246 | } |
247 | 247 | ||
248 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 248 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c deleted file mode 100644 index 8e53e04ada8b..000000000000 --- a/arch/powerpc/platforms/pseries/vio.c +++ /dev/null | |||
@@ -1,274 +0,0 @@ | |||
1 | /* | ||
2 | * IBM PowerPC pSeries Virtual I/O Infrastructure Support. | ||
3 | * | ||
4 | * Copyright (c) 2003-2005 IBM Corp. | ||
5 | * Dave Engebretsen engebret@us.ibm.com | ||
6 | * Santiago Leon santil@us.ibm.com | ||
7 | * Hollis Blanchard <hollisb@us.ibm.com> | ||
8 | * Stephen Rothwell | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #include <linux/init.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/mm.h> | ||
19 | #include <linux/kobject.h> | ||
20 | #include <asm/iommu.h> | ||
21 | #include <asm/dma.h> | ||
22 | #include <asm/prom.h> | ||
23 | #include <asm/vio.h> | ||
24 | #include <asm/hvcall.h> | ||
25 | #include <asm/tce.h> | ||
26 | |||
27 | extern struct subsystem devices_subsys; /* needed for vio_find_name() */ | ||
28 | |||
29 | static void probe_bus_pseries(void) | ||
30 | { | ||
31 | struct device_node *node_vroot, *of_node; | ||
32 | |||
33 | node_vroot = find_devices("vdevice"); | ||
34 | if ((node_vroot == NULL) || (node_vroot->child == NULL)) | ||
35 | /* this machine doesn't do virtual IO, and that's ok */ | ||
36 | return; | ||
37 | |||
38 | /* | ||
39 | * Create struct vio_devices for each virtual device in the device tree. | ||
40 | * Drivers will associate with them later. | ||
41 | */ | ||
42 | for (of_node = node_vroot->child; of_node != NULL; | ||
43 | of_node = of_node->sibling) { | ||
44 | printk(KERN_DEBUG "%s: processing %p\n", __FUNCTION__, of_node); | ||
45 | vio_register_device_node(of_node); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | /** | ||
50 | * vio_match_device_pseries: - Tell if a pSeries VIO device matches a | ||
51 | * vio_device_id | ||
52 | */ | ||
53 | static int vio_match_device_pseries(const struct vio_device_id *id, | ||
54 | const struct vio_dev *dev) | ||
55 | { | ||
56 | return (strncmp(dev->type, id->type, strlen(id->type)) == 0) && | ||
57 | device_is_compatible(dev->dev.platform_data, id->compat); | ||
58 | } | ||
59 | |||
60 | static void vio_release_device_pseries(struct device *dev) | ||
61 | { | ||
62 | /* XXX free TCE table */ | ||
63 | of_node_put(dev->platform_data); | ||
64 | } | ||
65 | |||
66 | static ssize_t viodev_show_devspec(struct device *dev, | ||
67 | struct device_attribute *attr, char *buf) | ||
68 | { | ||
69 | struct device_node *of_node = dev->platform_data; | ||
70 | |||
71 | return sprintf(buf, "%s\n", of_node->full_name); | ||
72 | } | ||
73 | DEVICE_ATTR(devspec, S_IRUSR | S_IRGRP | S_IROTH, viodev_show_devspec, NULL); | ||
74 | |||
75 | static void vio_unregister_device_pseries(struct vio_dev *viodev) | ||
76 | { | ||
77 | device_remove_file(&viodev->dev, &dev_attr_devspec); | ||
78 | } | ||
79 | |||
80 | static struct vio_bus_ops vio_bus_ops_pseries = { | ||
81 | .match = vio_match_device_pseries, | ||
82 | .unregister_device = vio_unregister_device_pseries, | ||
83 | .release_device = vio_release_device_pseries, | ||
84 | }; | ||
85 | |||
86 | /** | ||
87 | * vio_bus_init_pseries: - Initialize the pSeries virtual IO bus | ||
88 | */ | ||
89 | static int __init vio_bus_init_pseries(void) | ||
90 | { | ||
91 | int err; | ||
92 | |||
93 | err = vio_bus_init(&vio_bus_ops_pseries); | ||
94 | if (err == 0) | ||
95 | probe_bus_pseries(); | ||
96 | return err; | ||
97 | } | ||
98 | |||
99 | __initcall(vio_bus_init_pseries); | ||
100 | |||
101 | /** | ||
102 | * vio_build_iommu_table: - gets the dma information from OF and | ||
103 | * builds the TCE tree. | ||
104 | * @dev: the virtual device. | ||
105 | * | ||
106 | * Returns a pointer to the built tce tree, or NULL if it can't | ||
107 | * find property. | ||
108 | */ | ||
109 | static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev) | ||
110 | { | ||
111 | unsigned int *dma_window; | ||
112 | struct iommu_table *newTceTable; | ||
113 | unsigned long offset; | ||
114 | int dma_window_property_size; | ||
115 | |||
116 | dma_window = (unsigned int *) get_property(dev->dev.platform_data, "ibm,my-dma-window", &dma_window_property_size); | ||
117 | if(!dma_window) { | ||
118 | return NULL; | ||
119 | } | ||
120 | |||
121 | newTceTable = (struct iommu_table *) kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | ||
122 | |||
123 | /* There should be some code to extract the phys-encoded offset | ||
124 | using prom_n_addr_cells(). However, according to a comment | ||
125 | on earlier versions, it's always zero, so we don't bother */ | ||
126 | offset = dma_window[1] >> PAGE_SHIFT; | ||
127 | |||
128 | /* TCE table size - measured in tce entries */ | ||
129 | newTceTable->it_size = dma_window[4] >> PAGE_SHIFT; | ||
130 | /* offset for VIO should always be 0 */ | ||
131 | newTceTable->it_offset = offset; | ||
132 | newTceTable->it_busno = 0; | ||
133 | newTceTable->it_index = (unsigned long)dma_window[0]; | ||
134 | newTceTable->it_type = TCE_VB; | ||
135 | |||
136 | return iommu_init_table(newTceTable); | ||
137 | } | ||
138 | |||
139 | /** | ||
140 | * vio_register_device_node: - Register a new vio device. | ||
141 | * @of_node: The OF node for this device. | ||
142 | * | ||
143 | * Creates and initializes a vio_dev structure from the data in | ||
144 | * of_node (dev.platform_data) and adds it to the list of virtual devices. | ||
145 | * Returns a pointer to the created vio_dev or NULL if node has | ||
146 | * NULL device_type or compatible fields. | ||
147 | */ | ||
148 | struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node) | ||
149 | { | ||
150 | struct vio_dev *viodev; | ||
151 | unsigned int *unit_address; | ||
152 | unsigned int *irq_p; | ||
153 | |||
154 | /* we need the 'device_type' property, in order to match with drivers */ | ||
155 | if ((NULL == of_node->type)) { | ||
156 | printk(KERN_WARNING | ||
157 | "%s: node %s missing 'device_type'\n", __FUNCTION__, | ||
158 | of_node->name ? of_node->name : "<unknown>"); | ||
159 | return NULL; | ||
160 | } | ||
161 | |||
162 | unit_address = (unsigned int *)get_property(of_node, "reg", NULL); | ||
163 | if (!unit_address) { | ||
164 | printk(KERN_WARNING "%s: node %s missing 'reg'\n", __FUNCTION__, | ||
165 | of_node->name ? of_node->name : "<unknown>"); | ||
166 | return NULL; | ||
167 | } | ||
168 | |||
169 | /* allocate a vio_dev for this node */ | ||
170 | viodev = kmalloc(sizeof(struct vio_dev), GFP_KERNEL); | ||
171 | if (!viodev) { | ||
172 | return NULL; | ||
173 | } | ||
174 | memset(viodev, 0, sizeof(struct vio_dev)); | ||
175 | |||
176 | viodev->dev.platform_data = of_node_get(of_node); | ||
177 | |||
178 | viodev->irq = NO_IRQ; | ||
179 | irq_p = (unsigned int *)get_property(of_node, "interrupts", NULL); | ||
180 | if (irq_p) { | ||
181 | int virq = virt_irq_create_mapping(*irq_p); | ||
182 | if (virq == NO_IRQ) { | ||
183 | printk(KERN_ERR "Unable to allocate interrupt " | ||
184 | "number for %s\n", of_node->full_name); | ||
185 | } else | ||
186 | viodev->irq = irq_offset_up(virq); | ||
187 | } | ||
188 | |||
189 | snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%x", *unit_address); | ||
190 | viodev->name = of_node->name; | ||
191 | viodev->type = of_node->type; | ||
192 | viodev->unit_address = *unit_address; | ||
193 | viodev->iommu_table = vio_build_iommu_table(viodev); | ||
194 | |||
195 | /* register with generic device framework */ | ||
196 | if (vio_register_device(viodev) == NULL) { | ||
197 | /* XXX free TCE table */ | ||
198 | kfree(viodev); | ||
199 | return NULL; | ||
200 | } | ||
201 | device_create_file(&viodev->dev, &dev_attr_devspec); | ||
202 | |||
203 | return viodev; | ||
204 | } | ||
205 | EXPORT_SYMBOL(vio_register_device_node); | ||
206 | |||
207 | /** | ||
208 | * vio_get_attribute: - get attribute for virtual device | ||
209 | * @vdev: The vio device to get property. | ||
210 | * @which: The property/attribute to be extracted. | ||
211 | * @length: Pointer to length of returned data size (unused if NULL). | ||
212 | * | ||
213 | * Calls prom.c's get_property() to return the value of the | ||
214 | * attribute specified by the preprocessor constant @which | ||
215 | */ | ||
216 | const void * vio_get_attribute(struct vio_dev *vdev, void* which, int* length) | ||
217 | { | ||
218 | return get_property(vdev->dev.platform_data, (char*)which, length); | ||
219 | } | ||
220 | EXPORT_SYMBOL(vio_get_attribute); | ||
221 | |||
222 | /* vio_find_name() - internal because only vio.c knows how we formatted the | ||
223 | * kobject name | ||
224 | * XXX once vio_bus_type.devices is actually used as a kset in | ||
225 | * drivers/base/bus.c, this function should be removed in favor of | ||
226 | * "device_find(kobj_name, &vio_bus_type)" | ||
227 | */ | ||
228 | static struct vio_dev *vio_find_name(const char *kobj_name) | ||
229 | { | ||
230 | struct kobject *found; | ||
231 | |||
232 | found = kset_find_obj(&devices_subsys.kset, kobj_name); | ||
233 | if (!found) | ||
234 | return NULL; | ||
235 | |||
236 | return to_vio_dev(container_of(found, struct device, kobj)); | ||
237 | } | ||
238 | |||
239 | /** | ||
240 | * vio_find_node - find an already-registered vio_dev | ||
241 | * @vnode: device_node of the virtual device we're looking for | ||
242 | */ | ||
243 | struct vio_dev *vio_find_node(struct device_node *vnode) | ||
244 | { | ||
245 | uint32_t *unit_address; | ||
246 | char kobj_name[BUS_ID_SIZE]; | ||
247 | |||
248 | /* construct the kobject name from the device node */ | ||
249 | unit_address = (uint32_t *)get_property(vnode, "reg", NULL); | ||
250 | if (!unit_address) | ||
251 | return NULL; | ||
252 | snprintf(kobj_name, BUS_ID_SIZE, "%x", *unit_address); | ||
253 | |||
254 | return vio_find_name(kobj_name); | ||
255 | } | ||
256 | EXPORT_SYMBOL(vio_find_node); | ||
257 | |||
258 | int vio_enable_interrupts(struct vio_dev *dev) | ||
259 | { | ||
260 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_ENABLE); | ||
261 | if (rc != H_SUCCESS) | ||
262 | printk(KERN_ERR "vio: Error 0x%x enabling interrupts\n", rc); | ||
263 | return rc; | ||
264 | } | ||
265 | EXPORT_SYMBOL(vio_enable_interrupts); | ||
266 | |||
267 | int vio_disable_interrupts(struct vio_dev *dev) | ||
268 | { | ||
269 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_DISABLE); | ||
270 | if (rc != H_SUCCESS) | ||
271 | printk(KERN_ERR "vio: Error 0x%x disabling interrupts\n", rc); | ||
272 | return rc; | ||
273 | } | ||
274 | EXPORT_SYMBOL(vio_disable_interrupts); | ||
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 2d60ea30fed6..b14f9b5c114e 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -522,7 +522,7 @@ nextnode: | |||
522 | 522 | ||
523 | np = of_find_node_by_type(NULL, "interrupt-controller"); | 523 | np = of_find_node_by_type(NULL, "interrupt-controller"); |
524 | if (!np) { | 524 | if (!np) { |
525 | printk(KERN_WARNING "xics: no ISA interrupt controller\n"); | 525 | printk(KERN_DEBUG "xics: no ISA interrupt controller\n"); |
526 | xics_irq_8259_cascade_real = -1; | 526 | xics_irq_8259_cascade_real = -1; |
527 | xics_irq_8259_cascade = -1; | 527 | xics_irq_8259_cascade = -1; |
528 | } else { | 528 | } else { |
@@ -641,23 +641,26 @@ void xics_teardown_cpu(int secondary) | |||
641 | ops->cppr_info(cpu, 0x00); | 641 | ops->cppr_info(cpu, 0x00); |
642 | iosync(); | 642 | iosync(); |
643 | 643 | ||
644 | /* Clear IPI */ | ||
645 | ops->qirr_info(cpu, 0xff); | ||
646 | |||
647 | /* | ||
648 | * we need to EOI the IPI if we got here from kexec down IPI | ||
649 | * | ||
650 | * probably need to check all the other interrupts too | ||
651 | * should we be flagging idle loop instead? | ||
652 | * or creating some task to be scheduled? | ||
653 | */ | ||
654 | ops->xirr_info_set(cpu, XICS_IPI); | ||
655 | |||
644 | /* | 656 | /* |
645 | * Some machines need to have at least one cpu in the GIQ, | 657 | * Some machines need to have at least one cpu in the GIQ, |
646 | * so leave the master cpu in the group. | 658 | * so leave the master cpu in the group. |
647 | */ | 659 | */ |
648 | if (secondary) { | 660 | if (secondary) |
649 | /* | ||
650 | * we need to EOI the IPI if we got here from kexec down IPI | ||
651 | * | ||
652 | * probably need to check all the other interrupts too | ||
653 | * should we be flagging idle loop instead? | ||
654 | * or creating some task to be scheduled? | ||
655 | */ | ||
656 | ops->xirr_info_set(cpu, XICS_IPI); | ||
657 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 661 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, |
658 | (1UL << interrupt_server_size) - 1 - | 662 | (1UL << interrupt_server_size) - 1 - |
659 | default_distrib_server, 0); | 663 | default_distrib_server, 0); |
660 | } | ||
661 | } | 664 | } |
662 | 665 | ||
663 | #ifdef CONFIG_HOTPLUG_CPU | 666 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 4c2b356774ea..cef95b023730 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -1,3 +1,7 @@ | |||
1 | ifeq ($(CONFIG_PPC64),y) | ||
2 | EXTRA_CFLAGS += -mno-minimal-toc | ||
3 | endif | ||
4 | |||
1 | obj-$(CONFIG_MPIC) += mpic.o | 5 | obj-$(CONFIG_MPIC) += mpic.o |
2 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o | 6 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o |
3 | obj-$(CONFIG_PPC_I8259) += i8259.o | 7 | obj-$(CONFIG_PPC_I8259) += i8259.o |
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 38087bd6e3cf..6232091cc72b 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
@@ -246,7 +246,7 @@ static void iommu_table_dart_setup(void) | |||
246 | iommu_table_dart.it_base = (unsigned long)dart_vbase; | 246 | iommu_table_dart.it_base = (unsigned long)dart_vbase; |
247 | iommu_table_dart.it_index = 0; | 247 | iommu_table_dart.it_index = 0; |
248 | iommu_table_dart.it_blocksize = 1; | 248 | iommu_table_dart.it_blocksize = 1; |
249 | iommu_init_table(&iommu_table_dart); | 249 | iommu_init_table(&iommu_table_dart, -1); |
250 | 250 | ||
251 | /* Reserve the last page of the DART to avoid possible prefetch | 251 | /* Reserve the last page of the DART to avoid possible prefetch |
252 | * past the DART mapped area | 252 | * past the DART mapped area |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 7dcdfcb3c984..bffe50d02c99 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -829,7 +829,27 @@ void __init mpic_init(struct mpic *mpic) | |||
829 | mpic_cpu_write(MPIC_CPU_CURRENT_TASK_PRI, 0); | 829 | mpic_cpu_write(MPIC_CPU_CURRENT_TASK_PRI, 0); |
830 | } | 830 | } |
831 | 831 | ||
832 | void __init mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio) | ||
833 | { | ||
834 | u32 v; | ||
835 | |||
836 | v = mpic_read(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1); | ||
837 | v &= ~MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK; | ||
838 | v |= MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO(clock_ratio); | ||
839 | mpic_write(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1, v); | ||
840 | } | ||
832 | 841 | ||
842 | void __init mpic_set_serial_int(struct mpic *mpic, int enable) | ||
843 | { | ||
844 | u32 v; | ||
845 | |||
846 | v = mpic_read(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1); | ||
847 | if (enable) | ||
848 | v |= MPIC_GREG_GLOBAL_CONF_1_SIE; | ||
849 | else | ||
850 | v &= ~MPIC_GREG_GLOBAL_CONF_1_SIE; | ||
851 | mpic_write(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1, v); | ||
852 | } | ||
833 | 853 | ||
834 | void mpic_irq_set_priority(unsigned int irq, unsigned int pri) | 854 | void mpic_irq_set_priority(unsigned int irq, unsigned int pri) |
835 | { | 855 | { |
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig index e9a8f5d1dfcd..b55de4f42aec 100644 --- a/arch/ppc/Kconfig +++ b/arch/ppc/Kconfig | |||
@@ -40,6 +40,10 @@ config GENERIC_NVRAM | |||
40 | bool | 40 | bool |
41 | default y | 41 | default y |
42 | 42 | ||
43 | config GENERIC_FIND_NEXT_BIT | ||
44 | bool | ||
45 | default y | ||
46 | |||
43 | config SCHED_NO_NO_OMIT_FRAME_POINTER | 47 | config SCHED_NO_NO_OMIT_FRAME_POINTER |
44 | bool | 48 | bool |
45 | default y | 49 | default y |
diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c index 386e000bcb73..c9bd184a295a 100644 --- a/arch/ppc/mm/init.c +++ b/arch/ppc/mm/init.c | |||
@@ -583,7 +583,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, | |||
583 | mm = (address < TASK_SIZE)? vma->vm_mm: &init_mm; | 583 | mm = (address < TASK_SIZE)? vma->vm_mm: &init_mm; |
584 | pmd = pmd_offset(pgd_offset(mm, address), address); | 584 | pmd = pmd_offset(pgd_offset(mm, address), address); |
585 | if (!pmd_none(*pmd)) | 585 | if (!pmd_none(*pmd)) |
586 | add_hash_page(mm->context, address, pmd_val(*pmd)); | 586 | add_hash_page(mm->context.id, address, pmd_val(*pmd)); |
587 | } | 587 | } |
588 | #endif | 588 | #endif |
589 | } | 589 | } |
diff --git a/arch/ppc/mm/mmu_context.c b/arch/ppc/mm/mmu_context.c index b4a4b3f02a1c..8784f3715032 100644 --- a/arch/ppc/mm/mmu_context.c +++ b/arch/ppc/mm/mmu_context.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <asm/mmu_context.h> | 30 | #include <asm/mmu_context.h> |
31 | #include <asm/tlbflush.h> | 31 | #include <asm/tlbflush.h> |
32 | 32 | ||
33 | mm_context_t next_mmu_context; | 33 | unsigned long next_mmu_context; |
34 | unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; | 34 | unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; |
35 | #ifdef FEW_CONTEXTS | 35 | #ifdef FEW_CONTEXTS |
36 | atomic_t nr_free_contexts; | 36 | atomic_t nr_free_contexts; |
diff --git a/arch/ppc/mm/tlb.c b/arch/ppc/mm/tlb.c index 6c3dc3c44c86..606b023196a2 100644 --- a/arch/ppc/mm/tlb.c +++ b/arch/ppc/mm/tlb.c | |||
@@ -42,7 +42,7 @@ void flush_hash_entry(struct mm_struct *mm, pte_t *ptep, unsigned long addr) | |||
42 | 42 | ||
43 | if (Hash != 0) { | 43 | if (Hash != 0) { |
44 | ptephys = __pa(ptep) & PAGE_MASK; | 44 | ptephys = __pa(ptep) & PAGE_MASK; |
45 | flush_hash_pages(mm->context, addr, ptephys, 1); | 45 | flush_hash_pages(mm->context.id, addr, ptephys, 1); |
46 | } | 46 | } |
47 | } | 47 | } |
48 | 48 | ||
@@ -102,7 +102,7 @@ static void flush_range(struct mm_struct *mm, unsigned long start, | |||
102 | pmd_t *pmd; | 102 | pmd_t *pmd; |
103 | unsigned long pmd_end; | 103 | unsigned long pmd_end; |
104 | int count; | 104 | int count; |
105 | unsigned int ctx = mm->context; | 105 | unsigned int ctx = mm->context.id; |
106 | 106 | ||
107 | if (Hash == 0) { | 107 | if (Hash == 0) { |
108 | _tlbia(); | 108 | _tlbia(); |
@@ -166,7 +166,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | |||
166 | mm = (vmaddr < TASK_SIZE)? vma->vm_mm: &init_mm; | 166 | mm = (vmaddr < TASK_SIZE)? vma->vm_mm: &init_mm; |
167 | pmd = pmd_offset(pgd_offset(mm, vmaddr), vmaddr); | 167 | pmd = pmd_offset(pgd_offset(mm, vmaddr), vmaddr); |
168 | if (!pmd_none(*pmd)) | 168 | if (!pmd_none(*pmd)) |
169 | flush_hash_pages(mm->context, vmaddr, pmd_val(*pmd), 1); | 169 | flush_hash_pages(mm->context.id, vmaddr, pmd_val(*pmd), 1); |
170 | FINISH_FLUSH; | 170 | FINISH_FLUSH; |
171 | } | 171 | } |
172 | 172 | ||
diff --git a/arch/ppc/platforms/4xx/Kconfig b/arch/ppc/platforms/4xx/Kconfig index 174ddbc9758b..293bd489e7d9 100644 --- a/arch/ppc/platforms/4xx/Kconfig +++ b/arch/ppc/platforms/4xx/Kconfig | |||
@@ -183,7 +183,7 @@ config IBM_EMAC4 | |||
183 | 183 | ||
184 | config BIOS_FIXUP | 184 | config BIOS_FIXUP |
185 | bool | 185 | bool |
186 | depends on BUBINGA || EP405 || SYCAMORE || WALNUT | 186 | depends on BUBINGA || EP405 || SYCAMORE || WALNUT || CPCI405 |
187 | default y | 187 | default y |
188 | 188 | ||
189 | # OAK doesn't exist but wanted to keep this around for any future 403GCX boards | 189 | # OAK doesn't exist but wanted to keep this around for any future 403GCX boards |
diff --git a/arch/ppc/platforms/4xx/cpci405.c b/arch/ppc/platforms/4xx/cpci405.c index 6571e39fbe48..970b69831e6f 100644 --- a/arch/ppc/platforms/4xx/cpci405.c +++ b/arch/ppc/platforms/4xx/cpci405.c | |||
@@ -1,10 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Board setup routines for the esd CPCI-405 cPCI Board. | 2 | * Board setup routines for the esd CPCI-405 cPCI Board. |
3 | * | 3 | * |
4 | * Author: Stefan Roese | 4 | * Copyright 2001-2006 esd electronic system design - hannover germany |
5 | * stefan.roese@esd-electronics.com | ||
6 | * | 5 | * |
7 | * Copyright 2001 esd electronic system design - hannover germany | 6 | * Authors: Matthias Fuchs |
7 | * matthias.fuchs@esd-electronics.com | ||
8 | * Stefan Roese | ||
9 | * stefan.roese@esd-electronics.com | ||
8 | * | 10 | * |
9 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
10 | * under the terms of the GNU General Public License as published by the | 12 | * under the terms of the GNU General Public License as published by the |
@@ -20,9 +22,17 @@ | |||
20 | #include <asm/pci-bridge.h> | 22 | #include <asm/pci-bridge.h> |
21 | #include <asm/machdep.h> | 23 | #include <asm/machdep.h> |
22 | #include <asm/todc.h> | 24 | #include <asm/todc.h> |
25 | #include <linux/serial.h> | ||
26 | #include <linux/serial_core.h> | ||
23 | #include <asm/ocp.h> | 27 | #include <asm/ocp.h> |
28 | #include <asm/ibm_ocp_pci.h> | ||
29 | #include <platforms/4xx/ibm405gp.h> | ||
24 | 30 | ||
31 | #ifdef CONFIG_GEN_RTC | ||
25 | void *cpci405_nvram; | 32 | void *cpci405_nvram; |
33 | #endif | ||
34 | |||
35 | extern bd_t __res; | ||
26 | 36 | ||
27 | /* | 37 | /* |
28 | * Some IRQs unique to CPCI-405. | 38 | * Some IRQs unique to CPCI-405. |
@@ -36,18 +46,69 @@ ppc405_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | |||
36 | * A B C D | 46 | * A B C D |
37 | */ | 47 | */ |
38 | { | 48 | { |
39 | {28, 28, 28, 28}, /* IDSEL 15 - cPCI slot 8 */ | 49 | {28, 29, 30, 27}, /* IDSEL 15 - cPCI slot 8 */ |
40 | {29, 29, 29, 29}, /* IDSEL 16 - cPCI slot 7 */ | 50 | {29, 30, 27, 28}, /* IDSEL 16 - cPCI slot 7 */ |
41 | {30, 30, 30, 30}, /* IDSEL 17 - cPCI slot 6 */ | 51 | {30, 27, 28, 29}, /* IDSEL 17 - cPCI slot 6 */ |
42 | {27, 27, 27, 27}, /* IDSEL 18 - cPCI slot 5 */ | 52 | {27, 28, 29, 30}, /* IDSEL 18 - cPCI slot 5 */ |
43 | {28, 28, 28, 28}, /* IDSEL 19 - cPCI slot 4 */ | 53 | {28, 29, 30, 27}, /* IDSEL 19 - cPCI slot 4 */ |
44 | {29, 29, 29, 29}, /* IDSEL 20 - cPCI slot 3 */ | 54 | {29, 30, 27, 28}, /* IDSEL 20 - cPCI slot 3 */ |
45 | {30, 30, 30, 30}, /* IDSEL 21 - cPCI slot 2 */ | 55 | {30, 27, 28, 29}, /* IDSEL 21 - cPCI slot 2 */ |
46 | }; | 56 | }; |
47 | const long min_idsel = 15, max_idsel = 21, irqs_per_slot = 4; | 57 | const long min_idsel = 15, max_idsel = 21, irqs_per_slot = 4; |
48 | return PCI_IRQ_TABLE_LOOKUP; | 58 | return PCI_IRQ_TABLE_LOOKUP; |
49 | }; | 59 | }; |
50 | 60 | ||
61 | /* The serial clock for the chip is an internal clock determined by | ||
62 | * different clock speeds/dividers. | ||
63 | * Calculate the proper input baud rate and setup the serial driver. | ||
64 | */ | ||
65 | static void __init | ||
66 | cpci405_early_serial_map(void) | ||
67 | { | ||
68 | u32 uart_div; | ||
69 | int uart_clock; | ||
70 | struct uart_port port; | ||
71 | |||
72 | /* Calculate the serial clock input frequency | ||
73 | * | ||
74 | * The uart clock is the cpu frequency (provided in the board info | ||
75 | * structure) divided by the external UART Divisor. | ||
76 | */ | ||
77 | uart_div = ((mfdcr(DCRN_CHCR_BASE) & CHR0_UDIV) >> 1) + 1; | ||
78 | uart_clock = __res.bi_procfreq / uart_div; | ||
79 | |||
80 | /* Setup serial port access */ | ||
81 | memset(&port, 0, sizeof(port)); | ||
82 | #if defined(CONFIG_UART0_TTYS0) | ||
83 | port.membase = (void*)UART0_IO_BASE; | ||
84 | port.irq = UART0_INT; | ||
85 | #else | ||
86 | port.membase = (void*)UART1_IO_BASE; | ||
87 | port.irq = UART1_INT; | ||
88 | #endif | ||
89 | port.uartclk = uart_clock; | ||
90 | port.regshift = 0; | ||
91 | port.iotype = UPIO_MEM; | ||
92 | port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; | ||
93 | port.line = 0; | ||
94 | |||
95 | if (early_serial_setup(&port) != 0) { | ||
96 | printk("Early serial init of port 0 failed\n"); | ||
97 | } | ||
98 | #if defined(CONFIG_UART0_TTYS0) | ||
99 | port.membase = (void*)UART1_IO_BASE; | ||
100 | port.irq = UART1_INT; | ||
101 | #else | ||
102 | port.membase = (void*)UART0_IO_BASE; | ||
103 | port.irq = UART0_INT; | ||
104 | #endif | ||
105 | port.line = 1; | ||
106 | |||
107 | if (early_serial_setup(&port) != 0) { | ||
108 | printk("Early serial init of port 1 failed\n"); | ||
109 | } | ||
110 | } | ||
111 | |||
51 | void __init | 112 | void __init |
52 | cpci405_setup_arch(void) | 113 | cpci405_setup_arch(void) |
53 | { | 114 | { |
@@ -55,14 +116,68 @@ cpci405_setup_arch(void) | |||
55 | 116 | ||
56 | ibm_ocp_set_emac(0, 0); | 117 | ibm_ocp_set_emac(0, 0); |
57 | 118 | ||
58 | TODC_INIT(TODC_TYPE_MK48T35, cpci405_nvram, cpci405_nvram, cpci405_nvram, 8); | 119 | cpci405_early_serial_map(); |
120 | |||
121 | #ifdef CONFIG_GEN_RTC | ||
122 | TODC_INIT(TODC_TYPE_MK48T35, | ||
123 | cpci405_nvram, cpci405_nvram, cpci405_nvram, 8); | ||
124 | #endif | ||
125 | } | ||
126 | |||
127 | void __init | ||
128 | bios_fixup(struct pci_controller *hose, struct pcil0_regs *pcip) | ||
129 | { | ||
130 | unsigned int bar_response, bar; | ||
131 | |||
132 | /* Disable region first */ | ||
133 | out_le32((void *) &(pcip->pmm[0].ma), 0x00000000); | ||
134 | /* PLB starting addr, PCI: 0x80000000 */ | ||
135 | out_le32((void *) &(pcip->pmm[0].la), 0x80000000); | ||
136 | /* PCI start addr, 0x80000000 */ | ||
137 | out_le32((void *) &(pcip->pmm[0].pcila), PPC405_PCI_MEM_BASE); | ||
138 | /* 512MB range of PLB to PCI */ | ||
139 | out_le32((void *) &(pcip->pmm[0].pciha), 0x00000000); | ||
140 | /* Enable no pre-fetch, enable region */ | ||
141 | out_le32((void *) &(pcip->pmm[0].ma), ((0xffffffff - | ||
142 | (PPC405_PCI_UPPER_MEM - | ||
143 | PPC405_PCI_MEM_BASE)) | 0x01)); | ||
144 | |||
145 | /* Disable region one */ | ||
146 | out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); | ||
147 | out_le32((void *) &(pcip->pmm[1].la), 0x00000000); | ||
148 | out_le32((void *) &(pcip->pmm[1].pcila), 0x00000000); | ||
149 | out_le32((void *) &(pcip->pmm[1].pciha), 0x00000000); | ||
150 | out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); | ||
151 | out_le32((void *) &(pcip->ptm1ms), 0x00000001); | ||
152 | |||
153 | /* Disable region two */ | ||
154 | out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); | ||
155 | out_le32((void *) &(pcip->pmm[2].la), 0x00000000); | ||
156 | out_le32((void *) &(pcip->pmm[2].pcila), 0x00000000); | ||
157 | out_le32((void *) &(pcip->pmm[2].pciha), 0x00000000); | ||
158 | out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); | ||
159 | out_le32((void *) &(pcip->ptm2ms), 0x00000000); | ||
160 | out_le32((void *) &(pcip->ptm2la), 0x00000000); | ||
161 | |||
162 | /* Zero config bars */ | ||
163 | for (bar = PCI_BASE_ADDRESS_1; bar <= PCI_BASE_ADDRESS_2; bar += 4) { | ||
164 | early_write_config_dword(hose, hose->first_busno, | ||
165 | PCI_FUNC(hose->first_busno), bar, | ||
166 | 0x00000000); | ||
167 | early_read_config_dword(hose, hose->first_busno, | ||
168 | PCI_FUNC(hose->first_busno), bar, | ||
169 | &bar_response); | ||
170 | } | ||
59 | } | 171 | } |
60 | 172 | ||
61 | void __init | 173 | void __init |
62 | cpci405_map_io(void) | 174 | cpci405_map_io(void) |
63 | { | 175 | { |
64 | ppc4xx_map_io(); | 176 | ppc4xx_map_io(); |
177 | |||
178 | #ifdef CONFIG_GEN_RTC | ||
65 | cpci405_nvram = ioremap(CPCI405_NVRAM_PADDR, CPCI405_NVRAM_SIZE); | 179 | cpci405_nvram = ioremap(CPCI405_NVRAM_PADDR, CPCI405_NVRAM_SIZE); |
180 | #endif | ||
66 | } | 181 | } |
67 | 182 | ||
68 | void __init | 183 | void __init |
@@ -74,9 +189,11 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
74 | ppc_md.setup_arch = cpci405_setup_arch; | 189 | ppc_md.setup_arch = cpci405_setup_arch; |
75 | ppc_md.setup_io_mappings = cpci405_map_io; | 190 | ppc_md.setup_io_mappings = cpci405_map_io; |
76 | 191 | ||
192 | #ifdef CONFIG_GEN_RTC | ||
77 | ppc_md.time_init = todc_time_init; | 193 | ppc_md.time_init = todc_time_init; |
78 | ppc_md.set_rtc_time = todc_set_rtc_time; | 194 | ppc_md.set_rtc_time = todc_set_rtc_time; |
79 | ppc_md.get_rtc_time = todc_get_rtc_time; | 195 | ppc_md.get_rtc_time = todc_get_rtc_time; |
80 | ppc_md.nvram_read_val = todc_direct_read_val; | 196 | ppc_md.nvram_read_val = todc_direct_read_val; |
81 | ppc_md.nvram_write_val = todc_direct_write_val; | 197 | ppc_md.nvram_write_val = todc_direct_write_val; |
198 | #endif | ||
82 | } | 199 | } |
diff --git a/arch/ppc/platforms/4xx/cpci405.h b/arch/ppc/platforms/4xx/cpci405.h index e27f7cb650d8..f5a5c0cd062d 100644 --- a/arch/ppc/platforms/4xx/cpci405.h +++ b/arch/ppc/platforms/4xx/cpci405.h | |||
@@ -1,37 +1,29 @@ | |||
1 | /* | 1 | /* |
2 | * CPCI-405 board specific definitions | 2 | * CPCI-405 board specific definitions |
3 | * | 3 | * |
4 | * Copyright (c) 2001 Stefan Roese (stefan.roese@esd-electronics.com) | 4 | * Copyright 2001-2006 esd electronic system design - hannover germany |
5 | * | ||
6 | * Authors: Matthias Fuchs | ||
7 | * matthias.fuchs@esd-electronics.com | ||
8 | * Stefan Roese | ||
9 | * stefan.roese@esd-electronics.com | ||
5 | */ | 10 | */ |
6 | 11 | ||
7 | #ifdef __KERNEL__ | 12 | #ifdef __KERNEL__ |
8 | #ifndef __ASM_CPCI405_H__ | 13 | #ifndef __CPCI405_H__ |
9 | #define __ASM_CPCI405_H__ | 14 | #define __CPCI405_H__ |
10 | 15 | ||
11 | #include <linux/config.h> | 16 | #include <linux/config.h> |
12 | |||
13 | /* We have a 405GP core */ | ||
14 | #include <platforms/4xx/ibm405gp.h> | 17 | #include <platforms/4xx/ibm405gp.h> |
15 | |||
16 | #include <asm/ppcboot.h> | 18 | #include <asm/ppcboot.h> |
17 | 19 | ||
18 | #ifndef __ASSEMBLY__ | ||
19 | /* Some 4xx parts use a different timebase frequency from the internal clock. | ||
20 | */ | ||
21 | #define bi_tbfreq bi_intfreq | ||
22 | |||
23 | /* Map for the NVRAM space */ | 20 | /* Map for the NVRAM space */ |
24 | #define CPCI405_NVRAM_PADDR ((uint)0xf0200000) | 21 | #define CPCI405_NVRAM_PADDR ((uint)0xf0200000) |
25 | #define CPCI405_NVRAM_SIZE ((uint)32*1024) | 22 | #define CPCI405_NVRAM_SIZE ((uint)32*1024) |
26 | 23 | ||
27 | #ifdef CONFIG_PPC405GP_INTERNAL_CLOCK | 24 | #define BASE_BAUD 0 |
28 | #define BASE_BAUD 201600 | ||
29 | #else | ||
30 | #define BASE_BAUD 691200 | ||
31 | #endif | ||
32 | 25 | ||
33 | #define PPC4xx_MACHINE_NAME "esd CPCI-405" | 26 | #define PPC4xx_MACHINE_NAME "esd CPCI-405" |
34 | 27 | ||
35 | #endif /* !__ASSEMBLY__ */ | 28 | #endif /* __CPCI405_H__ */ |
36 | #endif /* __ASM_CPCI405_H__ */ | ||
37 | #endif /* __KERNEL__ */ | 29 | #endif /* __KERNEL__ */ |
diff --git a/arch/um/sys-ppc/misc.S b/arch/um/sys-ppc/misc.S index 11b7bd768cfd..f0c971db47e4 100644 --- a/arch/um/sys-ppc/misc.S +++ b/arch/um/sys-ppc/misc.S | |||
@@ -23,14 +23,10 @@ | |||
23 | #define CACHE_LINE_SIZE 16 | 23 | #define CACHE_LINE_SIZE 16 |
24 | #define LG_CACHE_LINE_SIZE 4 | 24 | #define LG_CACHE_LINE_SIZE 4 |
25 | #define MAX_COPY_PREFETCH 1 | 25 | #define MAX_COPY_PREFETCH 1 |
26 | #elif !defined(CONFIG_PPC64BRIDGE) | 26 | #else |
27 | #define CACHE_LINE_SIZE 32 | 27 | #define CACHE_LINE_SIZE 32 |
28 | #define LG_CACHE_LINE_SIZE 5 | 28 | #define LG_CACHE_LINE_SIZE 5 |
29 | #define MAX_COPY_PREFETCH 4 | 29 | #define MAX_COPY_PREFETCH 4 |
30 | #else | ||
31 | #define CACHE_LINE_SIZE 128 | ||
32 | #define LG_CACHE_LINE_SIZE 7 | ||
33 | #define MAX_COPY_PREFETCH 1 | ||
34 | #endif /* CONFIG_4xx || CONFIG_8xx */ | 30 | #endif /* CONFIG_4xx || CONFIG_8xx */ |
35 | 31 | ||
36 | .text | 32 | .text |