]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/imx/pic-arm-imx.cpp
Inital import
[l4.git] / kernel / fiasco / src / kern / arm / bsp / imx / pic-arm-imx.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::hit()
107 {
108   Irq::self(this)->Irq::hit();
109 }
110
111 PUBLIC
112 void
113 Imx_pin::do_unmask()
114 {
115   assert (cpu_lock.test());
116   Io::write<Mword>(irq(), Pic::INTENNUM);
117 }
118
119
120 PUBLIC
121 bool
122 Imx_pin::check_debug_irq()
123 {
124   return !Vkey::check_(irq());
125 }
126
127 PUBLIC
128 void
129 Imx_pin::set_cpu(unsigned)
130 {
131 }
132
133 class Irq_chip_arm_x : public Irq_chip_gen
134 {
135 };
136
137 PUBLIC
138 void
139 Irq_chip_arm_x::setup(Irq_base *irq, unsigned irqnum)
140 {
141   if (irqnum < Config::Max_num_dirqs)
142     irq->pin()->replace<Imx_pin>(irqnum);
143 }
144
145 IMPLEMENT FIASCO_INIT
146 void Pic::init()
147 {
148   static Irq_chip_arm_x _ia;
149   Irq_chip::hw_chip = &_ia;
150
151   Io::write<Mword>(0,    INTCTL);
152   Io::write<Mword>(0x10, NIMASK); // Do not disable any normal interrupts
153
154   Io::write<Mword>(0, INTTYPEH); // All interrupts generate normal interrupts
155   Io::write<Mword>(0, INTTYPEL);
156
157   // Init interrupt priorities
158   for (int i = 0; i < 8; ++i)
159     Io::write<Mword>(0x1111, NIPRIORITY7 + (i * 4)); // low addresses start with 7
160 }
161
162 IMPLEMENT inline
163 Pic::Status Pic::disable_all_save()
164 {
165   Status s = 0;
166   return s;
167 }
168
169 IMPLEMENT inline
170 void Pic::restore_all( Status /*s*/ )
171 {
172 }
173
174 PUBLIC static inline NEEDS["io.h"]
175 Unsigned32 Pic::pending()
176 {
177   return Io::read<Mword>(NIVECSR) >> 16;
178 }
179
180 PUBLIC static inline
181 Mword Pic::is_pending(Mword &irqs, Mword irq)
182 {
183   return irqs == irq;
184 }
185
186 //---------------------------------------------------------------------------
187 IMPLEMENTATION [debug && imx]:
188
189 PUBLIC
190 char const *
191 Imx_pin::pin_type() const
192 { return "HW i.MX IRQ"; }
193