1 /* 2 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9 #ifndef __ASM_IRQFLAGS_ARCV2_H 10 #define __ASM_IRQFLAGS_ARCV2_H 11 12 #include <asm/arcregs.h> 13 14 /* status32 Bits */ 15 #define STATUS_AD_BIT 19 /* Disable Align chk: core supports non-aligned */ 16 #define STATUS_IE_BIT 31 17 18 #define STATUS_AD_MASK (1<<STATUS_AD_BIT) 19 #define STATUS_IE_MASK (1<<STATUS_IE_BIT) 20 21 #define AUX_USER_SP 0x00D 22 #define AUX_IRQ_CTRL 0x00E 23 #define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */ 24 #define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */ 25 #define AUX_IRQ_PRIORITY 0x206 26 #define ICAUSE 0x40a 27 #define AUX_IRQ_SELECT 0x40b 28 #define AUX_IRQ_ENABLE 0x40c 29 30 /* Was Intr taken in User Mode */ 31 #define AUX_IRQ_ACT_BIT_U 31 32 33 /* 0 is highest level, but taken by FIRQs, if present in design */ 34 #define ARCV2_IRQ_DEF_PRIO 0 35 36 /* seed value for status register */ 37 #define ISA_INIT_STATUS_BITS (STATUS_IE_MASK | STATUS_AD_MASK | \ 38 (ARCV2_IRQ_DEF_PRIO << 1)) 39 40 /* SLEEP needs default irq priority (<=) which can interrupt the doze */ 41 #define ISA_SLEEP_ARG (0x10 | ARCV2_IRQ_DEF_PRIO) 42 43 #ifndef __ASSEMBLY__ 44 45 /* 46 * Save IRQ state and disable IRQs 47 */ 48 static inline long arch_local_irq_save(void) 49 { 50 unsigned long flags; 51 52 __asm__ __volatile__(" clri %0 \n" : "=r" (flags) : : "memory"); 53 54 return flags; 55 } 56 57 /* 58 * restore saved IRQ state 59 */ 60 static inline void arch_local_irq_restore(unsigned long flags) 61 { 62 __asm__ __volatile__(" seti %0 \n" : : "r" (flags) : "memory"); 63 } 64 65 /* 66 * Unconditionally Enable IRQs 67 */ 68 static inline void arch_local_irq_enable(void) 69 { 70 unsigned int irqact = read_aux_reg(AUX_IRQ_ACT); 71 72 if (irqact & 0xffff) 73 write_aux_reg(AUX_IRQ_ACT, irqact & ~0xffff); 74 75 __asm__ __volatile__(" seti \n" : : : "memory"); 76 } 77 78 /* 79 * Unconditionally Disable IRQs 80 */ 81 static inline void arch_local_irq_disable(void) 82 { 83 __asm__ __volatile__(" clri \n" : : : "memory"); 84 } 85 86 /* 87 * save IRQ state 88 */ 89 static inline long arch_local_save_flags(void) 90 { 91 unsigned long temp; 92 93 __asm__ __volatile__( 94 " lr %0, [status32] \n" 95 : "=&r"(temp) 96 : 97 : "memory"); 98 99 return temp; 100 } 101 102 /* 103 * Query IRQ state 104 */ 105 static inline int arch_irqs_disabled_flags(unsigned long flags) 106 { 107 return !(flags & (STATUS_IE_MASK)); 108 } 109 110 static inline int arch_irqs_disabled(void) 111 { 112 return arch_irqs_disabled_flags(arch_local_save_flags()); 113 } 114 115 #else 116 117 .macro IRQ_DISABLE scratch 118 clri 119 .endm 120 121 .macro IRQ_ENABLE scratch 122 seti 123 .endm 124 125 #endif /* __ASSEMBLY__ */ 126 127 #endif 128