Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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
14#ifndef ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
15#define ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
16
17#ifndef _ASMLANGUAGE
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#include <zephyr/irq.h>
24#include <zephyr/sw_isr_table.h>
25#include <stdbool.h>
26#include <soc.h>
27
28extern void arch_irq_enable(unsigned int irq);
29extern void arch_irq_disable(unsigned int irq);
30extern int arch_irq_is_enabled(unsigned int irq);
31
32#if defined(CONFIG_RISCV_HAS_PLIC) || defined(CONFIG_RISCV_HAS_CLIC)
33extern void z_riscv_irq_priority_set(unsigned int irq,
34 unsigned int prio,
36#else
37#define z_riscv_irq_priority_set(i, p, f) /* Nothing */
38#endif /* CONFIG_RISCV_HAS_PLIC || CONFIG_RISCV_HAS_CLIC */
39
40#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
41{ \
42 Z_ISR_DECLARE(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
43 0, isr_p, isr_param_p); \
44 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
45}
46
47#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
48{ \
49 Z_ISR_DECLARE(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
50 ISR_FLAG_DIRECT, isr_p, NULL); \
51}
52
53#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
54#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
55
56#ifdef CONFIG_TRACING_ISR
57extern void sys_trace_isr_enter(void);
58extern void sys_trace_isr_exit(void);
59#endif
60
61static inline void arch_isr_direct_header(void)
62{
63#ifdef CONFIG_TRACING_ISR
65#endif
66 /* We need to increment this so that arch_is_in_isr() keeps working */
67 ++(arch_curr_cpu()->nested);
68}
69
70extern void __soc_handle_irq(unsigned long mcause);
71
72static inline void arch_isr_direct_footer(int swap)
73{
74 ARG_UNUSED(swap);
75 unsigned long mcause;
76
77 /* Get the IRQ number */
78 __asm__ volatile("csrr %0, mcause" : "=r" (mcause));
79 mcause &= SOC_MCAUSE_EXP_MASK;
80
81 /* Clear the pending IRQ */
82 __soc_handle_irq(mcause);
83
84 /* We are not in the ISR anymore */
85 --(arch_curr_cpu()->nested);
86
87#ifdef CONFIG_TRACING_ISR
89#endif
90}
91
92/*
93 * TODO: Add support for rescheduling
94 */
95#define ARCH_ISR_DIRECT_DECLARE(name) \
96 static inline int name##_body(void); \
97 __attribute__ ((interrupt)) void name(void) \
98 { \
99 ISR_DIRECT_HEADER(); \
100 name##_body(); \
101 ISR_DIRECT_FOOTER(0); \
102 } \
103 static inline int name##_body(void)
104
105
106#ifdef __cplusplus
107}
108#endif
109
110#endif /* _ASMLANGUAGE */
111#endif /* ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_ */
static ALWAYS_INLINE _cpu_t * arch_curr_cpu(void)
Definition: arch_inlines.h:17
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:98
#define arch_irq_enable(irq)
Definition: irq.h:97
#define arch_irq_is_enabled(irq)
Definition: irq.h:100
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:96
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
Software-managed ISR table.