15bd9c17dSSaurabh Gorecha /*
2*f60617d3Squic_assethi * Copyright (c) 2015-2024, ARM Limited and Contributors. All rights reserved.
3*f60617d3Squic_assethi * Copyright (c) 2018-2024, 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
57*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_A2_NOC_ERROR
585bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_A2_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
595bd9c17dSSaurabh Gorecha INTR_GROUP0,
605bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
61*f60617d3Squic_assethi #endif
62*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_CONFIG_NOC_ERROR
635bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_CONFIG_NOC_ERROR,
645bd9c17dSSaurabh Gorecha GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
655bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
66*f60617d3Squic_assethi #endif
67*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_DC_NOC_ERROR
685bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_DC_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
695bd9c17dSSaurabh Gorecha INTR_GROUP0,
705bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
71*f60617d3Squic_assethi #endif
72*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_MEM_NOC_ERROR
735bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_MEM_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
745bd9c17dSSaurabh Gorecha INTR_GROUP0,
755bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
76*f60617d3Squic_assethi #endif
77*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_SYSTEM_NOC_ERROR
785bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_SYSTEM_NOC_ERROR,
795bd9c17dSSaurabh Gorecha GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
805bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
81*f60617d3Squic_assethi #endif
82*f60617d3Squic_assethi #ifdef QTISECLIB_INT_ID_MMSS_NOC_ERROR
835bd9c17dSSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_MMSS_NOC_ERROR,
845bd9c17dSSaurabh Gorecha GIC_HIGHEST_SEC_PRIORITY, INTR_GROUP0,
855bd9c17dSSaurabh Gorecha GIC_INTR_CFG_EDGE),
86*f60617d3Squic_assethi #endif
8746ee50e0SSaurabh Gorecha #ifdef QTISECLIB_INT_ID_LPASS_AGNOC_ERROR
8846ee50e0SSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_LPASS_AGNOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
8946ee50e0SSaurabh Gorecha INTR_GROUP0,
9046ee50e0SSaurabh Gorecha GIC_INTR_CFG_EDGE),
9146ee50e0SSaurabh Gorecha #endif
9246ee50e0SSaurabh Gorecha #ifdef QTISECLIB_INT_ID_NSP_NOC_ERROR
9346ee50e0SSaurabh Gorecha INTR_PROP_DESC(QTISECLIB_INT_ID_NSP_NOC_ERROR, GIC_HIGHEST_SEC_PRIORITY,
9446ee50e0SSaurabh Gorecha INTR_GROUP0,
9546ee50e0SSaurabh Gorecha GIC_INTR_CFG_EDGE),
9646ee50e0SSaurabh Gorecha #endif
975bd9c17dSSaurabh Gorecha };
985bd9c17dSSaurabh Gorecha
995bd9c17dSSaurabh Gorecha const gicv3_driver_data_t qti_gic_data = {
1005bd9c17dSSaurabh Gorecha .gicd_base = QTI_GICD_BASE,
1015bd9c17dSSaurabh Gorecha .gicr_base = QTI_GICR_BASE,
1025bd9c17dSSaurabh Gorecha .interrupt_props = qti_interrupt_props,
1035bd9c17dSSaurabh Gorecha .interrupt_props_num = ARRAY_SIZE(qti_interrupt_props),
1045bd9c17dSSaurabh Gorecha .rdistif_num = PLATFORM_CORE_COUNT,
1055bd9c17dSSaurabh Gorecha .rdistif_base_addrs = rdistif_base_addrs,
1065bd9c17dSSaurabh Gorecha .mpidr_to_core_pos = plat_qti_core_pos_by_mpidr
1075bd9c17dSSaurabh Gorecha };
1085bd9c17dSSaurabh Gorecha
plat_qti_gic_driver_init(void)1095bd9c17dSSaurabh Gorecha void plat_qti_gic_driver_init(void)
1105bd9c17dSSaurabh Gorecha {
1115bd9c17dSSaurabh Gorecha /*
1125bd9c17dSSaurabh Gorecha * The GICv3 driver is initialized in EL3 and does not need
1135bd9c17dSSaurabh Gorecha * to be initialized again in SEL1. This is because the S-EL1
1145bd9c17dSSaurabh Gorecha * can use GIC system registers to manage interrupts and does
1155bd9c17dSSaurabh Gorecha * not need GIC interface base addresses to be configured.
1165bd9c17dSSaurabh Gorecha */
1175bd9c17dSSaurabh Gorecha gicv3_driver_init(&qti_gic_data);
1185bd9c17dSSaurabh Gorecha }
1195bd9c17dSSaurabh Gorecha
1205bd9c17dSSaurabh Gorecha /******************************************************************************
1215bd9c17dSSaurabh Gorecha * ARM common helper to initialize the GIC. Only invoked by BL31
1225bd9c17dSSaurabh Gorecha *****************************************************************************/
plat_qti_gic_init(void)1235bd9c17dSSaurabh Gorecha void plat_qti_gic_init(void)
1245bd9c17dSSaurabh Gorecha {
1255bd9c17dSSaurabh Gorecha unsigned int i;
1265bd9c17dSSaurabh Gorecha
1275bd9c17dSSaurabh Gorecha gicv3_distif_init();
1285bd9c17dSSaurabh Gorecha gicv3_rdistif_init(plat_my_core_pos());
1295bd9c17dSSaurabh Gorecha gicv3_cpuif_enable(plat_my_core_pos());
1305bd9c17dSSaurabh Gorecha
1315bd9c17dSSaurabh Gorecha /* Route secure spi interrupt to ANY. */
1325bd9c17dSSaurabh Gorecha for (i = 0; i < ARRAY_SIZE(qti_interrupt_props); i++) {
1335bd9c17dSSaurabh Gorecha unsigned int int_id = qti_interrupt_props[i].intr_num;
1345bd9c17dSSaurabh Gorecha
1355bd9c17dSSaurabh Gorecha if (plat_ic_is_spi(int_id)) {
1365bd9c17dSSaurabh Gorecha gicv3_set_spi_routing(int_id, GICV3_IRM_ANY, 0x0);
1375bd9c17dSSaurabh Gorecha }
1385bd9c17dSSaurabh Gorecha }
1395bd9c17dSSaurabh Gorecha }
1405bd9c17dSSaurabh Gorecha
gic_set_spi_routing(unsigned int id,unsigned int irm,u_register_t target)1415bd9c17dSSaurabh Gorecha void gic_set_spi_routing(unsigned int id, unsigned int irm, u_register_t target)
1425bd9c17dSSaurabh Gorecha {
1435bd9c17dSSaurabh Gorecha gicv3_set_spi_routing(id, irm, target);
1445bd9c17dSSaurabh Gorecha }
1455bd9c17dSSaurabh Gorecha
1465bd9c17dSSaurabh Gorecha /******************************************************************************
1475bd9c17dSSaurabh Gorecha * ARM common helper to enable the GIC CPU interface
1485bd9c17dSSaurabh Gorecha *****************************************************************************/
plat_qti_gic_cpuif_enable(void)1495bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_enable(void)
1505bd9c17dSSaurabh Gorecha {
1515bd9c17dSSaurabh Gorecha gicv3_cpuif_enable(plat_my_core_pos());
1525bd9c17dSSaurabh Gorecha }
1535bd9c17dSSaurabh Gorecha
1545bd9c17dSSaurabh Gorecha /******************************************************************************
1555bd9c17dSSaurabh Gorecha * ARM common helper to disable the GIC CPU interface
1565bd9c17dSSaurabh Gorecha *****************************************************************************/
plat_qti_gic_cpuif_disable(void)1575bd9c17dSSaurabh Gorecha void plat_qti_gic_cpuif_disable(void)
1585bd9c17dSSaurabh Gorecha {
1595bd9c17dSSaurabh Gorecha gicv3_cpuif_disable(plat_my_core_pos());
1605bd9c17dSSaurabh Gorecha }
1615bd9c17dSSaurabh Gorecha
1625bd9c17dSSaurabh Gorecha /******************************************************************************
1635bd9c17dSSaurabh Gorecha * ARM common helper to initialize the per-CPU redistributor interface in GICv3
1645bd9c17dSSaurabh Gorecha *****************************************************************************/
plat_qti_gic_pcpu_init(void)1655bd9c17dSSaurabh Gorecha void plat_qti_gic_pcpu_init(void)
1665bd9c17dSSaurabh Gorecha {
1675bd9c17dSSaurabh Gorecha gicv3_rdistif_init(plat_my_core_pos());
1685bd9c17dSSaurabh Gorecha }
1695bd9c17dSSaurabh Gorecha
1705bd9c17dSSaurabh Gorecha /******************************************************************************
1715bd9c17dSSaurabh Gorecha * ARM common helpers to power GIC redistributor interface
1725bd9c17dSSaurabh Gorecha *****************************************************************************/
plat_qti_gic_redistif_on(void)1735bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_on(void)
1745bd9c17dSSaurabh Gorecha {
1755bd9c17dSSaurabh Gorecha gicv3_rdistif_on(plat_my_core_pos());
1765bd9c17dSSaurabh Gorecha }
1775bd9c17dSSaurabh Gorecha
plat_qti_gic_redistif_off(void)1785bd9c17dSSaurabh Gorecha void plat_qti_gic_redistif_off(void)
1795bd9c17dSSaurabh Gorecha {
1805bd9c17dSSaurabh Gorecha gicv3_rdistif_off(plat_my_core_pos());
1815bd9c17dSSaurabh Gorecha }
182