17#ifndef ZEPHYR_INCLUDE_ARCH_ARM_IRQ_H_
18#define ZEPHYR_INCLUDE_ARCH_ARM_IRQ_H_
22#if !defined(_ASMLANGUAGE) && defined(CONFIG_CPU_CORTEX_M)
31#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER) || defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
32#define arch_irq_enable z_soc_irq_enable
33#define arch_irq_disable z_soc_irq_disable
34#define arch_irq_is_enabled z_soc_irq_is_enabled
36#define arch_irq_enable arm_irq_enable
37#define arch_irq_disable arm_irq_disable
38#define arch_irq_is_enabled arm_irq_is_enabled
40#ifndef CONFIG_USE_SWITCH
46#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
47GTEXT(z_soc_irq_get_active)
52#if !defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
57#if !defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
58#define arch_irq_enable(irq) arm_irq_enable(irq)
59#define arch_irq_disable(irq) arm_irq_disable(irq)
60#define arch_irq_is_enabled(irq) arm_irq_is_enabled(irq)
61#define z_arm_irq_priority_set(irq, prio, flags) arm_irq_priority_set(irq, prio, flags)
65#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER) || defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
72void z_soc_irq_init(
void);
73void z_soc_irq_enable(
unsigned int irq);
74void z_soc_irq_disable(
unsigned int irq);
75int z_soc_irq_is_enabled(
unsigned int irq);
77void z_soc_irq_priority_set(
78 unsigned int irq,
unsigned int prio,
unsigned int flags);
80unsigned int z_soc_irq_get_active(
void);
81void z_soc_irq_eoi(
unsigned int irq);
83#define arch_irq_enable(irq) z_soc_irq_enable(irq)
84#define arch_irq_disable(irq) z_soc_irq_disable(irq)
85#define arch_irq_is_enabled(irq) z_soc_irq_is_enabled(irq)
87#define z_arm_irq_priority_set(irq, prio, flags) \
88 z_soc_irq_priority_set(irq, prio, flags)
92#if defined(CONFIG_CPU_CORTEX_M) && defined(CONFIG_USE_SWITCH)
93static inline void z_arm_int_exit(
void)
98extern void z_arm_int_exit(
void);
101extern void z_arm_interrupt_init(
void);
111#define IRQ_ZERO_LATENCY BIT(0)
113#ifdef CONFIG_CPU_CORTEX_M
115#if defined(CONFIG_ZERO_LATENCY_LEVELS)
116#define ZERO_LATENCY_LEVELS CONFIG_ZERO_LATENCY_LEVELS
118#define ZERO_LATENCY_LEVELS 1
121#define _CHECK_PRIO(priority_p, flags_p) \
122 BUILD_ASSERT(((flags_p & IRQ_ZERO_LATENCY) && \
123 ((ZERO_LATENCY_LEVELS == 1) || \
124 (priority_p < ZERO_LATENCY_LEVELS))) || \
125 (priority_p <= IRQ_PRIO_LOWEST), \
126 "Invalid interrupt priority. Values must not exceed IRQ_PRIO_LOWEST");
128#define _CHECK_PRIO(priority_p, flags_p)
141#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
143 BUILD_ASSERT(!(flags_p & IRQ_ZERO_LATENCY), \
144 "ZLI interrupts must be registered using IRQ_DIRECT_CONNECT()"); \
145 _CHECK_PRIO(priority_p, flags_p) \
146 Z_ISR_DECLARE(irq_p, 0, isr_p, isr_param_p); \
147 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
150#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
152 BUILD_ASSERT(IS_ENABLED(CONFIG_ZERO_LATENCY_IRQS) || !(flags_p & IRQ_ZERO_LATENCY), \
153 "ZLI interrupt registered but feature is disabled"); \
154 _CHECK_PRIO(priority_p, flags_p) \
155 Z_ISR_DECLARE_DIRECT(irq_p, ISR_FLAG_DIRECT, isr_p); \
156 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
160extern void _arch_isr_direct_pm(
void);
161#define ARCH_ISR_DIRECT_PM() _arch_isr_direct_pm()
163#define ARCH_ISR_DIRECT_PM() do { } while (false)
166#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
167#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
169#ifdef CONFIG_TRACING_ISR
176#ifdef CONFIG_TRACING_ISR
183#ifdef CONFIG_TRACING_ISR
186 if (maybe_swap != 0) {
191#define ARCH_ISR_DIAG_OFF \
192 TOOLCHAIN_DISABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
193 TOOLCHAIN_DISABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
194 TOOLCHAIN_DISABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
195#define ARCH_ISR_DIAG_ON \
196 TOOLCHAIN_ENABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
197 TOOLCHAIN_ENABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
198 TOOLCHAIN_ENABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
200#define ARCH_ISR_DIRECT_DECLARE(name) \
201 static inline int name##_body(void); \
203 __attribute__ ((interrupt ("IRQ"))) void name(void) \
205 int check_reschedule; \
206 ISR_DIRECT_HEADER(); \
207 check_reschedule = name##_body(); \
208 ISR_DIRECT_FOOTER(check_reschedule); \
211 static inline int name##_body(void)
213#if defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
215extern void z_arm_irq_direct_dynamic_dispatch_reschedule(
void);
216extern void z_arm_irq_direct_dynamic_dispatch_no_reschedule(
void);
270#define ARM_IRQ_DIRECT_DYNAMIC_CONNECT(irq_p, priority_p, flags_p, resch) \
271 IRQ_DIRECT_CONNECT(irq_p, priority_p, \
272 _CONCAT(z_arm_irq_direct_dynamic_dispatch_, resch), flags_p)
276#if defined(CONFIG_ARM_SECURE_FIRMWARE)
281 IRQ_TARGET_STATE_SECURE = 0,
282 IRQ_TARGET_STATE_NON_SECURE
static void arch_isr_direct_header(void)
Definition irq.h:91
static void arch_isr_direct_footer(int maybe_swap)
Definition irq.h:98
#define arch_irq_disable(irq)
Definition irq.h:59
void arm_irq_priority_set(unsigned int irq, unsigned int prio, uint32_t flags)
#define arch_irq_enable(irq)
Definition irq.h:58
int arm_irq_is_enabled(unsigned int irq)
void arm_irq_enable(unsigned int irq)
void arm_irq_disable(unsigned int irq)
#define arch_irq_is_enabled(irq)
Definition irq.h:60
Cortex-M context-switch support helpers.
static void arm_m_exc_tail(void)
ISR-tail helper that patches the stacked LR for deferred switch fixup.
Definition arm-m-switch.h:156
void sys_trace_isr_enter(void)
Called when entering an ISR.
void sys_trace_isr_exit(void)
Called when exiting an ISR.
flags
Definition parser.h:97
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Software-managed ISR table.