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