]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/irq_controller.cpp
dab612275d050976c18313c599499b10bc262f3a
[l4.git] / kernel / fiasco / src / kern / irq_controller.cpp
1 INTERFACE:
2
3 #include "irq.h"
4 #include "ram_quota.h"
5 #include "icu_helper.h"
6
7 class Irq_chip;
8
9 class Icu : public Icu_h<Icu>
10 {
11   FIASCO_DECLARE_KOBJ();
12
13   friend class Icu_h<Icu>;
14 };
15
16
17 //----------------------------------------------------------------------------
18 IMPLEMENTATION:
19
20 #include "entry_frame.h"
21 #include "irq.h"
22 #include "irq_chip.h"
23 #include "l4_types.h"
24 #include "l4_buf_iter.h"
25
26 FIASCO_DEFINE_KOBJ(Icu);
27
28 PRIVATE static inline NEEDS["irq_chip.h"]
29 Irq_chip *
30 Icu::chip(bool msi)
31 { return msi ?  Irq_chip::hw_chip_msi : Irq_chip::hw_chip; }
32
33 PUBLIC inline NEEDS[Icu::chip]
34 Irq_base *
35 Icu::icu_get_irq(unsigned irqnum)
36 {
37   Irq_chip *c = chip(irqnum & Msi_bit);
38
39   if (EXPECT_FALSE(!c))
40     return 0;
41
42   return c->irq(irqnum & ~Msi_bit);
43 }
44
45
46 PUBLIC inline NEEDS[Icu::chip]
47 L4_msg_tag
48 Icu::icu_bind_irq(Irq *irq, unsigned irqnum)
49 {
50   Irq_chip *c = chip(irqnum & Msi_bit);
51
52   if (!c)
53     return commit_result(-L4_err::EInval);
54
55   irq->pin()->unbind_irq();
56
57   if (!c->alloc(irq, irqnum & ~Msi_bit))
58     return commit_result(-L4_err::EPerm);
59
60   return commit_result(0);
61 }
62
63
64 PUBLIC inline NEEDS[Icu::chip]
65 void
66 Icu::icu_get_info(Mword *features, Mword *num_irqs, Mword *num_msis)
67 {
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()
72               : 0;
73 }
74
75 PUBLIC inline NEEDS[Icu::chip]
76 L4_msg_tag
77 Icu::icu_get_msi_info(Mword msi, Utcb *out)
78 {
79   if (!Irq_chip::hw_chip_msi)
80     return commit_result(-L4_err::EInval);
81
82   out->values[0] = Irq_chip::hw_chip_msi->msg(msi);
83   return commit_result(0, 1);
84 }
85
86
87 PUBLIC inline
88 Icu::Icu()
89 {
90   initial_kobjects.register_obj(this, 6);
91 }
92
93 static Icu icu;
94