]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/irq_controller.cpp
update
[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 void
34 Icu::operator delete (void *)
35 {
36   printf("WARNING: tried to delete kernel ICU object.\n"
37          "         The system is now useless\n");
38 }
39
40 PUBLIC inline NEEDS[Icu::chip]
41 Irq_base *
42 Icu::icu_get_irq(unsigned irqnum)
43 {
44   Irq_chip *c = chip(irqnum & Msi_bit);
45
46   if (EXPECT_FALSE(!c))
47     return 0;
48
49   return c->irq(irqnum & ~Msi_bit);
50 }
51
52
53 PUBLIC inline NEEDS[Icu::chip]
54 L4_msg_tag
55 Icu::icu_bind_irq(Irq *irq, unsigned irqnum)
56 {
57   Irq_chip *c = chip(irqnum & Msi_bit);
58
59   if (!c)
60     return commit_result(-L4_err::EInval);
61
62   irq->pin()->unbind_irq();
63
64   if (!c->alloc(irq, irqnum & ~Msi_bit))
65     return commit_result(-L4_err::EPerm);
66
67   return commit_result(0);
68 }
69
70
71 PUBLIC inline NEEDS[Icu::chip]
72 void
73 Icu::icu_get_info(Mword *features, Mword *num_irqs, Mword *num_msis)
74 {
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()
79               : 0;
80 }
81
82 PUBLIC inline NEEDS[Icu::chip]
83 L4_msg_tag
84 Icu::icu_get_msi_info(Mword msi, Utcb *out)
85 {
86   if (!Irq_chip::hw_chip_msi)
87     return commit_result(-L4_err::EInval);
88
89   out->values[0] = Irq_chip::hw_chip_msi->msg(msi);
90   return commit_result(0, 1);
91 }
92
93
94 PUBLIC inline
95 Icu::Icu()
96 {
97   initial_kobjects.register_obj(this, 6);
98 }
99
100 static Icu icu;
101