blob: fe64bec6bb51dda402d172470de6b2074c061b09 [file] [log] [blame]
laurenw-arm8370c8c2020-05-12 10:58:11 -05001/*
Boyan Karatotevcb331822024-12-12 08:52:51 +00002 * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
laurenw-arm8370c8c2020-05-12 10:58:11 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <assert.h>
8#include <platform_def.h>
9
Claus Pedersen885e2682022-09-12 22:42:58 +000010#include <common/debug.h>
laurenw-arm8370c8c2020-05-12 10:58:11 -050011#include <common/interrupt_props.h>
12#include <drivers/arm/gicv3.h>
13#include <fconf_hw_config_getter.h>
14#include <lib/utils.h>
15#include <plat/arm/common/plat_arm.h>
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050016#include <plat/arm/common/fconf_sec_intr_config.h>
laurenw-arm8370c8c2020-05-12 10:58:11 -050017#include <plat/common/platform.h>
18
Manish V Badarkhef98630f2021-01-24 03:26:50 +000019#if FVP_GICR_REGION_PROTECTION
20/* To indicate GICR region of the core initialized as Read-Write */
21static bool fvp_gicr_rw_region_init[PLATFORM_CORE_COUNT] = {false};
22#endif /* FVP_GICR_REGION_PROTECTION */
23
laurenw-arm8370c8c2020-05-12 10:58:11 -050024/* Default GICR base address to be used for GICR probe. */
Boyan Karatotevcb331822024-12-12 08:52:51 +000025static uintptr_t __unused fvp_gicr_base_addrs[2] = { 0U };
laurenw-arm8370c8c2020-05-12 10:58:11 -050026
Boyan Karatotevcb331822024-12-12 08:52:51 +000027static const interrupt_prop_t __unused fvp_interrupt_props[] = {
laurenw-arm8370c8c2020-05-12 10:58:11 -050028 PLAT_ARM_G1S_IRQ_PROPS(INTR_GROUP1S),
29 PLAT_ARM_G0_IRQ_PROPS(INTR_GROUP0)
30};
31
Boyan Karatotevcb331822024-12-12 08:52:51 +000032extern gicv3_driver_data_t arm_gic_data;
laurenw-arm8370c8c2020-05-12 10:58:11 -050033
Manish V Badarkhef98630f2021-01-24 03:26:50 +000034/******************************************************************************
35 * This function gets called per core to make its redistributor frame rw
36 *****************************************************************************/
37static void fvp_gicv3_make_rdistrif_rw(void)
38{
39#if FVP_GICR_REGION_PROTECTION
40 unsigned int core_pos = plat_my_core_pos();
41
42 /* Make the redistributor frame RW if it is not done previously */
43 if (fvp_gicr_rw_region_init[core_pos] != true) {
44 int ret = xlat_change_mem_attributes(BASE_GICR_BASE +
45 (core_pos * BASE_GICR_SIZE),
46 BASE_GICR_SIZE,
47 MT_EXECUTE_NEVER |
48 MT_DEVICE | MT_RW |
49 MT_SECURE);
50
51 if (ret != 0) {
52 ERROR("Failed to make redistributor frame \
53 read write = %d\n", ret);
54 panic();
55 } else {
56 fvp_gicr_rw_region_init[core_pos] = true;
57 }
58 }
59#else
60 return;
61#endif /* FVP_GICR_REGION_PROTECTION */
62}
63
Boyan Karatotevcb331822024-12-12 08:52:51 +000064void fvp_pcpu_init(void)
laurenw-arm8370c8c2020-05-12 10:58:11 -050065{
Manish V Badarkhef98630f2021-01-24 03:26:50 +000066 fvp_gicv3_make_rdistrif_rw();
Boyan Karatotevcb331822024-12-12 08:52:51 +000067}
68
69void fvp_gic_driver_pre_init(void)
70{
71/* FCONF won't be used in these cases, so we couldn't do this */
72#if !(BL2_AT_EL3 || RESET_TO_BL31 || RESET_TO_SP_MIN)
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050073 /*
74 * Get GICD and GICR base addressed through FCONF APIs.
75 * FCONF is not supported in BL32 for FVP.
76 */
laurenw-arm8370c8c2020-05-12 10:58:11 -050077#if (!defined(__aarch64__) && defined(IMAGE_BL32)) || \
78 (defined(__aarch64__) && defined(IMAGE_BL31))
Boyan Karatotevcb331822024-12-12 08:52:51 +000079 arm_gic_data.gicd_base = (uintptr_t)FCONF_GET_PROPERTY(hw_config,
laurenw-arm8370c8c2020-05-12 10:58:11 -050080 gicv3_config,
81 gicd_base);
82 fvp_gicr_base_addrs[0] = FCONF_GET_PROPERTY(hw_config, gicv3_config,
83 gicr_base);
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050084#if SEC_INT_DESC_IN_FCONF
Boyan Karatotevcb331822024-12-12 08:52:51 +000085 arm_gic_data.interrupt_props = FCONF_GET_PROPERTY(hw_config,
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050086 sec_intr_prop, descriptor);
Boyan Karatotevcb331822024-12-12 08:52:51 +000087 arm_gic_data.interrupt_props_num = FCONF_GET_PROPERTY(hw_config,
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050088 sec_intr_prop, count);
89#else
Boyan Karatotevcb331822024-12-12 08:52:51 +000090 arm_gic_data.interrupt_props = fvp_interrupt_props;
91 arm_gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props);
Madhukar Pappireddy452d5e52020-06-02 09:26:30 -050092#endif
laurenw-arm8370c8c2020-05-12 10:58:11 -050093#else
Boyan Karatotevcb331822024-12-12 08:52:51 +000094 arm_gic_data.gicd_base = PLAT_ARM_GICD_BASE;
laurenw-arm8370c8c2020-05-12 10:58:11 -050095 fvp_gicr_base_addrs[0] = PLAT_ARM_GICR_BASE;
Boyan Karatotevcb331822024-12-12 08:52:51 +000096 arm_gic_data.interrupt_props = fvp_interrupt_props;
97 arm_gic_data.interrupt_props_num = ARRAY_SIZE(fvp_interrupt_props);
laurenw-arm8370c8c2020-05-12 10:58:11 -050098#endif
Boyan Karatotevcb331822024-12-12 08:52:51 +000099 plat_arm_override_gicr_frames(fvp_gicr_base_addrs);
100#endif /* !(BL2_AT_EL3 || RESET_TO_BL31 || RESET_TO_SP_MIN) */
laurenw-arm8370c8c2020-05-12 10:58:11 -0500101}