xref: /dragonfly/sys/platform/pc64/x86_64/msi.c (revision 0fe46dc6)
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
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
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