1 #include <sys/param.h>
2
3 #include <machine/intr_machdep.h>
4 #include <machine/msi_machdep.h>
5 #include <machine/msi_var.h>
6 #include <machine/md_var.h>
7
8 #include <machine_base/apic/apicreg.h>
9 #include <machine_base/apic/lapic.h>
10
11 /* MSI address */
12 #define MSI_X86_ADDR_DEST 0x000ff000
13 #define MSI_X86_ADDR_RH 0x00000008
14 # define MSI_X86_ADDR_RH_ON 0x00000008
15 # define MSI_X86_ADDR_RH_OFF 0x00000000
16 #define MSI_X86_ADDR_DM 0x00000004
17 # define MSI_X86_ADDR_DM_PHYSICAL 0x00000000
18 # define MSI_X86_ADDR_DM_LOGICAL 0x00000004
19
20 /* MSI data */
21 #define MSI_X86_DATA_TRGRMOD IOART_TRGRMOD /* Trigger mode. */
22 # define MSI_X86_DATA_TRGREDG IOART_TRGREDG
23 # define MSI_X86_DATA_TRGRLVL IOART_TRGRLVL
24 #define MSI_X86_DATA_LEVEL 0x00004000 /* Polarity. */
25 # define MSI_X86_DATA_DEASSERT 0x00000000
26 # define MSI_X86_DATA_ASSERT 0x00004000
27 #define MSI_X86_DATA_DELMOD IOART_DELMOD /* Delivery mode. */
28 # define MSI_X86_DATA_DELFIXED IOART_DELFIXED
29 # define MSI_X86_DATA_DELLOPRI IOART_DELLOPRI
30 # define MSI_X86_DATA_DELSMI IOART_DELSMI
31 # define MSI_X86_DATA_DELNMI IOART_DELNMI
32 # define MSI_X86_DATA_DELINIT IOART_DELINIT
33 # define MSI_X86_DATA_DELEXINT IOART_DELEXINT
34
35 #define MSI_X86_ADDR(lapic_id) \
36 (MSI_X86_ADDR_BASE | (lapic_id) << 12 | \
37 MSI_X86_ADDR_RH_OFF | MSI_X86_ADDR_DM_PHYSICAL)
38 #define MSI_X86_DATA(vector) \
39 (MSI_X86_DATA_TRGREDG | MSI_X86_DATA_DELFIXED | (vector))
40
41 extern inthand_t
42 IDTVEC(msi_intr0),
43 IDTVEC(msi_intr1),
44 IDTVEC(msi_intr2),
45 IDTVEC(msi_intr3),
46 IDTVEC(msi_intr4),
47 IDTVEC(msi_intr5),
48 IDTVEC(msi_intr6),
49 IDTVEC(msi_intr7),
50 IDTVEC(msi_intr8),
51 IDTVEC(msi_intr9),
52 IDTVEC(msi_intr10),
53 IDTVEC(msi_intr11),
54 IDTVEC(msi_intr12),
55 IDTVEC(msi_intr13),
56 IDTVEC(msi_intr14),
57 IDTVEC(msi_intr15),
58 IDTVEC(msi_intr16),
59 IDTVEC(msi_intr17),
60 IDTVEC(msi_intr18),
61 IDTVEC(msi_intr19),
62 IDTVEC(msi_intr20),
63 IDTVEC(msi_intr21),
64 IDTVEC(msi_intr22),
65 IDTVEC(msi_intr23),
66 IDTVEC(msi_intr24),
67 IDTVEC(msi_intr25),
68 IDTVEC(msi_intr26),
69 IDTVEC(msi_intr27),
70 IDTVEC(msi_intr28),
71 IDTVEC(msi_intr29),
72 IDTVEC(msi_intr30),
73 IDTVEC(msi_intr31),
74 IDTVEC(msi_intr32),
75 IDTVEC(msi_intr33),
76 IDTVEC(msi_intr34),
77 IDTVEC(msi_intr35),
78 IDTVEC(msi_intr36),
79 IDTVEC(msi_intr37),
80 IDTVEC(msi_intr38),
81 IDTVEC(msi_intr39),
82 IDTVEC(msi_intr40),
83 IDTVEC(msi_intr41),
84 IDTVEC(msi_intr42),
85 IDTVEC(msi_intr43),
86 IDTVEC(msi_intr44),
87 IDTVEC(msi_intr45),
88 IDTVEC(msi_intr46),
89 IDTVEC(msi_intr47),
90 IDTVEC(msi_intr48),
91 IDTVEC(msi_intr49),
92 IDTVEC(msi_intr50),
93 IDTVEC(msi_intr51),
94 IDTVEC(msi_intr52),
95 IDTVEC(msi_intr53),
96 IDTVEC(msi_intr54),
97 IDTVEC(msi_intr55),
98 IDTVEC(msi_intr56),
99 IDTVEC(msi_intr57),
100 IDTVEC(msi_intr58),
101 IDTVEC(msi_intr59),
102 IDTVEC(msi_intr60),
103 IDTVEC(msi_intr61),
104 IDTVEC(msi_intr62),
105 IDTVEC(msi_intr63),
106 IDTVEC(msi_intr64),
107 IDTVEC(msi_intr65),
108 IDTVEC(msi_intr66),
109 IDTVEC(msi_intr67),
110 IDTVEC(msi_intr68),
111 IDTVEC(msi_intr69),
112 IDTVEC(msi_intr70),
113 IDTVEC(msi_intr71),
114 IDTVEC(msi_intr72),
115 IDTVEC(msi_intr73),
116 IDTVEC(msi_intr74),
117 IDTVEC(msi_intr75),
118 IDTVEC(msi_intr76),
119 IDTVEC(msi_intr77),
120 IDTVEC(msi_intr78),
121 IDTVEC(msi_intr79),
122 IDTVEC(msi_intr80),
123 IDTVEC(msi_intr81),
124 IDTVEC(msi_intr82),
125 IDTVEC(msi_intr83),
126 IDTVEC(msi_intr84),
127 IDTVEC(msi_intr85),
128 IDTVEC(msi_intr86),
129 IDTVEC(msi_intr87),
130 IDTVEC(msi_intr88),
131 IDTVEC(msi_intr89),
132 IDTVEC(msi_intr90),
133 IDTVEC(msi_intr91),
134 IDTVEC(msi_intr92),
135 IDTVEC(msi_intr93),
136 IDTVEC(msi_intr94),
137 IDTVEC(msi_intr95),
138 IDTVEC(msi_intr96),
139 IDTVEC(msi_intr97),
140 IDTVEC(msi_intr98),
141 IDTVEC(msi_intr99),
142 IDTVEC(msi_intr100),
143 IDTVEC(msi_intr101),
144 IDTVEC(msi_intr102),
145 IDTVEC(msi_intr103),
146 IDTVEC(msi_intr104),
147 IDTVEC(msi_intr105),
148 IDTVEC(msi_intr106),
149 IDTVEC(msi_intr107),
150 IDTVEC(msi_intr108),
151 IDTVEC(msi_intr109),
152 IDTVEC(msi_intr110),
153 IDTVEC(msi_intr111),
154 IDTVEC(msi_intr112),
155 IDTVEC(msi_intr113),
156 IDTVEC(msi_intr114),
157 IDTVEC(msi_intr115),
158 IDTVEC(msi_intr116),
159 IDTVEC(msi_intr117),
160 IDTVEC(msi_intr118),
161 IDTVEC(msi_intr119),
162 IDTVEC(msi_intr120),
163 IDTVEC(msi_intr121),
164 IDTVEC(msi_intr122),
165 IDTVEC(msi_intr123),
166 IDTVEC(msi_intr124),
167 IDTVEC(msi_intr125),
168 IDTVEC(msi_intr126),
169 IDTVEC(msi_intr127),
170 IDTVEC(msi_intr128),
171 IDTVEC(msi_intr129),
172 IDTVEC(msi_intr130),
173 IDTVEC(msi_intr131),
174 IDTVEC(msi_intr132),
175 IDTVEC(msi_intr133),
176 IDTVEC(msi_intr134),
177 IDTVEC(msi_intr135),
178 IDTVEC(msi_intr136),
179 IDTVEC(msi_intr137),
180 IDTVEC(msi_intr138),
181 IDTVEC(msi_intr139),
182 IDTVEC(msi_intr140),
183 IDTVEC(msi_intr141),
184 IDTVEC(msi_intr142),
185 IDTVEC(msi_intr143),
186 IDTVEC(msi_intr144),
187 IDTVEC(msi_intr145),
188 IDTVEC(msi_intr146),
189 IDTVEC(msi_intr147),
190 IDTVEC(msi_intr148),
191 IDTVEC(msi_intr149),
192 IDTVEC(msi_intr150),
193 IDTVEC(msi_intr151),
194 IDTVEC(msi_intr152),
195 IDTVEC(msi_intr153),
196 IDTVEC(msi_intr154),
197 IDTVEC(msi_intr155),
198 IDTVEC(msi_intr156),
199 IDTVEC(msi_intr157),
200 IDTVEC(msi_intr158),
201 IDTVEC(msi_intr159),
202 IDTVEC(msi_intr160),
203 IDTVEC(msi_intr161),
204 IDTVEC(msi_intr162),
205 IDTVEC(msi_intr163),
206 IDTVEC(msi_intr164),
207 IDTVEC(msi_intr165),
208 IDTVEC(msi_intr166),
209 IDTVEC(msi_intr167),
210 IDTVEC(msi_intr168),
211 IDTVEC(msi_intr169),
212 IDTVEC(msi_intr170),
213 IDTVEC(msi_intr171),
214 IDTVEC(msi_intr172),
215 IDTVEC(msi_intr173),
216 IDTVEC(msi_intr174),
217 IDTVEC(msi_intr175),
218 IDTVEC(msi_intr176),
219 IDTVEC(msi_intr177),
220 IDTVEC(msi_intr178),
221 IDTVEC(msi_intr179),
222 IDTVEC(msi_intr180),
223 IDTVEC(msi_intr181),
224 IDTVEC(msi_intr182),
225 IDTVEC(msi_intr183),
226 IDTVEC(msi_intr184),
227 IDTVEC(msi_intr185),
228 IDTVEC(msi_intr186),
229 IDTVEC(msi_intr187),
230 IDTVEC(msi_intr188),
231 IDTVEC(msi_intr189),
232 IDTVEC(msi_intr190),
233 IDTVEC(msi_intr191);
234
235 static inthand_t *msi_intr[IDT_HWI_VECTORS] = {
236 &IDTVEC(msi_intr0),
237 &IDTVEC(msi_intr1),
238 &IDTVEC(msi_intr2),
239 &IDTVEC(msi_intr3),
240 &IDTVEC(msi_intr4),
241 &IDTVEC(msi_intr5),
242 &IDTVEC(msi_intr6),
243 &IDTVEC(msi_intr7),
244 &IDTVEC(msi_intr8),
245 &IDTVEC(msi_intr9),
246 &IDTVEC(msi_intr10),
247 &IDTVEC(msi_intr11),
248 &IDTVEC(msi_intr12),
249 &IDTVEC(msi_intr13),
250 &IDTVEC(msi_intr14),
251 &IDTVEC(msi_intr15),
252 &IDTVEC(msi_intr16),
253 &IDTVEC(msi_intr17),
254 &IDTVEC(msi_intr18),
255 &IDTVEC(msi_intr19),
256 &IDTVEC(msi_intr20),
257 &IDTVEC(msi_intr21),
258 &IDTVEC(msi_intr22),
259 &IDTVEC(msi_intr23),
260 &IDTVEC(msi_intr24),
261 &IDTVEC(msi_intr25),
262 &IDTVEC(msi_intr26),
263 &IDTVEC(msi_intr27),
264 &IDTVEC(msi_intr28),
265 &IDTVEC(msi_intr29),
266 &IDTVEC(msi_intr30),
267 &IDTVEC(msi_intr31),
268 &IDTVEC(msi_intr32),
269 &IDTVEC(msi_intr33),
270 &IDTVEC(msi_intr34),
271 &IDTVEC(msi_intr35),
272 &IDTVEC(msi_intr36),
273 &IDTVEC(msi_intr37),
274 &IDTVEC(msi_intr38),
275 &IDTVEC(msi_intr39),
276 &IDTVEC(msi_intr40),
277 &IDTVEC(msi_intr41),
278 &IDTVEC(msi_intr42),
279 &IDTVEC(msi_intr43),
280 &IDTVEC(msi_intr44),
281 &IDTVEC(msi_intr45),
282 &IDTVEC(msi_intr46),
283 &IDTVEC(msi_intr47),
284 &IDTVEC(msi_intr48),
285 &IDTVEC(msi_intr49),
286 &IDTVEC(msi_intr50),
287 &IDTVEC(msi_intr51),
288 &IDTVEC(msi_intr52),
289 &IDTVEC(msi_intr53),
290 &IDTVEC(msi_intr54),
291 &IDTVEC(msi_intr55),
292 &IDTVEC(msi_intr56),
293 &IDTVEC(msi_intr57),
294 &IDTVEC(msi_intr58),
295 &IDTVEC(msi_intr59),
296 &IDTVEC(msi_intr60),
297 &IDTVEC(msi_intr61),
298 &IDTVEC(msi_intr62),
299 &IDTVEC(msi_intr63),
300 &IDTVEC(msi_intr64),
301 &IDTVEC(msi_intr65),
302 &IDTVEC(msi_intr66),
303 &IDTVEC(msi_intr67),
304 &IDTVEC(msi_intr68),
305 &IDTVEC(msi_intr69),
306 &IDTVEC(msi_intr70),
307 &IDTVEC(msi_intr71),
308 &IDTVEC(msi_intr72),
309 &IDTVEC(msi_intr73),
310 &IDTVEC(msi_intr74),
311 &IDTVEC(msi_intr75),
312 &IDTVEC(msi_intr76),
313 &IDTVEC(msi_intr77),
314 &IDTVEC(msi_intr78),
315 &IDTVEC(msi_intr79),
316 &IDTVEC(msi_intr80),
317 &IDTVEC(msi_intr81),
318 &IDTVEC(msi_intr82),
319 &IDTVEC(msi_intr83),
320 &IDTVEC(msi_intr84),
321 &IDTVEC(msi_intr85),
322 &IDTVEC(msi_intr86),
323 &IDTVEC(msi_intr87),
324 &IDTVEC(msi_intr88),
325 &IDTVEC(msi_intr89),
326 &IDTVEC(msi_intr90),
327 &IDTVEC(msi_intr91),
328 &IDTVEC(msi_intr92),
329 &IDTVEC(msi_intr93),
330 &IDTVEC(msi_intr94),
331 &IDTVEC(msi_intr95),
332 &IDTVEC(msi_intr96),
333 &IDTVEC(msi_intr97),
334 &IDTVEC(msi_intr98),
335 &IDTVEC(msi_intr99),
336 &IDTVEC(msi_intr100),
337 &IDTVEC(msi_intr101),
338 &IDTVEC(msi_intr102),
339 &IDTVEC(msi_intr103),
340 &IDTVEC(msi_intr104),
341 &IDTVEC(msi_intr105),
342 &IDTVEC(msi_intr106),
343 &IDTVEC(msi_intr107),
344 &IDTVEC(msi_intr108),
345 &IDTVEC(msi_intr109),
346 &IDTVEC(msi_intr110),
347 &IDTVEC(msi_intr111),
348 &IDTVEC(msi_intr112),
349 &IDTVEC(msi_intr113),
350 &IDTVEC(msi_intr114),
351 &IDTVEC(msi_intr115),
352 &IDTVEC(msi_intr116),
353 &IDTVEC(msi_intr117),
354 &IDTVEC(msi_intr118),
355 &IDTVEC(msi_intr119),
356 &IDTVEC(msi_intr120),
357 &IDTVEC(msi_intr121),
358 &IDTVEC(msi_intr122),
359 &IDTVEC(msi_intr123),
360 &IDTVEC(msi_intr124),
361 &IDTVEC(msi_intr125),
362 &IDTVEC(msi_intr126),
363 &IDTVEC(msi_intr127),
364 &IDTVEC(msi_intr128),
365 &IDTVEC(msi_intr129),
366 &IDTVEC(msi_intr130),
367 &IDTVEC(msi_intr131),
368 &IDTVEC(msi_intr132),
369 &IDTVEC(msi_intr133),
370 &IDTVEC(msi_intr134),
371 &IDTVEC(msi_intr135),
372 &IDTVEC(msi_intr136),
373 &IDTVEC(msi_intr137),
374 &IDTVEC(msi_intr138),
375 &IDTVEC(msi_intr139),
376 &IDTVEC(msi_intr140),
377 &IDTVEC(msi_intr141),
378 &IDTVEC(msi_intr142),
379 &IDTVEC(msi_intr143),
380 &IDTVEC(msi_intr144),
381 &IDTVEC(msi_intr145),
382 &IDTVEC(msi_intr146),
383 &IDTVEC(msi_intr147),
384 &IDTVEC(msi_intr148),
385 &IDTVEC(msi_intr149),
386 &IDTVEC(msi_intr150),
387 &IDTVEC(msi_intr151),
388 &IDTVEC(msi_intr152),
389 &IDTVEC(msi_intr153),
390 &IDTVEC(msi_intr154),
391 &IDTVEC(msi_intr155),
392 &IDTVEC(msi_intr156),
393 &IDTVEC(msi_intr157),
394 &IDTVEC(msi_intr158),
395 &IDTVEC(msi_intr159),
396 &IDTVEC(msi_intr160),
397 &IDTVEC(msi_intr161),
398 &IDTVEC(msi_intr162),
399 &IDTVEC(msi_intr163),
400 &IDTVEC(msi_intr164),
401 &IDTVEC(msi_intr165),
402 &IDTVEC(msi_intr166),
403 &IDTVEC(msi_intr167),
404 &IDTVEC(msi_intr168),
405 &IDTVEC(msi_intr169),
406 &IDTVEC(msi_intr170),
407 &IDTVEC(msi_intr171),
408 &IDTVEC(msi_intr172),
409 &IDTVEC(msi_intr173),
410 &IDTVEC(msi_intr174),
411 &IDTVEC(msi_intr175),
412 &IDTVEC(msi_intr176),
413 &IDTVEC(msi_intr177),
414 &IDTVEC(msi_intr178),
415 &IDTVEC(msi_intr179),
416 &IDTVEC(msi_intr180),
417 &IDTVEC(msi_intr181),
418 &IDTVEC(msi_intr182),
419 &IDTVEC(msi_intr183),
420 &IDTVEC(msi_intr184),
421 &IDTVEC(msi_intr185),
422 &IDTVEC(msi_intr186),
423 &IDTVEC(msi_intr187),
424 &IDTVEC(msi_intr188),
425 &IDTVEC(msi_intr189),
426 &IDTVEC(msi_intr190),
427 &IDTVEC(msi_intr191)
428 };
429
430 void
msi_setup(int intr,int cpuid)431 msi_setup(int intr, int cpuid)
432 {
433 setidt(IDT_OFFSET + intr, msi_intr[intr],
434 SDT_SYSIGT, SEL_KPL, 0, cpuid);
435 }
436
437 void
msi_map(int intr,uint64_t * addr,uint32_t * data,int cpuid)438 msi_map(int intr, uint64_t *addr, uint32_t *data, int cpuid)
439 {
440 int vector, lapic_id;
441
442 vector = IDT_OFFSET + intr;
443 lapic_id = CPUID_TO_APICID(cpuid);
444
445 *addr = MSI_X86_ADDR(lapic_id);
446 *data = MSI_X86_DATA(vector);
447 }
448