Remove upc_{control,register} syscalls and everything that has to do with it.
[dragonfly.git] / sys / platform / pc64 / x86_64 / msi.c
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 }