diff options
Diffstat (limited to 'arch/arm/include/asm/proc-armv/system.h')
| -rw-r--r-- | arch/arm/include/asm/proc-armv/system.h | 59 | 
1 files changed, 58 insertions, 1 deletions
| diff --git a/arch/arm/include/asm/proc-armv/system.h b/arch/arm/include/asm/proc-armv/system.h index cda8976b6..693d1f492 100644 --- a/arch/arm/include/asm/proc-armv/system.h +++ b/arch/arm/include/asm/proc-armv/system.h @@ -13,6 +13,60 @@  /*   * Save the current interrupt enable state & disable IRQs   */ +#ifdef CONFIG_ARM64 + +/* + * Save the current interrupt enable state + * and disable IRQs/FIQs + */ +#define local_irq_save(flags)					\ +	({							\ +	asm volatile(						\ +	"mrs	%0, daif"					\ +	"msr	daifset, #3"					\ +	: "=r" (flags)						\ +	:							\ +	: "memory");						\ +	}) + +/* + * restore saved IRQ & FIQ state + */ +#define local_irq_restore(flags)				\ +	({							\ +	asm volatile(						\ +	"msr	daif, %0"					\ +	:							\ +	: "r" (flags)						\ +	: "memory");						\ +	}) + +/* + * Enable IRQs/FIQs + */ +#define local_irq_enable()					\ +	({							\ +	asm volatile(						\ +	"msr	daifclr, #3"					\ +	:							\ +	:							\ +	: "memory");						\ +	}) + +/* + * Disable IRQs/FIQs + */ +#define local_irq_disable()					\ +	({							\ +	asm volatile(						\ +	"msr	daifset, #3"					\ +	:							\ +	:							\ +	: "memory");						\ +	}) + +#else	/* CONFIG_ARM64 */ +  #define local_irq_save(x)					\  	({							\  		unsigned long temp;				\ @@ -107,7 +161,10 @@  	: "r" (x)						\  	: "memory") -#if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) +#endif	/* CONFIG_ARM64 */ + +#if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) || \ +	defined(CONFIG_ARM64)  /*   * On the StrongARM, "swp" is terminally broken since it bypasses the   * cache totally.  This means that the cache becomes inconsistent, and, |