Zephyr Project API  3.2.0
A Scalable Open Source RTOS
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, 0, isr_p, isr_param_p); \
43 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
44}
45
46#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
47{ \
48 Z_ISR_DECLARE(irq_p, ISR_FLAG_DIRECT, isr_p, NULL); \
49}
50
51#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
52#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
53
54#ifdef CONFIG_TRACING_ISR
55extern void sys_trace_isr_enter(void);
56extern void sys_trace_isr_exit(void);
57#endif
58
59static inline void arch_isr_direct_header(void)
60{
61#ifdef CONFIG_TRACING_ISR
63#endif
64 /* We need to increment this so that arch_is_in_isr() keeps working */
65 ++(arch_curr_cpu()->nested);
66}
67
68extern void __soc_handle_irq(unsigned long mcause);
69
70static inline void arch_isr_direct_footer(int swap)
71{
72 unsigned long mcause;
73
74 /* Get the IRQ number */
75 __asm__ volatile("csrr %0, mcause" : "=r" (mcause));
76 mcause &= SOC_MCAUSE_EXP_MASK;
77
78 /* Clear the pending IRQ */
79 __soc_handle_irq(mcause);
80
81 /* We are not in the ISR anymore */
82 --(arch_curr_cpu()->nested);
83
84#ifdef CONFIG_TRACING_ISR
86#endif
87}
88
89/*
90 * TODO: Add support for rescheduling
91 */
92#define ARCH_ISR_DIRECT_DECLARE(name) \
93 static inline int name##_body(void); \
94 __attribute__ ((interrupt)) void name(void) \
95 { \
96 ISR_DIRECT_HEADER(); \
97 name##_body(); \
98 ISR_DIRECT_FOOTER(0); \
99 } \
100 static inline int name##_body(void)
101
102
103#ifdef __cplusplus
104}
105#endif
106
107#endif /* _ASMLANGUAGE */
108#endif /* ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_ */
static ALWAYS_INLINE _cpu_t * arch_curr_cpu(void)
Definition: arch_inlines.h:17
void arch_irq_disable(unsigned int irq)
int arch_irq_is_enabled(unsigned int irq)
void arch_irq_enable(unsigned int irq)
static void arch_isr_direct_footer(int swap)
Definition: irq.h:70
static void arch_isr_direct_header(void)
Definition: irq.h:59
void sys_trace_isr_enter(void)
Called when entering an ISR.
void sys_trace_isr_exit(void)
Called when exiting an ISR.
flags
Definition: http_parser.h:131
Public interface for configuring interrupts.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
Software-managed ISR table.