aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/include/asm/setup.h1
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S4
-rw-r--r--arch/powerpc/kernel/tm.S20
-rw-r--r--arch/powerpc/lib/checksum_64.S3
-rw-r--r--arch/powerpc/lib/code-patching.c6
-rw-r--r--arch/powerpc/mm/mem.c2
-rw-r--r--arch/powerpc/mm/numa.c7
-rw-r--r--arch/powerpc/mm/pkeys.c2
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda-tce.c2
9 files changed, 38 insertions, 9 deletions
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h
index 1a951b00465d..1fffbba8d6a5 100644
--- a/arch/powerpc/include/asm/setup.h
+++ b/arch/powerpc/include/asm/setup.h
@@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex);
9 9
10extern unsigned int rtas_data; 10extern unsigned int rtas_data;
11extern unsigned long long memory_limit; 11extern unsigned long long memory_limit;
12extern bool init_mem_is_free;
12extern unsigned long klimit; 13extern unsigned long klimit;
13extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); 14extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
14 15
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index ea04dfb8c092..2d8fc8c9da7a 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1314,9 +1314,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
1314 1314
1315#ifdef CONFIG_PPC_DENORMALISATION 1315#ifdef CONFIG_PPC_DENORMALISATION
1316 mfspr r10,SPRN_HSRR1 1316 mfspr r10,SPRN_HSRR1
1317 mfspr r11,SPRN_HSRR0 /* save HSRR0 */
1318 andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */ 1317 andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */
1319 addi r11,r11,-4 /* HSRR0 is next instruction */
1320 bne+ denorm_assist 1318 bne+ denorm_assist
1321#endif 1319#endif
1322 1320
@@ -1382,6 +1380,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
1382 */ 1380 */
1383 XVCPSGNDP32(32) 1381 XVCPSGNDP32(32)
1384denorm_done: 1382denorm_done:
1383 mfspr r11,SPRN_HSRR0
1384 subi r11,r11,4
1385 mtspr SPRN_HSRR0,r11 1385 mtspr SPRN_HSRR0,r11
1386 mtcrf 0x80,r9 1386 mtcrf 0x80,r9
1387 ld r9,PACA_EXGEN+EX_R9(r13) 1387 ld r9,PACA_EXGEN+EX_R9(r13)
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
index 6bffbc5affe7..7716374786bd 100644
--- a/arch/powerpc/kernel/tm.S
+++ b/arch/powerpc/kernel/tm.S
@@ -176,13 +176,27 @@ _GLOBAL(tm_reclaim)
176 std r1, PACATMSCRATCH(r13) 176 std r1, PACATMSCRATCH(r13)
177 ld r1, PACAR1(r13) 177 ld r1, PACAR1(r13)
178 178
179 /* Store the PPR in r11 and reset to decent value */
180 std r11, GPR11(r1) /* Temporary stash */ 179 std r11, GPR11(r1) /* Temporary stash */
181 180
181 /*
182 * Move the saved user r1 to the kernel stack in case PACATMSCRATCH is
183 * clobbered by an exception once we turn on MSR_RI below.
184 */
185 ld r11, PACATMSCRATCH(r13)
186 std r11, GPR1(r1)
187
188 /*
189 * Store r13 away so we can free up the scratch SPR for the SLB fault
190 * handler (needed once we start accessing the thread_struct).
191 */
192 GET_SCRATCH0(r11)
193 std r11, GPR13(r1)
194
182 /* Reset MSR RI so we can take SLB faults again */ 195 /* Reset MSR RI so we can take SLB faults again */
183 li r11, MSR_RI 196 li r11, MSR_RI
184 mtmsrd r11, 1 197 mtmsrd r11, 1
185 198
199 /* Store the PPR in r11 and reset to decent value */
186 mfspr r11, SPRN_PPR 200 mfspr r11, SPRN_PPR
187 HMT_MEDIUM 201 HMT_MEDIUM
188 202
@@ -207,11 +221,11 @@ _GLOBAL(tm_reclaim)
207 SAVE_GPR(8, r7) /* user r8 */ 221 SAVE_GPR(8, r7) /* user r8 */
208 SAVE_GPR(9, r7) /* user r9 */ 222 SAVE_GPR(9, r7) /* user r9 */
209 SAVE_GPR(10, r7) /* user r10 */ 223 SAVE_GPR(10, r7) /* user r10 */
210 ld r3, PACATMSCRATCH(r13) /* user r1 */ 224 ld r3, GPR1(r1) /* user r1 */
211 ld r4, GPR7(r1) /* user r7 */ 225 ld r4, GPR7(r1) /* user r7 */
212 ld r5, GPR11(r1) /* user r11 */ 226 ld r5, GPR11(r1) /* user r11 */
213 ld r6, GPR12(r1) /* user r12 */ 227 ld r6, GPR12(r1) /* user r12 */
214 GET_SCRATCH0(8) /* user r13 */ 228 ld r8, GPR13(r1) /* user r13 */
215 std r3, GPR1(r7) 229 std r3, GPR1(r7)
216 std r4, GPR7(r7) 230 std r4, GPR7(r7)
217 std r5, GPR11(r7) 231 std r5, GPR11(r7)
diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S
index 886ed94b9c13..d05c8af4ac51 100644
--- a/arch/powerpc/lib/checksum_64.S
+++ b/arch/powerpc/lib/checksum_64.S
@@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic)
443 addc r0, r8, r9 443 addc r0, r8, r9
444 ld r10, 0(r4) 444 ld r10, 0(r4)
445 ld r11, 8(r4) 445 ld r11, 8(r4)
446#ifdef CONFIG_CPU_LITTLE_ENDIAN
447 rotldi r5, r5, 8
448#endif
446 adde r0, r0, r10 449 adde r0, r0, r10
447 add r5, r5, r7 450 add r5, r5, r7
448 adde r0, r0, r11 451 adde r0, r0, r11
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index 850f3b8f4da5..6ae2777c220d 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -28,6 +28,12 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,
28{ 28{
29 int err; 29 int err;
30 30
31 /* Make sure we aren't patching a freed init section */
32 if (init_mem_is_free && init_section_contains(exec_addr, 4)) {
33 pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr);
34 return 0;
35 }
36
31 __put_user_size(instr, patch_addr, 4, err); 37 __put_user_size(instr, patch_addr, 4, err);
32 if (err) 38 if (err)
33 return err; 39 return err;
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 5c8530d0c611..04ccb274a620 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -63,6 +63,7 @@
63#endif 63#endif
64 64
65unsigned long long memory_limit; 65unsigned long long memory_limit;
66bool init_mem_is_free;
66 67
67#ifdef CONFIG_HIGHMEM 68#ifdef CONFIG_HIGHMEM
68pte_t *kmap_pte; 69pte_t *kmap_pte;
@@ -396,6 +397,7 @@ void free_initmem(void)
396{ 397{
397 ppc_md.progress = ppc_printk_progress; 398 ppc_md.progress = ppc_printk_progress;
398 mark_initmem_nx(); 399 mark_initmem_nx();
400 init_mem_is_free = true;
399 free_initmem_default(POISON_FREE_INITMEM); 401 free_initmem_default(POISON_FREE_INITMEM);
400} 402}
401 403
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 35ac5422903a..59d07bd5374a 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -1204,7 +1204,9 @@ int find_and_online_cpu_nid(int cpu)
1204 int new_nid; 1204 int new_nid;
1205 1205
1206 /* Use associativity from first thread for all siblings */ 1206 /* Use associativity from first thread for all siblings */
1207 vphn_get_associativity(cpu, associativity); 1207 if (vphn_get_associativity(cpu, associativity))
1208 return cpu_to_node(cpu);
1209
1208 new_nid = associativity_to_nid(associativity); 1210 new_nid = associativity_to_nid(associativity);
1209 if (new_nid < 0 || !node_possible(new_nid)) 1211 if (new_nid < 0 || !node_possible(new_nid))
1210 new_nid = first_online_node; 1212 new_nid = first_online_node;
@@ -1452,7 +1454,8 @@ static struct timer_list topology_timer;
1452 1454
1453static void reset_topology_timer(void) 1455static void reset_topology_timer(void)
1454{ 1456{
1455 mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ); 1457 if (vphn_enabled)
1458 mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ);
1456} 1459}
1457 1460
1458#ifdef CONFIG_SMP 1461#ifdef CONFIG_SMP
diff --git a/arch/powerpc/mm/pkeys.c b/arch/powerpc/mm/pkeys.c
index 333b1f80c435..b271b283c785 100644
--- a/arch/powerpc/mm/pkeys.c
+++ b/arch/powerpc/mm/pkeys.c
@@ -45,7 +45,7 @@ static void scan_pkey_feature(void)
45 * Since any pkey can be used for data or execute, we will just treat 45 * Since any pkey can be used for data or execute, we will just treat
46 * all keys as equal and track them as one entity. 46 * all keys as equal and track them as one entity.
47 */ 47 */
48 pkeys_total = be32_to_cpu(vals[0]); 48 pkeys_total = vals[0];
49 pkeys_devtree_defined = true; 49 pkeys_devtree_defined = true;
50} 50}
51 51
diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c
index 6c5db1acbe8d..fe9691040f54 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c
@@ -276,7 +276,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset,
276 level_shift = entries_shift + 3; 276 level_shift = entries_shift + 3;
277 level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT); 277 level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT);
278 278
279 if ((level_shift - 3) * levels + page_shift >= 60) 279 if ((level_shift - 3) * levels + page_shift >= 55)
280 return -EINVAL; 280 return -EINVAL;
281 281
282 /* Allocate TCE table */ 282 /* Allocate TCE table */