3 #include <machine/intr_machdep.h>
4 #include <machine/msi_machdep.h>
5 #include <machine/msi_var.h>
6 #include <machine/md_var.h>
8 #include <machine_base/apic/apicreg.h>
9 #include <machine_base/apic/lapic.h>
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
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
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))
235 static inthand_t
*msi_intr
[IDT_HWI_VECTORS
] = {
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
),
431 msi_setup(int intr
, int cpuid
)
433 setidt(IDT_OFFSET
+ intr
, msi_intr
[intr
],
434 SDT_SYSIGT
, SEL_KPL
, 0, cpuid
);
438 msi_map(int intr
, uint64_t *addr
, uint32_t *data
, int cpuid
)
440 int vector
, lapic_id
;
442 vector
= IDT_OFFSET
+ intr
;
443 lapic_id
= CPUID_TO_APICID(cpuid
);
445 *addr
= MSI_X86_ADDR(lapic_id
);
446 *data
= MSI_X86_DATA(vector
);