5 #include "icu_helper.h"
9 class Icu : public Icu_h<Icu>, public Kobject
11 FIASCO_DECLARE_KOBJ();
13 friend class Icu_h<Icu>;
17 //----------------------------------------------------------------------------
20 #include "entry_frame.h"
24 #include "l4_buf_iter.h"
26 FIASCO_DEFINE_KOBJ(Icu);
28 PRIVATE static inline NEEDS["irq_chip.h"]
31 { return msi ? Irq_chip::hw_chip_msi : Irq_chip::hw_chip; }
33 PUBLIC inline NEEDS[Icu::chip]
35 Icu::icu_get_irq(unsigned irqnum)
37 Irq_chip *c = chip(irqnum & Msi_bit);
42 return c->irq(irqnum & ~Msi_bit);
46 PUBLIC inline NEEDS[Icu::chip]
48 Icu::icu_bind_irq(Irq *irq, unsigned irqnum)
50 Irq_chip *c = chip(irqnum & Msi_bit);
53 return commit_result(-L4_err::EInval);
55 irq->pin()->unbind_irq();
57 if (!c->alloc(irq, irqnum & ~Msi_bit))
58 return commit_result(-L4_err::EPerm);
60 return commit_result(0);
64 PUBLIC inline NEEDS[Icu::chip]
66 Icu::icu_get_info(Mword *features, Mword *num_irqs, Mword *num_msis)
68 *features = 0 | (Irq_chip::hw_chip_msi ? (unsigned)Msi_bit : 0);
69 *num_irqs = Irq_chip::hw_chip->nr_irqs();
70 *num_msis = Irq_chip::hw_chip_msi
71 ? Irq_chip::hw_chip_msi->nr_irqs()
75 PUBLIC inline NEEDS[Icu::chip]
77 Icu::icu_get_msi_info(Mword msi, Utcb *out)
79 if (!Irq_chip::hw_chip_msi)
80 return commit_result(-L4_err::EInval);
82 out->values[0] = Irq_chip::hw_chip_msi->msg(msi);
83 return commit_result(0, 1);
90 initial_kobjects.register_obj(this, 6);