1 /*-
2 * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to The NetBSD Foundation
6 * by Raytheon BBN Technologies Corp and Defense Advanced Research Projects
7 * Agency and which was developed by Matt Thomas of 3am Software Foundry.
8 *
9 * This material is based upon work supported by the Defense Advanced Research
10 * Projects Agency and Space and Naval Warfare Systems Center, Pacific, under
11 * Contract No. N66001-09-C-2073.
12 * Approved for Public Release, Distribution Unlimited
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 #define __INTR_PRIVATE
37 #define __INTR_NOINLINE
38
39 #include <sys/cdefs.h>
40 __KERNEL_RCSID(0, "$NetBSD: intr_stubs.c,v 1.7 2020/07/06 09:34:18 rin Exp $");
41
42 #include <sys/param.h>
43 #include <sys/cpu.h>
44 #include <sys/intr.h>
45
46 static int
null_splraise(int ipl)47 null_splraise(int ipl)
48 {
49 int cpl = curcpu()->ci_cpl;
50 curcpu()->ci_cpl = ipl;
51 return cpl;
52 }
53
54 static void
null_splx(int ipl)55 null_splx(int ipl)
56 {
57 curcpu()->ci_cpl = ipl;
58 }
59
60 static const struct intrsw null_intrsw = {
61 .intrsw_splraise = null_splraise,
62 .intrsw_splx = null_splx,
63 };
64
65 const struct intrsw *powerpc_intrsw = &null_intrsw;
66
67 #define __stub __section(".stub") __noprofile
68
69 void *intr_establish(int, int, int, int (*)(void *), void *) __noprofile;
70
71 void *
intr_establish(int irq,int ipl,int ist,int (* func)(void *),void * arg)72 intr_establish(int irq, int ipl, int ist, int (*func)(void *), void *arg)
73 {
74 return (*powerpc_intrsw->intrsw_establish)(irq, ipl, ist, func, arg,
75 NULL);
76 }
77
78 void *intr_establish_xname(int, int, int, int (*)(void *), void *,
79 const char *) __stub;
80
81 void *
intr_establish_xname(int irq,int ipl,int ist,int (* func)(void *),void * arg,const char * xname)82 intr_establish_xname(int irq, int ipl, int ist, int (*func)(void *), void *arg,
83 const char *xname)
84 {
85 return (*powerpc_intrsw->intrsw_establish)(irq, ipl, ist, func, arg,
86 xname);
87 }
88
89 void intr_disestablish(void *) __stub;
90
91 void
intr_disestablish(void * ih)92 intr_disestablish(void *ih)
93 {
94 (*powerpc_intrsw->intrsw_disestablish)(ih);
95 }
96
97 const char *intr_string(int, int, char *, size_t) __stub;
98
99 const char *
intr_string(int irq,int ist,char * buf,size_t len)100 intr_string(int irq, int ist, char *buf, size_t len)
101 {
102 return (*powerpc_intrsw->intrsw_string)(irq, ist, buf, len);
103 }
104
105 void spl0(void) __stub;
106
107 void
spl0(void)108 spl0(void)
109 {
110 (*powerpc_intrsw->intrsw_spl0)();
111 }
112
113 int splraise(int) __stub;
114
115 int
splraise(int ipl)116 splraise(int ipl)
117 {
118 return (*powerpc_intrsw->intrsw_splraise)(ipl);
119 }
120
121 /*
122 * This is called by softint_cleanup and can't be a stub but it can call
123 * a stub.
124 */
125 int
splhigh(void)126 splhigh(void)
127 {
128 return splraise(IPL_HIGH);
129 }
130
131 void splx(int) __stub;
132
133 void
splx(int ipl)134 splx(int ipl)
135 {
136 return (*powerpc_intrsw->intrsw_splx)(ipl);
137 }
138
139 #ifdef __HAVE_FAST_SOFTINTS
140 void softint_init_md(struct lwp *, u_int, uintptr_t *) __stub;
141
142 void
softint_init_md(struct lwp * l,u_int level,uintptr_t * machdep_p)143 softint_init_md(struct lwp *l, u_int level, uintptr_t *machdep_p)
144 {
145 (*powerpc_intrsw->intrsw_softint_init_md)(l, level, machdep_p);
146 }
147
148 void softint_trigger(uintptr_t) __stub;
149
150 void
softint_trigger(uintptr_t machdep)151 softint_trigger(uintptr_t machdep)
152 {
153 (*powerpc_intrsw->intrsw_softint_trigger)(machdep);
154 }
155 #endif
156
157 void intr_cpu_attach(struct cpu_info *) __stub;
158
159 void
intr_cpu_attach(struct cpu_info * ci)160 intr_cpu_attach(struct cpu_info *ci)
161 {
162 (*powerpc_intrsw->intrsw_cpu_attach)(ci);
163 }
164
165 void intr_cpu_hatch(struct cpu_info *) __stub;
166
167 void
intr_cpu_hatch(struct cpu_info * ci)168 intr_cpu_hatch(struct cpu_info *ci)
169 {
170 (*powerpc_intrsw->intrsw_cpu_hatch)(ci);
171 }
172
173 void intr_init(void) __stub;
174
175 void
intr_init(void)176 intr_init(void)
177 {
178 (*powerpc_intrsw->intrsw_init)();
179 }
180
181 void intr_critintr(struct trapframe *) __stub;
182
183 void
intr_critintr(struct trapframe * tf)184 intr_critintr(struct trapframe *tf)
185 {
186 (*powerpc_intrsw->intrsw_critintr)(tf);
187
188 }
189
190 void intr_extintr(struct trapframe *) __stub;
191
192 void
intr_extintr(struct trapframe * tf)193 intr_extintr(struct trapframe *tf)
194 {
195 (*powerpc_intrsw->intrsw_extintr)(tf);
196
197 }
198
199 void intr_decrintr(struct trapframe *) __stub;
200
201 void
intr_decrintr(struct trapframe * tf)202 intr_decrintr(struct trapframe *tf)
203 {
204 (*powerpc_intrsw->intrsw_decrintr)(tf);
205
206 }
207
208 void intr_fitintr(struct trapframe *) __stub;
209
210 void
intr_fitintr(struct trapframe * tf)211 intr_fitintr(struct trapframe *tf)
212 {
213 (*powerpc_intrsw->intrsw_fitintr)(tf);
214
215 }
216
217 void intr_wdogintr(struct trapframe *) __stub;
218
219 void
intr_wdogintr(struct trapframe * tf)220 intr_wdogintr(struct trapframe *tf)
221 {
222 (*powerpc_intrsw->intrsw_wdogintr)(tf);
223 }
224
225 void cpu_send_ipi(cpuid_t, uint32_t) __stub;
226
227 void
cpu_send_ipi(cpuid_t id,uint32_t mask)228 cpu_send_ipi(cpuid_t id, uint32_t mask)
229 {
230 (*powerpc_intrsw->intrsw_cpu_send_ipi)(id, mask);
231 }
232