Zephyr Project API 4.3.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
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27#ifdef _ASMLANGUAGE
28#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER) || defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
29#define arch_irq_enable z_soc_irq_enable
30#define arch_irq_disable z_soc_irq_disable
31#define arch_irq_is_enabled z_soc_irq_is_enabled
32#else
33#define arch_irq_enable arm_irq_enable
34#define arch_irq_disable arm_irq_disable
35#define arch_irq_is_enabled arm_irq_is_enabled
36#endif
37GTEXT(z_arm_int_exit);
38GTEXT(arch_irq_enable)
41#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
42GTEXT(z_soc_irq_get_active)
43GTEXT(z_soc_irq_eoi)
44#endif /* CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER */
45#else
46
47#if !defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER)
48extern void arm_irq_enable(unsigned int irq);
49extern void arm_irq_disable(unsigned int irq);
50extern int arm_irq_is_enabled(unsigned int irq);
51extern void arm_irq_priority_set(unsigned int irq, unsigned int prio, uint32_t flags);
52#if !defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
53#define arch_irq_enable(irq) arm_irq_enable(irq)
54#define arch_irq_disable(irq) arm_irq_disable(irq)
55#define arch_irq_is_enabled(irq) arm_irq_is_enabled(irq)
56#define z_arm_irq_priority_set(irq, prio, flags) arm_irq_priority_set(irq, prio, flags)
57#endif
58#endif
59
60#if defined(CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER) || defined(CONFIG_MULTI_LEVEL_INTERRUPTS)
61/*
62 * When a custom interrupt controller or multi-level interrupts is specified,
63 * map the architecture interrupt control functions to the SoC layer interrupt
64 * control functions.
65 */
66
67void z_soc_irq_init(void);
68void z_soc_irq_enable(unsigned int irq);
69void z_soc_irq_disable(unsigned int irq);
70int z_soc_irq_is_enabled(unsigned int irq);
71
72void z_soc_irq_priority_set(
73 unsigned int irq, unsigned int prio, unsigned int flags);
74
75unsigned int z_soc_irq_get_active(void);
76void z_soc_irq_eoi(unsigned int irq);
77
78#define arch_irq_enable(irq) z_soc_irq_enable(irq)
79#define arch_irq_disable(irq) z_soc_irq_disable(irq)
80#define arch_irq_is_enabled(irq) z_soc_irq_is_enabled(irq)
81
82#define z_arm_irq_priority_set(irq, prio, flags) \
83 z_soc_irq_priority_set(irq, prio, flags)
84
85#endif
86
87extern void z_arm_int_exit(void);
88
89extern void z_arm_interrupt_init(void);
90
91/* Flags for use with IRQ_CONNECT() */
99#define IRQ_ZERO_LATENCY BIT(0)
100
101#ifdef CONFIG_CPU_CORTEX_M
102
103#if defined(CONFIG_ZERO_LATENCY_LEVELS)
104#define ZERO_LATENCY_LEVELS CONFIG_ZERO_LATENCY_LEVELS
105#else
106#define ZERO_LATENCY_LEVELS 1
107#endif
108
109#define _CHECK_PRIO(priority_p, flags_p) \
110 BUILD_ASSERT(((flags_p & IRQ_ZERO_LATENCY) && \
111 ((ZERO_LATENCY_LEVELS == 1) || \
112 (priority_p < ZERO_LATENCY_LEVELS))) || \
113 (priority_p <= IRQ_PRIO_LOWEST), \
114 "Invalid interrupt priority. Values must not exceed IRQ_PRIO_LOWEST");
115#else
116#define _CHECK_PRIO(priority_p, flags_p)
117#endif
118
119/* All arguments must be computable by the compiler at build time.
120 *
121 * Z_ISR_DECLARE will populate the .intList section with the interrupt's
122 * parameters, which will then be used by gen_irq_tables.py to create
123 * the vector table and the software ISR table. This is all done at
124 * build-time.
125 *
126 * We additionally set the priority in the interrupt controller at
127 * runtime.
128 */
129#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
130{ \
131 BUILD_ASSERT(!(flags_p & IRQ_ZERO_LATENCY), \
132 "ZLI interrupts must be registered using IRQ_DIRECT_CONNECT()"); \
133 _CHECK_PRIO(priority_p, flags_p) \
134 Z_ISR_DECLARE(irq_p, 0, isr_p, isr_param_p); \
135 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
136}
137
138#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
139{ \
140 BUILD_ASSERT(IS_ENABLED(CONFIG_ZERO_LATENCY_IRQS) || !(flags_p & IRQ_ZERO_LATENCY), \
141 "ZLI interrupt registered but feature is disabled"); \
142 _CHECK_PRIO(priority_p, flags_p) \
143 Z_ISR_DECLARE_DIRECT(irq_p, ISR_FLAG_DIRECT, isr_p); \
144 z_arm_irq_priority_set(irq_p, priority_p, flags_p); \
145}
146
147#ifdef CONFIG_PM
148extern void _arch_isr_direct_pm(void);
149#define ARCH_ISR_DIRECT_PM() _arch_isr_direct_pm()
150#else
151#define ARCH_ISR_DIRECT_PM() do { } while (false)
152#endif
153
154#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
155#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
156
157/* arch/arm/core/exc_exit.S */
158extern void z_arm_int_exit(void);
159
160#ifdef CONFIG_TRACING_ISR
161extern void sys_trace_isr_enter(void);
162extern void sys_trace_isr_exit(void);
163#endif
164
165static inline void arch_isr_direct_header(void)
166{
167#ifdef CONFIG_TRACING_ISR
169#endif
170}
171
172static inline void arch_isr_direct_footer(int maybe_swap)
173{
174#ifdef CONFIG_TRACING_ISR
176#endif
177 if (maybe_swap != 0) {
178 z_arm_int_exit();
179 }
180}
181
182#define ARCH_ISR_DIAG_OFF \
183 TOOLCHAIN_DISABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
184 TOOLCHAIN_DISABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
185 TOOLCHAIN_DISABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
186#define ARCH_ISR_DIAG_ON \
187 TOOLCHAIN_ENABLE_CLANG_WARNING(TOOLCHAIN_WARNING_EXTRA) \
188 TOOLCHAIN_ENABLE_GCC_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES) \
189 TOOLCHAIN_ENABLE_IAR_WARNING(TOOLCHAIN_WARNING_ATTRIBUTES)
190
191#define ARCH_ISR_DIRECT_DECLARE(name) \
192 static inline int name##_body(void); \
193 ARCH_ISR_DIAG_OFF \
194 __attribute__ ((interrupt ("IRQ"))) void name(void) \
195 { \
196 int check_reschedule; \
197 ISR_DIRECT_HEADER(); \
198 check_reschedule = name##_body(); \
199 ISR_DIRECT_FOOTER(check_reschedule); \
200 } \
201 ARCH_ISR_DIAG_ON \
202 static inline int name##_body(void)
203
204#if defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
205
206extern void z_arm_irq_direct_dynamic_dispatch_reschedule(void);
207extern void z_arm_irq_direct_dynamic_dispatch_no_reschedule(void);
208
261#define ARM_IRQ_DIRECT_DYNAMIC_CONNECT(irq_p, priority_p, flags_p, resch) \
262 IRQ_DIRECT_CONNECT(irq_p, priority_p, \
263 _CONCAT(z_arm_irq_direct_dynamic_dispatch_, resch), flags_p)
264
265#endif /* CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
266
267#if defined(CONFIG_ARM_SECURE_FIRMWARE)
268/* Architecture-specific definition for the target security
269 * state of an NVIC IRQ line.
270 */
271typedef enum {
272 IRQ_TARGET_STATE_SECURE = 0,
273 IRQ_TARGET_STATE_NON_SECURE
274} irq_target_state_t;
275
276#endif /* CONFIG_ARM_SECURE_FIRMWARE */
277
278#endif /* _ASMLANGUAGE */
279
280#ifdef __cplusplus
281}
282#endif
283
284#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:54
void arm_irq_priority_set(unsigned int irq, unsigned int prio, uint32_t flags)
#define arch_irq_enable(irq)
Definition irq.h:53
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:55
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.