Path: blob/master/arch/arc/include/asm/irqflags-arcv2.h
26481 views
/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)3*/45#ifndef __ASM_IRQFLAGS_ARCV2_H6#define __ASM_IRQFLAGS_ARCV2_H78#include <asm/arcregs.h>910/* status32 Bits */11#define STATUS_AD_BIT 19 /* Disable Align chk: core supports non-aligned */12#define STATUS_IE_BIT 311314#define STATUS_AD_MASK (1<<STATUS_AD_BIT)15#define STATUS_IE_MASK (1<<STATUS_IE_BIT)1617/* status32 Bits as encoded/expected by CLRI/SETI */18#define CLRI_STATUS_IE_BIT 41920#define CLRI_STATUS_E_MASK 0xF21#define CLRI_STATUS_IE_MASK (1 << CLRI_STATUS_IE_BIT)2223#define AUX_USER_SP 0x00D24#define AUX_IRQ_CTRL 0x00E25#define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */26#define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */27#define AUX_IRQ_HINT 0x201 /* For generating Soft Interrupts */28#define AUX_IRQ_PRIORITY 0x20629#define ICAUSE 0x40a30#define AUX_IRQ_SELECT 0x40b31#define AUX_IRQ_ENABLE 0x40c3233/* Was Intr taken in User Mode */34#define AUX_IRQ_ACT_BIT_U 313536/*37* Hardware supports 16 priorities (0 highest, 15 lowest)38* Linux by default runs at 1, priority 0 reserved for NMI style interrupts39*/40#define ARCV2_IRQ_DEF_PRIO 14142/* seed value for status register */43#ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS44#define __AD_ENB STATUS_AD_MASK45#else46#define __AD_ENB 047#endif4849#define ISA_INIT_STATUS_BITS (STATUS_IE_MASK | __AD_ENB | \50(ARCV2_IRQ_DEF_PRIO << 1))5152#ifndef __ASSEMBLER__5354/*55* Save IRQ state and disable IRQs56*/57static inline long arch_local_irq_save(void)58{59unsigned long flags;6061__asm__ __volatile__(" clri %0 \n" : "=r" (flags) : : "memory");6263return flags;64}6566/*67* restore saved IRQ state68*/69static inline void arch_local_irq_restore(unsigned long flags)70{71__asm__ __volatile__(" seti %0 \n" : : "r" (flags) : "memory");72}7374/*75* Unconditionally Enable IRQs76*/77static inline void arch_local_irq_enable(void)78{79unsigned int irqact = read_aux_reg(AUX_IRQ_ACT);8081if (irqact & 0xffff)82write_aux_reg(AUX_IRQ_ACT, irqact & ~0xffff);8384__asm__ __volatile__(" seti \n" : : : "memory");85}8687/*88* Unconditionally Disable IRQs89*/90static inline void arch_local_irq_disable(void)91{92__asm__ __volatile__(" clri \n" : : : "memory");93}9495/*96* save IRQ state97*/98static inline long arch_local_save_flags(void)99{100unsigned long temp;101102__asm__ __volatile__(103" lr %0, [status32] \n"104: "=&r"(temp)105:106: "memory");107108/* To be compatible with irq_save()/irq_restore()109* encode the irq bits as expected by CLRI/SETI110* (this was needed to make CONFIG_TRACE_IRQFLAGS work)111*/112temp = (1 << 5) |113((!!(temp & STATUS_IE_MASK)) << CLRI_STATUS_IE_BIT) |114((temp >> 1) & CLRI_STATUS_E_MASK);115return temp;116}117118/*119* Query IRQ state120*/121static inline int arch_irqs_disabled_flags(unsigned long flags)122{123return !(flags & CLRI_STATUS_IE_MASK);124}125126static inline int arch_irqs_disabled(void)127{128return arch_irqs_disabled_flags(arch_local_save_flags());129}130131static inline void arc_softirq_trigger(int irq)132{133write_aux_reg(AUX_IRQ_HINT, irq);134}135136static inline void arc_softirq_clear(int irq)137{138write_aux_reg(AUX_IRQ_HINT, 0);139}140141#else142143#ifdef CONFIG_TRACE_IRQFLAGS144145.macro TRACE_ASM_IRQ_DISABLE146bl trace_hardirqs_off147.endm148149.macro TRACE_ASM_IRQ_ENABLE150bl trace_hardirqs_on151.endm152153#else154155.macro TRACE_ASM_IRQ_DISABLE156.endm157158.macro TRACE_ASM_IRQ_ENABLE159.endm160161#endif162.macro IRQ_DISABLE scratch163clri164TRACE_ASM_IRQ_DISABLE165.endm166167.macro IRQ_ENABLE scratch168TRACE_ASM_IRQ_ENABLE169seti170.endm171172#endif /* __ASSEMBLER__ */173174#endif175176177