1 INTERFACE [arm && s3c2410]:
10 SRCPND = Kmem::Pic_map_base + 0x00,
11 INTMODE = Kmem::Pic_map_base + 0x04,
12 INTMSK = Kmem::Pic_map_base + 0x08,
13 PRIORITY = Kmem::Pic_map_base + 0x0c,
14 INTPND = Kmem::Pic_map_base + 0x10,
15 INTOFFSET = Kmem::Pic_map_base + 0x14,
16 SUBSRCPND = Kmem::Pic_map_base + 0x18,
17 INTSUBMSK = Kmem::Pic_map_base + 0x1c,
74 // ---------------------------------------------------------------------
75 IMPLEMENTATION [arm && s3c2410]:
79 #include "irq_chip_generic.h"
84 class S3c_chip : public Irq_chip_gen
87 S3c_chip() : Irq_chip_gen(32) {}
88 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
89 void set_cpu(Mword, unsigned) {}
95 S3c_chip::mask(Mword irq)
101 case Pic::INT_TC: Io::set<Mword>(1 << Pic::SUB_TC, Pic::INTSUBMSK); mainirq = Pic::MAIN_ADC; break;
102 case Pic::INT_ADC: Io::set<Mword>(1 << Pic::SUB_ADC, Pic::INTSUBMSK); mainirq = Pic::MAIN_ADC; break;
103 case Pic::INT_UART0_RXD: Io::set<Mword>(1 << Pic::SUB_RXD0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
104 case Pic::INT_UART0_TXD: Io::set<Mword>(1 << Pic::SUB_TXD0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
105 case Pic::INT_UART0_ERR: Io::set<Mword>(1 << Pic::SUB_ERR0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
106 case Pic::INT_UART1_RXD: Io::set<Mword>(1 << Pic::SUB_RXD1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
107 case Pic::INT_UART1_TXD: Io::set<Mword>(1 << Pic::SUB_TXD1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
108 case Pic::INT_UART1_ERR: Io::set<Mword>(1 << Pic::SUB_ERR1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
109 case Pic::INT_UART2_RXD: Io::set<Mword>(1 << Pic::SUB_RXD2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
110 case Pic::INT_UART2_TXD: Io::set<Mword>(1 << Pic::SUB_TXD2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
111 case Pic::INT_UART2_ERR: Io::set<Mword>(1 << Pic::SUB_ERR2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
114 return; // XXX: need to add other cases
118 Io::set<Mword>(1 << mainirq, Pic::INTMSK);
123 S3c_chip::unmask(Mword irq)
129 case Pic::INT_TC: Io::clear<Mword>(1 << Pic::SUB_TC, Pic::INTSUBMSK); mainirq = Pic::MAIN_ADC; break;
130 case Pic::INT_ADC: Io::clear<Mword>(1 << Pic::SUB_ADC, Pic::INTSUBMSK); mainirq = Pic::MAIN_ADC; break;
131 case Pic::INT_UART0_RXD: Io::clear<Mword>(1 << Pic::SUB_RXD0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
132 case Pic::INT_UART0_TXD: Io::clear<Mword>(1 << Pic::SUB_TXD0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
133 case Pic::INT_UART0_ERR: Io::clear<Mword>(1 << Pic::SUB_ERR0, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART0; break;
134 case Pic::INT_UART1_RXD: Io::clear<Mword>(1 << Pic::SUB_RXD1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
135 case Pic::INT_UART1_TXD: Io::clear<Mword>(1 << Pic::SUB_TXD1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
136 case Pic::INT_UART1_ERR: Io::clear<Mword>(1 << Pic::SUB_ERR1, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART1; break;
137 case Pic::INT_UART2_RXD: Io::clear<Mword>(1 << Pic::SUB_RXD2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
138 case Pic::INT_UART2_TXD: Io::clear<Mword>(1 << Pic::SUB_TXD2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
139 case Pic::INT_UART2_ERR: Io::clear<Mword>(1 << Pic::SUB_ERR2, Pic::INTSUBMSK); mainirq = Pic::MAIN_UART2; break;
142 return; // XXX: need to add other cases
146 Io::clear<Mword>(1 << mainirq, Pic::INTMSK);
151 S3c_chip::ack(Mword irq)
157 case Pic::INT_TC: Io::write<Mword>(1 << Pic::SUB_TC, Pic::SUBSRCPND); mainirq = Pic::MAIN_ADC; break;
158 case Pic::INT_ADC: Io::write<Mword>(1 << Pic::SUB_ADC, Pic::SUBSRCPND); mainirq = Pic::MAIN_ADC; break;
159 case Pic::INT_UART0_RXD: Io::write<Mword>(1 << Pic::SUB_RXD0, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART0; break;
160 case Pic::INT_UART0_TXD: Io::write<Mword>(1 << Pic::SUB_TXD0, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART0; break;
161 case Pic::INT_UART0_ERR: Io::write<Mword>(1 << Pic::SUB_ERR0, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART0; break;
162 case Pic::INT_UART1_RXD: Io::write<Mword>(1 << Pic::SUB_RXD1, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART1; break;
163 case Pic::INT_UART1_TXD: Io::write<Mword>(1 << Pic::SUB_TXD1, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART1; break;
164 case Pic::INT_UART1_ERR: Io::write<Mword>(1 << Pic::SUB_ERR1, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART1; break;
165 case Pic::INT_UART2_RXD: Io::write<Mword>(1 << Pic::SUB_RXD2, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART2; break;
166 case Pic::INT_UART2_TXD: Io::write<Mword>(1 << Pic::SUB_TXD2, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART2; break;
167 case Pic::INT_UART2_ERR: Io::write<Mword>(1 << Pic::SUB_ERR2, Pic::SUBSRCPND); mainirq = Pic::MAIN_UART2; break;
170 return; // XXX: need to add other cases
174 Io::write<Mword>(1 << mainirq, Pic::SRCPND); // only 1s are set to 0
175 Io::write<Mword>(1 << mainirq, Pic::INTPND); // clear pending interrupt
180 S3c_chip::mask_and_ack(Mword irq)
182 assert(cpu_lock.test());
188 static Static_object<Irq_mgr_single_chip<S3c_chip> > mgr;
191 IMPLEMENT FIASCO_INIT
194 Irq_mgr::mgr = mgr.construct();
196 Io::write<Mword>(0xffffffff, INTMSK); // all masked
197 Io::write<Mword>(0x7fe, INTSUBMSK); // all masked
198 Io::write<Mword>(0, INTMODE); // all IRQs, no FIQs
199 Io::write<Mword>(Io::read<Mword>(SRCPND), SRCPND); // clear source pending
200 Io::write<Mword>(Io::read<Mword>(SUBSRCPND), SUBSRCPND); // clear sub src pnd
201 Io::write<Mword>(Io::read<Mword>(INTPND), INTPND); // clear pending interrupt
206 Pic::Status Pic::disable_all_save()
213 void Pic::restore_all(Status)
216 PUBLIC static inline NEEDS["io.h"]
217 Unsigned32 Pic::pending()
219 int mainirq = Io::read<Mword>(INTOFFSET);
225 int subirq = Io::read<Mword>(SUBSRCPND);
226 if ((1 << SUB_ADC) & subirq)
228 else if ((1 << SUB_TC) & subirq)
242 Unsigned32 i = Pic::pending();
244 mgr->c.handle_irq<S3c_chip>(i, 0);
247 //---------------------------------------------------------------------------
248 IMPLEMENTATION [debug && s3c2410]:
252 S3c_chip::chip_type() const
253 { return "HW S3C2410 IRQ"; }