1*f5cb15b0SAndre Przywara /* 2*f5cb15b0SAndre Przywara * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 3*f5cb15b0SAndre Przywara * 4*f5cb15b0SAndre Przywara * SPDX-License-Identifier: BSD-3-Clause 5*f5cb15b0SAndre Przywara */ 6*f5cb15b0SAndre Przywara 7*f5cb15b0SAndre Przywara #ifndef PLATFORM_DEF_H 8*f5cb15b0SAndre Przywara #define PLATFORM_DEF_H 9*f5cb15b0SAndre Przywara 10*f5cb15b0SAndre Przywara #include <arch.h> 11*f5cb15b0SAndre Przywara #include <common/tbbr/tbbr_img_def.h> 12*f5cb15b0SAndre Przywara #include <lib/utils_def.h> 13*f5cb15b0SAndre Przywara #include <plat/common/common_def.h> 14*f5cb15b0SAndre Przywara 15*f5cb15b0SAndre Przywara #include "rpi_hw.h" 16*f5cb15b0SAndre Przywara 17*f5cb15b0SAndre Przywara /* Special value used to verify platform parameters from BL2 to BL31 */ 18*f5cb15b0SAndre Przywara #define RPI3_BL31_PLAT_PARAM_VAL ULL(0x0F1E2D3C4B5A6978) 19*f5cb15b0SAndre Przywara 20*f5cb15b0SAndre Przywara #define PLATFORM_STACK_SIZE ULL(0x1000) 21*f5cb15b0SAndre Przywara 22*f5cb15b0SAndre Przywara #define PLATFORM_MAX_CPUS_PER_CLUSTER U(4) 23*f5cb15b0SAndre Przywara #define PLATFORM_CLUSTER_COUNT U(1) 24*f5cb15b0SAndre Przywara #define PLATFORM_CLUSTER0_CORE_COUNT PLATFORM_MAX_CPUS_PER_CLUSTER 25*f5cb15b0SAndre Przywara #define PLATFORM_CORE_COUNT PLATFORM_CLUSTER0_CORE_COUNT 26*f5cb15b0SAndre Przywara 27*f5cb15b0SAndre Przywara #define RPI4_PRIMARY_CPU U(0) 28*f5cb15b0SAndre Przywara 29*f5cb15b0SAndre Przywara #define PLAT_MAX_PWR_LVL MPIDR_AFFLVL1 30*f5cb15b0SAndre Przywara #define PLAT_NUM_PWR_DOMAINS (PLATFORM_CLUSTER_COUNT + \ 31*f5cb15b0SAndre Przywara PLATFORM_CORE_COUNT) 32*f5cb15b0SAndre Przywara 33*f5cb15b0SAndre Przywara #define PLAT_MAX_RET_STATE U(1) 34*f5cb15b0SAndre Przywara #define PLAT_MAX_OFF_STATE U(2) 35*f5cb15b0SAndre Przywara 36*f5cb15b0SAndre Przywara /* Local power state for power domains in Run state. */ 37*f5cb15b0SAndre Przywara #define PLAT_LOCAL_STATE_RUN U(0) 38*f5cb15b0SAndre Przywara /* Local power state for retention. Valid only for CPU power domains */ 39*f5cb15b0SAndre Przywara #define PLAT_LOCAL_STATE_RET U(1) 40*f5cb15b0SAndre Przywara /* 41*f5cb15b0SAndre Przywara * Local power state for OFF/power-down. Valid for CPU and cluster power 42*f5cb15b0SAndre Przywara * domains. 43*f5cb15b0SAndre Przywara */ 44*f5cb15b0SAndre Przywara #define PLAT_LOCAL_STATE_OFF U(2) 45*f5cb15b0SAndre Przywara 46*f5cb15b0SAndre Przywara /* 47*f5cb15b0SAndre Przywara * Macros used to parse state information from State-ID if it is using the 48*f5cb15b0SAndre Przywara * recommended encoding for State-ID. 49*f5cb15b0SAndre Przywara */ 50*f5cb15b0SAndre Przywara #define PLAT_LOCAL_PSTATE_WIDTH U(4) 51*f5cb15b0SAndre Przywara #define PLAT_LOCAL_PSTATE_MASK ((U(1) << PLAT_LOCAL_PSTATE_WIDTH) - 1) 52*f5cb15b0SAndre Przywara 53*f5cb15b0SAndre Przywara /* 54*f5cb15b0SAndre Przywara * Some data must be aligned on the biggest cache line size in the platform. 55*f5cb15b0SAndre Przywara * This is known only to the platform as it might have a combination of 56*f5cb15b0SAndre Przywara * integrated and external caches. 57*f5cb15b0SAndre Przywara */ 58*f5cb15b0SAndre Przywara #define CACHE_WRITEBACK_SHIFT U(6) 59*f5cb15b0SAndre Przywara #define CACHE_WRITEBACK_GRANULE (U(1) << CACHE_WRITEBACK_SHIFT) 60*f5cb15b0SAndre Przywara 61*f5cb15b0SAndre Przywara /* 62*f5cb15b0SAndre Przywara * Partition memory into secure ROM, non-secure DRAM, secure "SRAM", and 63*f5cb15b0SAndre Przywara * secure DRAM. Note that this is all actually DRAM with different names, 64*f5cb15b0SAndre Przywara * there is no Secure RAM in the Raspberry Pi 4. 65*f5cb15b0SAndre Przywara */ 66*f5cb15b0SAndre Przywara #if RPI3_USE_UEFI_MAP 67*f5cb15b0SAndre Przywara #define SEC_ROM_BASE ULL(0x00000000) 68*f5cb15b0SAndre Przywara #define SEC_ROM_SIZE ULL(0x00010000) 69*f5cb15b0SAndre Przywara 70*f5cb15b0SAndre Przywara /* FIP placed after ROM to append it to BL1 with very little padding. */ 71*f5cb15b0SAndre Przywara #define PLAT_RPI3_FIP_BASE ULL(0x00020000) 72*f5cb15b0SAndre Przywara #define PLAT_RPI3_FIP_MAX_SIZE ULL(0x00010000) 73*f5cb15b0SAndre Przywara 74*f5cb15b0SAndre Przywara /* Reserve 2M of secure SRAM and DRAM, starting at 2M */ 75*f5cb15b0SAndre Przywara #define SEC_SRAM_BASE ULL(0x00200000) 76*f5cb15b0SAndre Przywara #define SEC_SRAM_SIZE ULL(0x00100000) 77*f5cb15b0SAndre Przywara 78*f5cb15b0SAndre Przywara #define SEC_DRAM0_BASE ULL(0x00300000) 79*f5cb15b0SAndre Przywara #define SEC_DRAM0_SIZE ULL(0x00100000) 80*f5cb15b0SAndre Przywara 81*f5cb15b0SAndre Przywara /* Windows on ARM requires some RAM at 4M */ 82*f5cb15b0SAndre Przywara #define NS_DRAM0_BASE ULL(0x00400000) 83*f5cb15b0SAndre Przywara #define NS_DRAM0_SIZE ULL(0x00C00000) 84*f5cb15b0SAndre Przywara #else 85*f5cb15b0SAndre Przywara #define SEC_ROM_BASE ULL(0x00000000) 86*f5cb15b0SAndre Przywara #define SEC_ROM_SIZE ULL(0x00020000) 87*f5cb15b0SAndre Przywara 88*f5cb15b0SAndre Przywara /* FIP placed after ROM to append it to BL1 with very little padding. */ 89*f5cb15b0SAndre Przywara #define PLAT_RPI3_FIP_BASE ULL(0x00020000) 90*f5cb15b0SAndre Przywara #define PLAT_RPI3_FIP_MAX_SIZE ULL(0x001E0000) 91*f5cb15b0SAndre Przywara 92*f5cb15b0SAndre Przywara /* We have 16M of memory reserved starting at 256M */ 93*f5cb15b0SAndre Przywara #define SEC_SRAM_BASE ULL(0x10000000) 94*f5cb15b0SAndre Przywara #define SEC_SRAM_SIZE ULL(0x00100000) 95*f5cb15b0SAndre Przywara 96*f5cb15b0SAndre Przywara #define SEC_DRAM0_BASE ULL(0x10100000) 97*f5cb15b0SAndre Przywara #define SEC_DRAM0_SIZE ULL(0x00F00000) 98*f5cb15b0SAndre Przywara /* End of reserved memory */ 99*f5cb15b0SAndre Przywara 100*f5cb15b0SAndre Przywara #define NS_DRAM0_BASE ULL(0x11000000) 101*f5cb15b0SAndre Przywara #define NS_DRAM0_SIZE ULL(0x01000000) 102*f5cb15b0SAndre Przywara #endif /* RPI3_USE_UEFI_MAP */ 103*f5cb15b0SAndre Przywara 104*f5cb15b0SAndre Przywara /* 105*f5cb15b0SAndre Przywara * BL33 entrypoint. 106*f5cb15b0SAndre Przywara */ 107*f5cb15b0SAndre Przywara #define PLAT_RPI3_NS_IMAGE_OFFSET NS_DRAM0_BASE 108*f5cb15b0SAndre Przywara #define PLAT_RPI3_NS_IMAGE_MAX_SIZE NS_DRAM0_SIZE 109*f5cb15b0SAndre Przywara 110*f5cb15b0SAndre Przywara /* 111*f5cb15b0SAndre Przywara * I/O registers. 112*f5cb15b0SAndre Przywara */ 113*f5cb15b0SAndre Przywara #define DEVICE0_BASE RPI_IO_BASE 114*f5cb15b0SAndre Przywara #define DEVICE0_SIZE RPI_IO_SIZE 115*f5cb15b0SAndre Przywara 116*f5cb15b0SAndre Przywara /* 117*f5cb15b0SAndre Przywara * TF-A lives in SRAM, partition it here 118*f5cb15b0SAndre Przywara */ 119*f5cb15b0SAndre Przywara #define SHARED_RAM_BASE SEC_SRAM_BASE 120*f5cb15b0SAndre Przywara #define SHARED_RAM_SIZE ULL(0x00001000) 121*f5cb15b0SAndre Przywara 122*f5cb15b0SAndre Przywara #define BL_RAM_BASE (SHARED_RAM_BASE + SHARED_RAM_SIZE) 123*f5cb15b0SAndre Przywara #define BL_RAM_SIZE (SEC_SRAM_SIZE - SHARED_RAM_SIZE) 124*f5cb15b0SAndre Przywara 125*f5cb15b0SAndre Przywara /* 126*f5cb15b0SAndre Przywara * Mailbox to control the secondary cores. All secondary cores are held in a 127*f5cb15b0SAndre Przywara * wait loop in cold boot. To release them perform the following steps (plus 128*f5cb15b0SAndre Przywara * any additional barriers that may be needed): 129*f5cb15b0SAndre Przywara * 130*f5cb15b0SAndre Przywara * uint64_t *entrypoint = (uint64_t *)PLAT_RPI3_TM_ENTRYPOINT; 131*f5cb15b0SAndre Przywara * *entrypoint = ADDRESS_TO_JUMP_TO; 132*f5cb15b0SAndre Przywara * 133*f5cb15b0SAndre Przywara * uint64_t *mbox_entry = (uint64_t *)PLAT_RPI3_TM_HOLD_BASE; 134*f5cb15b0SAndre Przywara * mbox_entry[cpu_id] = PLAT_RPI3_TM_HOLD_STATE_GO; 135*f5cb15b0SAndre Przywara * 136*f5cb15b0SAndre Przywara * sev(); 137*f5cb15b0SAndre Przywara */ 138*f5cb15b0SAndre Przywara #define PLAT_RPI3_TRUSTED_MAILBOX_BASE SHARED_RAM_BASE 139*f5cb15b0SAndre Przywara 140*f5cb15b0SAndre Przywara /* The secure entry point to be used on warm reset by all CPUs. */ 141*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_ENTRYPOINT PLAT_RPI3_TRUSTED_MAILBOX_BASE 142*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_ENTRYPOINT_SIZE ULL(8) 143*f5cb15b0SAndre Przywara 144*f5cb15b0SAndre Przywara /* Hold entries for each CPU. */ 145*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_HOLD_BASE (PLAT_RPI3_TM_ENTRYPOINT + \ 146*f5cb15b0SAndre Przywara PLAT_RPI3_TM_ENTRYPOINT_SIZE) 147*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_HOLD_ENTRY_SIZE ULL(8) 148*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_HOLD_SIZE (PLAT_RPI3_TM_HOLD_ENTRY_SIZE * \ 149*f5cb15b0SAndre Przywara PLATFORM_CORE_COUNT) 150*f5cb15b0SAndre Przywara 151*f5cb15b0SAndre Przywara #define PLAT_RPI3_TRUSTED_MAILBOX_SIZE (PLAT_RPI3_TM_ENTRYPOINT_SIZE + \ 152*f5cb15b0SAndre Przywara PLAT_RPI3_TM_HOLD_SIZE) 153*f5cb15b0SAndre Przywara 154*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_HOLD_STATE_WAIT ULL(0) 155*f5cb15b0SAndre Przywara #define PLAT_RPI3_TM_HOLD_STATE_GO ULL(1) 156*f5cb15b0SAndre Przywara 157*f5cb15b0SAndre Przywara /* 158*f5cb15b0SAndre Przywara * BL31 specific defines. 159*f5cb15b0SAndre Przywara * 160*f5cb15b0SAndre Przywara * Put BL31 at the top of the Trusted SRAM. BL31_BASE is calculated using the 161*f5cb15b0SAndre Przywara * current BL31 debug size plus a little space for growth. 162*f5cb15b0SAndre Przywara */ 163*f5cb15b0SAndre Przywara #define PLAT_MAX_BL31_SIZE ULL(0x20000) 164*f5cb15b0SAndre Przywara 165*f5cb15b0SAndre Przywara #define BL31_BASE ULL(0x1000) 166*f5cb15b0SAndre Przywara #define BL31_LIMIT ULL(0x100000) 167*f5cb15b0SAndre Przywara #define BL31_PROGBITS_LIMIT ULL(0x100000) 168*f5cb15b0SAndre Przywara 169*f5cb15b0SAndre Przywara #define SEC_SRAM_ID 0 170*f5cb15b0SAndre Przywara #define SEC_DRAM_ID 1 171*f5cb15b0SAndre Przywara 172*f5cb15b0SAndre Przywara /* 173*f5cb15b0SAndre Przywara * Other memory-related defines. 174*f5cb15b0SAndre Przywara */ 175*f5cb15b0SAndre Przywara #define PLAT_PHY_ADDR_SPACE_SIZE (ULL(1) << 32) 176*f5cb15b0SAndre Przywara #define PLAT_VIRT_ADDR_SPACE_SIZE (ULL(1) << 32) 177*f5cb15b0SAndre Przywara 178*f5cb15b0SAndre Przywara #define MAX_MMAP_REGIONS 8 179*f5cb15b0SAndre Przywara #define MAX_XLAT_TABLES 4 180*f5cb15b0SAndre Przywara 181*f5cb15b0SAndre Przywara #define MAX_IO_DEVICES U(3) 182*f5cb15b0SAndre Przywara #define MAX_IO_HANDLES U(4) 183*f5cb15b0SAndre Przywara 184*f5cb15b0SAndre Przywara #define MAX_IO_BLOCK_DEVICES U(1) 185*f5cb15b0SAndre Przywara 186*f5cb15b0SAndre Przywara /* 187*f5cb15b0SAndre Przywara * Serial-related constants. 188*f5cb15b0SAndre Przywara */ 189*f5cb15b0SAndre Przywara #define PLAT_RPI3_UART_BASE RPI3_MINI_UART_BASE 190*f5cb15b0SAndre Przywara #define PLAT_RPI3_UART_BAUDRATE ULL(115200) 191*f5cb15b0SAndre Przywara 192*f5cb15b0SAndre Przywara /* 193*f5cb15b0SAndre Przywara * System counter 194*f5cb15b0SAndre Przywara */ 195*f5cb15b0SAndre Przywara #define SYS_COUNTER_FREQ_IN_TICKS ULL(54000000) 196*f5cb15b0SAndre Przywara 197*f5cb15b0SAndre Przywara #endif /* PLATFORM_DEF_H */ 198