diff options
53 files changed, 671 insertions, 154 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index cdd2a6e8a3b7..69bb6a9c871a 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -403,6 +403,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
403 | bttv.pll= See Documentation/video4linux/bttv/Insmod-options | 403 | bttv.pll= See Documentation/video4linux/bttv/Insmod-options |
404 | bttv.tuner= and Documentation/video4linux/bttv/CARDLIST | 404 | bttv.tuner= and Documentation/video4linux/bttv/CARDLIST |
405 | 405 | ||
406 | bulk_remove=off [PPC] This parameter disables the use of the pSeries | ||
407 | firmware feature for flushing multiple hpte entries | ||
408 | at a time. | ||
409 | |||
406 | c101= [NET] Moxa C101 synchronous serial card | 410 | c101= [NET] Moxa C101 synchronous serial card |
407 | 411 | ||
408 | cachesize= [BUGS=X86-32] Override level 2 CPU cache size detection. | 412 | cachesize= [BUGS=X86-32] Override level 2 CPU cache size detection. |
@@ -1490,6 +1494,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1490 | mtdparts= [MTD] | 1494 | mtdparts= [MTD] |
1491 | See drivers/mtd/cmdlinepart.c. | 1495 | See drivers/mtd/cmdlinepart.c. |
1492 | 1496 | ||
1497 | multitce=off [PPC] This parameter disables the use of the pSeries | ||
1498 | firmware feature for updating multiple TCE entries | ||
1499 | at a time. | ||
1500 | |||
1493 | onenand.bdry= [HW,MTD] Flex-OneNAND Boundary Configuration | 1501 | onenand.bdry= [HW,MTD] Flex-OneNAND Boundary Configuration |
1494 | 1502 | ||
1495 | Format: [die0_boundary][,die0_lock][,die1_boundary][,die1_lock] | 1503 | Format: [die0_boundary][,die0_lock][,die1_boundary][,die1_lock] |
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt index 302db5da49b3..3272ed59dec7 100644 --- a/Documentation/powerpc/booting-without-of.txt +++ b/Documentation/powerpc/booting-without-of.txt | |||
@@ -131,7 +131,7 @@ order to avoid the degeneration that had become the ppc32 kernel entry | |||
131 | point and the way a new platform should be added to the kernel. The | 131 | point and the way a new platform should be added to the kernel. The |
132 | legacy iSeries platform breaks those rules as it predates this scheme, | 132 | legacy iSeries platform breaks those rules as it predates this scheme, |
133 | but no new board support will be accepted in the main tree that | 133 | but no new board support will be accepted in the main tree that |
134 | doesn't follows them properly. In addition, since the advent of the | 134 | doesn't follow them properly. In addition, since the advent of the |
135 | arch/powerpc merged architecture for ppc32 and ppc64, new 32-bit | 135 | arch/powerpc merged architecture for ppc32 and ppc64, new 32-bit |
136 | platforms and 32-bit platforms which move into arch/powerpc will be | 136 | platforms and 32-bit platforms which move into arch/powerpc will be |
137 | required to use these rules as well. | 137 | required to use these rules as well. |
@@ -1025,7 +1025,7 @@ dtc source code can be found at | |||
1025 | 1025 | ||
1026 | WARNING: This version is still in early development stage; the | 1026 | WARNING: This version is still in early development stage; the |
1027 | resulting device-tree "blobs" have not yet been validated with the | 1027 | resulting device-tree "blobs" have not yet been validated with the |
1028 | kernel. The current generated bloc lacks a useful reserve map (it will | 1028 | kernel. The current generated block lacks a useful reserve map (it will |
1029 | be fixed to generate an empty one, it's up to the bootloader to fill | 1029 | be fixed to generate an empty one, it's up to the bootloader to fill |
1030 | it up) among others. The error handling needs work, bugs are lurking, | 1030 | it up) among others. The error handling needs work, bugs are lurking, |
1031 | etc... | 1031 | etc... |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index e625e9e034ae..06d742c3fbcf 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -20,6 +20,9 @@ config WORD_SIZE | |||
20 | config ARCH_PHYS_ADDR_T_64BIT | 20 | config ARCH_PHYS_ADDR_T_64BIT |
21 | def_bool PPC64 || PHYS_64BIT | 21 | def_bool PPC64 || PHYS_64BIT |
22 | 22 | ||
23 | config ARCH_DMA_ADDR_T_64BIT | ||
24 | def_bool ARCH_PHYS_ADDR_T_64BIT | ||
25 | |||
23 | config MMU | 26 | config MMU |
24 | bool | 27 | bool |
25 | default y | 28 | default y |
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index 30964ae2d096..8a7e9314c68a 100644 --- a/arch/powerpc/include/asm/bitops.h +++ b/arch/powerpc/include/asm/bitops.h | |||
@@ -267,7 +267,16 @@ static __inline__ int fls64(__u64 x) | |||
267 | #include <asm-generic/bitops/fls64.h> | 267 | #include <asm-generic/bitops/fls64.h> |
268 | #endif /* __powerpc64__ */ | 268 | #endif /* __powerpc64__ */ |
269 | 269 | ||
270 | #ifdef CONFIG_PPC64 | ||
271 | unsigned int __arch_hweight8(unsigned int w); | ||
272 | unsigned int __arch_hweight16(unsigned int w); | ||
273 | unsigned int __arch_hweight32(unsigned int w); | ||
274 | unsigned long __arch_hweight64(__u64 w); | ||
275 | #include <asm-generic/bitops/const_hweight.h> | ||
276 | #else | ||
270 | #include <asm-generic/bitops/hweight.h> | 277 | #include <asm-generic/bitops/hweight.h> |
278 | #endif | ||
279 | |||
271 | #include <asm-generic/bitops/find.h> | 280 | #include <asm-generic/bitops/find.h> |
272 | 281 | ||
273 | /* Little-endian versions */ | 282 | /* Little-endian versions */ |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index f3a1fdd9cf08..f0a211d96923 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
@@ -199,6 +199,8 @@ extern const char *powerpc_base_platform; | |||
199 | #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0080000000000000) | 199 | #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0080000000000000) |
200 | #define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0100000000000000) | 200 | #define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0100000000000000) |
201 | #define CPU_FTR_STCX_CHECKS_ADDRESS LONG_ASM_CONST(0x0200000000000000) | 201 | #define CPU_FTR_STCX_CHECKS_ADDRESS LONG_ASM_CONST(0x0200000000000000) |
202 | #define CPU_FTR_POPCNTB LONG_ASM_CONST(0x0400000000000000) | ||
203 | #define CPU_FTR_POPCNTD LONG_ASM_CONST(0x0800000000000000) | ||
202 | 204 | ||
203 | #ifndef __ASSEMBLY__ | 205 | #ifndef __ASSEMBLY__ |
204 | 206 | ||
@@ -403,21 +405,22 @@ extern const char *powerpc_base_platform; | |||
403 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 405 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
404 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 406 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
405 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | 407 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
406 | CPU_FTR_PURR | CPU_FTR_STCX_CHECKS_ADDRESS) | 408 | CPU_FTR_PURR | CPU_FTR_STCX_CHECKS_ADDRESS | \ |
409 | CPU_FTR_POPCNTB) | ||
407 | #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 410 | #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
408 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 411 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
409 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 412 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
410 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | 413 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
411 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 414 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
412 | CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ | 415 | CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ |
413 | CPU_FTR_STCX_CHECKS_ADDRESS) | 416 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB) |
414 | #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 417 | #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
415 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 418 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
416 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 419 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
417 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | 420 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
418 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 421 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
419 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ | 422 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ |
420 | CPU_FTR_STCX_CHECKS_ADDRESS) | 423 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD) |
421 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 424 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
422 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 425 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
423 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 426 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index a8e18447c62b..f71bb4c118b4 100644 --- a/arch/powerpc/include/asm/cputhreads.h +++ b/arch/powerpc/include/asm/cputhreads.h | |||
@@ -61,22 +61,25 @@ static inline cpumask_t cpu_online_cores_map(void) | |||
61 | return cpu_thread_mask_to_cores(cpu_online_map); | 61 | return cpu_thread_mask_to_cores(cpu_online_map); |
62 | } | 62 | } |
63 | 63 | ||
64 | static inline int cpu_thread_to_core(int cpu) | 64 | #ifdef CONFIG_SMP |
65 | { | 65 | int cpu_core_index_of_thread(int cpu); |
66 | return cpu >> threads_shift; | 66 | int cpu_first_thread_of_core(int core); |
67 | } | 67 | #else |
68 | static inline int cpu_core_index_of_thread(int cpu) { return cpu; } | ||
69 | static inline int cpu_first_thread_of_core(int core) { return core; } | ||
70 | #endif | ||
68 | 71 | ||
69 | static inline int cpu_thread_in_core(int cpu) | 72 | static inline int cpu_thread_in_core(int cpu) |
70 | { | 73 | { |
71 | return cpu & (threads_per_core - 1); | 74 | return cpu & (threads_per_core - 1); |
72 | } | 75 | } |
73 | 76 | ||
74 | static inline int cpu_first_thread_in_core(int cpu) | 77 | static inline int cpu_first_thread_sibling(int cpu) |
75 | { | 78 | { |
76 | return cpu & ~(threads_per_core - 1); | 79 | return cpu & ~(threads_per_core - 1); |
77 | } | 80 | } |
78 | 81 | ||
79 | static inline int cpu_last_thread_in_core(int cpu) | 82 | static inline int cpu_last_thread_sibling(int cpu) |
80 | { | 83 | { |
81 | return cpu | (threads_per_core - 1); | 84 | return cpu | (threads_per_core - 1); |
82 | } | 85 | } |
diff --git a/arch/powerpc/include/asm/device.h b/arch/powerpc/include/asm/device.h index a3954e4fcbe2..16d25c0974be 100644 --- a/arch/powerpc/include/asm/device.h +++ b/arch/powerpc/include/asm/device.h | |||
@@ -9,6 +9,12 @@ | |||
9 | struct dma_map_ops; | 9 | struct dma_map_ops; |
10 | struct device_node; | 10 | struct device_node; |
11 | 11 | ||
12 | /* | ||
13 | * Arch extensions to struct device. | ||
14 | * | ||
15 | * When adding fields, consider macio_add_one_device in | ||
16 | * drivers/macintosh/macio_asic.c | ||
17 | */ | ||
12 | struct dev_archdata { | 18 | struct dev_archdata { |
13 | /* DMA operations on that device */ | 19 | /* DMA operations on that device */ |
14 | struct dma_map_ops *dma_ops; | 20 | struct dma_map_ops *dma_ops; |
diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h index 20778a405d7a..4ef662e4a31d 100644 --- a/arch/powerpc/include/asm/firmware.h +++ b/arch/powerpc/include/asm/firmware.h | |||
@@ -46,6 +46,7 @@ | |||
46 | #define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000) | 46 | #define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000) |
47 | #define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000) | 47 | #define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000) |
48 | #define FW_FEATURE_CMO ASM_CONST(0x0000000002000000) | 48 | #define FW_FEATURE_CMO ASM_CONST(0x0000000002000000) |
49 | #define FW_FEATURE_VPHN ASM_CONST(0x0000000004000000) | ||
49 | 50 | ||
50 | #ifndef __ASSEMBLY__ | 51 | #ifndef __ASSEMBLY__ |
51 | 52 | ||
@@ -59,7 +60,7 @@ enum { | |||
59 | FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN | | 60 | FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN | |
60 | FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR | | 61 | FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR | |
61 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | | 62 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | |
62 | FW_FEATURE_CMO, | 63 | FW_FEATURE_CMO | FW_FEATURE_VPHN, |
63 | FW_FEATURE_PSERIES_ALWAYS = 0, | 64 | FW_FEATURE_PSERIES_ALWAYS = 0, |
64 | FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, | 65 | FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, |
65 | FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, | 66 | FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index de03ca58db5d..ec089acfa56b 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
@@ -232,7 +232,9 @@ | |||
232 | #define H_GET_EM_PARMS 0x2B8 | 232 | #define H_GET_EM_PARMS 0x2B8 |
233 | #define H_SET_MPP 0x2D0 | 233 | #define H_SET_MPP 0x2D0 |
234 | #define H_GET_MPP 0x2D4 | 234 | #define H_GET_MPP 0x2D4 |
235 | #define MAX_HCALL_OPCODE H_GET_MPP | 235 | #define H_HOME_NODE_ASSOCIATIVITY 0x2EC |
236 | #define H_BEST_ENERGY 0x2F4 | ||
237 | #define MAX_HCALL_OPCODE H_BEST_ENERGY | ||
236 | 238 | ||
237 | #ifndef __ASSEMBLY__ | 239 | #ifndef __ASSEMBLY__ |
238 | 240 | ||
diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h index aac87cbceb57..fd3fd58bad84 100644 --- a/arch/powerpc/include/asm/mmzone.h +++ b/arch/powerpc/include/asm/mmzone.h | |||
@@ -33,6 +33,9 @@ extern int numa_cpu_lookup_table[]; | |||
33 | extern cpumask_var_t node_to_cpumask_map[]; | 33 | extern cpumask_var_t node_to_cpumask_map[]; |
34 | #ifdef CONFIG_MEMORY_HOTPLUG | 34 | #ifdef CONFIG_MEMORY_HOTPLUG |
35 | extern unsigned long max_pfn; | 35 | extern unsigned long max_pfn; |
36 | u64 memory_hotplug_max(void); | ||
37 | #else | ||
38 | #define memory_hotplug_max() memblock_end_of_DRAM() | ||
36 | #endif | 39 | #endif |
37 | 40 | ||
38 | /* | 41 | /* |
@@ -42,6 +45,8 @@ extern unsigned long max_pfn; | |||
42 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | 45 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) |
43 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn) | 46 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn) |
44 | 47 | ||
48 | #else | ||
49 | #define memory_hotplug_max() memblock_end_of_DRAM() | ||
45 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ | 50 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ |
46 | 51 | ||
47 | #endif /* __KERNEL__ */ | 52 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 4c14187ba02d..de1967a1ff57 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
@@ -122,7 +122,6 @@ extern struct task_struct *last_task_used_spe; | |||
122 | TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 ) | 122 | TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 ) |
123 | #endif | 123 | #endif |
124 | 124 | ||
125 | #ifdef __KERNEL__ | ||
126 | #ifdef __powerpc64__ | 125 | #ifdef __powerpc64__ |
127 | 126 | ||
128 | #define STACK_TOP_USER64 TASK_SIZE_USER64 | 127 | #define STACK_TOP_USER64 TASK_SIZE_USER64 |
@@ -139,7 +138,6 @@ extern struct task_struct *last_task_used_spe; | |||
139 | #define STACK_TOP_MAX STACK_TOP | 138 | #define STACK_TOP_MAX STACK_TOP |
140 | 139 | ||
141 | #endif /* __powerpc64__ */ | 140 | #endif /* __powerpc64__ */ |
142 | #endif /* __KERNEL__ */ | ||
143 | 141 | ||
144 | typedef struct { | 142 | typedef struct { |
145 | unsigned long seg; | 143 | unsigned long seg; |
diff --git a/arch/powerpc/include/asm/vdso_datapage.h b/arch/powerpc/include/asm/vdso_datapage.h index 08679c5319b8..25e39220e89c 100644 --- a/arch/powerpc/include/asm/vdso_datapage.h +++ b/arch/powerpc/include/asm/vdso_datapage.h | |||
@@ -116,9 +116,7 @@ struct vdso_data { | |||
116 | 116 | ||
117 | #endif /* CONFIG_PPC64 */ | 117 | #endif /* CONFIG_PPC64 */ |
118 | 118 | ||
119 | #ifdef __KERNEL__ | ||
120 | extern struct vdso_data *vdso_data; | 119 | extern struct vdso_data *vdso_data; |
121 | #endif | ||
122 | 120 | ||
123 | #endif /* __ASSEMBLY__ */ | 121 | #endif /* __ASSEMBLY__ */ |
124 | 122 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 36c30f31ec93..3bb2a3e6a337 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -29,8 +29,10 @@ endif | |||
29 | obj-y := cputable.o ptrace.o syscalls.o \ | 29 | obj-y := cputable.o ptrace.o syscalls.o \ |
30 | irq.o align.o signal_32.o pmc.o vdso.o \ | 30 | irq.o align.o signal_32.o pmc.o vdso.o \ |
31 | init_task.o process.o systbl.o idle.o \ | 31 | init_task.o process.o systbl.o idle.o \ |
32 | signal.o sysfs.o cacheinfo.o | 32 | signal.o sysfs.o cacheinfo.o time.o \ |
33 | obj-y += vdso32/ | 33 | prom.o traps.o setup-common.o \ |
34 | udbg.o misc.o io.o dma.o \ | ||
35 | misc_$(CONFIG_WORD_SIZE).o vdso32/ | ||
34 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ | 36 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ |
35 | signal_64.o ptrace32.o \ | 37 | signal_64.o ptrace32.o \ |
36 | paca.o nvram_64.o firmware.o | 38 | paca.o nvram_64.o firmware.o |
@@ -80,9 +82,6 @@ extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o | |||
80 | extra-$(CONFIG_8xx) := head_8xx.o | 82 | extra-$(CONFIG_8xx) := head_8xx.o |
81 | extra-y += vmlinux.lds | 83 | extra-y += vmlinux.lds |
82 | 84 | ||
83 | obj-y += time.o prom.o traps.o setup-common.o \ | ||
84 | udbg.o misc.o io.o dma.o \ | ||
85 | misc_$(CONFIG_WORD_SIZE).o | ||
86 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o | 85 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o |
87 | obj-$(CONFIG_PPC64) += dma-iommu.o iommu.o | 86 | obj-$(CONFIG_PPC64) += dma-iommu.o iommu.o |
88 | obj-$(CONFIG_KGDB) += kgdb.o | 87 | obj-$(CONFIG_KGDB) += kgdb.o |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index bd0df2e6aa8f..23e6a93145ab 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -209,7 +209,6 @@ int main(void) | |||
209 | DEFINE(RTASENTRY, offsetof(struct rtas_t, entry)); | 209 | DEFINE(RTASENTRY, offsetof(struct rtas_t, entry)); |
210 | 210 | ||
211 | /* Interrupt register frame */ | 211 | /* Interrupt register frame */ |
212 | DEFINE(STACK_FRAME_OVERHEAD, STACK_FRAME_OVERHEAD); | ||
213 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); | 212 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); |
214 | DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)); | 213 | DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)); |
215 | #ifdef CONFIG_PPC64 | 214 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 96a908f1cd87..be5ab18b03b5 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -457,16 +457,26 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
457 | .dcache_bsize = 128, | 457 | .dcache_bsize = 128, |
458 | .num_pmcs = 6, | 458 | .num_pmcs = 6, |
459 | .pmc_type = PPC_PMC_IBM, | 459 | .pmc_type = PPC_PMC_IBM, |
460 | .cpu_setup = __setup_cpu_power7, | ||
461 | .cpu_restore = __restore_cpu_power7, | ||
462 | .oprofile_cpu_type = "ppc64/power7", | 460 | .oprofile_cpu_type = "ppc64/power7", |
463 | .oprofile_type = PPC_OPROFILE_POWER4, | 461 | .oprofile_type = PPC_OPROFILE_POWER4, |
464 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, | ||
465 | .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, | ||
466 | .oprofile_mmcra_clear = POWER6_MMCRA_THRM | | ||
467 | POWER6_MMCRA_OTHER, | ||
468 | .platform = "power7", | 462 | .platform = "power7", |
469 | }, | 463 | }, |
464 | { /* Power7+ */ | ||
465 | .pvr_mask = 0xffff0000, | ||
466 | .pvr_value = 0x004A0000, | ||
467 | .cpu_name = "POWER7+ (raw)", | ||
468 | .cpu_features = CPU_FTRS_POWER7, | ||
469 | .cpu_user_features = COMMON_USER_POWER7, | ||
470 | .mmu_features = MMU_FTR_HPTE_TABLE | | ||
471 | MMU_FTR_TLBIE_206, | ||
472 | .icache_bsize = 128, | ||
473 | .dcache_bsize = 128, | ||
474 | .num_pmcs = 6, | ||
475 | .pmc_type = PPC_PMC_IBM, | ||
476 | .oprofile_cpu_type = "ppc64/power7", | ||
477 | .oprofile_type = PPC_OPROFILE_POWER4, | ||
478 | .platform = "power7+", | ||
479 | }, | ||
470 | { /* Cell Broadband Engine */ | 480 | { /* Cell Broadband Engine */ |
471 | .pvr_mask = 0xffff0000, | 481 | .pvr_mask = 0xffff0000, |
472 | .pvr_value = 0x00700000, | 482 | .pvr_value = 0x00700000, |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 8e05c16344e4..0a2af50243cb 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/prom.h> | 19 | #include <asm/prom.h> |
20 | #include <asm/firmware.h> | 20 | #include <asm/firmware.h> |
21 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
22 | #include <asm/rtas.h> | ||
22 | 23 | ||
23 | #ifdef DEBUG | 24 | #ifdef DEBUG |
24 | #include <asm/udbg.h> | 25 | #include <asm/udbg.h> |
@@ -141,3 +142,35 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
141 | 142 | ||
142 | return csize; | 143 | return csize; |
143 | } | 144 | } |
145 | |||
146 | #ifdef CONFIG_PPC_RTAS | ||
147 | /* | ||
148 | * The crashkernel region will almost always overlap the RTAS region, so | ||
149 | * we have to be careful when shrinking the crashkernel region. | ||
150 | */ | ||
151 | void crash_free_reserved_phys_range(unsigned long begin, unsigned long end) | ||
152 | { | ||
153 | unsigned long addr; | ||
154 | const u32 *basep, *sizep; | ||
155 | unsigned int rtas_start = 0, rtas_end = 0; | ||
156 | |||
157 | basep = of_get_property(rtas.dev, "linux,rtas-base", NULL); | ||
158 | sizep = of_get_property(rtas.dev, "rtas-size", NULL); | ||
159 | |||
160 | if (basep && sizep) { | ||
161 | rtas_start = *basep; | ||
162 | rtas_end = *basep + *sizep; | ||
163 | } | ||
164 | |||
165 | for (addr = begin; addr < end; addr += PAGE_SIZE) { | ||
166 | /* Does this page overlap with the RTAS region? */ | ||
167 | if (addr <= rtas_end && ((addr + PAGE_SIZE) > rtas_start)) | ||
168 | continue; | ||
169 | |||
170 | ClearPageReserved(pfn_to_page(addr >> PAGE_SHIFT)); | ||
171 | init_page_count(pfn_to_page(addr >> PAGE_SHIFT)); | ||
172 | free_page((unsigned long)__va(addr)); | ||
173 | totalram_pages++; | ||
174 | } | ||
175 | } | ||
176 | #endif | ||
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index ed4aeb96398b..c22dc1ec1c94 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/asm-offsets.h> | 31 | #include <asm/asm-offsets.h> |
32 | #include <asm/unistd.h> | 32 | #include <asm/unistd.h> |
33 | #include <asm/ftrace.h> | 33 | #include <asm/ftrace.h> |
34 | #include <asm/ptrace.h> | ||
34 | 35 | ||
35 | #undef SHOW_SYSCALLS | 36 | #undef SHOW_SYSCALLS |
36 | #undef SHOW_SYSCALLS_TASK | 37 | #undef SHOW_SYSCALLS_TASK |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 9f8b01d6466f..8a817995b4cd 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -13,6 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <asm/exception-64s.h> | 15 | #include <asm/exception-64s.h> |
16 | #include <asm/ptrace.h> | ||
16 | 17 | ||
17 | /* | 18 | /* |
18 | * We layout physical memory as follows: | 19 | * We layout physical memory as follows: |
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index e86c040ae585..de369558bf0a 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/thread_info.h> | 23 | #include <asm/thread_info.h> |
24 | #include <asm/ppc_asm.h> | 24 | #include <asm/ppc_asm.h> |
25 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
26 | #include <asm/ptrace.h> | ||
26 | 27 | ||
27 | #ifdef CONFIG_VSX | 28 | #ifdef CONFIG_VSX |
28 | #define REST_32FPVSRS(n,c,base) \ | 29 | #define REST_32FPVSRS(n,c,base) \ |
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index 8278e8bad5a0..9dd21a8c4d52 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <asm/thread_info.h> | 40 | #include <asm/thread_info.h> |
41 | #include <asm/ppc_asm.h> | 41 | #include <asm/ppc_asm.h> |
42 | #include <asm/asm-offsets.h> | 42 | #include <asm/asm-offsets.h> |
43 | #include <asm/ptrace.h> | ||
43 | 44 | ||
44 | /* As with the other PowerPC ports, it is expected that when code | 45 | /* As with the other PowerPC ports, it is expected that when code |
45 | * execution begins here, the following registers contain valid, yet | 46 | * execution begins here, the following registers contain valid, yet |
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 562305b40a8e..cbb3436b592d 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <asm/thread_info.h> | 37 | #include <asm/thread_info.h> |
38 | #include <asm/ppc_asm.h> | 38 | #include <asm/ppc_asm.h> |
39 | #include <asm/asm-offsets.h> | 39 | #include <asm/asm-offsets.h> |
40 | #include <asm/ptrace.h> | ||
40 | #include <asm/synch.h> | 41 | #include <asm/synch.h> |
41 | #include "head_booke.h" | 42 | #include "head_booke.h" |
42 | 43 | ||
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index f0dd577e4a5b..ce41b97eb512 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/page_64.h> | 38 | #include <asm/page_64.h> |
39 | #include <asm/irqflags.h> | 39 | #include <asm/irqflags.h> |
40 | #include <asm/kvm_book3s_asm.h> | 40 | #include <asm/kvm_book3s_asm.h> |
41 | #include <asm/ptrace.h> | ||
41 | 42 | ||
42 | /* The physical memory is layed out such that the secondary processor | 43 | /* The physical memory is layed out such that the secondary processor |
43 | * spin code sits at 0x0000...0x00ff. On server, the vectors follow | 44 | * spin code sits at 0x0000...0x00ff. On server, the vectors follow |
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 1f1a04b5c2a4..1cbf64e6b416 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/thread_info.h> | 29 | #include <asm/thread_info.h> |
30 | #include <asm/ppc_asm.h> | 30 | #include <asm/ppc_asm.h> |
31 | #include <asm/asm-offsets.h> | 31 | #include <asm/asm-offsets.h> |
32 | #include <asm/ptrace.h> | ||
32 | 33 | ||
33 | /* Macro to make the code more readable. */ | 34 | /* Macro to make the code more readable. */ |
34 | #ifdef CONFIG_8xx_CPU6 | 35 | #ifdef CONFIG_8xx_CPU6 |
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 529b817f473b..3e02710d9562 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/ppc_asm.h> | 41 | #include <asm/ppc_asm.h> |
42 | #include <asm/asm-offsets.h> | 42 | #include <asm/asm-offsets.h> |
43 | #include <asm/cache.h> | 43 | #include <asm/cache.h> |
44 | #include <asm/ptrace.h> | ||
44 | #include "head_booke.h" | 45 | #include "head_booke.h" |
45 | 46 | ||
46 | /* As with the other PowerPC ports, it is expected that when code | 47 | /* As with the other PowerPC ports, it is expected that when code |
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S index 2d29752cbe16..b69463ec2010 100644 --- a/arch/powerpc/kernel/misc.S +++ b/arch/powerpc/kernel/misc.S | |||
@@ -122,8 +122,3 @@ _GLOBAL(longjmp) | |||
122 | mtlr r0 | 122 | mtlr r0 |
123 | mr r3,r4 | 123 | mr r3,r4 |
124 | blr | 124 | blr |
125 | |||
126 | _GLOBAL(__setup_cpu_power7) | ||
127 | _GLOBAL(__restore_cpu_power7) | ||
128 | /* place holder */ | ||
129 | blr | ||
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index a7a570dcdd57..094bd9821ad4 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/processor.h> | 30 | #include <asm/processor.h> |
31 | #include <asm/kexec.h> | 31 | #include <asm/kexec.h> |
32 | #include <asm/bug.h> | 32 | #include <asm/bug.h> |
33 | #include <asm/ptrace.h> | ||
33 | 34 | ||
34 | .text | 35 | .text |
35 | 36 | ||
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index e5144906a56d..206a321a71d3 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/cputable.h> | 25 | #include <asm/cputable.h> |
26 | #include <asm/thread_info.h> | 26 | #include <asm/thread_info.h> |
27 | #include <asm/kexec.h> | 27 | #include <asm/kexec.h> |
28 | #include <asm/ptrace.h> | ||
28 | 29 | ||
29 | .text | 30 | .text |
30 | 31 | ||
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index ab3e392ac63c..ef3ef566235e 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -186,3 +186,10 @@ EXPORT_SYMBOL(__mtdcr); | |||
186 | EXPORT_SYMBOL(__mfdcr); | 186 | EXPORT_SYMBOL(__mfdcr); |
187 | #endif | 187 | #endif |
188 | EXPORT_SYMBOL(empty_zero_page); | 188 | EXPORT_SYMBOL(empty_zero_page); |
189 | |||
190 | #ifdef CONFIG_PPC64 | ||
191 | EXPORT_SYMBOL(__arch_hweight8); | ||
192 | EXPORT_SYMBOL(__arch_hweight16); | ||
193 | EXPORT_SYMBOL(__arch_hweight32); | ||
194 | EXPORT_SYMBOL(__arch_hweight64); | ||
195 | #endif | ||
diff --git a/arch/powerpc/kernel/ppc_save_regs.S b/arch/powerpc/kernel/ppc_save_regs.S index 5113bd2285e1..e83ba3f078e4 100644 --- a/arch/powerpc/kernel/ppc_save_regs.S +++ b/arch/powerpc/kernel/ppc_save_regs.S | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/processor.h> | 11 | #include <asm/processor.h> |
12 | #include <asm/ppc_asm.h> | 12 | #include <asm/ppc_asm.h> |
13 | #include <asm/asm-offsets.h> | 13 | #include <asm/asm-offsets.h> |
14 | #include <asm/ptrace.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * Grab the register values as they are now. | 17 | * Grab the register values as they are now. |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 68034bbf2e4f..981360509172 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -466,7 +466,20 @@ out: | |||
466 | return id; | 466 | return id; |
467 | } | 467 | } |
468 | 468 | ||
469 | /* Must be called when no change can occur to cpu_present_mask, | 469 | /* Helper routines for cpu to core mapping */ |
470 | int cpu_core_index_of_thread(int cpu) | ||
471 | { | ||
472 | return cpu >> threads_shift; | ||
473 | } | ||
474 | EXPORT_SYMBOL_GPL(cpu_core_index_of_thread); | ||
475 | |||
476 | int cpu_first_thread_of_core(int core) | ||
477 | { | ||
478 | return core << threads_shift; | ||
479 | } | ||
480 | EXPORT_SYMBOL_GPL(cpu_first_thread_of_core); | ||
481 | |||
482 | /* Must be called when no change can occur to cpu_present_map, | ||
470 | * i.e. during cpu online or offline. | 483 | * i.e. during cpu online or offline. |
471 | */ | 484 | */ |
472 | static struct device_node *cpu_to_l2cache(int cpu) | 485 | static struct device_node *cpu_to_l2cache(int cpu) |
@@ -514,7 +527,7 @@ int __devinit start_secondary(void *unused) | |||
514 | notify_cpu_starting(cpu); | 527 | notify_cpu_starting(cpu); |
515 | set_cpu_online(cpu, true); | 528 | set_cpu_online(cpu, true); |
516 | /* Update sibling maps */ | 529 | /* Update sibling maps */ |
517 | base = cpu_first_thread_in_core(cpu); | 530 | base = cpu_first_thread_sibling(cpu); |
518 | for (i = 0; i < threads_per_core; i++) { | 531 | for (i = 0; i < threads_per_core; i++) { |
519 | if (cpu_is_offline(base + i)) | 532 | if (cpu_is_offline(base + i)) |
520 | continue; | 533 | continue; |
@@ -600,7 +613,7 @@ int __cpu_disable(void) | |||
600 | return err; | 613 | return err; |
601 | 614 | ||
602 | /* Update sibling maps */ | 615 | /* Update sibling maps */ |
603 | base = cpu_first_thread_in_core(cpu); | 616 | base = cpu_first_thread_sibling(cpu); |
604 | for (i = 0; i < threads_per_core; i++) { | 617 | for (i = 0; i < threads_per_core; i++) { |
605 | cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i)); | 618 | cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i)); |
606 | cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu)); | 619 | cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu)); |
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index fe460482fa68..9de6f396cf85 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <asm/cputable.h> | 5 | #include <asm/cputable.h> |
6 | #include <asm/thread_info.h> | 6 | #include <asm/thread_info.h> |
7 | #include <asm/page.h> | 7 | #include <asm/page.h> |
8 | #include <asm/ptrace.h> | ||
8 | 9 | ||
9 | /* | 10 | /* |
10 | * load_up_altivec(unused, unused, tsk) | 11 | * load_up_altivec(unused, unused, tsk) |
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index 441d2a722f06..b2654058f2e4 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c | |||
@@ -600,6 +600,11 @@ static void vio_dma_iommu_unmap_sg(struct device *dev, | |||
600 | vio_cmo_dealloc(viodev, alloc_size); | 600 | vio_cmo_dealloc(viodev, alloc_size); |
601 | } | 601 | } |
602 | 602 | ||
603 | static int vio_dma_iommu_dma_supported(struct device *dev, u64 mask) | ||
604 | { | ||
605 | return dma_iommu_ops.dma_supported(dev, mask); | ||
606 | } | ||
607 | |||
603 | struct dma_map_ops vio_dma_mapping_ops = { | 608 | struct dma_map_ops vio_dma_mapping_ops = { |
604 | .alloc_coherent = vio_dma_iommu_alloc_coherent, | 609 | .alloc_coherent = vio_dma_iommu_alloc_coherent, |
605 | .free_coherent = vio_dma_iommu_free_coherent, | 610 | .free_coherent = vio_dma_iommu_free_coherent, |
@@ -607,6 +612,7 @@ struct dma_map_ops vio_dma_mapping_ops = { | |||
607 | .unmap_sg = vio_dma_iommu_unmap_sg, | 612 | .unmap_sg = vio_dma_iommu_unmap_sg, |
608 | .map_page = vio_dma_iommu_map_page, | 613 | .map_page = vio_dma_iommu_map_page, |
609 | .unmap_page = vio_dma_iommu_unmap_page, | 614 | .unmap_page = vio_dma_iommu_unmap_page, |
615 | .dma_supported = vio_dma_iommu_dma_supported, | ||
610 | 616 | ||
611 | }; | 617 | }; |
612 | 618 | ||
@@ -858,8 +864,7 @@ static void vio_cmo_bus_remove(struct vio_dev *viodev) | |||
858 | 864 | ||
859 | static void vio_cmo_set_dma_ops(struct vio_dev *viodev) | 865 | static void vio_cmo_set_dma_ops(struct vio_dev *viodev) |
860 | { | 866 | { |
861 | vio_dma_mapping_ops.dma_supported = dma_iommu_ops.dma_supported; | 867 | set_dma_ops(&viodev->dev, &vio_dma_mapping_ops); |
862 | viodev->dev.archdata.dma_ops = &vio_dma_mapping_ops; | ||
863 | } | 868 | } |
864 | 869 | ||
865 | /** | 870 | /** |
@@ -1244,7 +1249,7 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node) | |||
1244 | if (firmware_has_feature(FW_FEATURE_CMO)) | 1249 | if (firmware_has_feature(FW_FEATURE_CMO)) |
1245 | vio_cmo_set_dma_ops(viodev); | 1250 | vio_cmo_set_dma_ops(viodev); |
1246 | else | 1251 | else |
1247 | viodev->dev.archdata.dma_ops = &dma_iommu_ops; | 1252 | set_dma_ops(&viodev->dev, &dma_iommu_ops); |
1248 | set_iommu_table_base(&viodev->dev, vio_build_iommu_table(viodev)); | 1253 | set_iommu_table_base(&viodev->dev, vio_build_iommu_table(viodev)); |
1249 | set_dev_node(&viodev->dev, of_node_to_nid(of_node)); | 1254 | set_dev_node(&viodev->dev, of_node_to_nid(of_node)); |
1250 | 1255 | ||
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 889f2bc106dd..166a6a0ad544 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile | |||
@@ -16,7 +16,7 @@ obj-$(CONFIG_HAS_IOMEM) += devres.o | |||
16 | 16 | ||
17 | obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \ | 17 | obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \ |
18 | memcpy_64.o usercopy_64.o mem_64.o string.o \ | 18 | memcpy_64.o usercopy_64.o mem_64.o string.o \ |
19 | checksum_wrappers_64.o | 19 | checksum_wrappers_64.o hweight_64.o |
20 | obj-$(CONFIG_XMON) += sstep.o ldstfp.o | 20 | obj-$(CONFIG_XMON) += sstep.o ldstfp.o |
21 | obj-$(CONFIG_KPROBES) += sstep.o ldstfp.o | 21 | obj-$(CONFIG_KPROBES) += sstep.o ldstfp.o |
22 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += sstep.o ldstfp.o | 22 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += sstep.o ldstfp.o |
diff --git a/arch/powerpc/lib/hweight_64.S b/arch/powerpc/lib/hweight_64.S new file mode 100644 index 000000000000..ee2320bb5ddf --- /dev/null +++ b/arch/powerpc/lib/hweight_64.S | |||
@@ -0,0 +1,110 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; either version 2 of the License, or | ||
5 | * (at your option) any later version. | ||
6 | * | ||
7 | * This program is distributed in the hope that it will be useful, | ||
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10 | * GNU General Public License for more details. | ||
11 | * | ||
12 | * You should have received a copy of the GNU General Public License | ||
13 | * along with this program; if not, write to the Free Software | ||
14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
15 | * | ||
16 | * Copyright (C) IBM Corporation, 2010 | ||
17 | * | ||
18 | * Author: Anton Blanchard <anton@au.ibm.com> | ||
19 | */ | ||
20 | #include <asm/processor.h> | ||
21 | #include <asm/ppc_asm.h> | ||
22 | |||
23 | /* Note: This code relies on -mminimal-toc */ | ||
24 | |||
25 | _GLOBAL(__arch_hweight8) | ||
26 | BEGIN_FTR_SECTION | ||
27 | b .__sw_hweight8 | ||
28 | nop | ||
29 | nop | ||
30 | FTR_SECTION_ELSE | ||
31 | popcntb r3,r3 | ||
32 | clrldi r3,r3,64-8 | ||
33 | blr | ||
34 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) | ||
35 | |||
36 | _GLOBAL(__arch_hweight16) | ||
37 | BEGIN_FTR_SECTION | ||
38 | b .__sw_hweight16 | ||
39 | nop | ||
40 | nop | ||
41 | nop | ||
42 | nop | ||
43 | FTR_SECTION_ELSE | ||
44 | BEGIN_FTR_SECTION_NESTED(50) | ||
45 | popcntb r3,r3 | ||
46 | srdi r4,r3,8 | ||
47 | add r3,r4,r3 | ||
48 | clrldi r3,r3,64-8 | ||
49 | blr | ||
50 | FTR_SECTION_ELSE_NESTED(50) | ||
51 | clrlwi r3,r3,16 | ||
52 | popcntw r3,r3 | ||
53 | clrldi r3,r3,64-8 | ||
54 | blr | ||
55 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50) | ||
56 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) | ||
57 | |||
58 | _GLOBAL(__arch_hweight32) | ||
59 | BEGIN_FTR_SECTION | ||
60 | b .__sw_hweight32 | ||
61 | nop | ||
62 | nop | ||
63 | nop | ||
64 | nop | ||
65 | nop | ||
66 | nop | ||
67 | FTR_SECTION_ELSE | ||
68 | BEGIN_FTR_SECTION_NESTED(51) | ||
69 | popcntb r3,r3 | ||
70 | srdi r4,r3,16 | ||
71 | add r3,r4,r3 | ||
72 | srdi r4,r3,8 | ||
73 | add r3,r4,r3 | ||
74 | clrldi r3,r3,64-8 | ||
75 | blr | ||
76 | FTR_SECTION_ELSE_NESTED(51) | ||
77 | popcntw r3,r3 | ||
78 | clrldi r3,r3,64-8 | ||
79 | blr | ||
80 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51) | ||
81 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) | ||
82 | |||
83 | _GLOBAL(__arch_hweight64) | ||
84 | BEGIN_FTR_SECTION | ||
85 | b .__sw_hweight64 | ||
86 | nop | ||
87 | nop | ||
88 | nop | ||
89 | nop | ||
90 | nop | ||
91 | nop | ||
92 | nop | ||
93 | nop | ||
94 | FTR_SECTION_ELSE | ||
95 | BEGIN_FTR_SECTION_NESTED(52) | ||
96 | popcntb r3,r3 | ||
97 | srdi r4,r3,32 | ||
98 | add r3,r4,r3 | ||
99 | srdi r4,r3,16 | ||
100 | add r3,r4,r3 | ||
101 | srdi r4,r3,8 | ||
102 | add r3,r4,r3 | ||
103 | clrldi r3,r3,64-8 | ||
104 | blr | ||
105 | FTR_SECTION_ELSE_NESTED(52) | ||
106 | popcntd r3,r3 | ||
107 | clrldi r3,r3,64-8 | ||
108 | blr | ||
109 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52) | ||
110 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 5e9584405c45..a5991facddce 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -1070,7 +1070,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, | |||
1070 | unsigned long access, unsigned long trap) | 1070 | unsigned long access, unsigned long trap) |
1071 | { | 1071 | { |
1072 | unsigned long vsid; | 1072 | unsigned long vsid; |
1073 | void *pgdir; | 1073 | pgd_t *pgdir; |
1074 | pte_t *ptep; | 1074 | pte_t *ptep; |
1075 | unsigned long flags; | 1075 | unsigned long flags; |
1076 | int rc, ssize, local = 0; | 1076 | int rc, ssize, local = 0; |
diff --git a/arch/powerpc/mm/mmu_context_nohash.c b/arch/powerpc/mm/mmu_context_nohash.c index 5ce99848d91e..c0aab52da3a5 100644 --- a/arch/powerpc/mm/mmu_context_nohash.c +++ b/arch/powerpc/mm/mmu_context_nohash.c | |||
@@ -111,8 +111,8 @@ static unsigned int steal_context_smp(unsigned int id) | |||
111 | * a core map instead but this will do for now. | 111 | * a core map instead but this will do for now. |
112 | */ | 112 | */ |
113 | for_each_cpu(cpu, mm_cpumask(mm)) { | 113 | for_each_cpu(cpu, mm_cpumask(mm)) { |
114 | for (i = cpu_first_thread_in_core(cpu); | 114 | for (i = cpu_first_thread_sibling(cpu); |
115 | i <= cpu_last_thread_in_core(cpu); i++) | 115 | i <= cpu_last_thread_sibling(cpu); i++) |
116 | __set_bit(id, stale_map[i]); | 116 | __set_bit(id, stale_map[i]); |
117 | cpu = i - 1; | 117 | cpu = i - 1; |
118 | } | 118 | } |
@@ -264,14 +264,14 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | |||
264 | */ | 264 | */ |
265 | if (test_bit(id, stale_map[cpu])) { | 265 | if (test_bit(id, stale_map[cpu])) { |
266 | pr_hardcont(" | stale flush %d [%d..%d]", | 266 | pr_hardcont(" | stale flush %d [%d..%d]", |
267 | id, cpu_first_thread_in_core(cpu), | 267 | id, cpu_first_thread_sibling(cpu), |
268 | cpu_last_thread_in_core(cpu)); | 268 | cpu_last_thread_sibling(cpu)); |
269 | 269 | ||
270 | local_flush_tlb_mm(next); | 270 | local_flush_tlb_mm(next); |
271 | 271 | ||
272 | /* XXX This clear should ultimately be part of local_flush_tlb_mm */ | 272 | /* XXX This clear should ultimately be part of local_flush_tlb_mm */ |
273 | for (i = cpu_first_thread_in_core(cpu); | 273 | for (i = cpu_first_thread_sibling(cpu); |
274 | i <= cpu_last_thread_in_core(cpu); i++) { | 274 | i <= cpu_last_thread_sibling(cpu); i++) { |
275 | __clear_bit(id, stale_map[i]); | 275 | __clear_bit(id, stale_map[i]); |
276 | } | 276 | } |
277 | } | 277 | } |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 74505b245374..8c0944c465f6 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -1247,4 +1247,30 @@ int hot_add_scn_to_nid(unsigned long scn_addr) | |||
1247 | return nid; | 1247 | return nid; |
1248 | } | 1248 | } |
1249 | 1249 | ||
1250 | static u64 hot_add_drconf_memory_max(void) | ||
1251 | { | ||
1252 | struct device_node *memory = NULL; | ||
1253 | unsigned int drconf_cell_cnt = 0; | ||
1254 | u64 lmb_size = 0; | ||
1255 | const u32 *dm = 0; | ||
1256 | |||
1257 | memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); | ||
1258 | if (memory) { | ||
1259 | drconf_cell_cnt = of_get_drconf_memory(memory, &dm); | ||
1260 | lmb_size = of_get_lmb_size(memory); | ||
1261 | of_node_put(memory); | ||
1262 | } | ||
1263 | return lmb_size * drconf_cell_cnt; | ||
1264 | } | ||
1265 | |||
1266 | /* | ||
1267 | * memory_hotplug_max - return max address of memory that may be added | ||
1268 | * | ||
1269 | * This is currently only used on systems that support drconfig memory | ||
1270 | * hotplug. | ||
1271 | */ | ||
1272 | u64 memory_hotplug_max(void) | ||
1273 | { | ||
1274 | return max(hot_add_drconf_memory_max(), memblock_end_of_DRAM()); | ||
1275 | } | ||
1250 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 1276 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
diff --git a/arch/powerpc/platforms/cell/beat_iommu.c b/arch/powerpc/platforms/cell/beat_iommu.c index beec405eb6f8..3ce685568935 100644 --- a/arch/powerpc/platforms/cell/beat_iommu.c +++ b/arch/powerpc/platforms/cell/beat_iommu.c | |||
@@ -76,7 +76,7 @@ static void __init celleb_init_direct_mapping(void) | |||
76 | 76 | ||
77 | static void celleb_dma_dev_setup(struct device *dev) | 77 | static void celleb_dma_dev_setup(struct device *dev) |
78 | { | 78 | { |
79 | dev->archdata.dma_ops = get_pci_dma_ops(); | 79 | set_dma_ops(dev, &dma_direct_ops); |
80 | set_dma_offset(dev, celleb_dma_direct_offset); | 80 | set_dma_offset(dev, celleb_dma_direct_offset); |
81 | } | 81 | } |
82 | 82 | ||
@@ -106,7 +106,6 @@ static struct notifier_block celleb_of_bus_notifier = { | |||
106 | static int __init celleb_init_iommu(void) | 106 | static int __init celleb_init_iommu(void) |
107 | { | 107 | { |
108 | celleb_init_direct_mapping(); | 108 | celleb_init_direct_mapping(); |
109 | set_pci_dma_ops(&dma_direct_ops); | ||
110 | ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup; | 109 | ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup; |
111 | bus_register_notifier(&platform_bus_type, &celleb_of_bus_notifier); | 110 | bus_register_notifier(&platform_bus_type, &celleb_of_bus_notifier); |
112 | 111 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c b/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c index a101abf17504..3b894f585280 100644 --- a/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c +++ b/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c | |||
@@ -36,10 +36,9 @@ static int spu_alloc_lscsa_std(struct spu_state *csa) | |||
36 | struct spu_lscsa *lscsa; | 36 | struct spu_lscsa *lscsa; |
37 | unsigned char *p; | 37 | unsigned char *p; |
38 | 38 | ||
39 | lscsa = vmalloc(sizeof(struct spu_lscsa)); | 39 | lscsa = vzalloc(sizeof(struct spu_lscsa)); |
40 | if (!lscsa) | 40 | if (!lscsa) |
41 | return -ENOMEM; | 41 | return -ENOMEM; |
42 | memset(lscsa, 0, sizeof(struct spu_lscsa)); | ||
43 | csa->lscsa = lscsa; | 42 | csa->lscsa = lscsa; |
44 | 43 | ||
45 | /* Set LS pages reserved to allow for user-space mapping. */ | 44 | /* Set LS pages reserved to allow for user-space mapping. */ |
diff --git a/arch/powerpc/platforms/iseries/mf.c b/arch/powerpc/platforms/iseries/mf.c index 42d0a886de05..b5e026bdca21 100644 --- a/arch/powerpc/platforms/iseries/mf.c +++ b/arch/powerpc/platforms/iseries/mf.c | |||
@@ -1045,71 +1045,9 @@ static const struct file_operations mf_side_proc_fops = { | |||
1045 | .write = mf_side_proc_write, | 1045 | .write = mf_side_proc_write, |
1046 | }; | 1046 | }; |
1047 | 1047 | ||
1048 | #if 0 | ||
1049 | static void mf_getSrcHistory(char *buffer, int size) | ||
1050 | { | ||
1051 | struct IplTypeReturnStuff return_stuff; | ||
1052 | struct pending_event *ev = new_pending_event(); | ||
1053 | int rc = 0; | ||
1054 | char *pages[4]; | ||
1055 | |||
1056 | pages[0] = kmalloc(4096, GFP_ATOMIC); | ||
1057 | pages[1] = kmalloc(4096, GFP_ATOMIC); | ||
1058 | pages[2] = kmalloc(4096, GFP_ATOMIC); | ||
1059 | pages[3] = kmalloc(4096, GFP_ATOMIC); | ||
1060 | if ((ev == NULL) || (pages[0] == NULL) || (pages[1] == NULL) | ||
1061 | || (pages[2] == NULL) || (pages[3] == NULL)) | ||
1062 | return -ENOMEM; | ||
1063 | |||
1064 | return_stuff.xType = 0; | ||
1065 | return_stuff.xRc = 0; | ||
1066 | return_stuff.xDone = 0; | ||
1067 | ev->event.hp_lp_event.xSubtype = 6; | ||
1068 | ev->event.hp_lp_event.x.xSubtypeData = | ||
1069 | subtype_data('M', 'F', 'V', 'I'); | ||
1070 | ev->event.data.vsp_cmd.xEvent = &return_stuff; | ||
1071 | ev->event.data.vsp_cmd.cmd = 4; | ||
1072 | ev->event.data.vsp_cmd.lp_index = HvLpConfig_getLpIndex(); | ||
1073 | ev->event.data.vsp_cmd.result_code = 0xFF; | ||
1074 | ev->event.data.vsp_cmd.reserved = 0; | ||
1075 | ev->event.data.vsp_cmd.sub_data.page[0] = iseries_hv_addr(pages[0]); | ||
1076 | ev->event.data.vsp_cmd.sub_data.page[1] = iseries_hv_addr(pages[1]); | ||
1077 | ev->event.data.vsp_cmd.sub_data.page[2] = iseries_hv_addr(pages[2]); | ||
1078 | ev->event.data.vsp_cmd.sub_data.page[3] = iseries_hv_addr(pages[3]); | ||
1079 | mb(); | ||
1080 | if (signal_event(ev) != 0) | ||
1081 | return; | ||
1082 | |||
1083 | while (return_stuff.xDone != 1) | ||
1084 | udelay(10); | ||
1085 | if (return_stuff.xRc == 0) | ||
1086 | memcpy(buffer, pages[0], size); | ||
1087 | kfree(pages[0]); | ||
1088 | kfree(pages[1]); | ||
1089 | kfree(pages[2]); | ||
1090 | kfree(pages[3]); | ||
1091 | } | ||
1092 | #endif | ||
1093 | |||
1094 | static int mf_src_proc_show(struct seq_file *m, void *v) | 1048 | static int mf_src_proc_show(struct seq_file *m, void *v) |
1095 | { | 1049 | { |
1096 | #if 0 | ||
1097 | int len; | ||
1098 | |||
1099 | mf_getSrcHistory(page, count); | ||
1100 | len = count; | ||
1101 | len -= off; | ||
1102 | if (len < count) { | ||
1103 | *eof = 1; | ||
1104 | if (len <= 0) | ||
1105 | return 0; | ||
1106 | } else | ||
1107 | len = count; | ||
1108 | *start = page + off; | ||
1109 | return len; | ||
1110 | #else | ||
1111 | return 0; | 1050 | return 0; |
1112 | #endif | ||
1113 | } | 1051 | } |
1114 | 1052 | ||
1115 | static int mf_src_proc_open(struct inode *inode, struct file *file) | 1053 | static int mf_src_proc_open(struct inode *inode, struct file *file) |
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c index 1f9fb2c57761..14943ef01918 100644 --- a/arch/powerpc/platforms/pasemi/iommu.c +++ b/arch/powerpc/platforms/pasemi/iommu.c | |||
@@ -156,20 +156,12 @@ static void iommu_table_iobmap_setup(void) | |||
156 | 156 | ||
157 | static void pci_dma_bus_setup_pasemi(struct pci_bus *bus) | 157 | static void pci_dma_bus_setup_pasemi(struct pci_bus *bus) |
158 | { | 158 | { |
159 | struct device_node *dn; | ||
160 | |||
161 | pr_debug("pci_dma_bus_setup, bus %p, bus->self %p\n", bus, bus->self); | 159 | pr_debug("pci_dma_bus_setup, bus %p, bus->self %p\n", bus, bus->self); |
162 | 160 | ||
163 | if (!iommu_table_iobmap_inited) { | 161 | if (!iommu_table_iobmap_inited) { |
164 | iommu_table_iobmap_inited = 1; | 162 | iommu_table_iobmap_inited = 1; |
165 | iommu_table_iobmap_setup(); | 163 | iommu_table_iobmap_setup(); |
166 | } | 164 | } |
167 | |||
168 | dn = pci_bus_to_OF_node(bus); | ||
169 | |||
170 | if (dn) | ||
171 | PCI_DN(dn)->iommu_table = &iommu_table_iobmap; | ||
172 | |||
173 | } | 165 | } |
174 | 166 | ||
175 | 167 | ||
@@ -192,9 +184,6 @@ static void pci_dma_dev_setup_pasemi(struct pci_dev *dev) | |||
192 | set_iommu_table_base(&dev->dev, &iommu_table_iobmap); | 184 | set_iommu_table_base(&dev->dev, &iommu_table_iobmap); |
193 | } | 185 | } |
194 | 186 | ||
195 | static void pci_dma_bus_setup_null(struct pci_bus *b) { } | ||
196 | static void pci_dma_dev_setup_null(struct pci_dev *d) { } | ||
197 | |||
198 | int __init iob_init(struct device_node *dn) | 187 | int __init iob_init(struct device_node *dn) |
199 | { | 188 | { |
200 | unsigned long tmp; | 189 | unsigned long tmp; |
@@ -251,14 +240,8 @@ void __init iommu_init_early_pasemi(void) | |||
251 | iommu_off = of_chosen && | 240 | iommu_off = of_chosen && |
252 | of_get_property(of_chosen, "linux,iommu-off", NULL); | 241 | of_get_property(of_chosen, "linux,iommu-off", NULL); |
253 | #endif | 242 | #endif |
254 | if (iommu_off) { | 243 | if (iommu_off) |
255 | /* Direct I/O, IOMMU off */ | ||
256 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_null; | ||
257 | ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_null; | ||
258 | set_pci_dma_ops(&dma_direct_ops); | ||
259 | |||
260 | return; | 244 | return; |
261 | } | ||
262 | 245 | ||
263 | iob_init(NULL); | 246 | iob_init(NULL); |
264 | 247 | ||
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index 3139814f6439..5d1b743dbe7e 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig | |||
@@ -33,6 +33,16 @@ config PSERIES_MSI | |||
33 | depends on PCI_MSI && EEH | 33 | depends on PCI_MSI && EEH |
34 | default y | 34 | default y |
35 | 35 | ||
36 | config PSERIES_ENERGY | ||
37 | tristate "pSeries energy management capabilities driver" | ||
38 | depends on PPC_PSERIES | ||
39 | default y | ||
40 | help | ||
41 | Provides interface to platform energy management capabilities | ||
42 | on supported PSERIES platforms. | ||
43 | Provides: /sys/devices/system/cpu/pseries_(de)activation_hint_list | ||
44 | and /sys/devices/system/cpu/cpuN/pseries_(de)activation_hint | ||
45 | |||
36 | config SCANLOG | 46 | config SCANLOG |
37 | tristate "Scanlog dump interface" | 47 | tristate "Scanlog dump interface" |
38 | depends on RTAS_PROC && PPC_PSERIES | 48 | depends on RTAS_PROC && PPC_PSERIES |
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile index 59eb8bdaa79d..fc5237810ece 100644 --- a/arch/powerpc/platforms/pseries/Makefile +++ b/arch/powerpc/platforms/pseries/Makefile | |||
@@ -11,6 +11,7 @@ obj-$(CONFIG_EEH) += eeh.o eeh_cache.o eeh_driver.o eeh_event.o eeh_sysfs.o | |||
11 | obj-$(CONFIG_KEXEC) += kexec.o | 11 | obj-$(CONFIG_KEXEC) += kexec.o |
12 | obj-$(CONFIG_PCI) += pci.o pci_dlpar.o | 12 | obj-$(CONFIG_PCI) += pci.o pci_dlpar.o |
13 | obj-$(CONFIG_PSERIES_MSI) += msi.o | 13 | obj-$(CONFIG_PSERIES_MSI) += msi.o |
14 | obj-$(CONFIG_PSERIES_ENERGY) += pseries_energy.o | ||
14 | 15 | ||
15 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug-cpu.o | 16 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug-cpu.o |
16 | obj-$(CONFIG_MEMORY_HOTPLUG) += hotplug-memory.o | 17 | obj-$(CONFIG_MEMORY_HOTPLUG) += hotplug-memory.o |
diff --git a/arch/powerpc/platforms/pseries/firmware.c b/arch/powerpc/platforms/pseries/firmware.c index 0a14d8cd314f..0b0eff0cce35 100644 --- a/arch/powerpc/platforms/pseries/firmware.c +++ b/arch/powerpc/platforms/pseries/firmware.c | |||
@@ -55,6 +55,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = { | |||
55 | {FW_FEATURE_XDABR, "hcall-xdabr"}, | 55 | {FW_FEATURE_XDABR, "hcall-xdabr"}, |
56 | {FW_FEATURE_MULTITCE, "hcall-multi-tce"}, | 56 | {FW_FEATURE_MULTITCE, "hcall-multi-tce"}, |
57 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, | 57 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, |
58 | {FW_FEATURE_VPHN, "hcall-vphn"}, | ||
58 | }; | 59 | }; |
59 | 60 | ||
60 | /* Build up the firmware features bitmask using the contents of | 61 | /* Build up the firmware features bitmask using the contents of |
diff --git a/arch/powerpc/platforms/pseries/hvCall.S b/arch/powerpc/platforms/pseries/hvCall.S index 48d20573e4de..fd05fdee576a 100644 --- a/arch/powerpc/platforms/pseries/hvCall.S +++ b/arch/powerpc/platforms/pseries/hvCall.S | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/processor.h> | 11 | #include <asm/processor.h> |
12 | #include <asm/ppc_asm.h> | 12 | #include <asm/ppc_asm.h> |
13 | #include <asm/asm-offsets.h> | 13 | #include <asm/asm-offsets.h> |
14 | #include <asm/ptrace.h> | ||
14 | 15 | ||
15 | #define STK_PARM(i) (48 + ((i)-3)*8) | 16 | #define STK_PARM(i) (48 + ((i)-3)*8) |
16 | 17 | ||
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index a77bcaed80af..9fecb313a4c9 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -140,7 +140,7 @@ static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
140 | return ret; | 140 | return ret; |
141 | } | 141 | } |
142 | 142 | ||
143 | static DEFINE_PER_CPU(u64 *, tce_page) = NULL; | 143 | static DEFINE_PER_CPU(u64 *, tce_page); |
144 | 144 | ||
145 | static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | 145 | static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, |
146 | long npages, unsigned long uaddr, | 146 | long npages, unsigned long uaddr, |
@@ -589,13 +589,8 @@ static struct notifier_block iommu_reconfig_nb = { | |||
589 | /* These are called very early. */ | 589 | /* These are called very early. */ |
590 | void iommu_init_early_pSeries(void) | 590 | void iommu_init_early_pSeries(void) |
591 | { | 591 | { |
592 | if (of_chosen && of_get_property(of_chosen, "linux,iommu-off", NULL)) { | 592 | if (of_chosen && of_get_property(of_chosen, "linux,iommu-off", NULL)) |
593 | /* Direct I/O, IOMMU off */ | ||
594 | ppc_md.pci_dma_dev_setup = NULL; | ||
595 | ppc_md.pci_dma_bus_setup = NULL; | ||
596 | set_pci_dma_ops(&dma_direct_ops); | ||
597 | return; | 593 | return; |
598 | } | ||
599 | 594 | ||
600 | if (firmware_has_feature(FW_FEATURE_LPAR)) { | 595 | if (firmware_has_feature(FW_FEATURE_LPAR)) { |
601 | if (firmware_has_feature(FW_FEATURE_MULTITCE)) { | 596 | if (firmware_has_feature(FW_FEATURE_MULTITCE)) { |
@@ -622,3 +617,17 @@ void iommu_init_early_pSeries(void) | |||
622 | set_pci_dma_ops(&dma_iommu_ops); | 617 | set_pci_dma_ops(&dma_iommu_ops); |
623 | } | 618 | } |
624 | 619 | ||
620 | static int __init disable_multitce(char *str) | ||
621 | { | ||
622 | if (strcmp(str, "off") == 0 && | ||
623 | firmware_has_feature(FW_FEATURE_LPAR) && | ||
624 | firmware_has_feature(FW_FEATURE_MULTITCE)) { | ||
625 | printk(KERN_INFO "Disabling MULTITCE firmware feature\n"); | ||
626 | ppc_md.tce_build = tce_build_pSeriesLP; | ||
627 | ppc_md.tce_free = tce_free_pSeriesLP; | ||
628 | powerpc_firmware_features &= ~FW_FEATURE_MULTITCE; | ||
629 | } | ||
630 | return 1; | ||
631 | } | ||
632 | |||
633 | __setup("multitce=", disable_multitce); | ||
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index f129040d974c..5d3ea9f60dd7 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
@@ -627,6 +627,18 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local) | |||
627 | spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); | 627 | spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); |
628 | } | 628 | } |
629 | 629 | ||
630 | static int __init disable_bulk_remove(char *str) | ||
631 | { | ||
632 | if (strcmp(str, "off") == 0 && | ||
633 | firmware_has_feature(FW_FEATURE_BULK_REMOVE)) { | ||
634 | printk(KERN_INFO "Disabling BULK_REMOVE firmware feature"); | ||
635 | powerpc_firmware_features &= ~FW_FEATURE_BULK_REMOVE; | ||
636 | } | ||
637 | return 1; | ||
638 | } | ||
639 | |||
640 | __setup("bulk_remove=", disable_bulk_remove); | ||
641 | |||
630 | void __init hpte_init_lpar(void) | 642 | void __init hpte_init_lpar(void) |
631 | { | 643 | { |
632 | ppc_md.hpte_invalidate = pSeries_lpar_hpte_invalidate; | 644 | ppc_md.hpte_invalidate = pSeries_lpar_hpte_invalidate; |
diff --git a/arch/powerpc/platforms/pseries/pseries_energy.c b/arch/powerpc/platforms/pseries/pseries_energy.c new file mode 100644 index 000000000000..c8b3c69fe891 --- /dev/null +++ b/arch/powerpc/platforms/pseries/pseries_energy.c | |||
@@ -0,0 +1,326 @@ | |||
1 | /* | ||
2 | * POWER platform energy management driver | ||
3 | * Copyright (C) 2010 IBM Corporation | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * version 2 as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This pseries platform device driver provides access to | ||
10 | * platform energy management capabilities. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/seq_file.h> | ||
18 | #include <linux/sysdev.h> | ||
19 | #include <linux/cpu.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <asm/cputhreads.h> | ||
22 | #include <asm/page.h> | ||
23 | #include <asm/hvcall.h> | ||
24 | |||
25 | |||
26 | #define MODULE_VERS "1.0" | ||
27 | #define MODULE_NAME "pseries_energy" | ||
28 | |||
29 | /* Driver flags */ | ||
30 | |||
31 | static int sysfs_entries; | ||
32 | |||
33 | /* Helper routines */ | ||
34 | |||
35 | /* | ||
36 | * Routine to detect firmware support for hcall | ||
37 | * return 1 if H_BEST_ENERGY is supported | ||
38 | * else return 0 | ||
39 | */ | ||
40 | |||
41 | static int check_for_h_best_energy(void) | ||
42 | { | ||
43 | struct device_node *rtas = NULL; | ||
44 | const char *hypertas, *s; | ||
45 | int length; | ||
46 | int rc = 0; | ||
47 | |||
48 | rtas = of_find_node_by_path("/rtas"); | ||
49 | if (!rtas) | ||
50 | return 0; | ||
51 | |||
52 | hypertas = of_get_property(rtas, "ibm,hypertas-functions", &length); | ||
53 | if (!hypertas) { | ||
54 | of_node_put(rtas); | ||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | /* hypertas will have list of strings with hcall names */ | ||
59 | for (s = hypertas; s < hypertas + length; s += strlen(s) + 1) { | ||
60 | if (!strncmp("hcall-best-energy-1", s, 19)) { | ||
61 | rc = 1; /* Found the string */ | ||
62 | break; | ||
63 | } | ||
64 | } | ||
65 | of_node_put(rtas); | ||
66 | return rc; | ||
67 | } | ||
68 | |||
69 | /* Helper Routines to convert between drc_index to cpu numbers */ | ||
70 | |||
71 | static u32 cpu_to_drc_index(int cpu) | ||
72 | { | ||
73 | struct device_node *dn = NULL; | ||
74 | const int *indexes; | ||
75 | int i; | ||
76 | int rc = 1; | ||
77 | u32 ret = 0; | ||
78 | |||
79 | dn = of_find_node_by_path("/cpus"); | ||
80 | if (dn == NULL) | ||
81 | goto err; | ||
82 | indexes = of_get_property(dn, "ibm,drc-indexes", NULL); | ||
83 | if (indexes == NULL) | ||
84 | goto err_of_node_put; | ||
85 | /* Convert logical cpu number to core number */ | ||
86 | i = cpu_core_index_of_thread(cpu); | ||
87 | /* | ||
88 | * The first element indexes[0] is the number of drc_indexes | ||
89 | * returned in the list. Hence i+1 will get the drc_index | ||
90 | * corresponding to core number i. | ||
91 | */ | ||
92 | WARN_ON(i > indexes[0]); | ||
93 | ret = indexes[i + 1]; | ||
94 | rc = 0; | ||
95 | |||
96 | err_of_node_put: | ||
97 | of_node_put(dn); | ||
98 | err: | ||
99 | if (rc) | ||
100 | printk(KERN_WARNING "cpu_to_drc_index(%d) failed", cpu); | ||
101 | return ret; | ||
102 | } | ||
103 | |||
104 | static int drc_index_to_cpu(u32 drc_index) | ||
105 | { | ||
106 | struct device_node *dn = NULL; | ||
107 | const int *indexes; | ||
108 | int i, cpu = 0; | ||
109 | int rc = 1; | ||
110 | |||
111 | dn = of_find_node_by_path("/cpus"); | ||
112 | if (dn == NULL) | ||
113 | goto err; | ||
114 | indexes = of_get_property(dn, "ibm,drc-indexes", NULL); | ||
115 | if (indexes == NULL) | ||
116 | goto err_of_node_put; | ||
117 | /* | ||
118 | * First element in the array is the number of drc_indexes | ||
119 | * returned. Search through the list to find the matching | ||
120 | * drc_index and get the core number | ||
121 | */ | ||
122 | for (i = 0; i < indexes[0]; i++) { | ||
123 | if (indexes[i + 1] == drc_index) | ||
124 | break; | ||
125 | } | ||
126 | /* Convert core number to logical cpu number */ | ||
127 | cpu = cpu_first_thread_of_core(i); | ||
128 | rc = 0; | ||
129 | |||
130 | err_of_node_put: | ||
131 | of_node_put(dn); | ||
132 | err: | ||
133 | if (rc) | ||
134 | printk(KERN_WARNING "drc_index_to_cpu(%d) failed", drc_index); | ||
135 | return cpu; | ||
136 | } | ||
137 | |||
138 | /* | ||
139 | * pseries hypervisor call H_BEST_ENERGY provides hints to OS on | ||
140 | * preferred logical cpus to activate or deactivate for optimized | ||
141 | * energy consumption. | ||
142 | */ | ||
143 | |||
144 | #define FLAGS_MODE1 0x004E200000080E01 | ||
145 | #define FLAGS_MODE2 0x004E200000080401 | ||
146 | #define FLAGS_ACTIVATE 0x100 | ||
147 | |||
148 | static ssize_t get_best_energy_list(char *page, int activate) | ||
149 | { | ||
150 | int rc, cnt, i, cpu; | ||
151 | unsigned long retbuf[PLPAR_HCALL9_BUFSIZE]; | ||
152 | unsigned long flags = 0; | ||
153 | u32 *buf_page; | ||
154 | char *s = page; | ||
155 | |||
156 | buf_page = (u32 *) get_zeroed_page(GFP_KERNEL); | ||
157 | if (!buf_page) | ||
158 | return -ENOMEM; | ||
159 | |||
160 | flags = FLAGS_MODE1; | ||
161 | if (activate) | ||
162 | flags |= FLAGS_ACTIVATE; | ||
163 | |||
164 | rc = plpar_hcall9(H_BEST_ENERGY, retbuf, flags, 0, __pa(buf_page), | ||
165 | 0, 0, 0, 0, 0, 0); | ||
166 | if (rc != H_SUCCESS) { | ||
167 | free_page((unsigned long) buf_page); | ||
168 | return -EINVAL; | ||
169 | } | ||
170 | |||
171 | cnt = retbuf[0]; | ||
172 | for (i = 0; i < cnt; i++) { | ||
173 | cpu = drc_index_to_cpu(buf_page[2*i+1]); | ||
174 | if ((cpu_online(cpu) && !activate) || | ||
175 | (!cpu_online(cpu) && activate)) | ||
176 | s += sprintf(s, "%d,", cpu); | ||
177 | } | ||
178 | if (s > page) { /* Something to show */ | ||
179 | s--; /* Suppress last comma */ | ||
180 | s += sprintf(s, "\n"); | ||
181 | } | ||
182 | |||
183 | free_page((unsigned long) buf_page); | ||
184 | return s-page; | ||
185 | } | ||
186 | |||
187 | static ssize_t get_best_energy_data(struct sys_device *dev, | ||
188 | char *page, int activate) | ||
189 | { | ||
190 | int rc; | ||
191 | unsigned long retbuf[PLPAR_HCALL9_BUFSIZE]; | ||
192 | unsigned long flags = 0; | ||
193 | |||
194 | flags = FLAGS_MODE2; | ||
195 | if (activate) | ||
196 | flags |= FLAGS_ACTIVATE; | ||
197 | |||
198 | rc = plpar_hcall9(H_BEST_ENERGY, retbuf, flags, | ||
199 | cpu_to_drc_index(dev->id), | ||
200 | 0, 0, 0, 0, 0, 0, 0); | ||
201 | |||
202 | if (rc != H_SUCCESS) | ||
203 | return -EINVAL; | ||
204 | |||
205 | return sprintf(page, "%lu\n", retbuf[1] >> 32); | ||
206 | } | ||
207 | |||
208 | /* Wrapper functions */ | ||
209 | |||
210 | static ssize_t cpu_activate_hint_list_show(struct sysdev_class *class, | ||
211 | struct sysdev_class_attribute *attr, char *page) | ||
212 | { | ||
213 | return get_best_energy_list(page, 1); | ||
214 | } | ||
215 | |||
216 | static ssize_t cpu_deactivate_hint_list_show(struct sysdev_class *class, | ||
217 | struct sysdev_class_attribute *attr, char *page) | ||
218 | { | ||
219 | return get_best_energy_list(page, 0); | ||
220 | } | ||
221 | |||
222 | static ssize_t percpu_activate_hint_show(struct sys_device *dev, | ||
223 | struct sysdev_attribute *attr, char *page) | ||
224 | { | ||
225 | return get_best_energy_data(dev, page, 1); | ||
226 | } | ||
227 | |||
228 | static ssize_t percpu_deactivate_hint_show(struct sys_device *dev, | ||
229 | struct sysdev_attribute *attr, char *page) | ||
230 | { | ||
231 | return get_best_energy_data(dev, page, 0); | ||
232 | } | ||
233 | |||
234 | /* | ||
235 | * Create sysfs interface: | ||
236 | * /sys/devices/system/cpu/pseries_activate_hint_list | ||
237 | * /sys/devices/system/cpu/pseries_deactivate_hint_list | ||
238 | * Comma separated list of cpus to activate or deactivate | ||
239 | * /sys/devices/system/cpu/cpuN/pseries_activate_hint | ||
240 | * /sys/devices/system/cpu/cpuN/pseries_deactivate_hint | ||
241 | * Per-cpu value of the hint | ||
242 | */ | ||
243 | |||
244 | struct sysdev_class_attribute attr_cpu_activate_hint_list = | ||
245 | _SYSDEV_CLASS_ATTR(pseries_activate_hint_list, 0444, | ||
246 | cpu_activate_hint_list_show, NULL); | ||
247 | |||
248 | struct sysdev_class_attribute attr_cpu_deactivate_hint_list = | ||
249 | _SYSDEV_CLASS_ATTR(pseries_deactivate_hint_list, 0444, | ||
250 | cpu_deactivate_hint_list_show, NULL); | ||
251 | |||
252 | struct sysdev_attribute attr_percpu_activate_hint = | ||
253 | _SYSDEV_ATTR(pseries_activate_hint, 0444, | ||
254 | percpu_activate_hint_show, NULL); | ||
255 | |||
256 | struct sysdev_attribute attr_percpu_deactivate_hint = | ||
257 | _SYSDEV_ATTR(pseries_deactivate_hint, 0444, | ||
258 | percpu_deactivate_hint_show, NULL); | ||
259 | |||
260 | static int __init pseries_energy_init(void) | ||
261 | { | ||
262 | int cpu, err; | ||
263 | struct sys_device *cpu_sys_dev; | ||
264 | |||
265 | if (!check_for_h_best_energy()) { | ||
266 | printk(KERN_INFO "Hypercall H_BEST_ENERGY not supported\n"); | ||
267 | return 0; | ||
268 | } | ||
269 | /* Create the sysfs files */ | ||
270 | err = sysfs_create_file(&cpu_sysdev_class.kset.kobj, | ||
271 | &attr_cpu_activate_hint_list.attr); | ||
272 | if (!err) | ||
273 | err = sysfs_create_file(&cpu_sysdev_class.kset.kobj, | ||
274 | &attr_cpu_deactivate_hint_list.attr); | ||
275 | |||
276 | if (err) | ||
277 | return err; | ||
278 | for_each_possible_cpu(cpu) { | ||
279 | cpu_sys_dev = get_cpu_sysdev(cpu); | ||
280 | err = sysfs_create_file(&cpu_sys_dev->kobj, | ||
281 | &attr_percpu_activate_hint.attr); | ||
282 | if (err) | ||
283 | break; | ||
284 | err = sysfs_create_file(&cpu_sys_dev->kobj, | ||
285 | &attr_percpu_deactivate_hint.attr); | ||
286 | if (err) | ||
287 | break; | ||
288 | } | ||
289 | |||
290 | if (err) | ||
291 | return err; | ||
292 | |||
293 | sysfs_entries = 1; /* Removed entries on cleanup */ | ||
294 | return 0; | ||
295 | |||
296 | } | ||
297 | |||
298 | static void __exit pseries_energy_cleanup(void) | ||
299 | { | ||
300 | int cpu; | ||
301 | struct sys_device *cpu_sys_dev; | ||
302 | |||
303 | if (!sysfs_entries) | ||
304 | return; | ||
305 | |||
306 | /* Remove the sysfs files */ | ||
307 | sysfs_remove_file(&cpu_sysdev_class.kset.kobj, | ||
308 | &attr_cpu_activate_hint_list.attr); | ||
309 | |||
310 | sysfs_remove_file(&cpu_sysdev_class.kset.kobj, | ||
311 | &attr_cpu_deactivate_hint_list.attr); | ||
312 | |||
313 | for_each_possible_cpu(cpu) { | ||
314 | cpu_sys_dev = get_cpu_sysdev(cpu); | ||
315 | sysfs_remove_file(&cpu_sys_dev->kobj, | ||
316 | &attr_percpu_activate_hint.attr); | ||
317 | sysfs_remove_file(&cpu_sys_dev->kobj, | ||
318 | &attr_percpu_deactivate_hint.attr); | ||
319 | } | ||
320 | } | ||
321 | |||
322 | module_init(pseries_energy_init); | ||
323 | module_exit(pseries_energy_cleanup); | ||
324 | MODULE_DESCRIPTION("Driver for pSeries platform energy management"); | ||
325 | MODULE_AUTHOR("Vaidyanathan Srinivasan"); | ||
326 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 17cf15ec38be..8e9e06a7ca59 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
@@ -312,17 +312,10 @@ static void pci_dma_dev_setup_dart(struct pci_dev *dev) | |||
312 | 312 | ||
313 | static void pci_dma_bus_setup_dart(struct pci_bus *bus) | 313 | static void pci_dma_bus_setup_dart(struct pci_bus *bus) |
314 | { | 314 | { |
315 | struct device_node *dn; | ||
316 | |||
317 | if (!iommu_table_dart_inited) { | 315 | if (!iommu_table_dart_inited) { |
318 | iommu_table_dart_inited = 1; | 316 | iommu_table_dart_inited = 1; |
319 | iommu_table_dart_setup(); | 317 | iommu_table_dart_setup(); |
320 | } | 318 | } |
321 | |||
322 | dn = pci_bus_to_OF_node(bus); | ||
323 | |||
324 | if (dn) | ||
325 | PCI_DN(dn)->iommu_table = &iommu_table_dart; | ||
326 | } | 319 | } |
327 | 320 | ||
328 | static bool dart_device_on_pcie(struct device *dev) | 321 | static bool dart_device_on_pcie(struct device *dev) |
@@ -373,7 +366,7 @@ void __init iommu_init_early_dart(void) | |||
373 | if (dn == NULL) { | 366 | if (dn == NULL) { |
374 | dn = of_find_compatible_node(NULL, "dart", "u4-dart"); | 367 | dn = of_find_compatible_node(NULL, "dart", "u4-dart"); |
375 | if (dn == NULL) | 368 | if (dn == NULL) |
376 | goto bail; | 369 | return; /* use default direct_dma_ops */ |
377 | dart_is_u4 = 1; | 370 | dart_is_u4 = 1; |
378 | } | 371 | } |
379 | 372 | ||
diff --git a/drivers/char/hvc_vio.c b/drivers/char/hvc_vio.c index 27370e99c66f..5e2f52b33327 100644 --- a/drivers/char/hvc_vio.c +++ b/drivers/char/hvc_vio.c | |||
@@ -39,7 +39,7 @@ | |||
39 | 39 | ||
40 | #include "hvc_console.h" | 40 | #include "hvc_console.h" |
41 | 41 | ||
42 | char hvc_driver_name[] = "hvc_console"; | 42 | static const char hvc_driver_name[] = "hvc_console"; |
43 | 43 | ||
44 | static struct vio_device_id hvc_driver_table[] __devinitdata = { | 44 | static struct vio_device_id hvc_driver_table[] __devinitdata = { |
45 | {"serial", "hvterm1"}, | 45 | {"serial", "hvterm1"}, |
diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c index b6e7ddc09d76..4daf9e5a7736 100644 --- a/drivers/macintosh/macio_asic.c +++ b/drivers/macintosh/macio_asic.c | |||
@@ -387,11 +387,10 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, | |||
387 | /* Set the DMA ops to the ones from the PCI device, this could be | 387 | /* Set the DMA ops to the ones from the PCI device, this could be |
388 | * fishy if we didn't know that on PowerMac it's always direct ops | 388 | * fishy if we didn't know that on PowerMac it's always direct ops |
389 | * or iommu ops that will work fine | 389 | * or iommu ops that will work fine |
390 | * | ||
391 | * To get all the fields, copy all archdata | ||
390 | */ | 392 | */ |
391 | dev->ofdev.dev.archdata.dma_ops = | 393 | dev->ofdev.dev.archdata = chip->lbus.pdev->dev.archdata; |
392 | chip->lbus.pdev->dev.archdata.dma_ops; | ||
393 | dev->ofdev.dev.archdata.dma_data = | ||
394 | chip->lbus.pdev->dev.archdata.dma_data; | ||
395 | #endif /* CONFIG_PCI */ | 394 | #endif /* CONFIG_PCI */ |
396 | 395 | ||
397 | #ifdef DEBUG | 396 | #ifdef DEBUG |
diff --git a/drivers/ps3/Makefile b/drivers/ps3/Makefile index ccea15c11c19..50cb1e1b4a12 100644 --- a/drivers/ps3/Makefile +++ b/drivers/ps3/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | obj-$(CONFIG_PS3_VUART) += ps3-vuart.o | 1 | obj-$(CONFIG_PS3_VUART) += ps3-vuart.o |
2 | obj-$(CONFIG_PS3_PS3AV) += ps3av_mod.o | 2 | obj-$(CONFIG_PS3_PS3AV) += ps3av_mod.o |
3 | ps3av_mod-objs += ps3av.o ps3av_cmd.o | 3 | ps3av_mod-y := ps3av.o ps3av_cmd.o |
4 | obj-$(CONFIG_PPC_PS3) += sys-manager-core.o | 4 | obj-$(CONFIG_PPC_PS3) += sys-manager-core.o |
5 | obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o | 5 | obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o |
6 | obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o | 6 | obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 5856167a0c90..7e6ce626b7f1 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -687,7 +687,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
687 | #if defined(CONFIG_ATARI) | 687 | #if defined(CONFIG_ATARI) |
688 | address_space = 64; | 688 | address_space = 64; |
689 | #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \ | 689 | #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \ |
690 | || defined(__sparc__) || defined(__mips__) | 690 | || defined(__sparc__) || defined(__mips__) \ |
691 | || defined(__powerpc__) | ||
691 | address_space = 128; | 692 | address_space = 128; |
692 | #else | 693 | #else |
693 | #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes. | 694 | #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes. |