blob: 0051049dd057ab622c3a26338aa2eed66eb065d3 [file] [log] [blame]
Aditya Angadid61740b2020-11-19 18:05:33 +05301/*
Rohit Mathewa0dd3072024-02-03 17:22:54 +00002 * Copyright (c) 2020-2024, Arm Limited and Contributors. All rights reserved.
Aditya Angadid61740b2020-11-19 18:05:33 +05303 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Aditya Angadiccae8a12021-08-09 09:38:58 +05307#include <common/debug.h>
8#include <drivers/arm/gic600_multichip.h>
9#include <plat/arm/common/plat_arm.h>
Aditya Angadid61740b2020-11-19 18:05:33 +053010#include <plat/common/platform.h>
Nishant Sharmab57fa112022-07-13 10:19:58 +010011#include <services/el3_spmc_ffa_memory.h>
Rohit Mathewa0dd3072024-02-03 17:22:54 +000012
13#include <nrd_plat.h>
14#include <nrd_soc_platform_def_v2.h>
Omkar Anand Kulkarni1f425992023-06-22 15:18:07 +053015#include <rdn2_ras.h>
Aditya Angadid61740b2020-11-19 18:05:33 +053016
Aditya Angadiccae8a12021-08-09 09:38:58 +053017#if defined(IMAGE_BL31)
Rohit Mathew644d9e22024-02-03 19:06:16 +000018#if (NRD_PLATFORM_VARIANT == 2)
Aditya Angadiccae8a12021-08-09 09:38:58 +053019static const mmap_region_t rdn2mc_dynamic_mmap[] = {
Rohit Mathew644d9e22024-02-03 19:06:16 +000020#if NRD_CHIP_COUNT > 1
Aditya Angadiccae8a12021-08-09 09:38:58 +053021 ARM_MAP_SHARED_RAM_REMOTE_CHIP(1),
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000022 NRD_MAP_DEVICE_REMOTE_CHIP(1),
Aditya Angadiccae8a12021-08-09 09:38:58 +053023#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000024#if NRD_CHIP_COUNT > 2
Aditya Angadiccae8a12021-08-09 09:38:58 +053025 ARM_MAP_SHARED_RAM_REMOTE_CHIP(2),
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000026 NRD_MAP_DEVICE_REMOTE_CHIP(2),
Aditya Angadiccae8a12021-08-09 09:38:58 +053027#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000028#if NRD_CHIP_COUNT > 3
Aditya Angadiccae8a12021-08-09 09:38:58 +053029 ARM_MAP_SHARED_RAM_REMOTE_CHIP(3),
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000030 NRD_MAP_DEVICE_REMOTE_CHIP(3),
Aditya Angadiccae8a12021-08-09 09:38:58 +053031#endif
32};
33#endif
34
Rohit Mathew644d9e22024-02-03 19:06:16 +000035#if (NRD_PLATFORM_VARIANT == 2)
Aditya Angadiccae8a12021-08-09 09:38:58 +053036static struct gic600_multichip_data rdn2mc_multichip_data __init = {
37 .rt_owner_base = PLAT_ARM_GICD_BASE,
38 .rt_owner = 0,
Rohit Mathew644d9e22024-02-03 19:06:16 +000039 .chip_count = NRD_CHIP_COUNT,
Aditya Angadiccae8a12021-08-09 09:38:58 +053040 .chip_addrs = {
41 PLAT_ARM_GICD_BASE >> 16,
Rohit Mathew644d9e22024-02-03 19:06:16 +000042#if NRD_CHIP_COUNT > 1
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000043 (PLAT_ARM_GICD_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(1)) >> 16,
Aditya Angadiccae8a12021-08-09 09:38:58 +053044#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000045#if NRD_CHIP_COUNT > 2
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000046 (PLAT_ARM_GICD_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(2)) >> 16,
Aditya Angadiccae8a12021-08-09 09:38:58 +053047#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000048#if NRD_CHIP_COUNT > 3
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000049 (PLAT_ARM_GICD_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(3)) >> 16,
Aditya Angadiccae8a12021-08-09 09:38:58 +053050#endif
51 },
52 .spi_ids = {
Varun Wadekar61286d22023-03-08 16:47:38 +000053 {PLAT_ARM_GICD_BASE, 32, 511},
Rohit Mathew644d9e22024-02-03 19:06:16 +000054 #if NRD_CHIP_COUNT > 1
Varun Wadekar61286d22023-03-08 16:47:38 +000055 {PLAT_ARM_GICD_BASE, 512, 991},
Aditya Angadiccae8a12021-08-09 09:38:58 +053056 #endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000057 #if NRD_CHIP_COUNT > 2
Varun Wadekar61286d22023-03-08 16:47:38 +000058 {PLAT_ARM_GICD_BASE, 4096, 4575},
Aditya Angadiccae8a12021-08-09 09:38:58 +053059 #endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000060 #if NRD_CHIP_COUNT > 3
Varun Wadekar61286d22023-03-08 16:47:38 +000061 {PLAT_ARM_GICD_BASE, 4576, 5055},
Aditya Angadiccae8a12021-08-09 09:38:58 +053062 #endif
63 }
64};
65#endif
66
Rohit Mathew644d9e22024-02-03 19:06:16 +000067#if (NRD_PLATFORM_VARIANT == 2)
Aditya Angadiccae8a12021-08-09 09:38:58 +053068static uintptr_t rdn2mc_multichip_gicr_frames[] = {
69 /* Chip 0's GICR Base */
70 PLAT_ARM_GICR_BASE,
Rohit Mathew644d9e22024-02-03 19:06:16 +000071#if NRD_CHIP_COUNT > 1
Aditya Angadiccae8a12021-08-09 09:38:58 +053072 /* Chip 1's GICR BASE */
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000073 PLAT_ARM_GICR_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(1),
Aditya Angadiccae8a12021-08-09 09:38:58 +053074#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000075#if NRD_CHIP_COUNT > 2
Aditya Angadiccae8a12021-08-09 09:38:58 +053076 /* Chip 2's GICR BASE */
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000077 PLAT_ARM_GICR_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(2),
Aditya Angadiccae8a12021-08-09 09:38:58 +053078#endif
Rohit Mathew644d9e22024-02-03 19:06:16 +000079#if NRD_CHIP_COUNT > 3
Aditya Angadiccae8a12021-08-09 09:38:58 +053080 /* Chip 3's GICR BASE */
Rohit Mathewaac0c3c2024-02-03 22:16:14 +000081 PLAT_ARM_GICR_BASE + NRD_REMOTE_CHIP_MEM_OFFSET(3),
Aditya Angadiccae8a12021-08-09 09:38:58 +053082#endif
83 UL(0) /* Zero Termination */
84};
85#endif
86#endif /* IMAGE_BL31 */
87
Rohit Mathew0ec6ed92024-02-03 18:39:10 +000088unsigned int plat_arm_nrd_get_platform_id(void)
Aditya Angadid61740b2020-11-19 18:05:33 +053089{
90 return mmio_read_32(SID_REG_BASE + SID_SYSTEM_ID_OFFSET)
91 & SID_SYSTEM_ID_PART_NUM_MASK;
92}
93
Rohit Mathew0ec6ed92024-02-03 18:39:10 +000094unsigned int plat_arm_nrd_get_config_id(void)
Aditya Angadid61740b2020-11-19 18:05:33 +053095{
96 return mmio_read_32(SID_REG_BASE + SID_SYSTEM_CFG_OFFSET);
97}
98
Rohit Mathew0ec6ed92024-02-03 18:39:10 +000099unsigned int plat_arm_nrd_get_multi_chip_mode(void)
Aditya Angadid61740b2020-11-19 18:05:33 +0530100{
101 return (mmio_read_32(SID_REG_BASE + SID_NODE_ID_OFFSET) &
102 SID_MULTI_CHIP_MODE_MASK) >>
103 SID_MULTI_CHIP_MODE_SHIFT;
104}
105
Aditya Angadiccae8a12021-08-09 09:38:58 +0530106#if defined(IMAGE_BL31)
Aditya Angadid61740b2020-11-19 18:05:33 +0530107void bl31_platform_setup(void)
108{
Rohit Mathew644d9e22024-02-03 19:06:16 +0000109#if (NRD_PLATFORM_VARIANT == 2)
Aditya Angadiccae8a12021-08-09 09:38:58 +0530110 int ret;
111 unsigned int i;
112
Rohit Mathew0ec6ed92024-02-03 18:39:10 +0000113 if (plat_arm_nrd_get_multi_chip_mode() == 0) {
Rohit Mathew644d9e22024-02-03 19:06:16 +0000114 ERROR("Chip Count is %u but multi-chip mode is not enabled\n",
115 NRD_CHIP_COUNT);
Aditya Angadiccae8a12021-08-09 09:38:58 +0530116 panic();
117 } else {
118 INFO("Enabling multi-chip support for RD-N2 variant\n");
119
120 for (i = 0; i < ARRAY_SIZE(rdn2mc_dynamic_mmap); i++) {
121 ret = mmap_add_dynamic_region(
122 rdn2mc_dynamic_mmap[i].base_pa,
123 rdn2mc_dynamic_mmap[i].base_va,
124 rdn2mc_dynamic_mmap[i].size,
125 rdn2mc_dynamic_mmap[i].attr);
126 if (ret != 0) {
127 ERROR("Failed to add dynamic mmap entry for"
128 " i: %d " "(ret=%d)\n", i, ret);
129 panic();
130 }
131 }
132
133 plat_arm_override_gicr_frames(
134 rdn2mc_multichip_gicr_frames);
135 gic600_multichip_init(&rdn2mc_multichip_data);
136 }
137#endif
138
Rohit Mathew0ec6ed92024-02-03 18:39:10 +0000139 nrd_bl31_common_platform_setup();
Omkar Anand Kulkarni1f425992023-06-22 15:18:07 +0530140
Manish Pandeyf90a73c2023-10-10 15:42:19 +0100141#if ENABLE_FEAT_RAS && FFH_SUPPORT
Rohit Mathew0ec6ed92024-02-03 18:39:10 +0000142 nrd_ras_platform_setup(&ras_config);
Omkar Anand Kulkarni1f425992023-06-22 15:18:07 +0530143#endif
Aditya Angadid61740b2020-11-19 18:05:33 +0530144}
Aditya Angadiccae8a12021-08-09 09:38:58 +0530145#endif /* IMAGE_BL31 */
Nishant Sharma6733a5f2022-03-26 00:34:05 +0000146
147#if SPMC_AT_EL3
148
149#define DATASTORE_SIZE 1024
150
151__section("arm_el3_tzc_dram") uint8_t plat_spmc_shmem_datastore[DATASTORE_SIZE];
152
153int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size)
154{
155 *datastore = plat_spmc_shmem_datastore;
156 *size = DATASTORE_SIZE;
157 return 0;
158}
Nishant Sharmab57fa112022-07-13 10:19:58 +0100159
160/*
161 * Add dummy implementations of memory management related platform hooks.
162 * Memory share/lend operation are not required on RdN2 platform.
163 */
164int plat_spmc_shmem_begin(struct ffa_mtd *desc)
165{
166 return 0;
167}
168
169int plat_spmc_shmem_reclaim(struct ffa_mtd *desc)
170{
171 return 0;
172}
Nishant Sharma44f285e2023-06-28 11:46:00 +0100173
174int plat_spmd_handle_group0_interrupt(uint32_t intid)
175{
176 /*
177 * As of now, there are no sources of Group0 secure interrupt enabled
178 * for RDN2.
179 */
180 (void)intid;
181 return -1;
182}
Nishant Sharma6733a5f2022-03-26 00:34:05 +0000183#endif