xref: /arm-trusted-firmware/plat/arm/board/rdn2/rdn2_plat.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2020-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <common/debug.h>
8*91f16700Schasinglulu #include <drivers/arm/gic600_multichip.h>
9*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h>
10*91f16700Schasinglulu #include <plat/common/platform.h>
11*91f16700Schasinglulu #include <services/el3_spmc_ffa_memory.h>
12*91f16700Schasinglulu #include <rdn2_ras.h>
13*91f16700Schasinglulu #include <sgi_soc_platform_def_v2.h>
14*91f16700Schasinglulu #include <sgi_plat.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #if defined(IMAGE_BL31)
17*91f16700Schasinglulu #if (CSS_SGI_PLATFORM_VARIANT == 2)
18*91f16700Schasinglulu static const mmap_region_t rdn2mc_dynamic_mmap[] = {
19*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 1
20*91f16700Schasinglulu 	ARM_MAP_SHARED_RAM_REMOTE_CHIP(1),
21*91f16700Schasinglulu 	CSS_SGI_MAP_DEVICE_REMOTE_CHIP(1),
22*91f16700Schasinglulu #endif
23*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 2
24*91f16700Schasinglulu 	ARM_MAP_SHARED_RAM_REMOTE_CHIP(2),
25*91f16700Schasinglulu 	CSS_SGI_MAP_DEVICE_REMOTE_CHIP(2),
26*91f16700Schasinglulu #endif
27*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 3
28*91f16700Schasinglulu 	ARM_MAP_SHARED_RAM_REMOTE_CHIP(3),
29*91f16700Schasinglulu 	CSS_SGI_MAP_DEVICE_REMOTE_CHIP(3),
30*91f16700Schasinglulu #endif
31*91f16700Schasinglulu };
32*91f16700Schasinglulu #endif
33*91f16700Schasinglulu 
34*91f16700Schasinglulu #if (CSS_SGI_PLATFORM_VARIANT == 2)
35*91f16700Schasinglulu static struct gic600_multichip_data rdn2mc_multichip_data __init = {
36*91f16700Schasinglulu 	.rt_owner_base = PLAT_ARM_GICD_BASE,
37*91f16700Schasinglulu 	.rt_owner = 0,
38*91f16700Schasinglulu 	.chip_count = CSS_SGI_CHIP_COUNT,
39*91f16700Schasinglulu 	.chip_addrs = {
40*91f16700Schasinglulu 		PLAT_ARM_GICD_BASE >> 16,
41*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 1
42*91f16700Schasinglulu 		(PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1)) >> 16,
43*91f16700Schasinglulu #endif
44*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 2
45*91f16700Schasinglulu 		(PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2)) >> 16,
46*91f16700Schasinglulu #endif
47*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 3
48*91f16700Schasinglulu 		(PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3)) >> 16,
49*91f16700Schasinglulu #endif
50*91f16700Schasinglulu 	},
51*91f16700Schasinglulu 	.spi_ids = {
52*91f16700Schasinglulu 		{PLAT_ARM_GICD_BASE, 32, 511},
53*91f16700Schasinglulu 	#if CSS_SGI_CHIP_COUNT > 1
54*91f16700Schasinglulu 		{PLAT_ARM_GICD_BASE, 512, 991},
55*91f16700Schasinglulu 	#endif
56*91f16700Schasinglulu 	#if CSS_SGI_CHIP_COUNT > 2
57*91f16700Schasinglulu 		{PLAT_ARM_GICD_BASE, 4096, 4575},
58*91f16700Schasinglulu 	#endif
59*91f16700Schasinglulu 	#if CSS_SGI_CHIP_COUNT > 3
60*91f16700Schasinglulu 		{PLAT_ARM_GICD_BASE, 4576, 5055},
61*91f16700Schasinglulu 	#endif
62*91f16700Schasinglulu 	}
63*91f16700Schasinglulu };
64*91f16700Schasinglulu #endif
65*91f16700Schasinglulu 
66*91f16700Schasinglulu #if (CSS_SGI_PLATFORM_VARIANT == 2)
67*91f16700Schasinglulu static uintptr_t rdn2mc_multichip_gicr_frames[] = {
68*91f16700Schasinglulu 	/* Chip 0's GICR Base */
69*91f16700Schasinglulu 	PLAT_ARM_GICR_BASE,
70*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 1
71*91f16700Schasinglulu 	/* Chip 1's GICR BASE */
72*91f16700Schasinglulu 	PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1),
73*91f16700Schasinglulu #endif
74*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 2
75*91f16700Schasinglulu 	/* Chip 2's GICR BASE */
76*91f16700Schasinglulu 	PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2),
77*91f16700Schasinglulu #endif
78*91f16700Schasinglulu #if CSS_SGI_CHIP_COUNT > 3
79*91f16700Schasinglulu 	/* Chip 3's GICR BASE */
80*91f16700Schasinglulu 	PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3),
81*91f16700Schasinglulu #endif
82*91f16700Schasinglulu 	UL(0)	/* Zero Termination */
83*91f16700Schasinglulu };
84*91f16700Schasinglulu #endif
85*91f16700Schasinglulu #endif /* IMAGE_BL31 */
86*91f16700Schasinglulu 
87*91f16700Schasinglulu unsigned int plat_arm_sgi_get_platform_id(void)
88*91f16700Schasinglulu {
89*91f16700Schasinglulu 	return mmio_read_32(SID_REG_BASE + SID_SYSTEM_ID_OFFSET)
90*91f16700Schasinglulu 			    & SID_SYSTEM_ID_PART_NUM_MASK;
91*91f16700Schasinglulu }
92*91f16700Schasinglulu 
93*91f16700Schasinglulu unsigned int plat_arm_sgi_get_config_id(void)
94*91f16700Schasinglulu {
95*91f16700Schasinglulu 	return mmio_read_32(SID_REG_BASE + SID_SYSTEM_CFG_OFFSET);
96*91f16700Schasinglulu }
97*91f16700Schasinglulu 
98*91f16700Schasinglulu unsigned int plat_arm_sgi_get_multi_chip_mode(void)
99*91f16700Schasinglulu {
100*91f16700Schasinglulu 	return (mmio_read_32(SID_REG_BASE + SID_NODE_ID_OFFSET) &
101*91f16700Schasinglulu 			     SID_MULTI_CHIP_MODE_MASK) >>
102*91f16700Schasinglulu 			     SID_MULTI_CHIP_MODE_SHIFT;
103*91f16700Schasinglulu }
104*91f16700Schasinglulu 
105*91f16700Schasinglulu #if defined(IMAGE_BL31)
106*91f16700Schasinglulu void bl31_platform_setup(void)
107*91f16700Schasinglulu {
108*91f16700Schasinglulu #if (CSS_SGI_PLATFORM_VARIANT == 2)
109*91f16700Schasinglulu 	int ret;
110*91f16700Schasinglulu 	unsigned int i;
111*91f16700Schasinglulu 
112*91f16700Schasinglulu 	if (plat_arm_sgi_get_multi_chip_mode() == 0) {
113*91f16700Schasinglulu 		ERROR("Chip Count is set to %u but multi-chip mode is not "
114*91f16700Schasinglulu 			"enabled\n", CSS_SGI_CHIP_COUNT);
115*91f16700Schasinglulu 		panic();
116*91f16700Schasinglulu 	} else {
117*91f16700Schasinglulu 		INFO("Enabling multi-chip support for RD-N2 variant\n");
118*91f16700Schasinglulu 
119*91f16700Schasinglulu 		for (i = 0; i < ARRAY_SIZE(rdn2mc_dynamic_mmap); i++) {
120*91f16700Schasinglulu 			ret = mmap_add_dynamic_region(
121*91f16700Schasinglulu 					rdn2mc_dynamic_mmap[i].base_pa,
122*91f16700Schasinglulu 					rdn2mc_dynamic_mmap[i].base_va,
123*91f16700Schasinglulu 					rdn2mc_dynamic_mmap[i].size,
124*91f16700Schasinglulu 					rdn2mc_dynamic_mmap[i].attr);
125*91f16700Schasinglulu 			if (ret != 0) {
126*91f16700Schasinglulu 				ERROR("Failed to add dynamic mmap entry for"
127*91f16700Schasinglulu 					" i: %d " "(ret=%d)\n", i, ret);
128*91f16700Schasinglulu 				panic();
129*91f16700Schasinglulu 			}
130*91f16700Schasinglulu 		}
131*91f16700Schasinglulu 
132*91f16700Schasinglulu 		plat_arm_override_gicr_frames(
133*91f16700Schasinglulu 			rdn2mc_multichip_gicr_frames);
134*91f16700Schasinglulu 		gic600_multichip_init(&rdn2mc_multichip_data);
135*91f16700Schasinglulu 	}
136*91f16700Schasinglulu #endif
137*91f16700Schasinglulu 
138*91f16700Schasinglulu 	sgi_bl31_common_platform_setup();
139*91f16700Schasinglulu 
140*91f16700Schasinglulu #if ENABLE_FEAT_RAS && FFH_SUPPORT
141*91f16700Schasinglulu 	sgi_ras_platform_setup(&ras_config);
142*91f16700Schasinglulu #endif
143*91f16700Schasinglulu }
144*91f16700Schasinglulu #endif /* IMAGE_BL31 */
145*91f16700Schasinglulu 
146*91f16700Schasinglulu #if SPMC_AT_EL3
147*91f16700Schasinglulu 
148*91f16700Schasinglulu #define DATASTORE_SIZE 1024
149*91f16700Schasinglulu 
150*91f16700Schasinglulu __section("arm_el3_tzc_dram") uint8_t plat_spmc_shmem_datastore[DATASTORE_SIZE];
151*91f16700Schasinglulu 
152*91f16700Schasinglulu int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size)
153*91f16700Schasinglulu {
154*91f16700Schasinglulu 	*datastore = plat_spmc_shmem_datastore;
155*91f16700Schasinglulu 	*size = DATASTORE_SIZE;
156*91f16700Schasinglulu 	return 0;
157*91f16700Schasinglulu }
158*91f16700Schasinglulu 
159*91f16700Schasinglulu /*
160*91f16700Schasinglulu  * Add dummy implementations of memory management related platform hooks.
161*91f16700Schasinglulu  * Memory share/lend operation are not required on RdN2 platform.
162*91f16700Schasinglulu  */
163*91f16700Schasinglulu int plat_spmc_shmem_begin(struct ffa_mtd *desc)
164*91f16700Schasinglulu {
165*91f16700Schasinglulu 	return 0;
166*91f16700Schasinglulu }
167*91f16700Schasinglulu 
168*91f16700Schasinglulu int plat_spmc_shmem_reclaim(struct ffa_mtd *desc)
169*91f16700Schasinglulu {
170*91f16700Schasinglulu 	return 0;
171*91f16700Schasinglulu }
172*91f16700Schasinglulu 
173*91f16700Schasinglulu int plat_spmd_handle_group0_interrupt(uint32_t intid)
174*91f16700Schasinglulu {
175*91f16700Schasinglulu 	/*
176*91f16700Schasinglulu 	 * As of now, there are no sources of Group0 secure interrupt enabled
177*91f16700Schasinglulu 	 * for RDN2.
178*91f16700Schasinglulu 	 */
179*91f16700Schasinglulu 	(void)intid;
180*91f16700Schasinglulu 	return -1;
181*91f16700Schasinglulu }
182*91f16700Schasinglulu #endif
183