18370c8ceSlaurenw-arm /* 2cb331826SBoyan Karatotev * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. 38370c8ceSlaurenw-arm * 48370c8ceSlaurenw-arm * SPDX-License-Identifier: BSD-3-Clause 58370c8ceSlaurenw-arm */ 68370c8ceSlaurenw-arm 78370c8ceSlaurenw-arm #include <assert.h> 88370c8ceSlaurenw-arm #include <platform_def.h> 98370c8ceSlaurenw-arm 10885e2683SClaus Pedersen #include <common/debug.h> 118370c8ceSlaurenw-arm #include <common/interrupt_props.h> 128370c8ceSlaurenw-arm #include <drivers/arm/gicv3.h> 138370c8ceSlaurenw-arm #include <fconf_hw_config_getter.h> 148370c8ceSlaurenw-arm #include <lib/utils.h> 158370c8ceSlaurenw-arm #include <plat/arm/common/plat_arm.h> 16452d5e5eSMadhukar Pappireddy #include <plat/arm/common/fconf_sec_intr_config.h> 178370c8ceSlaurenw-arm #include <plat/common/platform.h> 188370c8ceSlaurenw-arm 19f98630fbSManish V Badarkhe #if FVP_GICR_REGION_PROTECTION 20f98630fbSManish V Badarkhe /* To indicate GICR region of the core initialized as Read-Write */ 21f98630fbSManish V Badarkhe static bool fvp_gicr_rw_region_init[PLATFORM_CORE_COUNT] = {false}; 22f98630fbSManish V Badarkhe #endif /* FVP_GICR_REGION_PROTECTION */ 23f98630fbSManish V Badarkhe 248370c8ceSlaurenw-arm /* Default GICR base address to be used for GICR probe. */ 25cb331826SBoyan Karatotev static uintptr_t __unused fvp_gicr_base_addrs[2] = { 0U }; 268370c8ceSlaurenw-arm 27cb331826SBoyan Karatotev static const interrupt_prop_t __unused fvp_interrupt_props[] = { 288370c8ceSlaurenw-arm PLAT_ARM_G1S_IRQ_PROPS(INTR_GROUP1S), 298370c8ceSlaurenw-arm PLAT_ARM_G0_IRQ_PROPS(INTR_GROUP0) 308370c8ceSlaurenw-arm }; 318370c8ceSlaurenw-arm 32*c5c54e20SBoyan Karatotev extern gicv3_driver_data_t gic_data; 338370c8ceSlaurenw-arm 34f98630fbSManish V Badarkhe /****************************************************************************** 35f98630fbSManish V Badarkhe * This function gets called per core to make its redistributor frame rw 36f98630fbSManish V Badarkhe *****************************************************************************/ 37f98630fbSManish V Badarkhe static void fvp_gicv3_make_rdistrif_rw(void) 38f98630fbSManish V Badarkhe { 39f98630fbSManish V Badarkhe #if FVP_GICR_REGION_PROTECTION 40f98630fbSManish V Badarkhe unsigned int core_pos = plat_my_core_pos(); 41f98630fbSManish V Badarkhe 42f98630fbSManish V Badarkhe /* Make the redistributor frame RW if it is not done previously */ 43f98630fbSManish V Badarkhe if (fvp_gicr_rw_region_init[core_pos] != true) { 44f98630fbSManish V Badarkhe int ret = xlat_change_mem_attributes(BASE_GICR_BASE + 45f98630fbSManish V Badarkhe (core_pos * BASE_GICR_SIZE), 46f98630fbSManish V Badarkhe BASE_GICR_SIZE, 47f98630fbSManish V Badarkhe MT_EXECUTE_NEVER | 48f98630fbSManish V Badarkhe MT_DEVICE | MT_RW | 49f98630fbSManish V Badarkhe MT_SECURE); 50f98630fbSManish V Badarkhe 51f98630fbSManish V Badarkhe if (ret != 0) { 52f98630fbSManish V Badarkhe ERROR("Failed to make redistributor frame \ 53f98630fbSManish V Badarkhe read write = %d\n", ret); 54f98630fbSManish V Badarkhe panic(); 55f98630fbSManish V Badarkhe } else { 56f98630fbSManish V Badarkhe fvp_gicr_rw_region_init[core_pos] = true; 57f98630fbSManish V Badarkhe } 58f98630fbSManish V Badarkhe } 59f98630fbSManish V Badarkhe #else 60f98630fbSManish V Badarkhe return; 61f98630fbSManish V Badarkhe #endif /* FVP_GICR_REGION_PROTECTION */ 62f98630fbSManish V Badarkhe } 63f98630fbSManish V Badarkhe 64cb331826SBoyan Karatotev void fvp_pcpu_init(void) 658370c8ceSlaurenw-arm { 66f98630fbSManish V Badarkhe fvp_gicv3_make_rdistrif_rw(); 67cb331826SBoyan Karatotev } 68cb331826SBoyan Karatotev 69cb331826SBoyan Karatotev void fvp_gic_driver_pre_init(void) 70cb331826SBoyan Karatotev { 71cb331826SBoyan Karatotev /* FCONF won't be used in these cases, so we couldn't do this */ 725d893410SBoyan Karatotev #if !(BL2_AT_EL3 || RESET_TO_BL31 || RESET_TO_SP_MIN || RESET_TO_BL2) 73452d5e5eSMadhukar Pappireddy /* 74452d5e5eSMadhukar Pappireddy * Get GICD and GICR base addressed through FCONF APIs. 75452d5e5eSMadhukar Pappireddy * FCONF is not supported in BL32 for FVP. 76452d5e5eSMadhukar Pappireddy */ 778370c8ceSlaurenw-arm #if (!defined(__aarch64__) && defined(IMAGE_BL32)) || \ 788370c8ceSlaurenw-arm (defined(__aarch64__) && defined(IMAGE_BL31)) 79*c5c54e20SBoyan Karatotev gic_data.gicd_base = (uintptr_t)FCONF_GET_PROPERTY(hw_config, 808370c8ceSlaurenw-arm gicv3_config, 818370c8ceSlaurenw-arm gicd_base); 828370c8ceSlaurenw-arm fvp_gicr_base_addrs[0] = FCONF_GET_PROPERTY(hw_config, gicv3_config, 838370c8ceSlaurenw-arm gicr_base); 84452d5e5eSMadhukar Pappireddy #if SEC_INT_DESC_IN_FCONF 85*c5c54e20SBoyan Karatotev gic_data.interrupt_props = FCONF_GET_PROPERTY(hw_config, 86452d5e5eSMadhukar Pappireddy sec_intr_prop, descriptor); 87*c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = FCONF_GET_PROPERTY(hw_config, 88452d5e5eSMadhukar Pappireddy sec_intr_prop, count); 89452d5e5eSMadhukar Pappireddy #else 90*c5c54e20SBoyan Karatotev gic_data.interrupt_props = fvp_interrupt_props; 91*c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props); 92452d5e5eSMadhukar Pappireddy #endif 938370c8ceSlaurenw-arm #else 94*c5c54e20SBoyan Karatotev gic_data.gicd_base = PLAT_ARM_GICD_BASE; 958370c8ceSlaurenw-arm fvp_gicr_base_addrs[0] = PLAT_ARM_GICR_BASE; 96*c5c54e20SBoyan Karatotev gic_data.interrupt_props = fvp_interrupt_props; 97*c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props); 988370c8ceSlaurenw-arm #endif 99cb331826SBoyan Karatotev plat_arm_override_gicr_frames(fvp_gicr_base_addrs); 1005d893410SBoyan Karatotev #endif /* !(BL2_AT_EL3 || RESET_TO_BL31 || RESET_TO_SP_MIN || RESET_TO_BL2) */ 1018370c8ceSlaurenw-arm } 102