1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2021, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef XLAT_TABLES_H 8*91f16700Schasinglulu #define XLAT_TABLES_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_defs.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #ifndef __ASSEMBLER__ 13*91f16700Schasinglulu #include <stddef.h> 14*91f16700Schasinglulu #include <stdint.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #include <lib/xlat_tables/xlat_mmu_helpers.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu /* Helper macro to define entries for mmap_region_t. It creates 19*91f16700Schasinglulu * identity mappings for each region. 20*91f16700Schasinglulu */ 21*91f16700Schasinglulu #define MAP_REGION_FLAT(adr, sz, attr) MAP_REGION(adr, adr, sz, attr) 22*91f16700Schasinglulu 23*91f16700Schasinglulu /* Helper macro to define entries for mmap_region_t. It allows to 24*91f16700Schasinglulu * re-map address mappings from 'pa' to 'va' for each region. 25*91f16700Schasinglulu */ 26*91f16700Schasinglulu #define MAP_REGION(pa, va, sz, attr) {(pa), (va), (sz), (attr)} 27*91f16700Schasinglulu 28*91f16700Schasinglulu /* 29*91f16700Schasinglulu * Shifts and masks to access fields of an mmap attribute 30*91f16700Schasinglulu */ 31*91f16700Schasinglulu #define MT_TYPE_MASK U(0x7) 32*91f16700Schasinglulu #define MT_TYPE(_attr) ((_attr) & MT_TYPE_MASK) 33*91f16700Schasinglulu /* Access permissions (RO/RW) */ 34*91f16700Schasinglulu #define MT_PERM_SHIFT U(3) 35*91f16700Schasinglulu /* Security state (SECURE/NS) */ 36*91f16700Schasinglulu #define MT_SEC_SHIFT U(4) 37*91f16700Schasinglulu /* Access permissions for instruction execution (EXECUTE/EXECUTE_NEVER) */ 38*91f16700Schasinglulu #define MT_EXECUTE_SHIFT U(5) 39*91f16700Schasinglulu 40*91f16700Schasinglulu /* 41*91f16700Schasinglulu * Memory mapping attributes 42*91f16700Schasinglulu */ 43*91f16700Schasinglulu 44*91f16700Schasinglulu /* 45*91f16700Schasinglulu * Memory types supported. 46*91f16700Schasinglulu * These are organised so that, going down the list, the memory types are 47*91f16700Schasinglulu * getting weaker; conversely going up the list the memory types are getting 48*91f16700Schasinglulu * stronger. 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu #define MT_DEVICE U(0) 51*91f16700Schasinglulu #define MT_NON_CACHEABLE U(1) 52*91f16700Schasinglulu #define MT_MEMORY U(2) 53*91f16700Schasinglulu /* Values up to 7 are reserved to add new memory types in the future */ 54*91f16700Schasinglulu 55*91f16700Schasinglulu #define MT_RO (U(0) << MT_PERM_SHIFT) 56*91f16700Schasinglulu #define MT_RW (U(1) << MT_PERM_SHIFT) 57*91f16700Schasinglulu 58*91f16700Schasinglulu #define MT_SECURE (U(0) << MT_SEC_SHIFT) 59*91f16700Schasinglulu #define MT_NS (U(1) << MT_SEC_SHIFT) 60*91f16700Schasinglulu 61*91f16700Schasinglulu /* 62*91f16700Schasinglulu * Access permissions for instruction execution are only relevant for normal 63*91f16700Schasinglulu * read-only memory, i.e. MT_MEMORY | MT_RO. They are ignored (and potentially 64*91f16700Schasinglulu * overridden) otherwise: 65*91f16700Schasinglulu * - Device memory is always marked as execute-never. 66*91f16700Schasinglulu * - Read-write normal memory is always marked as execute-never. 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu #define MT_EXECUTE (U(0) << MT_EXECUTE_SHIFT) 69*91f16700Schasinglulu #define MT_EXECUTE_NEVER (U(1) << MT_EXECUTE_SHIFT) 70*91f16700Schasinglulu 71*91f16700Schasinglulu /* Compound attributes for most common usages */ 72*91f16700Schasinglulu #define MT_CODE (MT_MEMORY | MT_RO | MT_EXECUTE) 73*91f16700Schasinglulu #define MT_RO_DATA (MT_MEMORY | MT_RO | MT_EXECUTE_NEVER) 74*91f16700Schasinglulu 75*91f16700Schasinglulu /* Memory type for EL3 regions */ 76*91f16700Schasinglulu #if ENABLE_RME 77*91f16700Schasinglulu #error FEAT_RME requires version 2 of the Translation Tables Library 78*91f16700Schasinglulu #else 79*91f16700Schasinglulu #define EL3_PAS MT_SECURE 80*91f16700Schasinglulu #endif 81*91f16700Schasinglulu 82*91f16700Schasinglulu /* 83*91f16700Schasinglulu * Structure for specifying a single region of memory. 84*91f16700Schasinglulu */ 85*91f16700Schasinglulu typedef struct mmap_region { 86*91f16700Schasinglulu unsigned long long base_pa; 87*91f16700Schasinglulu uintptr_t base_va; 88*91f16700Schasinglulu size_t size; 89*91f16700Schasinglulu unsigned int attr; 90*91f16700Schasinglulu } mmap_region_t; 91*91f16700Schasinglulu 92*91f16700Schasinglulu /* Generic translation table APIs */ 93*91f16700Schasinglulu void init_xlat_tables(void); 94*91f16700Schasinglulu void mmap_add_region(unsigned long long base_pa, uintptr_t base_va, 95*91f16700Schasinglulu size_t size, unsigned int attr); 96*91f16700Schasinglulu void mmap_add(const mmap_region_t *mm); 97*91f16700Schasinglulu 98*91f16700Schasinglulu #endif /*__ASSEMBLER__*/ 99*91f16700Schasinglulu #endif /* XLAT_TABLES_H */ 100