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