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 *****************************************************************************/
fvp_gicv3_make_rdistrif_rw(void)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
fvp_pcpu_init(void)61cb331826SBoyan Karatotev void fvp_pcpu_init(void)
628370c8ceSlaurenw-arm {
63f98630fbSManish V Badarkhe fvp_gicv3_make_rdistrif_rw();
64cb331826SBoyan Karatotev }
65cb331826SBoyan Karatotev
fvp_gic_driver_pre_init(void)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