1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2020, 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 <sgi_soc_platform_def.h> 12*91f16700Schasinglulu #include <sgi_plat.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #if defined(IMAGE_BL31) 15*91f16700Schasinglulu static const mmap_region_t rdv1mc_dynamic_mmap[] = { 16*91f16700Schasinglulu ARM_MAP_SHARED_RAM_REMOTE_CHIP(1), 17*91f16700Schasinglulu CSS_SGI_MAP_DEVICE_REMOTE_CHIP(1), 18*91f16700Schasinglulu SOC_CSS_MAP_DEVICE_REMOTE_CHIP(1), 19*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 2) 20*91f16700Schasinglulu ARM_MAP_SHARED_RAM_REMOTE_CHIP(2), 21*91f16700Schasinglulu CSS_SGI_MAP_DEVICE_REMOTE_CHIP(2), 22*91f16700Schasinglulu SOC_CSS_MAP_DEVICE_REMOTE_CHIP(2), 23*91f16700Schasinglulu #endif 24*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 3) 25*91f16700Schasinglulu ARM_MAP_SHARED_RAM_REMOTE_CHIP(3), 26*91f16700Schasinglulu CSS_SGI_MAP_DEVICE_REMOTE_CHIP(3), 27*91f16700Schasinglulu SOC_CSS_MAP_DEVICE_REMOTE_CHIP(3) 28*91f16700Schasinglulu #endif 29*91f16700Schasinglulu }; 30*91f16700Schasinglulu 31*91f16700Schasinglulu static struct gic600_multichip_data rdv1mc_multichip_data __init = { 32*91f16700Schasinglulu .rt_owner_base = PLAT_ARM_GICD_BASE, 33*91f16700Schasinglulu .rt_owner = 0, 34*91f16700Schasinglulu .chip_count = CSS_SGI_CHIP_COUNT, 35*91f16700Schasinglulu .chip_addrs = { 36*91f16700Schasinglulu PLAT_ARM_GICD_BASE >> 16, 37*91f16700Schasinglulu (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1)) >> 16, 38*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 2) 39*91f16700Schasinglulu (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2)) >> 16, 40*91f16700Schasinglulu #endif 41*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 3) 42*91f16700Schasinglulu (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3)) >> 16, 43*91f16700Schasinglulu #endif 44*91f16700Schasinglulu }, 45*91f16700Schasinglulu .spi_ids = { 46*91f16700Schasinglulu {PLAT_ARM_GICD_BASE, 32, 255}, 47*91f16700Schasinglulu {0, 0, 0}, 48*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 2) 49*91f16700Schasinglulu {0, 0, 0}, 50*91f16700Schasinglulu #endif 51*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 3) 52*91f16700Schasinglulu {0, 0, 0}, 53*91f16700Schasinglulu #endif 54*91f16700Schasinglulu } 55*91f16700Schasinglulu }; 56*91f16700Schasinglulu 57*91f16700Schasinglulu static uintptr_t rdv1mc_multichip_gicr_frames[] = { 58*91f16700Schasinglulu /* Chip 0's GICR Base */ 59*91f16700Schasinglulu PLAT_ARM_GICR_BASE, 60*91f16700Schasinglulu /* Chip 1's GICR BASE */ 61*91f16700Schasinglulu PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1), 62*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 2) 63*91f16700Schasinglulu /* Chip 2's GICR BASE */ 64*91f16700Schasinglulu PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2), 65*91f16700Schasinglulu #endif 66*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 3) 67*91f16700Schasinglulu /* Chip 3's GICR BASE */ 68*91f16700Schasinglulu PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3), 69*91f16700Schasinglulu #endif 70*91f16700Schasinglulu UL(0) /* Zero Termination */ 71*91f16700Schasinglulu }; 72*91f16700Schasinglulu #endif /* IMAGE_BL31 */ 73*91f16700Schasinglulu 74*91f16700Schasinglulu unsigned int plat_arm_sgi_get_platform_id(void) 75*91f16700Schasinglulu { 76*91f16700Schasinglulu return mmio_read_32(SID_REG_BASE + SID_SYSTEM_ID_OFFSET) 77*91f16700Schasinglulu & SID_SYSTEM_ID_PART_NUM_MASK; 78*91f16700Schasinglulu } 79*91f16700Schasinglulu 80*91f16700Schasinglulu unsigned int plat_arm_sgi_get_config_id(void) 81*91f16700Schasinglulu { 82*91f16700Schasinglulu return mmio_read_32(SID_REG_BASE + SID_SYSTEM_CFG_OFFSET); 83*91f16700Schasinglulu } 84*91f16700Schasinglulu 85*91f16700Schasinglulu unsigned int plat_arm_sgi_get_multi_chip_mode(void) 86*91f16700Schasinglulu { 87*91f16700Schasinglulu return (mmio_read_32(SID_REG_BASE + SID_NODE_ID_OFFSET) & 88*91f16700Schasinglulu SID_MULTI_CHIP_MODE_MASK) >> SID_MULTI_CHIP_MODE_SHIFT; 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu /* 92*91f16700Schasinglulu * bl31_platform_setup_function is guarded by IMAGE_BL31 macro because 93*91f16700Schasinglulu * PLAT_XLAT_TABLES_DYNAMIC macro is set to build only for BL31 and not 94*91f16700Schasinglulu * for other stages. 95*91f16700Schasinglulu */ 96*91f16700Schasinglulu #if defined(IMAGE_BL31) 97*91f16700Schasinglulu void bl31_platform_setup(void) 98*91f16700Schasinglulu { 99*91f16700Schasinglulu int ret; 100*91f16700Schasinglulu unsigned int i; 101*91f16700Schasinglulu 102*91f16700Schasinglulu if ((plat_arm_sgi_get_multi_chip_mode() == 0) && 103*91f16700Schasinglulu (CSS_SGI_CHIP_COUNT > 1)) { 104*91f16700Schasinglulu ERROR("Chip Count is set to %u but multi-chip mode is not " 105*91f16700Schasinglulu "enabled\n", CSS_SGI_CHIP_COUNT); 106*91f16700Schasinglulu panic(); 107*91f16700Schasinglulu } else if ((plat_arm_sgi_get_multi_chip_mode() == 1) && 108*91f16700Schasinglulu (CSS_SGI_CHIP_COUNT > 1)) { 109*91f16700Schasinglulu INFO("Enabling support for multi-chip in RD-V1-MC\n"); 110*91f16700Schasinglulu 111*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(rdv1mc_dynamic_mmap); i++) { 112*91f16700Schasinglulu ret = mmap_add_dynamic_region( 113*91f16700Schasinglulu rdv1mc_dynamic_mmap[i].base_pa, 114*91f16700Schasinglulu rdv1mc_dynamic_mmap[i].base_va, 115*91f16700Schasinglulu rdv1mc_dynamic_mmap[i].size, 116*91f16700Schasinglulu rdv1mc_dynamic_mmap[i].attr); 117*91f16700Schasinglulu if (ret != 0) { 118*91f16700Schasinglulu ERROR("Failed to add dynamic mmap entry " 119*91f16700Schasinglulu "(ret=%d)\n", ret); 120*91f16700Schasinglulu panic(); 121*91f16700Schasinglulu } 122*91f16700Schasinglulu } 123*91f16700Schasinglulu 124*91f16700Schasinglulu plat_arm_override_gicr_frames( 125*91f16700Schasinglulu rdv1mc_multichip_gicr_frames); 126*91f16700Schasinglulu gic600_multichip_init(&rdv1mc_multichip_data); 127*91f16700Schasinglulu } 128*91f16700Schasinglulu 129*91f16700Schasinglulu sgi_bl31_common_platform_setup(); 130*91f16700Schasinglulu } 131*91f16700Schasinglulu #endif /* IMAGE_BL31 */ 132