diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-23 15:34:13 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-23 15:34:13 -0700 | 
| commit | 7442cf9ac2de31b33311209476cd81398d3863cf (patch) | |
| tree | 368360ef9b75e9443cea5d6e8defee529d590469 | |
| parent | 355cb09304c3387e43946a83b1fa8a34dc8976c0 (diff) | |
| parent | 6f5405bc2ee0102bb3856e2cdea64ff415db2e0c (diff) | |
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
| -rw-r--r-- | arch/powerpc/include/asm/cputable.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/mmu-hash64.h | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 20 | ||||
| -rw-r--r-- | arch/powerpc/lib/mem_64.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/lib/sstep.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/dlpar.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/reconfig.c | 1 | 
7 files changed, 31 insertions, 7 deletions
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index bc2347774f0a..0fdd7eece6d9 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -447,6 +447,7 @@ extern const char *powerpc_base_platform;  	    CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \  	    CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP)  #define CPU_FTRS_POWER8E (CPU_FTRS_POWER8 | CPU_FTR_PMAO_BUG) +#define CPU_FTRS_POWER8_DD1 (CPU_FTRS_POWER8 & ~CPU_FTR_DBELL)  #define CPU_FTRS_CELL	(CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \  	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \  	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 807014dde821..c2b4dcf23d03 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h @@ -22,6 +22,7 @@   */  #include <asm/pgtable-ppc64.h>  #include <asm/bug.h> +#include <asm/processor.h>  /*   * Segment table @@ -496,7 +497,7 @@ extern void slb_set_size(u16 size);   */  struct subpage_prot_table {  	unsigned long maxaddr;	/* only addresses < this are protected */ -	unsigned int **protptrs[2]; +	unsigned int **protptrs[(TASK_SIZE_USER64 >> 43)];  	unsigned int *low_prot[4];  }; diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 965291b4c2fa..0c157642c2a1 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -527,6 +527,26 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.machine_check_early	= __machine_check_early_realmode_p8,  		.platform		= "power8",  	}, +	{	/* Power8 DD1: Does not support doorbell IPIs */ +		.pvr_mask		= 0xffffff00, +		.pvr_value		= 0x004d0100, +		.cpu_name		= "POWER8 (raw)", +		.cpu_features		= CPU_FTRS_POWER8_DD1, +		.cpu_user_features	= COMMON_USER_POWER8, +		.cpu_user_features2	= COMMON_USER2_POWER8, +		.mmu_features		= MMU_FTRS_POWER8, +		.icache_bsize		= 128, +		.dcache_bsize		= 128, +		.num_pmcs		= 6, +		.pmc_type		= PPC_PMC_IBM, +		.oprofile_cpu_type	= "ppc64/power8", +		.oprofile_type		= PPC_OPROFILE_INVALID, +		.cpu_setup		= __setup_cpu_power8, +		.cpu_restore		= __restore_cpu_power8, +		.flush_tlb		= __flush_tlb_power8, +		.machine_check_early	= __machine_check_early_realmode_p8, +		.platform		= "power8", +	},  	{	/* Power8 */  		.pvr_mask		= 0xffff0000,  		.pvr_value		= 0x004d0000, diff --git a/arch/powerpc/lib/mem_64.S b/arch/powerpc/lib/mem_64.S index 0738f96befbf..43435c6892fb 100644 --- a/arch/powerpc/lib/mem_64.S +++ b/arch/powerpc/lib/mem_64.S @@ -77,7 +77,7 @@ _GLOBAL(memset)  	stb	r4,0(r6)  	blr -_GLOBAL(memmove) +_GLOBAL_TOC(memmove)  	cmplw	0,r3,r4  	bgt	backwards_memcpy  	b	memcpy diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 412dd46dd0b7..5c09f365c842 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -1198,7 +1198,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)  			sh = regs->gpr[rb] & 0x3f;  			ival = (signed int) regs->gpr[rd];  			regs->gpr[ra] = ival >> (sh < 32 ? sh : 31); -			if (ival < 0 && (sh >= 32 || (ival & ((1 << sh) - 1)) != 0)) +			if (ival < 0 && (sh >= 32 || (ival & ((1ul << sh) - 1)) != 0))  				regs->xer |= XER_CA;  			else  				regs->xer &= ~XER_CA; @@ -1208,7 +1208,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)  			sh = rb;  			ival = (signed int) regs->gpr[rd];  			regs->gpr[ra] = ival >> sh; -			if (ival < 0 && (ival & ((1 << sh) - 1)) != 0) +			if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)  				regs->xer |= XER_CA;  			else  				regs->xer &= ~XER_CA; @@ -1216,7 +1216,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)  #ifdef __powerpc64__  		case 27:	/* sld */ -			sh = regs->gpr[rd] & 0x7f; +			sh = regs->gpr[rb] & 0x7f;  			if (sh < 64)  				regs->gpr[ra] = regs->gpr[rd] << sh;  			else @@ -1235,7 +1235,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)  			sh = regs->gpr[rb] & 0x7f;  			ival = (signed long int) regs->gpr[rd];  			regs->gpr[ra] = ival >> (sh < 64 ? sh : 63); -			if (ival < 0 && (sh >= 64 || (ival & ((1 << sh) - 1)) != 0)) +			if (ival < 0 && (sh >= 64 || (ival & ((1ul << sh) - 1)) != 0))  				regs->xer |= XER_CA;  			else  				regs->xer &= ~XER_CA; @@ -1246,7 +1246,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)  			sh = rb | ((instr & 2) << 4);  			ival = (signed long int) regs->gpr[rd];  			regs->gpr[ra] = ival >> sh; -			if (ival < 0 && (ival & ((1 << sh) - 1)) != 0) +			if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)  				regs->xer |= XER_CA;  			else  				regs->xer &= ~XER_CA; diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c index 022b38e6a80b..2d0b4d68a40a 100644 --- a/arch/powerpc/platforms/pseries/dlpar.c +++ b/arch/powerpc/platforms/pseries/dlpar.c @@ -86,6 +86,7 @@ static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa,  	}  	of_node_set_flag(dn, OF_DYNAMIC); +	of_node_init(dn);  	return dn;  } diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index 0435bb65d0aa..1c0a60d98867 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c @@ -69,6 +69,7 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist  	np->properties = proplist;  	of_node_set_flag(np, OF_DYNAMIC); +	of_node_init(np);  	np->parent = derive_parent(path);  	if (IS_ERR(np->parent)) {  | 
