1 /* 2 * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef SGI_BASE_PLATFORM_DEF_H 8 #define SGI_BASE_PLATFORM_DEF_H 9 10 #include <lib/utils_def.h> 11 #include <lib/xlat_tables/xlat_tables_defs.h> 12 #include <plat/arm/common/arm_def.h> 13 #include <plat/arm/common/arm_spm_def.h> 14 #include <plat/arm/css/common/css_def.h> 15 #include <plat/common/common_def.h> 16 17 #define PLATFORM_CORE_COUNT (CSS_SGI_CHIP_COUNT * \ 18 PLAT_ARM_CLUSTER_COUNT * \ 19 CSS_SGI_MAX_CPUS_PER_CLUSTER * \ 20 CSS_SGI_MAX_PE_PER_CPU) 21 22 #define PLAT_ARM_TRUSTED_SRAM_SIZE 0x00080000 /* 512 KB */ 23 24 /* Remote chip address offset */ 25 #define CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) \ 26 ((ULL(1) << CSS_SGI_ADDR_BITS_PER_CHIP) * (n)) 27 28 /* 29 * PLAT_ARM_MMAP_ENTRIES depends on the number of entries in the 30 * plat_arm_mmap array defined for each BL stage. In addition to that, on 31 * multi-chip platforms, address regions on each of the remote chips are 32 * also mapped. In BL31, for instance, three address regions on the remote 33 * chips are accessed - secure ram, css device and soc device regions. 34 */ 35 #if defined(IMAGE_BL31) 36 # if SPM_MM || (SPMC_AT_EL3 && SPMC_AT_EL3_SEL0_SP) 37 # define PLAT_ARM_MMAP_ENTRIES (10 + ((CSS_SGI_CHIP_COUNT - 1) * 3)) 38 # define MAX_XLAT_TABLES (8 + ((CSS_SGI_CHIP_COUNT - 1) * 3)) 39 # define PLAT_SP_IMAGE_MMAP_REGIONS 12 40 # define PLAT_SP_IMAGE_MAX_XLAT_TABLES 14 41 # else 42 # define PLAT_ARM_MMAP_ENTRIES (5 + ((CSS_SGI_CHIP_COUNT - 1) * 3)) 43 # define MAX_XLAT_TABLES (6 + ((CSS_SGI_CHIP_COUNT - 1) * 3)) 44 # endif 45 #elif defined(IMAGE_BL32) 46 # define PLAT_ARM_MMAP_ENTRIES 8 47 # define MAX_XLAT_TABLES 5 48 #elif defined(IMAGE_BL2) 49 # define PLAT_ARM_MMAP_ENTRIES (11 + (CSS_SGI_CHIP_COUNT - 1)) 50 51 /* 52 * MAX_XLAT_TABLES entries need to be doubled because when the address width 53 * exceeds 40 bits an additional level of translation is required. In case of 54 * multichip platforms peripherals also fall into address space with width 55 * > 40 bits 56 * 57 */ 58 # define MAX_XLAT_TABLES (7 + ((CSS_SGI_CHIP_COUNT - 1) * 2)) 59 #elif !USE_ROMLIB 60 # define PLAT_ARM_MMAP_ENTRIES 11 61 # define MAX_XLAT_TABLES 7 62 #else 63 # define PLAT_ARM_MMAP_ENTRIES 12 64 # define MAX_XLAT_TABLES 6 65 #endif 66 67 /* 68 * PLAT_ARM_MAX_BL1_RW_SIZE is calculated using the current BL1 RW debug size 69 * plus a little space for growth. 70 */ 71 #define PLAT_ARM_MAX_BL1_RW_SIZE (64 * 1024) /* 64 KB */ 72 73 /* 74 * PLAT_ARM_MAX_ROMLIB_RW_SIZE is define to use a full page 75 */ 76 77 #if USE_ROMLIB 78 #define PLAT_ARM_MAX_ROMLIB_RW_SIZE 0x1000 79 #define PLAT_ARM_MAX_ROMLIB_RO_SIZE 0xe000 80 #else 81 #define PLAT_ARM_MAX_ROMLIB_RW_SIZE 0 82 #define PLAT_ARM_MAX_ROMLIB_RO_SIZE 0 83 #endif 84 85 /* 86 * PLAT_ARM_MAX_BL2_SIZE is calculated using the current BL2 debug size plus a 87 * little space for growth. Additional 8KiB space is added per chip in 88 * order to accommodate the additional level of translation required for "TZC" 89 * peripheral access which lies in >4TB address space. 90 * 91 */ 92 #if TRUSTED_BOARD_BOOT 93 # define PLAT_ARM_MAX_BL2_SIZE (0x20000 + ((CSS_SGI_CHIP_COUNT - 1) * \ 94 0x2000)) 95 #else 96 # define PLAT_ARM_MAX_BL2_SIZE (0x14000 + ((CSS_SGI_CHIP_COUNT - 1) * \ 97 0x2000)) 98 #endif 99 100 /* 101 * Since BL31 NOBITS overlays BL2 and BL1-RW, PLAT_ARM_MAX_BL31_SIZE is 102 * calculated using the current BL31 PROGBITS debug size plus the sizes of BL2 103 * and BL1-RW. CSS_SGI_BL31_SIZE - is tuned with respect to the actual BL31 104 * PROGBITS size which is around 64-68KB at the time this change is being made. 105 * A buffer of ~35KB is added to account for future expansion of the image, 106 * making it a total of 100KB. 107 */ 108 #define CSS_SGI_BL31_SIZE (100 * 1024) /* 100 KB */ 109 #define PLAT_ARM_MAX_BL31_SIZE (CSS_SGI_BL31_SIZE + \ 110 PLAT_ARM_MAX_BL2_SIZE + \ 111 PLAT_ARM_MAX_BL1_RW_SIZE) 112 113 /* 114 * Size of cacheable stacks 115 */ 116 #if defined(IMAGE_BL1) 117 # if TRUSTED_BOARD_BOOT 118 # define PLATFORM_STACK_SIZE 0x1000 119 # else 120 # define PLATFORM_STACK_SIZE 0x440 121 # endif 122 #elif defined(IMAGE_BL2) 123 # if TRUSTED_BOARD_BOOT 124 # define PLATFORM_STACK_SIZE 0x1000 125 # else 126 # define PLATFORM_STACK_SIZE 0x400 127 # endif 128 #elif defined(IMAGE_BL2U) 129 # define PLATFORM_STACK_SIZE 0x400 130 #elif defined(IMAGE_BL31) 131 # if SPM_MM 132 # define PLATFORM_STACK_SIZE 0x500 133 # else 134 # define PLATFORM_STACK_SIZE 0x400 135 # endif 136 #elif defined(IMAGE_BL32) 137 # define PLATFORM_STACK_SIZE 0x440 138 #endif 139 140 /* PL011 UART related constants */ 141 #define SOC_CSS_SEC_UART_BASE UL(0x2A410000) 142 #define SOC_CSS_NSEC_UART_BASE UL(0x2A400000) 143 #define SOC_CSS_UART_SIZE UL(0x10000) 144 #define SOC_CSS_UART_CLK_IN_HZ UL(7372800) 145 146 /* UART related constants */ 147 #define PLAT_ARM_BOOT_UART_BASE SOC_CSS_SEC_UART_BASE 148 #define PLAT_ARM_BOOT_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ 149 150 #define PLAT_ARM_RUN_UART_BASE SOC_CSS_SEC_UART_BASE 151 #define PLAT_ARM_RUN_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ 152 153 #define PLAT_ARM_CRASH_UART_BASE SOC_CSS_SEC_UART_BASE 154 #define PLAT_ARM_CRASH_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ 155 156 #define PLAT_ARM_NSTIMER_FRAME_ID 0 157 158 #define PLAT_ARM_TRUSTED_ROM_BASE 0x0 159 #define PLAT_ARM_TRUSTED_ROM_SIZE 0x00080000 /* 512KB */ 160 161 #define PLAT_ARM_NSRAM_BASE 0x06000000 162 #define PLAT_ARM_NSRAM_SIZE 0x00080000 /* 512KB */ 163 164 #define PLAT_ARM_DRAM2_BASE ULL(0x8080000000) 165 #define PLAT_ARM_DRAM2_SIZE ULL(0x180000000) 166 167 #define PLAT_ARM_G1S_IRQ_PROPS(grp) CSS_G1S_IRQ_PROPS(grp) 168 #define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp) 169 170 #define CSS_SGI_DEVICE_BASE (0x20000000) 171 #define CSS_SGI_DEVICE_SIZE (0x20000000) 172 #define CSS_SGI_MAP_DEVICE MAP_REGION_FLAT( \ 173 CSS_SGI_DEVICE_BASE, \ 174 CSS_SGI_DEVICE_SIZE, \ 175 MT_DEVICE | MT_RW | MT_SECURE) 176 177 #define ARM_MAP_SHARED_RAM_REMOTE_CHIP(n) \ 178 MAP_REGION_FLAT( \ 179 CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + \ 180 ARM_SHARED_RAM_BASE, \ 181 ARM_SHARED_RAM_SIZE, \ 182 MT_NON_CACHEABLE | MT_RW | MT_SECURE \ 183 ) 184 185 #define CSS_SGI_MAP_DEVICE_REMOTE_CHIP(n) \ 186 MAP_REGION_FLAT( \ 187 CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + \ 188 CSS_SGI_DEVICE_BASE, \ 189 CSS_SGI_DEVICE_SIZE, \ 190 MT_DEVICE | MT_RW | MT_SECURE \ 191 ) 192 193 #define SOC_CSS_MAP_DEVICE_REMOTE_CHIP(n) \ 194 MAP_REGION_FLAT( \ 195 CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + \ 196 SOC_CSS_DEVICE_BASE, \ 197 SOC_CSS_DEVICE_SIZE, \ 198 MT_DEVICE | MT_RW | MT_SECURE \ 199 ) 200 201 /* Map the secure region for access from S-EL0 */ 202 #define PLAT_ARM_SECURE_MAP_DEVICE MAP_REGION_FLAT( \ 203 SOC_CSS_DEVICE_BASE, \ 204 SOC_CSS_DEVICE_SIZE, \ 205 MT_DEVICE | MT_RW | MT_SECURE | MT_USER) 206 207 #if ENABLE_FEAT_RAS && FFH_SUPPORT 208 #define PLAT_SP_PRI PLAT_RAS_PRI 209 #else 210 #define PLAT_SP_PRI 0x10 211 #endif 212 213 #if (SPM_MM || (SPMC_AT_EL3 && SPMC_AT_EL3_SEL0_SP)) && ENABLE_FEAT_RAS && FFH_SUPPORT 214 /* 215 * CPER buffer memory of 128KB is reserved and it is placed adjacent to the 216 * memory shared between EL3 and S-EL0. 217 */ 218 #define CSS_SGI_SP_CPER_BUF_BASE (PLAT_SP_IMAGE_NS_BUF_BASE + \ 219 PLAT_SP_IMAGE_NS_BUF_SIZE) 220 #define CSS_SGI_SP_CPER_BUF_SIZE ULL(0x20000) 221 #define CSS_SGI_SP_CPER_BUF_MMAP MAP_REGION2( \ 222 CSS_SGI_SP_CPER_BUF_BASE, \ 223 CSS_SGI_SP_CPER_BUF_BASE, \ 224 CSS_SGI_SP_CPER_BUF_SIZE, \ 225 MT_RW_DATA | MT_NS | MT_USER, \ 226 PAGE_SIZE) 227 228 /* 229 * Secure partition stack follows right after the memory space reserved for 230 * CPER buffer memory. 231 */ 232 #define PLAT_ARM_SP_IMAGE_STACK_BASE (PLAT_SP_IMAGE_NS_BUF_BASE + \ 233 PLAT_SP_IMAGE_NS_BUF_SIZE + \ 234 CSS_SGI_SP_CPER_BUF_SIZE) 235 #elif (SPM_MM || (SPMC_AT_EL3 && SPMC_AT_EL3_SEL0_SP)) 236 /* 237 * Secure partition stack follows right after the memory region that is shared 238 * between EL3 and S-EL0. 239 */ 240 #define PLAT_ARM_SP_IMAGE_STACK_BASE (PLAT_SP_IMAGE_NS_BUF_BASE + \ 241 PLAT_SP_IMAGE_NS_BUF_SIZE) 242 #endif /* SPM_MM && ENABLE_FEAT_RAS && FFH_SUPPORT */ 243 244 /* Platform ID address */ 245 #define SSC_VERSION (SSC_REG_BASE + SSC_VERSION_OFFSET) 246 #ifndef __ASSEMBLER__ 247 /* SSC_VERSION related accessors */ 248 /* Returns the part number of the platform */ 249 #define GET_SGI_PART_NUM \ 250 GET_SSC_VERSION_PART_NUM(mmio_read_32(SSC_VERSION)) 251 /* Returns the configuration number of the platform */ 252 #define GET_SGI_CONFIG_NUM \ 253 GET_SSC_VERSION_CONFIG(mmio_read_32(SSC_VERSION)) 254 #endif /* __ASSEMBLER__ */ 255 256 /******************************************************************************* 257 * Memprotect definitions 258 ******************************************************************************/ 259 /* PSCI memory protect definitions: 260 * This variable is stored in a non-secure flash because some ARM reference 261 * platforms do not have secure NVRAM. Real systems that provided MEM_PROTECT 262 * support must use a secure NVRAM to store the PSCI MEM_PROTECT definitions. 263 */ 264 #define PLAT_ARM_MEM_PROT_ADDR (V2M_FLASH0_BASE + \ 265 V2M_FLASH0_SIZE - V2M_FLASH_BLOCK_SIZE) 266 267 /*Secure Watchdog Constants */ 268 #define SBSA_SECURE_WDOG_BASE UL(0x2A480000) 269 #define SBSA_SECURE_WDOG_TIMEOUT UL(100) 270 271 /* Number of SCMI channels on the platform */ 272 #define PLAT_ARM_SCMI_CHANNEL_COUNT CSS_SGI_CHIP_COUNT 273 274 /* 275 * Mapping definition of the TrustZone Controller for ARM SGI/RD platforms 276 * where both the DRAM regions are marked for non-secure access. This applies 277 * to multi-chip platforms. 278 */ 279 #define SGI_PLAT_TZC_NS_REMOTE_REGIONS_DEF(n) \ 280 {CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM1_BASE, \ 281 CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM1_END, \ 282 ARM_TZC_NS_DRAM_S_ACCESS, PLAT_ARM_TZC_NS_DEV_ACCESS}, \ 283 {CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM2_BASE, \ 284 CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM2_END, \ 285 ARM_TZC_NS_DRAM_S_ACCESS, PLAT_ARM_TZC_NS_DEV_ACCESS} 286 287 #if SPM_MM 288 289 /* 290 * Stand-alone MM logs would be routed via secure UART. Define page table 291 * entry for secure UART which would be common to all platforms. 292 */ 293 #define SOC_PLATFORM_SECURE_UART MAP_REGION_FLAT( \ 294 SOC_CSS_SEC_UART_BASE, \ 295 SOC_CSS_UART_SIZE, \ 296 MT_DEVICE | MT_RW | \ 297 MT_SECURE | MT_USER) 298 299 #endif 300 301 /* SDS ID for unusable CPU MPID list structure */ 302 #define SDS_ISOLATED_CPU_LIST_ID U(128) 303 304 #endif /* SGI_BASE_PLATFORM_DEF_H */ 305