4 //-------------------------------------------------------------------------
5 IMPLEMENTATION [arm && pic_gic && exynos]:
7 class Mgr_exynos : public Irq_mgr
19 for (unsigned i = 0; i < _nr_blocks; ++i)
20 _nr_irqs += _block[i].sz;
24 unsigned nr_irqs() const { return _nr_irqs; }
25 unsigned nr_msis() const { return 0; }
34 //-------------------------------------------------------------------------
35 IMPLEMENTATION [arm && pic_gic && exynos]:
41 #include "boot_alloc.h"
43 #include "initcalls.h"
46 #include "irq_chip_generic.h"
50 #include "mmio_register_block.h"
56 class Gpio_eint_chip : public Irq_chip_gen, private Mmio_register_block
59 unsigned offs(Mword pin) const { return (pin >> 3) * 4; }
62 Gpio_eint_chip(Mword gpio_base, unsigned num_irqs)
63 : Irq_chip_gen(num_irqs), _gpio_base(gpio_base)
67 { Io::set<Mword>(1 << (pin & 7), _gpio_base + MASK + offs(pin)); }
70 { Io::set<Mword>(1 << (pin & 7), _gpio_base + PEND + offs(pin)); }
72 void mask_and_ack(Mword pin) { mask(pin); ack(pin); }
74 void unmask(Mword pin)
75 { Io::clear<Mword>(1 << (pin & 7), _gpio_base + MASK + offs(pin)); }
77 void set_cpu(Mword, Cpu_number) {}
78 unsigned set_mode(Mword pin, unsigned m)
86 default: m = Irq_base::Trigger_level | Irq_base::Polarity_low;
88 case Irq_base::Trigger_level | Irq_base::Polarity_low: v = 0; break;
89 case Irq_base::Trigger_level | Irq_base::Polarity_high: v = 1; break;
90 case Irq_base::Trigger_edge | Irq_base::Polarity_low: v = 2; break;
91 case Irq_base::Trigger_edge | Irq_base::Polarity_high: v = 3; break;
92 case Irq_base::Trigger_edge | Irq_base::Polarity_both: v = 4; break;
95 Mword a = _gpio_base + INTCON + offs(pin);
98 Io::write<Mword>((Io::read<Mword>(a) & ~(7 << (pin * 4))) | v, a);
102 unsigned pending() { return Io::read<Mword>(_gpio_base + 0xb08); }
113 class Gpio_wakeup_chip : public Irq_chip_gen, private Mmio_register_block
116 unsigned offs(Mword pin) const { return (pin >> 3) * 4; }
119 explicit Gpio_wakeup_chip(Address physbase)
121 Mmio_register_block(Kmem::mmio_remap(physbase))
125 { modify<Mword>(1 << (pin & 7), 0, MASK + offs(pin)); }
128 { modify<Mword>(1 << (pin & 7), 0, PEND + offs(pin)); }
130 void mask_and_ack(Mword pin) { mask(pin); ack(pin); }
132 void unmask(Mword pin)
133 { modify<Mword>(0, 1 << (pin & 7), MASK + offs(pin)); }
134 void set_cpu(Mword, Cpu_number) {}
136 unsigned set_mode(Mword pin, unsigned m)
143 default: m = Irq_base::Trigger_level | Irq_base::Polarity_low;
145 case Irq_base::Trigger_level | Irq_base::Polarity_low: v = 0; break;
146 case Irq_base::Trigger_level | Irq_base::Polarity_high: v = 1; break;
147 case Irq_base::Trigger_edge | Irq_base::Polarity_low: v = 2; break;
148 case Irq_base::Trigger_edge | Irq_base::Polarity_high: v = 3; break;
149 case Irq_base::Trigger_edge | Irq_base::Polarity_both: v = 4; break;
152 Mword a = INTCON + offs(pin);
155 modify<Mword>(v, 7UL << (pin * 4), a);
160 unsigned pending01() const // debug only
162 return read<Unsigned8>(PEND + 0) | (static_cast<unsigned>(read<Unsigned8>(PEND + 4)) << 8);
165 unsigned pending23() const
167 return read<Unsigned8>(PEND + 8) | (static_cast<unsigned>(read<Unsigned8>(PEND + 12)) << 8);
179 class Combiner_chip : public Irq_chip_gen, private Mmio_register_block
194 Mword offset(unsigned irq) const { return (irq >> 2) * 0x10; }
196 static unsigned shift(int irq)
197 { return (irq % 4) * 8; }
199 static Mword bytemask(int irq)
200 { return 0xffUL << shift(irq); }
202 Mword status(int irq) const
203 { return read<Mword>(offset(irq) + Status) & bytemask(irq); }
206 { write<Mword>(1UL << (i & 31), offset(i / 8) + Enable_clear); }
208 void mask_and_ack(Mword i)
209 { Combiner_chip::mask(i); }
213 void set_cpu(Mword, Cpu_number) {}
215 unsigned set_mode(Mword, unsigned)
216 { return Irq_base::Trigger_level; }
219 { write<Mword>(1UL << (i & 31), offset(i / 8) + Enable_set); }
221 void init_irq(int irq) const
222 { write<Mword>(bytemask(irq), offset(irq) + Enable_clear); }
224 Unsigned32 pending(unsigned cnr)
226 unsigned v = status(cnr) >> shift(cnr);
227 for (unsigned i = 0; i < 8; ++i)
229 return (cnr * 8) + i;
230 // use __builtin_clz...
235 int num_combiner_chips() const
237 if (Platform::is_4210())
238 return Platform::gic_int() ? 54 : 16;
239 if (Platform::is_4412())
241 if (Platform::is_5250())
248 : Irq_chip_gen(num_combiner_chips() * 8),
249 Mmio_register_block(Kmem::mmio_remap(Mem_layout::Irq_combiner_phys_base))
252 if (Platform::gic_int())
254 for (int i = 0; i < 40; ++i)
261 const int num = num_combiner_chips();
262 for (int i = 0; i < num; ++i)
270 class Gpio_cascade_wu01_irq : public Irq_base
273 explicit Gpio_cascade_wu01_irq(Gpio_wakeup_chip *gc, unsigned pin)
274 : _wu_gpio(gc), _pin(pin)
275 { set_hit(&handler_wrapper<Gpio_cascade_wu01_irq>); }
277 void switch_mode(unsigned) {}
279 void handle(Upstream_irq const *u)
281 // checking pending reg as a debug thing
282 if (!(_wu_gpio->pending01() & (1 << _pin)))
283 WARN("WU-GPIO not pending %d\n", _pin);
285 Upstream_irq ui(this, u);
286 _wu_gpio->irq(_pin)->hit(&ui);
290 Gpio_wakeup_chip *_wu_gpio;
295 class Gpio_cascade_wu23_irq : public Irq_base
298 explicit Gpio_cascade_wu23_irq(Gpio_wakeup_chip *gc)
300 { set_hit(&handler_wrapper<Gpio_cascade_wu23_irq>); }
302 void switch_mode(unsigned) {}
305 Gpio_wakeup_chip *_wu_gpio;
310 Gpio_cascade_wu23_irq::handle(Upstream_irq const *u)
312 unsigned mask = _wu_gpio->pending23();
313 Upstream_irq ui(this, u);
314 for (unsigned p = 0; p < 16; ++p)
317 _wu_gpio->irq(p + 16)->hit(&ui);
322 class Gpio_cascade_xab_irq : public Irq_base
325 explicit Gpio_cascade_xab_irq(Gpio_eint_chip *g, unsigned special = 0)
326 : _eint_gc(g), _special(special)
327 { set_hit(&handler_wrapper<Gpio_cascade_xab_irq>); }
329 void switch_mode(unsigned) {}
332 Gpio_eint_chip *_eint_gc;
338 Gpio_cascade_xab_irq::handle(Upstream_irq const *u)
340 Mword p = _eint_gc->pending();
341 Upstream_irq ui(this, u);
344 int grp = (p >> 3) & 0x1f;
352 else if (_special == 2)
355 _eint_gc->irq((grp - 1) * 8 + pin)->hit(&ui);
358 _eint_gc->irq(p - 8)->hit(&ui);
362 class Combiner_cascade_irq : public Irq_base
365 Combiner_cascade_irq(unsigned nr, Combiner_chip *chld)
366 : _combiner_nr(nr), _child(chld)
367 { set_hit(&handler_wrapper<Combiner_cascade_irq>); }
369 void switch_mode(unsigned) {}
370 unsigned irq_nr_base() const { return _combiner_nr * 8; }
373 unsigned _combiner_nr;
374 Combiner_chip *_child;
379 Combiner_cascade_irq::handle(Upstream_irq const *u)
381 Unsigned32 num = _child->pending(_combiner_nr);
382 Upstream_irq ui(this, u);
384 if (num != Combiner_chip::No_pending)
385 _child->irq(num)->hit(&ui);
388 // ------------------------------------------------------------------------
389 IMPLEMENTATION [arm && pic_gic && exynos]:
392 Pic::Status Pic::disable_all_save()
396 void Pic::restore_all(Status)
399 // ------------------------------------------------------------------------
400 IMPLEMENTATION [exynos4 && !exynos_extgic]:
402 class Mgr_int : public Mgr_exynos
406 Irq chip(Mword irqnum) const
408 Mword origirq = irqnum;
410 for (unsigned i = 0; i < _nr_blocks; ++i)
412 if (irqnum < _block[i].sz)
413 return Irq(_block[i].chip, irqnum);
415 irqnum -= _block[i].sz;
418 printf("KERNEL: exynos-irq: Invalid irqnum=%ld\n", origirq);
425 Gpio_wakeup_chip *_wu_gc;
426 Gpio_eint_chip *_ei_gc1, *_ei_gc2;
432 _gic = Pic::gic.construct(Kmem::mmio_remap(Mem_layout::Gic_cpu_int_phys_base),
433 Kmem::mmio_remap(Mem_layout::Gic_dist_int_phys_base));
435 _cc = new Boot_object<Combiner_chip>();
436 _wu_gc = new Boot_object<Gpio_wakeup_chip>(Kmem::Gpio2_phys_base);
437 _ei_gc1 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio1_phys_base));
438 _ei_gc2 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio2_phys_base));
441 for (unsigned i = 0; i < 40; ++i)
443 _gic->alloc(new Boot_object<Combiner_cascade_irq>(i, _cc), i + 32);
444 _gic->unmask(i + 32);
446 _gic->alloc(new Boot_object<Combiner_cascade_irq>(51, _cc), 51 + 32);
447 _gic->unmask(51 + 32);
448 _gic->alloc(new Boot_object<Combiner_cascade_irq>(53, _cc), 53 + 32);
449 _gic->unmask(53 + 32);
451 // GPIO-wakeup0-3 goes to GIC
452 _gic->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 0), 72); _gic->unmask(72);
453 _gic->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 1), 73); _gic->unmask(73);
454 _gic->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 2), 74); _gic->unmask(74);
455 _gic->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 3), 75); _gic->unmask(75);
457 // GPIO-wakeup4-7 -> comb37:0-3
458 for (unsigned i = 0; i < 4; ++i)
460 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 4 + i), 8 * 37 + i);
461 _cc->unmask(8 * 37 + i);
464 // GPIO-wakeup8-15 -> COMB:38:0-7
465 for (unsigned i = 0; i < 8; ++i)
467 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 8 + i), 8 * 38 + i);
468 _cc->unmask(8 * 38 + i);
471 // GPIO-wakeup16-31: COMP:39:0
472 _cc->alloc(new Boot_object<Gpio_cascade_wu23_irq>(_wu_gc), 8 * 39 + 0);
473 _cc->unmask(8 * 39 + 0);
476 _cc->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc1), 8 * 24 + 1);
477 _cc->unmask(8 * 24 + 1);
480 _cc->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc2), 8 * 24 + 0);
481 _cc->unmask(8 * 24 + 0);
483 static Chip_block soc[] = {
488 { (29 - 21 + 1) * 8, _ei_gc2 },
492 _nr_blocks = sizeof(soc) / sizeof(soc[0]);
500 Mgr_int::set_cpu(Mword irqnum, Cpu_number cpu) const
502 // this handles only the MCT_L[01] timers
503 if ( irqnum == 379 // MCT_L1: Combiner 35:3
504 || irqnum == 504) // MCT_L0: Combiner 51:0
505 _gic->set_cpu(32 + (irqnum - 96) / 8, cpu);
507 WARNX(Warning, "IRQ%ld: ignoring CPU setting (%d).\n",
508 irqnum, cxx::int_value<Cpu_number>(cpu));
511 IMPLEMENT static FIASCO_INIT
514 Irq_mgr::mgr = new Boot_object<Mgr_int>();
518 void Pic::init_ap(Cpu_number)
523 // ------------------------------------------------------------------------
524 INTERFACE [exynos4 && exynos_extgic]:
527 #include "per_cpu_data.h"
528 #include "platform.h"
533 static Per_cpu_ptr<Static_object<Gic> > gic;
536 // ------------------------------------------------------------------------
537 IMPLEMENTATION [exynos4 && exynos_extgic]:
541 Per_cpu_ptr<Static_object<Gic> > Pic::gic;
543 class Mgr_ext : public Mgr_exynos
546 Irq chip(Mword irqnum) const
548 Mword origirq = irqnum;
550 for (unsigned i = 0; i < _nr_blocks; ++i)
552 if (irqnum < _block[i].sz)
554 if (i == 0) // some special handling in GIC block
555 if (!Platform::is_4412())
556 if (irqnum == 80 && Config::Max_num_cpus > 1) // MCT_L1 goes to CPU1
557 return Irq(_gic.cpu(Cpu_number(1)), irqnum);
559 return Irq(_block[i].chip, irqnum);
562 irqnum -= _block[i].sz;
565 printf("KERNEL: exynos-irq: Invalid irqnum=%ld\n", origirq);
570 friend void irq_handler();
572 static Per_cpu<Static_object<Gic> > _gic;
574 Gpio_wakeup_chip *_wu_gc;
575 Gpio_eint_chip *_ei_gc1, *_ei_gc2;
576 //Gpio_eint_chip *_ei_gc3, *_ei_gc4;
579 DEFINE_PER_CPU Per_cpu<Static_object<Gic> > Mgr_ext::_gic;
584 Gic *g = _gic.cpu(Cpu_number(0)).construct(
585 Kmem::mmio_remap(Mem_layout::Gic_cpu_ext_cpu0_phys_base),
586 Kmem::mmio_remap(Mem_layout::Gic_dist_ext_cpu0_phys_base));
588 _cc = new Boot_object<Combiner_chip>();
590 _wu_gc = new Boot_object<Gpio_wakeup_chip>(Kmem::Gpio2_phys_base);
591 _ei_gc1 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio1_phys_base), 18 * 8);
592 _ei_gc2 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio2_phys_base), 14 * 8);
595 for (unsigned i = 0; i < 16; ++i)
597 g->alloc(new Boot_object<Combiner_cascade_irq>(i, _cc), i + 32);
601 if (Platform::is_4412())
603 g->alloc(new Boot_object<Combiner_cascade_irq>(16, _cc), 139); g->unmask(139);
604 g->alloc(new Boot_object<Combiner_cascade_irq>(17, _cc), 140); g->unmask(140);
605 g->alloc(new Boot_object<Combiner_cascade_irq>(18, _cc), 80); g->unmask(80);
606 g->alloc(new Boot_object<Combiner_cascade_irq>(19, _cc), 74); g->unmask(74);
609 // GPIO-wakeup0-15 goes to GIC
610 for (unsigned i = 0; i < 16; ++i)
612 g->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, i), i + 48);
616 // GPIO-wakeup16-31: GIC:32+32
617 g->alloc(new Boot_object<Gpio_cascade_wu23_irq>(_wu_gc), 64);
621 g->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc1, Platform::is_4412() ? 1 : 0), 79);
625 g->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc2, Platform::is_4412() ? 2 : 0), 78);
630 // - part1: ext-int 0x700: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
631 // - part2: ext-int 0x700: 21, 22, 23, 24, 25, 26, 27, 28, 29
632 // 0xe00: wu1, wu2, wu3, wu4
635 static Chip_block soc4210[] = {
636 { 160, _gic.cpu(Cpu_number(0)) },
640 { (29 - 21 + 1) * 8, _ei_gc2 },
644 // - part1: ext-int 0x700: 1, 2, 3, 4, 5, 6, 7, 13, 14, 15, 16, 21, 22
645 // - part2: ext-int 0x700: 23, 24, 25, 26, 27, 28, 29, 8, 9, 10, 11, 12
646 // 0xe00: 40, 41, 42, 43
647 // - part3: ext-int 0x700: 50
648 // - part4: ext-int 0x700: 30, 31, 32, 33, 34
650 static Chip_block soc4412[] = {
651 { 160, _gic.cpu(Cpu_number(0)) },
656 //{ 1 * 8, _ei_gc3 }, // Do not know upstream IRQ-num :(
657 //{ 5 * 8, _ei_gc4 }, // Do not know upstream IRQ-num :(
660 if (Platform::is_4412())
663 _nr_blocks = sizeof(soc4412) / sizeof(soc4412[0]);
668 _nr_blocks = sizeof(soc4210) / sizeof(soc4210[0]);
675 * \pre must run on the CPU given in \a cpu.
679 Mgr_ext::set_cpu(Mword irqnum, Cpu_number cpu) const
681 if (!Platform::is_4412() && irqnum == 80) // MCT_L1
682 _gic.cpu(cpu)->set_cpu(80, cpu);
684 WARNX(Warning, "IRQ%ld: ignoring CPU setting (%d).\n", irqnum,
685 cxx::int_value<Cpu_number>(cpu));
688 IMPLEMENT static FIASCO_INIT
691 Mgr_ext *m = new Boot_object<Mgr_ext>();
698 Pic::reinit(Cpu_number cpu)
700 gic.cpu(cpu)->init(true, 96);
703 class Check_irq0 : public Irq_base
706 Check_irq0() { set_hit(&hndl); }
707 static void hndl(Irq_base *, Upstream_irq const *)
709 printf("IRQ0 appeared on CPU%d\n",
710 cxx::int_value<Cpu_number>(current_cpu()));
713 void switch_mode(unsigned) {}
716 DEFINE_PER_CPU static Per_cpu<Static_object<Check_irq0> > _check_irq0;
720 void Pic::init_ap(Cpu_number cpu)
722 if (Platform::is_4412())
724 assert(cpu > Cpu_number(0));
725 assert(cpu < Cpu_number(4));
727 unsigned phys_cpu = cxx::int_value<Cpu_phys_id>(Cpu::cpus.cpu(cpu).phys_id());
728 gic.cpu(cpu).construct(
729 Kmem::mmio_remap(Mem_layout::Gic_cpu_ext_cpu0_phys_base + phys_cpu * 0x4000),
730 Kmem::mmio_remap(Mem_layout::Gic_dist_ext_cpu0_phys_base + phys_cpu * 0x4000),
731 gic.cpu(Cpu_number(0)));
735 assert (cpu == Cpu_number(1));
736 assert (Cpu::cpus.cpu(cpu).phys_id() == Cpu_phys_id(1));
738 gic.cpu(cpu).construct(Kmem::mmio_remap(Mem_layout::Gic_cpu_ext_cpu1_phys_base),
739 Kmem::mmio_remap(Mem_layout::Gic_dist_ext_cpu1_phys_base),
740 gic.cpu(Cpu_number(0)));
743 gic.cpu(cpu)->init_ap();
746 // This is a debug facility as we've been seeing IRQ0
747 // happening under (non-usual) high load
748 _check_irq0.cpu(cpu).construct();
749 gic.cpu(cpu)->alloc(_check_irq0.cpu(cpu), 0);
755 { nonull_static_cast<Mgr_ext *>(Irq_mgr::mgr)->_gic.current()->hit(0); }
757 //-------------------------------------------------------------------
758 IMPLEMENTATION [arm && exynos_extgic && arm_em_tz]:
762 Pic::set_pending_irq(unsigned group32num, Unsigned32 val)
764 gic.current()->set_pending_irq(group32num, val);
767 // ------------------------------------------------------------------------
768 IMPLEMENTATION [exynos5]:
770 #include "platform.h"
776 class Mgr : public Mgr_exynos
778 Irq chip(Mword irqnum) const
780 Mword origirq = irqnum;
782 for (unsigned i = 0; i < _nr_blocks; ++i)
784 if (irqnum < _block[i].sz)
785 return Irq(_block[i].chip, irqnum);
787 irqnum -= _block[i].sz;
790 printf("KERNEL: exynos-irq: Invalid irqnum=%ld\n", origirq);
797 Gpio_wakeup_chip *_wu_gc;
798 Gpio_eint_chip *_ei_gc1, *_ei_gc2;
799 Gpio_eint_chip *_ei_gc3, *_ei_gc4;
805 Gic *g = Pic::gic.construct(Kmem::mmio_remap(Mem_layout::Gic_cpu_phys_base),
806 Kmem::mmio_remap(Mem_layout::Gic_dist_phys_base));
808 _cc = new Boot_object<Combiner_chip>();
810 _wu_gc = new Boot_object<Gpio_wakeup_chip>(Kmem::Gpio1_phys_base);
812 _ei_gc1 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio1_phys_base), 13 * 8);
813 _ei_gc2 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio2_phys_base), 8 * 8);
814 _ei_gc3 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio3_phys_base), 5 * 8);
815 _ei_gc4 = new Boot_object<Gpio_eint_chip>(Kmem::mmio_remap(Mem_layout::Gpio4_phys_base), 1 * 8);
818 for (unsigned i = 0; i < 32; ++i)
820 g->alloc(new Boot_object<Combiner_cascade_irq>(i, _cc), i + 32);
824 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 0), 8 * 23 + 0);
825 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, 1), 8 * 24 + 0);
826 for (int i = 25, nr = 2; i < 32; ++i, nr += 2)
828 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, nr + 0), 8 * i + 0);
829 _cc->alloc(new Boot_object<Gpio_cascade_wu01_irq>(_wu_gc, nr + 1), 8 * i + 1);
832 // GPIO-wakeup16-31: GIC:32+32
833 g->alloc(new Boot_object<Gpio_cascade_wu23_irq>(_wu_gc), 64);
839 g->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc1), 79);
843 g->alloc(new Boot_object<Gpio_cascade_xab_irq>(_ei_gc2), 78);
848 // - part1: ext-int 0x700: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 30
849 // 0xe00: 40, 41, 42, 43
850 // - part2: ext-int 0x700: 14, 15, 16, 17, 18, 19, 20, 21, 22
851 // - part3: ext-int 0x700: 60, 61, 62, 63, 64
852 // - part4: ext-int 0x700: 50
854 static Chip_block socblock[] = {
858 { _ei_gc1->nr_irqs(), _ei_gc1 },
859 { _ei_gc2->nr_irqs(), _ei_gc2 },
860 { _ei_gc3->nr_irqs(), _ei_gc3 },
861 { _ei_gc4->nr_irqs(), _ei_gc4 },
865 _nr_blocks = sizeof(socblock) / sizeof(socblock[0]);
871 * \pre must run on the CPU given in \a cpu.
875 Mgr::set_cpu(Mword irqnum, Cpu_number cpu) const
877 // this handles only the MCT_L[01] timers
878 if ( irqnum == 152 // MCT_L0
879 || irqnum == 153) // MCT_L1
880 Pic::gic->set_cpu(irqnum, cpu);
882 WARNX(Warning, "IRQ%ld: ignoring CPU setting (%d).\n",
883 irqnum, cxx::int_value<Cpu_number>(cpu));
886 IMPLEMENT static FIASCO_INIT
889 Irq_mgr::mgr = new Boot_object<Mgr>();
894 Pic::reinit(Cpu_number)
900 void Pic::init_ap(Cpu_number)
905 //---------------------------------------------------------------------------
906 IMPLEMENTATION [debug && exynos]:
910 Combiner_chip::chip_type() const
915 Gpio_eint_chip::chip_type() const
916 { return "EI-Gpio"; }
920 Gpio_wakeup_chip::chip_type() const
921 { return "WU-GPIO"; }