]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/imx/pic-arm-imx21.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / imx / pic-arm-imx21.cpp
1 // ---------------------------------------------------------------------
2 INTERFACE [arm && imx]:
3
4 #include "kmem.h"
5
6 class Irq_base;
7
8 EXTENSION class Pic
9 {
10 public:
11   enum
12   {
13     Multi_irq_pending = 0,
14     No_irq_pending = 0,
15   };
16
17   enum
18   {
19     INTCTL      = Kmem::Pic_map_base + 0x00,
20     NIMASK      = Kmem::Pic_map_base + 0x04,
21     INTENNUM    = Kmem::Pic_map_base + 0x08,
22     INTDISNUM   = Kmem::Pic_map_base + 0x0c,
23     INTENABLEH  = Kmem::Pic_map_base + 0x10,
24     INTENABLEL  = Kmem::Pic_map_base + 0x14,
25     INTTYPEH    = Kmem::Pic_map_base + 0x18,
26     INTTYPEL    = Kmem::Pic_map_base + 0x1c,
27     NIPRIORITY7 = Kmem::Pic_map_base + 0x20,
28     NIPRIORITY0 = Kmem::Pic_map_base + 0x3c,
29     NIVECSR     = Kmem::Pic_map_base + 0x40,
30     FIVECSR     = Kmem::Pic_map_base + 0x44,
31     INTSRCH     = Kmem::Pic_map_base + 0x48,
32     INTSRCL     = Kmem::Pic_map_base + 0x4c,
33     INTFRCH     = Kmem::Pic_map_base + 0x50,
34     INTFRCL     = Kmem::Pic_map_base + 0x54,
35     NIPNDH      = Kmem::Pic_map_base + 0x58,
36     NIPNDL      = Kmem::Pic_map_base + 0x5c,
37     FIPNDH      = Kmem::Pic_map_base + 0x60,
38     FIPNDL      = Kmem::Pic_map_base + 0x64,
39
40
41     INTCTL_FIAD  = 1 << 19, // Fast Interrupt Arbiter Rise ARM Level
42     INTCTL_NIAD  = 1 << 20, // Normal Interrupt Arbiter Rise ARM Level
43     INTCTL_FIDIS = 1 << 21, // Fast Interrupt Disable
44     INTCTL_NIDIS = 1 << 22, // Normal Interrupt Disable
45   };
46 };
47
48 // ---------------------------------------------------------------------
49 IMPLEMENTATION [arm && imx]:
50
51 #include "boot_info.h"
52 #include "config.h"
53 #include "initcalls.h"
54 #include "io.h"
55 #include "irq.h"
56 #include "irq_chip_generic.h"
57 #include "irq_pin.h"
58 #include "vkey.h"
59
60 #include <cstdio>
61
62 class Imx_pin : public Irq_pin
63 {
64 public:
65   explicit Imx_pin(unsigned irq) { payload()[0] = irq; }
66   unsigned irq() const { return payload()[0]; }
67 };
68
69 PUBLIC
70 void
71 Imx_pin::unbind_irq()
72 {
73   mask();
74   disable();
75   Irq_chip::hw_chip->free(Irq::self(this), irq());
76   replace<Sw_irq_pin>();
77 }
78
79 PUBLIC
80 void
81 Imx_pin::do_mask()
82 {
83   assert (cpu_lock.test());
84   Io::write<Mword>(irq(), Pic::INTDISNUM); // disable pin
85 }
86
87 PUBLIC
88 void
89 Imx_pin::do_mask_and_ack()
90 {
91   assert (cpu_lock.test());
92   __mask();
93   Io::write<Mword>(irq(), Pic::INTDISNUM); // disable pin
94   // ack is empty
95 }
96
97 PUBLIC
98 void
99 Imx_pin::ack()
100 {
101   // ack is empty
102 }
103
104 PUBLIC
105 void
106 Imx_pin::do_unmask()
107 {
108   assert (cpu_lock.test());
109   Io::write<Mword>(irq(), Pic::INTENNUM);
110 }
111
112
113 PUBLIC
114 bool
115 Imx_pin::check_debug_irq()
116 {
117   return !Vkey::check_(irq());
118 }
119
120 PUBLIC
121 void
122 Imx_pin::set_cpu(unsigned)
123 {
124 }
125
126 class Irq_chip_arm_x : public Irq_chip_gen
127 {
128 };
129
130 PUBLIC
131 void
132 Irq_chip_arm_x::setup(Irq_base *irq, unsigned irqnum)
133 {
134   if (irqnum < Config::Max_num_dirqs)
135     irq->pin()->replace<Imx_pin>(irqnum);
136 }
137
138 IMPLEMENT FIASCO_INIT
139 void Pic::init()
140 {
141   static Irq_chip_arm_x _ia;
142   Irq_chip::hw_chip = &_ia;
143
144   Io::write<Mword>(0,    INTCTL);
145   Io::write<Mword>(0x10, NIMASK); // Do not disable any normal interrupts
146
147   Io::write<Mword>(0, INTTYPEH); // All interrupts generate normal interrupts
148   Io::write<Mword>(0, INTTYPEL);
149
150   // Init interrupt priorities
151   for (int i = 0; i < 8; ++i)
152     Io::write<Mword>(0x1111, NIPRIORITY7 + (i * 4)); // low addresses start with 7
153 }
154
155 IMPLEMENT inline
156 Pic::Status Pic::disable_all_save()
157 {
158   Status s = 0;
159   return s;
160 }
161
162 IMPLEMENT inline
163 void Pic::restore_all( Status /*s*/ )
164 {
165 }
166
167 PUBLIC static inline NEEDS["io.h"]
168 Unsigned32 Pic::pending()
169 {
170   return Io::read<Mword>(NIVECSR) >> 16;
171 }
172
173 PUBLIC static inline
174 Mword Pic::is_pending(Mword &irqs, Mword irq)
175 {
176   return irqs == irq;
177 }
178
179 //---------------------------------------------------------------------------
180 IMPLEMENTATION [debug && imx]:
181
182 PUBLIC
183 char const *
184 Imx_pin::pin_type() const
185 { return "HW i.MX IRQ"; }
186