589de5da40b50e89914dfee6a2f4ca38ababf596
2 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
8 #include <gic_common.h>
10 #include "gic_common_private.h"
12 /*******************************************************************************
13 * GIC Distributor interface accessors for reading entire registers
14 ******************************************************************************/
16 * Accessor to read the GIC Distributor IGROUPR corresponding to the interrupt
17 * `id`, 32 interrupt ids at a time.
19 unsigned int gicd_read_igroupr(uintptr_t base
, unsigned int id
)
21 unsigned int n
= id
>> IGROUPR_SHIFT
;
23 return mmio_read_32(base
+ GICD_IGROUPR
+ (n
<< 2));
27 * Accessor to read the GIC Distributor ISENABLER corresponding to the
28 * interrupt `id`, 32 interrupt ids at a time.
30 unsigned int gicd_read_isenabler(uintptr_t base
, unsigned int id
)
32 unsigned int n
= id
>> ISENABLER_SHIFT
;
34 return mmio_read_32(base
+ GICD_ISENABLER
+ (n
<< 2));
38 * Accessor to read the GIC Distributor ICENABLER corresponding to the
39 * interrupt `id`, 32 interrupt IDs at a time.
41 unsigned int gicd_read_icenabler(uintptr_t base
, unsigned int id
)
43 unsigned int n
= id
>> ICENABLER_SHIFT
;
45 return mmio_read_32(base
+ GICD_ICENABLER
+ (n
<< 2));
49 * Accessor to read the GIC Distributor ISPENDR corresponding to the
50 * interrupt `id`, 32 interrupt IDs at a time.
52 unsigned int gicd_read_ispendr(uintptr_t base
, unsigned int id
)
54 unsigned int n
= id
>> ISPENDR_SHIFT
;
56 return mmio_read_32(base
+ GICD_ISPENDR
+ (n
<< 2));
60 * Accessor to read the GIC Distributor ICPENDR corresponding to the
61 * interrupt `id`, 32 interrupt IDs at a time.
63 unsigned int gicd_read_icpendr(uintptr_t base
, unsigned int id
)
65 unsigned int n
= id
>> ICPENDR_SHIFT
;
67 return mmio_read_32(base
+ GICD_ICPENDR
+ (n
<< 2));
71 * Accessor to read the GIC Distributor ISACTIVER corresponding to the
72 * interrupt `id`, 32 interrupt IDs at a time.
74 unsigned int gicd_read_isactiver(uintptr_t base
, unsigned int id
)
76 unsigned int n
= id
>> ISACTIVER_SHIFT
;
78 return mmio_read_32(base
+ GICD_ISACTIVER
+ (n
<< 2));
82 * Accessor to read the GIC Distributor ICACTIVER corresponding to the
83 * interrupt `id`, 32 interrupt IDs at a time.
85 unsigned int gicd_read_icactiver(uintptr_t base
, unsigned int id
)
87 unsigned int n
= id
>> ICACTIVER_SHIFT
;
89 return mmio_read_32(base
+ GICD_ICACTIVER
+ (n
<< 2));
93 * Accessor to read the GIC Distributor IPRIORITYR corresponding to the
94 * interrupt `id`, 4 interrupt IDs at a time.
96 unsigned int gicd_read_ipriorityr(uintptr_t base
, unsigned int id
)
98 unsigned int n
= id
>> IPRIORITYR_SHIFT
;
100 return mmio_read_32(base
+ GICD_IPRIORITYR
+ (n
<< 2));
104 * Accessor to read the GIC Distributor ICGFR corresponding to the
105 * interrupt `id`, 16 interrupt IDs at a time.
107 unsigned int gicd_read_icfgr(uintptr_t base
, unsigned int id
)
109 unsigned int n
= id
>> ICFGR_SHIFT
;
111 return mmio_read_32(base
+ GICD_ICFGR
+ (n
<< 2));
115 * Accessor to read the GIC Distributor NSACR corresponding to the
116 * interrupt `id`, 16 interrupt IDs at a time.
118 unsigned int gicd_read_nsacr(uintptr_t base
, unsigned int id
)
120 unsigned int n
= id
>> NSACR_SHIFT
;
122 return mmio_read_32(base
+ GICD_NSACR
+ (n
<< 2));
125 /*******************************************************************************
126 * GIC Distributor interface accessors for writing entire registers
127 ******************************************************************************/
129 * Accessor to write the GIC Distributor IGROUPR corresponding to the
130 * interrupt `id`, 32 interrupt IDs at a time.
132 void gicd_write_igroupr(uintptr_t base
, unsigned int id
, unsigned int val
)
134 unsigned int n
= id
>> IGROUPR_SHIFT
;
136 mmio_write_32(base
+ GICD_IGROUPR
+ (n
<< 2), val
);
140 * Accessor to write the GIC Distributor ISENABLER corresponding to the
141 * interrupt `id`, 32 interrupt IDs at a time.
143 void gicd_write_isenabler(uintptr_t base
, unsigned int id
, unsigned int val
)
145 unsigned int n
= id
>> ISENABLER_SHIFT
;
147 mmio_write_32(base
+ GICD_ISENABLER
+ (n
<< 2), val
);
151 * Accessor to write the GIC Distributor ICENABLER corresponding to the
152 * interrupt `id`, 32 interrupt IDs at a time.
154 void gicd_write_icenabler(uintptr_t base
, unsigned int id
, unsigned int val
)
156 unsigned int n
= id
>> ICENABLER_SHIFT
;
158 mmio_write_32(base
+ GICD_ICENABLER
+ (n
<< 2), val
);
162 * Accessor to write the GIC Distributor ISPENDR corresponding to the
163 * interrupt `id`, 32 interrupt IDs at a time.
165 void gicd_write_ispendr(uintptr_t base
, unsigned int id
, unsigned int val
)
167 unsigned int n
= id
>> ISPENDR_SHIFT
;
169 mmio_write_32(base
+ GICD_ISPENDR
+ (n
<< 2), val
);
173 * Accessor to write the GIC Distributor ICPENDR corresponding to the
174 * interrupt `id`, 32 interrupt IDs at a time.
176 void gicd_write_icpendr(uintptr_t base
, unsigned int id
, unsigned int val
)
178 unsigned int n
= id
>> ICPENDR_SHIFT
;
180 mmio_write_32(base
+ GICD_ICPENDR
+ (n
<< 2), val
);
184 * Accessor to write the GIC Distributor ISACTIVER corresponding to the
185 * interrupt `id`, 32 interrupt IDs at a time.
187 void gicd_write_isactiver(uintptr_t base
, unsigned int id
, unsigned int val
)
189 unsigned int n
= id
>> ISACTIVER_SHIFT
;
191 mmio_write_32(base
+ GICD_ISACTIVER
+ (n
<< 2), val
);
195 * Accessor to write the GIC Distributor ICACTIVER corresponding to the
196 * interrupt `id`, 32 interrupt IDs at a time.
198 void gicd_write_icactiver(uintptr_t base
, unsigned int id
, unsigned int val
)
200 unsigned int n
= id
>> ICACTIVER_SHIFT
;
202 mmio_write_32(base
+ GICD_ICACTIVER
+ (n
<< 2), val
);
206 * Accessor to write the GIC Distributor IPRIORITYR corresponding to the
207 * interrupt `id`, 4 interrupt IDs at a time.
209 void gicd_write_ipriorityr(uintptr_t base
, unsigned int id
, unsigned int val
)
211 unsigned int n
= id
>> IPRIORITYR_SHIFT
;
213 mmio_write_32(base
+ GICD_IPRIORITYR
+ (n
<< 2), val
);
217 * Accessor to write the GIC Distributor ICFGR corresponding to the
218 * interrupt `id`, 16 interrupt IDs at a time.
220 void gicd_write_icfgr(uintptr_t base
, unsigned int id
, unsigned int val
)
222 unsigned int n
= id
>> ICFGR_SHIFT
;
224 mmio_write_32(base
+ GICD_ICFGR
+ (n
<< 2), val
);
228 * Accessor to write the GIC Distributor NSACR corresponding to the
229 * interrupt `id`, 16 interrupt IDs at a time.
231 void gicd_write_nsacr(uintptr_t base
, unsigned int id
, unsigned int val
)
233 unsigned int n
= id
>> NSACR_SHIFT
;
235 mmio_write_32(base
+ GICD_NSACR
+ (n
<< 2), val
);
238 /*******************************************************************************
239 * GIC Distributor functions for accessing the GIC registers
240 * corresponding to a single interrupt ID. These functions use bitwise
241 * operations or appropriate register accesses to modify or return
242 * the bit-field corresponding the single interrupt ID.
243 ******************************************************************************/
244 unsigned int gicd_get_igroupr(uintptr_t base
, unsigned int id
)
246 unsigned int bit_num
= id
& ((1U << IGROUPR_SHIFT
) - 1U);
247 unsigned int reg_val
= gicd_read_igroupr(base
, id
);
249 return (reg_val
>> bit_num
) & 0x1U
;
252 void gicd_set_igroupr(uintptr_t base
, unsigned int id
)
254 unsigned int bit_num
= id
& ((1U << IGROUPR_SHIFT
) - 1U);
255 unsigned int reg_val
= gicd_read_igroupr(base
, id
);
257 gicd_write_igroupr(base
, id
, reg_val
| (1U << bit_num
));
260 void gicd_clr_igroupr(uintptr_t base
, unsigned int id
)
262 unsigned int bit_num
= id
& ((1U << IGROUPR_SHIFT
) - 1U);
263 unsigned int reg_val
= gicd_read_igroupr(base
, id
);
265 gicd_write_igroupr(base
, id
, reg_val
& ~(1U << bit_num
));
268 void gicd_set_isenabler(uintptr_t base
, unsigned int id
)
270 unsigned int bit_num
= id
& ((1U << ISENABLER_SHIFT
) - 1U);
272 gicd_write_isenabler(base
, id
, (1U << bit_num
));
275 void gicd_set_icenabler(uintptr_t base
, unsigned int id
)
277 unsigned int bit_num
= id
& ((1U << ICENABLER_SHIFT
) - 1U);
279 gicd_write_icenabler(base
, id
, (1U << bit_num
));
282 void gicd_set_ispendr(uintptr_t base
, unsigned int id
)
284 unsigned int bit_num
= id
& ((1U << ISPENDR_SHIFT
) - 1U);
286 gicd_write_ispendr(base
, id
, (1U << bit_num
));
289 void gicd_set_icpendr(uintptr_t base
, unsigned int id
)
291 unsigned int bit_num
= id
& ((1U << ICPENDR_SHIFT
) - 1U);
293 gicd_write_icpendr(base
, id
, (1U << bit_num
));
296 unsigned int gicd_get_isactiver(uintptr_t base
, unsigned int id
)
298 unsigned int bit_num
= id
& ((1U << ISACTIVER_SHIFT
) - 1U);
299 unsigned int reg_val
= gicd_read_isactiver(base
, id
);
301 return (reg_val
>> bit_num
) & 0x1U
;
304 void gicd_set_isactiver(uintptr_t base
, unsigned int id
)
306 unsigned int bit_num
= id
& ((1U << ISACTIVER_SHIFT
) - 1U);
308 gicd_write_isactiver(base
, id
, (1U << bit_num
));
311 void gicd_set_icactiver(uintptr_t base
, unsigned int id
)
313 unsigned int bit_num
= id
& ((1U << ICACTIVER_SHIFT
) - 1U);
315 gicd_write_icactiver(base
, id
, (1U << bit_num
));
318 void gicd_set_ipriorityr(uintptr_t base
, unsigned int id
, unsigned int pri
)
320 uint8_t val
= pri
& GIC_PRI_MASK
;
322 mmio_write_8(base
+ GICD_IPRIORITYR
+ id
, val
);
325 void gicd_set_icfgr(uintptr_t base
, unsigned int id
, unsigned int cfg
)
327 /* Interrupt configuration is a 2-bit field */
328 unsigned int bit_num
= id
& ((1U << ICFGR_SHIFT
) - 1U);
329 unsigned int bit_shift
= bit_num
<< 1;
331 uint32_t reg_val
= gicd_read_icfgr(base
, id
);
333 /* Clear the field, and insert required configuration */
334 reg_val
&= ~(GIC_CFG_MASK
<< bit_shift
);
335 reg_val
|= ((cfg
& GIC_CFG_MASK
) << bit_shift
);
337 gicd_write_icfgr(base
, id
, reg_val
);