Sound Open Firmware
Loading...
Searching...
No Matches
interrupt.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2018 Intel Corporation. All rights reserved.
4 *
5 * Author: Janusz Jankowski <janusz.jankowski@linux.intel.com>
6 */
7
8#ifndef __SOF_DRIVERS_INTERRUPT_H__
9#define __SOF_DRIVERS_INTERRUPT_H__
10
11#include <platform/drivers/interrupt.h>
12
13#if !defined(__ASSEMBLER__) && !defined(LINKER)
14#include <arch/drivers/interrupt.h>
15#include <sof/lib/cpu.h>
16#include <sof/list.h>
17#include <rtos/sof.h>
18#include <rtos/spinlock.h>
19#include <sof/trace/trace.h>
20#include <user/trace.h>
21#include <stdbool.h>
22#include <stdint.h>
23
27struct irq_child {
28 int enable_count[CONFIG_CORE_COUNT];
29 struct list_item list;
32};
33
37struct irq_desc {
38 int irq;
39 void (*handler)(void *arg);
41 uint32_t cpu_mask;
45};
46
51 void (*mask)(struct irq_desc *desc, uint32_t irq,
52 unsigned int cpu);
53 void (*unmask)(struct irq_desc *desc, uint32_t irq,
54 unsigned int cpu);
55};
56
61 const char *name;
68 const struct irq_cascade_ops *ops;
72 struct irq_desc desc;
84 struct k_spinlock lock;
88 int enable_count[CONFIG_CORE_COUNT];
91 unsigned int num_children[CONFIG_CORE_COUNT];
93 struct irq_child child[PLATFORM_IRQ_CHILDREN];
97};
98
99/* A descriptor for cascading interrupt controller template */
101 const char *name;
102 const struct irq_cascade_ops *ops;
103 int irq;
104 void (*handler)(void *arg);
106};
107
112 struct k_spinlock lock;
115};
116
117static inline struct cascade_root *cascade_root_get(void)
118{
119 return sof_get()->cascade_root;
120}
121
122/* For i.MX, while building SOF with Zephyr use the interrupt_*
123 * functions from second level interrupt handling and IRQ_STEER.
124 */
125#if defined(__ZEPHYR__) && (defined(CONFIG_IMX) || defined(CONFIG_AMD))
126int mux_interrupt_get_irq(unsigned int irq, const char *cascade);
127int mux_interrupt_register(uint32_t irq, void(*handler)(void *arg), void *arg);
128void mux_interrupt_unregister(uint32_t irq, const void *arg);
129uint32_t mux_interrupt_enable(uint32_t irq, void *arg);
130uint32_t mux_interrupt_disable(uint32_t irq, void *arg);
131#endif
132
133int interrupt_register(uint32_t irq, void(*handler)(void *arg), void *arg);
134void interrupt_unregister(uint32_t irq, const void *arg);
135uint32_t interrupt_enable(uint32_t irq, void *arg);
136uint32_t interrupt_disable(uint32_t irq, void *arg);
137
138/* Zephyr compat */
139#if !defined(__ZEPHYR__)
140#define arch_irq_lock() arch_interrupt_disable_mask(0xffffffff)
141#endif
142
144
145void platform_interrupt_set(uint32_t irq);
146void platform_interrupt_clear(uint32_t irq, uint32_t mask);
148void interrupt_mask(uint32_t irq, unsigned int cpu);
149void interrupt_unmask(uint32_t irq, unsigned int cpu);
150
151/*
152 * On platforms, supporting cascading interrupts cascaded interrupt numbers
153 * are greater than or equal to PLATFORM_IRQ_HW_NUM
154 */
155#define interrupt_is_dsp_direct(irq) (!PLATFORM_IRQ_CHILDREN || \
156 irq < PLATFORM_IRQ_HW_NUM)
157
158void interrupt_init(struct sof *sof);
161int interrupt_get_irq(unsigned int irq, const char *cascade);
162
163static inline void interrupt_set(int irq)
164{
166}
167
168static inline void interrupt_clear_mask(int irq, uint32_t mask)
169{
170 platform_interrupt_clear(irq, mask);
171}
172
173static inline void interrupt_clear(int irq)
174{
175 interrupt_clear_mask(irq, 1);
176}
177
178static inline uint32_t interrupt_global_disable(void)
179{
180 return arch_interrupt_global_disable();
181}
182
183static inline void interrupt_global_enable(uint32_t flags)
184{
185 arch_interrupt_global_enable(flags);
186}
187
188#if CONFIG_LIBRARY
189
190/* temporary fix to remove build warning for testbench that will need shortly
191 * realigned when Zephyr native APIs are used.
192 */
193static inline void __irq_local_disable(unsigned long flags) {}
194static inline void __irq_local_enable(unsigned long flags) {}
195
196/* disables all IRQ sources on current core - NO effect on library */
197#define irq_local_disable(flags) \
198 do { \
199 flags = 0; \
200 __irq_local_disable(flags); \
201 } while (0)
202
203/* re-enables IRQ sources on current core - NO effect on library*/
204#define irq_local_enable(flags) \
205 __irq_local_enable(flags)
206
207#else
208/* disables all IRQ sources on current core */
209#define irq_local_disable(flags) \
210 (flags = interrupt_global_disable())
211
212/* re-enables IRQ sources on current core */
213#define irq_local_enable(flags) \
214 interrupt_global_enable(flags)
215#endif
216#endif
217#endif /* __SOF_DRIVERS_INTERRUPT_H__ */
CPU header file.
#define list_item(item, type, member)
Definition list.h:80
struct sof * sof_get(void)
Cascading interrupt controller root.
Definition interrupt.h:111
struct k_spinlock lock
locking mechanism
Definition interrupt.h:112
int last_irq
last registered cascade irq
Definition interrupt.h:114
struct irq_cascade_desc * list
list of child cascade irqs
Definition interrupt.h:113
cascading interrupt controller descriptor.
Definition interrupt.h:60
const struct irq_cascade_ops * ops
cascading interrupt controller driver operations
Definition interrupt.h:68
struct k_spinlock lock
protect child lists, enable and child counters
Definition interrupt.h:84
unsigned int num_children[CONFIG_CORE_COUNT]
number of children
Definition interrupt.h:91
struct irq_cascade_desc * next
link to the global list of interrupt controllers
Definition interrupt.h:76
const char * name
name of the controller
Definition interrupt.h:61
int enable_count[CONFIG_CORE_COUNT]
enabled child interrupt counter
Definition interrupt.h:88
int irq_base
first virtual IRQ number, assigned to this controller
Definition interrupt.h:64
struct irq_child child[PLATFORM_IRQ_CHILDREN]
array of child lists - one per multiplexed IRQ
Definition interrupt.h:93
struct irq_desc desc
the interrupt, that this controller is generating
Definition interrupt.h:72
bool global_mask
the controller cannot mask input interrupts per core
Definition interrupt.h:80
cascading IRQ controller operations.
Definition interrupt.h:50
void(* mask)(struct irq_desc *desc, uint32_t irq, unsigned int cpu)
mask
Definition interrupt.h:51
void(* unmask)(struct irq_desc *desc, uint32_t irq, unsigned int cpu)
unmask
Definition interrupt.h:53
Definition interrupt.h:100
bool global_mask
Definition interrupt.h:105
const char * name
Definition interrupt.h:101
const struct irq_cascade_ops * ops
Definition interrupt.h:102
int irq
Definition interrupt.h:103
void(* handler)(void *arg)
Definition interrupt.h:104
child IRQ descriptor for cascading IRQ controllers.
Definition interrupt.h:27
struct list_item list
head for IRQ descriptors, sharing this interrupt
Definition interrupt.h:29
int enable_count[CONFIG_CORE_COUNT]
IRQ enable counter.
Definition interrupt.h:28
interrupt client descriptor
Definition interrupt.h:37
struct list_item irq_list
to link to other irq_desc
Definition interrupt.h:44
void(* handler)(void *arg)
interrupt handler function
Definition interrupt.h:39
void * handler_arg
interrupt handler argument
Definition interrupt.h:40
uint32_t cpu_mask
a mask of CPUs on which this interrupt is enabled
Definition interrupt.h:41
int irq
virtual IRQ number
Definition interrupt.h:38
General firmware context.
Definition sof.h:44
struct cascade_root * cascade_root
Definition sof.h:94
void interrupt_unregister(uint32_t irq, const void *arg)
static uint32_t interrupt_global_disable(void)
Definition interrupt.h:178
void platform_interrupt_init(void)
void interrupt_init(struct sof *sof)
void platform_interrupt_set(uint32_t irq)
static void interrupt_clear(int irq)
Definition interrupt.h:173
uint32_t platform_interrupt_get_enabled(void)
uint32_t interrupt_enable(uint32_t irq, void *arg)
void platform_interrupt_clear(uint32_t irq, uint32_t mask)
struct irq_cascade_desc * interrupt_get_parent(uint32_t irq)
int interrupt_cascade_register(const struct irq_cascade_tmpl *tmpl)
void interrupt_mask(uint32_t irq, unsigned int cpu)
static void interrupt_global_enable(uint32_t flags)
Definition interrupt.h:183
int interrupt_register(uint32_t irq, void(*handler)(void *arg), void *arg)
static void interrupt_set(int irq)
Definition interrupt.h:163
uint32_t interrupt_disable(uint32_t irq, void *arg)
static struct cascade_root * cascade_root_get(void)
Definition interrupt.h:117
void interrupt_unmask(uint32_t irq, unsigned int cpu)
int interrupt_get_irq(unsigned int irq, const char *cascade)
static void interrupt_clear_mask(int irq, uint32_t mask)
Definition interrupt.h:168