]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/pxa-sa/pic-arm-pxa_sa1100.cpp
update
[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 = 0x000000,
10     ICMR = 0x000004,
11     ICLR = 0x000008,
12     ICCR = 0x000014,
13     ICFP = 0x00000c,
14     ICPR = 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 = 0x00000,
27     ICMR = 0x00004,
28     ICLR = 0x00008,
29     ICCR = 0x0000c,
30     ICFP = 0x00010,
31     ICPR = 0x00020,
32   };
33 };
34
35 // -------------------------------------------------------------
36 IMPLEMENTATION [arm && (sa1100 || pxa)]:
37
38 #include "assert.h"
39 #include "initcalls.h"
40 #include "config.h"
41 #include "irq_chip_generic.h"
42 #include "irq_mgr.h"
43 #include "mmio_register_block.h"
44
45 class Chip : public Irq_chip_gen, private Mmio_register_block
46 {
47 public:
48   unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
49   void set_cpu(Mword, Cpu_number) {}
50   void ack(Mword) { /* ack is empty */ }
51 };
52
53 PUBLIC inline
54 Chip::Chip()
55 : Irq_chip_gen(32),
56   Mmio_register_block(Kmem::mmio_remap(Mem_layout::Pic_phys_base))
57 {
58   // only unmasked interrupts wakeup from idle
59   write<Mword>(0x01, Pic::ICCR);
60   // mask all interrupts
61   write<Mword>(0x00, Pic::ICMR);
62   // all interrupts are IRQ's (no FIQ)
63   write<Mword>(0x00, Pic::ICLR);
64 }
65
66 PUBLIC
67 void
68 Chip::mask(Mword irq)
69 {
70   assert(cpu_lock.test());
71   modify<Mword>(0, 1 << irq, Pic::ICMR);
72 }
73
74 PUBLIC
75 void
76 Chip::mask_and_ack(Mword irq)
77 {
78   assert (cpu_lock.test());
79   modify<Mword>(0, 1 << irq, Pic::ICMR);
80   // ack is empty
81 }
82
83 PUBLIC
84 void
85 Chip::unmask(Mword irq)
86 {
87   modify<Mword>(1 << irq, 0, Pic::ICMR);
88 }
89
90 // for JDB only
91 PUBLIC inline
92 Mword
93 Chip::disable_all_save()
94 {
95   Mword s = read<Mword>(Pic::ICMR);
96   write<Mword>(0, Pic::ICMR);
97   return s;
98 }
99
100 // for JDB only
101 PUBLIC inline
102 void
103 Chip::restore_all(Mword s)
104 {
105   write(s, Pic::ICMR);
106 }
107
108
109 static Static_object<Irq_mgr_single_chip<Chip> > mgr;
110
111 IMPLEMENT FIASCO_INIT
112 void Pic::init()
113 {
114   Irq_mgr::mgr = mgr.construct();
115 }
116
117 // for JDB only
118 IMPLEMENT
119 Pic::Status Pic::disable_all_save()
120 { return mgr->c.disable_all_save(); }
121
122 IMPLEMENT
123 void
124 Pic::restore_all(Status s)
125 {
126   mgr->c.restore_all(s);
127 }
128
129 PUBLIC inline
130 Unsigned32 Chip::pending()
131 {
132   return read<Unsigned32>(Pic::ICIP);
133 }
134
135 extern "C"
136 void irq_handler()
137 {
138   Unsigned32 i = mgr->c.pending();
139   if (i)
140     mgr->c.handle_irq<Chip>(i, 0);
141 }
142
143 // -------------------------------------------------------------
144 IMPLEMENTATION [arm && debug && (sa1100 || pxa)]:
145
146 PUBLIC
147 char const *
148 Chip::chip_type() const
149 { return "HW PXA/SA IRQ"; }