1 /*
2 * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #pragma message __FILE__ " is deprecated, use gicv2.mk instead"
8
9 #include <assert.h>
10
11 #include <drivers/arm/gic_common.h>
12 #include <lib/mmio.h>
13
14 #include "gic_common_private.h"
15
16 /*******************************************************************************
17 * GIC Distributor interface accessors for reading entire registers
18 ******************************************************************************/
19 /*
20 * Accessor to read the GIC Distributor IGROUPR corresponding to the interrupt
21 * `id`, 32 interrupt ids at a time.
22 */
gicd_read_igroupr(uintptr_t base,unsigned int id)23 unsigned int gicd_read_igroupr(uintptr_t base, unsigned int id)
24 {
25 unsigned int n = id >> IGROUPR_SHIFT;
26
27 return mmio_read_32(base + GICD_IGROUPR + (n << 2));
28 }
29
30 /*
31 * Accessor to read the GIC Distributor ISENABLER corresponding to the
32 * interrupt `id`, 32 interrupt ids at a time.
33 */
gicd_read_isenabler(uintptr_t base,unsigned int id)34 unsigned int gicd_read_isenabler(uintptr_t base, unsigned int id)
35 {
36 unsigned int n = id >> ISENABLER_SHIFT;
37
38 return mmio_read_32(base + GICD_ISENABLER + (n << 2));
39 }
40
41 /*
42 * Accessor to read the GIC Distributor ICENABLER corresponding to the
43 * interrupt `id`, 32 interrupt IDs at a time.
44 */
gicd_read_icenabler(uintptr_t base,unsigned int id)45 unsigned int gicd_read_icenabler(uintptr_t base, unsigned int id)
46 {
47 unsigned int n = id >> ICENABLER_SHIFT;
48
49 return mmio_read_32(base + GICD_ICENABLER + (n << 2));
50 }
51
52 /*
53 * Accessor to read the GIC Distributor ISPENDR corresponding to the
54 * interrupt `id`, 32 interrupt IDs at a time.
55 */
gicd_read_ispendr(uintptr_t base,unsigned int id)56 unsigned int gicd_read_ispendr(uintptr_t base, unsigned int id)
57 {
58 unsigned int n = id >> ISPENDR_SHIFT;
59
60 return mmio_read_32(base + GICD_ISPENDR + (n << 2));
61 }
62
63 /*
64 * Accessor to read the GIC Distributor ICPENDR corresponding to the
65 * interrupt `id`, 32 interrupt IDs at a time.
66 */
gicd_read_icpendr(uintptr_t base,unsigned int id)67 unsigned int gicd_read_icpendr(uintptr_t base, unsigned int id)
68 {
69 unsigned int n = id >> ICPENDR_SHIFT;
70
71 return mmio_read_32(base + GICD_ICPENDR + (n << 2));
72 }
73
74 /*
75 * Accessor to read the GIC Distributor ISACTIVER corresponding to the
76 * interrupt `id`, 32 interrupt IDs at a time.
77 */
gicd_read_isactiver(uintptr_t base,unsigned int id)78 unsigned int gicd_read_isactiver(uintptr_t base, unsigned int id)
79 {
80 unsigned int n = id >> ISACTIVER_SHIFT;
81
82 return mmio_read_32(base + GICD_ISACTIVER + (n << 2));
83 }
84
85 /*
86 * Accessor to read the GIC Distributor ICACTIVER corresponding to the
87 * interrupt `id`, 32 interrupt IDs at a time.
88 */
gicd_read_icactiver(uintptr_t base,unsigned int id)89 unsigned int gicd_read_icactiver(uintptr_t base, unsigned int id)
90 {
91 unsigned int n = id >> ICACTIVER_SHIFT;
92
93 return mmio_read_32(base + GICD_ICACTIVER + (n << 2));
94 }
95
96 /*
97 * Accessor to read the GIC Distributor IPRIORITYR corresponding to the
98 * interrupt `id`, 4 interrupt IDs at a time.
99 */
gicd_read_ipriorityr(uintptr_t base,unsigned int id)100 unsigned int gicd_read_ipriorityr(uintptr_t base, unsigned int id)
101 {
102 unsigned int n = id >> IPRIORITYR_SHIFT;
103
104 return mmio_read_32(base + GICD_IPRIORITYR + (n << 2));
105 }
106
107 /*
108 * Accessor to read the GIC Distributor ICGFR corresponding to the
109 * interrupt `id`, 16 interrupt IDs at a time.
110 */
gicd_read_icfgr(uintptr_t base,unsigned int id)111 unsigned int gicd_read_icfgr(uintptr_t base, unsigned int id)
112 {
113 unsigned int n = id >> ICFGR_SHIFT;
114
115 return mmio_read_32(base + GICD_ICFGR + (n << 2));
116 }
117
118 /*
119 * Accessor to read the GIC Distributor NSACR corresponding to the
120 * interrupt `id`, 16 interrupt IDs at a time.
121 */
gicd_read_nsacr(uintptr_t base,unsigned int id)122 unsigned int gicd_read_nsacr(uintptr_t base, unsigned int id)
123 {
124 unsigned int n = id >> NSACR_SHIFT;
125
126 return mmio_read_32(base + GICD_NSACR + (n << 2));
127 }
128
129 /*******************************************************************************
130 * GIC Distributor interface accessors for writing entire registers
131 ******************************************************************************/
132 /*
133 * Accessor to write the GIC Distributor IGROUPR corresponding to the
134 * interrupt `id`, 32 interrupt IDs at a time.
135 */
gicd_write_igroupr(uintptr_t base,unsigned int id,unsigned int val)136 void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val)
137 {
138 unsigned int n = id >> IGROUPR_SHIFT;
139
140 mmio_write_32(base + GICD_IGROUPR + (n << 2), val);
141 }
142
143 /*
144 * Accessor to write the GIC Distributor ISENABLER corresponding to the
145 * interrupt `id`, 32 interrupt IDs at a time.
146 */
gicd_write_isenabler(uintptr_t base,unsigned int id,unsigned int val)147 void gicd_write_isenabler(uintptr_t base, unsigned int id, unsigned int val)
148 {
149 unsigned int n = id >> ISENABLER_SHIFT;
150
151 mmio_write_32(base + GICD_ISENABLER + (n << 2), val);
152 }
153
154 /*
155 * Accessor to write the GIC Distributor ICENABLER corresponding to the
156 * interrupt `id`, 32 interrupt IDs at a time.
157 */
gicd_write_icenabler(uintptr_t base,unsigned int id,unsigned int val)158 void gicd_write_icenabler(uintptr_t base, unsigned int id, unsigned int val)
159 {
160 unsigned int n = id >> ICENABLER_SHIFT;
161
162 mmio_write_32(base + GICD_ICENABLER + (n << 2), val);
163 }
164
165 /*
166 * Accessor to write the GIC Distributor ISPENDR corresponding to the
167 * interrupt `id`, 32 interrupt IDs at a time.
168 */
gicd_write_ispendr(uintptr_t base,unsigned int id,unsigned int val)169 void gicd_write_ispendr(uintptr_t base, unsigned int id, unsigned int val)
170 {
171 unsigned int n = id >> ISPENDR_SHIFT;
172
173 mmio_write_32(base + GICD_ISPENDR + (n << 2), val);
174 }
175
176 /*
177 * Accessor to write the GIC Distributor ICPENDR corresponding to the
178 * interrupt `id`, 32 interrupt IDs at a time.
179 */
gicd_write_icpendr(uintptr_t base,unsigned int id,unsigned int val)180 void gicd_write_icpendr(uintptr_t base, unsigned int id, unsigned int val)
181 {
182 unsigned int n = id >> ICPENDR_SHIFT;
183
184 mmio_write_32(base + GICD_ICPENDR + (n << 2), val);
185 }
186
187 /*
188 * Accessor to write the GIC Distributor ISACTIVER corresponding to the
189 * interrupt `id`, 32 interrupt IDs at a time.
190 */
gicd_write_isactiver(uintptr_t base,unsigned int id,unsigned int val)191 void gicd_write_isactiver(uintptr_t base, unsigned int id, unsigned int val)
192 {
193 unsigned int n = id >> ISACTIVER_SHIFT;
194
195 mmio_write_32(base + GICD_ISACTIVER + (n << 2), val);
196 }
197
198 /*
199 * Accessor to write the GIC Distributor ICACTIVER corresponding to the
200 * interrupt `id`, 32 interrupt IDs at a time.
201 */
gicd_write_icactiver(uintptr_t base,unsigned int id,unsigned int val)202 void gicd_write_icactiver(uintptr_t base, unsigned int id, unsigned int val)
203 {
204 unsigned int n = id >> ICACTIVER_SHIFT;
205
206 mmio_write_32(base + GICD_ICACTIVER + (n << 2), val);
207 }
208
209 /*
210 * Accessor to write the GIC Distributor IPRIORITYR corresponding to the
211 * interrupt `id`, 4 interrupt IDs at a time.
212 */
gicd_write_ipriorityr(uintptr_t base,unsigned int id,unsigned int val)213 void gicd_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val)
214 {
215 unsigned int n = id >> IPRIORITYR_SHIFT;
216
217 mmio_write_32(base + GICD_IPRIORITYR + (n << 2), val);
218 }
219
220 /*
221 * Accessor to write the GIC Distributor ICFGR corresponding to the
222 * interrupt `id`, 16 interrupt IDs at a time.
223 */
gicd_write_icfgr(uintptr_t base,unsigned int id,unsigned int val)224 void gicd_write_icfgr(uintptr_t base, unsigned int id, unsigned int val)
225 {
226 unsigned int n = id >> ICFGR_SHIFT;
227
228 mmio_write_32(base + GICD_ICFGR + (n << 2), val);
229 }
230
231 /*
232 * Accessor to write the GIC Distributor NSACR corresponding to the
233 * interrupt `id`, 16 interrupt IDs at a time.
234 */
gicd_write_nsacr(uintptr_t base,unsigned int id,unsigned int val)235 void gicd_write_nsacr(uintptr_t base, unsigned int id, unsigned int val)
236 {
237 unsigned int n = id >> NSACR_SHIFT;
238
239 mmio_write_32(base + GICD_NSACR + (n << 2), val);
240 }
241
242 /*******************************************************************************
243 * GIC Distributor functions for accessing the GIC registers
244 * corresponding to a single interrupt ID. These functions use bitwise
245 * operations or appropriate register accesses to modify or return
246 * the bit-field corresponding the single interrupt ID.
247 ******************************************************************************/
gicd_get_igroupr(uintptr_t base,unsigned int id)248 unsigned int gicd_get_igroupr(uintptr_t base, unsigned int id)
249 {
250 unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
251 unsigned int reg_val = gicd_read_igroupr(base, id);
252
253 return (reg_val >> bit_num) & 0x1U;
254 }
255
gicd_set_igroupr(uintptr_t base,unsigned int id)256 void gicd_set_igroupr(uintptr_t base, unsigned int id)
257 {
258 unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
259 unsigned int reg_val = gicd_read_igroupr(base, id);
260
261 gicd_write_igroupr(base, id, reg_val | (1U << bit_num));
262 }
263
gicd_clr_igroupr(uintptr_t base,unsigned int id)264 void gicd_clr_igroupr(uintptr_t base, unsigned int id)
265 {
266 unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
267 unsigned int reg_val = gicd_read_igroupr(base, id);
268
269 gicd_write_igroupr(base, id, reg_val & ~(1U << bit_num));
270 }
271
gicd_set_isenabler(uintptr_t base,unsigned int id)272 void gicd_set_isenabler(uintptr_t base, unsigned int id)
273 {
274 unsigned int bit_num = id & ((1U << ISENABLER_SHIFT) - 1U);
275
276 gicd_write_isenabler(base, id, (1U << bit_num));
277 }
278
gicd_set_icenabler(uintptr_t base,unsigned int id)279 void gicd_set_icenabler(uintptr_t base, unsigned int id)
280 {
281 unsigned int bit_num = id & ((1U << ICENABLER_SHIFT) - 1U);
282
283 gicd_write_icenabler(base, id, (1U << bit_num));
284 }
285
gicd_set_ispendr(uintptr_t base,unsigned int id)286 void gicd_set_ispendr(uintptr_t base, unsigned int id)
287 {
288 unsigned int bit_num = id & ((1U << ISPENDR_SHIFT) - 1U);
289
290 gicd_write_ispendr(base, id, (1U << bit_num));
291 }
292
gicd_set_icpendr(uintptr_t base,unsigned int id)293 void gicd_set_icpendr(uintptr_t base, unsigned int id)
294 {
295 unsigned int bit_num = id & ((1U << ICPENDR_SHIFT) - 1U);
296
297 gicd_write_icpendr(base, id, (1U << bit_num));
298 }
299
gicd_get_isactiver(uintptr_t base,unsigned int id)300 unsigned int gicd_get_isactiver(uintptr_t base, unsigned int id)
301 {
302 unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U);
303 unsigned int reg_val = gicd_read_isactiver(base, id);
304
305 return (reg_val >> bit_num) & 0x1U;
306 }
307
gicd_set_isactiver(uintptr_t base,unsigned int id)308 void gicd_set_isactiver(uintptr_t base, unsigned int id)
309 {
310 unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U);
311
312 gicd_write_isactiver(base, id, (1U << bit_num));
313 }
314
gicd_set_icactiver(uintptr_t base,unsigned int id)315 void gicd_set_icactiver(uintptr_t base, unsigned int id)
316 {
317 unsigned int bit_num = id & ((1U << ICACTIVER_SHIFT) - 1U);
318
319 gicd_write_icactiver(base, id, (1U << bit_num));
320 }
321
gicd_set_ipriorityr(uintptr_t base,unsigned int id,unsigned int pri)322 void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri)
323 {
324 uint8_t val = pri & GIC_PRI_MASK;
325
326 mmio_write_8(base + GICD_IPRIORITYR + id, val);
327 }
328
gicd_set_icfgr(uintptr_t base,unsigned int id,unsigned int cfg)329 void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg)
330 {
331 /* Interrupt configuration is a 2-bit field */
332 unsigned int bit_num = id & ((1U << ICFGR_SHIFT) - 1U);
333 unsigned int bit_shift = bit_num << 1;
334
335 uint32_t reg_val = gicd_read_icfgr(base, id);
336
337 /* Clear the field, and insert required configuration */
338 reg_val &= ~(GIC_CFG_MASK << bit_shift);
339 reg_val |= ((cfg & GIC_CFG_MASK) << bit_shift);
340
341 gicd_write_icfgr(base, id, reg_val);
342 }
343