diff options
Diffstat (limited to 'arch/powerpc/include')
52 files changed, 711 insertions, 319 deletions
| diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild index a4fe15e33c6f..650757c300db 100644 --- a/arch/powerpc/include/asm/Kbuild +++ b/arch/powerpc/include/asm/Kbuild @@ -1,4 +1,4 @@ -  generic-y += clkdev.h  generic-y += rwsem.h +generic-y += trace_clock.h diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index dc2cf9c6d9e6..ef918a2328bb 100644 --- a/arch/powerpc/include/asm/bitops.h +++ b/arch/powerpc/include/asm/bitops.h @@ -52,8 +52,6 @@  #define smp_mb__before_clear_bit()	smp_mb()  #define smp_mb__after_clear_bit()	smp_mb() -#define BITOP_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG)) -#define BITOP_WORD(nr)		((nr) / BITS_PER_LONG)  #define BITOP_LE_SWIZZLE	((BITS_PER_LONG-1) & ~0x7)  /* Macro for generating the ***_bits() functions */ @@ -83,22 +81,22 @@ DEFINE_BITOP(change_bits, xor, "", "")  static __inline__ void set_bit(int nr, volatile unsigned long *addr)  { -	set_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); +	set_bits(BIT_MASK(nr), addr + BIT_WORD(nr));  }  static __inline__ void clear_bit(int nr, volatile unsigned long *addr)  { -	clear_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); +	clear_bits(BIT_MASK(nr), addr + BIT_WORD(nr));  }  static __inline__ void clear_bit_unlock(int nr, volatile unsigned long *addr)  { -	clear_bits_unlock(BITOP_MASK(nr), addr + BITOP_WORD(nr)); +	clear_bits_unlock(BIT_MASK(nr), addr + BIT_WORD(nr));  }  static __inline__ void change_bit(int nr, volatile unsigned long *addr)  { -	change_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); +	change_bits(BIT_MASK(nr), addr + BIT_WORD(nr));  }  /* Like DEFINE_BITOP(), with changes to the arguments to 'op' and the output @@ -136,26 +134,26 @@ DEFINE_TESTOP(test_and_change_bits, xor, PPC_ATOMIC_ENTRY_BARRIER,  static __inline__ int test_and_set_bit(unsigned long nr,  				       volatile unsigned long *addr)  { -	return test_and_set_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; +	return test_and_set_bits(BIT_MASK(nr), addr + BIT_WORD(nr)) != 0;  }  static __inline__ int test_and_set_bit_lock(unsigned long nr,  				       volatile unsigned long *addr)  { -	return test_and_set_bits_lock(BITOP_MASK(nr), -				addr + BITOP_WORD(nr)) != 0; +	return test_and_set_bits_lock(BIT_MASK(nr), +				addr + BIT_WORD(nr)) != 0;  }  static __inline__ int test_and_clear_bit(unsigned long nr,  					 volatile unsigned long *addr)  { -	return test_and_clear_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; +	return test_and_clear_bits(BIT_MASK(nr), addr + BIT_WORD(nr)) != 0;  }  static __inline__ int test_and_change_bit(unsigned long nr,  					  volatile unsigned long *addr)  { -	return test_and_change_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; +	return test_and_change_bits(BIT_MASK(nr), addr + BIT_WORD(nr)) != 0;  }  #include <asm-generic/bitops/non-atomic.h> @@ -280,61 +278,8 @@ unsigned long __arch_hweight64(__u64 w);  #include <asm-generic/bitops/find.h>  /* Little-endian versions */ +#include <asm-generic/bitops/le.h> -static __inline__ int test_bit_le(unsigned long nr, -				  __const__ void *addr) -{ -	__const__ unsigned char	*tmp = (__const__ unsigned char *) addr; -	return (tmp[nr >> 3] >> (nr & 7)) & 1; -} - -static inline void set_bit_le(int nr, void *addr) -{ -	set_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline void clear_bit_le(int nr, void *addr) -{ -	clear_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline void __set_bit_le(int nr, void *addr) -{ -	__set_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline void __clear_bit_le(int nr, void *addr) -{ -	__clear_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline int test_and_set_bit_le(int nr, void *addr) -{ -	return test_and_set_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline int test_and_clear_bit_le(int nr, void *addr) -{ -	return test_and_clear_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline int __test_and_set_bit_le(int nr, void *addr) -{ -	return __test_and_set_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -static inline int __test_and_clear_bit_le(int nr, void *addr) -{ -	return __test_and_clear_bit(nr ^ BITOP_LE_SWIZZLE, addr); -} - -#define find_first_zero_bit_le(addr, size) \ -	find_next_zero_bit_le((addr), (size), 0) -unsigned long find_next_zero_bit_le(const void *addr, -				    unsigned long size, unsigned long offset); - -unsigned long find_next_bit_le(const void *addr, -				    unsigned long size, unsigned long offset);  /* Bitmap functions for the ext2 filesystem */  #include <asm-generic/bitops/ext2-atomic-setbit.h> diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 21a0687b8c4d..76f81bd64f1d 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -401,6 +401,14 @@ extern const char *powerpc_base_platform;  	    CPU_FTR_DSCR | CPU_FTR_SAO  | CPU_FTR_ASYM_SMT | \  	    CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \  	    CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY) +#define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ +	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ +	    CPU_FTR_MMCRA | CPU_FTR_SMT | \ +	    CPU_FTR_COHERENT_ICACHE | \ +	    CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ +	    CPU_FTR_DSCR | CPU_FTR_SAO  | \ +	    CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ +	    CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY)  #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 | \ @@ -421,8 +429,8 @@ extern const char *powerpc_base_platform;  #define CPU_FTRS_POSSIBLE	\  	    (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 |	\  	    CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 |	\ -	    CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T |		\ -	    CPU_FTR_VSX) +	    CPU_FTRS_POWER7 | CPU_FTRS_POWER8 | CPU_FTRS_CELL |		\ +	    CPU_FTRS_PA6T | CPU_FTR_VSX)  #endif  #else  enum { diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 487d46ff68a1..483733bd06d4 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -228,6 +228,8 @@ static inline cputime_t clock_t_to_cputime(const unsigned long clk)  #define cputime64_to_clock_t(ct)	cputime_to_clock_t((cputime_t)(ct)) +static inline void arch_vtime_task_switch(struct task_struct *tsk) { } +  #endif /* __KERNEL__ */  #endif /* CONFIG_VIRT_CPU_ACCOUNTING */  #endif /* __POWERPC_CPUTIME_H */ diff --git a/arch/powerpc/include/asm/dbell.h b/arch/powerpc/include/asm/dbell.h index 154c067761b1..607e4eeeb694 100644 --- a/arch/powerpc/include/asm/dbell.h +++ b/arch/powerpc/include/asm/dbell.h @@ -1,5 +1,5 @@  /* - * Copyright 2009 Freescale Semicondutor, Inc. + * Copyright 2009 Freescale Semiconductor, Inc.   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h index bf2c06c33871..d3d634274d2c 100644 --- a/arch/powerpc/include/asm/epapr_hcalls.h +++ b/arch/powerpc/include/asm/epapr_hcalls.h @@ -50,64 +50,13 @@  #ifndef _EPAPR_HCALLS_H  #define _EPAPR_HCALLS_H +#include <uapi/asm/epapr_hcalls.h> + +#ifndef __ASSEMBLY__  #include <linux/types.h>  #include <linux/errno.h>  #include <asm/byteorder.h> -#define EV_BYTE_CHANNEL_SEND		1 -#define EV_BYTE_CHANNEL_RECEIVE		2 -#define EV_BYTE_CHANNEL_POLL		3 -#define EV_INT_SET_CONFIG		4 -#define EV_INT_GET_CONFIG		5 -#define EV_INT_SET_MASK			6 -#define EV_INT_GET_MASK			7 -#define EV_INT_IACK			9 -#define EV_INT_EOI			10 -#define EV_INT_SEND_IPI			11 -#define EV_INT_SET_TASK_PRIORITY	12 -#define EV_INT_GET_TASK_PRIORITY	13 -#define EV_DOORBELL_SEND		14 -#define EV_MSGSND			15 -#define EV_IDLE				16 - -/* vendor ID: epapr */ -#define EV_LOCAL_VENDOR_ID		0	/* for private use */ -#define EV_EPAPR_VENDOR_ID		1 -#define EV_FSL_VENDOR_ID		2	/* Freescale Semiconductor */ -#define EV_IBM_VENDOR_ID		3	/* IBM */ -#define EV_GHS_VENDOR_ID		4	/* Green Hills Software */ -#define EV_ENEA_VENDOR_ID		5	/* Enea */ -#define EV_WR_VENDOR_ID			6	/* Wind River Systems */ -#define EV_AMCC_VENDOR_ID		7	/* Applied Micro Circuits */ -#define EV_KVM_VENDOR_ID		42	/* KVM */ - -/* The max number of bytes that a byte channel can send or receive per call */ -#define EV_BYTE_CHANNEL_MAX_BYTES	16 - - -#define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num)) -#define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num) - -/* epapr error codes */ -#define EV_EPERM		1	/* Operation not permitted */ -#define EV_ENOENT		2	/*  Entry Not Found */ -#define EV_EIO			3	/* I/O error occured */ -#define EV_EAGAIN		4	/* The operation had insufficient -					 * resources to complete and should be -					 * retried -					 */ -#define EV_ENOMEM		5	/* There was insufficient memory to -					 * complete the operation */ -#define EV_EFAULT		6	/* Bad guest address */ -#define EV_ENODEV		7	/* No such device */ -#define EV_EINVAL		8	/* An argument supplied to the hcall -					   was out of range or invalid */ -#define EV_INTERNAL		9	/* An internal error occured */ -#define EV_CONFIG		10	/* A configuration error was detected */ -#define EV_INVALID_STATE	11	/* The object is in an invalid state */ -#define EV_UNIMPLEMENTED	12	/* Unimplemented hypercall */ -#define EV_BUFFER_OVERFLOW	13	/* Caller-supplied buffer too small */ -  /*   * Hypercall register clobber list   * @@ -193,7 +142,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,  	r5  = priority;  	r6  = destination; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)  		: : EV_HCALL_CLOBBERS4  	); @@ -222,7 +171,7 @@ static inline unsigned int ev_int_get_config(unsigned int interrupt,  	r11 = EV_HCALL_TOKEN(EV_INT_GET_CONFIG);  	r3 = interrupt; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5), "=r" (r6)  		: : EV_HCALL_CLOBBERS4  	); @@ -252,7 +201,7 @@ static inline unsigned int ev_int_set_mask(unsigned int interrupt,  	r3 = interrupt;  	r4 = mask; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -277,7 +226,7 @@ static inline unsigned int ev_int_get_mask(unsigned int interrupt,  	r11 = EV_HCALL_TOKEN(EV_INT_GET_MASK);  	r3 = interrupt; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -305,7 +254,7 @@ static inline unsigned int ev_int_eoi(unsigned int interrupt)  	r11 = EV_HCALL_TOKEN(EV_INT_EOI);  	r3 = interrupt; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -344,7 +293,7 @@ static inline unsigned int ev_byte_channel_send(unsigned int handle,  	r7 = be32_to_cpu(p[2]);  	r8 = be32_to_cpu(p[3]); -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3),  		  "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7), "+r" (r8)  		: : EV_HCALL_CLOBBERS6 @@ -383,7 +332,7 @@ static inline unsigned int ev_byte_channel_receive(unsigned int handle,  	r3 = handle;  	r4 = *count; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4),  		  "=r" (r5), "=r" (r6), "=r" (r7), "=r" (r8)  		: : EV_HCALL_CLOBBERS6 @@ -421,7 +370,7 @@ static inline unsigned int ev_byte_channel_poll(unsigned int handle,  	r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_POLL);  	r3 = handle; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5)  		: : EV_HCALL_CLOBBERS3  	); @@ -454,7 +403,7 @@ static inline unsigned int ev_int_iack(unsigned int handle,  	r11 = EV_HCALL_TOKEN(EV_INT_IACK);  	r3 = handle; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -478,7 +427,7 @@ static inline unsigned int ev_doorbell_send(unsigned int handle)  	r11 = EV_HCALL_TOKEN(EV_DOORBELL_SEND);  	r3 = handle; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -498,12 +447,12 @@ static inline unsigned int ev_idle(void)  	r11 = EV_HCALL_TOKEN(EV_IDLE); -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "=r" (r3)  		: : EV_HCALL_CLOBBERS1  	);  	return r3;  } - -#endif +#endif /* !__ASSEMBLY__ */ +#endif /* _EPAPR_HCALLS_H */ diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index a43c1473915f..ad708dda3ba3 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h @@ -48,6 +48,35 @@  #define EX_LR		72  #define EX_CFAR		80 +#ifdef CONFIG_RELOCATABLE +#define EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)			\ +	ld	r12,PACAKBASE(r13);	/* get high part of &label */	\ +	mfspr	r11,SPRN_##h##SRR0;	/* save SRR0 */			\ +	LOAD_HANDLER(r12,label);					\ +	mtlr	r12;							\ +	mfspr	r12,SPRN_##h##SRR1;	/* and SRR1 */			\ +	li	r10,MSR_RI;						\ +	mtmsrd 	r10,1;			/* Set RI (EE=0) */		\ +	blr; +#else +/* If not relocatable, we can jump directly -- and save messing with LR */ +#define EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)			\ +	mfspr	r11,SPRN_##h##SRR0;	/* save SRR0 */			\ +	mfspr	r12,SPRN_##h##SRR1;	/* and SRR1 */			\ +	li	r10,MSR_RI;						\ +	mtmsrd 	r10,1;			/* Set RI (EE=0) */		\ +	b	label; +#endif + +/* + * As EXCEPTION_PROLOG_PSERIES(), except we've already got relocation on + * so no need to rfid.  Save lr in case we're CONFIG_RELOCATABLE, in which + * case EXCEPTION_RELON_PROLOG_PSERIES_1 will be using lr. + */ +#define EXCEPTION_RELON_PROLOG_PSERIES(area, label, h, extra, vec)	\ +	EXCEPTION_PROLOG_1(area, extra, vec);				\ +	EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) +  /*   * We're short on space and time in the exception prolog, so we can't   * use the normal SET_REG_IMMEDIATE macro. Normally we just need the @@ -55,12 +84,29 @@   * word.   */  #define LOAD_HANDLER(reg, label)					\ -	addi	reg,reg,(label)-_stext;	/* virt addr of handler ... */ +	/* Handlers must be within 64K of kbase, which must be 64k aligned */ \ +	ori	reg,reg,(label)-_stext;	/* virt addr of handler ... */  /* Exception register prefixes */  #define EXC_HV	H  #define EXC_STD +#if defined(CONFIG_RELOCATABLE) +/* + * If we support interrupts with relocation on AND we're a relocatable + * kernel, we need to use LR to get to the 2nd level handler.  So, save/restore + * it when required. + */ +#define SAVE_LR(reg, area)	mflr	reg ; 	std	reg,area+EX_LR(r13) +#define GET_LR(reg, area) 			ld	reg,area+EX_LR(r13) +#define RESTORE_LR(reg, area)	ld	reg,area+EX_LR(r13) ; mtlr reg +#else +/* ...else LR is unused and in register. */ +#define SAVE_LR(reg, area) +#define GET_LR(reg, area) 	mflr	reg +#define RESTORE_LR(reg, area) +#endif +  #define __EXCEPTION_PROLOG_1(area, extra, vec)				\  	GET_PACA(r13);							\  	std	r9,area+EX_R9(r13);	/* save r9 - r12 */		\ @@ -69,6 +115,7 @@  	mfspr	r10,SPRN_CFAR;						\  	std	r10,area+EX_CFAR(r13);					\  	END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66);		\ +	SAVE_LR(r10, area);						\  	mfcr	r9;							\  	extra(vec);							\  	std	r11,area+EX_R11(r13);					\ @@ -169,6 +216,7 @@ do_kvm_##n:								\  	sth	r1,PACA_TRAP_SAVE(r13);					   \  	std	r3,area+EX_R3(r13);					   \  	addi	r3,r13,area;		/* r3 -> where regs are saved*/	   \ +	RESTORE_LR(r1, area);						   \  	b	bad_stack;						   \  3:	std	r9,_CCR(r1);		/* save CR in stackframe	*/ \  	std	r11,_NIP(r1);		/* save SRR0 in stackframe	*/ \ @@ -194,8 +242,8 @@ do_kvm_##n:								\  	ld	r10,area+EX_CFAR(r13);					   \  	std	r10,ORIG_GPR3(r1);					   \  	END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66);		   \ +	GET_LR(r9,area);		/* Get LR, later save to stack	*/ \  	ld	r2,PACATOC(r13);	/* get kernel TOC into r2	*/ \ -	mflr	r9;			/* save LR in stackframe	*/ \  	std	r9,_LINK(r1);						   \  	mfctr	r10;			/* save CTR in stackframe	*/ \  	std	r10,_CTR(r1);						   \ @@ -232,6 +280,26 @@ label##_hv:						\  	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common,	\  				 EXC_HV, KVMTEST, vec) +#define STD_RELON_EXCEPTION_PSERIES(loc, vec, label)	\ +	. = loc;					\ +	.globl label##_relon_pSeries;			\ +label##_relon_pSeries:					\ +	HMT_MEDIUM;					\ +	/* No guest interrupts come through here */	\ +	SET_SCRATCH0(r13);		/* save r13 */	\ +	EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ +				       EXC_STD, KVMTEST_PR, vec) + +#define STD_RELON_EXCEPTION_HV(loc, vec, label)		\ +	. = loc;					\ +	.globl label##_relon_hv;			\ +label##_relon_hv:					\ +	HMT_MEDIUM;					\ +	/* No guest interrupts come through here */	\ +	SET_SCRATCH0(r13);	/* save r13 */		\ +	EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ +				       EXC_HV, KVMTEST, vec) +  /* This associate vector numbers with bits in paca->irq_happened */  #define SOFTEN_VALUE_0x500	PACA_IRQ_EE  #define SOFTEN_VALUE_0x502	PACA_IRQ_EE @@ -257,6 +325,9 @@ label##_hv:						\  	KVMTEST(vec);							\  	_SOFTEN_TEST(EXC_STD, vec) +#define SOFTEN_NOTEST_PR(vec)		_SOFTEN_TEST(EXC_STD, vec) +#define SOFTEN_NOTEST_HV(vec)		_SOFTEN_TEST(EXC_HV, vec) +  #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)		\  	HMT_MEDIUM;							\  	SET_SCRATCH0(r13);    /* save r13 */				\ @@ -279,6 +350,28 @@ label##_hv:								\  	_MASKABLE_EXCEPTION_PSERIES(vec, label,				\  				    EXC_HV, SOFTEN_TEST_HV) +#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)	\ +	HMT_MEDIUM;							\ +	SET_SCRATCH0(r13);    /* save r13 */				\ +	__EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec);		\ +	EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h); +#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)	\ +	__MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) + +#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label)		\ +	. = loc;							\ +	.globl label##_relon_pSeries;					\ +label##_relon_pSeries:							\ +	_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label,			\ +					  EXC_STD, SOFTEN_NOTEST_PR) + +#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label)			\ +	. = loc;							\ +	.globl label##_relon_hv;					\ +label##_relon_hv:							\ +	_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label,			\ +					  EXC_HV, SOFTEN_NOTEST_HV) +  /*   * Our exception common code can be passed various "additions"   * to specify the behaviour of interrupts, whether to kick the diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h index ad0b751b0d78..973cc3be011b 100644 --- a/arch/powerpc/include/asm/firmware.h +++ b/arch/powerpc/include/asm/firmware.h @@ -49,6 +49,7 @@  #define FW_FEATURE_XCMO		ASM_CONST(0x0000000008000000)  #define FW_FEATURE_OPAL		ASM_CONST(0x0000000010000000)  #define FW_FEATURE_OPALv2	ASM_CONST(0x0000000020000000) +#define FW_FEATURE_SET_MODE	ASM_CONST(0x0000000040000000)  #ifndef __ASSEMBLY__ @@ -62,7 +63,8 @@ enum {  		FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN |  		FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR |  		FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | -		FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO, +		FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO | +		FW_FEATURE_SET_MODE,  	FW_FEATURE_PSERIES_ALWAYS = 0,  	FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2,  	FW_FEATURE_POWERNV_ALWAYS = 0, diff --git a/arch/powerpc/include/asm/fsl_gtm.h b/arch/powerpc/include/asm/fsl_gtm.h index 8e8c9b5032d3..3b05808f9caa 100644 --- a/arch/powerpc/include/asm/fsl_gtm.h +++ b/arch/powerpc/include/asm/fsl_gtm.h @@ -1,7 +1,7 @@  /*   * Freescale General-purpose Timers Module   * - * Copyright (c) Freescale Semicondutor, Inc. 2006. + * Copyright 2006 Freescale Semiconductor, Inc.   *               Shlomi Gridish <[email protected]>   *               Jerry Huang <[email protected]>   * Copyright (c) MontaVista Software, Inc. 2008. diff --git a/arch/powerpc/include/asm/fsl_guts.h b/arch/powerpc/include/asm/fsl_guts.h index dd5ba2c22771..77ced0b3d81d 100644 --- a/arch/powerpc/include/asm/fsl_guts.h +++ b/arch/powerpc/include/asm/fsl_guts.h @@ -71,7 +71,9 @@ struct ccsr_guts {  	u8	res0c4[0x224 - 0xc4];  	__be32  iodelay1;	/* 0x.0224 - IO delay control register 1 */  	__be32  iodelay2;	/* 0x.0228 - IO delay control register 2 */ -	u8	res22c[0x800 - 0x22c]; +	u8	res22c[0x604 - 0x22c]; +	__be32	pamubypenr; 	/* 0x.604 - PAMU bypass enable register */ +	u8	res608[0x800 - 0x608];  	__be32	clkdvdr;	/* 0x.0800 - Clock Divide Register */  	u8	res804[0x900 - 0x804];  	__be32	ircr;		/* 0x.0900 - Infrared Control Register */ diff --git a/arch/powerpc/include/asm/fsl_hcalls.h b/arch/powerpc/include/asm/fsl_hcalls.h index 922d9b5fe3d5..3abb58394da4 100644 --- a/arch/powerpc/include/asm/fsl_hcalls.h +++ b/arch/powerpc/include/asm/fsl_hcalls.h @@ -96,7 +96,7 @@ static inline unsigned int fh_send_nmi(unsigned int vcpu_mask)  	r11 = FH_HCALL_TOKEN(FH_SEND_NMI);  	r3 = vcpu_mask; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -151,7 +151,7 @@ static inline unsigned int fh_partition_get_dtprop(int handle,  	r9 = (uint32_t)propvalue_addr;  	r10 = *propvalue_len; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11),  		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),  		  "+r" (r8), "+r" (r9), "+r" (r10) @@ -205,7 +205,7 @@ static inline unsigned int fh_partition_set_dtprop(int handle,  	r9 = (uint32_t)propvalue_addr;  	r10 = propvalue_len; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11),  		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),  		  "+r" (r8), "+r" (r9), "+r" (r10) @@ -229,7 +229,7 @@ static inline unsigned int fh_partition_restart(unsigned int partition)  	r11 = FH_HCALL_TOKEN(FH_PARTITION_RESTART);  	r3 = partition; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -262,7 +262,7 @@ static inline unsigned int fh_partition_get_status(unsigned int partition,  	r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_STATUS);  	r3 = partition; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -295,7 +295,7 @@ static inline unsigned int fh_partition_start(unsigned int partition,  	r4 = entry_point;  	r5 = load; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5)  		: : EV_HCALL_CLOBBERS3  	); @@ -317,7 +317,7 @@ static inline unsigned int fh_partition_stop(unsigned int partition)  	r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP);  	r3 = partition; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -376,7 +376,7 @@ static inline unsigned int fh_partition_memcpy(unsigned int source,  #endif  	r7 = count; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11),  		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7)  		: : EV_HCALL_CLOBBERS5 @@ -399,7 +399,7 @@ static inline unsigned int fh_dma_enable(unsigned int liodn)  	r11 = FH_HCALL_TOKEN(FH_DMA_ENABLE);  	r3 = liodn; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -421,7 +421,7 @@ static inline unsigned int fh_dma_disable(unsigned int liodn)  	r11 = FH_HCALL_TOKEN(FH_DMA_DISABLE);  	r3 = liodn; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -447,7 +447,7 @@ static inline unsigned int fh_vmpic_get_msir(unsigned int interrupt,  	r11 = FH_HCALL_TOKEN(FH_VMPIC_GET_MSIR);  	r3 = interrupt; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "=r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -469,7 +469,7 @@ static inline unsigned int fh_system_reset(void)  	r11 = FH_HCALL_TOKEN(FH_SYSTEM_RESET); -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "=r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -506,7 +506,7 @@ static inline unsigned int fh_err_get_info(int queue, uint32_t *bufsize,  	r6 = addr_lo;  	r7 = peek; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6),  		  "+r" (r7)  		: : EV_HCALL_CLOBBERS5 @@ -542,7 +542,7 @@ static inline unsigned int fh_get_core_state(unsigned int handle,  	r3 = handle;  	r4 = vcpu; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -572,7 +572,7 @@ static inline unsigned int fh_enter_nap(unsigned int handle, unsigned int vcpu)  	r3 = handle;  	r4 = vcpu; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -597,7 +597,7 @@ static inline unsigned int fh_exit_nap(unsigned int handle, unsigned int vcpu)  	r3 = handle;  	r4 = vcpu; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3), "+r" (r4)  		: : EV_HCALL_CLOBBERS2  	); @@ -618,7 +618,7 @@ static inline unsigned int fh_claim_device(unsigned int handle)  	r11 = FH_HCALL_TOKEN(FH_CLAIM_DEVICE);  	r3 = handle; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); @@ -645,7 +645,7 @@ static inline unsigned int fh_partition_stop_dma(unsigned int handle)  	r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP_DMA);  	r3 = handle; -	__asm__ __volatile__ ("sc 1" +	asm volatile("bl	epapr_hypercall_start"  		: "+r" (r11), "+r" (r3)  		: : EV_HCALL_CLOBBERS1  	); diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 7a867065db79..0975e5c0bb19 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h @@ -267,7 +267,8 @@  #define H_RANDOM		0x300  #define H_COP			0x304  #define H_GET_MPP_X		0x314 -#define MAX_HCALL_OPCODE	H_GET_MPP_X +#define H_SET_MODE		0x31C +#define MAX_HCALL_OPCODE	H_SET_MODE  #ifndef __ASSEMBLY__ @@ -355,6 +356,26 @@ struct hvcall_mpp_x_data {  int h_get_mpp_x(struct hvcall_mpp_x_data *mpp_x_data); +static inline unsigned int get_longbusy_msecs(int longbusy_rc) +{ +	switch (longbusy_rc) { +	case H_LONG_BUSY_ORDER_1_MSEC: +		return 1; +	case H_LONG_BUSY_ORDER_10_MSEC: +		return 10; +	case H_LONG_BUSY_ORDER_100_MSEC: +		return 100; +	case H_LONG_BUSY_ORDER_1_SEC: +		return 1000; +	case H_LONG_BUSY_ORDER_10_SEC: +		return 10000; +	case H_LONG_BUSY_ORDER_100_SEC: +		return 100000; +	default: +		return 1; +	} +} +  #ifdef CONFIG_PPC_PSERIES  extern int CMO_PrPSP;  extern int CMO_SecPSP; diff --git a/arch/powerpc/include/asm/immap_qe.h b/arch/powerpc/include/asm/immap_qe.h index 61e8490786b8..bedbff891423 100644 --- a/arch/powerpc/include/asm/immap_qe.h +++ b/arch/powerpc/include/asm/immap_qe.h @@ -3,7 +3,7 @@   * The Internal Memory Map for devices with QE on them. This   * is the superset of all QE devices (8360, etc.). - * Copyright (C) 2006. Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006. Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index 76fdcfef0889..aabcdba8f6b0 100644 --- a/arch/powerpc/include/asm/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h @@ -118,6 +118,7 @@  #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */  #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */ +#define RESUME_FLAG_ARCH1	(1<<2)  #define RESUME_GUEST            0  #define RESUME_GUEST_NV         RESUME_FLAG_NV diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 7aefdb3e1ce4..5a56e1c5f851 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h @@ -81,6 +81,8 @@ struct kvmppc_vcpu_book3s {  	u64 sdr1;  	u64 hior;  	u64 msr_mask; +	u64 purr_offset; +	u64 spurr_offset;  #ifdef CONFIG_PPC_BOOK3S_32  	u32 vsid_pool[VSID_POOL_SIZE];  	u32 vsid_next; @@ -157,10 +159,14 @@ extern void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long addr,  extern void kvmppc_unpin_guest_page(struct kvm *kvm, void *addr);  extern long kvmppc_virtmode_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,  			long pte_index, unsigned long pteh, unsigned long ptel); -extern long kvmppc_h_enter(struct kvm_vcpu *vcpu, unsigned long flags, -			long pte_index, unsigned long pteh, unsigned long ptel); +extern long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, +			long pte_index, unsigned long pteh, unsigned long ptel, +			pgd_t *pgdir, bool realmode, unsigned long *idx_ret); +extern long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags, +			unsigned long pte_index, unsigned long avpn, +			unsigned long *hpret);  extern long kvmppc_hv_get_dirty_log(struct kvm *kvm, -			struct kvm_memory_slot *memslot); +			struct kvm_memory_slot *memslot, unsigned long *map);  extern void kvmppc_entry_trampoline(void);  extern void kvmppc_hv_entry_trampoline(void); diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index 0dd1d86d3e31..38bec1dc9928 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h @@ -50,6 +50,15 @@ extern int kvm_hpt_order;		/* order of preallocated HPTs */  #define HPTE_V_HVLOCK	0x40UL  #define HPTE_V_ABSENT	0x20UL +/* + * We use this bit in the guest_rpte field of the revmap entry + * to indicate a modified HPTE. + */ +#define HPTE_GR_MODIFIED	(1ul << 62) + +/* These bits are reserved in the guest view of the HPTE */ +#define HPTE_GR_RESERVED	HPTE_GR_MODIFIED +  static inline long try_lock_hpte(unsigned long *hpte, unsigned long bits)  {  	unsigned long tmp, old; @@ -60,7 +69,7 @@ static inline long try_lock_hpte(unsigned long *hpte, unsigned long bits)  		     "	ori	%0,%0,%4\n"  		     "  stdcx.	%0,0,%2\n"  		     "	beq+	2f\n" -		     "	li	%1,%3\n" +		     "	mr	%1,%3\n"  		     "2:	isync"  		     : "=&r" (tmp), "=&r" (old)  		     : "r" (hpte), "r" (bits), "i" (HPTE_V_HVLOCK) @@ -237,4 +246,26 @@ static inline bool slot_is_aligned(struct kvm_memory_slot *memslot,  	return !(memslot->base_gfn & mask) && !(memslot->npages & mask);  } +/* + * This works for 4k, 64k and 16M pages on POWER7, + * and 4k and 16M pages on PPC970. + */ +static inline unsigned long slb_pgsize_encoding(unsigned long psize) +{ +	unsigned long senc = 0; + +	if (psize > 0x1000) { +		senc = SLB_VSID_L; +		if (psize == 0x10000) +			senc |= SLB_VSID_LP_01; +	} +	return senc; +} + +static inline int is_vrma_hpte(unsigned long hpte_v) +{ +	return (hpte_v & ~0xffffffUL) == +		(HPTE_V_1TB_SEG | (VRMA_VSID << (40 - 16))); +} +  #endif /* __ASM_KVM_BOOK3S_64_H__ */ diff --git a/arch/powerpc/include/asm/kvm_booke_hv_asm.h b/arch/powerpc/include/asm/kvm_booke_hv_asm.h index 30a600fa1b6a..3a79f5325712 100644 --- a/arch/powerpc/include/asm/kvm_booke_hv_asm.h +++ b/arch/powerpc/include/asm/kvm_booke_hv_asm.h @@ -17,6 +17,7 @@   * there are no exceptions for which we fall through directly to   * the normal host handler.   * + * 32-bit host   * Expected inputs (normal exceptions):   *   SCRATCH0 = saved r10   *   r10 = thread struct @@ -33,14 +34,38 @@   *   *(r8 + GPR9) = saved r9   *   *(r8 + GPR10) = saved r10 (r10 not yet clobbered)   *   *(r8 + GPR11) = saved r11 + * + * 64-bit host + * Expected inputs (GEN/GDBELL/DBG/MC exception types): + *  r10 = saved CR + *  r13 = PACA_POINTER + *  *(r13 + PACA_EX##type + EX_R10) = saved r10 + *  *(r13 + PACA_EX##type + EX_R11) = saved r11 + *  SPRN_SPRG_##type##_SCRATCH = saved r13 + * +  * Expected inputs (CRIT exception type): + *  r10 = saved CR + *  r13 = PACA_POINTER + *  *(r13 + PACA_EX##type + EX_R10) = saved r10 + *  *(r13 + PACA_EX##type + EX_R11) = saved r11 + *  *(r13 + PACA_EX##type + EX_R13) = saved r13 + * + * Expected inputs (TLB exception type): + *  r10 = saved CR + *  r13 = PACA_POINTER + *  *(r13 + PACA_EX##type + EX_TLB_R10) = saved r10 + *  *(r13 + PACA_EX##type + EX_TLB_R11) = saved r11 + *  SPRN_SPRG_GEN_SCRATCH = saved r13 + * + * Only the bolted version of TLB miss exception handlers is supported now.   */  .macro DO_KVM intno srr1  #ifdef CONFIG_KVM_BOOKE_HV  BEGIN_FTR_SECTION  	mtocrf	0x80, r11	/* check MSR[GS] without clobbering reg */ -	bf	3, kvmppc_resume_\intno\()_\srr1 +	bf	3, 1975f  	b	kvmppc_handler_\intno\()_\srr1 -kvmppc_resume_\intno\()_\srr1: +1975:  END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)  #endif  .endm diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 28e8f5e5c63e..ca9bf459db6a 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -46,7 +46,7 @@  #define KVM_COALESCED_MMIO_PAGE_OFFSET 1  #endif -#ifdef CONFIG_KVM_BOOK3S_64_HV +#if !defined(CONFIG_KVM_440)  #include <linux/mmu_notifier.h>  #define KVM_ARCH_WANT_MMU_NOTIFIER @@ -204,7 +204,7 @@ struct revmap_entry {  };  /* - * We use the top bit of each memslot->rmap entry as a lock bit, + * We use the top bit of each memslot->arch.rmap entry as a lock bit,   * and bit 32 as a present flag.  The bottom 32 bits are the   * index in the guest HPT of a HPTE that points to the page.   */ @@ -215,14 +215,17 @@ struct revmap_entry {  #define KVMPPC_RMAP_PRESENT	0x100000000ul  #define KVMPPC_RMAP_INDEX	0xfffffffful -/* Low-order bits in kvm->arch.slot_phys[][] */ +/* Low-order bits in memslot->arch.slot_phys[] */  #define KVMPPC_PAGE_ORDER_MASK	0x1f  #define KVMPPC_PAGE_NO_CACHE	HPTE_R_I	/* 0x20 */  #define KVMPPC_PAGE_WRITETHRU	HPTE_R_W	/* 0x40 */  #define KVMPPC_GOT_PAGE		0x80  struct kvm_arch_memory_slot { +#ifdef CONFIG_KVM_BOOK3S_64_HV  	unsigned long *rmap; +	unsigned long *slot_phys; +#endif /* CONFIG_KVM_BOOK3S_64_HV */  };  struct kvm_arch { @@ -243,12 +246,12 @@ struct kvm_arch {  	int using_mmu_notifiers;  	u32 hpt_order;  	atomic_t vcpus_running; +	u32 online_vcores;  	unsigned long hpt_npte;  	unsigned long hpt_mask; +	atomic_t hpte_mod_interest;  	spinlock_t slot_phys_lock; -	unsigned long *slot_phys[KVM_MEM_SLOTS_NUM]; -	int slot_npages[KVM_MEM_SLOTS_NUM]; -	unsigned short last_vcpu[NR_CPUS]; +	cpumask_t need_tlb_flush;  	struct kvmppc_vcore *vcores[KVM_MAX_VCORES];  	struct kvmppc_linear_info *hpt_li;  #endif /* CONFIG_KVM_BOOK3S_64_HV */ @@ -273,6 +276,7 @@ struct kvmppc_vcore {  	int nap_count;  	int napping_threads;  	u16 pcpu; +	u16 last_cpu;  	u8 vcore_state;  	u8 in_guest;  	struct list_head runnable_threads; @@ -288,9 +292,10 @@ struct kvmppc_vcore {  /* Values for vcore_state */  #define VCORE_INACTIVE	0 -#define VCORE_RUNNING	1 -#define VCORE_EXITING	2 -#define VCORE_SLEEPING	3 +#define VCORE_SLEEPING	1 +#define VCORE_STARTING	2 +#define VCORE_RUNNING	3 +#define VCORE_EXITING	4  /*   * Struct used to manage memory for a virtual processor area @@ -346,6 +351,27 @@ struct kvmppc_slb {  	bool class	: 1;  }; +# ifdef CONFIG_PPC_FSL_BOOK3E +#define KVMPPC_BOOKE_IAC_NUM	2 +#define KVMPPC_BOOKE_DAC_NUM	2 +# else +#define KVMPPC_BOOKE_IAC_NUM	4 +#define KVMPPC_BOOKE_DAC_NUM	2 +# endif +#define KVMPPC_BOOKE_MAX_IAC	4 +#define KVMPPC_BOOKE_MAX_DAC	2 + +struct kvmppc_booke_debug_reg { +	u32 dbcr0; +	u32 dbcr1; +	u32 dbcr2; +#ifdef CONFIG_KVM_E500MC +	u32 dbcr4; +#endif +	u64 iac[KVMPPC_BOOKE_MAX_IAC]; +	u64 dac[KVMPPC_BOOKE_MAX_DAC]; +}; +  struct kvm_vcpu_arch {  	ulong host_stack;  	u32 host_pid; @@ -380,13 +406,18 @@ struct kvm_vcpu_arch {  	u32 host_mas4;  	u32 host_mas6;  	u32 shadow_epcr; -	u32 epcr;  	u32 shadow_msrp;  	u32 eplc;  	u32 epsc;  	u32 oldpir;  #endif +#if defined(CONFIG_BOOKE) +#if defined(CONFIG_KVM_BOOKE_HV) || defined(CONFIG_64BIT) +	u32 epcr; +#endif +#endif +  #ifdef CONFIG_PPC_BOOK3S  	/* For Gekko paired singles */  	u32 qpr[32]; @@ -440,8 +471,6 @@ struct kvm_vcpu_arch {  	u32 ccr0;  	u32 ccr1; -	u32 dbcr0; -	u32 dbcr1;  	u32 dbsr;  	u64 mmcr[3]; @@ -471,9 +500,12 @@ struct kvm_vcpu_arch {  	ulong fault_esr;  	ulong queued_dear;  	ulong queued_esr; +	spinlock_t wdt_lock; +	struct timer_list wdt_timer;  	u32 tlbcfg[4];  	u32 mmucfg;  	u32 epr; +	struct kvmppc_booke_debug_reg dbg_reg;  #endif  	gpa_t paddr_accessed;  	gva_t vaddr_accessed; @@ -486,6 +518,7 @@ struct kvm_vcpu_arch {  	u8 osi_needed;  	u8 osi_enabled;  	u8 papr_enabled; +	u8 watchdog_enabled;  	u8 sane;  	u8 cpu_type;  	u8 hcall_needed; @@ -497,7 +530,6 @@ struct kvm_vcpu_arch {  	u64 dec_jiffies;  	u64 dec_expires;  	unsigned long pending_exceptions; -	u16 last_cpu;  	u8 ceded;  	u8 prodded;  	u32 last_inst; @@ -534,13 +566,17 @@ struct kvm_vcpu_arch {  	unsigned long dtl_index;  	u64 stolen_logged;  	struct kvmppc_vpa slb_shadow; + +	spinlock_t tbacct_lock; +	u64 busy_stolen; +	u64 busy_preempt;  #endif  };  /* Values for vcpu->arch.state */ -#define KVMPPC_VCPU_STOPPED		0 -#define KVMPPC_VCPU_BUSY_IN_HOST	1 -#define KVMPPC_VCPU_RUNNABLE		2 +#define KVMPPC_VCPU_NOTREADY		0 +#define KVMPPC_VCPU_RUNNABLE		1 +#define KVMPPC_VCPU_BUSY_IN_HOST	2  /* Values for vcpu->arch.io_gpr */  #define KVM_MMIO_REG_MASK	0x001f diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h index 9365860fb7f6..2b119654b4c1 100644 --- a/arch/powerpc/include/asm/kvm_para.h +++ b/arch/powerpc/include/asm/kvm_para.h @@ -21,7 +21,6 @@  #include <uapi/asm/kvm_para.h> -  #ifdef CONFIG_KVM_GUEST  #include <linux/of.h> @@ -55,7 +54,7 @@ static unsigned long kvm_hypercall(unsigned long *in,  				   unsigned long *out,  				   unsigned long nr)  { -	return HC_EV_UNIMPLEMENTED; +	return EV_UNIMPLEMENTED;  }  #endif @@ -66,7 +65,7 @@ static inline long kvm_hypercall0_1(unsigned int nr, unsigned long *r2)  	unsigned long out[8];  	unsigned long r; -	r = kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	r = kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  	*r2 = out[0];  	return r; @@ -77,7 +76,7 @@ static inline long kvm_hypercall0(unsigned int nr)  	unsigned long in[8];  	unsigned long out[8]; -	return kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	return kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  }  static inline long kvm_hypercall1(unsigned int nr, unsigned long p1) @@ -86,7 +85,7 @@ static inline long kvm_hypercall1(unsigned int nr, unsigned long p1)  	unsigned long out[8];  	in[0] = p1; -	return kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	return kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  }  static inline long kvm_hypercall2(unsigned int nr, unsigned long p1, @@ -97,7 +96,7 @@ static inline long kvm_hypercall2(unsigned int nr, unsigned long p1,  	in[0] = p1;  	in[1] = p2; -	return kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	return kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  }  static inline long kvm_hypercall3(unsigned int nr, unsigned long p1, @@ -109,7 +108,7 @@ static inline long kvm_hypercall3(unsigned int nr, unsigned long p1,  	in[0] = p1;  	in[1] = p2;  	in[2] = p3; -	return kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	return kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  }  static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, @@ -123,7 +122,7 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,  	in[1] = p2;  	in[2] = p3;  	in[3] = p4; -	return kvm_hypercall(in, out, nr | HC_VENDOR_KVM); +	return kvm_hypercall(in, out, KVM_HCALL_TOKEN(nr));  } diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index e006f0bdea95..572aa7530619 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -28,6 +28,7 @@  #include <linux/types.h>  #include <linux/kvm_types.h>  #include <linux/kvm_host.h> +#include <linux/bug.h>  #ifdef CONFIG_PPC_BOOK3S  #include <asm/kvm_book3s.h>  #else @@ -68,6 +69,8 @@ extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu);  extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb);  extern void kvmppc_decrementer_func(unsigned long data);  extern int kvmppc_sanity_check(struct kvm_vcpu *vcpu); +extern int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu); +extern void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu);  /* Core-specific hooks */ @@ -104,6 +107,7 @@ extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,                                         struct kvm_interrupt *irq);  extern void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu,                                           struct kvm_interrupt *irq); +extern void kvmppc_core_flush_tlb(struct kvm_vcpu *vcpu);  extern int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,                                    unsigned int op, int *advance); @@ -111,6 +115,7 @@ extern int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn,  				     ulong val);  extern int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn,  				     ulong *val); +extern int kvmppc_core_check_requests(struct kvm_vcpu *vcpu);  extern int kvmppc_booke_init(void);  extern void kvmppc_booke_exit(void); @@ -139,16 +144,28 @@ extern struct kvmppc_linear_info *kvm_alloc_hpt(void);  extern void kvm_release_hpt(struct kvmppc_linear_info *li);  extern int kvmppc_core_init_vm(struct kvm *kvm);  extern void kvmppc_core_destroy_vm(struct kvm *kvm); +extern void kvmppc_core_free_memslot(struct kvm_memory_slot *free, +				     struct kvm_memory_slot *dont); +extern int kvmppc_core_create_memslot(struct kvm_memory_slot *slot, +				      unsigned long npages);  extern int kvmppc_core_prepare_memory_region(struct kvm *kvm, +				struct kvm_memory_slot *memslot,  				struct kvm_userspace_memory_region *mem);  extern void kvmppc_core_commit_memory_region(struct kvm *kvm, -				struct kvm_userspace_memory_region *mem); +				struct kvm_userspace_memory_region *mem, +				struct kvm_memory_slot old);  extern int kvm_vm_ioctl_get_smmu_info(struct kvm *kvm,  				      struct kvm_ppc_smmu_info *info); +extern void kvmppc_core_flush_memslot(struct kvm *kvm, +				      struct kvm_memory_slot *memslot);  extern int kvmppc_bookehv_init(void);  extern void kvmppc_bookehv_exit(void); +extern int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu); + +extern int kvm_vm_ioctl_get_htab_fd(struct kvm *kvm, struct kvm_get_htab_fd *); +  /*   * Cuts out inst bits with ordering according to spec.   * That means the leftmost bit is zero. All given bits are included. @@ -182,6 +199,41 @@ static inline u32 kvmppc_set_field(u64 inst, int msb, int lsb, int value)  	return r;  } +union kvmppc_one_reg { +	u32	wval; +	u64	dval; +	vector128 vval; +	u64	vsxval[2]; +	struct { +		u64	addr; +		u64	length; +	}	vpaval; +}; + +#define one_reg_size(id)	\ +	(1ul << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) + +#define get_reg_val(id, reg)	({		\ +	union kvmppc_one_reg __u;		\ +	switch (one_reg_size(id)) {		\ +	case 4: __u.wval = (reg); break;	\ +	case 8: __u.dval = (reg); break;	\ +	default: BUG();				\ +	}					\ +	__u;					\ +}) + + +#define set_reg_val(id, val)	({		\ +	u64 __v;				\ +	switch (one_reg_size(id)) {		\ +	case 4: __v = (val).wval; break;	\ +	case 8: __v = (val).dval; break;	\ +	default: BUG();				\ +	}					\ +	__v;					\ +}) +  void kvmppc_core_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);  int kvmppc_core_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs); @@ -190,6 +242,8 @@ int kvmppc_set_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);  int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg);  int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg); +int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id, union kvmppc_one_reg *); +int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id, union kvmppc_one_reg *);  void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 pid); @@ -230,5 +284,36 @@ static inline void kvmppc_mmu_flush_icache(pfn_t pfn)  	}  } +/* Please call after prepare_to_enter. This function puts the lazy ee state +   back to normal mode, without actually enabling interrupts. */ +static inline void kvmppc_lazy_ee_enable(void) +{ +#ifdef CONFIG_PPC64 +	/* Only need to enable IRQs by hard enabling them after this */ +	local_paca->irq_happened = 0; +	local_paca->soft_enabled = 1; +#endif +} + +static inline ulong kvmppc_get_ea_indexed(struct kvm_vcpu *vcpu, int ra, int rb) +{ +	ulong ea; +	ulong msr_64bit = 0; + +	ea = kvmppc_get_gpr(vcpu, rb); +	if (ra) +		ea += kvmppc_get_gpr(vcpu, ra); + +#if defined(CONFIG_PPC_BOOK3E_64) +	msr_64bit = MSR_CM; +#elif defined(CONFIG_PPC_BOOK3S_64) +	msr_64bit = MSR_SF; +#endif + +	if (!(vcpu->arch.shared->msr & msr_64bit)) +		ea = (uint32_t)ea; + +	return ea; +}  #endif /* __POWERPC_KVM_PPC_H__ */ diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index c4231973edd3..19d9d96eb8d3 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h @@ -166,9 +166,6 @@ struct machdep_calls {  						unsigned long size,  						pgprot_t vma_prot); -	/* Idle loop for this platform, leave empty for default idle loop */ -	void		(*idle_loop)(void); -  	/*  	 * Function for waiting for work with reduced power in idle loop;  	 * called with interrupts disabled. @@ -320,28 +317,28 @@ static inline void log_error(char *buf, unsigned int err_type, int fatal)  		ppc_md.log_error(buf, err_type, fatal);  } -#define __define_machine_initcall(mach,level,fn,id) \ +#define __define_machine_initcall(mach, fn, id) \  	static int __init __machine_initcall_##mach##_##fn(void) { \  		if (machine_is(mach)) return fn(); \  		return 0; \  	} \ -	__define_initcall(level,__machine_initcall_##mach##_##fn,id); - -#define machine_core_initcall(mach,fn)		__define_machine_initcall(mach,"1",fn,1) -#define machine_core_initcall_sync(mach,fn)	__define_machine_initcall(mach,"1s",fn,1s) -#define machine_postcore_initcall(mach,fn)	__define_machine_initcall(mach,"2",fn,2) -#define machine_postcore_initcall_sync(mach,fn)	__define_machine_initcall(mach,"2s",fn,2s) -#define machine_arch_initcall(mach,fn)		__define_machine_initcall(mach,"3",fn,3) -#define machine_arch_initcall_sync(mach,fn)	__define_machine_initcall(mach,"3s",fn,3s) -#define machine_subsys_initcall(mach,fn)	__define_machine_initcall(mach,"4",fn,4) -#define machine_subsys_initcall_sync(mach,fn)	__define_machine_initcall(mach,"4s",fn,4s) -#define machine_fs_initcall(mach,fn)		__define_machine_initcall(mach,"5",fn,5) -#define machine_fs_initcall_sync(mach,fn)	__define_machine_initcall(mach,"5s",fn,5s) -#define machine_rootfs_initcall(mach,fn)	__define_machine_initcall(mach,"rootfs",fn,rootfs) -#define machine_device_initcall(mach,fn)	__define_machine_initcall(mach,"6",fn,6) -#define machine_device_initcall_sync(mach,fn)	__define_machine_initcall(mach,"6s",fn,6s) -#define machine_late_initcall(mach,fn)		__define_machine_initcall(mach,"7",fn,7) -#define machine_late_initcall_sync(mach,fn)	__define_machine_initcall(mach,"7s",fn,7s) +	__define_initcall(__machine_initcall_##mach##_##fn, id); + +#define machine_core_initcall(mach, fn)		__define_machine_initcall(mach, fn, 1) +#define machine_core_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 1s) +#define machine_postcore_initcall(mach, fn)	__define_machine_initcall(mach, fn, 2) +#define machine_postcore_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 2s) +#define machine_arch_initcall(mach, fn)		__define_machine_initcall(mach, fn, 3) +#define machine_arch_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 3s) +#define machine_subsys_initcall(mach, fn)	__define_machine_initcall(mach, fn, 4) +#define machine_subsys_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 4s) +#define machine_fs_initcall(mach, fn)		__define_machine_initcall(mach, fn, 5) +#define machine_fs_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 5s) +#define machine_rootfs_initcall(mach, fn)	__define_machine_initcall(mach, fn, rootfs) +#define machine_device_initcall(mach, fn)	__define_machine_initcall(mach, fn, 6) +#define machine_device_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 6s) +#define machine_late_initcall(mach, fn)		__define_machine_initcall(mach, fn, 7) +#define machine_late_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 7s)  #endif /* __KERNEL__ */  #endif /* _ASM_POWERPC_MACHDEP_H */ diff --git a/arch/powerpc/include/asm/mmu-book3e.h b/arch/powerpc/include/asm/mmu-book3e.h index eeabcdbc30f7..99d43e0c1e4a 100644 --- a/arch/powerpc/include/asm/mmu-book3e.h +++ b/arch/powerpc/include/asm/mmu-book3e.h @@ -59,7 +59,7 @@  #define MAS1_TSIZE_SHIFT	7  #define MAS1_TSIZE(x)		(((x) << MAS1_TSIZE_SHIFT) & MAS1_TSIZE_MASK) -#define MAS2_EPN		0xFFFFF000 +#define MAS2_EPN		(~0xFFFUL)  #define MAS2_X0			0x00000040  #define MAS2_X1			0x00000020  #define MAS2_W			0x00000010 diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 9673f73eb8db..2fdb47a19efd 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h @@ -121,6 +121,16 @@ extern char initial_stab[];  #define PP_RXRX 3	/* Supervisor read,       User read */  #define PP_RXXX	(HPTE_R_PP0 | 2)	/* Supervisor read, user none */ +/* Fields for tlbiel instruction in architecture 2.06 */ +#define TLBIEL_INVAL_SEL_MASK	0xc00	/* invalidation selector */ +#define  TLBIEL_INVAL_PAGE	0x000	/* invalidate a single page */ +#define  TLBIEL_INVAL_SET_LPID	0x800	/* invalidate a set for current LPID */ +#define  TLBIEL_INVAL_SET	0xc00	/* invalidate a set for all LPIDs */ +#define TLBIEL_INVAL_SET_MASK	0xfff000	/* set number to inval. */ +#define TLBIEL_INVAL_SET_SHIFT	12 + +#define POWER7_TLB_SETS		128	/* # sets in POWER7 TLB */ +  #ifndef __ASSEMBLY__  struct hash_pte { diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index 5e38eedea218..691fd8aca939 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h @@ -101,6 +101,7 @@  #define MMU_FTRS_POWER5		MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE  #define MMU_FTRS_POWER6		MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE  #define MMU_FTRS_POWER7		MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE +#define MMU_FTRS_POWER8		MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE  #define MMU_FTRS_CELL		MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \  				MMU_FTR_CI_LARGE_PAGE  #define MMU_FTRS_PA6T		MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ diff --git a/arch/powerpc/include/asm/oprofile_impl.h b/arch/powerpc/include/asm/oprofile_impl.h index 639dc96077ab..d697b08994c9 100644 --- a/arch/powerpc/include/asm/oprofile_impl.h +++ b/arch/powerpc/include/asm/oprofile_impl.h @@ -34,7 +34,7 @@ struct op_system_config {  	unsigned long mmcra;  #ifdef CONFIG_OPROFILE_CELL  	/* Register for oprofile user tool to check cell kernel profiling -	 * suport. +	 * support.  	 */  	unsigned long cell_support;  #endif diff --git a/arch/powerpc/include/asm/pSeries_reconfig.h b/arch/powerpc/include/asm/pSeries_reconfig.h deleted file mode 100644 index c07edfe98b98..000000000000 --- a/arch/powerpc/include/asm/pSeries_reconfig.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _PPC64_PSERIES_RECONFIG_H -#define _PPC64_PSERIES_RECONFIG_H -#ifdef __KERNEL__ - -#include <linux/notifier.h> - -/* - * Use this API if your code needs to know about OF device nodes being - * added or removed on pSeries systems. - */ - -#define PSERIES_RECONFIG_ADD		0x0001 -#define PSERIES_RECONFIG_REMOVE		0x0002 -#define PSERIES_DRCONF_MEM_ADD		0x0003 -#define PSERIES_DRCONF_MEM_REMOVE	0x0004 -#define PSERIES_UPDATE_PROPERTY		0x0005 - -/** - * pSeries_reconfig_notify - Notifier value structure for OFDT property updates - * - * @node: Device tree node which owns the property being updated - * @property: Updated property - */ -struct pSeries_reconfig_prop_update { -	struct device_node *node; -	struct property *property; -}; - -#ifdef CONFIG_PPC_PSERIES -extern int pSeries_reconfig_notifier_register(struct notifier_block *); -extern void pSeries_reconfig_notifier_unregister(struct notifier_block *); -extern int pSeries_reconfig_notify(unsigned long action, void *p); -/* Not the best place to put this, will be fixed when we move some - * of the rtas suspend-me stuff to pseries */ -extern void pSeries_coalesce_init(void); -#else /* !CONFIG_PPC_PSERIES */ -static inline int pSeries_reconfig_notifier_register(struct notifier_block *nb) -{ -	return 0; -} -static inline void pSeries_reconfig_notifier_unregister(struct notifier_block *nb) { } -static inline void pSeries_coalesce_init(void) { } -#endif /* CONFIG_PPC_PSERIES */ - - -#endif /* __KERNEL__ */ -#endif /* _PPC64_PSERIES_RECONFIG_H */ diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 5f73ce63fcae..51fb00a20d7e 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -1,5 +1,5 @@  /* - * Copyright 2009 Freescale Semicondutor, Inc. + * Copyright 2009 Freescale Semiconductor, Inc.   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License @@ -86,6 +86,7 @@  #define PPC_INST_DCBA_MASK		0xfc0007fe  #define PPC_INST_DCBAL			0x7c2005ec  #define PPC_INST_DCBZL			0x7c2007ec +#define PPC_INST_ICBT			0x7c00002c  #define PPC_INST_ISEL			0x7c00001e  #define PPC_INST_ISEL_MASK		0xfc00003e  #define PPC_INST_LDARX			0x7c0000a8 @@ -168,9 +169,12 @@  #define PPC_INST_AND			0x7c000038  #define PPC_INST_ANDDOT			0x7c000039  #define PPC_INST_OR			0x7c000378 +#define PPC_INST_XOR			0x7c000278  #define PPC_INST_ANDI			0x70000000  #define PPC_INST_ORI			0x60000000  #define PPC_INST_ORIS			0x64000000 +#define PPC_INST_XORI			0x68000000 +#define PPC_INST_XORIS			0x6c000000  #define PPC_INST_NEG			0x7c0000d0  #define PPC_INST_BRANCH			0x48000000  #define PPC_INST_BRANCH_COND		0x40800000 @@ -198,6 +202,7 @@  #define __PPC_MB(s)	(((s) & 0x1f) << 6)  #define __PPC_ME(s)	(((s) & 0x1f) << 1)  #define __PPC_BI(s)	(((s) & 0x1f) << 16) +#define __PPC_CT(t)	(((t) & 0x0f) << 21)  /*   * Only use the larx hint bit on 64bit CPUs. e500v1/v2 based CPUs will treat a @@ -260,6 +265,8 @@  					__PPC_RS(t) | __PPC_RA0(a) | __PPC_RB(b))  #define PPC_SLBFEE_DOT(t, b)	stringify_in_c(.long PPC_INST_SLBFEE | \  					__PPC_RT(t) | __PPC_RB(b)) +#define PPC_ICBT(c,a,b)		stringify_in_c(.long PPC_INST_ICBT | \ +				       __PPC_CT(c) | __PPC_RA0(a) | __PPC_RB(b))  /* PASemi instructions */  #define LBZCIX(t,a,b)		stringify_in_c(.long PPC_INST_LBZCIX | \  				       __PPC_RT(t) | __PPC_RA(a) | __PPC_RB(b)) diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h index b5c91901e384..99c92d5363e4 100644 --- a/arch/powerpc/include/asm/prom.h +++ b/arch/powerpc/include/asm/prom.h @@ -58,6 +58,22 @@ static inline int of_node_to_nid(struct device_node *device) { return 0; }  extern void of_instantiate_rtc(void); +/* The of_drconf_cell struct defines the layout of the LMB array + * specified in the device tree property + * ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory + */ +struct of_drconf_cell { +	u64	base_addr; +	u32	drc_index; +	u32	reserved; +	u32	aa_index; +	u32	flags; +}; + +#define DRCONF_MEM_ASSIGNED	0x00000008 +#define DRCONF_MEM_AI_INVALID	0x00000040 +#define DRCONF_MEM_RESERVED	0x00000080 +  /* These includes are put at the bottom because they may contain things   * that are overridden by this file.  Ideally they shouldn't be included   * by this file, but there are a bunch of .c files that currently depend diff --git a/arch/powerpc/include/asm/pte-hash64-64k.h b/arch/powerpc/include/asm/pte-hash64-64k.h index eedf427c9124..3e13e23e4fdf 100644 --- a/arch/powerpc/include/asm/pte-hash64-64k.h +++ b/arch/powerpc/include/asm/pte-hash64-64k.h @@ -23,7 +23,7 @@  /* Note the full page bits must be in the same location as for normal   * 4k pages as the same assembly will be used to insert 64K pages - * wether the kernel has CONFIG_PPC_64K_PAGES or not + * whether the kernel has CONFIG_PPC_64K_PAGES or not   */  #define _PAGE_F_SECOND  0x00008000 /* full page: hidx bits */  #define _PAGE_F_GIX     0x00007000 /* full page: hidx bits */ diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h index 229571a49391..32b9bfa0c9bd 100644 --- a/arch/powerpc/include/asm/qe.h +++ b/arch/powerpc/include/asm/qe.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h index f706164b0bd0..25784cc959a0 100644 --- a/arch/powerpc/include/asm/qe_ic.h +++ b/arch/powerpc/include/asm/qe_ic.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index d24c14163966..3d5c9dc8917a 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h @@ -249,6 +249,8 @@  #define   LPCR_RMLS    0x1C000000      /* impl dependent rmo limit sel */  #define	  LPCR_RMLS_SH	(63-37)  #define   LPCR_ILE     0x02000000      /* !HV irqs set MSR:LE */ +#define   LPCR_AIL_0	0x00000000	/* MMU off exception offset 0x0 */ +#define   LPCR_AIL_3	0x01800000	/* MMU on exception offset 0xc00...4xxx */  #define   LPCR_PECE	0x00007000	/* powersave exit cause enable */  #define     LPCR_PECE0	0x00004000	/* ext. exceptions can cause exit */  #define     LPCR_PECE1	0x00002000	/* decrementer can cause exit */ @@ -518,6 +520,7 @@  #define	  SRR1_WS_DEEPER	0x00020000 /* Some resources not maintained */  #define	  SRR1_WS_DEEP		0x00010000 /* All resources maintained */  #define   SRR1_PROGFPE		0x00100000 /* Floating Point Enabled */ +#define   SRR1_PROGILL		0x00080000 /* Illegal instruction */  #define   SRR1_PROGPRIV		0x00040000 /* Privileged instruction */  #define   SRR1_PROGTRAP		0x00020000 /* Trap */  #define   SRR1_PROGADDR		0x00010000 /* SRR0 contains subsequent addr */ @@ -1029,6 +1032,7 @@  #define PVR_970MP	0x0044  #define PVR_970GX	0x0045  #define PVR_POWER7p	0x004A +#define PVR_POWER8	0x004B  #define PVR_BE		0x0070  #define PVR_PA6T	0x0090 diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index 2d916c4982c5..e07e6af5e1ff 100644 --- a/arch/powerpc/include/asm/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h @@ -539,6 +539,13 @@  #define TCR_FIE		0x00800000	/* FIT Interrupt Enable */  #define TCR_ARE		0x00400000	/* Auto Reload Enable */ +#ifdef CONFIG_E500 +#define TCR_GET_WP(tcr)  ((((tcr) & 0xC0000000) >> 30) | \ +			      (((tcr) & 0x1E0000) >> 15)) +#else +#define TCR_GET_WP(tcr)  (((tcr) & 0xC0000000) >> 30) +#endif +  /* Bit definitions for the TSR. */  #define TSR_ENW		0x80000000	/* Enable Next Watchdog */  #define TSR_WIS		0x40000000	/* WDT Interrupt Status */ diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h index 557cff845dee..aef00c675905 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h @@ -353,8 +353,13 @@ static inline int page_is_rtas_user_buf(unsigned long pfn)  		return 1;  	return 0;  } + +/* Not the best place to put pSeries_coalesce_init, will be fixed when we + * move some of the rtas suspend-me stuff to pseries */ +extern void pSeries_coalesce_init(void);  #else  static inline int page_is_rtas_user_buf(unsigned long pfn) { return 0;} +static inline void pSeries_coalesce_init(void) { }  #endif  extern int call_rtas(const char *, int, int, unsigned long *, ...); diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h new file mode 100644 index 000000000000..d3ca85529b8b --- /dev/null +++ b/arch/powerpc/include/asm/setup.h @@ -0,0 +1,29 @@ +#ifndef _ASM_POWERPC_SETUP_H +#define _ASM_POWERPC_SETUP_H + +#include <uapi/asm/setup.h> + +#ifndef __ASSEMBLY__ +extern void ppc_printk_progress(char *s, unsigned short hex); + +extern unsigned int rtas_data; +extern int mem_init_done;	/* set on boot once kmalloc can be called */ +extern int init_bootmem_done;	/* set once bootmem is available */ +extern unsigned long long memory_limit; +extern unsigned long klimit; +extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); + +struct device_node; +extern void note_scsi_host(struct device_node *, void *); + +/* Used in very early kernel initialization. */ +extern unsigned long reloc_offset(void); +extern unsigned long add_reloc_offset(unsigned long); +extern void reloc_got2(unsigned long); + +#define PTRRELOC(x)	((typeof(x)) add_reloc_offset((unsigned long)(x))) + +#endif /* !__ASSEMBLY__ */ + +#endif	/* _ASM_POWERPC_SETUP_H */ + diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h index 189998bb61c4..a101637725a2 100644 --- a/arch/powerpc/include/asm/signal.h +++ b/arch/powerpc/include/asm/signal.h @@ -3,6 +3,4 @@  #include <uapi/asm/signal.h> -struct pt_regs; -#define ptrace_signal_deliver(regs, cookie) do { } while (0)  #endif /* _ASM_POWERPC_SIGNAL_H */ diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index e807e9d8e3f7..5a4e437c238d 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -67,6 +67,14 @@ void generic_mach_cpu_die(void);  void generic_set_cpu_dead(unsigned int cpu);  void generic_set_cpu_up(unsigned int cpu);  int generic_check_cpu_restart(unsigned int cpu); + +extern void inhibit_secondary_onlining(void); +extern void uninhibit_secondary_onlining(void); + +#else /* HOTPLUG_CPU */ +static inline void inhibit_secondary_onlining(void) {} +static inline void uninhibit_secondary_onlining(void) {} +  #endif  #ifdef CONFIG_PPC64 diff --git a/arch/powerpc/include/asm/smu.h b/arch/powerpc/include/asm/smu.h index ae20ce1af4c7..6e909f3e6a46 100644 --- a/arch/powerpc/include/asm/smu.h +++ b/arch/powerpc/include/asm/smu.h @@ -132,7 +132,7 @@    *    * At this point, the OF driver seems to have a limitation on transfer    * sizes of 0xd bytes on reads and 0x5 bytes on writes. I do not know -  * wether this is just an OF limit due to some temporary buffer size +  * whether this is just an OF limit due to some temporary buffer size    * or if this is an SMU imposed limit. This driver has the same limitation    * for now as I use a 0x10 bytes temporary buffer as well    * @@ -236,7 +236,7 @@   *   3 (optional): enable nmi? [0x00 or 0x01]   *   * Returns: - *   If parameter 2 is 0x00 and parameter 3 is not specified, returns wether + *   If parameter 2 is 0x00 and parameter 3 is not specified, returns whether   *   NMI is enabled. Otherwise unknown.   */  #define   SMU_CMD_MISC_df_NMI_OPTION		0x04 diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h index 329db4ec12ca..b5308d3e6d39 100644 --- a/arch/powerpc/include/asm/syscalls.h +++ b/arch/powerpc/include/asm/syscalls.h @@ -17,15 +17,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,  asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,  		unsigned long prot, unsigned long flags,  		unsigned long fd, unsigned long pgoff); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp, -		int __user *parent_tidp, void __user *child_threadptr, -		int __user *child_tidp, int p6, struct pt_regs *regs); -asmlinkage int sys_fork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs); -asmlinkage int sys_vfork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs);  asmlinkage long sys_pipe(int __user *fildes);  asmlinkage long sys_pipe2(int __user *fildes, int flags);  asmlinkage long sys_rt_sigaction(int sig, diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 840838769853..cec8aae5cbf8 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h @@ -164,7 +164,7 @@ COMPAT_SYS_SPU(sched_getscheduler)  SYSCALL_SPU(sched_yield)  COMPAT_SYS_SPU(sched_get_priority_max)  COMPAT_SYS_SPU(sched_get_priority_min) -COMPAT_SYS_SPU(sched_rr_get_interval) +SYSX_SPU(sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval_wrapper,sys_sched_rr_get_interval)  COMPAT_SYS_SPU(nanosleep)  SYSCALL_SPU(mremap)  SYSCALL_SPU(setresuid) diff --git a/arch/powerpc/include/asm/ucc.h b/arch/powerpc/include/asm/ucc.h index 46b09ba6bead..6927ac26516e 100644 --- a/arch/powerpc/include/asm/ucc.h +++ b/arch/powerpc/include/asm/ucc.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/ucc_fast.h b/arch/powerpc/include/asm/ucc_fast.h index 4644c840e2fa..72ea9bab07df 100644 --- a/arch/powerpc/include/asm/ucc_fast.h +++ b/arch/powerpc/include/asm/ucc_fast.h @@ -1,7 +1,7 @@  /*   * Internal header file for UCC FAST unit routines.   * - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/ucc_slow.h b/arch/powerpc/include/asm/ucc_slow.h index cf131ffdb8d1..c44131e68e11 100644 --- a/arch/powerpc/include/asm/ucc_slow.h +++ b/arch/powerpc/include/asm/ucc_slow.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <[email protected]>   * 		Li Yang <[email protected]> diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b3038817b8dc..5a7510e9d09d 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -21,7 +21,6 @@ extern int (*udbg_getc_poll)(void);  extern void udbg_puts(const char *s);  extern int udbg_write(const char *s, int n); -extern int udbg_read(char *buf, int buflen);  extern void register_early_udbg_console(void);  extern void udbg_printf(const char *fmt, ...) diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 921dce6d8445..bcbbe413c606 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h @@ -54,9 +54,12 @@  #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_NEWFSTATAT  #define __ARCH_WANT_COMPAT_SYS_SENDFILE +#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL  #endif  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/powerpc/include/uapi/asm/Kbuild b/arch/powerpc/include/uapi/asm/Kbuild index a33c3c03bb2e..f7bca6370745 100644 --- a/arch/powerpc/include/uapi/asm/Kbuild +++ b/arch/powerpc/include/uapi/asm/Kbuild @@ -7,6 +7,7 @@ header-y += bootx.h  header-y += byteorder.h  header-y += cputable.h  header-y += elf.h +header-y += epapr_hcalls.h  header-y += errno.h  header-y += fcntl.h  header-y += ioctl.h diff --git a/arch/powerpc/include/uapi/asm/epapr_hcalls.h b/arch/powerpc/include/uapi/asm/epapr_hcalls.h new file mode 100644 index 000000000000..7f9c74b46704 --- /dev/null +++ b/arch/powerpc/include/uapi/asm/epapr_hcalls.h @@ -0,0 +1,98 @@ +/* + * ePAPR hcall interface + * + * Copyright 2008-2011 Freescale Semiconductor, Inc. + * + * Author: Timur Tabi <[email protected]> + * + * This file is provided under a dual BSD/GPL license.  When using or + * redistributing this file, you may do so under either license. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + *     * Redistributions of source code must retain the above copyright + *       notice, this list of conditions and the following disclaimer. + *     * Redistributions in binary form must reproduce the above copyright + *       notice, this list of conditions and the following disclaimer in the + *       documentation and/or other materials provided with the distribution. + *     * Neither the name of Freescale Semiconductor nor the + *       names of its contributors may be used to endorse or promote products + *       derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _UAPI_ASM_POWERPC_EPAPR_HCALLS_H +#define _UAPI_ASM_POWERPC_EPAPR_HCALLS_H + +#define EV_BYTE_CHANNEL_SEND		1 +#define EV_BYTE_CHANNEL_RECEIVE		2 +#define EV_BYTE_CHANNEL_POLL		3 +#define EV_INT_SET_CONFIG		4 +#define EV_INT_GET_CONFIG		5 +#define EV_INT_SET_MASK			6 +#define EV_INT_GET_MASK			7 +#define EV_INT_IACK			9 +#define EV_INT_EOI			10 +#define EV_INT_SEND_IPI			11 +#define EV_INT_SET_TASK_PRIORITY	12 +#define EV_INT_GET_TASK_PRIORITY	13 +#define EV_DOORBELL_SEND		14 +#define EV_MSGSND			15 +#define EV_IDLE				16 + +/* vendor ID: epapr */ +#define EV_LOCAL_VENDOR_ID		0	/* for private use */ +#define EV_EPAPR_VENDOR_ID		1 +#define EV_FSL_VENDOR_ID		2	/* Freescale Semiconductor */ +#define EV_IBM_VENDOR_ID		3	/* IBM */ +#define EV_GHS_VENDOR_ID		4	/* Green Hills Software */ +#define EV_ENEA_VENDOR_ID		5	/* Enea */ +#define EV_WR_VENDOR_ID			6	/* Wind River Systems */ +#define EV_AMCC_VENDOR_ID		7	/* Applied Micro Circuits */ +#define EV_KVM_VENDOR_ID		42	/* KVM */ + +/* The max number of bytes that a byte channel can send or receive per call */ +#define EV_BYTE_CHANNEL_MAX_BYTES	16 + + +#define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num)) +#define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num) + +/* epapr return codes */ +#define EV_SUCCESS		0 +#define EV_EPERM		1	/* Operation not permitted */ +#define EV_ENOENT		2	/*  Entry Not Found */ +#define EV_EIO			3	/* I/O error occured */ +#define EV_EAGAIN		4	/* The operation had insufficient +					 * resources to complete and should be +					 * retried +					 */ +#define EV_ENOMEM		5	/* There was insufficient memory to +					 * complete the operation */ +#define EV_EFAULT		6	/* Bad guest address */ +#define EV_ENODEV		7	/* No such device */ +#define EV_EINVAL		8	/* An argument supplied to the hcall +					   was out of range or invalid */ +#define EV_INTERNAL		9	/* An internal error occured */ +#define EV_CONFIG		10	/* A configuration error was detected */ +#define EV_INVALID_STATE	11	/* The object is in an invalid state */ +#define EV_UNIMPLEMENTED	12	/* Unimplemented hypercall */ +#define EV_BUFFER_OVERFLOW	13	/* Caller-supplied buffer too small */ + +#endif /* _UAPI_ASM_POWERPC_EPAPR_HCALLS_H */ diff --git a/arch/powerpc/include/uapi/asm/ioctls.h b/arch/powerpc/include/uapi/asm/ioctls.h index e9b78870aaab..49a25796a61a 100644 --- a/arch/powerpc/include/uapi/asm/ioctls.h +++ b/arch/powerpc/include/uapi/asm/ioctls.h @@ -97,6 +97,9 @@  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	0x5453  #define TIOCSERGWILD	0x5454 diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h index 1bea4d8ea6f4..2fba8a66fb10 100644 --- a/arch/powerpc/include/uapi/asm/kvm.h +++ b/arch/powerpc/include/uapi/asm/kvm.h @@ -221,6 +221,12 @@ struct kvm_sregs {  			__u32 dbsr;	/* KVM_SREGS_E_UPDATE_DBSR */  			__u32 dbcr[3]; +			/* +			 * iac/dac registers are 64bit wide, while this API +			 * interface provides only lower 32 bits on 64 bit +			 * processors. ONE_REG interface is added for 64bit +			 * iac/dac registers. +			 */  			__u32 iac[4];  			__u32 dac[2];  			__u32 dvc[2]; @@ -325,6 +331,86 @@ struct kvm_book3e_206_tlb_params {  	__u32 reserved[8];  }; +/* For KVM_PPC_GET_HTAB_FD */ +struct kvm_get_htab_fd { +	__u64	flags; +	__u64	start_index; +	__u64	reserved[2]; +}; + +/* Values for kvm_get_htab_fd.flags */ +#define KVM_GET_HTAB_BOLTED_ONLY	((__u64)0x1) +#define KVM_GET_HTAB_WRITE		((__u64)0x2) + +/* + * Data read on the file descriptor is formatted as a series of + * records, each consisting of a header followed by a series of + * `n_valid' HPTEs (16 bytes each), which are all valid.  Following + * those valid HPTEs there are `n_invalid' invalid HPTEs, which + * are not represented explicitly in the stream.  The same format + * is used for writing. + */ +struct kvm_get_htab_header { +	__u32	index; +	__u16	n_valid; +	__u16	n_invalid; +}; +  #define KVM_REG_PPC_HIOR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1) +#define KVM_REG_PPC_IAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2) +#define KVM_REG_PPC_IAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3) +#define KVM_REG_PPC_IAC3	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4) +#define KVM_REG_PPC_IAC4	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5) +#define KVM_REG_PPC_DAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6) +#define KVM_REG_PPC_DAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7) +#define KVM_REG_PPC_DABR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8) +#define KVM_REG_PPC_DSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9) +#define KVM_REG_PPC_PURR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa) +#define KVM_REG_PPC_SPURR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb) +#define KVM_REG_PPC_DAR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc) +#define KVM_REG_PPC_DSISR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xd) +#define KVM_REG_PPC_AMR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xe) +#define KVM_REG_PPC_UAMOR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xf) + +#define KVM_REG_PPC_MMCR0	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x10) +#define KVM_REG_PPC_MMCR1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x11) +#define KVM_REG_PPC_MMCRA	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x12) + +#define KVM_REG_PPC_PMC1	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x18) +#define KVM_REG_PPC_PMC2	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x19) +#define KVM_REG_PPC_PMC3	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1a) +#define KVM_REG_PPC_PMC4	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1b) +#define KVM_REG_PPC_PMC5	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1c) +#define KVM_REG_PPC_PMC6	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1d) +#define KVM_REG_PPC_PMC7	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1e) +#define KVM_REG_PPC_PMC8	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1f) + +/* 32 floating-point registers */ +#define KVM_REG_PPC_FPR0	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x20) +#define KVM_REG_PPC_FPR(n)	(KVM_REG_PPC_FPR0 + (n)) +#define KVM_REG_PPC_FPR31	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3f) + +/* 32 VMX/Altivec vector registers */ +#define KVM_REG_PPC_VR0		(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x40) +#define KVM_REG_PPC_VR(n)	(KVM_REG_PPC_VR0 + (n)) +#define KVM_REG_PPC_VR31	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x5f) + +/* 32 double-width FP registers for VSX */ +/* High-order halves overlap with FP regs */ +#define KVM_REG_PPC_VSR0	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x60) +#define KVM_REG_PPC_VSR(n)	(KVM_REG_PPC_VSR0 + (n)) +#define KVM_REG_PPC_VSR31	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x7f) + +/* FP and vector status/control registers */ +#define KVM_REG_PPC_FPSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x80) +#define KVM_REG_PPC_VSCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x81) + +/* Virtual processor areas */ +/* For SLB & DTL, address in high (first) half, length in low half */ +#define KVM_REG_PPC_VPA_ADDR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x82) +#define KVM_REG_PPC_VPA_SLB	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x83) +#define KVM_REG_PPC_VPA_DTL	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84) + +#define KVM_REG_PPC_EPCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85)  #endif /* __LINUX_KVM_POWERPC_H */ diff --git a/arch/powerpc/include/uapi/asm/kvm_para.h b/arch/powerpc/include/uapi/asm/kvm_para.h index 5e04383a1db5..ed0e0254b47f 100644 --- a/arch/powerpc/include/uapi/asm/kvm_para.h +++ b/arch/powerpc/include/uapi/asm/kvm_para.h @@ -75,9 +75,10 @@ struct kvm_vcpu_arch_shared {  };  #define KVM_SC_MAGIC_R0		0x4b564d21 /* "KVM!" */ -#define HC_VENDOR_KVM		(42 << 16) -#define HC_EV_SUCCESS		0 -#define HC_EV_UNIMPLEMENTED	12 + +#define KVM_HCALL_TOKEN(num)     _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) + +#include <uapi/asm/epapr_hcalls.h>  #define KVM_FEATURE_MAGIC_PAGE	1 diff --git a/arch/powerpc/include/uapi/asm/setup.h b/arch/powerpc/include/uapi/asm/setup.h index 8b9a306260b2..552df83f1a49 100644 --- a/arch/powerpc/include/uapi/asm/setup.h +++ b/arch/powerpc/include/uapi/asm/setup.h @@ -1,32 +1 @@ -#ifndef _ASM_POWERPC_SETUP_H -#define _ASM_POWERPC_SETUP_H -  #include <asm-generic/setup.h> - -#ifndef __ASSEMBLY__ -extern void ppc_printk_progress(char *s, unsigned short hex); - -extern unsigned int rtas_data; -extern int mem_init_done;	/* set on boot once kmalloc can be called */ -extern int init_bootmem_done;	/* set once bootmem is available */ -extern unsigned long long memory_limit; -extern unsigned long klimit; -extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); - -extern void via_cuda_init(void); -extern void read_rtc_time(void); -extern void pmac_find_display(void); - -struct device_node; -extern void note_scsi_host(struct device_node *, void *); - -/* Used in very early kernel initialization. */ -extern unsigned long reloc_offset(void); -extern unsigned long add_reloc_offset(unsigned long); -extern void reloc_got2(unsigned long); - -#define PTRRELOC(x)	((typeof(x)) add_reloc_offset((unsigned long)(x))) - -#endif /* !__ASSEMBLY__ */ - -#endif	/* _ASM_POWERPC_SETUP_H */ diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h index 3d5179bb122f..eb0b1864d400 100644 --- a/arch/powerpc/include/uapi/asm/socket.h +++ b/arch/powerpc/include/uapi/asm/socket.h @@ -47,6 +47,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER	26  #define SO_DETACH_FILTER	27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 |