Zephyr API Documentation 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) 2022 Carlo Caione <ccaione@baylibre.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
13
14#ifndef ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
15#define ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
22
23#ifndef _ASMLANGUAGE
24#include <zephyr/irq.h>
25#include <zephyr/sw_isr_table.h>
26#include <stdbool.h>
27#endif /* !_ASMLANGUAGE */
28
29/* Exceptions 0-15 (MCAUSE interrupt=0) */
30
32#define RISCV_EXC_BREAKPOINT 3
33/* Environment Call from U-mode */
34#define RISCV_EXC_ECALLU 8
36#define RISCV_EXC_ECALLS 9
38#define RISCV_EXC_ECALLM 11
39
40/* IRQs 0-15 (MCAUSE interrupt=1) */
41
43#define RISCV_IRQ_MSOFT 3
45#define RISCV_IRQ_MEXT 11
46
47#ifdef CONFIG_64BIT
48#define RISCV_MCAUSE_IRQ_POS 63U
49#define RISCV_MCAUSE_IRQ_BIT BIT64(RISCV_MCAUSE_IRQ_POS)
50#else
51#define RISCV_MCAUSE_IRQ_POS 31U
52#define RISCV_MCAUSE_IRQ_BIT BIT(RISCV_MCAUSE_IRQ_POS)
53#endif
54
55#ifndef _ASMLANGUAGE
56
57extern void arch_irq_enable(unsigned int irq);
58extern void arch_irq_disable(unsigned int irq);
59extern int arch_irq_is_enabled(unsigned int irq);
60
61#if defined(CONFIG_RISCV_HAS_PLIC) || defined(CONFIG_RISCV_HAS_CLIC)
62extern void z_riscv_irq_priority_set(unsigned int irq,
63 unsigned int prio,
65#else
66#define z_riscv_irq_priority_set(i, p, f) /* Nothing */
67#endif /* CONFIG_RISCV_HAS_PLIC || CONFIG_RISCV_HAS_CLIC */
68
69#ifdef CONFIG_RISCV_HAS_CLIC
70extern void z_riscv_irq_vector_set(unsigned int irq);
71#else
72#define z_riscv_irq_vector_set(i) /* Nothing */
73#endif /* CONFIG_RISCV_HAS_CLIC */
74
75#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
76{ \
77 Z_ISR_DECLARE(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
78 0, isr_p, isr_param_p); \
79 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
80}
81
82#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
83{ \
84 Z_ISR_DECLARE_DIRECT(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
85 ISR_FLAG_DIRECT, isr_p); \
86 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
87 z_riscv_irq_vector_set(irq_p); \
88}
89
90#ifdef CONFIG_PM
91extern void arch_isr_direct_pm(void);
92#define ARCH_ISR_DIRECT_PM() arch_isr_direct_pm()
93#else
94#define ARCH_ISR_DIRECT_PM() \
95 do { \
96 } while (false)
97#endif
98
99#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
100#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
101
102#ifdef CONFIG_TRACING_ISR
103extern void sys_trace_isr_enter(void);
104extern void sys_trace_isr_exit(void);
105#endif
106
107static inline void arch_isr_direct_header(void)
108{
109#ifdef CONFIG_TRACING_ISR
111#endif
112 /* We need to increment this so that arch_is_in_isr() keeps working */
113 ++(arch_curr_cpu()->nested);
114}
115
116extern unsigned long __soc_handle_irq(unsigned long mcause);
117
118static inline void arch_isr_direct_footer(int swap)
119{
120 ARG_UNUSED(swap);
121 unsigned long cause;
122
123#ifdef CONFIG_RISCV_S_MODE
124 __asm__ volatile("csrr %0, scause" : "=r" (cause));
125#else
126 __asm__ volatile("csrr %0, mcause" : "=r" (cause));
127#endif
128 cause &= CONFIG_RISCV_MCAUSE_EXCEPTION_MASK;
129
130 /* Clear the pending IRQ */
131 __soc_handle_irq(cause);
132
133 /* We are not in the ISR anymore */
134 --(arch_curr_cpu()->nested);
135
136#ifdef CONFIG_TRACING_ISR
138#endif
139}
140
141/*
142 * TODO: Add support for rescheduling
143 */
144#ifdef CONFIG_RISCV_S_MODE
145#define ARCH_ISR_DIRECT_DECLARE(name) \
146 static inline int name##_body(void); \
147 __attribute__ ((interrupt("supervisor"))) void name(void) \
148 { \
149 ISR_DIRECT_HEADER(); \
150 name##_body(); \
151 ISR_DIRECT_FOOTER(0); \
152 } \
153 static inline int name##_body(void)
154#else
155#define ARCH_ISR_DIRECT_DECLARE(name) \
156 static inline int name##_body(void); \
157 __attribute__ ((interrupt)) void name(void) \
158 { \
159 ISR_DIRECT_HEADER(); \
160 name##_body(); \
161 ISR_DIRECT_FOOTER(0); \
162 } \
163 static inline int name##_body(void)
164#endif
165
166#endif /* _ASMLANGUAGE */
167
168#ifdef __cplusplus
169}
170#endif
171
172#endif /* ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_ */
static ALWAYS_INLINE _cpu_t * arch_curr_cpu(void)
Definition arch_inlines.h:17
#define arch_irq_disable(irq)
Definition irq.h:59
#define arch_irq_enable(irq)
Definition irq.h:58
#define arch_irq_is_enabled(irq)
Definition irq.h:60
static void arch_isr_direct_footer(int swap)
Definition irq.h:118
static void arch_isr_direct_header(void)
Definition irq.h:107
void sys_trace_isr_enter(void)
Called when entering an ISR.
void sys_trace_isr_exit(void)
Called when exiting an ISR.
Public interface for configuring interrupts.
flags
Definition parser.h:97
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Software-managed ISR table.
Macro utilities.