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