]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/pic-arm-realview.cpp
4cf9c72ceef1217b2b388d795755791f48350f8b
[l4.git] / kernel / fiasco / src / kern / arm / bsp / realview / pic-arm-realview.cpp
1 INTERFACE [arm && realview]:
2
3 #include "types.h"
4 #include "gic.h"
5
6 class Irq_base;
7
8 //-------------------------------------------------------------------
9 INTERFACE [arm && realview && (mpcore || armca9)]:
10
11 EXTENSION class Pic
12 {
13 private:
14   enum
15   {
16     INTMODE_NEW_NO_DDC = 1 << 23,
17   };
18 };
19
20 //-------------------------------------------------------------------
21 IMPLEMENTATION [arm && !(mpcore || armca9)]:
22
23 PRIVATE static inline
24 void Pic::configure_core()
25 {}
26
27 //-------------------------------------------------------------------
28 IMPLEMENTATION [arm && pic_gic && realview && (realview_pb11mp || (realview_eb && (mpcore || (armca9 && mp))))]:
29
30 #include "irq_mgr_multi_chip.h"
31 #include "cascade_irq.h"
32
33 PUBLIC static
34 void Pic::init_ap(unsigned)
35 {
36   gic->init_ap();
37   static_cast<Gic*>(Irq_mgr::mgr->chip(256).chip)->init_ap();
38 }
39
40
41 IMPLEMENT FIASCO_INIT
42 void Pic::init()
43 {
44   configure_core();
45   typedef Irq_mgr_multi_chip<8> Mgr;
46
47   Gic *g = gic.construct(Kmem::Gic_cpu_map_base, Kmem::Gic_dist_map_base);
48   Mgr *m = new Boot_object<Mgr>(2);
49   Irq_mgr::mgr = m;
50
51   m->add_chip(0, g, g->nr_irqs());
52
53   g = new Boot_object<Gic>(Kmem::Gic1_cpu_map_base, Kmem::Gic1_dist_map_base);
54   m->add_chip(256, g, g->nr_irqs());
55
56   // FIXME: Replace static local variable, use placement new
57   Cascade_irq *casc_irq = new Boot_object<Cascade_irq>(g, &Gic::cascade_hit);
58
59   gic->alloc(casc_irq, 42);
60   casc_irq->unmask();
61 }
62
63 //-------------------------------------------------------------------
64 IMPLEMENTATION [arm && pic_gic && !(realview && (realview_pb11mp || (realview_eb && (mpcore || (armca9 && mp)))))]:
65
66 #include "irq_mgr_multi_chip.h"
67
68 IMPLEMENT FIASCO_INIT
69 void Pic::init()
70 {
71   configure_core();
72
73   typedef Irq_mgr_multi_chip<8> Mgr;
74   Gic *g = gic.construct(Kmem::Gic_cpu_map_base, Kmem::Gic_dist_map_base);
75
76   Mgr *m = new Boot_object<Mgr>(1);
77   m->add_chip(0, g, g->nr_irqs());
78   Irq_mgr::mgr = m;
79 }
80
81 PUBLIC static
82 void Pic::init_ap(unsigned)
83 {
84   gic->init_ap();
85 }
86
87 PRIVATE static inline
88 void
89 Pic::init_ap_other_gics()
90 {}
91
92 //-------------------------------------------------------------------
93 IMPLEMENTATION [arm && pic_gic]:
94
95 #include "gic.h"
96 #include "initcalls.h"
97
98 IMPLEMENT inline
99 Pic::Status Pic::disable_all_save()
100 { return 0; }
101
102 IMPLEMENT inline
103 void Pic::restore_all(Status)
104 {}
105
106 //-------------------------------------------------------------------
107 IMPLEMENTATION [arm && pic_gic && (mpcore || armca9)]:
108
109 #include "cpu.h"
110 #include "io.h"
111 #include "platform.h"
112
113 PRIVATE static
114 void Pic::unlock_config()
115 { Io::write<Mword>(0xa05f, Platform::Sys::Lock); }
116
117 PRIVATE static
118 void Pic::lock_config()
119 { Io::write<Mword>(0x0, Platform::Sys::Lock); }
120
121 PRIVATE static
122 void Pic::configure_core()
123 {
124   // Enable 'new' interrupt-mode, no DCC
125   unlock_config();
126   Io::write<Mword>(Io::read<Mword>(Platform::Sys::Pld_ctrl1) | INTMODE_NEW_NO_DDC,
127                    Platform::Sys::Pld_ctrl1);
128   lock_config();
129 }