blob: 0ee01203af03352f29a3a2a3d8b69fc4419f5b0e [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2018, Linaro Limited
*/
#ifndef __MM_GENERIC_RAM_LAYOUT_H
#define __MM_GENERIC_RAM_LAYOUT_H
#include <util.h>
/*
* Generic RAM layout configuration directives
*
* Mandatory directives:
* CFG_TZDRAM_START
* CFG_TZDRAM_SIZE
* CFG_SHMEM_START
* CFG_SHMEM_SIZE
*
* Optional directives:
* CFG_TEE_LOAD_ADDR If defined sets TEE_LOAD_ADDR. If not, TEE_LOAD_ADDR
* is set by the platform or defaults to TEE_RAM_START.
* CFG_TEE_RAM_VA_SIZE Some platforms may have specific needs
*
* Optional directives when pager is enabled:
* CFG_TZSRAM_START If no set, emulated at CFG_TZDRAM_START
* CFG_TZSRAM_SIZE Default to CFG_CORE_TZSRAM_EMUL_SIZE
*
* Optional directive when CFG_SECURE_DATA_PATH is enabled:
* CFG_TEE_SDP_MEM_SIZE If CFG_TEE_SDP_MEM_BASE is not defined, SDP test
* memory byte size can be set by CFG_TEE_SDP_MEM_SIZE.
*
* This header file produces the following generic macros upon the mandatory
* and optional configuration directives listed above:
*
* TEE_RAM_START TEE core RAM physical base address
* TEE_RAM_VA_SIZE TEE core virtual memory address range size
* TEE_RAM_PH_SIZE TEE core physical RAM byte size
* TA_RAM_START TA contexts/pagestore RAM physical base address
* TA_RAM_SIZE TA contexts/pagestore RAM byte size
* TEE_SHMEM_START Non-secure static shared memory physical base address
* TEE_SHMEM_SIZE Non-secure static shared memory byte size
*
* TZDRAM_BASE Main/external secure RAM base address
* TZDRAM_SIZE Main/external secure RAM byte size
* TZSRAM_BASE On-chip secure RAM base address, required by pager.
* TZSRAM_SIZE On-chip secure RAM byte size, required by pager.
*
* TEE_LOAD_ADDR Only defined here if CFG_TEE_LOAD_ADDR is defined.
* Otherwise we expect the platform_config.h to define it
* unless which LEE_LOAD_ADDR defaults to TEE_RAM_START.
*
* TEE_RAM_VA_SIZE Set to CFG_TEE_RAM_VA_SIZE or defaults to
* CORE_MMU_PGDIR_SIZE.
*
* TEE_SDP_TEST_MEM_BASE Define if a SDP memory pool is required and none set.
* Always defined in the inner top (high addresses)
* of CFG_TZDRAM_START/_SIZE.
* TEE_SDP_TEST_MEM_SIZE Set to CFG_TEE_SDP_MEM_SIZE or a default size.
*
* ----------------------------------------------------------------------------
* TEE RAM layout without CFG_WITH_PAGER
*_
* +----------------------------------+ <-- CFG_TZDRAM_START
* | TEE core secure RAM (TEE_RAM) |
* +----------------------------------+
* | Trusted Application RAM (TA_RAM) |
* +----------------------------------+
* | SDP test memory (optional) |
* +----------------------------------+ <-- CFG_TZDRAM_START + CFG_TZDRAM_SIZE
*
* +----------------------------------+ <-- CFG_SHMEM_START
* | Non-secure static SHM |
* +----------------------------------+ <-- CFG_SHMEM_START + CFG_SHMEM_SIZE
*
* ----------------------------------------------------------------------------
* TEE RAM layout with CFG_WITH_PAGER=y and undefined CFG_TZSRAM_START/_SIZE
*
* +----------------------------------+ <-- CFG_TZDRAM_START
* | TEE core secure RAM (TEE_RAM) | | | CFG_CORE_TZSRAM_EMUL_SIZE
* +----------------------------------+ --|-'
* | reserved (for kasan) | | TEE_RAM_VA_SIZE
* +----------------------------------+ --'
* | TA RAM / Pagestore (TA_RAM) |
* +----------------------------------+ <---- align with CORE_MMU_PGDIR_SIZE
* +----------------------------------+ <--
* | SDP test memory (optional) | | CFG_TEE_SDP_MEM_SIZE
* +----------------------------------+ <-+ CFG_TZDRAM_START + CFG_TZDRAM_SIZE
*
* +----------------------------------+ <-- CFG_SHMEM_START
* | Non-secure static SHM | |
* +----------------------------------+ v CFG_SHMEM_SIZE
*
* ----------------------------------------------------------------------------
* TEE RAM layout with CFG_WITH_PAGER=y and define CFG_TZSRAM_START/_SIZE
*
* +----------------------------------+ <-- CFG_TZSRAM_START
* | TEE core secure RAM (TEE_RAM) | | CFG_TZSRAM_SIZE
* +----------------------------------+ --'
*
* +----------------------------------+ <- CFG_TZDRAM_START
* | TA RAM / Pagestore (TA_RAM) |
* |----------------------------------+ <---- align with CORE_MMU_PGDIR_SIZE
* |----------------------------------+ <--
* | SDP test memory (optional) | | CFG_TEE_SDP_MEM_SIZE
* +----------------------------------+ <-+ CFG_TZDRAM_START + CFG_TZDRAM_SIZE
*
* +----------------------------------+ <-- CFG_SHMEM_START
* | Non-secure static SHM | |
* +----------------------------------+ v CFG_SHMEM_SIZE
*/
#ifdef CFG_TEE_LOAD_ADDR
#define TEE_LOAD_ADDR CFG_TEE_LOAD_ADDR
#else
/* Platform specific platform_config.h may set TEE_LOAD_ADDR */
#endif
#ifdef CFG_TEE_RAM_VA_SIZE
#define TEE_RAM_VA_SIZE CFG_TEE_RAM_VA_SIZE
#else
#define TEE_RAM_VA_SIZE CORE_MMU_PGDIR_SIZE
#endif
#ifdef CFG_SHMEM_SIZE
#define TEE_SHMEM_SIZE CFG_SHMEM_SIZE
#endif
#ifdef CFG_SHMEM_START
#define TEE_SHMEM_START CFG_SHMEM_START
#ifndef CFG_SHMEM_SIZE
#error CFG_SHMEM_START mandates CFG_SHMEM_SIZE
#endif
#endif
#if defined(CFG_TZSRAM_START)
#define TZSRAM_BASE CFG_TZSRAM_START
#define TZSRAM_SIZE CFG_TZSRAM_SIZE
#endif
#ifdef CFG_TZDRAM_START
#if !defined(CFG_WITH_PAGER) || defined(CFG_TZSRAM_START)
#define TZDRAM_BASE CFG_TZDRAM_START
#define TZDRAM_SIZE CFG_TZDRAM_SIZE
#else
#define TZSRAM_BASE CFG_TZDRAM_START
#define TZSRAM_SIZE CFG_CORE_TZSRAM_EMUL_SIZE
#define TZDRAM_BASE ROUNDUP(TZSRAM_BASE + TZSRAM_SIZE, \
TEE_RAM_VA_SIZE)
#define TZDRAM_SIZE (CFG_TZDRAM_START + (CFG_TZDRAM_SIZE - \
TZDRAM_BASE))
#endif
#ifdef CFG_WITH_PAGER
#define TEE_RAM_START TZSRAM_BASE
#define TEE_RAM_PH_SIZE TZSRAM_SIZE
#define TA_RAM_START ROUNDUP(TZDRAM_BASE, CORE_MMU_PGDIR_SIZE)
#else
#define TEE_RAM_START TZDRAM_BASE
#define TEE_RAM_PH_SIZE TEE_RAM_VA_SIZE
#define TA_RAM_START ROUNDUP(TZDRAM_BASE + TEE_RAM_VA_SIZE, \
SMALL_PAGE_SIZE)
#endif /*CFG_WITH_PAGER*/
#define TA_RAM_SIZE (ROUNDDOWN(TZDRAM_BASE + (TZDRAM_SIZE - \
TEE_SDP_TEST_MEM_SIZE), \
SMALL_PAGE_SIZE) - TA_RAM_START)
#endif /*CFG_TZDRAM_START*/
/*
* Secure data path test memory pool
* - If SDP is disabled, no SDP test memory needed.
* - If SDP is enabled, if CFG_TEE_SDP_MEM_BASE, SDP test pool is not needed.
* - If SDP is enabled and CFG_TEE_SDP_MEM_BASE not defined, a SDP test pool
* is defined at the end of the secure RAM. CFG_TEE_SDP_MEM_SIZE can set
* its size otherwise it defaults to 4MB.
*/
#if !defined(CFG_SECURE_DATA_PATH) || defined(CFG_TEE_SDP_MEM_BASE)
#define TEE_SDP_TEST_MEM_SIZE 0
#else
#ifdef CFG_TEE_SDP_MEM_SIZE
#define TEE_SDP_TEST_MEM_SIZE CFG_TEE_SDP_MEM_SIZE
#else
#define TEE_SDP_TEST_MEM_SIZE SIZE_4M
#endif
#define TEE_SDP_TEST_MEM_BASE (CFG_TZDRAM_START + (CFG_TZDRAM_SIZE - \
TEE_SDP_TEST_MEM_SIZE))
#endif
#endif /*__MM_GENERIC_RAM_LAYOUT_H*/