| 
									
										
										
										
											2015-03-06 14:08:20 +05:30
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2 as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ASM_IRQFLAGS_ARCV2_H
 | 
					
						
							|  |  |  | #define __ASM_IRQFLAGS_ARCV2_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/arcregs.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* status32 Bits */ | 
					
						
							|  |  |  | #define STATUS_AD_BIT	19   /* Disable Align chk: core supports non-aligned */
 | 
					
						
							|  |  |  | #define STATUS_IE_BIT	31
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define STATUS_AD_MASK		(1<<STATUS_AD_BIT)
 | 
					
						
							|  |  |  | #define STATUS_IE_MASK		(1<<STATUS_IE_BIT)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define AUX_USER_SP		0x00D
 | 
					
						
							|  |  |  | #define AUX_IRQ_CTRL		0x00E
 | 
					
						
							|  |  |  | #define AUX_IRQ_ACT		0x043	/* Active Intr across all levels */
 | 
					
						
							|  |  |  | #define AUX_IRQ_LVL_PEND	0x200	/* Pending Intr across all levels */
 | 
					
						
							|  |  |  | #define AUX_IRQ_PRIORITY	0x206
 | 
					
						
							|  |  |  | #define ICAUSE			0x40a
 | 
					
						
							|  |  |  | #define AUX_IRQ_SELECT		0x40b
 | 
					
						
							|  |  |  | #define AUX_IRQ_ENABLE		0x40c
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
    - SMP configurations of upto 4 cores with coherency
    - Optional L2 Cache and IO-Coherency
    - Revised Interrupt Architecture (multiple priorites, reg banks,
        auto stack switch, auto regfile save/restore)
    - MMUv4 (PIPT dcache, Huge Pages)
    - Instructions for
	* 64bit load/store: LDD, STD
	* Hardware assisted divide/remainder: DIV, REM
	* Function prologue/epilogue: ENTER_S, LEAVE_S
	* IRQ enable/disable: CLRI, SETI
	* pop count: FFS, FLS
	* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
											
										 
											2013-05-13 18:30:41 +05:30
										 |  |  | /* Was Intr taken in User Mode */ | 
					
						
							|  |  |  | #define AUX_IRQ_ACT_BIT_U	31
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 14:08:20 +05:30
										 |  |  | /* 0 is highest level, but taken by FIRQs, if present in design */ | 
					
						
							|  |  |  | #define ARCV2_IRQ_DEF_PRIO		0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* seed value for status register */ | 
					
						
							|  |  |  | #define ISA_INIT_STATUS_BITS	(STATUS_IE_MASK | STATUS_AD_MASK | \
 | 
					
						
							|  |  |  | 					(ARCV2_IRQ_DEF_PRIO << 1)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Save IRQ state and disable IRQs | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline long arch_local_irq_save(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__asm__ __volatile__("	clri %0	\n" : "=r" (flags) : : "memory"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return flags; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * restore saved IRQ state | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline void arch_local_irq_restore(unsigned long flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__ __volatile__("	seti %0	\n" : : "r" (flags) : "memory"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Unconditionally Enable IRQs | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline void arch_local_irq_enable(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-11-15 17:00:08 +05:30
										 |  |  | 	unsigned int irqact = read_aux_reg(AUX_IRQ_ACT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (irqact & 0xffff) | 
					
						
							|  |  |  | 		write_aux_reg(AUX_IRQ_ACT, irqact & ~0xffff); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 14:08:20 +05:30
										 |  |  | 	__asm__ __volatile__("	seti	\n" : : : "memory"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Unconditionally Disable IRQs | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline void arch_local_irq_disable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__ __volatile__("	clri	\n" : : : "memory"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * save IRQ state | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline long arch_local_save_flags(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long temp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__asm__ __volatile__( | 
					
						
							|  |  |  | 	"	lr  %0, [status32]	\n" | 
					
						
							|  |  |  | 	: "=&r"(temp) | 
					
						
							|  |  |  | 	: | 
					
						
							|  |  |  | 	: "memory"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return temp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Query IRQ state | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline int arch_irqs_disabled_flags(unsigned long flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return !(flags & (STATUS_IE_MASK)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int arch_irqs_disabled(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return arch_irqs_disabled_flags(arch_local_save_flags()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .macro IRQ_DISABLE  scratch | 
					
						
							|  |  |  | 	clri | 
					
						
							|  |  |  | .endm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .macro IRQ_ENABLE  scratch | 
					
						
							|  |  |  | 	seti | 
					
						
							|  |  |  | .endm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif	/* __ASSEMBLY__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |