diff options
Diffstat (limited to 'arch/powerpc')
29 files changed, 116 insertions, 533 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index bd6dd6ed3a9f..fefe7c8bf05f 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -414,7 +414,7 @@ config KEXEC | |||
414 | config CRASH_DUMP | 414 | config CRASH_DUMP |
415 | bool "Build a kdump crash kernel" | 415 | bool "Build a kdump crash kernel" |
416 | depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP) | 416 | depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP) |
417 | select RELOCATABLE if PPC64 || 44x || FSL_BOOKE | 417 | select RELOCATABLE if (PPC64 && !COMPILE_TEST) || 44x || FSL_BOOKE |
418 | help | 418 | help |
419 | Build a kernel suitable for use as a kdump capture kernel. | 419 | Build a kernel suitable for use as a kdump capture kernel. |
420 | The same kernel binary can be used as production kernel and dump | 420 | The same kernel binary can be used as production kernel and dump |
@@ -1017,6 +1017,7 @@ endmenu | |||
1017 | if PPC64 | 1017 | if PPC64 |
1018 | config RELOCATABLE | 1018 | config RELOCATABLE |
1019 | bool "Build a relocatable kernel" | 1019 | bool "Build a relocatable kernel" |
1020 | depends on !COMPILE_TEST | ||
1020 | select NONSTATIC_KERNEL | 1021 | select NONSTATIC_KERNEL |
1021 | help | 1022 | help |
1022 | This builds a kernel image that is capable of running anywhere | 1023 | This builds a kernel image that is capable of running anywhere |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 790352f93700..35d16bd2760b 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -303,7 +303,6 @@ config PPC_EARLY_DEBUG_OPAL_VTERMNO | |||
303 | This correspond to which /dev/hvcN you want to use for early | 303 | This correspond to which /dev/hvcN you want to use for early |
304 | debug. | 304 | debug. |
305 | 305 | ||
306 | On OPAL v1 (takeover) this should always be 0 | ||
307 | On OPAL v2, this will be 0 for network console and 1 or 2 for | 306 | On OPAL v2, this will be 0 for network console and 1 or 2 for |
308 | the machine built-in serial ports. | 307 | the machine built-in serial ports. |
309 | 308 | ||
diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h index 37991e154ef8..840a5509b3f1 100644 --- a/arch/powerpc/include/asm/code-patching.h +++ b/arch/powerpc/include/asm/code-patching.h | |||
@@ -88,4 +88,15 @@ static inline unsigned long ppc_function_entry(void *func) | |||
88 | #endif | 88 | #endif |
89 | } | 89 | } |
90 | 90 | ||
91 | static inline unsigned long ppc_global_function_entry(void *func) | ||
92 | { | ||
93 | #if defined(CONFIG_PPC64) && defined(_CALL_ELF) && _CALL_ELF == 2 | ||
94 | /* PPC64 ABIv2 the global entry point is at the address */ | ||
95 | return (unsigned long)func; | ||
96 | #else | ||
97 | /* All other cases there is no change vs ppc_function_entry() */ | ||
98 | return ppc_function_entry(func); | ||
99 | #endif | ||
100 | } | ||
101 | |||
91 | #endif /* _ASM_POWERPC_CODE_PATCHING_H */ | 102 | #endif /* _ASM_POWERPC_CODE_PATCHING_H */ |
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index f8d1d6dcf7db..e61f24ed4e65 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h | |||
@@ -19,8 +19,7 @@ | |||
19 | #define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) | 19 | #define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) |
20 | #define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) | 20 | #define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) |
21 | #define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) | 21 | #define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) |
22 | #define MMU_FTR_TYPE_3E ASM_CONST(0x00000020) | 22 | #define MMU_FTR_TYPE_47x ASM_CONST(0x00000020) |
23 | #define MMU_FTR_TYPE_47x ASM_CONST(0x00000040) | ||
24 | 23 | ||
25 | /* | 24 | /* |
26 | * This is individual features | 25 | * This is individual features |
@@ -106,13 +105,6 @@ | |||
106 | MMU_FTR_CI_LARGE_PAGE | 105 | MMU_FTR_CI_LARGE_PAGE |
107 | #define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ | 106 | #define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ |
108 | MMU_FTR_CI_LARGE_PAGE | MMU_FTR_NO_SLBIE_B | 107 | MMU_FTR_CI_LARGE_PAGE | MMU_FTR_NO_SLBIE_B |
109 | #define MMU_FTRS_A2 MMU_FTR_TYPE_3E | MMU_FTR_USE_TLBILX | \ | ||
110 | MMU_FTR_USE_TLBIVAX_BCAST | \ | ||
111 | MMU_FTR_LOCK_BCAST_INVAL | \ | ||
112 | MMU_FTR_USE_TLBRSRV | \ | ||
113 | MMU_FTR_USE_PAIRED_MAS | \ | ||
114 | MMU_FTR_TLBIEL | \ | ||
115 | MMU_FTR_16M_PAGE | ||
116 | #ifndef __ASSEMBLY__ | 108 | #ifndef __ASSEMBLY__ |
117 | #include <asm/cputable.h> | 109 | #include <asm/cputable.h> |
118 | 110 | ||
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 460018889ba9..0da1dbd42e02 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -12,27 +12,7 @@ | |||
12 | #ifndef __OPAL_H | 12 | #ifndef __OPAL_H |
13 | #define __OPAL_H | 13 | #define __OPAL_H |
14 | 14 | ||
15 | /****** Takeover interface ********/ | ||
16 | |||
17 | /* PAPR H-Call used to querty the HAL existence and/or instanciate | ||
18 | * it from within pHyp (tech preview only). | ||
19 | * | ||
20 | * This is exclusively used in prom_init.c | ||
21 | */ | ||
22 | |||
23 | #ifndef __ASSEMBLY__ | 15 | #ifndef __ASSEMBLY__ |
24 | |||
25 | struct opal_takeover_args { | ||
26 | u64 k_image; /* r4 */ | ||
27 | u64 k_size; /* r5 */ | ||
28 | u64 k_entry; /* r6 */ | ||
29 | u64 k_entry2; /* r7 */ | ||
30 | u64 hal_addr; /* r8 */ | ||
31 | u64 rd_image; /* r9 */ | ||
32 | u64 rd_size; /* r10 */ | ||
33 | u64 rd_loc; /* r11 */ | ||
34 | }; | ||
35 | |||
36 | /* | 16 | /* |
37 | * SG entry | 17 | * SG entry |
38 | * | 18 | * |
@@ -55,15 +35,6 @@ struct opal_sg_list { | |||
55 | /* We calculate number of sg entries based on PAGE_SIZE */ | 35 | /* We calculate number of sg entries based on PAGE_SIZE */ |
56 | #define SG_ENTRIES_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct opal_sg_entry)) | 36 | #define SG_ENTRIES_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct opal_sg_entry)) |
57 | 37 | ||
58 | extern long opal_query_takeover(u64 *hal_size, u64 *hal_align); | ||
59 | |||
60 | extern long opal_do_takeover(struct opal_takeover_args *args); | ||
61 | |||
62 | struct rtas_args; | ||
63 | extern int opal_enter_rtas(struct rtas_args *args, | ||
64 | unsigned long data, | ||
65 | unsigned long entry); | ||
66 | |||
67 | #endif /* __ASSEMBLY__ */ | 38 | #endif /* __ASSEMBLY__ */ |
68 | 39 | ||
69 | /****** OPAL APIs ******/ | 40 | /****** OPAL APIs ******/ |
diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h index 9ed737146dbb..b3e936027b26 100644 --- a/arch/powerpc/include/asm/perf_event_server.h +++ b/arch/powerpc/include/asm/perf_event_server.h | |||
@@ -61,8 +61,7 @@ struct power_pmu { | |||
61 | #define PPMU_SIAR_VALID 0x00000010 /* Processor has SIAR Valid bit */ | 61 | #define PPMU_SIAR_VALID 0x00000010 /* Processor has SIAR Valid bit */ |
62 | #define PPMU_HAS_SSLOT 0x00000020 /* Has sampled slot in MMCRA */ | 62 | #define PPMU_HAS_SSLOT 0x00000020 /* Has sampled slot in MMCRA */ |
63 | #define PPMU_HAS_SIER 0x00000040 /* Has SIER */ | 63 | #define PPMU_HAS_SIER 0x00000040 /* Has SIER */ |
64 | #define PPMU_BHRB 0x00000080 /* has BHRB feature enabled */ | 64 | #define PPMU_ARCH_207S 0x00000080 /* PMC is architecture v2.07S */ |
65 | #define PPMU_EBB 0x00000100 /* supports event based branch */ | ||
66 | 65 | ||
67 | /* | 66 | /* |
68 | * Values for flags to get_alternatives() | 67 | * Values for flags to get_alternatives() |
diff --git a/arch/powerpc/include/asm/swab.h b/arch/powerpc/include/asm/swab.h index b9bd1ca944d0..96f59de61855 100644 --- a/arch/powerpc/include/asm/swab.h +++ b/arch/powerpc/include/asm/swab.h | |||
@@ -9,10 +9,6 @@ | |||
9 | 9 | ||
10 | #include <uapi/asm/swab.h> | 10 | #include <uapi/asm/swab.h> |
11 | 11 | ||
12 | #ifdef __GNUC__ | ||
13 | #ifndef __powerpc64__ | ||
14 | #endif /* __powerpc64__ */ | ||
15 | |||
16 | static __inline__ __u16 ld_le16(const volatile __u16 *addr) | 12 | static __inline__ __u16 ld_le16(const volatile __u16 *addr) |
17 | { | 13 | { |
18 | __u16 val; | 14 | __u16 val; |
@@ -20,19 +16,12 @@ static __inline__ __u16 ld_le16(const volatile __u16 *addr) | |||
20 | __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); | 16 | __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); |
21 | return val; | 17 | return val; |
22 | } | 18 | } |
23 | #define __arch_swab16p ld_le16 | ||
24 | 19 | ||
25 | static __inline__ void st_le16(volatile __u16 *addr, const __u16 val) | 20 | static __inline__ void st_le16(volatile __u16 *addr, const __u16 val) |
26 | { | 21 | { |
27 | __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); | 22 | __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); |
28 | } | 23 | } |
29 | 24 | ||
30 | static inline void __arch_swab16s(__u16 *addr) | ||
31 | { | ||
32 | st_le16(addr, *addr); | ||
33 | } | ||
34 | #define __arch_swab16s __arch_swab16s | ||
35 | |||
36 | static __inline__ __u32 ld_le32(const volatile __u32 *addr) | 25 | static __inline__ __u32 ld_le32(const volatile __u32 *addr) |
37 | { | 26 | { |
38 | __u32 val; | 27 | __u32 val; |
@@ -40,42 +29,10 @@ static __inline__ __u32 ld_le32(const volatile __u32 *addr) | |||
40 | __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); | 29 | __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); |
41 | return val; | 30 | return val; |
42 | } | 31 | } |
43 | #define __arch_swab32p ld_le32 | ||
44 | 32 | ||
45 | static __inline__ void st_le32(volatile __u32 *addr, const __u32 val) | 33 | static __inline__ void st_le32(volatile __u32 *addr, const __u32 val) |
46 | { | 34 | { |
47 | __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); | 35 | __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); |
48 | } | 36 | } |
49 | 37 | ||
50 | static inline void __arch_swab32s(__u32 *addr) | ||
51 | { | ||
52 | st_le32(addr, *addr); | ||
53 | } | ||
54 | #define __arch_swab32s __arch_swab32s | ||
55 | |||
56 | static inline __attribute_const__ __u16 __arch_swab16(__u16 value) | ||
57 | { | ||
58 | __u16 result; | ||
59 | |||
60 | __asm__("rlwimi %0,%1,8,16,23" | ||
61 | : "=r" (result) | ||
62 | : "r" (value), "0" (value >> 8)); | ||
63 | return result; | ||
64 | } | ||
65 | #define __arch_swab16 __arch_swab16 | ||
66 | |||
67 | static inline __attribute_const__ __u32 __arch_swab32(__u32 value) | ||
68 | { | ||
69 | __u32 result; | ||
70 | |||
71 | __asm__("rlwimi %0,%1,24,16,23\n\t" | ||
72 | "rlwimi %0,%1,8,8,15\n\t" | ||
73 | "rlwimi %0,%1,24,0,7" | ||
74 | : "=r" (result) | ||
75 | : "r" (value), "0" (value >> 24)); | ||
76 | return result; | ||
77 | } | ||
78 | #define __arch_swab32 __arch_swab32 | ||
79 | |||
80 | #endif /* __GNUC__ */ | ||
81 | #endif /* _ASM_POWERPC_SWAB_H */ | 38 | #endif /* _ASM_POWERPC_SWAB_H */ |
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index f202d0731b06..d178834fe508 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
@@ -10,6 +10,8 @@ | |||
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #define pr_fmt(fmt) "ftrace-powerpc: " fmt | ||
14 | |||
13 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
14 | #include <linux/hardirq.h> | 16 | #include <linux/hardirq.h> |
15 | #include <linux/uaccess.h> | 17 | #include <linux/uaccess.h> |
@@ -105,7 +107,7 @@ __ftrace_make_nop(struct module *mod, | |||
105 | struct dyn_ftrace *rec, unsigned long addr) | 107 | struct dyn_ftrace *rec, unsigned long addr) |
106 | { | 108 | { |
107 | unsigned int op; | 109 | unsigned int op; |
108 | unsigned long ptr; | 110 | unsigned long entry, ptr; |
109 | unsigned long ip = rec->ip; | 111 | unsigned long ip = rec->ip; |
110 | void *tramp; | 112 | void *tramp; |
111 | 113 | ||
@@ -115,7 +117,7 @@ __ftrace_make_nop(struct module *mod, | |||
115 | 117 | ||
116 | /* Make sure that that this is still a 24bit jump */ | 118 | /* Make sure that that this is still a 24bit jump */ |
117 | if (!is_bl_op(op)) { | 119 | if (!is_bl_op(op)) { |
118 | printk(KERN_ERR "Not expected bl: opcode is %x\n", op); | 120 | pr_err("Not expected bl: opcode is %x\n", op); |
119 | return -EINVAL; | 121 | return -EINVAL; |
120 | } | 122 | } |
121 | 123 | ||
@@ -125,21 +127,21 @@ __ftrace_make_nop(struct module *mod, | |||
125 | pr_devel("ip:%lx jumps to %p", ip, tramp); | 127 | pr_devel("ip:%lx jumps to %p", ip, tramp); |
126 | 128 | ||
127 | if (!is_module_trampoline(tramp)) { | 129 | if (!is_module_trampoline(tramp)) { |
128 | printk(KERN_ERR "Not a trampoline\n"); | 130 | pr_err("Not a trampoline\n"); |
129 | return -EINVAL; | 131 | return -EINVAL; |
130 | } | 132 | } |
131 | 133 | ||
132 | if (module_trampoline_target(mod, tramp, &ptr)) { | 134 | if (module_trampoline_target(mod, tramp, &ptr)) { |
133 | printk(KERN_ERR "Failed to get trampoline target\n"); | 135 | pr_err("Failed to get trampoline target\n"); |
134 | return -EFAULT; | 136 | return -EFAULT; |
135 | } | 137 | } |
136 | 138 | ||
137 | pr_devel("trampoline target %lx", ptr); | 139 | pr_devel("trampoline target %lx", ptr); |
138 | 140 | ||
141 | entry = ppc_global_function_entry((void *)addr); | ||
139 | /* This should match what was called */ | 142 | /* This should match what was called */ |
140 | if (ptr != ppc_function_entry((void *)addr)) { | 143 | if (ptr != entry) { |
141 | printk(KERN_ERR "addr %lx does not match expected %lx\n", | 144 | pr_err("addr %lx does not match expected %lx\n", ptr, entry); |
142 | ptr, ppc_function_entry((void *)addr)); | ||
143 | return -EINVAL; | 145 | return -EINVAL; |
144 | } | 146 | } |
145 | 147 | ||
@@ -179,7 +181,7 @@ __ftrace_make_nop(struct module *mod, | |||
179 | 181 | ||
180 | /* Make sure that that this is still a 24bit jump */ | 182 | /* Make sure that that this is still a 24bit jump */ |
181 | if (!is_bl_op(op)) { | 183 | if (!is_bl_op(op)) { |
182 | printk(KERN_ERR "Not expected bl: opcode is %x\n", op); | 184 | pr_err("Not expected bl: opcode is %x\n", op); |
183 | return -EINVAL; | 185 | return -EINVAL; |
184 | } | 186 | } |
185 | 187 | ||
@@ -198,7 +200,7 @@ __ftrace_make_nop(struct module *mod, | |||
198 | 200 | ||
199 | /* Find where the trampoline jumps to */ | 201 | /* Find where the trampoline jumps to */ |
200 | if (probe_kernel_read(jmp, (void *)tramp, sizeof(jmp))) { | 202 | if (probe_kernel_read(jmp, (void *)tramp, sizeof(jmp))) { |
201 | printk(KERN_ERR "Failed to read %lx\n", tramp); | 203 | pr_err("Failed to read %lx\n", tramp); |
202 | return -EFAULT; | 204 | return -EFAULT; |
203 | } | 205 | } |
204 | 206 | ||
@@ -209,7 +211,7 @@ __ftrace_make_nop(struct module *mod, | |||
209 | ((jmp[1] & 0xffff0000) != 0x398c0000) || | 211 | ((jmp[1] & 0xffff0000) != 0x398c0000) || |
210 | (jmp[2] != 0x7d8903a6) || | 212 | (jmp[2] != 0x7d8903a6) || |
211 | (jmp[3] != 0x4e800420)) { | 213 | (jmp[3] != 0x4e800420)) { |
212 | printk(KERN_ERR "Not a trampoline\n"); | 214 | pr_err("Not a trampoline\n"); |
213 | return -EINVAL; | 215 | return -EINVAL; |
214 | } | 216 | } |
215 | 217 | ||
@@ -221,8 +223,7 @@ __ftrace_make_nop(struct module *mod, | |||
221 | pr_devel(" %lx ", tramp); | 223 | pr_devel(" %lx ", tramp); |
222 | 224 | ||
223 | if (tramp != addr) { | 225 | if (tramp != addr) { |
224 | printk(KERN_ERR | 226 | pr_err("Trampoline location %08lx does not match addr\n", |
225 | "Trampoline location %08lx does not match addr\n", | ||
226 | tramp); | 227 | tramp); |
227 | return -EINVAL; | 228 | return -EINVAL; |
228 | } | 229 | } |
@@ -263,15 +264,13 @@ int ftrace_make_nop(struct module *mod, | |||
263 | */ | 264 | */ |
264 | if (!rec->arch.mod) { | 265 | if (!rec->arch.mod) { |
265 | if (!mod) { | 266 | if (!mod) { |
266 | printk(KERN_ERR "No module loaded addr=%lx\n", | 267 | pr_err("No module loaded addr=%lx\n", addr); |
267 | addr); | ||
268 | return -EFAULT; | 268 | return -EFAULT; |
269 | } | 269 | } |
270 | rec->arch.mod = mod; | 270 | rec->arch.mod = mod; |
271 | } else if (mod) { | 271 | } else if (mod) { |
272 | if (mod != rec->arch.mod) { | 272 | if (mod != rec->arch.mod) { |
273 | printk(KERN_ERR | 273 | pr_err("Record mod %p not equal to passed in mod %p\n", |
274 | "Record mod %p not equal to passed in mod %p\n", | ||
275 | rec->arch.mod, mod); | 274 | rec->arch.mod, mod); |
276 | return -EINVAL; | 275 | return -EINVAL; |
277 | } | 276 | } |
@@ -307,26 +306,25 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | |||
307 | * The load offset is different depending on the ABI. For simplicity | 306 | * The load offset is different depending on the ABI. For simplicity |
308 | * just mask it out when doing the compare. | 307 | * just mask it out when doing the compare. |
309 | */ | 308 | */ |
310 | if ((op[0] != 0x48000008) || ((op[1] & 0xffff00000) != 0xe8410000)) { | 309 | if ((op[0] != 0x48000008) || ((op[1] & 0xffff0000) != 0xe8410000)) { |
311 | printk(KERN_ERR "Unexpected call sequence: %x %x\n", | 310 | pr_err("Unexpected call sequence: %x %x\n", op[0], op[1]); |
312 | op[0], op[1]); | ||
313 | return -EINVAL; | 311 | return -EINVAL; |
314 | } | 312 | } |
315 | 313 | ||
316 | /* If we never set up a trampoline to ftrace_caller, then bail */ | 314 | /* If we never set up a trampoline to ftrace_caller, then bail */ |
317 | if (!rec->arch.mod->arch.tramp) { | 315 | if (!rec->arch.mod->arch.tramp) { |
318 | printk(KERN_ERR "No ftrace trampoline\n"); | 316 | pr_err("No ftrace trampoline\n"); |
319 | return -EINVAL; | 317 | return -EINVAL; |
320 | } | 318 | } |
321 | 319 | ||
322 | /* Ensure branch is within 24 bits */ | 320 | /* Ensure branch is within 24 bits */ |
323 | if (create_branch(ip, rec->arch.mod->arch.tramp, BRANCH_SET_LINK)) { | 321 | if (!create_branch(ip, rec->arch.mod->arch.tramp, BRANCH_SET_LINK)) { |
324 | printk(KERN_ERR "Branch out of range"); | 322 | pr_err("Branch out of range\n"); |
325 | return -EINVAL; | 323 | return -EINVAL; |
326 | } | 324 | } |
327 | 325 | ||
328 | if (patch_branch(ip, rec->arch.mod->arch.tramp, BRANCH_SET_LINK)) { | 326 | if (patch_branch(ip, rec->arch.mod->arch.tramp, BRANCH_SET_LINK)) { |
329 | printk(KERN_ERR "REL24 out of range!\n"); | 327 | pr_err("REL24 out of range!\n"); |
330 | return -EINVAL; | 328 | return -EINVAL; |
331 | } | 329 | } |
332 | 330 | ||
@@ -345,13 +343,13 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | |||
345 | 343 | ||
346 | /* It should be pointing to a nop */ | 344 | /* It should be pointing to a nop */ |
347 | if (op != PPC_INST_NOP) { | 345 | if (op != PPC_INST_NOP) { |
348 | printk(KERN_ERR "Expected NOP but have %x\n", op); | 346 | pr_err("Expected NOP but have %x\n", op); |
349 | return -EINVAL; | 347 | return -EINVAL; |
350 | } | 348 | } |
351 | 349 | ||
352 | /* If we never set up a trampoline to ftrace_caller, then bail */ | 350 | /* If we never set up a trampoline to ftrace_caller, then bail */ |
353 | if (!rec->arch.mod->arch.tramp) { | 351 | if (!rec->arch.mod->arch.tramp) { |
354 | printk(KERN_ERR "No ftrace trampoline\n"); | 352 | pr_err("No ftrace trampoline\n"); |
355 | return -EINVAL; | 353 | return -EINVAL; |
356 | } | 354 | } |
357 | 355 | ||
@@ -359,7 +357,7 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | |||
359 | op = create_branch((unsigned int *)ip, | 357 | op = create_branch((unsigned int *)ip, |
360 | rec->arch.mod->arch.tramp, BRANCH_SET_LINK); | 358 | rec->arch.mod->arch.tramp, BRANCH_SET_LINK); |
361 | if (!op) { | 359 | if (!op) { |
362 | printk(KERN_ERR "REL24 out of range!\n"); | 360 | pr_err("REL24 out of range!\n"); |
363 | return -EINVAL; | 361 | return -EINVAL; |
364 | } | 362 | } |
365 | 363 | ||
@@ -397,7 +395,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | |||
397 | * already have a module defined. | 395 | * already have a module defined. |
398 | */ | 396 | */ |
399 | if (!rec->arch.mod) { | 397 | if (!rec->arch.mod) { |
400 | printk(KERN_ERR "No module loaded\n"); | 398 | pr_err("No module loaded\n"); |
401 | return -EINVAL; | 399 | return -EINVAL; |
402 | } | 400 | } |
403 | 401 | ||
diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S index 2480256272d4..5cf3d367190d 100644 --- a/arch/powerpc/kernel/idle_power7.S +++ b/arch/powerpc/kernel/idle_power7.S | |||
@@ -131,7 +131,7 @@ _GLOBAL(power7_nap) | |||
131 | 131 | ||
132 | _GLOBAL(power7_sleep) | 132 | _GLOBAL(power7_sleep) |
133 | li r3,1 | 133 | li r3,1 |
134 | li r4,0 | 134 | li r4,1 |
135 | b power7_powersave_common | 135 | b power7_powersave_common |
136 | /* No return */ | 136 | /* No return */ |
137 | 137 | ||
diff --git a/arch/powerpc/kernel/iomap.c b/arch/powerpc/kernel/iomap.c index b82227e7e21b..12e48d56f771 100644 --- a/arch/powerpc/kernel/iomap.c +++ b/arch/powerpc/kernel/iomap.c | |||
@@ -23,7 +23,7 @@ unsigned int ioread16(void __iomem *addr) | |||
23 | } | 23 | } |
24 | unsigned int ioread16be(void __iomem *addr) | 24 | unsigned int ioread16be(void __iomem *addr) |
25 | { | 25 | { |
26 | return in_be16(addr); | 26 | return readw_be(addr); |
27 | } | 27 | } |
28 | unsigned int ioread32(void __iomem *addr) | 28 | unsigned int ioread32(void __iomem *addr) |
29 | { | 29 | { |
@@ -31,7 +31,7 @@ unsigned int ioread32(void __iomem *addr) | |||
31 | } | 31 | } |
32 | unsigned int ioread32be(void __iomem *addr) | 32 | unsigned int ioread32be(void __iomem *addr) |
33 | { | 33 | { |
34 | return in_be32(addr); | 34 | return readl_be(addr); |
35 | } | 35 | } |
36 | EXPORT_SYMBOL(ioread8); | 36 | EXPORT_SYMBOL(ioread8); |
37 | EXPORT_SYMBOL(ioread16); | 37 | EXPORT_SYMBOL(ioread16); |
@@ -49,7 +49,7 @@ void iowrite16(u16 val, void __iomem *addr) | |||
49 | } | 49 | } |
50 | void iowrite16be(u16 val, void __iomem *addr) | 50 | void iowrite16be(u16 val, void __iomem *addr) |
51 | { | 51 | { |
52 | out_be16(addr, val); | 52 | writew_be(val, addr); |
53 | } | 53 | } |
54 | void iowrite32(u32 val, void __iomem *addr) | 54 | void iowrite32(u32 val, void __iomem *addr) |
55 | { | 55 | { |
@@ -57,7 +57,7 @@ void iowrite32(u32 val, void __iomem *addr) | |||
57 | } | 57 | } |
58 | void iowrite32be(u32 val, void __iomem *addr) | 58 | void iowrite32be(u32 val, void __iomem *addr) |
59 | { | 59 | { |
60 | out_be32(addr, val); | 60 | writel_be(val, addr); |
61 | } | 61 | } |
62 | EXPORT_SYMBOL(iowrite8); | 62 | EXPORT_SYMBOL(iowrite8); |
63 | EXPORT_SYMBOL(iowrite16); | 63 | EXPORT_SYMBOL(iowrite16); |
@@ -75,15 +75,15 @@ EXPORT_SYMBOL(iowrite32be); | |||
75 | */ | 75 | */ |
76 | void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) | 76 | void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) |
77 | { | 77 | { |
78 | _insb((u8 __iomem *) addr, dst, count); | 78 | readsb(addr, dst, count); |
79 | } | 79 | } |
80 | void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) | 80 | void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) |
81 | { | 81 | { |
82 | _insw_ns((u16 __iomem *) addr, dst, count); | 82 | readsw(addr, dst, count); |
83 | } | 83 | } |
84 | void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) | 84 | void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) |
85 | { | 85 | { |
86 | _insl_ns((u32 __iomem *) addr, dst, count); | 86 | readsl(addr, dst, count); |
87 | } | 87 | } |
88 | EXPORT_SYMBOL(ioread8_rep); | 88 | EXPORT_SYMBOL(ioread8_rep); |
89 | EXPORT_SYMBOL(ioread16_rep); | 89 | EXPORT_SYMBOL(ioread16_rep); |
@@ -91,15 +91,15 @@ EXPORT_SYMBOL(ioread32_rep); | |||
91 | 91 | ||
92 | void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) | 92 | void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) |
93 | { | 93 | { |
94 | _outsb((u8 __iomem *) addr, src, count); | 94 | writesb(addr, src, count); |
95 | } | 95 | } |
96 | void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) | 96 | void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) |
97 | { | 97 | { |
98 | _outsw_ns((u16 __iomem *) addr, src, count); | 98 | writesw(addr, src, count); |
99 | } | 99 | } |
100 | void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) | 100 | void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) |
101 | { | 101 | { |
102 | _outsl_ns((u32 __iomem *) addr, src, count); | 102 | writesl(addr, src, count); |
103 | } | 103 | } |
104 | EXPORT_SYMBOL(iowrite8_rep); | 104 | EXPORT_SYMBOL(iowrite8_rep); |
105 | EXPORT_SYMBOL(iowrite16_rep); | 105 | EXPORT_SYMBOL(iowrite16_rep); |
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index 90fab64d911d..2f72af82513c 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/kdebug.h> | 33 | #include <linux/kdebug.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <asm/code-patching.h> | ||
35 | #include <asm/cacheflush.h> | 36 | #include <asm/cacheflush.h> |
36 | #include <asm/sstep.h> | 37 | #include <asm/sstep.h> |
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
@@ -491,12 +492,10 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
491 | return ret; | 492 | return ret; |
492 | } | 493 | } |
493 | 494 | ||
494 | #ifdef CONFIG_PPC64 | ||
495 | unsigned long arch_deref_entry_point(void *entry) | 495 | unsigned long arch_deref_entry_point(void *entry) |
496 | { | 496 | { |
497 | return ((func_descr_t *)entry)->entry; | 497 | return ppc_global_function_entry(entry); |
498 | } | 498 | } |
499 | #endif | ||
500 | 499 | ||
501 | int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | 500 | int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) |
502 | { | 501 | { |
@@ -508,8 +507,12 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
508 | /* setup return addr to the jprobe handler routine */ | 507 | /* setup return addr to the jprobe handler routine */ |
509 | regs->nip = arch_deref_entry_point(jp->entry); | 508 | regs->nip = arch_deref_entry_point(jp->entry); |
510 | #ifdef CONFIG_PPC64 | 509 | #ifdef CONFIG_PPC64 |
510 | #if defined(_CALL_ELF) && _CALL_ELF == 2 | ||
511 | regs->gpr[12] = (unsigned long)jp->entry; | ||
512 | #else | ||
511 | regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc); | 513 | regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc); |
512 | #endif | 514 | #endif |
515 | #endif | ||
513 | 516 | ||
514 | return 1; | 517 | return 1; |
515 | } | 518 | } |
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 077d2ce6c5a7..d807ee626af9 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -315,8 +315,17 @@ static void dedotify_versions(struct modversion_info *vers, | |||
315 | struct modversion_info *end; | 315 | struct modversion_info *end; |
316 | 316 | ||
317 | for (end = (void *)vers + size; vers < end; vers++) | 317 | for (end = (void *)vers + size; vers < end; vers++) |
318 | if (vers->name[0] == '.') | 318 | if (vers->name[0] == '.') { |
319 | memmove(vers->name, vers->name+1, strlen(vers->name)); | 319 | memmove(vers->name, vers->name+1, strlen(vers->name)); |
320 | #ifdef ARCH_RELOCATES_KCRCTAB | ||
321 | /* The TOC symbol has no CRC computed. To avoid CRC | ||
322 | * check failing, we must force it to the expected | ||
323 | * value (see CRC check in module.c). | ||
324 | */ | ||
325 | if (!strcmp(vers->name, "TOC.")) | ||
326 | vers->crc = -(unsigned long)reloc_start; | ||
327 | #endif | ||
328 | } | ||
320 | } | 329 | } |
321 | 330 | ||
322 | /* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */ | 331 | /* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */ |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 613a860a203c..b694b0730971 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -662,13 +662,6 @@ void __init early_init_devtree(void *params) | |||
662 | of_scan_flat_dt(early_init_dt_scan_fw_dump, NULL); | 662 | of_scan_flat_dt(early_init_dt_scan_fw_dump, NULL); |
663 | #endif | 663 | #endif |
664 | 664 | ||
665 | /* Pre-initialize the cmd_line with the content of boot_commmand_line, | ||
666 | * which will be empty except when the content of the variable has | ||
667 | * been overriden by a bootloading mechanism. This happens typically | ||
668 | * with HAL takeover | ||
669 | */ | ||
670 | strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); | ||
671 | |||
672 | /* Retrieve various informations from the /chosen node of the | 665 | /* Retrieve various informations from the /chosen node of the |
673 | * device-tree, including the platform type, initrd location and | 666 | * device-tree, including the platform type, initrd location and |
674 | * size, TCE reserve, and more ... | 667 | * size, TCE reserve, and more ... |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 078145acf7fb..1a85d8f96739 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -1268,201 +1268,6 @@ static u64 __initdata prom_opal_base; | |||
1268 | static u64 __initdata prom_opal_entry; | 1268 | static u64 __initdata prom_opal_entry; |
1269 | #endif | 1269 | #endif |
1270 | 1270 | ||
1271 | #ifdef __BIG_ENDIAN__ | ||
1272 | /* XXX Don't change this structure without updating opal-takeover.S */ | ||
1273 | static struct opal_secondary_data { | ||
1274 | s64 ack; /* 0 */ | ||
1275 | u64 go; /* 8 */ | ||
1276 | struct opal_takeover_args args; /* 16 */ | ||
1277 | } opal_secondary_data; | ||
1278 | |||
1279 | static u64 __initdata prom_opal_align; | ||
1280 | static u64 __initdata prom_opal_size; | ||
1281 | static int __initdata prom_rtas_start_cpu; | ||
1282 | static u64 __initdata prom_rtas_data; | ||
1283 | static u64 __initdata prom_rtas_entry; | ||
1284 | |||
1285 | extern char opal_secondary_entry; | ||
1286 | |||
1287 | static void __init prom_query_opal(void) | ||
1288 | { | ||
1289 | long rc; | ||
1290 | |||
1291 | /* We must not query for OPAL presence on a machine that | ||
1292 | * supports TNK takeover (970 blades), as this uses the same | ||
1293 | * h-call with different arguments and will crash | ||
1294 | */ | ||
1295 | if (PHANDLE_VALID(call_prom("finddevice", 1, 1, | ||
1296 | ADDR("/tnk-memory-map")))) { | ||
1297 | prom_printf("TNK takeover detected, skipping OPAL check\n"); | ||
1298 | return; | ||
1299 | } | ||
1300 | |||
1301 | prom_printf("Querying for OPAL presence... "); | ||
1302 | |||
1303 | rc = opal_query_takeover(&prom_opal_size, | ||
1304 | &prom_opal_align); | ||
1305 | prom_debug("(rc = %ld) ", rc); | ||
1306 | if (rc != 0) { | ||
1307 | prom_printf("not there.\n"); | ||
1308 | return; | ||
1309 | } | ||
1310 | of_platform = PLATFORM_OPAL; | ||
1311 | prom_printf(" there !\n"); | ||
1312 | prom_debug(" opal_size = 0x%lx\n", prom_opal_size); | ||
1313 | prom_debug(" opal_align = 0x%lx\n", prom_opal_align); | ||
1314 | if (prom_opal_align < 0x10000) | ||
1315 | prom_opal_align = 0x10000; | ||
1316 | } | ||
1317 | |||
1318 | static int __init prom_rtas_call(int token, int nargs, int nret, | ||
1319 | int *outputs, ...) | ||
1320 | { | ||
1321 | struct rtas_args rtas_args; | ||
1322 | va_list list; | ||
1323 | int i; | ||
1324 | |||
1325 | rtas_args.token = token; | ||
1326 | rtas_args.nargs = nargs; | ||
1327 | rtas_args.nret = nret; | ||
1328 | rtas_args.rets = (rtas_arg_t *)&(rtas_args.args[nargs]); | ||
1329 | va_start(list, outputs); | ||
1330 | for (i = 0; i < nargs; ++i) | ||
1331 | rtas_args.args[i] = va_arg(list, rtas_arg_t); | ||
1332 | va_end(list); | ||
1333 | |||
1334 | for (i = 0; i < nret; ++i) | ||
1335 | rtas_args.rets[i] = 0; | ||
1336 | |||
1337 | opal_enter_rtas(&rtas_args, prom_rtas_data, | ||
1338 | prom_rtas_entry); | ||
1339 | |||
1340 | if (nret > 1 && outputs != NULL) | ||
1341 | for (i = 0; i < nret-1; ++i) | ||
1342 | outputs[i] = rtas_args.rets[i+1]; | ||
1343 | return (nret > 0)? rtas_args.rets[0]: 0; | ||
1344 | } | ||
1345 | |||
1346 | static void __init prom_opal_hold_cpus(void) | ||
1347 | { | ||
1348 | int i, cnt, cpu, rc; | ||
1349 | long j; | ||
1350 | phandle node; | ||
1351 | char type[64]; | ||
1352 | u32 servers[8]; | ||
1353 | void *entry = (unsigned long *)&opal_secondary_entry; | ||
1354 | struct opal_secondary_data *data = &opal_secondary_data; | ||
1355 | |||
1356 | prom_debug("prom_opal_hold_cpus: start...\n"); | ||
1357 | prom_debug(" - entry = 0x%x\n", entry); | ||
1358 | prom_debug(" - data = 0x%x\n", data); | ||
1359 | |||
1360 | data->ack = -1; | ||
1361 | data->go = 0; | ||
1362 | |||
1363 | /* look for cpus */ | ||
1364 | for (node = 0; prom_next_node(&node); ) { | ||
1365 | type[0] = 0; | ||
1366 | prom_getprop(node, "device_type", type, sizeof(type)); | ||
1367 | if (strcmp(type, "cpu") != 0) | ||
1368 | continue; | ||
1369 | |||
1370 | /* Skip non-configured cpus. */ | ||
1371 | if (prom_getprop(node, "status", type, sizeof(type)) > 0) | ||
1372 | if (strcmp(type, "okay") != 0) | ||
1373 | continue; | ||
1374 | |||
1375 | cnt = prom_getprop(node, "ibm,ppc-interrupt-server#s", servers, | ||
1376 | sizeof(servers)); | ||
1377 | if (cnt == PROM_ERROR) | ||
1378 | break; | ||
1379 | cnt >>= 2; | ||
1380 | for (i = 0; i < cnt; i++) { | ||
1381 | cpu = servers[i]; | ||
1382 | prom_debug("CPU %d ... ", cpu); | ||
1383 | if (cpu == prom.cpu) { | ||
1384 | prom_debug("booted !\n"); | ||
1385 | continue; | ||
1386 | } | ||
1387 | prom_debug("starting ... "); | ||
1388 | |||
1389 | /* Init the acknowledge var which will be reset by | ||
1390 | * the secondary cpu when it awakens from its OF | ||
1391 | * spinloop. | ||
1392 | */ | ||
1393 | data->ack = -1; | ||
1394 | rc = prom_rtas_call(prom_rtas_start_cpu, 3, 1, | ||
1395 | NULL, cpu, entry, data); | ||
1396 | prom_debug("rtas rc=%d ...", rc); | ||
1397 | |||
1398 | for (j = 0; j < 100000000 && data->ack == -1; j++) { | ||
1399 | HMT_low(); | ||
1400 | mb(); | ||
1401 | } | ||
1402 | HMT_medium(); | ||
1403 | if (data->ack != -1) | ||
1404 | prom_debug("done, PIR=0x%x\n", data->ack); | ||
1405 | else | ||
1406 | prom_debug("timeout !\n"); | ||
1407 | } | ||
1408 | } | ||
1409 | prom_debug("prom_opal_hold_cpus: end...\n"); | ||
1410 | } | ||
1411 | |||
1412 | static void __init prom_opal_takeover(void) | ||
1413 | { | ||
1414 | struct opal_secondary_data *data = &opal_secondary_data; | ||
1415 | struct opal_takeover_args *args = &data->args; | ||
1416 | u64 align = prom_opal_align; | ||
1417 | u64 top_addr, opal_addr; | ||
1418 | |||
1419 | args->k_image = (u64)_stext; | ||
1420 | args->k_size = _end - _stext; | ||
1421 | args->k_entry = 0; | ||
1422 | args->k_entry2 = 0x60; | ||
1423 | |||
1424 | top_addr = _ALIGN_UP(args->k_size, align); | ||
1425 | |||
1426 | if (prom_initrd_start != 0) { | ||
1427 | args->rd_image = prom_initrd_start; | ||
1428 | args->rd_size = prom_initrd_end - args->rd_image; | ||
1429 | args->rd_loc = top_addr; | ||
1430 | top_addr = _ALIGN_UP(args->rd_loc + args->rd_size, align); | ||
1431 | } | ||
1432 | |||
1433 | /* Pickup an address for the HAL. We want to go really high | ||
1434 | * up to avoid problem with future kexecs. On the other hand | ||
1435 | * we don't want to be all over the TCEs on P5IOC2 machines | ||
1436 | * which are going to be up there too. We assume the machine | ||
1437 | * has plenty of memory, and we ask for the HAL for now to | ||
1438 | * be just below the 1G point, or above the initrd | ||
1439 | */ | ||
1440 | opal_addr = _ALIGN_DOWN(0x40000000 - prom_opal_size, align); | ||
1441 | if (opal_addr < top_addr) | ||
1442 | opal_addr = top_addr; | ||
1443 | args->hal_addr = opal_addr; | ||
1444 | |||
1445 | /* Copy the command line to the kernel image */ | ||
1446 | strlcpy(boot_command_line, prom_cmd_line, | ||
1447 | COMMAND_LINE_SIZE); | ||
1448 | |||
1449 | prom_debug(" k_image = 0x%lx\n", args->k_image); | ||
1450 | prom_debug(" k_size = 0x%lx\n", args->k_size); | ||
1451 | prom_debug(" k_entry = 0x%lx\n", args->k_entry); | ||
1452 | prom_debug(" k_entry2 = 0x%lx\n", args->k_entry2); | ||
1453 | prom_debug(" hal_addr = 0x%lx\n", args->hal_addr); | ||
1454 | prom_debug(" rd_image = 0x%lx\n", args->rd_image); | ||
1455 | prom_debug(" rd_size = 0x%lx\n", args->rd_size); | ||
1456 | prom_debug(" rd_loc = 0x%lx\n", args->rd_loc); | ||
1457 | prom_printf("Performing OPAL takeover,this can take a few minutes..\n"); | ||
1458 | prom_close_stdin(); | ||
1459 | mb(); | ||
1460 | data->go = 1; | ||
1461 | for (;;) | ||
1462 | opal_do_takeover(args); | ||
1463 | } | ||
1464 | #endif /* __BIG_ENDIAN__ */ | ||
1465 | |||
1466 | /* | 1271 | /* |
1467 | * Allocate room for and instantiate OPAL | 1272 | * Allocate room for and instantiate OPAL |
1468 | */ | 1273 | */ |
@@ -1597,12 +1402,6 @@ static void __init prom_instantiate_rtas(void) | |||
1597 | &val, sizeof(val)) != PROM_ERROR) | 1402 | &val, sizeof(val)) != PROM_ERROR) |
1598 | rtas_has_query_cpu_stopped = true; | 1403 | rtas_has_query_cpu_stopped = true; |
1599 | 1404 | ||
1600 | #if defined(CONFIG_PPC_POWERNV) && defined(__BIG_ENDIAN__) | ||
1601 | /* PowerVN takeover hack */ | ||
1602 | prom_rtas_data = base; | ||
1603 | prom_rtas_entry = entry; | ||
1604 | prom_getprop(rtas_node, "start-cpu", &prom_rtas_start_cpu, 4); | ||
1605 | #endif | ||
1606 | prom_debug("rtas base = 0x%x\n", base); | 1405 | prom_debug("rtas base = 0x%x\n", base); |
1607 | prom_debug("rtas entry = 0x%x\n", entry); | 1406 | prom_debug("rtas entry = 0x%x\n", entry); |
1608 | prom_debug("rtas size = 0x%x\n", (long)size); | 1407 | prom_debug("rtas size = 0x%x\n", (long)size); |
@@ -3027,16 +2826,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
3027 | prom_instantiate_rtas(); | 2826 | prom_instantiate_rtas(); |
3028 | 2827 | ||
3029 | #ifdef CONFIG_PPC_POWERNV | 2828 | #ifdef CONFIG_PPC_POWERNV |
3030 | #ifdef __BIG_ENDIAN__ | ||
3031 | /* Detect HAL and try instanciating it & doing takeover */ | ||
3032 | if (of_platform == PLATFORM_PSERIES_LPAR) { | ||
3033 | prom_query_opal(); | ||
3034 | if (of_platform == PLATFORM_OPAL) { | ||
3035 | prom_opal_hold_cpus(); | ||
3036 | prom_opal_takeover(); | ||
3037 | } | ||
3038 | } else | ||
3039 | #endif /* __BIG_ENDIAN__ */ | ||
3040 | if (of_platform == PLATFORM_OPAL) | 2829 | if (of_platform == PLATFORM_OPAL) |
3041 | prom_instantiate_opal(); | 2830 | prom_instantiate_opal(); |
3042 | #endif /* CONFIG_PPC_POWERNV */ | 2831 | #endif /* CONFIG_PPC_POWERNV */ |
diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh index 77aa1e95e904..fe8e54b9ef7d 100644 --- a/arch/powerpc/kernel/prom_init_check.sh +++ b/arch/powerpc/kernel/prom_init_check.sh | |||
@@ -21,9 +21,7 @@ _end enter_prom memcpy memset reloc_offset __secondary_hold | |||
21 | __secondary_hold_acknowledge __secondary_hold_spinloop __start | 21 | __secondary_hold_acknowledge __secondary_hold_spinloop __start |
22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 | 22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 |
23 | reloc_got2 kernstart_addr memstart_addr linux_banner _stext | 23 | reloc_got2 kernstart_addr memstart_addr linux_banner _stext |
24 | opal_query_takeover opal_do_takeover opal_enter_rtas opal_secondary_entry | 24 | __prom_init_toc_start __prom_init_toc_end btext_setup_display TOC." |
25 | boot_command_line __prom_init_toc_start __prom_init_toc_end | ||
26 | btext_setup_display TOC." | ||
27 | 25 | ||
28 | NM="$1" | 26 | NM="$1" |
29 | OBJ="$2" | 27 | OBJ="$2" |
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index e239df3768ac..e5b022c55ccd 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -469,9 +469,17 @@ void __init smp_setup_cpu_maps(void) | |||
469 | } | 469 | } |
470 | 470 | ||
471 | for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { | 471 | for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { |
472 | bool avail; | ||
473 | |||
472 | DBG(" thread %d -> cpu %d (hard id %d)\n", | 474 | DBG(" thread %d -> cpu %d (hard id %d)\n", |
473 | j, cpu, be32_to_cpu(intserv[j])); | 475 | j, cpu, be32_to_cpu(intserv[j])); |
474 | set_cpu_present(cpu, of_device_is_available(dn)); | 476 | |
477 | avail = of_device_is_available(dn); | ||
478 | if (!avail) | ||
479 | avail = !of_property_match_string(dn, | ||
480 | "enable-method", "spin-table"); | ||
481 | |||
482 | set_cpu_present(cpu, avail); | ||
475 | set_hard_smp_processor_id(cpu, be32_to_cpu(intserv[j])); | 483 | set_hard_smp_processor_id(cpu, be32_to_cpu(intserv[j])); |
476 | set_cpu_possible(cpu, true); | 484 | set_cpu_possible(cpu, true); |
477 | cpu++; | 485 | cpu++; |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 4e47db686b5d..1bc5a1755ed4 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -54,7 +54,6 @@ | |||
54 | 54 | ||
55 | #include "signal.h" | 55 | #include "signal.h" |
56 | 56 | ||
57 | #undef DEBUG_SIG | ||
58 | 57 | ||
59 | #ifdef CONFIG_PPC64 | 58 | #ifdef CONFIG_PPC64 |
60 | #define sys_rt_sigreturn compat_sys_rt_sigreturn | 59 | #define sys_rt_sigreturn compat_sys_rt_sigreturn |
@@ -1063,10 +1062,6 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1063 | return 1; | 1062 | return 1; |
1064 | 1063 | ||
1065 | badframe: | 1064 | badframe: |
1066 | #ifdef DEBUG_SIG | ||
1067 | printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n", | ||
1068 | regs, frame, newsp); | ||
1069 | #endif | ||
1070 | if (show_unhandled_signals) | 1065 | if (show_unhandled_signals) |
1071 | printk_ratelimited(KERN_INFO | 1066 | printk_ratelimited(KERN_INFO |
1072 | "%s[%d]: bad frame in handle_rt_signal32: " | 1067 | "%s[%d]: bad frame in handle_rt_signal32: " |
@@ -1484,10 +1479,6 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1484 | return 1; | 1479 | return 1; |
1485 | 1480 | ||
1486 | badframe: | 1481 | badframe: |
1487 | #ifdef DEBUG_SIG | ||
1488 | printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n", | ||
1489 | regs, frame, newsp); | ||
1490 | #endif | ||
1491 | if (show_unhandled_signals) | 1482 | if (show_unhandled_signals) |
1492 | printk_ratelimited(KERN_INFO | 1483 | printk_ratelimited(KERN_INFO |
1493 | "%s[%d]: bad frame in handle_signal32: " | 1484 | "%s[%d]: bad frame in handle_signal32: " |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index d501dc4dc3e6..97c1e4b683fc 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -38,7 +38,6 @@ | |||
38 | 38 | ||
39 | #include "signal.h" | 39 | #include "signal.h" |
40 | 40 | ||
41 | #define DEBUG_SIG 0 | ||
42 | 41 | ||
43 | #define GP_REGS_SIZE min(sizeof(elf_gregset_t), sizeof(struct pt_regs)) | 42 | #define GP_REGS_SIZE min(sizeof(elf_gregset_t), sizeof(struct pt_regs)) |
44 | #define FP_REGS_SIZE sizeof(elf_fpregset_t) | 43 | #define FP_REGS_SIZE sizeof(elf_fpregset_t) |
@@ -700,10 +699,6 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5, | |||
700 | return 0; | 699 | return 0; |
701 | 700 | ||
702 | badframe: | 701 | badframe: |
703 | #if DEBUG_SIG | ||
704 | printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n", | ||
705 | regs, uc, &uc->uc_mcontext); | ||
706 | #endif | ||
707 | if (show_unhandled_signals) | 702 | if (show_unhandled_signals) |
708 | printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, | 703 | printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, |
709 | current->comm, current->pid, "rt_sigreturn", | 704 | current->comm, current->pid, "rt_sigreturn", |
@@ -809,10 +804,6 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
809 | return 1; | 804 | return 1; |
810 | 805 | ||
811 | badframe: | 806 | badframe: |
812 | #if DEBUG_SIG | ||
813 | printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n", | ||
814 | regs, frame, newsp); | ||
815 | #endif | ||
816 | if (show_unhandled_signals) | 807 | if (show_unhandled_signals) |
817 | printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, | 808 | printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, |
818 | current->comm, current->pid, "setup_rt_frame", | 809 | current->comm, current->pid, "setup_rt_frame", |
diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S index 8c86422a1e37..731be7478b27 100644 --- a/arch/powerpc/kvm/book3s_hv_interrupts.S +++ b/arch/powerpc/kvm/book3s_hv_interrupts.S | |||
@@ -127,11 +127,6 @@ BEGIN_FTR_SECTION | |||
127 | stw r10, HSTATE_PMC + 24(r13) | 127 | stw r10, HSTATE_PMC + 24(r13) |
128 | stw r11, HSTATE_PMC + 28(r13) | 128 | stw r11, HSTATE_PMC + 28(r13) |
129 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | 129 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) |
130 | BEGIN_FTR_SECTION | ||
131 | mfspr r9, SPRN_SIER | ||
132 | std r8, HSTATE_MMCR + 40(r13) | ||
133 | std r9, HSTATE_MMCR + 48(r13) | ||
134 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | ||
135 | 31: | 130 | 31: |
136 | 131 | ||
137 | /* | 132 | /* |
diff --git a/arch/powerpc/mm/mmu_context_nohash.c b/arch/powerpc/mm/mmu_context_nohash.c index af3d78e19302..928ebe79668b 100644 --- a/arch/powerpc/mm/mmu_context_nohash.c +++ b/arch/powerpc/mm/mmu_context_nohash.c | |||
@@ -410,17 +410,7 @@ void __init mmu_context_init(void) | |||
410 | } else if (mmu_has_feature(MMU_FTR_TYPE_47x)) { | 410 | } else if (mmu_has_feature(MMU_FTR_TYPE_47x)) { |
411 | first_context = 1; | 411 | first_context = 1; |
412 | last_context = 65535; | 412 | last_context = 65535; |
413 | } else | 413 | } else { |
414 | #ifdef CONFIG_PPC_BOOK3E_MMU | ||
415 | if (mmu_has_feature(MMU_FTR_TYPE_3E)) { | ||
416 | u32 mmucfg = mfspr(SPRN_MMUCFG); | ||
417 | u32 pid_bits = (mmucfg & MMUCFG_PIDSIZE_MASK) | ||
418 | >> MMUCFG_PIDSIZE_SHIFT; | ||
419 | first_context = 1; | ||
420 | last_context = (1UL << (pid_bits + 1)) - 1; | ||
421 | } else | ||
422 | #endif | ||
423 | { | ||
424 | first_context = 1; | 414 | first_context = 1; |
425 | last_context = 255; | 415 | last_context = 255; |
426 | } | 416 | } |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 4520c9356b54..6b0641c3f03f 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -485,7 +485,7 @@ static bool is_ebb_event(struct perf_event *event) | |||
485 | * check that the PMU supports EBB, meaning those that don't can still | 485 | * check that the PMU supports EBB, meaning those that don't can still |
486 | * use bit 63 of the event code for something else if they wish. | 486 | * use bit 63 of the event code for something else if they wish. |
487 | */ | 487 | */ |
488 | return (ppmu->flags & PPMU_EBB) && | 488 | return (ppmu->flags & PPMU_ARCH_207S) && |
489 | ((event->attr.config >> PERF_EVENT_CONFIG_EBB_SHIFT) & 1); | 489 | ((event->attr.config >> PERF_EVENT_CONFIG_EBB_SHIFT) & 1); |
490 | } | 490 | } |
491 | 491 | ||
@@ -777,7 +777,7 @@ void perf_event_print_debug(void) | |||
777 | if (ppmu->flags & PPMU_HAS_SIER) | 777 | if (ppmu->flags & PPMU_HAS_SIER) |
778 | sier = mfspr(SPRN_SIER); | 778 | sier = mfspr(SPRN_SIER); |
779 | 779 | ||
780 | if (ppmu->flags & PPMU_EBB) { | 780 | if (ppmu->flags & PPMU_ARCH_207S) { |
781 | pr_info("MMCR2: %016lx EBBHR: %016lx\n", | 781 | pr_info("MMCR2: %016lx EBBHR: %016lx\n", |
782 | mfspr(SPRN_MMCR2), mfspr(SPRN_EBBHR)); | 782 | mfspr(SPRN_MMCR2), mfspr(SPRN_EBBHR)); |
783 | pr_info("EBBRR: %016lx BESCR: %016lx\n", | 783 | pr_info("EBBRR: %016lx BESCR: %016lx\n", |
@@ -996,7 +996,22 @@ static void power_pmu_read(struct perf_event *event) | |||
996 | } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); | 996 | } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); |
997 | 997 | ||
998 | local64_add(delta, &event->count); | 998 | local64_add(delta, &event->count); |
999 | local64_sub(delta, &event->hw.period_left); | 999 | |
1000 | /* | ||
1001 | * A number of places program the PMC with (0x80000000 - period_left). | ||
1002 | * We never want period_left to be less than 1 because we will program | ||
1003 | * the PMC with a value >= 0x800000000 and an edge detected PMC will | ||
1004 | * roll around to 0 before taking an exception. We have seen this | ||
1005 | * on POWER8. | ||
1006 | * | ||
1007 | * To fix this, clamp the minimum value of period_left to 1. | ||
1008 | */ | ||
1009 | do { | ||
1010 | prev = local64_read(&event->hw.period_left); | ||
1011 | val = prev - delta; | ||
1012 | if (val < 1) | ||
1013 | val = 1; | ||
1014 | } while (local64_cmpxchg(&event->hw.period_left, prev, val) != prev); | ||
1000 | } | 1015 | } |
1001 | 1016 | ||
1002 | /* | 1017 | /* |
@@ -1300,6 +1315,9 @@ static void power_pmu_enable(struct pmu *pmu) | |||
1300 | 1315 | ||
1301 | write_mmcr0(cpuhw, mmcr0); | 1316 | write_mmcr0(cpuhw, mmcr0); |
1302 | 1317 | ||
1318 | if (ppmu->flags & PPMU_ARCH_207S) | ||
1319 | mtspr(SPRN_MMCR2, 0); | ||
1320 | |||
1303 | /* | 1321 | /* |
1304 | * Enable instruction sampling if necessary | 1322 | * Enable instruction sampling if necessary |
1305 | */ | 1323 | */ |
@@ -1696,7 +1714,7 @@ static int power_pmu_event_init(struct perf_event *event) | |||
1696 | 1714 | ||
1697 | if (has_branch_stack(event)) { | 1715 | if (has_branch_stack(event)) { |
1698 | /* PMU has BHRB enabled */ | 1716 | /* PMU has BHRB enabled */ |
1699 | if (!(ppmu->flags & PPMU_BHRB)) | 1717 | if (!(ppmu->flags & PPMU_ARCH_207S)) |
1700 | return -EOPNOTSUPP; | 1718 | return -EOPNOTSUPP; |
1701 | } | 1719 | } |
1702 | 1720 | ||
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c index fe2763b6e039..639cd9156585 100644 --- a/arch/powerpc/perf/power8-pmu.c +++ b/arch/powerpc/perf/power8-pmu.c | |||
@@ -792,7 +792,7 @@ static struct power_pmu power8_pmu = { | |||
792 | .get_constraint = power8_get_constraint, | 792 | .get_constraint = power8_get_constraint, |
793 | .get_alternatives = power8_get_alternatives, | 793 | .get_alternatives = power8_get_alternatives, |
794 | .disable_pmc = power8_disable_pmc, | 794 | .disable_pmc = power8_disable_pmc, |
795 | .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB | PPMU_EBB, | 795 | .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_ARCH_207S, |
796 | .n_generic = ARRAY_SIZE(power8_generic_events), | 796 | .n_generic = ARRAY_SIZE(power8_generic_events), |
797 | .generic_events = power8_generic_events, | 797 | .generic_events = power8_generic_events, |
798 | .cache_events = &power8_cache_events, | 798 | .cache_events = &power8_cache_events, |
diff --git a/arch/powerpc/platforms/cell/cbe_thermal.c b/arch/powerpc/platforms/cell/cbe_thermal.c index 94560db788bf..2c15ff094483 100644 --- a/arch/powerpc/platforms/cell/cbe_thermal.c +++ b/arch/powerpc/platforms/cell/cbe_thermal.c | |||
@@ -125,7 +125,7 @@ static ssize_t show_throttle(struct cbe_pmd_regs __iomem *pmd_regs, char *buf, i | |||
125 | static ssize_t store_throttle(struct cbe_pmd_regs __iomem *pmd_regs, const char *buf, size_t size, int pos) | 125 | static ssize_t store_throttle(struct cbe_pmd_regs __iomem *pmd_regs, const char *buf, size_t size, int pos) |
126 | { | 126 | { |
127 | u64 reg_value; | 127 | u64 reg_value; |
128 | int temp; | 128 | unsigned int temp; |
129 | u64 new_value; | 129 | u64 new_value; |
130 | int ret; | 130 | int ret; |
131 | 131 | ||
diff --git a/arch/powerpc/platforms/cell/spu_syscalls.c b/arch/powerpc/platforms/cell/spu_syscalls.c index 38e0a1a5cec3..5e6e0bad6db6 100644 --- a/arch/powerpc/platforms/cell/spu_syscalls.c +++ b/arch/powerpc/platforms/cell/spu_syscalls.c | |||
@@ -111,6 +111,7 @@ asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, __u32 __user *ustatus) | |||
111 | return ret; | 111 | return ret; |
112 | } | 112 | } |
113 | 113 | ||
114 | #ifdef CONFIG_COREDUMP | ||
114 | int elf_coredump_extra_notes_size(void) | 115 | int elf_coredump_extra_notes_size(void) |
115 | { | 116 | { |
116 | struct spufs_calls *calls; | 117 | struct spufs_calls *calls; |
@@ -142,6 +143,7 @@ int elf_coredump_extra_notes_write(struct coredump_params *cprm) | |||
142 | 143 | ||
143 | return ret; | 144 | return ret; |
144 | } | 145 | } |
146 | #endif | ||
145 | 147 | ||
146 | void notify_spus_active(void) | 148 | void notify_spus_active(void) |
147 | { | 149 | { |
diff --git a/arch/powerpc/platforms/cell/spufs/Makefile b/arch/powerpc/platforms/cell/spufs/Makefile index b9d5d678aa44..52a7d2596d30 100644 --- a/arch/powerpc/platforms/cell/spufs/Makefile +++ b/arch/powerpc/platforms/cell/spufs/Makefile | |||
@@ -1,8 +1,9 @@ | |||
1 | 1 | ||
2 | obj-$(CONFIG_SPU_FS) += spufs.o | 2 | obj-$(CONFIG_SPU_FS) += spufs.o |
3 | spufs-y += inode.o file.o context.o syscalls.o coredump.o | 3 | spufs-y += inode.o file.o context.o syscalls.o |
4 | spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o | 4 | spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o |
5 | spufs-y += switch.o fault.o lscsa_alloc.o | 5 | spufs-y += switch.o fault.o lscsa_alloc.o |
6 | spufs-$(CONFIG_COREDUMP) += coredump.o | ||
6 | 7 | ||
7 | # magic for the trace events | 8 | # magic for the trace events |
8 | CFLAGS_sched.o := -I$(src) | 9 | CFLAGS_sched.o := -I$(src) |
diff --git a/arch/powerpc/platforms/cell/spufs/syscalls.c b/arch/powerpc/platforms/cell/spufs/syscalls.c index b045fdda4845..a87200a535fa 100644 --- a/arch/powerpc/platforms/cell/spufs/syscalls.c +++ b/arch/powerpc/platforms/cell/spufs/syscalls.c | |||
@@ -79,8 +79,10 @@ static long do_spu_create(const char __user *pathname, unsigned int flags, | |||
79 | struct spufs_calls spufs_calls = { | 79 | struct spufs_calls spufs_calls = { |
80 | .create_thread = do_spu_create, | 80 | .create_thread = do_spu_create, |
81 | .spu_run = do_spu_run, | 81 | .spu_run = do_spu_run, |
82 | .coredump_extra_notes_size = spufs_coredump_extra_notes_size, | ||
83 | .coredump_extra_notes_write = spufs_coredump_extra_notes_write, | ||
84 | .notify_spus_active = do_notify_spus_active, | 82 | .notify_spus_active = do_notify_spus_active, |
85 | .owner = THIS_MODULE, | 83 | .owner = THIS_MODULE, |
84 | #ifdef CONFIG_COREDUMP | ||
85 | .coredump_extra_notes_size = spufs_coredump_extra_notes_size, | ||
86 | .coredump_extra_notes_write = spufs_coredump_extra_notes_write, | ||
87 | #endif | ||
86 | }; | 88 | }; |
diff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile index d55891f89a2c..4ad227d04c1a 100644 --- a/arch/powerpc/platforms/powernv/Makefile +++ b/arch/powerpc/platforms/powernv/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o opal-async.o | 1 | obj-y += setup.o opal-wrappers.o opal.o opal-async.o |
2 | obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o | 2 | obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o |
3 | obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o | 3 | obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o |
4 | obj-y += opal-msglog.o | 4 | obj-y += opal-msglog.o |
diff --git a/arch/powerpc/platforms/powernv/opal-takeover.S b/arch/powerpc/platforms/powernv/opal-takeover.S deleted file mode 100644 index 11a3169ee583..000000000000 --- a/arch/powerpc/platforms/powernv/opal-takeover.S +++ /dev/null | |||
@@ -1,140 +0,0 @@ | |||
1 | /* | ||
2 | * PowerNV OPAL takeover assembly code, for use by prom_init.c | ||
3 | * | ||
4 | * Copyright 2011 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 | |||
12 | #include <asm/ppc_asm.h> | ||
13 | #include <asm/hvcall.h> | ||
14 | #include <asm/asm-offsets.h> | ||
15 | #include <asm/opal.h> | ||
16 | |||
17 | #define H_HAL_TAKEOVER 0x5124 | ||
18 | #define H_HAL_TAKEOVER_QUERY_MAGIC -1 | ||
19 | |||
20 | .text | ||
21 | _GLOBAL(opal_query_takeover) | ||
22 | mfcr r0 | ||
23 | stw r0,8(r1) | ||
24 | stdu r1,-STACKFRAMESIZE(r1) | ||
25 | std r3,STK_PARAM(R3)(r1) | ||
26 | std r4,STK_PARAM(R4)(r1) | ||
27 | li r3,H_HAL_TAKEOVER | ||
28 | li r4,H_HAL_TAKEOVER_QUERY_MAGIC | ||
29 | HVSC | ||
30 | addi r1,r1,STACKFRAMESIZE | ||
31 | ld r10,STK_PARAM(R3)(r1) | ||
32 | std r4,0(r10) | ||
33 | ld r10,STK_PARAM(R4)(r1) | ||
34 | std r5,0(r10) | ||
35 | lwz r0,8(r1) | ||
36 | mtcrf 0xff,r0 | ||
37 | blr | ||
38 | |||
39 | _GLOBAL(opal_do_takeover) | ||
40 | mfcr r0 | ||
41 | stw r0,8(r1) | ||
42 | mflr r0 | ||
43 | std r0,16(r1) | ||
44 | bl __opal_do_takeover | ||
45 | ld r0,16(r1) | ||
46 | mtlr r0 | ||
47 | lwz r0,8(r1) | ||
48 | mtcrf 0xff,r0 | ||
49 | blr | ||
50 | |||
51 | __opal_do_takeover: | ||
52 | ld r4,0(r3) | ||
53 | ld r5,0x8(r3) | ||
54 | ld r6,0x10(r3) | ||
55 | ld r7,0x18(r3) | ||
56 | ld r8,0x20(r3) | ||
57 | ld r9,0x28(r3) | ||
58 | ld r10,0x30(r3) | ||
59 | ld r11,0x38(r3) | ||
60 | li r3,H_HAL_TAKEOVER | ||
61 | HVSC | ||
62 | blr | ||
63 | |||
64 | .globl opal_secondary_entry | ||
65 | opal_secondary_entry: | ||
66 | mr r31,r3 | ||
67 | mfmsr r11 | ||
68 | li r12,(MSR_SF | MSR_ISF)@highest | ||
69 | sldi r12,r12,48 | ||
70 | or r11,r11,r12 | ||
71 | mtmsrd r11 | ||
72 | isync | ||
73 | mfspr r4,SPRN_PIR | ||
74 | std r4,0(r3) | ||
75 | 1: HMT_LOW | ||
76 | ld r4,8(r3) | ||
77 | cmpli cr0,r4,0 | ||
78 | beq 1b | ||
79 | HMT_MEDIUM | ||
80 | 1: addi r3,r31,16 | ||
81 | bl __opal_do_takeover | ||
82 | b 1b | ||
83 | |||
84 | _GLOBAL(opal_enter_rtas) | ||
85 | mflr r0 | ||
86 | std r0,16(r1) | ||
87 | stdu r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */ | ||
88 | |||
89 | /* Because PROM is running in 32b mode, it clobbers the high order half | ||
90 | * of all registers that it saves. We therefore save those registers | ||
91 | * PROM might touch to the stack. (r0, r3-r13 are caller saved) | ||
92 | */ | ||
93 | SAVE_GPR(2, r1) | ||
94 | SAVE_GPR(13, r1) | ||
95 | SAVE_8GPRS(14, r1) | ||
96 | SAVE_10GPRS(22, r1) | ||
97 | mfcr r10 | ||
98 | mfmsr r11 | ||
99 | std r10,_CCR(r1) | ||
100 | std r11,_MSR(r1) | ||
101 | |||
102 | /* Get the PROM entrypoint */ | ||
103 | mtlr r5 | ||
104 | |||
105 | /* Switch MSR to 32 bits mode | ||
106 | */ | ||
107 | li r12,1 | ||
108 | rldicr r12,r12,MSR_SF_LG,(63-MSR_SF_LG) | ||
109 | andc r11,r11,r12 | ||
110 | li r12,1 | ||
111 | rldicr r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG) | ||
112 | andc r11,r11,r12 | ||
113 | mtmsrd r11 | ||
114 | isync | ||
115 | |||
116 | /* Enter RTAS here... */ | ||
117 | blrl | ||
118 | |||
119 | /* Just make sure that r1 top 32 bits didn't get | ||
120 | * corrupt by OF | ||
121 | */ | ||
122 | rldicl r1,r1,0,32 | ||
123 | |||
124 | /* Restore the MSR (back to 64 bits) */ | ||
125 | ld r0,_MSR(r1) | ||
126 | MTMSRD(r0) | ||
127 | isync | ||
128 | |||
129 | /* Restore other registers */ | ||
130 | REST_GPR(2, r1) | ||
131 | REST_GPR(13, r1) | ||
132 | REST_8GPRS(14, r1) | ||
133 | REST_10GPRS(22, r1) | ||
134 | ld r4,_CCR(r1) | ||
135 | mtcr r4 | ||
136 | |||
137 | addi r1,r1,PROM_FRAME_SIZE | ||
138 | ld r0,16(r1) | ||
139 | mtlr r0 | ||
140 | blr | ||
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 62c47bb76517..9e5353ff6d1b 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
@@ -476,6 +476,11 @@ void __init alloc_dart_table(void) | |||
476 | */ | 476 | */ |
477 | dart_tablebase = (unsigned long) | 477 | dart_tablebase = (unsigned long) |
478 | __va(memblock_alloc_base(1UL<<24, 1UL<<24, 0x80000000L)); | 478 | __va(memblock_alloc_base(1UL<<24, 1UL<<24, 0x80000000L)); |
479 | /* | ||
480 | * The DART space is later unmapped from the kernel linear mapping and | ||
481 | * accessing dart_tablebase during kmemleak scanning will fault. | ||
482 | */ | ||
483 | kmemleak_no_scan((void *)dart_tablebase); | ||
479 | 484 | ||
480 | printk(KERN_INFO "DART table allocated at: %lx\n", dart_tablebase); | 485 | printk(KERN_INFO "DART table allocated at: %lx\n", dart_tablebase); |
481 | } | 486 | } |