diff options
Diffstat (limited to 'arch/mips/include/asm/mipsregs.h')
| -rw-r--r-- | arch/mips/include/asm/mipsregs.h | 311 | 
1 files changed, 125 insertions, 186 deletions
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 2145162674b..12b70c25906 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h @@ -595,6 +595,8 @@  #define MIPS_CONF3_DSP2P	(_ULCAST_(1) << 11)  #define MIPS_CONF3_RXI		(_ULCAST_(1) << 12)  #define MIPS_CONF3_ULRI		(_ULCAST_(1) << 13) +#define MIPS_CONF3_ISA		(_ULCAST_(3) << 14) +#define MIPS_CONF3_VZ		(_ULCAST_(1) << 23)  #define MIPS_CONF4_MMUSIZEEXT	(_ULCAST_(255) << 0)  #define MIPS_CONF4_MMUEXTDEF	(_ULCAST_(3) << 14) @@ -1158,36 +1160,26 @@ do {									\  	__res;								\  }) +#ifdef HAVE_AS_DSP  #define rddsp(mask)							\  ({									\ -	unsigned int __res;						\ +	unsigned int __dspctl;						\  									\  	__asm__ __volatile__(						\ -	"	.set	push				\n"		\ -	"	.set	noat				\n"		\ -	"	# rddsp $1, %x1				\n"		\ -	"	.word	0x7c000cb8 | (%x1 << 16)	\n"		\ -	"	move	%0, $1				\n"		\ -	"	.set	pop				\n"		\ -	: "=r" (__res)							\ +	"	rddsp	%0, %x1					\n"	\ +	: "=r" (__dspctl)						\  	: "i" (mask));							\ -	__res;								\ +	__dspctl;							\  })  #define wrdsp(val, mask)						\  do {									\  	__asm__ __volatile__(						\ -	"	.set	push					\n"	\ -	"	.set	noat					\n"	\ -	"	move	$1, %0					\n"	\ -	"	# wrdsp $1, %x1					\n"	\ -	"	.word	0x7c2004f8 | (%x1 << 11)		\n"	\ -	"	.set	pop					\n"	\ +	"	wrdsp	%0, %x1					\n"	\  	:								\  	: "r" (val), "i" (mask));					\  } while (0) -#if 0	/* Need DSP ASE capable assembler ... */  #define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;})  #define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;})  #define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;}) @@ -1210,230 +1202,177 @@ do {									\  #else -#define mfhi0()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mfhi	%0, $ac0		\n"			\ -	"	.word	0x00000810		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mfhi1()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mfhi	%0, $ac1		\n"			\ -	"	.word	0x00200810		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mfhi2()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mfhi	%0, $ac2		\n"			\ -	"	.word	0x00400810		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mfhi3()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mfhi	%0, $ac3		\n"			\ -	"	.word	0x00600810		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mflo0()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mflo	%0, $ac0		\n"			\ -	"	.word	0x00000812		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mflo1()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mflo	%0, $ac1		\n"			\ -	"	.word	0x00200812		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mflo2()								\ -({									\ -	unsigned long __treg;						\ -									\ -	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mflo	%0, $ac2		\n"			\ -	"	.word	0x00400812		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mflo3()								\ +#ifdef CONFIG_CPU_MICROMIPS +#define rddsp(mask)							\  ({									\ -	unsigned long __treg;						\ +	unsigned int __res;						\  									\  	__asm__ __volatile__(						\ -	"	.set	push			\n"			\ -	"	.set	noat			\n"			\ -	"	# mflo	%0, $ac3		\n"			\ -	"	.word	0x00600812		\n"			\ -	"	move	%0, $1			\n"			\ -	"	.set	pop			\n"			\ -	: "=r" (__treg));						\ -	__treg;								\ -}) - -#define mthi0(x)							\ -do {									\ -	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\ -	"	move	$1, %0					\n"	\ -	"	# mthi	$1, $ac0				\n"	\ -	"	.word	0x00200011				\n"	\ +	"	# rddsp $1, %x1					\n"	\ +	"	.hword	((0x0020067c | (%x1 << 14)) >> 16)	\n"	\ +	"	.hword	((0x0020067c | (%x1 << 14)) & 0xffff)	\n"	\ +	"	move	%0, $1					\n"	\  	"	.set	pop					\n"	\ -	:								\ -	: "r" (x));							\ -} while (0) +	: "=r" (__res)							\ +	: "i" (mask));							\ +	__res;								\ +}) -#define mthi1(x)							\ +#define wrdsp(val, mask)						\  do {									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\  	"	move	$1, %0					\n"	\ -	"	# mthi	$1, $ac1				\n"	\ -	"	.word	0x00200811				\n"	\ +	"	# wrdsp $1, %x1					\n"	\ +	"	.hword	((0x0020167c | (%x1 << 14)) >> 16)	\n"	\ +	"	.hword	((0x0020167c | (%x1 << 14)) & 0xffff)	\n"	\  	"	.set	pop					\n"	\  	:								\ -	: "r" (x));							\ +	: "r" (val), "i" (mask));					\  } while (0) -#define mthi2(x)							\ -do {									\ +#define _umips_dsp_mfxxx(ins)						\ +({									\ +	unsigned long __treg;						\ +									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\ -	"	move	$1, %0					\n"	\ -	"	# mthi	$1, $ac2				\n"	\ -	"	.word	0x00201011				\n"	\ +	"	.hword	0x0001					\n"	\ +	"	.hword	%x1					\n"	\ +	"	move	%0, $1					\n"	\  	"	.set	pop					\n"	\ -	:								\ -	: "r" (x));							\ -} while (0) +	: "=r" (__treg)							\ +	: "i" (ins));							\ +	__treg;								\ +}) -#define mthi3(x)							\ +#define _umips_dsp_mtxxx(val, ins)					\  do {									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\  	"	move	$1, %0					\n"	\ -	"	# mthi	$1, $ac3				\n"	\ -	"	.word	0x00201811				\n"	\ +	"	.hword	0x0001					\n"	\ +	"	.hword	%x1					\n"	\  	"	.set	pop					\n"	\  	:								\ -	: "r" (x));							\ +	: "r" (val), "i" (ins));					\  } while (0) -#define mtlo0(x)							\ -do {									\ +#define _umips_dsp_mflo(reg) _umips_dsp_mfxxx((reg << 14) | 0x107c) +#define _umips_dsp_mfhi(reg) _umips_dsp_mfxxx((reg << 14) | 0x007c) + +#define _umips_dsp_mtlo(val, reg) _umips_dsp_mtxxx(val, ((reg << 14) | 0x307c)) +#define _umips_dsp_mthi(val, reg) _umips_dsp_mtxxx(val, ((reg << 14) | 0x207c)) + +#define mflo0() _umips_dsp_mflo(0) +#define mflo1() _umips_dsp_mflo(1) +#define mflo2() _umips_dsp_mflo(2) +#define mflo3() _umips_dsp_mflo(3) + +#define mfhi0() _umips_dsp_mfhi(0) +#define mfhi1() _umips_dsp_mfhi(1) +#define mfhi2() _umips_dsp_mfhi(2) +#define mfhi3() _umips_dsp_mfhi(3) + +#define mtlo0(x) _umips_dsp_mtlo(x, 0) +#define mtlo1(x) _umips_dsp_mtlo(x, 1) +#define mtlo2(x) _umips_dsp_mtlo(x, 2) +#define mtlo3(x) _umips_dsp_mtlo(x, 3) + +#define mthi0(x) _umips_dsp_mthi(x, 0) +#define mthi1(x) _umips_dsp_mthi(x, 1) +#define mthi2(x) _umips_dsp_mthi(x, 2) +#define mthi3(x) _umips_dsp_mthi(x, 3) + +#else  /* !CONFIG_CPU_MICROMIPS */ +#define rddsp(mask)							\ +({									\ +	unsigned int __res;						\ +									\  	__asm__ __volatile__(						\ -	"	.set	push					\n"	\ -	"	.set	noat					\n"	\ -	"	move	$1, %0					\n"	\ -	"	# mtlo	$1, $ac0				\n"	\ -	"	.word	0x00200013				\n"	\ -	"	.set	pop					\n"	\ -	:								\ -	: "r" (x));							\ -} while (0) +	"	.set	push				\n"		\ +	"	.set	noat				\n"		\ +	"	# rddsp $1, %x1				\n"		\ +	"	.word	0x7c000cb8 | (%x1 << 16)	\n"		\ +	"	move	%0, $1				\n"		\ +	"	.set	pop				\n"		\ +	: "=r" (__res)							\ +	: "i" (mask));							\ +	__res;								\ +}) -#define mtlo1(x)							\ +#define wrdsp(val, mask)						\  do {									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\  	"	move	$1, %0					\n"	\ -	"	# mtlo	$1, $ac1				\n"	\ -	"	.word	0x00200813				\n"	\ +	"	# wrdsp $1, %x1					\n"	\ +	"	.word	0x7c2004f8 | (%x1 << 11)		\n"	\  	"	.set	pop					\n"	\ -	:								\ -	: "r" (x));							\ +        :								\ +	: "r" (val), "i" (mask));					\  } while (0) -#define mtlo2(x)							\ -do {									\ +#define _dsp_mfxxx(ins)							\ +({									\ +	unsigned long __treg;						\ +									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\ -	"	move	$1, %0					\n"	\ -	"	# mtlo	$1, $ac2				\n"	\ -	"	.word	0x00201013				\n"	\ +	"	.word	(0x00000810 | %1)			\n"	\ +	"	move	%0, $1					\n"	\  	"	.set	pop					\n"	\ -	:								\ -	: "r" (x));							\ -} while (0) +	: "=r" (__treg)							\ +	: "i" (ins));							\ +	__treg;								\ +}) -#define mtlo3(x)							\ +#define _dsp_mtxxx(val, ins)						\  do {									\  	__asm__ __volatile__(						\  	"	.set	push					\n"	\  	"	.set	noat					\n"	\  	"	move	$1, %0					\n"	\ -	"	# mtlo	$1, $ac3				\n"	\ -	"	.word	0x00201813				\n"	\ +	"	.word	(0x00200011 | %1)			\n"	\  	"	.set	pop					\n"	\  	:								\ -	: "r" (x));							\ +	: "r" (val), "i" (ins));					\  } while (0) +#define _dsp_mflo(reg) _dsp_mfxxx((reg << 21) | 0x0002) +#define _dsp_mfhi(reg) _dsp_mfxxx((reg << 21) | 0x0000) + +#define _dsp_mtlo(val, reg) _dsp_mtxxx(val, ((reg << 11) | 0x0002)) +#define _dsp_mthi(val, reg) _dsp_mtxxx(val, ((reg << 11) | 0x0000)) + +#define mflo0() _dsp_mflo(0) +#define mflo1() _dsp_mflo(1) +#define mflo2() _dsp_mflo(2) +#define mflo3() _dsp_mflo(3) + +#define mfhi0() _dsp_mfhi(0) +#define mfhi1() _dsp_mfhi(1) +#define mfhi2() _dsp_mfhi(2) +#define mfhi3() _dsp_mfhi(3) + +#define mtlo0(x) _dsp_mtlo(x, 0) +#define mtlo1(x) _dsp_mtlo(x, 1) +#define mtlo2(x) _dsp_mtlo(x, 2) +#define mtlo3(x) _dsp_mtlo(x, 3) + +#define mthi0(x) _dsp_mthi(x, 0) +#define mthi1(x) _dsp_mthi(x, 1) +#define mthi2(x) _dsp_mthi(x, 2) +#define mthi3(x) _dsp_mthi(x, 3) + +#endif /* CONFIG_CPU_MICROMIPS */  #endif  /*  |