gicv3.h 18.6 KB
Newer Older
1
/*
2
 * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
8
#ifndef GICV3_H
#define GICV3_H
9
10

/*******************************************************************************
11
 * GICv3 and 3.1 miscellaneous definitions
12
13
 ******************************************************************************/
/* Interrupt group definitions */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
14
15
16
#define INTR_GROUP1S		U(0)
#define INTR_GROUP0		U(1)
#define INTR_GROUP1NS		U(2)
17
18

/* Interrupt IDs reported by the HPPIR and IAR registers */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
19
20
#define PENDING_G1S_INTID	U(1020)
#define PENDING_G1NS_INTID	U(1021)
21
22

/* Constant to categorize LPI interrupt */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
23
#define MIN_LPI_ID		U(8192)
24

25
/* GICv3 can only target up to 16 PEs with SGI */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
26
#define GICV3_MAX_SGI_TARGETS	U(16)
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* PPIs INTIDs 16-31 */
#define MAX_PPI_ID		U(31)

#if GIC_EXT_INTID

/* GICv3.1 extended PPIs INTIDs 1056-1119 */
#define MIN_EPPI_ID		U(1056)
#define MAX_EPPI_ID		U(1119)

/* Total number of GICv3.1 EPPIs */
#define TOTAL_EPPI_INTR_NUM	(MAX_EPPI_ID - MIN_EPPI_ID + U(1))

/* Total number of GICv3.1 PPIs and EPPIs */
#define TOTAL_PRIVATE_INTR_NUM	(TOTAL_PCPU_INTR_NUM + TOTAL_EPPI_INTR_NUM)

/* GICv3.1 extended SPIs INTIDs 4096 - 5119 */
#define MIN_ESPI_ID		U(4096)
#define MAX_ESPI_ID		U(5119)

/* Total number of GICv3.1 ESPIs */
#define TOTAL_ESPI_INTR_NUM	(MAX_ESPI_ID - MIN_ESPI_ID + U(1))

/* Total number of GICv3.1 SPIs and ESPIs */
#define	TOTAL_SHARED_INTR_NUM	(TOTAL_SPI_INTR_NUM + TOTAL_ESPI_INTR_NUM)

/* SGIs: 0-15, PPIs: 16-31, EPPIs: 1056-1119 */
#define	IS_SGI_PPI(id)		(((id) <= MAX_PPI_ID)  || \
				(((id) >= MIN_EPPI_ID) && \
				 ((id) <= MAX_EPPI_ID)))

/* SPIs: 32-1019, ESPIs: 4096-5119 */
#define	IS_SPI(id)		((((id) >= MIN_SPI_ID)  && \
				  ((id) <= MAX_SPI_ID)) || \
				 (((id) >= MIN_ESPI_ID) && \
				  ((id) <= MAX_ESPI_ID)))
#else	/* GICv3 */

/* Total number of GICv3 PPIs */
#define TOTAL_PRIVATE_INTR_NUM	TOTAL_PCPU_INTR_NUM

/* Total number of GICv3 SPIs */
#define	TOTAL_SHARED_INTR_NUM	TOTAL_SPI_INTR_NUM

/* SGIs: 0-15, PPIs: 16-31 */
#define	IS_SGI_PPI(id)		((id) <= MAX_PPI_ID)

/* SPIs: 32-1019 */
#define	IS_SPI(id)		(((id) >= MIN_SPI_ID) && ((id) <= MAX_SPI_ID))

#endif	/* GIC_EXT_INTID */

79
/*******************************************************************************
80
 * GICv3 and 3.1 specific Distributor interface register offsets and constants
81
 ******************************************************************************/
82
#define GICD_TYPER2		U(0x0c)
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
83
84
85
86
#define GICD_STATUSR		U(0x10)
#define GICD_SETSPI_NSR		U(0x40)
#define GICD_CLRSPI_NSR		U(0x48)
#define GICD_SETSPI_SR		U(0x50)
87
#define GICD_CLRSPI_SR		U(0x58)
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
88
#define GICD_IGRPMODR		U(0xd00)
89
90
91
92
93
94
95
96
97
98
99
#define GICD_IGROUPRE		U(0x1000)
#define GICD_ISENABLERE		U(0x1200)
#define GICD_ICENABLERE		U(0x1400)
#define GICD_ISPENDRE		U(0x1600)
#define GICD_ICPENDRE		U(0x1800)
#define GICD_ISACTIVERE		U(0x1a00)
#define GICD_ICACTIVERE		U(0x1c00)
#define GICD_IPRIORITYRE	U(0x2000)
#define GICD_ICFGRE		U(0x3000)
#define GICD_IGRPMODRE		U(0x3400)
#define GICD_NSACRE		U(0x3600)
100
/*
101
102
 * GICD_IROUTER<n> register is at 0x6000 + 8n, where n is the interrupt ID
 * and n >= 32, making the effective offset as 0x6100
103
 */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
104
#define GICD_IROUTER		U(0x6000)
105
106
#define GICD_IROUTERE		U(0x8000)

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
107
#define GICD_PIDR2_GICV3	U(0xffe8)
108
109
110
111
112
113
114
115
116
117
118
119

#define IGRPMODR_SHIFT		5

/* GICD_CTLR bit definitions */
#define CTLR_ENABLE_G1NS_SHIFT		1
#define CTLR_ENABLE_G1S_SHIFT		2
#define CTLR_ARE_S_SHIFT		4
#define CTLR_ARE_NS_SHIFT		5
#define CTLR_DS_SHIFT			6
#define CTLR_E1NWF_SHIFT		7
#define GICD_CTLR_RWP_SHIFT		31

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define CTLR_ENABLE_G1NS_MASK		U(0x1)
#define CTLR_ENABLE_G1S_MASK		U(0x1)
#define CTLR_ARE_S_MASK			U(0x1)
#define CTLR_ARE_NS_MASK		U(0x1)
#define CTLR_DS_MASK			U(0x1)
#define CTLR_E1NWF_MASK			U(0x1)
#define GICD_CTLR_RWP_MASK		U(0x1)

#define CTLR_ENABLE_G1NS_BIT		BIT_32(CTLR_ENABLE_G1NS_SHIFT)
#define CTLR_ENABLE_G1S_BIT		BIT_32(CTLR_ENABLE_G1S_SHIFT)
#define CTLR_ARE_S_BIT			BIT_32(CTLR_ARE_S_SHIFT)
#define CTLR_ARE_NS_BIT			BIT_32(CTLR_ARE_NS_SHIFT)
#define CTLR_DS_BIT			BIT_32(CTLR_DS_SHIFT)
#define CTLR_E1NWF_BIT			BIT_32(CTLR_E1NWF_SHIFT)
#define GICD_CTLR_RWP_BIT		BIT_32(GICD_CTLR_RWP_SHIFT)
135
136

/* GICD_IROUTER shifts and masks */
137
#define IROUTER_SHIFT		0
138
#define IROUTER_IRM_SHIFT	31
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
139
#define IROUTER_IRM_MASK	U(0x1)
140

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
141
142
#define GICV3_IRM_PE		U(0)
#define GICV3_IRM_ANY		U(1)
143

144
145
#define NUM_OF_DIST_REGS	30

146
147
148
149
150
151
152
/* GICD_TYPER shifts and masks */
#define	TYPER_ESPI		U(1 << 8)
#define	TYPER_DVIS		U(1 << 18)
#define	TYPER_ESPI_RANGE_MASK	U(0x1f)
#define	TYPER_ESPI_RANGE_SHIFT	U(27)
#define	TYPER_ESPI_RANGE	U(TYPER_ESPI_MASK << TYPER_ESPI_SHIFT)

153
/*******************************************************************************
154
 * Common GIC Redistributor interface registers & constants
155
 ******************************************************************************/
156
157
158
#if GIC_ENABLE_V4_EXTN
#define GICR_PCPUBASE_SHIFT	0x12
#else
159
#define GICR_PCPUBASE_SHIFT	0x11
160
#endif
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
161
162
#define GICR_SGIBASE_OFFSET	U(65536)	/* 64 KB */
#define GICR_CTLR		U(0x0)
163
#define GICR_IIDR		U(0x04)
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
164
#define GICR_TYPER		U(0x08)
165
#define GICR_STATUSR		U(0x10)
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#define GICR_WAKER		U(0x14)
#define GICR_PROPBASER		U(0x70)
#define GICR_PENDBASER		U(0x78)
#define GICR_IGROUPR0		(GICR_SGIBASE_OFFSET + U(0x80))
#define GICR_ISENABLER0		(GICR_SGIBASE_OFFSET + U(0x100))
#define GICR_ICENABLER0		(GICR_SGIBASE_OFFSET + U(0x180))
#define GICR_ISPENDR0		(GICR_SGIBASE_OFFSET + U(0x200))
#define GICR_ICPENDR0		(GICR_SGIBASE_OFFSET + U(0x280))
#define GICR_ISACTIVER0		(GICR_SGIBASE_OFFSET + U(0x300))
#define GICR_ICACTIVER0		(GICR_SGIBASE_OFFSET + U(0x380))
#define GICR_IPRIORITYR		(GICR_SGIBASE_OFFSET + U(0x400))
#define GICR_ICFGR0		(GICR_SGIBASE_OFFSET + U(0xc00))
#define GICR_ICFGR1		(GICR_SGIBASE_OFFSET + U(0xc04))
#define GICR_IGRPMODR0		(GICR_SGIBASE_OFFSET + U(0xd00))
#define GICR_NSACR		(GICR_SGIBASE_OFFSET + U(0xe00))
181

182
183
184
185
186
187
188
189
190
191
#define GICR_IGROUPR		GICR_IGROUPR0
#define GICR_ISENABLER		GICR_ISENABLER0
#define GICR_ICENABLER		GICR_ICENABLER0
#define GICR_ISPENDR		GICR_ISPENDR0
#define GICR_ICPENDR		GICR_ICPENDR0
#define GICR_ISACTIVER		GICR_ISACTIVER0
#define GICR_ICACTIVER		GICR_ICACTIVER0
#define GICR_ICFGR		GICR_ICFGR0
#define GICR_IGRPMODR		GICR_IGRPMODR0

192
/* GICR_CTLR bit definitions */
193
#define GICR_CTLR_UWP_SHIFT	31
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
194
195
#define GICR_CTLR_UWP_MASK	U(0x1)
#define GICR_CTLR_UWP_BIT	BIT_32(GICR_CTLR_UWP_SHIFT)
196
#define GICR_CTLR_RWP_SHIFT	3
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
197
198
199
#define GICR_CTLR_RWP_MASK	U(0x1)
#define GICR_CTLR_RWP_BIT	BIT_32(GICR_CTLR_RWP_SHIFT)
#define GICR_CTLR_EN_LPIS_BIT	BIT_32(0)
200
201
202
203
204

/* GICR_WAKER bit definitions */
#define WAKER_CA_SHIFT		2
#define WAKER_PS_SHIFT		1

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
205
206
#define WAKER_CA_MASK		U(0x1)
#define WAKER_PS_MASK		U(0x1)
207

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
208
209
#define WAKER_CA_BIT		BIT_32(WAKER_CA_SHIFT)
#define WAKER_PS_BIT		BIT_32(WAKER_PS_SHIFT)
210
211
212
213
214
215

/* GICR_TYPER bit definitions */
#define TYPER_AFF_VAL_SHIFT	32
#define TYPER_PROC_NUM_SHIFT	8
#define TYPER_LAST_SHIFT	4

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
216
217
218
#define TYPER_AFF_VAL_MASK	U(0xffffffff)
#define TYPER_PROC_NUM_MASK	U(0xffff)
#define TYPER_LAST_MASK		U(0x1)
219

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
220
#define TYPER_LAST_BIT		BIT_32(TYPER_LAST_SHIFT)
221

222
223
#define TYPER_PPI_NUM_SHIFT	U(27)
#define TYPER_PPI_NUM_MASK	U(0x1f)
224

225
226
227
228
229
230
231
232
/* GICR_IIDR bit definitions */
#define IIDR_PRODUCT_ID_MASK	0xff000000
#define IIDR_VARIANT_MASK	0x000f0000
#define IIDR_REVISION_MASK	0x0000f000
#define IIDR_IMPLEMENTER_MASK	0x00000fff
#define IIDR_MODEL_MASK		(IIDR_PRODUCT_ID_MASK | \
				 IIDR_IMPLEMENTER_MASK)

233
/*******************************************************************************
234
 * GICv3 and 3.1 CPU interface registers & constants
235
 ******************************************************************************/
236
/* ICC_SRE bit definitions */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
237
238
239
240
#define ICC_SRE_EN_BIT		BIT_32(3)
#define ICC_SRE_DIB_BIT		BIT_32(2)
#define ICC_SRE_DFB_BIT		BIT_32(1)
#define ICC_SRE_SRE_BIT		BIT_32(0)
241
242
243
244
245

/* ICC_IGRPEN1_EL3 bit definitions */
#define IGRPEN1_EL3_ENABLE_G1NS_SHIFT	0
#define IGRPEN1_EL3_ENABLE_G1S_SHIFT	1

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
246
247
#define IGRPEN1_EL3_ENABLE_G1NS_BIT	BIT_32(IGRPEN1_EL3_ENABLE_G1NS_SHIFT)
#define IGRPEN1_EL3_ENABLE_G1S_BIT	BIT_32(IGRPEN1_EL3_ENABLE_G1S_SHIFT)
248
249
250

/* ICC_IGRPEN0_EL1 bit definitions */
#define IGRPEN1_EL1_ENABLE_G0_SHIFT	0
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
251
#define IGRPEN1_EL1_ENABLE_G0_BIT	BIT_32(IGRPEN1_EL1_ENABLE_G0_SHIFT)
252
253
254

/* ICC_HPPIR0_EL1 bit definitions */
#define HPPIR0_EL1_INTID_SHIFT		0
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
255
#define HPPIR0_EL1_INTID_MASK		U(0xffffff)
256
257
258

/* ICC_HPPIR1_EL1 bit definitions */
#define HPPIR1_EL1_INTID_SHIFT		0
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
259
#define HPPIR1_EL1_INTID_MASK		U(0xffffff)
260
261
262

/* ICC_IAR0_EL1 bit definitions */
#define IAR0_EL1_INTID_SHIFT		0
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
263
#define IAR0_EL1_INTID_MASK		U(0xffffff)
264
265
266

/* ICC_IAR1_EL1 bit definitions */
#define IAR1_EL1_INTID_SHIFT		0
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
267
#define IAR1_EL1_INTID_MASK		U(0xffffff)
268

269
/* ICC SGI macros */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
270
#define SGIR_TGT_MASK			ULL(0xffff)
271
272
#define SGIR_AFF1_SHIFT			16
#define SGIR_INTID_SHIFT		24
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
273
#define SGIR_INTID_MASK			ULL(0xf)
274
275
#define SGIR_AFF2_SHIFT			32
#define SGIR_IRM_SHIFT			40
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
276
#define SGIR_IRM_MASK			ULL(0x1)
277
#define SGIR_AFF3_SHIFT			48
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
278
#define SGIR_AFF_MASK			ULL(0xf)
279

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
280
#define SGIR_IRM_TO_AFF			U(0)
281

Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
282
283
284
285
286
287
288
#define GICV3_SGIR_VALUE(_aff3, _aff2, _aff1, _intid, _irm, _tgt)	\
	((((uint64_t) (_aff3) & SGIR_AFF_MASK) << SGIR_AFF3_SHIFT) |	\
	 (((uint64_t) (_irm) & SGIR_IRM_MASK) << SGIR_IRM_SHIFT) |	\
	 (((uint64_t) (_aff2) & SGIR_AFF_MASK) << SGIR_AFF2_SHIFT) |	\
	 (((_intid) & SGIR_INTID_MASK) << SGIR_INTID_SHIFT) |		\
	 (((_aff1) & SGIR_AFF_MASK) << SGIR_AFF1_SHIFT) |		\
	 ((_tgt) & SGIR_TGT_MASK))
289

290
/*****************************************************************************
291
 * GICv3 and 3.1 ITS registers and constants
292
 *****************************************************************************/
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
293
294
295
296
297
298
299
#define GITS_CTLR			U(0x0)
#define GITS_IIDR			U(0x4)
#define GITS_TYPER			U(0x8)
#define GITS_CBASER			U(0x80)
#define GITS_CWRITER			U(0x88)
#define GITS_CREADR			U(0x90)
#define GITS_BASER			U(0x100)
300
301

/* GITS_CTLR bit definitions */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
302
#define GITS_CTLR_ENABLED_BIT		BIT_32(0)
303
#define GITS_CTLR_QUIESCENT_BIT		BIT_32(1)
304

305
#ifndef __ASSEMBLER__
306

307
#include <stdbool.h>
308
#include <stdint.h>
309
310
311
312
313

#include <arch_helpers.h>
#include <common/interrupt_props.h>
#include <drivers/arm/gic_common.h>
#include <lib/utils_def.h>
314

315
316
317
318
static inline bool gicv3_is_intr_id_special_identifier(unsigned int id)
{
	return (id >= PENDING_G1S_INTID) && (id <= GIC_SPURIOUS_INTERRUPT);
}
319
320

/*******************************************************************************
321
 * Helper GICv3 and 3.1 macros for SEL1
322
 ******************************************************************************/
323
324
325
326
static inline uint32_t gicv3_acknowledge_interrupt_sel1(void)
{
	return (uint32_t)read_icc_iar1_el1() & IAR1_EL1_INTID_MASK;
}
327

328
329
330
331
332
333
334
static inline uint32_t gicv3_get_pending_interrupt_id_sel1(void)
{
	return (uint32_t)read_icc_hppir1_el1() & HPPIR1_EL1_INTID_MASK;
}

static inline void gicv3_end_of_interrupt_sel1(unsigned int id)
{
335
336
337
338
339
340
341
342
343
344
345
346
	/*
	 * Interrupt request deassertion from peripheral to GIC happens
	 * by clearing interrupt condition by a write to the peripheral
	 * register. It is desired that the write transfer is complete
	 * before the core tries to change GIC state from 'AP/Active' to
	 * a new state on seeing 'EOI write'.
	 * Since ICC interface writes are not ordered against Device
	 * memory writes, a barrier is required to ensure the ordering.
	 * The dsb will also ensure *completion* of previous writes with
	 * DEVICE nGnRnE attribute.
	 */
	dsbishst();
347
348
	write_icc_eoir1_el1(id);
}
349
350
351
352

/*******************************************************************************
 * Helper GICv3 macros for EL3
 ******************************************************************************/
353
354
355
356
357
358
359
static inline uint32_t gicv3_acknowledge_interrupt(void)
{
	return (uint32_t)read_icc_iar0_el1() & IAR0_EL1_INTID_MASK;
}

static inline void gicv3_end_of_interrupt(unsigned int id)
{
360
361
362
363
364
365
366
367
368
369
370
371
	/*
	 * Interrupt request deassertion from peripheral to GIC happens
	 * by clearing interrupt condition by a write to the peripheral
	 * register. It is desired that the write transfer is complete
	 * before the core tries to change GIC state from 'AP/Active' to
	 * a new state on seeing 'EOI write'.
	 * Since ICC interface writes are not ordered against Device
	 * memory writes, a barrier is required to ensure the ordering.
	 * The dsb will also ensure *completion* of previous writes with
	 * DEVICE nGnRnE attribute.
	 */
	dsbishst();
372
373
	return write_icc_eoir0_el1(id);
}
374

375
/*
376
377
 * This macro returns the total number of GICD/GICR registers corresponding to
 * the register name
378
379
 */
#define GICD_NUM_REGS(reg_name)	\
380
	DIV_ROUND_UP_2EVAL(TOTAL_SHARED_INTR_NUM, (1 << reg_name##_SHIFT))
381
382

#define GICR_NUM_REGS(reg_name)	\
383
	DIV_ROUND_UP_2EVAL(TOTAL_PRIVATE_INTR_NUM, (1 << reg_name##_SHIFT))
384

385
/* Interrupt ID mask for HPPIR, AHPPIR, IAR and AIAR CPU Interface registers */
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
386
#define INT_ID_MASK	U(0xffffff)
387

388
389
390
391
392
/*******************************************************************************
 * This structure describes some of the implementation defined attributes of the
 * GICv3 IP. It is used by the platform port to specify these attributes in order
 * to initialise the GICV3 driver. The attributes are described below.
 *
393
394
395
396
397
398
399
400
401
 * The 'gicd_base' field contains the base address of the Distributor interface
 * programmer's view.
 *
 * The 'gicr_base' field contains the base address of the Re-distributor
 * interface programmer's view.
 *
 * The 'interrupt_props' field is a pointer to an array that enumerates secure
 * interrupts and their properties. If this field is not NULL, both
 * 'g0_interrupt_array' and 'g1s_interrupt_array' fields are ignored.
402
 *
403
404
405
 * The 'interrupt_props_num' field contains the number of entries in the
 * 'interrupt_props' array. If this field is non-zero, both 'g0_interrupt_num'
 * and 'g1s_interrupt_num' are ignored.
406
 *
407
408
409
 * The 'rdistif_num' field contains the number of Redistributor interfaces the
 * GIC implements. This is equal to the number of CPUs or CPU interfaces
 * instantiated in the GIC.
410
 *
411
412
413
414
 * The 'rdistif_base_addrs' field is a pointer to an array that has an entry for
 * storing the base address of the Redistributor interface frame of each CPU in
 * the system. The size of the array = 'rdistif_num'. The base addresses are
 * detected during driver initialisation.
415
 *
416
417
418
419
420
421
422
423
424
425
 * The 'mpidr_to_core_pos' field is a pointer to a hash function which the
 * driver will use to convert an MPIDR value to a linear core index. This index
 * will be used for accessing the 'rdistif_base_addrs' array. This is an
 * optional field. A GICv3 implementation maps each MPIDR to a linear core index
 * as well. This mapping can be found by reading the "Affinity Value" and
 * "Processor Number" fields in the GICR_TYPER. It is IMP. DEF. if the
 * "Processor Numbers" are suitable to index into an array to access core
 * specific information. If this not the case, the platform port must provide a
 * hash function. Otherwise, the "Processor Number" field will be used to access
 * the array elements.
426
 ******************************************************************************/
427
typedef unsigned int (*mpidr_hash_fn)(u_register_t mpidr);
428
429
430
431

typedef struct gicv3_driver_data {
	uintptr_t gicd_base;
	uintptr_t gicr_base;
432
433
	const interrupt_prop_t *interrupt_props;
	unsigned int interrupt_props_num;
434
435
436
437
438
	unsigned int rdistif_num;
	uintptr_t *rdistif_base_addrs;
	mpidr_hash_fn mpidr_to_core_pos;
} gicv3_driver_data_t;

439
440
441
442
443
444
445
typedef struct gicv3_redist_ctx {
	/* 64 bits registers */
	uint64_t gicr_propbaser;
	uint64_t gicr_pendbaser;

	/* 32 bits registers */
	uint32_t gicr_ctlr;
446
447
448
449
	uint32_t gicr_igroupr[GICR_NUM_REGS(IGROUPR)];
	uint32_t gicr_isenabler[GICR_NUM_REGS(ISENABLER)];
	uint32_t gicr_ispendr[GICR_NUM_REGS(ISPENDR)];
	uint32_t gicr_isactiver[GICR_NUM_REGS(ISACTIVER)];
450
	uint32_t gicr_ipriorityr[GICR_NUM_REGS(IPRIORITYR)];
451
452
	uint32_t gicr_icfgr[GICR_NUM_REGS(ICFGR)];
	uint32_t gicr_igrpmodr[GICR_NUM_REGS(IGRPMODR)];
453
454
455
456
457
	uint32_t gicr_nsacr;
} gicv3_redist_ctx_t;

typedef struct gicv3_dist_ctx {
	/* 64 bits registers */
458
	uint64_t gicd_irouter[TOTAL_SHARED_INTR_NUM];
459
460
461
462
463
464
465
466
467
468
469
470
471

	/* 32 bits registers */
	uint32_t gicd_ctlr;
	uint32_t gicd_igroupr[GICD_NUM_REGS(IGROUPR)];
	uint32_t gicd_isenabler[GICD_NUM_REGS(ISENABLER)];
	uint32_t gicd_ispendr[GICD_NUM_REGS(ISPENDR)];
	uint32_t gicd_isactiver[GICD_NUM_REGS(ISACTIVER)];
	uint32_t gicd_ipriorityr[GICD_NUM_REGS(IPRIORITYR)];
	uint32_t gicd_icfgr[GICD_NUM_REGS(ICFGR)];
	uint32_t gicd_igrpmodr[GICD_NUM_REGS(IGRPMODR)];
	uint32_t gicd_nsacr[GICD_NUM_REGS(NSACR)];
} gicv3_dist_ctx_t;

472
473
474
475
476
477
478
479
480
481
typedef struct gicv3_its_ctx {
	/* 64 bits registers */
	uint64_t gits_cbaser;
	uint64_t gits_cwriter;
	uint64_t gits_baser[8];

	/* 32 bits registers */
	uint32_t gits_ctlr;
} gicv3_its_ctx_t;

482
483
484
485
/*******************************************************************************
 * GICv3 EL3 driver API
 ******************************************************************************/
void gicv3_driver_init(const gicv3_driver_data_t *plat_driver_data);
486
int gicv3_rdistif_probe(const uintptr_t gicr_frame);
487
488
void gicv3_distif_init(void);
void gicv3_rdistif_init(unsigned int proc_num);
489
490
void gicv3_rdistif_on(unsigned int proc_num);
void gicv3_rdistif_off(unsigned int proc_num);
491
492
493
494
495
496
void gicv3_cpuif_enable(unsigned int proc_num);
void gicv3_cpuif_disable(unsigned int proc_num);
unsigned int gicv3_get_pending_interrupt_type(void);
unsigned int gicv3_get_pending_interrupt_id(void);
unsigned int gicv3_get_interrupt_type(unsigned int id,
					  unsigned int proc_num);
497
498
499
500
501
502
503
504
505
506
507
508
void gicv3_distif_init_restore(const gicv3_dist_ctx_t * const dist_ctx);
void gicv3_distif_save(gicv3_dist_ctx_t * const dist_ctx);
/*
 * gicv3_distif_post_restore and gicv3_distif_pre_save must be implemented if
 * gicv3_distif_save and gicv3_rdistif_init_restore are used. If no
 * implementation-defined sequence is needed at these steps, an empty function
 * can be provided.
 */
void gicv3_distif_post_restore(unsigned int proc_num);
void gicv3_distif_pre_save(unsigned int proc_num);
void gicv3_rdistif_init_restore(unsigned int proc_num, const gicv3_redist_ctx_t * const rdist_ctx);
void gicv3_rdistif_save(unsigned int proc_num, gicv3_redist_ctx_t * const rdist_ctx);
509
510
void gicv3_its_save_disable(uintptr_t gits_base, gicv3_its_ctx_t * const its_ctx);
void gicv3_its_restore(uintptr_t gits_base, const gicv3_its_ctx_t * const its_ctx);
511

512
unsigned int gicv3_get_running_priority(void);
513
unsigned int gicv3_get_interrupt_active(unsigned int id, unsigned int proc_num);
514
515
void gicv3_enable_interrupt(unsigned int id, unsigned int proc_num);
void gicv3_disable_interrupt(unsigned int id, unsigned int proc_num);
516
517
void gicv3_set_interrupt_priority(unsigned int id, unsigned int proc_num,
		unsigned int priority);
518
void gicv3_set_interrupt_type(unsigned int id, unsigned int proc_num,
Roberto Vargas's avatar
Roberto Vargas committed
519
		unsigned int type);
Antonio Nino Diaz's avatar
Antonio Nino Diaz committed
520
void gicv3_raise_secure_g0_sgi(unsigned int sgi_num, u_register_t target);
521
522
void gicv3_set_spi_routing(unsigned int id, unsigned int irm,
		u_register_t mpidr);
523
524
void gicv3_set_interrupt_pending(unsigned int id, unsigned int proc_num);
void gicv3_clear_interrupt_pending(unsigned int id, unsigned int proc_num);
525
unsigned int gicv3_set_pmr(unsigned int mask);
526

527
#endif /* __ASSEMBLER__ */
528
#endif /* GICV3_H */