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