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 24cb331826SBoyan Karatotev static const interrupt_prop_t __unused fvp_interrupt_props[] = { 258370c8ceSlaurenw-arm PLAT_ARM_G1S_IRQ_PROPS(INTR_GROUP1S), 268370c8ceSlaurenw-arm PLAT_ARM_G0_IRQ_PROPS(INTR_GROUP0) 278370c8ceSlaurenw-arm }; 288370c8ceSlaurenw-arm 29c5c54e20SBoyan Karatotev extern gicv3_driver_data_t gic_data; 308370c8ceSlaurenw-arm 31f98630fbSManish V Badarkhe /****************************************************************************** 32f98630fbSManish V Badarkhe * This function gets called per core to make its redistributor frame rw 33f98630fbSManish V Badarkhe *****************************************************************************/ 34f98630fbSManish V Badarkhe static void fvp_gicv3_make_rdistrif_rw(void) 35f98630fbSManish V Badarkhe { 36f98630fbSManish V Badarkhe #if FVP_GICR_REGION_PROTECTION 37f98630fbSManish V Badarkhe unsigned int core_pos = plat_my_core_pos(); 38f98630fbSManish V Badarkhe 39f98630fbSManish V Badarkhe /* Make the redistributor frame RW if it is not done previously */ 40f98630fbSManish V Badarkhe if (fvp_gicr_rw_region_init[core_pos] != true) { 41f98630fbSManish V Badarkhe int ret = xlat_change_mem_attributes(BASE_GICR_BASE + 42f98630fbSManish V Badarkhe (core_pos * BASE_GICR_SIZE), 43f98630fbSManish V Badarkhe BASE_GICR_SIZE, 44f98630fbSManish V Badarkhe MT_EXECUTE_NEVER | 45f98630fbSManish V Badarkhe MT_DEVICE | MT_RW | 46f98630fbSManish V Badarkhe MT_SECURE); 47f98630fbSManish V Badarkhe 48f98630fbSManish V Badarkhe if (ret != 0) { 49f98630fbSManish V Badarkhe ERROR("Failed to make redistributor frame \ 50f98630fbSManish V Badarkhe read write = %d\n", ret); 51f98630fbSManish V Badarkhe panic(); 52f98630fbSManish V Badarkhe } else { 53f98630fbSManish V Badarkhe fvp_gicr_rw_region_init[core_pos] = true; 54f98630fbSManish V Badarkhe } 55f98630fbSManish V Badarkhe } 56f98630fbSManish V Badarkhe #else 57f98630fbSManish V Badarkhe return; 58f98630fbSManish V Badarkhe #endif /* FVP_GICR_REGION_PROTECTION */ 59f98630fbSManish V Badarkhe } 60f98630fbSManish V Badarkhe 61cb331826SBoyan Karatotev void fvp_pcpu_init(void) 628370c8ceSlaurenw-arm { 63f98630fbSManish V Badarkhe fvp_gicv3_make_rdistrif_rw(); 64cb331826SBoyan Karatotev } 65cb331826SBoyan Karatotev 66cb331826SBoyan Karatotev void fvp_gic_driver_pre_init(void) 67cb331826SBoyan Karatotev { 68cb331826SBoyan Karatotev /* FCONF won't be used in these cases, so we couldn't do this */ 69f856626bSBoyan Karatotev #if !(RESET_TO_BL31 || RESET_TO_SP_MIN || RESET_TO_BL2) 70452d5e5eSMadhukar Pappireddy /* 71452d5e5eSMadhukar Pappireddy * Get GICD and GICR base addressed through FCONF APIs. 72452d5e5eSMadhukar Pappireddy * FCONF is not supported in BL32 for FVP. 73452d5e5eSMadhukar Pappireddy */ 748370c8ceSlaurenw-arm #if (!defined(__aarch64__) && defined(IMAGE_BL32)) || \ 758370c8ceSlaurenw-arm (defined(__aarch64__) && defined(IMAGE_BL31)) 76c5c54e20SBoyan Karatotev gic_data.gicd_base = (uintptr_t)FCONF_GET_PROPERTY(hw_config, 778370c8ceSlaurenw-arm gicv3_config, 788370c8ceSlaurenw-arm gicd_base); 79*1d59d686SBoyan Karatotev arm_gicr_base_addrs[0] = FCONF_GET_PROPERTY(hw_config, gicv3_config, 808370c8ceSlaurenw-arm gicr_base); 81452d5e5eSMadhukar Pappireddy #if SEC_INT_DESC_IN_FCONF 82c5c54e20SBoyan Karatotev gic_data.interrupt_props = FCONF_GET_PROPERTY(hw_config, 83452d5e5eSMadhukar Pappireddy sec_intr_prop, descriptor); 84c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = FCONF_GET_PROPERTY(hw_config, 85452d5e5eSMadhukar Pappireddy sec_intr_prop, count); 86452d5e5eSMadhukar Pappireddy #else 87c5c54e20SBoyan Karatotev gic_data.interrupt_props = fvp_interrupt_props; 88c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props); 89452d5e5eSMadhukar Pappireddy #endif 908370c8ceSlaurenw-arm #else 91c5c54e20SBoyan Karatotev gic_data.gicd_base = PLAT_ARM_GICD_BASE; 92*1d59d686SBoyan Karatotev arm_gicr_base_addrs[0] = PLAT_ARM_GICR_BASE; 93c5c54e20SBoyan Karatotev gic_data.interrupt_props = fvp_interrupt_props; 94c5c54e20SBoyan Karatotev gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props); 958370c8ceSlaurenw-arm #endif 96f856626bSBoyan Karatotev #endif /* !(RESET_TO_BL31 || RESET_TO_SP_MIN || RESET_TO_BL2) */ 97*1d59d686SBoyan Karatotev gic_set_gicr_frames(arm_gicr_base_addrs); 988370c8ceSlaurenw-arm } 99