xref: /rk3399_ARM-atf/plat/qti/common/src/qti_gic_v3.c (revision 46ee50e0b34e19d383a28bc3b3dadbfb4c07b270)
15bd9c17dSSaurabh Gorecha /*
25bd9c17dSSaurabh Gorecha  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*46ee50e0SSaurabh Gorecha  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
45bd9c17dSSaurabh Gorecha  *
55bd9c17dSSaurabh Gorecha  * SPDX-License-Identifier: BSD-3-Clause
65bd9c17dSSaurabh Gorecha  */
75bd9c17dSSaurabh Gorecha 
85bd9c17dSSaurabh Gorecha #include <common/bl_common.h>
95bd9c17dSSaurabh Gorecha #include <drivers/arm/gicv3.h>
105bd9c17dSSaurabh Gorecha 
115bd9c17dSSaurabh Gorecha #include <platform.h>
125bd9c17dSSaurabh Gorecha #include <platform_def.h>
135bd9c17dSSaurabh Gorecha #include <qti_plat.h>
145bd9c17dSSaurabh Gorecha #include <qtiseclib_defs.h>
155bd9c17dSSaurabh Gorecha #include <qtiseclib_defs_plat.h>
165bd9c17dSSaurabh Gorecha 
175bd9c17dSSaurabh Gorecha /* The GICv3 driver only needs to be initialized in EL3 */
185bd9c17dSSaurabh Gorecha static uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT];
195bd9c17dSSaurabh Gorecha 
205bd9c17dSSaurabh Gorecha /* Array of interrupts to be configured by the gic driver */
215bd9c17dSSaurabh Gorecha static const interrupt_prop_t qti_interrupt_props[] = {
225bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_CPU_WAKEUP_SGI,
235bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
245bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
255bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_RESET_SGI, GIC_HIGHEST_SEC_PRIORITY,
265bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
275bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
285bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_SEC_WDOG_BARK, GIC_HIGHEST_SEC_PRIORITY,
295bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
305bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
315bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_NON_SEC_WDOG_BITE,
325bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
335bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_LEVEL),
345bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CLT_SEC,
355bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
365bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
375bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CLT_NONSEC,
385bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
395bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
405bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CFG_SEC,
415bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
425bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
435bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_VMIDMT_ERR_CFG_NONSEC,
445bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
455bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
465bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_XPU_SEC, GIC_HIGHEST_SEC_PRIORITY,
475bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
485bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
495bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_XPU_NON_SEC, GIC_HIGHEST_SEC_PRIORITY,
505bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
515bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
525bd9c17dSSaurabh Gorecha #ifdef QTISECLIB_INT_ID_A1_NOC_ERROR
535bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_A1_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
545bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
555bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
565bd9c17dSSaurabh Gorecha #endif
575bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_A2_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
585bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
595bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
605bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_CONFIG_NOC_ERROR,
615bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
625bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
635bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_DC_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
645bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
655bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
665bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_MEM_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
675bd9c17dSSaurabh Gorecha 		       INTR_GROUP0,
685bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
695bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_SYSTEM_NOC_ERROR,
705bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
715bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
725bd9c17dSSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_MMSS_NOC_ERROR,
735bd9c17dSSaurabh Gorecha 		       GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
745bd9c17dSSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
75*46ee50e0SSaurabh Gorecha #ifdef QTISECLIB_INT_ID_LPASS_AGNOC_ERROR
76*46ee50e0SSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_LPASS_AGNOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
77*46ee50e0SSaurabh Gorecha 		       INTR_GROUP0,
78*46ee50e0SSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
79*46ee50e0SSaurabh Gorecha #endif
80*46ee50e0SSaurabh Gorecha #ifdef QTISECLIB_INT_ID_NSP_NOC_ERROR
81*46ee50e0SSaurabh Gorecha 	INTR_PROP_DESC(QTISECLIB_INT_ID_NSP_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
82*46ee50e0SSaurabh Gorecha 		       INTR_GROUP0,
83*46ee50e0SSaurabh Gorecha 		       GIC_INTR_CFG_EDGE),
84*46ee50e0SSaurabh Gorecha #endif
855bd9c17dSSaurabh Gorecha };
865bd9c17dSSaurabh Gorecha 
875bd9c17dSSaurabh Gorecha const gicv3_driver_data_t qti_gic_data = {
885bd9c17dSSaurabh Gorecha 	.gicd_base = QTI_GICD_BASE,
895bd9c17dSSaurabh Gorecha 	.gicr_base = QTI_GICR_BASE,
905bd9c17dSSaurabh Gorecha 	.interrupt_props = qti_interrupt_props,
915bd9c17dSSaurabh Gorecha 	.interrupt_props_num = ARRAY_SIZE(qti_interrupt_props),
925bd9c17dSSaurabh Gorecha 	.rdistif_num = PLATFORM_CORE_COUNT,
935bd9c17dSSaurabh Gorecha 	.rdistif_base_addrs = rdistif_base_addrs,
945bd9c17dSSaurabh Gorecha 	.mpidr_to_core_pos = plat_qti_core_pos_by_mpidr
955bd9c17dSSaurabh Gorecha };
965bd9c17dSSaurabh Gorecha 
975bd9c17dSSaurabh Gorecha void plat_qti_gic_driver_init(void)
985bd9c17dSSaurabh Gorecha {
995bd9c17dSSaurabh Gorecha 	/*
1005bd9c17dSSaurabh Gorecha 	 * The GICv3 driver is initialized in EL3 and does not need
1015bd9c17dSSaurabh Gorecha 	 * to be initialized again in SEL1. This is because the S-EL1
1025bd9c17dSSaurabh Gorecha 	 * can use GIC system registers to manage interrupts and does
1035bd9c17dSSaurabh Gorecha 	 * not need GIC interface base addresses to be configured.
1045bd9c17dSSaurabh Gorecha 	 */
1055bd9c17dSSaurabh Gorecha 	gicv3_driver_init(&qti_gic_data);
1065bd9c17dSSaurabh Gorecha }
1075bd9c17dSSaurabh Gorecha 
1085bd9c17dSSaurabh Gorecha /******************************************************************************
1095bd9c17dSSaurabh Gorecha  * ARM common helper to initialize the GIC. Only invoked by BL31
1105bd9c17dSSaurabh Gorecha  *****************************************************************************/
1115bd9c17dSSaurabh Gorecha void plat_qti_gic_init(void)
1125bd9c17dSSaurabh Gorecha {
1135bd9c17dSSaurabh Gorecha 	unsigned int i;
1145bd9c17dSSaurabh Gorecha 
1155bd9c17dSSaurabh Gorecha 	gicv3_distif_init();
1165bd9c17dSSaurabh Gorecha 	gicv3_rdistif_init(plat_my_core_pos());
1175bd9c17dSSaurabh Gorecha 	gicv3_cpuif_enable(plat_my_core_pos());
1185bd9c17dSSaurabh Gorecha 
1195bd9c17dSSaurabh Gorecha 	/* Route secure spi interrupt to ANY. */
1205bd9c17dSSaurabh Gorecha 	for (i = 0; i < ARRAY_SIZE(qti_interrupt_props); i++) {
1215bd9c17dSSaurabh Gorecha 		unsigned int int_id = qti_interrupt_props[i].intr_num;
1225bd9c17dSSaurabh Gorecha 
1235bd9c17dSSaurabh Gorecha 		if (plat_ic_is_spi(int_id)) {
1245bd9c17dSSaurabh Gorecha 			gicv3_set_spi_routing(int_id, GICV3_IRM_ANY, 0x0);
1255bd9c17dSSaurabh Gorecha 		}
1265bd9c17dSSaurabh Gorecha 	}
1275bd9c17dSSaurabh Gorecha }
1285bd9c17dSSaurabh Gorecha 
1295bd9c17dSSaurabh Gorecha void gic_set_spi_routing(unsigned int id, unsigned int irm, u_register_t target)
1305bd9c17dSSaurabh Gorecha {
1315bd9c17dSSaurabh Gorecha 	gicv3_set_spi_routing(id, irm, target);
1325bd9c17dSSaurabh Gorecha }
1335bd9c17dSSaurabh Gorecha 
1345bd9c17dSSaurabh Gorecha /******************************************************************************
1355bd9c17dSSaurabh Gorecha  * ARM common helper to enable the GIC CPU interface
1365bd9c17dSSaurabh Gorecha  *****************************************************************************/
1375bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_enable(void)
1385bd9c17dSSaurabh Gorecha {
1395bd9c17dSSaurabh Gorecha 	gicv3_cpuif_enable(plat_my_core_pos());
1405bd9c17dSSaurabh Gorecha }
1415bd9c17dSSaurabh Gorecha 
1425bd9c17dSSaurabh Gorecha /******************************************************************************
1435bd9c17dSSaurabh Gorecha  * ARM common helper to disable the GIC CPU interface
1445bd9c17dSSaurabh Gorecha  *****************************************************************************/
1455bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_disable(void)
1465bd9c17dSSaurabh Gorecha {
1475bd9c17dSSaurabh Gorecha 	gicv3_cpuif_disable(plat_my_core_pos());
1485bd9c17dSSaurabh Gorecha }
1495bd9c17dSSaurabh Gorecha 
1505bd9c17dSSaurabh Gorecha /******************************************************************************
1515bd9c17dSSaurabh Gorecha  * ARM common helper to initialize the per-CPU redistributor interface in GICv3
1525bd9c17dSSaurabh Gorecha  *****************************************************************************/
1535bd9c17dSSaurabh Gorecha void plat_qti_gic_pcpu_init(void)
1545bd9c17dSSaurabh Gorecha {
1555bd9c17dSSaurabh Gorecha 	gicv3_rdistif_init(plat_my_core_pos());
1565bd9c17dSSaurabh Gorecha }
1575bd9c17dSSaurabh Gorecha 
1585bd9c17dSSaurabh Gorecha /******************************************************************************
1595bd9c17dSSaurabh Gorecha  * ARM common helpers to power GIC redistributor interface
1605bd9c17dSSaurabh Gorecha  *****************************************************************************/
1615bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_on(void)
1625bd9c17dSSaurabh Gorecha {
1635bd9c17dSSaurabh Gorecha 	gicv3_rdistif_on(plat_my_core_pos());
1645bd9c17dSSaurabh Gorecha }
1655bd9c17dSSaurabh Gorecha 
1665bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_off(void)
1675bd9c17dSSaurabh Gorecha {
1685bd9c17dSSaurabh Gorecha 	gicv3_rdistif_off(plat_my_core_pos());
1695bd9c17dSSaurabh Gorecha }
170