]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/ipi-arm.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / ipi-arm.cpp
1 IMPLEMENTATION [!mp]:
2
3 PUBLIC static inline
4 bool Ipi::is_ipi(unsigned /*irq*/)
5 { return false; }
6
7
8 //-------------------------------------------------------------------------
9 INTERFACE [mp]:
10
11 EXTENSION class Ipi
12 {
13 private:
14   Unsigned32 _phys_id;
15
16 public:
17   enum Message {
18     Ipi_start = 1,
19     Global_request = Ipi_start, Request, Debug,
20     Ipi_end
21   };
22 };
23
24
25 //-------------------------------------------------------------------------
26 IMPLEMENTATION [mp]:
27
28 #include "cpu.h"
29 #include "gic.h"
30 #include "processor.h"
31
32 PUBLIC inline
33 Ipi::Ipi() : _phys_id(~0)
34 {}
35
36 IMPLEMENT inline NEEDS["processor.h"]
37 void
38 Ipi::init()
39 {
40   _phys_id = Proc::cpu_id();
41 }
42
43 PUBLIC static
44 void Ipi::ipi_call_debug_arch()
45 {
46 }
47
48 PUBLIC static inline
49 void Ipi::eoi(Message)
50 {
51   // with the ARM-GIC we have to do the EOI right after the ACK
52   stat_received();
53 }
54
55 PUBLIC inline NEEDS["gic.h"]
56 void Ipi::send(Message m)
57 {
58   Gic_pin::_gic[0].softint_cpu(1 << _phys_id, m);
59   stat_sent();
60 }
61
62 PUBLIC static inline
63 void
64 Ipi::bcast(Message m)
65 {
66   Gic_pin::_gic[0].softint_bcast(m);
67 }
68
69 PUBLIC static inline
70 bool Ipi::is_ipi(unsigned irq)
71 { return irq >= Ipi_start && irq < Ipi_end; }