Commit 7442cf9ac2de31b33311209476cd81398d3863cf

Authored by Linus Torvalds

Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

Pull powerpc fixes from Ben Herrenschmidt:
 "Here is a handful of powerpc fixes for 3.16.  They are all pretty
  simple and self contained and should still make this release"

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
  powerpc: use _GLOBAL_TOC for memmove
  powerpc/pseries: dynamically added OF nodes need to call of_node_init
  powerpc: subpage_protect: Increase the array size to take care of 64TB
  powerpc: Fix bugs in emulate_step()
  powerpc: Disable doorbells on Power8 DD1.x

Showing 7 changed files Side-by-side Diff

arch/powerpc/include/asm/cputable.h
... ... @@ -447,6 +447,7 @@
447 447 CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
448 448 CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP)
449 449 #define CPU_FTRS_POWER8E (CPU_FTRS_POWER8 | CPU_FTR_PMAO_BUG)
  450 +#define CPU_FTRS_POWER8_DD1 (CPU_FTRS_POWER8 & ~CPU_FTR_DBELL)
450 451 #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
451 452 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
452 453 CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
arch/powerpc/include/asm/mmu-hash64.h
... ... @@ -22,6 +22,7 @@
22 22 */
23 23 #include <asm/pgtable-ppc64.h>
24 24 #include <asm/bug.h>
  25 +#include <asm/processor.h>
25 26  
26 27 /*
27 28 * Segment table
... ... @@ -496,7 +497,7 @@
496 497 */
497 498 struct subpage_prot_table {
498 499 unsigned long maxaddr; /* only addresses < this are protected */
499   - unsigned int **protptrs[2];
  500 + unsigned int **protptrs[(TASK_SIZE_USER64 >> 43)];
500 501 unsigned int *low_prot[4];
501 502 };
502 503  
arch/powerpc/kernel/cputable.c
... ... @@ -527,6 +527,26 @@
527 527 .machine_check_early = __machine_check_early_realmode_p8,
528 528 .platform = "power8",
529 529 },
  530 + { /* Power8 DD1: Does not support doorbell IPIs */
  531 + .pvr_mask = 0xffffff00,
  532 + .pvr_value = 0x004d0100,
  533 + .cpu_name = "POWER8 (raw)",
  534 + .cpu_features = CPU_FTRS_POWER8_DD1,
  535 + .cpu_user_features = COMMON_USER_POWER8,
  536 + .cpu_user_features2 = COMMON_USER2_POWER8,
  537 + .mmu_features = MMU_FTRS_POWER8,
  538 + .icache_bsize = 128,
  539 + .dcache_bsize = 128,
  540 + .num_pmcs = 6,
  541 + .pmc_type = PPC_PMC_IBM,
  542 + .oprofile_cpu_type = "ppc64/power8",
  543 + .oprofile_type = PPC_OPROFILE_INVALID,
  544 + .cpu_setup = __setup_cpu_power8,
  545 + .cpu_restore = __restore_cpu_power8,
  546 + .flush_tlb = __flush_tlb_power8,
  547 + .machine_check_early = __machine_check_early_realmode_p8,
  548 + .platform = "power8",
  549 + },
530 550 { /* Power8 */
531 551 .pvr_mask = 0xffff0000,
532 552 .pvr_value = 0x004d0000,
arch/powerpc/lib/mem_64.S
... ... @@ -77,7 +77,7 @@
77 77 stb r4,0(r6)
78 78 blr
79 79  
80   -_GLOBAL(memmove)
  80 +_GLOBAL_TOC(memmove)
81 81 cmplw 0,r3,r4
82 82 bgt backwards_memcpy
83 83 b memcpy
arch/powerpc/lib/sstep.c
... ... @@ -1198,7 +1198,7 @@
1198 1198 sh = regs->gpr[rb] & 0x3f;
1199 1199 ival = (signed int) regs->gpr[rd];
1200 1200 regs->gpr[ra] = ival >> (sh < 32 ? sh : 31);
1201   - if (ival < 0 && (sh >= 32 || (ival & ((1 << sh) - 1)) != 0))
  1201 + if (ival < 0 && (sh >= 32 || (ival & ((1ul << sh) - 1)) != 0))
1202 1202 regs->xer |= XER_CA;
1203 1203 else
1204 1204 regs->xer &= ~XER_CA;
... ... @@ -1208,7 +1208,7 @@
1208 1208 sh = rb;
1209 1209 ival = (signed int) regs->gpr[rd];
1210 1210 regs->gpr[ra] = ival >> sh;
1211   - if (ival < 0 && (ival & ((1 << sh) - 1)) != 0)
  1211 + if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)
1212 1212 regs->xer |= XER_CA;
1213 1213 else
1214 1214 regs->xer &= ~XER_CA;
... ... @@ -1216,7 +1216,7 @@
1216 1216  
1217 1217 #ifdef __powerpc64__
1218 1218 case 27: /* sld */
1219   - sh = regs->gpr[rd] & 0x7f;
  1219 + sh = regs->gpr[rb] & 0x7f;
1220 1220 if (sh < 64)
1221 1221 regs->gpr[ra] = regs->gpr[rd] << sh;
1222 1222 else
... ... @@ -1235,7 +1235,7 @@
1235 1235 sh = regs->gpr[rb] & 0x7f;
1236 1236 ival = (signed long int) regs->gpr[rd];
1237 1237 regs->gpr[ra] = ival >> (sh < 64 ? sh : 63);
1238   - if (ival < 0 && (sh >= 64 || (ival & ((1 << sh) - 1)) != 0))
  1238 + if (ival < 0 && (sh >= 64 || (ival & ((1ul << sh) - 1)) != 0))
1239 1239 regs->xer |= XER_CA;
1240 1240 else
1241 1241 regs->xer &= ~XER_CA;
... ... @@ -1246,7 +1246,7 @@
1246 1246 sh = rb | ((instr & 2) << 4);
1247 1247 ival = (signed long int) regs->gpr[rd];
1248 1248 regs->gpr[ra] = ival >> sh;
1249   - if (ival < 0 && (ival & ((1 << sh) - 1)) != 0)
  1249 + if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)
1250 1250 regs->xer |= XER_CA;
1251 1251 else
1252 1252 regs->xer &= ~XER_CA;
arch/powerpc/platforms/pseries/dlpar.c
... ... @@ -86,6 +86,7 @@
86 86 }
87 87  
88 88 of_node_set_flag(dn, OF_DYNAMIC);
  89 + of_node_init(dn);
89 90  
90 91 return dn;
91 92 }
arch/powerpc/platforms/pseries/reconfig.c
... ... @@ -69,6 +69,7 @@
69 69  
70 70 np->properties = proplist;
71 71 of_node_set_flag(np, OF_DYNAMIC);
  72 + of_node_init(np);
72 73  
73 74 np->parent = derive_parent(path);
74 75 if (IS_ERR(np->parent)) {