1 // ---------------------------------------------------------------------
2 INTERFACE [arm-integrator]:
13 Multi_irq_pending = 1,
19 IRQ_STATUS = Kmem::Pic_map_base + 0x00,
20 IRQ_ENABLE_SET = Kmem::Pic_map_base + 0x08,
21 IRQ_ENABLE_CLEAR = Kmem::Pic_map_base + 0x0c,
23 FIQ_ENABLE_CLEAR = Kmem::Pic_map_base + 0x2c,
30 // ---------------------------------------------------------------------
31 IMPLEMENTATION [arm && integrator]:
33 #include "boot_info.h"
35 #include "initcalls.h"
39 #include "irq_chip_generic.h"
42 class Integr_pin : public Irq_pin
45 explicit Integr_pin(unsigned irq) { payload()[0] = irq; }
46 unsigned irq() const { return payload()[0]; }
49 class Irq_chip_arm_integr : public Irq_chip_gen
55 Irq_chip_arm_integr::setup(Irq_base *irq, unsigned irqnum)
57 irq->pin()->replace<Integr_pin>(irqnum);
62 Integr_pin::unbind_irq()
66 Irq_chip::hw_chip->free(Irq::self(this), irq());
67 replace<Sw_irq_pin>();
74 assert (cpu_lock.test());
75 Io::write(1 << (irq() - Pic::PIC_START), Pic::IRQ_ENABLE_CLEAR);
80 Integr_pin::do_mask_and_ack()
82 assert (cpu_lock.test());
84 Io::write(1 << (irq() - Pic::PIC_START), Pic::IRQ_ENABLE_CLEAR);
98 Irq::self(this)->Irq::hit();
103 Integr_pin::do_unmask()
105 assert (cpu_lock.test());
106 Io::write(1 << (irq() - Pic::PIC_START), Pic::IRQ_ENABLE_SET);
111 Integr_pin::do_set_mode(unsigned)
118 Integr_pin::check_debug_irq()
120 return !Vkey::check_(irq());
125 Integr_pin::set_cpu(unsigned)
130 IMPLEMENT FIASCO_INIT
133 static Irq_chip_arm_integr _ia;
134 Irq_chip::hw_chip = &_ia;
135 Io::write(0xffffffff, IRQ_ENABLE_CLEAR);
136 Io::write(0xffffffff, FIQ_ENABLE_CLEAR);
141 Pic::Status Pic::disable_all_save()
148 void Pic::restore_all( Status /*s*/ )
152 PUBLIC static inline NEEDS["io.h"]
153 Unsigned32 Pic::pending()
155 return Io::read<Mword>(IRQ_STATUS);
159 Mword Pic::is_pending(Mword &irqs, Mword irq)
161 Mword ret = irqs & (1 << irq);
166 //---------------------------------------------------------------------------
167 IMPLEMENTATION [debug && integrator]:
171 Integr_pin::pin_type() const
172 { return "HW Integrator IRQ"; }