diff options
Diffstat (limited to 'arch/mips/include/asm/netlogic/mips-extns.h')
| -rw-r--r-- | arch/mips/include/asm/netlogic/mips-extns.h | 20 | 
1 files changed, 6 insertions, 14 deletions
diff --git a/arch/mips/include/asm/netlogic/mips-extns.h b/arch/mips/include/asm/netlogic/mips-extns.h index 8ad2e0f8171..f299d31d7c1 100644 --- a/arch/mips/include/asm/netlogic/mips-extns.h +++ b/arch/mips/include/asm/netlogic/mips-extns.h @@ -38,21 +38,16 @@  /*   * XLR and XLP interrupt request and interrupt mask registers   */ -#define read_c0_eirr()		__read_64bit_c0_register($9, 6) -#define read_c0_eimr()		__read_64bit_c0_register($9, 7) -#define write_c0_eirr(val)	__write_64bit_c0_register($9, 6, val) -  /* - * Writing EIMR in 32 bit is a special case, the lower 8 bit of the - * EIMR is shadowed in the status register, so we cannot save and - * restore status register for split read. + * NOTE: Do not save/restore flags around write_c0_eimr(). + * On non-R2 platforms the flags has part of EIMR that is shadowed in STATUS + * register. Restoring flags will overwrite the lower 8 bits of EIMR. + * + * Call with interrupts disabled.   */  #define write_c0_eimr(val)						\  do {									\  	if (sizeof(unsigned long) == 4) {				\ -		unsigned long __flags;					\ -									\ -		local_irq_save(__flags);				\  		__asm__ __volatile__(					\  			".set\tmips64\n\t"				\  			"dsll\t%L0, %L0, 32\n\t"			\ @@ -62,8 +57,6 @@ do {									\  			"dmtc0\t%L0, $9, 7\n\t"				\  			".set\tmips0"					\  			: : "r" (val));					\ -		__flags = (__flags & 0xffff00ff) | (((val) & 0xff) << 8);\ -		local_irq_restore(__flags);				\  	} else								\  		__write_64bit_c0_register($9, 7, (val));		\  } while (0) @@ -128,7 +121,7 @@ static inline uint64_t read_c0_eirr_and_eimr(void)  	uint64_t val;  #ifdef CONFIG_64BIT -	val = read_c0_eimr() & read_c0_eirr(); +	val = __read_64bit_c0_register($9, 6) & __read_64bit_c0_register($9, 7);  #else  	__asm__ __volatile__(  		".set	push\n\t" @@ -143,7 +136,6 @@ static inline uint64_t read_c0_eirr_and_eimr(void)  		".set	pop"  		: "=r" (val));  #endif -  	return val;  }  |