1 INTERFACE [arm && kirkwood]:
12 Main_Irq_cause_low_reg = Mem_layout::Pic_map_base + 0x20200,
13 Main_Irq_mask_low_reg = Mem_layout::Pic_map_base + 0x20204,
14 Main_Fiq_mask_low_reg = Mem_layout::Pic_map_base + 0x20208,
15 Endpoint_irq_mask_low_reg = Mem_layout::Pic_map_base + 0x2020c,
16 Main_Irq_cause_high_reg = Mem_layout::Pic_map_base + 0x20210,
17 Main_Irq_mask_high_reg = Mem_layout::Pic_map_base + 0x20214,
18 Main_Fiq_mask_high_reg = Mem_layout::Pic_map_base + 0x20218,
19 Endpoint_irq_mask_high_reg = Mem_layout::Pic_map_base + 0x2021c,
23 Multi_irq_pending = 0,
24 No_irq_pending = 1023,
28 //-------------------------------------------------------------------
29 IMPLEMENTATION [arm && kirkwood]:
35 #include "initcalls.h"
39 #include "irq_chip_generic.h"
43 class Kirkwood_pin : public Irq_pin
46 unsigned irq() const { return payload()[0]; }
49 class Kirkwood_pin_low : public Kirkwood_pin
52 explicit Kirkwood_pin_low(unsigned irq) { payload()[0] = irq; }
55 class Kirkwood_pin_high : public Kirkwood_pin
58 explicit Kirkwood_pin_high(unsigned irq) { payload()[0] = irq; }
64 Kirkwood_pin::unbind_irq()
68 Irq_chip::hw_chip->free(Irq::self(this), irq());
69 replace<Sw_irq_pin>();
74 Kirkwood_pin_low::do_mask()
76 assert (cpu_lock.test());
77 Io::clear<Unsigned32>(1 << irq(), Pic::Main_Irq_mask_low_reg);
82 Kirkwood_pin_high::do_mask()
84 assert (cpu_lock.test());
85 Io::clear<Unsigned32>(1 << (irq() - 32), Pic::Main_Irq_mask_high_reg);
90 Kirkwood_pin_low::do_mask_and_ack()
92 assert (cpu_lock.test());
94 Io::clear<Unsigned32>(1 << irq(), Pic::Main_Irq_mask_low_reg);
100 Kirkwood_pin_high::do_mask_and_ack()
102 assert (cpu_lock.test());
104 Io::clear<Unsigned32>(1 << (irq() - 32), Pic::Main_Irq_mask_high_reg);
119 Irq::self(this)->Irq::hit();
124 Kirkwood_pin_low::do_unmask()
126 assert (cpu_lock.test());
127 Io::set<Unsigned32>(1 << irq(), Pic::Main_Irq_mask_low_reg);
132 Kirkwood_pin_high::do_unmask()
134 assert (cpu_lock.test());
135 Io::set<Unsigned32>(1 << (irq() - 32), Pic::Main_Irq_mask_high_reg);
140 Kirkwood_pin::check_debug_irq()
142 return !Vkey::check_(irq());
147 Kirkwood_pin::set_cpu(unsigned)
152 class Irq_chip_kirkwood : public Irq_chip_gen
158 Irq_chip_kirkwood::setup(Irq_base *irq, unsigned irqnum)
161 irq->pin()->replace<Kirkwood_pin_low>(irqnum);
162 else if (irqnum < Config::Max_num_dirqs)
163 irq->pin()->replace<Kirkwood_pin_high>(irqnum);
166 IMPLEMENT FIASCO_INIT
169 static Irq_chip_kirkwood _ia;
170 Irq_chip::hw_chip = &_ia;
172 // Disable all interrupts
173 Io::write<Unsigned32>(0U, Main_Irq_mask_low_reg);
174 Io::write<Unsigned32>(0U, Main_Fiq_mask_low_reg);
175 Io::write<Unsigned32>(0U, Main_Irq_mask_high_reg);
176 Io::write<Unsigned32>(0U, Main_Fiq_mask_high_reg);
178 // enable bridge (chain) IRQ
179 Io::set<Unsigned32>(1 << Bridge_int_num, Main_Irq_mask_low_reg);
183 Pic::Status Pic::disable_all_save()
187 void Pic::restore_all(Status)
190 PUBLIC static inline NEEDS[<cstdio>,"io.h"]
191 Unsigned32 Pic::pending()
195 v = Io::read<Unsigned32>(Main_Irq_cause_low_reg);
198 v = Io::read<Unsigned32>(Main_Irq_cause_high_reg);
199 for (int i = 1; i < 32; ++i)
203 for (int i = 1; i < 32; ++i)
207 return No_irq_pending;
211 Mword Pic::is_pending(Mword &irqs, Mword irq)
212 { return irqs == irq; }
214 //---------------------------------------------------------------------------
215 IMPLEMENTATION [debug && kirkwood]:
219 Kirkwood_pin::pin_type() const
220 { return "HW Kirkwood IRQ"; }