1/* $OpenBSD: intr.h,v 1.26 2025/05/11 19:41:05 miod Exp $ */
2/* $NetBSD: intr.h,v 1.8 2001/01/14 23:50:30 thorpej Exp $ */
3
4/*-
5 * Copyright (c) 1998 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Paul Kranenburg.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef _MACHINE_INTR_H_
34#define _MACHINE_INTR_H_
35
36#include <sparc64/sparc64/intreg.h>
37
38#include <sys/evcount.h>
39
40/*
41 * Interrupt handler chains. Interrupt handlers should return 0 for
42 * ``not me'' or 1 (``I took care of it''). intr_establish() inserts a
43 * handler into the list. The handler is called with its (single)
44 * argument, or with a pointer to a clockframe if ih_arg is NULL.
45 */
46struct intrhand {
47 int (*ih_fun)(void *);
48 void *ih_arg;
49 short ih_number; /* interrupt number */
50 /* the H/W provides */
51 char ih_pil; /* interrupt priority */
52 char ih_mpsafe;
53 struct intrhand *ih_next; /* global list */
54 struct intrhand *ih_pending; /* pending list */
55 volatile u_int64_t *ih_map; /* interrupt map reg */
56 volatile u_int64_t *ih_clr; /* clear interrupt reg */
57 void (*ih_ack)(struct intrhand *);
58 struct evcount ih_count; /* # of interrupts */
59 const void *ih_bus; /* parent bus */
60 struct cpu_info *ih_cpu; /* target */
61 char ih_name[32]; /* device name */
62};
63
64extern struct intrhand *intrlev[MAXINTNUM];
65
66void intr_establish(struct intrhand *);
67
68/* XXX - arbitrary numbers; no interpretation is defined yet */
69#define IPL_NONE 0 /* nothing */
70#define IPL_SOFTINT 1 /* softint */
71#define IPL_SOFTCLOCK 1 /* timeouts */
72#define IPL_SOFTNET 2 /* protocol stack */
73#define IPL_BIO PIL_BIO /* block I/O */
74#define IPL_NET PIL_NET /* network */
75#define IPL_SOFTTTY 4 /* delayed terminal handling */
76#define IPL_TTY PIL_TTY /* terminal */
77#define IPL_VM PIL_VM /* memory allocation */
78#define IPL_AUDIO PIL_AUD /* audio */
79#define IPL_CLOCK PIL_CLOCK /* clock */
80#define IPL_SERIAL PIL_SER /* serial */
81#define IPL_SCHED PIL_SCHED /* scheduler */
82#define IPL_STATCLOCK PIL_STATCLOCK /* statclock */
83#define IPL_HIGH PIL_HIGH /* everything */
84
85#define spl0() _spl(IPL_NONE)
86#define splsoftclock() _splraise(IPL_SOFTCLOCK)
87#define splsoftnet() _splraise(IPL_SOFTNET)
88#define splbio() _splraise(IPL_BIO)
89#define splnet() _splraise(IPL_NET)
90#define splsofttty() _splraise(IPL_SOFTTTY)
91#define spltty() _splraise(IPL_TTY)
92#define splvm() _splraise(IPL_VM)
93#define splaudio() _splraise(IPL_AUDIO)
94#define splclock() _splraise(IPL_CLOCK)
95#define splserial() _splraise(IPL_SERIAL)
96#define splsched() _splraise(IPL_SCHED)
97#define splstatclock() _splraise(IPL_STATCLOCK)
98#define splhigh() _splraise(IPL_HIGH)
99#define splx(_oldipl) _splx(_oldipl)
100
101#define splzs() splserial()
102
103#define IPL_MPFLOOR IPL_SERIAL
104#define IPL_MPSAFE 0x100
105
106int splraise(int);
107void intr_barrier(void *);
108
109void *softintr_establish(int, void (*)(void *), void *);
110void softintr_disestablish(void *);
111void softintr_schedule(void *);
112
113void *softintr_establish_raw(int, void (*)(void *), void *);
114#define softintr_disestablish_raw(ih) softintr_disestablish(ih)
115#define softintr_schedule_raw(ih) softintr_schedule(ih)
116
117void send_softint(int, struct intrhand *);
118
119#endif /* _MACHINE_INTR_H_ */