1/*	$OpenBSD: intr.h,v 1.14 2021/05/30 15:06:53 visa Exp $	*/
2
3/*
4 * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#ifndef _MACHINE_INTR_H_
20#define _MACHINE_INTR_H_
21
22#include <sys/queue.h>
23
24struct cpu_info;
25struct trapframe;
26
27#define IPL_NONE	0
28#define IPL_SOFT	1
29#define IPL_SOFTCLOCK	2
30#define IPL_SOFTNET	3
31#define IPL_SOFTTTY	4
32#define IPL_BIO		5
33#define IPL_NET		6
34#define IPL_TTY		7
35#define IPL_VM		IPL_TTY
36#define IPL_AUDIO	8
37#define IPL_CLOCK	9
38#define IPL_STATCLOCK	IPL_CLOCK
39#define IPL_SCHED	IPL_CLOCK
40#define IPL_HIGH	IPL_CLOCK
41#define IPL_IPI		10
42#define NIPL		11
43
44#define	IPL_MPFLOOR	IPL_TTY
45/* Interrupt priority 'flags'. */
46#define	IPL_IRQMASK	0xf	/* priority only */
47#define	IPL_FLAGMASK	0xf00	/* flags only*/
48#define	IPL_MPSAFE	0x100	/* 'mpsafe' interrupt, no kernel lock */
49
50int	splraise(int);
51int	spllower(int);
52void	splx(int);
53
54#define spl0()		spllower(IPL_NONE)
55#define splsoftclock()	splraise(IPL_SOFTCLOCK)
56#define splsoftnet()	splraise(IPL_SOFTNET)
57#define splsofttty()	splraise(IPL_SOFTTTY)
58#define splbio()	splraise(IPL_BIO)
59#define splnet()	splraise(IPL_NET)
60#define spltty()	splraise(IPL_TTY)
61#define splvm()		splraise(IPL_VM)
62#define splclock()	splraise(IPL_CLOCK)
63#define splstatclock()	splraise(IPL_STATCLOCK)
64#define splsched()	splraise(IPL_SCHED)
65#define splhigh()	splraise(IPL_HIGH)
66
67#ifdef DIAGNOSTIC
68/*
69 * Although this function is implemented in MI code, it must be in this MD
70 * header because we don't want this header to include MI includes.
71 */
72void splassert_fail(int, int, const char *);
73extern int splassert_ctl;
74void splassert_check(int, const char *);
75#define splassert(__wantipl) do {			\
76	if (splassert_ctl > 0) {			\
77		splassert_check(__wantipl, __func__);	\
78	}						\
79} while (0)
80#define	splsoftassert(wantipl)	splassert(wantipl)
81#else
82#define	splassert(wantipl)	do { /* nothing */ } while (0)
83#define	splsoftassert(wantipl)	do { /* nothing */ } while (0)
84#endif
85
86void	intr_init(void);
87
88#define intr_barrier(x)
89
90#define IST_EDGE	0
91#define IST_LEVEL	1
92
93void	*intr_establish(uint32_t, int, int, struct cpu_info *,
94	    int (*)(void *), void *, const char *);
95
96#define IPI_NOP		0
97#define IPI_DDB		(1 << 0)
98#define IPI_SETPERF	(1 << 1)
99
100void	intr_send_ipi(struct cpu_info *, int);
101
102extern void (*_exi)(struct trapframe *);
103extern void (*_hvi)(struct trapframe *);
104extern void *(*_intr_establish)(uint32_t, int, int, struct cpu_info *,
105	    int (*)(void *), void *, const char *);
106extern void (*_intr_send_ipi)(void *);
107extern void (*_setipl)(int);
108
109#include <machine/softintr.h>
110
111struct interrupt_controller {
112	int	ic_node;
113	void	*ic_cookie;
114	void	*(*ic_establish)(void *, int *, int, struct cpu_info *,
115		    int (*)(void *), void *, char *);
116	void	(*ic_send_ipi)(void *);
117
118	LIST_ENTRY(interrupt_controller) ic_list;
119	uint32_t ic_phandle;
120	uint32_t ic_cells;
121};
122
123void	interrupt_controller_register(struct interrupt_controller *);
124
125void	*fdt_intr_establish_idx_cpu(int, int, int, struct cpu_info *,
126	    int (*)(void *), void *, char *);
127void	*fdt_intr_establish_imap(int, int *, int, int, int (*)(void *),
128	    void *, char *);
129void	*fdt_intr_establish_imap_cpu(int, int *, int, int,
130	    struct cpu_info *, int (*)(void *), void *, char *);
131
132#endif /* _MACHINE_INTR_H_ */
133