5 #include "icu_helper.h"
9 class Icu : public Icu_h<Icu>
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; }
34 Icu::operator delete (void *)
36 printf("WARNING: tried to delete kernel ICU object.\n"
37 " The system is now useless\n");
40 PUBLIC inline NEEDS[Icu::chip]
42 Icu::icu_get_irq(unsigned irqnum)
44 Irq_chip *c = chip(irqnum & Msi_bit);
49 return c->irq(irqnum & ~Msi_bit);
53 PUBLIC inline NEEDS[Icu::chip]
55 Icu::icu_bind_irq(Irq *irq, unsigned irqnum)
57 Irq_chip *c = chip(irqnum & Msi_bit);
60 return commit_result(-L4_err::EInval);
62 irq->pin()->unbind_irq();
64 if (!c->alloc(irq, irqnum & ~Msi_bit))
65 return commit_result(-L4_err::EPerm);
67 return commit_result(0);
71 PUBLIC inline NEEDS[Icu::chip]
73 Icu::icu_get_info(Mword *features, Mword *num_irqs, Mword *num_msis)
75 *features = 0 | (Irq_chip::hw_chip_msi ? (unsigned)Msi_bit : 0);
76 *num_irqs = Irq_chip::hw_chip->nr_irqs();
77 *num_msis = Irq_chip::hw_chip_msi
78 ? Irq_chip::hw_chip_msi->nr_irqs()
82 PUBLIC inline NEEDS[Icu::chip]
84 Icu::icu_get_msi_info(Mword msi, Utcb *out)
86 if (!Irq_chip::hw_chip_msi)
87 return commit_result(-L4_err::EInval);
89 out->values[0] = Irq_chip::hw_chip_msi->msg(msi);
90 return commit_result(0, 1);
97 initial_kobjects.register_obj(this, 6);