1 // ---------------------------------------------------------------------
2 INTERFACE [arm-integrator]:
11 IRQ_STATUS = Kmem::Pic_map_base + 0x00,
12 IRQ_ENABLE_SET = Kmem::Pic_map_base + 0x08,
13 IRQ_ENABLE_CLEAR = Kmem::Pic_map_base + 0x0c,
15 FIQ_ENABLE_CLEAR = Kmem::Pic_map_base + 0x2c,
22 // ---------------------------------------------------------------------
23 IMPLEMENTATION [arm && integrator]:
26 #include "irq_chip_generic.h"
29 class Irq_chip_arm_integr : public Irq_chip_gen
32 Irq_chip_arm_integr() : Irq_chip_gen(32) {}
33 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
34 void set_cpu(Mword, unsigned) {}
35 void ack(Mword) { /* ack is empty */ }
40 Irq_chip_arm_integr::mask(Mword irq)
42 assert(cpu_lock.test());
43 Io::write(1 << (irq - Pic::PIC_START), Pic::IRQ_ENABLE_CLEAR);
48 Irq_chip_arm_integr::mask_and_ack(Mword irq)
50 assert(cpu_lock.test());
51 Io::write(1 << (irq - Pic::PIC_START), Pic::IRQ_ENABLE_CLEAR);
57 Irq_chip_arm_integr::unmask(Mword irq)
59 assert(cpu_lock.test());
60 Io::write(1 << (irq - Pic::PIC_START), Pic::IRQ_ENABLE_SET);
63 static Static_object<Irq_mgr_single_chip<Irq_chip_arm_integr> > mgr;
68 Irq_mgr::mgr = mgr.construct();
70 Io::write(0xffffffff, IRQ_ENABLE_CLEAR);
71 Io::write(0xffffffff, FIQ_ENABLE_CLEAR);
75 Pic::Status Pic::disable_all_save()
82 void Pic::restore_all(Status)
85 PUBLIC static inline NEEDS["io.h"]
86 Unsigned32 Irq_chip_arm_integr::pending()
88 return Io::read<Mword>(Pic::IRQ_STATUS);
93 { mgr->c.handle_multi_pending<Irq_chip_arm_integr>(0); }
95 //---------------------------------------------------------------------------
96 IMPLEMENTATION [debug && integrator]:
100 Irq_chip_arm_integr::chip_type() const
101 { return "Integrator"; }