]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/pxa-sa/pic-arm-pxa_sa1100.cpp
f01396bc4ce58212fa269df61f0726c90fb77547
[l4.git] / kernel / fiasco / src / kern / arm / bsp / pxa-sa / pic-arm-pxa_sa1100.cpp
1 INTERFACE [arm && pxa]: // -------------------------------------
2
3 #include "kmem.h"
4
5 EXTENSION class Pic
6 {
7 public:
8   enum {
9     ICIP = Kmem::Pic_map_base + 0x000000,
10     ICMR = Kmem::Pic_map_base + 0x000004,
11     ICLR = Kmem::Pic_map_base + 0x000008,
12     ICCR = Kmem::Pic_map_base + 0x000014,
13     ICFP = Kmem::Pic_map_base + 0x00000c,
14     ICPR = Kmem::Pic_map_base + 0x000010,
15   };
16 };
17
18 INTERFACE [arm && sa1100]: // ----------------------------------
19
20 #include "kmem.h"
21
22 EXTENSION class Pic
23 {
24 public:
25   enum {
26     ICIP = Kmem::Pic_map_base + 0x00000,
27     ICMR = Kmem::Pic_map_base + 0x00004,
28     ICLR = Kmem::Pic_map_base + 0x00008,
29     ICCR = Kmem::Pic_map_base + 0x0000c,
30     ICFP = Kmem::Pic_map_base + 0x00010,
31     ICPR = Kmem::Pic_map_base + 0x00020,
32   };
33 };
34
35 // -------------------------------------------------------------
36 IMPLEMENTATION [arm && (sa1100 || pxa)]:
37
38 #include "config.h"
39 #include "io.h"
40 #include "irq.h"
41 #include "irq_chip_generic.h"
42 #include "irq_mgr.h"
43
44 class Chip : public Irq_chip_gen
45 {
46 public:
47   Chip() : Irq_chip_gen(32) {}
48   unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
49   void set_cpu(Mword, unsigned) {}
50   void ack(Mword) { /* ack is empty */ }
51 };
52
53 PUBLIC
54 void
55 Chip::mask(Mword irq)
56 {
57   assert(cpu_lock.test());
58   Io::write(Io::read<Mword>(Pic::ICMR) & ~(1 << irq), Pic::ICMR);
59 }
60
61 PUBLIC
62 void
63 Chip::mask_and_ack(Mword irq)
64 {
65   assert (cpu_lock.test());
66   Io::write(Io::read<Mword>(Pic::ICMR) & ~(1 << irq), Pic::ICMR);
67   // ack is empty
68 }
69
70 PUBLIC
71 void
72 Chip::unmask(Mword irq)
73 {
74   Io::write(Io::read<Mword>(Pic::ICMR) | (1 << irq), Pic::ICMR);
75 }
76
77 static Static_object<Irq_mgr_single_chip<Chip> > mgr;
78
79 IMPLEMENT FIASCO_INIT
80 void Pic::init()
81 {
82   Irq_mgr::mgr = mgr.construct();
83
84   // only unmasked interrupts wakeup from idle
85   Io::write(0x01, ICCR);
86   // mask all interrupts
87   Io::write(0x00, ICMR);
88   // all interrupts are IRQ's (no FIQ)
89   Io::write(0x00, ICLR);
90 }
91
92 IMPLEMENT inline NEEDS["io.h"]
93 Pic::Status Pic::disable_all_save()
94 {
95   Status s = Io::read<Mword>(ICMR);
96   Io::write(0, ICMR);
97   return s;
98 }
99
100 IMPLEMENT inline NEEDS["io.h"]
101 void Pic::restore_all(Status s)
102 {
103   Io::write(s, ICMR);
104 }
105
106 PUBLIC static inline NEEDS["io.h"]
107 Unsigned32 Chip::pending()
108 {
109   return Io::read<Unsigned32>(Pic::ICIP);
110 }
111
112 extern "C"
113 void irq_handler()
114 {
115   Unsigned32 i = Chip::pending();
116   if (i)
117     mgr->c.handle_irq<Chip>(i, 0);
118 }
119
120 // -------------------------------------------------------------
121 IMPLEMENTATION [arm && debug && (sa1100 || pxa)]:
122
123 PUBLIC
124 char const *
125 Chip::chip_type() const
126 { return "HW PXA/SA IRQ"; }