xref: /rk3399_ARM-atf/plat/qti/common/src/qti_gic_v3.c (revision 5bd9c17d023288e6b819fa3eecc01b7981399cfa)
1*5bd9c17dSSaurabh Gorecha /*
2*5bd9c17dSSaurabh Gorecha  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*5bd9c17dSSaurabh Gorecha  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
4*5bd9c17dSSaurabh Gorecha  *
5*5bd9c17dSSaurabh Gorecha  * SPDX-License-Identifier: BSD-3-Clause
6*5bd9c17dSSaurabh Gorecha  */
7*5bd9c17dSSaurabh Gorecha 
8*5bd9c17dSSaurabh Gorecha #include <common/bl_common.h>
9*5bd9c17dSSaurabh Gorecha #include <drivers/arm/gicv3.h>
10*5bd9c17dSSaurabh Gorecha 
11*5bd9c17dSSaurabh Gorecha #include <platform.h>
12*5bd9c17dSSaurabh Gorecha #include <platform_def.h>
13*5bd9c17dSSaurabh Gorecha #include <qti_plat.h>
14*5bd9c17dSSaurabh Gorecha #include <qtiseclib_defs.h>
15*5bd9c17dSSaurabh Gorecha #include <qtiseclib_defs_plat.h>
16*5bd9c17dSSaurabh Gorecha 
17*5bd9c17dSSaurabh Gorecha /* The GICv3 driver only needs to be initialized in EL3 */
18*5bd9c17dSSaurabh Gorecha static uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT];
19*5bd9c17dSSaurabh Gorecha 
20*5bd9c17dSSaurabh Gorecha /* Array of interrupts to be configured by the gic driver */
21*5bd9c17dSSaurabh Gorecha static const interrupt_prop_t qti_interrupt_props[] = {
22*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_CPU_WAKEUP_SGI,
23*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
24*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
25*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_RESET_SGI, GIC_HIGHEST_SEC_PRIORITY,
26*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
27*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
28*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_SEC_WDOG_BARK, GIC_HIGHEST_SEC_PRIORITY,
29*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
30*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
31*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_NON_SEC_WDOG_BITE,
32*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
33*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_LEVEL),
34*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CLT_SEC,
35*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
36*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
37*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CLT_NONSEC,
38*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
39*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
40*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CFG_SEC,
41*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
42*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
43*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CFG_NONSEC,
44*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
45*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
46*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_XPU_SEC, GIC_HIGHEST_SEC_PRIORITY,
47*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
48*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
49*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_XPU_NON_SEC, GIC_HIGHEST_SEC_PRIORITY,
50*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
51*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
52*5bd9c17dSSaurabh Gorecha #ifdef QTISECLIB_INT_ID_A1_NOC_ERROR
53*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_A1_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
54*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
55*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
56*5bd9c17dSSaurabh Gorecha #endif
57*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_A2_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
58*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
59*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
60*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_CONFIG_NOC_ERROR,
61*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
62*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
63*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_DC_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
64*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
65*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
66*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_MEM_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
67*5bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
68*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
69*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_SYSTEM_NOC_ERROR,
70*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
71*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
72*5bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_MMSS_NOC_ERROR,
73*5bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
74*5bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
75*5bd9c17dSSaurabh Gorecha };
76*5bd9c17dSSaurabh Gorecha 
77*5bd9c17dSSaurabh Gorecha const gicv3_driver_data_t qti_gic_data = {
78*5bd9c17dSSaurabh Gorecha 	.gicd_base = QTI_GICD_BASE,
79*5bd9c17dSSaurabh Gorecha 	.gicr_base = QTI_GICR_BASE,
80*5bd9c17dSSaurabh Gorecha 	.interrupt_props = qti_interrupt_props,
81*5bd9c17dSSaurabh Gorecha 	.interrupt_props_num = ARRAY_SIZE(qti_interrupt_props),
82*5bd9c17dSSaurabh Gorecha 	.rdistif_num = PLATFORM_CORE_COUNT,
83*5bd9c17dSSaurabh Gorecha 	.rdistif_base_addrs = rdistif_base_addrs,
84*5bd9c17dSSaurabh Gorecha 	.mpidr_to_core_pos = plat_qti_core_pos_by_mpidr
85*5bd9c17dSSaurabh Gorecha };
86*5bd9c17dSSaurabh Gorecha 
87*5bd9c17dSSaurabh Gorecha void plat_qti_gic_driver_init(void)
88*5bd9c17dSSaurabh Gorecha {
89*5bd9c17dSSaurabh Gorecha 	/*
90*5bd9c17dSSaurabh Gorecha 	 * The GICv3 driver is initialized in EL3 and does not need
91*5bd9c17dSSaurabh Gorecha 	 * to be initialized again in SEL1. This is because the S-EL1
92*5bd9c17dSSaurabh Gorecha 	 * can use GIC system registers to manage interrupts and does
93*5bd9c17dSSaurabh Gorecha 	 * not need GIC interface base addresses to be configured.
94*5bd9c17dSSaurabh Gorecha 	 */
95*5bd9c17dSSaurabh Gorecha 	gicv3_driver_init(&qti_gic_data);
96*5bd9c17dSSaurabh Gorecha }
97*5bd9c17dSSaurabh Gorecha 
98*5bd9c17dSSaurabh Gorecha /******************************************************************************
99*5bd9c17dSSaurabh Gorecha  * ARM common helper to initialize the GIC. Only invoked by BL31
100*5bd9c17dSSaurabh Gorecha  *****************************************************************************/
101*5bd9c17dSSaurabh Gorecha void plat_qti_gic_init(void)
102*5bd9c17dSSaurabh Gorecha {
103*5bd9c17dSSaurabh Gorecha 	unsigned int i;
104*5bd9c17dSSaurabh Gorecha 
105*5bd9c17dSSaurabh Gorecha 	gicv3_distif_init();
106*5bd9c17dSSaurabh Gorecha 	gicv3_rdistif_init(plat_my_core_pos());
107*5bd9c17dSSaurabh Gorecha 	gicv3_cpuif_enable(plat_my_core_pos());
108*5bd9c17dSSaurabh Gorecha 
109*5bd9c17dSSaurabh Gorecha 	/* Route secure spi interrupt to ANY. */
110*5bd9c17dSSaurabh Gorecha 	for (i = 0; i < ARRAY_SIZE(qti_interrupt_props); i++) {
111*5bd9c17dSSaurabh Gorecha 		unsigned int int_id = qti_interrupt_props[i].intr_num;
112*5bd9c17dSSaurabh Gorecha 
113*5bd9c17dSSaurabh Gorecha 		if (plat_ic_is_spi(int_id)) {
114*5bd9c17dSSaurabh Gorecha 			gicv3_set_spi_routing(int_id, GICV3_IRM_ANY, 0x0);
115*5bd9c17dSSaurabh Gorecha 		}
116*5bd9c17dSSaurabh Gorecha 	}
117*5bd9c17dSSaurabh Gorecha }
118*5bd9c17dSSaurabh Gorecha 
119*5bd9c17dSSaurabh Gorecha void gic_set_spi_routing(unsigned int id, unsigned int irm, u_register_t target)
120*5bd9c17dSSaurabh Gorecha {
121*5bd9c17dSSaurabh Gorecha 	gicv3_set_spi_routing(id, irm, target);
122*5bd9c17dSSaurabh Gorecha }
123*5bd9c17dSSaurabh Gorecha 
124*5bd9c17dSSaurabh Gorecha /******************************************************************************
125*5bd9c17dSSaurabh Gorecha  * ARM common helper to enable the GIC CPU interface
126*5bd9c17dSSaurabh Gorecha  *****************************************************************************/
127*5bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_enable(void)
128*5bd9c17dSSaurabh Gorecha {
129*5bd9c17dSSaurabh Gorecha 	gicv3_cpuif_enable(plat_my_core_pos());
130*5bd9c17dSSaurabh Gorecha }
131*5bd9c17dSSaurabh Gorecha 
132*5bd9c17dSSaurabh Gorecha /******************************************************************************
133*5bd9c17dSSaurabh Gorecha  * ARM common helper to disable the GIC CPU interface
134*5bd9c17dSSaurabh Gorecha  *****************************************************************************/
135*5bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_disable(void)
136*5bd9c17dSSaurabh Gorecha {
137*5bd9c17dSSaurabh Gorecha 	gicv3_cpuif_disable(plat_my_core_pos());
138*5bd9c17dSSaurabh Gorecha }
139*5bd9c17dSSaurabh Gorecha 
140*5bd9c17dSSaurabh Gorecha /******************************************************************************
141*5bd9c17dSSaurabh Gorecha  * ARM common helper to initialize the per-CPU redistributor interface in GICv3
142*5bd9c17dSSaurabh Gorecha  *****************************************************************************/
143*5bd9c17dSSaurabh Gorecha void plat_qti_gic_pcpu_init(void)
144*5bd9c17dSSaurabh Gorecha {
145*5bd9c17dSSaurabh Gorecha 	gicv3_rdistif_init(plat_my_core_pos());
146*5bd9c17dSSaurabh Gorecha }
147*5bd9c17dSSaurabh Gorecha 
148*5bd9c17dSSaurabh Gorecha /******************************************************************************
149*5bd9c17dSSaurabh Gorecha  * ARM common helpers to power GIC redistributor interface
150*5bd9c17dSSaurabh Gorecha  *****************************************************************************/
151*5bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_on(void)
152*5bd9c17dSSaurabh Gorecha {
153*5bd9c17dSSaurabh Gorecha 	gicv3_rdistif_on(plat_my_core_pos());
154*5bd9c17dSSaurabh Gorecha }
155*5bd9c17dSSaurabh Gorecha 
156*5bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_off(void)
157*5bd9c17dSSaurabh Gorecha {
158*5bd9c17dSSaurabh Gorecha 	gicv3_rdistif_off(plat_my_core_pos());
159*5bd9c17dSSaurabh Gorecha }
160