1 // ---------------------------------------------------------------------
2 INTERFACE [arm && (imx21 || imx35)]:
13 // ---------------------------------------------------------------------
14 IMPLEMENTATION [arm && (imx21 || imx35)]:
17 #include "irq_chip_generic.h"
19 #include "mmio_register_block.h"
21 class Irq_chip_arm_imx : public Irq_chip_gen, private Mmio_register_block
48 INTCTL_FIAD = 1 << 19, // Fast Interrupt Arbiter Rise ARM Level
49 INTCTL_NIAD = 1 << 20, // Normal Interrupt Arbiter Rise ARM Level
50 INTCTL_FIDIS = 1 << 21, // Fast Interrupt Disable
51 INTCTL_NIDIS = 1 << 22, // Normal Interrupt Disable
54 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
55 void set_cpu(Mword, Cpu_number) {}
56 void ack(Mword) { /* ack is empty */ }
61 Irq_chip_arm_imx::mask(Mword irq)
63 assert(cpu_lock.test());
64 write<Mword>(irq, INTDISNUM); // disable pin
69 Irq_chip_arm_imx::mask_and_ack(Mword irq)
71 assert(cpu_lock.test());
72 write<Mword>(irq, INTDISNUM); // disable pin
78 Irq_chip_arm_imx::unmask(Mword irq)
80 assert (cpu_lock.test());
81 write<Mword>(irq, INTENNUM);
85 Irq_chip_arm_imx::Irq_chip_arm_imx()
87 Mmio_register_block(Kmem::mmio_remap(Mem_layout::Pic_phys_base))
89 write<Mword>(0, INTCTL);
90 write<Mword>(0x10, NIMASK); // Do not disable any normal interrupts
92 write<Mword>(0, INTTYPEH); // All interrupts generate normal interrupts
93 write<Mword>(0, INTTYPEL);
95 // Init interrupt priorities
96 for (int i = 0; i < 8; ++i)
97 write<Mword>(0x1111, NIPRIORITY7 + (i * 4)); // low addresses start with 7
100 static Static_object<Irq_mgr_single_chip<Irq_chip_arm_imx> > mgr;
103 IMPLEMENT FIASCO_INIT
106 Irq_mgr::mgr = mgr.construct();
110 Pic::Status Pic::disable_all_save()
117 void Pic::restore_all(Status)
121 Unsigned32 Irq_chip_arm_imx::pending()
123 return read<Mword>(NIVECSR) >> 16;
126 PUBLIC inline NEEDS[Irq_chip_arm_imx::pending]
128 Irq_chip_arm_imx::irq_handler()
130 Unsigned32 p = pending();
131 if (EXPECT_TRUE(p != 0xffff))
132 handle_irq<Irq_chip_arm_imx>(p, 0);
137 { mgr->c.irq_handler(); }
139 //---------------------------------------------------------------------------
140 IMPLEMENTATION [debug && imx]:
144 Irq_chip_arm_imx::chip_type() const
145 { return "HW i.MX IRQ"; }