1558a6f44SRadoslaw Biernacki /* SPDX-License-Identifier: BSD-3-Clause 2558a6f44SRadoslaw Biernacki * 36a2426a9SMasahisa Kojima * Copyright (c) 2019-2020, Linaro Limited and Contributors. 46a2426a9SMasahisa Kojima * All rights reserved. 5558a6f44SRadoslaw Biernacki */ 6558a6f44SRadoslaw Biernacki 76a2426a9SMasahisa Kojima #ifndef PLATFORM_DEF_H 86a2426a9SMasahisa Kojima #define PLATFORM_DEF_H 9558a6f44SRadoslaw Biernacki 10558a6f44SRadoslaw Biernacki #include <arch.h> 11558a6f44SRadoslaw Biernacki #include <plat/common/common_def.h> 12558a6f44SRadoslaw Biernacki #include <tbbr_img_def.h> 13558a6f44SRadoslaw Biernacki 14558a6f44SRadoslaw Biernacki /* Special value used to verify platform parameters from BL2 to BL3-1 */ 15558a6f44SRadoslaw Biernacki #define QEMU_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL 16558a6f44SRadoslaw Biernacki 17558a6f44SRadoslaw Biernacki #define PLATFORM_STACK_SIZE 0x1000 18558a6f44SRadoslaw Biernacki 195565ede4SGraeme Gregory #define PLATFORM_MAX_CPUS_PER_CLUSTER U(8) 203063177eSGraeme Gregory /* 213063177eSGraeme Gregory * Define the number of cores per cluster used in calculating core position. 223063177eSGraeme Gregory * The cluster number is shifted by this value and added to the core ID, 233063177eSGraeme Gregory * so its value represents log2(cores/cluster). 245565ede4SGraeme Gregory * Default is 2**(3) = 8 cores per cluster. 253063177eSGraeme Gregory */ 265565ede4SGraeme Gregory #define PLATFORM_CPU_PER_CLUSTER_SHIFT U(3) 275565ede4SGraeme Gregory #define PLATFORM_CLUSTER_COUNT U(64) 285565ede4SGraeme Gregory #define PLATFORM_CORE_COUNT (PLATFORM_CLUSTER_COUNT * \ 295565ede4SGraeme Gregory PLATFORM_MAX_CPUS_PER_CLUSTER) 30645ac02dSDeepika Bhavnani #define QEMU_PRIMARY_CPU U(0) 31558a6f44SRadoslaw Biernacki 32558a6f44SRadoslaw Biernacki #define PLAT_NUM_PWR_DOMAINS (PLATFORM_CLUSTER_COUNT + \ 33558a6f44SRadoslaw Biernacki PLATFORM_CORE_COUNT) 34558a6f44SRadoslaw Biernacki #define PLAT_MAX_PWR_LVL MPIDR_AFFLVL1 35558a6f44SRadoslaw Biernacki 36558a6f44SRadoslaw Biernacki #define PLAT_MAX_RET_STATE 1 37558a6f44SRadoslaw Biernacki #define PLAT_MAX_OFF_STATE 2 38558a6f44SRadoslaw Biernacki 39558a6f44SRadoslaw Biernacki /* Local power state for power domains in Run state. */ 40558a6f44SRadoslaw Biernacki #define PLAT_LOCAL_STATE_RUN 0 41558a6f44SRadoslaw Biernacki /* Local power state for retention. Valid only for CPU power domains */ 42558a6f44SRadoslaw Biernacki #define PLAT_LOCAL_STATE_RET 1 43558a6f44SRadoslaw Biernacki /* 44558a6f44SRadoslaw Biernacki * Local power state for OFF/power-down. Valid for CPU and cluster power 45558a6f44SRadoslaw Biernacki * domains. 46558a6f44SRadoslaw Biernacki */ 47558a6f44SRadoslaw Biernacki #define PLAT_LOCAL_STATE_OFF 2 48558a6f44SRadoslaw Biernacki 49558a6f44SRadoslaw Biernacki /* 50558a6f44SRadoslaw Biernacki * Macros used to parse state information from State-ID if it is using the 51558a6f44SRadoslaw Biernacki * recommended encoding for State-ID. 52558a6f44SRadoslaw Biernacki */ 53558a6f44SRadoslaw Biernacki #define PLAT_LOCAL_PSTATE_WIDTH 4 54558a6f44SRadoslaw Biernacki #define PLAT_LOCAL_PSTATE_MASK ((1 << PLAT_LOCAL_PSTATE_WIDTH) - 1) 55558a6f44SRadoslaw Biernacki 56558a6f44SRadoslaw Biernacki /* 57558a6f44SRadoslaw Biernacki * Some data must be aligned on the biggest cache line size in the platform. 58558a6f44SRadoslaw Biernacki * This is known only to the platform as it might have a combination of 59558a6f44SRadoslaw Biernacki * integrated and external caches. 60558a6f44SRadoslaw Biernacki */ 61558a6f44SRadoslaw Biernacki #define CACHE_WRITEBACK_SHIFT 6 62558a6f44SRadoslaw Biernacki #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) 63558a6f44SRadoslaw Biernacki 64558a6f44SRadoslaw Biernacki /* 658b7dd839SXiong Yining * Define the max number of memory nodes. 668b7dd839SXiong Yining */ 678b7dd839SXiong Yining #define PLAT_MAX_MEM_NODES 128 688b7dd839SXiong Yining 6926da60e2SMathieu Poirier /* Where QEMU starts the NS RAM */ 7026da60e2SMathieu Poirier #define PLAT_QEMU_DRAM0_BASE 0x10000000000ULL 7126da60e2SMathieu Poirier 728b7dd839SXiong Yining /* 73558a6f44SRadoslaw Biernacki * Partition memory into secure ROM, non-secure DRAM, secure "SRAM", 74558a6f44SRadoslaw Biernacki * and secure DRAM. 75558a6f44SRadoslaw Biernacki */ 76558a6f44SRadoslaw Biernacki #define SEC_ROM_BASE 0x00000000 77558a6f44SRadoslaw Biernacki #define SEC_ROM_SIZE 0x00020000 78558a6f44SRadoslaw Biernacki 7926da60e2SMathieu Poirier /* 8026da60e2SMathieu Poirier * When the RME extension is enabled, the base of the NS RAM is shifted after 8126da60e2SMathieu Poirier * RMM. 8226da60e2SMathieu Poirier */ 8326da60e2SMathieu Poirier #define NS_DRAM0_BASE (PLAT_QEMU_DRAM0_BASE + \ 8426da60e2SMathieu Poirier NS_DRAM0_BASE_OFFSET) 85558a6f44SRadoslaw Biernacki #define NS_DRAM0_SIZE 0x00020000000 86558a6f44SRadoslaw Biernacki 87558a6f44SRadoslaw Biernacki #define SEC_SRAM_BASE 0x20000000 88558a6f44SRadoslaw Biernacki #define SEC_SRAM_SIZE 0x20000000 89558a6f44SRadoslaw Biernacki 90558a6f44SRadoslaw Biernacki /* 91558a6f44SRadoslaw Biernacki * RAD just placeholders, need to be chosen after finalizing mem map 92558a6f44SRadoslaw Biernacki */ 93558a6f44SRadoslaw Biernacki #define SEC_DRAM_BASE 0x1000 94558a6f44SRadoslaw Biernacki #define SEC_DRAM_SIZE 0x1000 95558a6f44SRadoslaw Biernacki 96558a6f44SRadoslaw Biernacki /* Load pageable part of OP-TEE 2MB above secure DRAM base */ 97558a6f44SRadoslaw Biernacki #define QEMU_OPTEE_PAGEABLE_LOAD_BASE (SEC_DRAM_BASE + 0x00200000) 98558a6f44SRadoslaw Biernacki #define QEMU_OPTEE_PAGEABLE_LOAD_SIZE 0x00400000 99558a6f44SRadoslaw Biernacki 100558a6f44SRadoslaw Biernacki /* 101558a6f44SRadoslaw Biernacki * ARM-TF lives in SRAM, partition it here 102558a6f44SRadoslaw Biernacki */ 103558a6f44SRadoslaw Biernacki 104558a6f44SRadoslaw Biernacki #define SHARED_RAM_BASE SEC_SRAM_BASE 10554b590ecSMasato Fukumori #define SHARED_RAM_SIZE 0x00002000 106558a6f44SRadoslaw Biernacki 107558a6f44SRadoslaw Biernacki #define PLAT_QEMU_TRUSTED_MAILBOX_BASE SHARED_RAM_BASE 108558a6f44SRadoslaw Biernacki #define PLAT_QEMU_TRUSTED_MAILBOX_SIZE (8 + PLAT_QEMU_HOLD_SIZE) 109558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_BASE (PLAT_QEMU_TRUSTED_MAILBOX_BASE + 8) 110558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_SIZE (PLATFORM_CORE_COUNT * \ 111558a6f44SRadoslaw Biernacki PLAT_QEMU_HOLD_ENTRY_SIZE) 112558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_ENTRY_SHIFT 3 113558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_ENTRY_SIZE (1 << PLAT_QEMU_HOLD_ENTRY_SHIFT) 114558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_STATE_WAIT 0 115558a6f44SRadoslaw Biernacki #define PLAT_QEMU_HOLD_STATE_GO 1 116558a6f44SRadoslaw Biernacki 117558a6f44SRadoslaw Biernacki #define BL_RAM_BASE (SHARED_RAM_BASE + SHARED_RAM_SIZE) 118558a6f44SRadoslaw Biernacki #define BL_RAM_SIZE (SEC_SRAM_SIZE - SHARED_RAM_SIZE) 119558a6f44SRadoslaw Biernacki 120558a6f44SRadoslaw Biernacki /* 121558a6f44SRadoslaw Biernacki * BL1 specific defines. 122558a6f44SRadoslaw Biernacki * 123558a6f44SRadoslaw Biernacki * BL1 RW data is relocated from ROM to RAM at runtime so we need 2 sets of 124558a6f44SRadoslaw Biernacki * addresses. 125558a6f44SRadoslaw Biernacki * Put BL1 RW at the top of the Secure SRAM. BL1_RW_BASE is calculated using 126558a6f44SRadoslaw Biernacki * the current BL1 RW debug size plus a little space for growth. 127558a6f44SRadoslaw Biernacki */ 1286a2426a9SMasahisa Kojima #define BL1_SIZE 0x12000 129558a6f44SRadoslaw Biernacki #define BL1_RO_BASE SEC_ROM_BASE 130558a6f44SRadoslaw Biernacki #define BL1_RO_LIMIT (SEC_ROM_BASE + SEC_ROM_SIZE) 1316a2426a9SMasahisa Kojima #define BL1_RW_BASE (BL1_RW_LIMIT - BL1_SIZE) 132acb09373SMathieu Poirier #define BL1_RW_LIMIT (BL_RAM_BASE + BL_RAM_SIZE - \ 133acb09373SMathieu Poirier RME_GPT_DRAM_SIZE) 134558a6f44SRadoslaw Biernacki 135558a6f44SRadoslaw Biernacki /* 136558a6f44SRadoslaw Biernacki * BL2 specific defines. 137558a6f44SRadoslaw Biernacki * 138558a6f44SRadoslaw Biernacki * Put BL2 just below BL3-1. BL2_BASE is calculated using the current BL2 debug 139558a6f44SRadoslaw Biernacki * size plus a little space for growth. 140558a6f44SRadoslaw Biernacki */ 1416a2426a9SMasahisa Kojima #define BL2_SIZE 0x1D000 1426a2426a9SMasahisa Kojima #define BL2_BASE (BL31_BASE - BL2_SIZE) 143558a6f44SRadoslaw Biernacki #define BL2_LIMIT BL31_BASE 144558a6f44SRadoslaw Biernacki 145558a6f44SRadoslaw Biernacki /* 146558a6f44SRadoslaw Biernacki * BL3-1 specific defines. 147558a6f44SRadoslaw Biernacki * 148558a6f44SRadoslaw Biernacki * Put BL3-1 at the top of the Trusted SRAM. BL31_BASE is calculated using the 149558a6f44SRadoslaw Biernacki * current BL3-1 debug size plus a little space for growth. 150558a6f44SRadoslaw Biernacki */ 151acb09373SMathieu Poirier #define BL31_SIZE 0x400000 1526a2426a9SMasahisa Kojima #define BL31_BASE (BL31_LIMIT - BL31_SIZE) 153*cda0487aSJens Wiklander #define BL31_LIMIT (BL1_RW_BASE - FW_HANDOFF_SIZE - \ 154*cda0487aSJens Wiklander TB_FW_CONFIG_SIZE - TOS_FW_CONFIG_SIZE) 155558a6f44SRadoslaw Biernacki #define BL31_PROGBITS_LIMIT BL1_RW_BASE 156558a6f44SRadoslaw Biernacki 157648d2d8eSKun Qin #if TRANSFER_LIST 158648d2d8eSKun Qin #define FW_HANDOFF_BASE BL31_LIMIT 159648d2d8eSKun Qin #define FW_HANDOFF_LIMIT (FW_HANDOFF_BASE + FW_HANDOFF_SIZE) 160648d2d8eSKun Qin #define FW_HANDOFF_SIZE 0x4000 161648d2d8eSKun Qin #else 162648d2d8eSKun Qin #define FW_HANDOFF_SIZE 0 163648d2d8eSKun Qin #endif 164648d2d8eSKun Qin #if TRANSFER_LIST 165648d2d8eSKun Qin #define FW_NS_HANDOFF_BASE (NS_IMAGE_OFFSET - FW_HANDOFF_SIZE) 166648d2d8eSKun Qin #endif 167558a6f44SRadoslaw Biernacki 168*cda0487aSJens Wiklander #if defined(SPD_spmd) 169*cda0487aSJens Wiklander #define TB_FW_CONFIG_SIZE PAGE_SIZE 170*cda0487aSJens Wiklander #else 171*cda0487aSJens Wiklander #define TB_FW_CONFIG_SIZE 0 172*cda0487aSJens Wiklander #endif 173*cda0487aSJens Wiklander 174*cda0487aSJens Wiklander #if defined(SPD_spmd) && defined(SPMD_SPM_AT_SEL2) 175*cda0487aSJens Wiklander #define TOS_FW_CONFIG_SIZE PAGE_SIZE 176*cda0487aSJens Wiklander #else 177*cda0487aSJens Wiklander #define TOS_FW_CONFIG_SIZE 0 178*cda0487aSJens Wiklander #endif 179*cda0487aSJens Wiklander 180*cda0487aSJens Wiklander #define TB_FW_CONFIG_BASE (BL31_LIMIT + FW_HANDOFF_SIZE) 181*cda0487aSJens Wiklander #define TB_FW_CONFIG_LIMIT (TB_FW_CONFIG_BASE + TB_FW_CONFIG_SIZE) 182*cda0487aSJens Wiklander 183*cda0487aSJens Wiklander #define TOS_FW_CONFIG_BASE TB_FW_CONFIG_LIMIT 184*cda0487aSJens Wiklander #define TOS_FW_CONFIG_LIMIT (TOS_FW_CONFIG_BASE + \ 185*cda0487aSJens Wiklander TOS_FW_CONFIG_SIZE) 186*cda0487aSJens Wiklander 187558a6f44SRadoslaw Biernacki /* 188558a6f44SRadoslaw Biernacki * BL3-2 specific defines. 189558a6f44SRadoslaw Biernacki * 190558a6f44SRadoslaw Biernacki * BL3-2 can execute from Secure SRAM, or Secure DRAM. 191558a6f44SRadoslaw Biernacki */ 192558a6f44SRadoslaw Biernacki #define BL32_SRAM_BASE BL_RAM_BASE 1936a2426a9SMasahisa Kojima #define BL32_SRAM_LIMIT BL2_BASE 194558a6f44SRadoslaw Biernacki 195558a6f44SRadoslaw Biernacki #define BL32_MEM_BASE BL_RAM_BASE 196acb09373SMathieu Poirier #define BL32_MEM_SIZE (BL_RAM_SIZE - RME_GPT_DRAM_SIZE - \ 197*cda0487aSJens Wiklander BL1_SIZE - BL2_SIZE - BL31_SIZE - \ 198*cda0487aSJens Wiklander FW_HANDOFF_SIZE - TB_FW_CONFIG_SIZE - \ 199*cda0487aSJens Wiklander TOS_FW_CONFIG_SIZE) 200558a6f44SRadoslaw Biernacki #define BL32_BASE BL32_SRAM_BASE 201558a6f44SRadoslaw Biernacki #define BL32_LIMIT BL32_SRAM_LIMIT 202558a6f44SRadoslaw Biernacki 203558a6f44SRadoslaw Biernacki #define NS_IMAGE_OFFSET (NS_DRAM0_BASE + 0x20000000) 204558a6f44SRadoslaw Biernacki #define NS_IMAGE_MAX_SIZE (NS_DRAM0_SIZE - 0x20000000) 205558a6f44SRadoslaw Biernacki 206558a6f44SRadoslaw Biernacki #define PLAT_PHY_ADDR_SPACE_SIZE (1ull << 42) 207558a6f44SRadoslaw Biernacki #define PLAT_VIRT_ADDR_SPACE_SIZE (1ull << 42) 2086a2426a9SMasahisa Kojima #if SPM_MM 209648d2d8eSKun Qin #define MAX_MMAP_REGIONS 13 210648d2d8eSKun Qin #define MAX_XLAT_TABLES 13 211648d2d8eSKun Qin #elif ENABLE_RME 212648d2d8eSKun Qin #define MAX_MMAP_REGIONS 15 213648d2d8eSKun Qin #define MAX_XLAT_TABLES 15 214648d2d8eSKun Qin #else 2156a2426a9SMasahisa Kojima #define MAX_MMAP_REGIONS 12 2162fb5ed47SGraeme Gregory #define MAX_XLAT_TABLES 12 2176a2426a9SMasahisa Kojima #endif 218558a6f44SRadoslaw Biernacki #define MAX_IO_DEVICES 3 219558a6f44SRadoslaw Biernacki #define MAX_IO_HANDLES 4 220558a6f44SRadoslaw Biernacki 2216a2426a9SMasahisa Kojima #if SPM_MM && defined(IMAGE_BL31) 2226a2426a9SMasahisa Kojima # define PLAT_SP_IMAGE_MMAP_REGIONS 30 223cf952b0fSMasahisa Kojima # define PLAT_SP_IMAGE_MAX_XLAT_TABLES 50 2246a2426a9SMasahisa Kojima #endif 2256a2426a9SMasahisa Kojima 226558a6f44SRadoslaw Biernacki /* 227558a6f44SRadoslaw Biernacki * PL011 related constants 228558a6f44SRadoslaw Biernacki */ 229558a6f44SRadoslaw Biernacki #define UART0_BASE 0x60000000 230558a6f44SRadoslaw Biernacki #define UART1_BASE 0x60030000 231558a6f44SRadoslaw Biernacki #define UART0_CLK_IN_HZ 1 232558a6f44SRadoslaw Biernacki #define UART1_CLK_IN_HZ 1 233558a6f44SRadoslaw Biernacki 2346a2426a9SMasahisa Kojima /* Secure UART */ 2356a2426a9SMasahisa Kojima #define UART2_BASE 0x60040000 2366a2426a9SMasahisa Kojima #define UART2_CLK_IN_HZ 1 2376a2426a9SMasahisa Kojima 238558a6f44SRadoslaw Biernacki #define PLAT_QEMU_BOOT_UART_BASE UART0_BASE 239558a6f44SRadoslaw Biernacki #define PLAT_QEMU_BOOT_UART_CLK_IN_HZ UART0_CLK_IN_HZ 240558a6f44SRadoslaw Biernacki 241558a6f44SRadoslaw Biernacki #define PLAT_QEMU_CRASH_UART_BASE UART1_BASE 242558a6f44SRadoslaw Biernacki #define PLAT_QEMU_CRASH_UART_CLK_IN_HZ UART1_CLK_IN_HZ 243558a6f44SRadoslaw Biernacki 244558a6f44SRadoslaw Biernacki #define PLAT_QEMU_CONSOLE_BAUDRATE 115200 245558a6f44SRadoslaw Biernacki 246558a6f44SRadoslaw Biernacki #define QEMU_FLASH0_BASE 0x00000000 247558a6f44SRadoslaw Biernacki #define QEMU_FLASH0_SIZE 0x10000000 248558a6f44SRadoslaw Biernacki #define QEMU_FLASH1_BASE 0x10000000 249558a6f44SRadoslaw Biernacki #define QEMU_FLASH1_SIZE 0x10000000 250558a6f44SRadoslaw Biernacki 251408cde8aSMarcin Juszkiewicz #define PLAT_QEMU_FIP_BASE BL1_SIZE 252122dbc2cSMathieu Poirier #define PLAT_QEMU_FIP_MAX_SIZE (QEMU_FLASH0_SIZE - BL1_SIZE) 253558a6f44SRadoslaw Biernacki 254558a6f44SRadoslaw Biernacki /* This is map from GIC_DIST up to last CPU (255) GIC_REDISTR */ 255558a6f44SRadoslaw Biernacki #define DEVICE0_BASE 0x40000000 256558a6f44SRadoslaw Biernacki #define DEVICE0_SIZE 0x04080000 257558a6f44SRadoslaw Biernacki /* This is map from NORMAL_UART up to SECURE_UART_MM */ 258558a6f44SRadoslaw Biernacki #define DEVICE1_BASE 0x60000000 2592fb5ed47SGraeme Gregory #define DEVICE1_SIZE 0x10041000 2602fb5ed47SGraeme Gregory /* This is a map for SECURE_EC */ 2612fb5ed47SGraeme Gregory #define DEVICE2_BASE 0x50000000 2622fb5ed47SGraeme Gregory #define DEVICE2_SIZE 0x00001000 263558a6f44SRadoslaw Biernacki 264558a6f44SRadoslaw Biernacki /* 265558a6f44SRadoslaw Biernacki * GIC related constants 266558a6f44SRadoslaw Biernacki * We use GICv3 where CPU Interface registers are not memory mapped 2671e67b1b1SMarcin Juszkiewicz * 2681e67b1b1SMarcin Juszkiewicz * Legacy values - on platform version 0.1+ they are read from DT 269558a6f44SRadoslaw Biernacki */ 270558a6f44SRadoslaw Biernacki #define GICD_BASE 0x40060000 271558a6f44SRadoslaw Biernacki #define GICR_BASE 0x40080000 272558a6f44SRadoslaw Biernacki #define GICC_BASE 0x0 273558a6f44SRadoslaw Biernacki 274558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_0 8 275558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_1 9 276558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_2 10 277558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_3 11 278558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_4 12 279558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_5 13 280558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_6 14 281558a6f44SRadoslaw Biernacki #define QEMU_IRQ_SEC_SGI_7 15 282558a6f44SRadoslaw Biernacki 283558a6f44SRadoslaw Biernacki /****************************************************************************** 284558a6f44SRadoslaw Biernacki * On a GICv2 system, the Group 1 secure interrupts are treated as Group 0 285558a6f44SRadoslaw Biernacki * interrupts. 286558a6f44SRadoslaw Biernacki *****************************************************************************/ 287558a6f44SRadoslaw Biernacki #define PLATFORM_G1S_PROPS(grp) \ 288558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_0, GIC_HIGHEST_SEC_PRIORITY, \ 289558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 290558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_1, GIC_HIGHEST_SEC_PRIORITY, \ 291558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 292558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_2, GIC_HIGHEST_SEC_PRIORITY, \ 293558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 294558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_3, GIC_HIGHEST_SEC_PRIORITY, \ 295558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 296558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_4, GIC_HIGHEST_SEC_PRIORITY, \ 297558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 298558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_5, GIC_HIGHEST_SEC_PRIORITY, \ 299558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 300558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_6, GIC_HIGHEST_SEC_PRIORITY, \ 301558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE), \ 302558a6f44SRadoslaw Biernacki INTR_PROP_DESC(QEMU_IRQ_SEC_SGI_7, GIC_HIGHEST_SEC_PRIORITY, \ 303558a6f44SRadoslaw Biernacki grp, GIC_INTR_CFG_EDGE) 304558a6f44SRadoslaw Biernacki 305558a6f44SRadoslaw Biernacki #define PLATFORM_G0_PROPS(grp) 306558a6f44SRadoslaw Biernacki 307558a6f44SRadoslaw Biernacki /* 308558a6f44SRadoslaw Biernacki * DT related constants 309558a6f44SRadoslaw Biernacki */ 310558a6f44SRadoslaw Biernacki #define PLAT_QEMU_DT_BASE NS_DRAM0_BASE 311d7f5be8eSMasahisa Kojima #define PLAT_QEMU_DT_MAX_SIZE 0x100000 312558a6f44SRadoslaw Biernacki 3136a2426a9SMasahisa Kojima #if SPM_MM 3146a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_BASE BL_RAM_BASE 3156a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_SIZE ULL(0x300000) 3166a2426a9SMasahisa Kojima 3176a2426a9SMasahisa Kojima #ifdef IMAGE_BL2 3186a2426a9SMasahisa Kojima /* In BL2 all memory allocated to the SPM Payload image is marked as RW. */ 3196a2426a9SMasahisa Kojima # define QEMU_SP_IMAGE_MMAP MAP_REGION_FLAT( \ 3206a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_BASE, \ 3216a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_SIZE, \ 3226a2426a9SMasahisa Kojima MT_MEMORY | MT_RW | \ 3236a2426a9SMasahisa Kojima MT_SECURE) 3246a2426a9SMasahisa Kojima #elif IMAGE_BL31 3256a2426a9SMasahisa Kojima /* All SPM Payload memory is marked as code in S-EL0 */ 3266a2426a9SMasahisa Kojima # define QEMU_SP_IMAGE_MMAP MAP_REGION2(PLAT_QEMU_SP_IMAGE_BASE, \ 3276a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_BASE, \ 3286a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_SIZE, \ 3296a2426a9SMasahisa Kojima MT_CODE | MT_SECURE | \ 3306a2426a9SMasahisa Kojima MT_USER, \ 3316a2426a9SMasahisa Kojima PAGE_SIZE) 3326a2426a9SMasahisa Kojima #endif 3336a2426a9SMasahisa Kojima 3346a2426a9SMasahisa Kojima /* 3356a2426a9SMasahisa Kojima * EL3 -> S-EL0 secure shared memory 3366a2426a9SMasahisa Kojima */ 3376a2426a9SMasahisa Kojima #define PLAT_SPM_BUF_PCPU_SIZE ULL(0x10000) 3386a2426a9SMasahisa Kojima #define PLAT_SPM_BUF_SIZE (PLATFORM_CORE_COUNT * \ 3396a2426a9SMasahisa Kojima PLAT_SPM_BUF_PCPU_SIZE) 3406a2426a9SMasahisa Kojima #define PLAT_SPM_BUF_BASE (BL32_LIMIT - PLAT_SPM_BUF_SIZE) 3416a2426a9SMasahisa Kojima 3426a2426a9SMasahisa Kojima #define QEMU_SPM_BUF_EL3_MMAP MAP_REGION_FLAT(PLAT_SPM_BUF_BASE, \ 3436a2426a9SMasahisa Kojima PLAT_SPM_BUF_SIZE, \ 3446a2426a9SMasahisa Kojima MT_RW_DATA | MT_SECURE) 3456a2426a9SMasahisa Kojima 3466a2426a9SMasahisa Kojima #define QEMU_SPM_BUF_EL0_MMAP MAP_REGION2(PLAT_SPM_BUF_BASE, \ 3476a2426a9SMasahisa Kojima PLAT_SPM_BUF_BASE, \ 3486a2426a9SMasahisa Kojima PLAT_SPM_BUF_SIZE, \ 3496a2426a9SMasahisa Kojima MT_RO_DATA | MT_SECURE | \ 3506a2426a9SMasahisa Kojima MT_USER, \ 3516a2426a9SMasahisa Kojima PAGE_SIZE) 3526a2426a9SMasahisa Kojima 3536a2426a9SMasahisa Kojima /* 3546a2426a9SMasahisa Kojima * Shared memory between Normal world and S-EL0 for 3556a2426a9SMasahisa Kojima * passing data during service requests. It will be marked as RW and NS. 35674c87a4bSMasahisa Kojima * This buffer is allocated at the top of NS_DRAM, the base address is 35774c87a4bSMasahisa Kojima * overridden in SPM initialization. 3586a2426a9SMasahisa Kojima */ 3596a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_NS_BUF_BASE (PLAT_QEMU_DT_BASE + \ 3606a2426a9SMasahisa Kojima PLAT_QEMU_DT_MAX_SIZE) 36174c87a4bSMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_NS_BUF_SIZE ULL(0x200000) 36274c87a4bSMasahisa Kojima 3636a2426a9SMasahisa Kojima #define QEMU_SP_IMAGE_NS_BUF_MMAP MAP_REGION2( \ 3646a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_NS_BUF_BASE, \ 3656a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_NS_BUF_BASE, \ 3666a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_NS_BUF_SIZE, \ 3676a2426a9SMasahisa Kojima MT_RW_DATA | MT_NS | \ 3686a2426a9SMasahisa Kojima MT_USER, \ 3696a2426a9SMasahisa Kojima PAGE_SIZE) 3706a2426a9SMasahisa Kojima 3716a2426a9SMasahisa Kojima #define PLAT_SP_IMAGE_NS_BUF_BASE PLAT_QEMU_SP_IMAGE_NS_BUF_BASE 3726a2426a9SMasahisa Kojima #define PLAT_SP_IMAGE_NS_BUF_SIZE PLAT_QEMU_SP_IMAGE_NS_BUF_SIZE 3736a2426a9SMasahisa Kojima 3746a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_HEAP_BASE (PLAT_QEMU_SP_IMAGE_BASE + \ 3756a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_SIZE) 3766a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_HEAP_SIZE ULL(0x800000) 3776a2426a9SMasahisa Kojima 3786a2426a9SMasahisa Kojima #define PLAT_SP_IMAGE_STACK_BASE (PLAT_QEMU_SP_IMAGE_HEAP_BASE + \ 3796a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_HEAP_SIZE) 3806a2426a9SMasahisa Kojima #define PLAT_SP_IMAGE_STACK_PCPU_SIZE ULL(0x10000) 3816a2426a9SMasahisa Kojima #define QEMU_SP_IMAGE_STACK_TOTAL_SIZE (PLATFORM_CORE_COUNT * \ 3826a2426a9SMasahisa Kojima PLAT_SP_IMAGE_STACK_PCPU_SIZE) 3836a2426a9SMasahisa Kojima 3846a2426a9SMasahisa Kojima #define QEMU_SP_IMAGE_RW_MMAP MAP_REGION2( \ 3856a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_HEAP_BASE, \ 3866a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_HEAP_BASE, \ 3876a2426a9SMasahisa Kojima (QEMU_SP_IMAGE_STACK_TOTAL_SIZE + \ 3886a2426a9SMasahisa Kojima PLAT_QEMU_SP_IMAGE_HEAP_SIZE), \ 3896a2426a9SMasahisa Kojima MT_RW_DATA | MT_SECURE | \ 3906a2426a9SMasahisa Kojima MT_USER, \ 3916a2426a9SMasahisa Kojima PAGE_SIZE) 3926a2426a9SMasahisa Kojima 39374c87a4bSMasahisa Kojima /* 39474c87a4bSMasahisa Kojima * Secure variable storage is located at Secure Flash. 39574c87a4bSMasahisa Kojima */ 39674c87a4bSMasahisa Kojima #if SPM_MM 39774c87a4bSMasahisa Kojima #define QEMU_SECURE_VARSTORE_BASE 0x01000000 39874c87a4bSMasahisa Kojima #define QEMU_SECURE_VARSTORE_SIZE 0x00100000 39974c87a4bSMasahisa Kojima #define MAP_SECURE_VARSTORE MAP_REGION_FLAT( \ 40074c87a4bSMasahisa Kojima QEMU_SECURE_VARSTORE_BASE, \ 40174c87a4bSMasahisa Kojima QEMU_SECURE_VARSTORE_SIZE, \ 402206fa996SMasahisa Kojima MT_DEVICE | MT_RW | \ 40374c87a4bSMasahisa Kojima MT_SECURE | MT_USER) 40474c87a4bSMasahisa Kojima #endif 40574c87a4bSMasahisa Kojima 4066a2426a9SMasahisa Kojima /* Total number of memory regions with distinct properties */ 4076a2426a9SMasahisa Kojima #define PLAT_QEMU_SP_IMAGE_NUM_MEM_REGIONS 6 4086a2426a9SMasahisa Kojima 4096a2426a9SMasahisa Kojima /* 4106a2426a9SMasahisa Kojima * Name of the section to put the translation tables used by the S-EL1/S-EL0 4116a2426a9SMasahisa Kojima * context of a Secure Partition. 4126a2426a9SMasahisa Kojima */ 413da04341eSChris Kay #define PLAT_SP_IMAGE_XLAT_SECTION_NAME ".qemu_sp_xlat_table" 414da04341eSChris Kay #define PLAT_SP_IMAGE_BASE_XLAT_SECTION_NAME ".qemu_sp_xlat_table" 4156a2426a9SMasahisa Kojima 4166a2426a9SMasahisa Kojima /* Cookies passed to the Secure Partition at boot. Not used by QEMU platforms.*/ 4176a2426a9SMasahisa Kojima #define PLAT_SPM_COOKIE_0 ULL(0) 4186a2426a9SMasahisa Kojima #define PLAT_SPM_COOKIE_1 ULL(0) 4196a2426a9SMasahisa Kojima #endif 4206a2426a9SMasahisa Kojima 4216a2426a9SMasahisa Kojima #define QEMU_PRI_BITS 2 4226a2426a9SMasahisa Kojima #define PLAT_SP_PRI 0x20 4236a2426a9SMasahisa Kojima 424acb09373SMathieu Poirier #if !ENABLE_RME 425acb09373SMathieu Poirier #define RME_GPT_DRAM_SIZE 0 42626da60e2SMathieu Poirier #define NS_DRAM0_BASE_OFFSET 0 427acb09373SMathieu Poirier #else /* !ENABLE_RME */ 428acb09373SMathieu Poirier /* 429acb09373SMathieu Poirier * SBSA RAM starts at 1TB and we support up to 1TB of RAM. As such we 430acb09373SMathieu Poirier * have 2TB of physical address space to cover. Since the GPT size can be 431acb09373SMathieu Poirier * 4GB, 64GB, 1TB, 4TB and so on, we need to select 4GB. Note that it is 432acb09373SMathieu Poirier * possible to support more than 1TB of RAM but that will take more room in 433acb09373SMathieu Poirier * secure memory due to the L1 GPTES. See PLAT_QEMU_L1_GPT_SIZE for details. 434acb09373SMathieu Poirier * 435acb09373SMathieu Poirier * 4TB / 1GB == 4096 GPTEs 436acb09373SMathieu Poirier * 4096 * 8 (bytes per GPTE) == 32768 i.e 8 pages 437acb09373SMathieu Poirier */ 438acb09373SMathieu Poirier #define PLAT_QEMU_L0_GPT_SIZE (8 * PAGE_SIZE) 439acb09373SMathieu Poirier #define PLAT_QEMU_L0_GPT_BASE (PLAT_QEMU_L1_GPT_BASE - \ 440a32a77f9SJean-Philippe Brucker PLAT_QEMU_L0_GPT_SIZE) 441acb09373SMathieu Poirier 442acb09373SMathieu Poirier 443acb09373SMathieu Poirier /* 444acb09373SMathieu Poirier * If we have 1TB of RAM and each L1GPT covers 1GB, we need 1024 L1GPTs. With 445acb09373SMathieu Poirier * one more L1GPT to cover the other physical address spaces (see pas_regions[] 446acb09373SMathieu Poirier * in qemu_bl31_setup.c), we need a total of 1025 L1GPTs. Each L1GPT is 131072 447acb09373SMathieu Poirier * bytes, so we need 1025 * 131072 bytes = 0x8020000 of RAM to hold the L1GPTS. 448acb09373SMathieu Poirier */ 449acb09373SMathieu Poirier #define PLAT_QEMU_L1_GPT_SIZE UL(0x08020000) 450acb09373SMathieu Poirier #define PLAT_QEMU_L1_GPT_BASE (BL_RAM_BASE + BL_RAM_SIZE - \ 451acb09373SMathieu Poirier PLAT_QEMU_L1_GPT_SIZE) 452acb09373SMathieu Poirier 453acb09373SMathieu Poirier #define RME_GPT_DRAM_BASE PLAT_QEMU_L0_GPT_BASE 454acb09373SMathieu Poirier #define RME_GPT_DRAM_SIZE (PLAT_QEMU_L1_GPT_SIZE + \ 455a32a77f9SJean-Philippe Brucker PLAT_QEMU_L0_GPT_SIZE) 456acb09373SMathieu Poirier 457acb09373SMathieu Poirier #ifndef __ASSEMBLER__ 458acb09373SMathieu Poirier /* L0 table greater than 4KB must be naturally aligned */ 459acb09373SMathieu Poirier CASSERT((PLAT_QEMU_L0_GPT_BASE & (PLAT_QEMU_L0_GPT_SIZE - 1)) == 0, 460acb09373SMathieu Poirier assert_l0_gpt_naturally_aligned); 461acb09373SMathieu Poirier #endif 462acb09373SMathieu Poirier 463acb09373SMathieu Poirier /* Reserved some DRAM space for RMM (1072MB) */ 464acb09373SMathieu Poirier #define REALM_DRAM_BASE PLAT_QEMU_DRAM0_BASE 465acb09373SMathieu Poirier #define REALM_DRAM_SIZE 0x43000000 466acb09373SMathieu Poirier 467acb09373SMathieu Poirier #define PLAT_QEMU_RMM_SIZE (REALM_DRAM_SIZE - RMM_SHARED_SIZE) 468acb09373SMathieu Poirier #define PLAT_QEMU_RMM_SHARED_SIZE (PAGE_SIZE) /* 4KB */ 469acb09373SMathieu Poirier 470acb09373SMathieu Poirier #define RMM_BASE (REALM_DRAM_BASE) 471acb09373SMathieu Poirier #define RMM_LIMIT (RMM_BASE + PLAT_QEMU_RMM_SIZE) 472acb09373SMathieu Poirier #define RMM_SHARED_BASE (RMM_LIMIT) 473acb09373SMathieu Poirier #define RMM_SHARED_SIZE PLAT_QEMU_RMM_SHARED_SIZE 474acb09373SMathieu Poirier 475acb09373SMathieu Poirier #define MAP_GPT_L0_REGION MAP_REGION_FLAT( \ 476acb09373SMathieu Poirier PLAT_QEMU_L0_GPT_BASE, \ 477a32a77f9SJean-Philippe Brucker (PLAT_QEMU_L0_GPT_SIZE), \ 478acb09373SMathieu Poirier MT_MEMORY | MT_RW | EL3_PAS) 479acb09373SMathieu Poirier 480acb09373SMathieu Poirier #define MAP_GPT_L1_REGION MAP_REGION_FLAT( \ 481acb09373SMathieu Poirier PLAT_QEMU_L1_GPT_BASE, \ 482acb09373SMathieu Poirier PLAT_QEMU_L1_GPT_SIZE, \ 483acb09373SMathieu Poirier MT_MEMORY | MT_RW | EL3_PAS) 484acb09373SMathieu Poirier /* 485acb09373SMathieu Poirier * We add the RMM_SHARED size to RMM mapping to map the region as a block. 486acb09373SMathieu Poirier * Else we end up requiring more pagetables in BL2 for ROMLIB build. 487acb09373SMathieu Poirier */ 488acb09373SMathieu Poirier #define MAP_RMM_DRAM MAP_REGION_FLAT( \ 489acb09373SMathieu Poirier RMM_BASE, \ 490acb09373SMathieu Poirier (PLAT_QEMU_RMM_SIZE + \ 491acb09373SMathieu Poirier RMM_SHARED_SIZE), \ 492acb09373SMathieu Poirier MT_MEMORY | MT_RW | MT_REALM) 493acb09373SMathieu Poirier 494acb09373SMathieu Poirier #define MAP_RMM_SHARED_MEM MAP_REGION_FLAT( \ 495acb09373SMathieu Poirier RMM_SHARED_BASE, \ 496acb09373SMathieu Poirier RMM_SHARED_SIZE, \ 497acb09373SMathieu Poirier MT_MEMORY | MT_RW | MT_REALM) 498acb09373SMathieu Poirier 499acb09373SMathieu Poirier /* When RME is enabled, the base of NS DRAM is moved forward after the RMM */ 500acb09373SMathieu Poirier #define NS_DRAM0_BASE_OFFSET REALM_DRAM_SIZE 501acb09373SMathieu Poirier #endif /* !ENABLE_RME */ 50226da60e2SMathieu Poirier 5036a2426a9SMasahisa Kojima #endif /* PLATFORM_DEF_H */ 504