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