6 #include "irq_chip_ia32.h"
9 #include "static_init.h"
10 #include "boot_alloc.h"
12 class Irq_chip_msi : public Irq_chip_ia32
15 // this is somehow arbitrary
16 enum { Max_msis = 0x40 };
17 Irq_chip_msi() : Irq_chip_ia32(Max_msis) {}
20 class Irq_mgr_msi : public Irq_mgr
23 mutable Irq_chip_msi _chip;
29 Irq_chip_msi::chip_type() const
34 Irq_chip_msi::alloc(Irq_base *irq, Mword pin)
36 return valloc(irq, pin, 0);
41 Irq_chip_msi::unbind(Irq_base *irq)
43 extern char entry_int_apic_ignore[];
44 //Mword n = irq->pin();
45 // hm: no way to mask an MSI: mask(n);
46 vfree(irq, &entry_int_apic_ignore);
47 Irq_chip_icu::unbind(irq);
52 Irq_chip_msi::msg(Mword pin)
55 return _entry[pin].vector();
61 Irq_chip_msi::set_mode(Mword, unsigned)
62 { return Irq_base::Trigger_edge | Irq_base::Polarity_low; }
65 Irq_chip_msi::set_cpu(Mword, unsigned)
69 Irq_chip_msi::mask(Mword)
73 Irq_chip_msi::ack(Mword)
74 { ::Apic::irq_ack(); }
77 Irq_chip_msi::mask_and_ack(Mword)
78 { ::Apic::irq_ack(); }
81 Irq_chip_msi::unmask(Mword)
85 PUBLIC inline explicit
86 Irq_mgr_msi::Irq_mgr_msi(Irq_mgr *o) : _orig(o) {}
89 Irq_mgr_msi::chip(Mword irq) const
92 return Irq(&_chip, irq & ~0x80000000);
94 return _orig->chip(irq);
99 Irq_mgr_msi::nr_irqs() const
100 { return _orig->nr_irqs(); }
104 Irq_mgr_msi::nr_msis() const
105 { return _chip.nr_irqs(); }
109 Irq_mgr_msi::msg(Mword irq) const
111 if (irq & 0x80000000)
112 return _chip.msg(irq & ~0x80000000);
118 Irq_mgr_msi::legacy_override(Mword irq)
120 if (irq & 0x80000000)
123 return _orig->legacy_override(irq);
127 PUBLIC static FIASCO_INIT
132 Irq_mgr::mgr = m = new Boot_object<Irq_mgr_msi>(Irq_mgr::mgr);
133 printf("Enable MSI support: chained IRQ mgr @ %p\n", m->_orig);
136 STATIC_INITIALIZE(Irq_mgr_msi);