5 #include "icu_helper.h"
9 class Icu : public Icu_h<Icu>, public Kobject
11 FIASCO_DECLARE_KOBJ();
13 friend class Icu_h<Icu>;
19 //----------------------------------------------------------------------------
22 #include "entry_frame.h"
26 #include "l4_buf_iter.h"
28 FIASCO_DEFINE_KOBJ(Icu);
30 PRIVATE static inline NEEDS["irq_chip.h"]
33 { return msi ? Irq_chip::hw_chip_msi : Irq_chip::hw_chip; }
35 PUBLIC inline NEEDS[Icu::chip]
37 Icu::icu_get_irq(unsigned irqnum)
39 Irq_chip *c = chip(irqnum & Msi_bit);
44 return c->irq(irqnum & ~Msi_bit);
48 PUBLIC inline NEEDS[Icu::chip]
50 Icu::icu_bind_irq(Irq *irq, unsigned irqnum)
52 Irq_chip *c = chip(irqnum & Msi_bit);
55 return commit_result(-L4_err::EInval);
57 irq->pin()->unbind_irq();
59 if (!c->alloc(irq, irqnum & ~Msi_bit))
60 return commit_result(-L4_err::EPerm);
62 return commit_result(0);
66 PUBLIC inline NEEDS[Icu::chip]
68 Icu::icu_get_info(Mword *features, Mword *num_irqs, Mword *num_msis)
70 *features = 0 | (Irq_chip::hw_chip_msi ? (unsigned)Msi_bit : 0);
71 *num_irqs = Irq_chip::hw_chip->nr_irqs();
72 *num_msis = Irq_chip::hw_chip_msi
73 ? Irq_chip::hw_chip_msi->nr_irqs()
77 PUBLIC inline NEEDS[Icu::chip]
79 Icu::icu_get_msi_info(Mword msi, Utcb *out)
81 if (!Irq_chip::hw_chip_msi)
82 return commit_result(-L4_err::EInval);
84 out->values[0] = Irq_chip::hw_chip_msi->msg(msi);
85 return commit_result(0, 1);