Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
irq.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013-2014 Wind River Systems, Inc.
3 * Copyright (c) 2019 Nordic Semiconductor ASA.
4 * Copyright 2026 Arm Limited and/or its affiliates <open-source-office@arm.com>
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8
16
17#ifndef ZEPHYR_INCLUDE_ARCH_ARM_IRQ_H_
18#define ZEPHYR_INCLUDE_ARCH_ARM_IRQ_H_
19
20#include <zephyr/sw_isr_table.h>
21#include <stdbool.h>
22#if !defined(_ASMLANGUAGE) && defined(CONFIG_CPU_CORTEX_M)
24#endif
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30#ifdef _ASMLANGUAGE
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
35#else
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
39#endif
40#ifndef CONFIG_USE_SWITCH
41GTEXT(z_arm_int_exit);
42#endif
43GTEXT(arch_irq_enable)
46#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
47GTEXT(z_soc_irq_get_active)
48GTEXT(z_soc_irq_eoi)
49#endif /* CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER */
50#else
51
52#if !defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
53extern void arm_irq_enable(unsigned int irq);
54extern void arm_irq_disable(unsigned int irq);
55extern int arm_irq_is_enabled(unsigned int irq);
56extern void arm_irq_priority_set(unsigned int irq, unsigned int prio, uint32_t flags);
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)
62#endif
63#endif
64
65#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER) || defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
66/*
67 * When a custom interrupt controller or multi-level interrupts is specified,
68 * map the architecture interrupt control functions to the SoC layer interrupt
69 * control functions.
70 */
71
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);
76
77void z_soc_irq_priority_set(
78 unsigned int irq, unsigned int prio, unsigned int flags);
79
80unsigned int z_soc_irq_get_active(void);
81void z_soc_irq_eoi(unsigned int irq);
82
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)
86
87#define z_arm_irq_priority_set(irq, prio, flags) \
88 z_soc_irq_priority_set(irq, prio, flags)
89
90#endif
91
92#if defined(CONFIG_CPU_CORTEX_M) && defined(CONFIG_USE_SWITCH)
93static inline void z_arm_int_exit(void)
94{
96}
97#else
98extern void z_arm_int_exit(void);
99#endif
100
101extern void z_arm_interrupt_init(void);
102
103/* Flags for use with IRQ_CONNECT() */
117#define IRQ_ZERO_LATENCY BIT(0)
118
119#ifdef CONFIG_CPU_CORTEX_M
120
121#if defined(CONFIG_ZERO_LATENCY_LEVELS)
122#define ZERO_LATENCY_LEVELS CONFIG_ZERO_LATENCY_LEVELS
123#else
124#define ZERO_LATENCY_LEVELS 1
125#endif
126
127#define _CHECK_PRIO(priority_p, flags_p) \
128 BUILD_ASSERT(((flags_p & IRQ_ZERO_LATENCY) && \
129 ((ZERO_LATENCY_LEVELS == 1) || \
130 (priority_p < ZERO_LATENCY_LEVELS))) || \
131 (priority_p <= IRQ_PRIO_LOWEST), \
132 "Invalid interrupt priority. Values must not exceed IRQ_PRIO_LOWEST");
133#else
134#define _CHECK_PRIO(priority_p, flags_p)
135#endif
136
137/* All arguments must be computable by the compiler at build time.
138 *
139 * Z_ISR_DECLARE will populate the .intList section with the interrupt's
140 * parameters, which will then be used by gen_irq_tables.py to create
141 * the vector table and the software ISR table. This is all done at
142 * build-time.
143 *
144 * We additionally set the priority in the interrupt controller at
145 * runtime.
146 */
147#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
148{ \
149 BUILD_ASSERT(!(flags_p & IRQ_ZERO_LATENCY), \
150 "ZLI interrupts must be registered using IRQ_DIRECT_CONNECT()"); \
151 _CHECK_PRIO(priority_p, flags_p) \
152 Z_ISR_DECLARE(irq_p, 0, isr_p, isr_param_p); \
153 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
154}
155
156#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
157{ \
158 BUILD_ASSERT(IS_ENABLED(CONFIG_ZERO_LATENCY_IRQS) || !(flags_p & IRQ_ZERO_LATENCY), \
159 "ZLI interrupt registered but feature is disabled"); \
160 _CHECK_PRIO(priority_p, flags_p) \
161 Z_ISR_DECLARE_DIRECT(irq_p, ISR_FLAG_DIRECT, isr_p); \
162 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
163}
164
165#ifdef CONFIG_PM
166extern void _arch_isr_direct_pm(void);
167#define ARCH_ISR_DIRECT_PM() _arch_isr_direct_pm()
168#else
169#define ARCH_ISR_DIRECT_PM() do { } while (false)
170#endif
171
172#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
173#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
174
175#ifdef CONFIG_TRACING_ISR
176extern void sys_trace_isr_enter(void);
177extern void sys_trace_isr_exit(void);
178#endif
179
180static inline void arch_isr_direct_header(void)
181{
182#ifdef CONFIG_TRACING_ISR
184#endif
185}
186
187static inline void arch_isr_direct_footer(int maybe_swap)
188{
189#ifdef CONFIG_TRACING_ISR
191#endif
192 if (maybe_swap != 0) {
193 z_arm_int_exit();
194 }
195}
196
197#define ARCH_ISR_DIAG_OFF \
198 TOOLCHAIN_DISABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
199 TOOLCHAIN_DISABLE_CLANG_WARNING(TOOLCHAIN_WARNING_ARM_INTERRUPT_VFP_CLOBBER) \
200 TOOLCHAIN_DISABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
201 TOOLCHAIN_DISABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
202#define ARCH_ISR_DIAG_ON \
203 TOOLCHAIN_ENABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
204 TOOLCHAIN_ENABLE_CLANG_WARNING(TOOLCHAIN_WARNING_ARM_INTERRUPT_VFP_CLOBBER) \
205 TOOLCHAIN_ENABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
206 TOOLCHAIN_ENABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
207
208#define ARCH_ISR_DIRECT_DECLARE(name) \
209 static inline int name##_body(void); \
210 ARCH_ISR_DIAG_OFF \
211 __attribute__ ((interrupt ("IRQ"))) void name(void) \
212 { \
213 int check_reschedule; \
214 ISR_DIRECT_HEADER(); \
215 check_reschedule = name##_body(); \
216 ISR_DIRECT_FOOTER(check_reschedule); \
217 } \
218 ARCH_ISR_DIAG_ON \
219 static inline int name##_body(void)
220
221#if defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
222
223extern void z_arm_irq_direct_dynamic_dispatch_reschedule(void);
224extern void z_arm_irq_direct_dynamic_dispatch_no_reschedule(void);
225
278#define ARM_IRQ_DIRECT_DYNAMIC_CONNECT(irq_p, priority_p, flags_p, resch) \
279 IRQ_DIRECT_CONNECT(irq_p, priority_p, \
280 _CONCAT(z_arm_irq_direct_dynamic_dispatch_, resch), flags_p)
281
282#endif /* CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
283
284#if defined(CONFIG_ARM_SECURE_FIRMWARE)
285/* Architecture-specific definition for the target security
286 * state of an NVIC IRQ line.
287 */
288typedef enum {
289 IRQ_TARGET_STATE_SECURE = 0,
290 IRQ_TARGET_STATE_NON_SECURE
291} irq_target_state_t;
292
293#endif /* CONFIG_ARM_SECURE_FIRMWARE */
294
295#endif /* _ASMLANGUAGE */
296
297#ifdef __cplusplus
298}
299#endif
300
301#endif /* ZEPHYR_INCLUDE_ARCH_ARM_IRQ_H_ */
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.