xref: /rk3399_ARM-atf/drivers/arm/gic/common/gic_common.c (revision 8828b1a9e0014ecb9e4228adc18ae7db563ac819)
1df373737SAchin Gupta /*
2*1322dc94SAlexei Fedorov  * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
3df373737SAchin Gupta  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5df373737SAchin Gupta  */
6df373737SAchin Gupta 
7*1322dc94SAlexei Fedorov #pragma message __FILE__ " is deprecated, use gicv2.mk instead"
8*1322dc94SAlexei Fedorov 
9df373737SAchin Gupta #include <assert.h>
1009d40e0eSAntonio Nino Diaz 
1109d40e0eSAntonio Nino Diaz #include <drivers/arm/gic_common.h>
1209d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
1309d40e0eSAntonio Nino Diaz 
14e9ec3cecSSoby Mathew #include "gic_common_private.h"
15df373737SAchin Gupta 
16df373737SAchin Gupta /*******************************************************************************
17df373737SAchin Gupta  * GIC Distributor interface accessors for reading entire registers
18df373737SAchin Gupta  ******************************************************************************/
19df373737SAchin Gupta /*
20df373737SAchin Gupta  * Accessor to read the GIC Distributor IGROUPR corresponding to the interrupt
21df373737SAchin Gupta  * `id`, 32 interrupt ids at a time.
22df373737SAchin Gupta  */
gicd_read_igroupr(uintptr_t base,unsigned int id)23df373737SAchin Gupta unsigned int gicd_read_igroupr(uintptr_t base, unsigned int id)
24df373737SAchin Gupta {
253fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> IGROUPR_SHIFT;
263fea9c8bSAntonio Nino Diaz 
27df373737SAchin Gupta 	return mmio_read_32(base + GICD_IGROUPR + (n << 2));
28df373737SAchin Gupta }
29df373737SAchin Gupta 
30df373737SAchin Gupta /*
31df373737SAchin Gupta  * Accessor to read the GIC Distributor ISENABLER corresponding to the
32df373737SAchin Gupta  * interrupt `id`, 32 interrupt ids at a time.
33df373737SAchin Gupta  */
gicd_read_isenabler(uintptr_t base,unsigned int id)34df373737SAchin Gupta unsigned int gicd_read_isenabler(uintptr_t base, unsigned int id)
35df373737SAchin Gupta {
363fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISENABLER_SHIFT;
373fea9c8bSAntonio Nino Diaz 
38df373737SAchin Gupta 	return mmio_read_32(base + GICD_ISENABLER + (n << 2));
39df373737SAchin Gupta }
40df373737SAchin Gupta 
41df373737SAchin Gupta /*
42df373737SAchin Gupta  * Accessor to read the GIC Distributor ICENABLER corresponding to the
43df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
44df373737SAchin Gupta  */
gicd_read_icenabler(uintptr_t base,unsigned int id)45df373737SAchin Gupta unsigned int gicd_read_icenabler(uintptr_t base, unsigned int id)
46df373737SAchin Gupta {
473fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICENABLER_SHIFT;
483fea9c8bSAntonio Nino Diaz 
49df373737SAchin Gupta 	return mmio_read_32(base + GICD_ICENABLER + (n << 2));
50df373737SAchin Gupta }
51df373737SAchin Gupta 
52df373737SAchin Gupta /*
53df373737SAchin Gupta  * Accessor to read the GIC Distributor ISPENDR corresponding to the
54df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
55df373737SAchin Gupta  */
gicd_read_ispendr(uintptr_t base,unsigned int id)56df373737SAchin Gupta unsigned int gicd_read_ispendr(uintptr_t base, unsigned int id)
57df373737SAchin Gupta {
583fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISPENDR_SHIFT;
593fea9c8bSAntonio Nino Diaz 
60df373737SAchin Gupta 	return mmio_read_32(base + GICD_ISPENDR + (n << 2));
61df373737SAchin Gupta }
62df373737SAchin Gupta 
63df373737SAchin Gupta /*
64df373737SAchin Gupta  * Accessor to read the GIC Distributor ICPENDR corresponding to the
65df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
66df373737SAchin Gupta  */
gicd_read_icpendr(uintptr_t base,unsigned int id)67df373737SAchin Gupta unsigned int gicd_read_icpendr(uintptr_t base, unsigned int id)
68df373737SAchin Gupta {
693fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICPENDR_SHIFT;
703fea9c8bSAntonio Nino Diaz 
71df373737SAchin Gupta 	return mmio_read_32(base + GICD_ICPENDR + (n << 2));
72df373737SAchin Gupta }
73df373737SAchin Gupta 
74df373737SAchin Gupta /*
75df373737SAchin Gupta  * Accessor to read the GIC Distributor ISACTIVER corresponding to the
76df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
77df373737SAchin Gupta  */
gicd_read_isactiver(uintptr_t base,unsigned int id)78df373737SAchin Gupta unsigned int gicd_read_isactiver(uintptr_t base, unsigned int id)
79df373737SAchin Gupta {
803fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISACTIVER_SHIFT;
813fea9c8bSAntonio Nino Diaz 
82df373737SAchin Gupta 	return mmio_read_32(base + GICD_ISACTIVER + (n << 2));
83df373737SAchin Gupta }
84df373737SAchin Gupta 
85df373737SAchin Gupta /*
86df373737SAchin Gupta  * Accessor to read the GIC Distributor ICACTIVER corresponding to the
87df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
88df373737SAchin Gupta  */
gicd_read_icactiver(uintptr_t base,unsigned int id)89df373737SAchin Gupta unsigned int gicd_read_icactiver(uintptr_t base, unsigned int id)
90df373737SAchin Gupta {
913fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICACTIVER_SHIFT;
923fea9c8bSAntonio Nino Diaz 
93df373737SAchin Gupta 	return mmio_read_32(base + GICD_ICACTIVER + (n << 2));
94df373737SAchin Gupta }
95df373737SAchin Gupta 
96df373737SAchin Gupta /*
97df373737SAchin Gupta  * Accessor to read the GIC Distributor IPRIORITYR corresponding to the
98df373737SAchin Gupta  * interrupt `id`, 4 interrupt IDs at a time.
99df373737SAchin Gupta  */
gicd_read_ipriorityr(uintptr_t base,unsigned int id)100df373737SAchin Gupta unsigned int gicd_read_ipriorityr(uintptr_t base, unsigned int id)
101df373737SAchin Gupta {
1023fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> IPRIORITYR_SHIFT;
1033fea9c8bSAntonio Nino Diaz 
104df373737SAchin Gupta 	return mmio_read_32(base + GICD_IPRIORITYR + (n << 2));
105df373737SAchin Gupta }
106df373737SAchin Gupta 
107df373737SAchin Gupta /*
108df373737SAchin Gupta  * Accessor to read the GIC Distributor ICGFR corresponding to the
109df373737SAchin Gupta  * interrupt `id`, 16 interrupt IDs at a time.
110df373737SAchin Gupta  */
gicd_read_icfgr(uintptr_t base,unsigned int id)111df373737SAchin Gupta unsigned int gicd_read_icfgr(uintptr_t base, unsigned int id)
112df373737SAchin Gupta {
1133fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICFGR_SHIFT;
1143fea9c8bSAntonio Nino Diaz 
115df373737SAchin Gupta 	return mmio_read_32(base + GICD_ICFGR + (n << 2));
116df373737SAchin Gupta }
117df373737SAchin Gupta 
118df373737SAchin Gupta /*
119df373737SAchin Gupta  * Accessor to read the GIC Distributor NSACR corresponding to the
120df373737SAchin Gupta  * interrupt `id`, 16 interrupt IDs at a time.
121df373737SAchin Gupta  */
gicd_read_nsacr(uintptr_t base,unsigned int id)122df373737SAchin Gupta unsigned int gicd_read_nsacr(uintptr_t base, unsigned int id)
123df373737SAchin Gupta {
1243fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> NSACR_SHIFT;
1253fea9c8bSAntonio Nino Diaz 
126df373737SAchin Gupta 	return mmio_read_32(base + GICD_NSACR + (n << 2));
127df373737SAchin Gupta }
128df373737SAchin Gupta 
129df373737SAchin Gupta /*******************************************************************************
130df373737SAchin Gupta  * GIC Distributor interface accessors for writing entire registers
131df373737SAchin Gupta  ******************************************************************************/
132df373737SAchin Gupta /*
133df373737SAchin Gupta  * Accessor to write the GIC Distributor IGROUPR corresponding to the
134df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
135df373737SAchin Gupta  */
gicd_write_igroupr(uintptr_t base,unsigned int id,unsigned int val)136df373737SAchin Gupta void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val)
137df373737SAchin Gupta {
1383fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> IGROUPR_SHIFT;
1393fea9c8bSAntonio Nino Diaz 
140df373737SAchin Gupta 	mmio_write_32(base + GICD_IGROUPR + (n << 2), val);
141df373737SAchin Gupta }
142df373737SAchin Gupta 
143df373737SAchin Gupta /*
144df373737SAchin Gupta  * Accessor to write the GIC Distributor ISENABLER corresponding to the
145df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
146df373737SAchin Gupta  */
gicd_write_isenabler(uintptr_t base,unsigned int id,unsigned int val)147df373737SAchin Gupta void gicd_write_isenabler(uintptr_t base, unsigned int id, unsigned int val)
148df373737SAchin Gupta {
1493fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISENABLER_SHIFT;
1503fea9c8bSAntonio Nino Diaz 
151df373737SAchin Gupta 	mmio_write_32(base + GICD_ISENABLER + (n << 2), val);
152df373737SAchin Gupta }
153df373737SAchin Gupta 
154df373737SAchin Gupta /*
155df373737SAchin Gupta  * Accessor to write the GIC Distributor ICENABLER corresponding to the
156df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
157df373737SAchin Gupta  */
gicd_write_icenabler(uintptr_t base,unsigned int id,unsigned int val)158df373737SAchin Gupta void gicd_write_icenabler(uintptr_t base, unsigned int id, unsigned int val)
159df373737SAchin Gupta {
1603fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICENABLER_SHIFT;
1613fea9c8bSAntonio Nino Diaz 
162df373737SAchin Gupta 	mmio_write_32(base + GICD_ICENABLER + (n << 2), val);
163df373737SAchin Gupta }
164df373737SAchin Gupta 
165df373737SAchin Gupta /*
166df373737SAchin Gupta  * Accessor to write the GIC Distributor ISPENDR corresponding to the
167df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
168df373737SAchin Gupta  */
gicd_write_ispendr(uintptr_t base,unsigned int id,unsigned int val)169df373737SAchin Gupta void gicd_write_ispendr(uintptr_t base, unsigned int id, unsigned int val)
170df373737SAchin Gupta {
1713fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISPENDR_SHIFT;
1723fea9c8bSAntonio Nino Diaz 
173df373737SAchin Gupta 	mmio_write_32(base + GICD_ISPENDR + (n << 2), val);
174df373737SAchin Gupta }
175df373737SAchin Gupta 
176df373737SAchin Gupta /*
177df373737SAchin Gupta  * Accessor to write the GIC Distributor ICPENDR corresponding to the
178df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
179df373737SAchin Gupta  */
gicd_write_icpendr(uintptr_t base,unsigned int id,unsigned int val)180df373737SAchin Gupta void gicd_write_icpendr(uintptr_t base, unsigned int id, unsigned int val)
181df373737SAchin Gupta {
1823fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICPENDR_SHIFT;
1833fea9c8bSAntonio Nino Diaz 
184df373737SAchin Gupta 	mmio_write_32(base + GICD_ICPENDR + (n << 2), val);
185df373737SAchin Gupta }
186df373737SAchin Gupta 
187df373737SAchin Gupta /*
188df373737SAchin Gupta  * Accessor to write the GIC Distributor ISACTIVER corresponding to the
189df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
190df373737SAchin Gupta  */
gicd_write_isactiver(uintptr_t base,unsigned int id,unsigned int val)191df373737SAchin Gupta void gicd_write_isactiver(uintptr_t base, unsigned int id, unsigned int val)
192df373737SAchin Gupta {
1933fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ISACTIVER_SHIFT;
1943fea9c8bSAntonio Nino Diaz 
195df373737SAchin Gupta 	mmio_write_32(base + GICD_ISACTIVER + (n << 2), val);
196df373737SAchin Gupta }
197df373737SAchin Gupta 
198df373737SAchin Gupta /*
199df373737SAchin Gupta  * Accessor to write the GIC Distributor ICACTIVER corresponding to the
200df373737SAchin Gupta  * interrupt `id`, 32 interrupt IDs at a time.
201df373737SAchin Gupta  */
gicd_write_icactiver(uintptr_t base,unsigned int id,unsigned int val)202df373737SAchin Gupta void gicd_write_icactiver(uintptr_t base, unsigned int id, unsigned int val)
203df373737SAchin Gupta {
2043fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICACTIVER_SHIFT;
2053fea9c8bSAntonio Nino Diaz 
206df373737SAchin Gupta 	mmio_write_32(base + GICD_ICACTIVER + (n << 2), val);
207df373737SAchin Gupta }
208df373737SAchin Gupta 
209df373737SAchin Gupta /*
210df373737SAchin Gupta  * Accessor to write the GIC Distributor IPRIORITYR corresponding to the
211df373737SAchin Gupta  * interrupt `id`, 4 interrupt IDs at a time.
212df373737SAchin Gupta  */
gicd_write_ipriorityr(uintptr_t base,unsigned int id,unsigned int val)213df373737SAchin Gupta void gicd_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val)
214df373737SAchin Gupta {
2153fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> IPRIORITYR_SHIFT;
2163fea9c8bSAntonio Nino Diaz 
217df373737SAchin Gupta 	mmio_write_32(base + GICD_IPRIORITYR + (n << 2), val);
218df373737SAchin Gupta }
219df373737SAchin Gupta 
220df373737SAchin Gupta /*
221df373737SAchin Gupta  * Accessor to write the GIC Distributor ICFGR corresponding to the
222df373737SAchin Gupta  * interrupt `id`, 16 interrupt IDs at a time.
223df373737SAchin Gupta  */
gicd_write_icfgr(uintptr_t base,unsigned int id,unsigned int val)224df373737SAchin Gupta void gicd_write_icfgr(uintptr_t base, unsigned int id, unsigned int val)
225df373737SAchin Gupta {
2263fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> ICFGR_SHIFT;
2273fea9c8bSAntonio Nino Diaz 
228df373737SAchin Gupta 	mmio_write_32(base + GICD_ICFGR + (n << 2), val);
229df373737SAchin Gupta }
230df373737SAchin Gupta 
231df373737SAchin Gupta /*
232df373737SAchin Gupta  * Accessor to write the GIC Distributor NSACR corresponding to the
233df373737SAchin Gupta  * interrupt `id`, 16 interrupt IDs at a time.
234df373737SAchin Gupta  */
gicd_write_nsacr(uintptr_t base,unsigned int id,unsigned int val)235df373737SAchin Gupta void gicd_write_nsacr(uintptr_t base, unsigned int id, unsigned int val)
236df373737SAchin Gupta {
2373fea9c8bSAntonio Nino Diaz 	unsigned int n = id >> NSACR_SHIFT;
2383fea9c8bSAntonio Nino Diaz 
239df373737SAchin Gupta 	mmio_write_32(base + GICD_NSACR + (n << 2), val);
240df373737SAchin Gupta }
241df373737SAchin Gupta 
242df373737SAchin Gupta /*******************************************************************************
243e9ec3cecSSoby Mathew  * GIC Distributor functions for accessing the GIC registers
244e9ec3cecSSoby Mathew  * corresponding to a single interrupt ID. These functions use bitwise
245e9ec3cecSSoby Mathew  * operations or appropriate register accesses to modify or return
246e9ec3cecSSoby Mathew  * the bit-field corresponding the single interrupt ID.
247df373737SAchin Gupta  ******************************************************************************/
gicd_get_igroupr(uintptr_t base,unsigned int id)248df373737SAchin Gupta unsigned int gicd_get_igroupr(uintptr_t base, unsigned int id)
249df373737SAchin Gupta {
2503fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
251df373737SAchin Gupta 	unsigned int reg_val = gicd_read_igroupr(base, id);
252df373737SAchin Gupta 
2533fea9c8bSAntonio Nino Diaz 	return (reg_val >> bit_num) & 0x1U;
254df373737SAchin Gupta }
255df373737SAchin Gupta 
gicd_set_igroupr(uintptr_t base,unsigned int id)256df373737SAchin Gupta void gicd_set_igroupr(uintptr_t base, unsigned int id)
257df373737SAchin Gupta {
2583fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
259df373737SAchin Gupta 	unsigned int reg_val = gicd_read_igroupr(base, id);
260df373737SAchin Gupta 
2613fea9c8bSAntonio Nino Diaz 	gicd_write_igroupr(base, id, reg_val | (1U << bit_num));
262df373737SAchin Gupta }
263df373737SAchin Gupta 
gicd_clr_igroupr(uintptr_t base,unsigned int id)264df373737SAchin Gupta void gicd_clr_igroupr(uintptr_t base, unsigned int id)
265df373737SAchin Gupta {
2663fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U);
267df373737SAchin Gupta 	unsigned int reg_val = gicd_read_igroupr(base, id);
268df373737SAchin Gupta 
2693fea9c8bSAntonio Nino Diaz 	gicd_write_igroupr(base, id, reg_val & ~(1U << bit_num));
270df373737SAchin Gupta }
271df373737SAchin Gupta 
gicd_set_isenabler(uintptr_t base,unsigned int id)272df373737SAchin Gupta void gicd_set_isenabler(uintptr_t base, unsigned int id)
273df373737SAchin Gupta {
2743fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ISENABLER_SHIFT) - 1U);
275df373737SAchin Gupta 
2763fea9c8bSAntonio Nino Diaz 	gicd_write_isenabler(base, id, (1U << bit_num));
277df373737SAchin Gupta }
278df373737SAchin Gupta 
gicd_set_icenabler(uintptr_t base,unsigned int id)279df373737SAchin Gupta void gicd_set_icenabler(uintptr_t base, unsigned int id)
280df373737SAchin Gupta {
2813fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ICENABLER_SHIFT) - 1U);
282df373737SAchin Gupta 
2833fea9c8bSAntonio Nino Diaz 	gicd_write_icenabler(base, id, (1U << bit_num));
284df373737SAchin Gupta }
285df373737SAchin Gupta 
gicd_set_ispendr(uintptr_t base,unsigned int id)286df373737SAchin Gupta void gicd_set_ispendr(uintptr_t base, unsigned int id)
287df373737SAchin Gupta {
2883fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ISPENDR_SHIFT) - 1U);
289df373737SAchin Gupta 
2903fea9c8bSAntonio Nino Diaz 	gicd_write_ispendr(base, id, (1U << bit_num));
291df373737SAchin Gupta }
292df373737SAchin Gupta 
gicd_set_icpendr(uintptr_t base,unsigned int id)293df373737SAchin Gupta void gicd_set_icpendr(uintptr_t base, unsigned int id)
294df373737SAchin Gupta {
2953fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ICPENDR_SHIFT) - 1U);
296df373737SAchin Gupta 
2973fea9c8bSAntonio Nino Diaz 	gicd_write_icpendr(base, id, (1U << bit_num));
298df373737SAchin Gupta }
299df373737SAchin Gupta 
gicd_get_isactiver(uintptr_t base,unsigned int id)300cbd3f370SJeenu Viswambharan unsigned int gicd_get_isactiver(uintptr_t base, unsigned int id)
301cbd3f370SJeenu Viswambharan {
3023fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U);
303cbd3f370SJeenu Viswambharan 	unsigned int reg_val = gicd_read_isactiver(base, id);
304cbd3f370SJeenu Viswambharan 
3053fea9c8bSAntonio Nino Diaz 	return (reg_val >> bit_num) & 0x1U;
306cbd3f370SJeenu Viswambharan }
307cbd3f370SJeenu Viswambharan 
gicd_set_isactiver(uintptr_t base,unsigned int id)308df373737SAchin Gupta void gicd_set_isactiver(uintptr_t base, unsigned int id)
309df373737SAchin Gupta {
3103fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U);
311df373737SAchin Gupta 
3123fea9c8bSAntonio Nino Diaz 	gicd_write_isactiver(base, id, (1U << bit_num));
313df373737SAchin Gupta }
314df373737SAchin Gupta 
gicd_set_icactiver(uintptr_t base,unsigned int id)315df373737SAchin Gupta void gicd_set_icactiver(uintptr_t base, unsigned int id)
316df373737SAchin Gupta {
3173fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ICACTIVER_SHIFT) - 1U);
318df373737SAchin Gupta 
3193fea9c8bSAntonio Nino Diaz 	gicd_write_icactiver(base, id, (1U << bit_num));
320df373737SAchin Gupta }
32138a78614SSoby Mathew 
gicd_set_ipriorityr(uintptr_t base,unsigned int id,unsigned int pri)32238a78614SSoby Mathew void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri)
32338a78614SSoby Mathew {
3243fea9c8bSAntonio Nino Diaz 	uint8_t val = pri & GIC_PRI_MASK;
3253fea9c8bSAntonio Nino Diaz 
3263fea9c8bSAntonio Nino Diaz 	mmio_write_8(base + GICD_IPRIORITYR + id, val);
32738a78614SSoby Mathew }
32822966106SJeenu Viswambharan 
gicd_set_icfgr(uintptr_t base,unsigned int id,unsigned int cfg)32922966106SJeenu Viswambharan void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg)
33022966106SJeenu Viswambharan {
33117e84eedSJeenu Viswambharan 	/* Interrupt configuration is a 2-bit field */
3323fea9c8bSAntonio Nino Diaz 	unsigned int bit_num = id & ((1U << ICFGR_SHIFT) - 1U);
33317e84eedSJeenu Viswambharan 	unsigned int bit_shift = bit_num << 1;
33417e84eedSJeenu Viswambharan 
33522966106SJeenu Viswambharan 	uint32_t reg_val = gicd_read_icfgr(base, id);
33622966106SJeenu Viswambharan 
33722966106SJeenu Viswambharan 	/* Clear the field, and insert required configuration */
33817e84eedSJeenu Viswambharan 	reg_val &= ~(GIC_CFG_MASK << bit_shift);
33917e84eedSJeenu Viswambharan 	reg_val |= ((cfg & GIC_CFG_MASK) << bit_shift);
34022966106SJeenu Viswambharan 
34122966106SJeenu Viswambharan 	gicd_write_icfgr(base, id, reg_val);
34222966106SJeenu Viswambharan }
343