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);