1*7bb01fb2SAntonio Nino Diaz /* 2*7bb01fb2SAntonio Nino Diaz * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. 3*7bb01fb2SAntonio Nino Diaz * 4*7bb01fb2SAntonio Nino Diaz * Redistribution and use in source and binary forms, with or without 5*7bb01fb2SAntonio Nino Diaz * modification, are permitted provided that the following conditions are met: 6*7bb01fb2SAntonio Nino Diaz * 7*7bb01fb2SAntonio Nino Diaz * Redistributions of source code must retain the above copyright notice, this 8*7bb01fb2SAntonio Nino Diaz * list of conditions and the following disclaimer. 9*7bb01fb2SAntonio Nino Diaz * 10*7bb01fb2SAntonio Nino Diaz * Redistributions in binary form must reproduce the above copyright notice, 11*7bb01fb2SAntonio Nino Diaz * this list of conditions and the following disclaimer in the documentation 12*7bb01fb2SAntonio Nino Diaz * and/or other materials provided with the distribution. 13*7bb01fb2SAntonio Nino Diaz * 14*7bb01fb2SAntonio Nino Diaz * Neither the name of ARM nor the names of its contributors may be used 15*7bb01fb2SAntonio Nino Diaz * to endorse or promote products derived from this software without specific 16*7bb01fb2SAntonio Nino Diaz * prior written permission. 17*7bb01fb2SAntonio Nino Diaz * 18*7bb01fb2SAntonio Nino Diaz * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*7bb01fb2SAntonio Nino Diaz * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*7bb01fb2SAntonio Nino Diaz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*7bb01fb2SAntonio Nino Diaz * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*7bb01fb2SAntonio Nino Diaz * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*7bb01fb2SAntonio Nino Diaz * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*7bb01fb2SAntonio Nino Diaz * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*7bb01fb2SAntonio Nino Diaz * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*7bb01fb2SAntonio Nino Diaz * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*7bb01fb2SAntonio Nino Diaz * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*7bb01fb2SAntonio Nino Diaz * POSSIBILITY OF SUCH DAMAGE. 29*7bb01fb2SAntonio Nino Diaz */ 30*7bb01fb2SAntonio Nino Diaz 31*7bb01fb2SAntonio Nino Diaz #ifndef __XLAT_TABLES_H__ 32*7bb01fb2SAntonio Nino Diaz #define __XLAT_TABLES_H__ 33*7bb01fb2SAntonio Nino Diaz 34*7bb01fb2SAntonio Nino Diaz #include <xlat_tables_defs.h> 35*7bb01fb2SAntonio Nino Diaz 36*7bb01fb2SAntonio Nino Diaz #ifndef __ASSEMBLY__ 37*7bb01fb2SAntonio Nino Diaz #include <stddef.h> 38*7bb01fb2SAntonio Nino Diaz #include <stdint.h> 39*7bb01fb2SAntonio Nino Diaz #include <xlat_mmu_helpers.h> 40*7bb01fb2SAntonio Nino Diaz 41*7bb01fb2SAntonio Nino Diaz /* Helper macro to define entries for mmap_region_t. It creates 42*7bb01fb2SAntonio Nino Diaz * identity mappings for each region. 43*7bb01fb2SAntonio Nino Diaz */ 44*7bb01fb2SAntonio Nino Diaz #define MAP_REGION_FLAT(adr, sz, attr) MAP_REGION(adr, adr, sz, attr) 45*7bb01fb2SAntonio Nino Diaz 46*7bb01fb2SAntonio Nino Diaz /* Helper macro to define entries for mmap_region_t. It allows to 47*7bb01fb2SAntonio Nino Diaz * re-map address mappings from 'pa' to 'va' for each region. 48*7bb01fb2SAntonio Nino Diaz */ 49*7bb01fb2SAntonio Nino Diaz #define MAP_REGION(pa, va, sz, attr) {(pa), (va), (sz), (attr)} 50*7bb01fb2SAntonio Nino Diaz 51*7bb01fb2SAntonio Nino Diaz /* 52*7bb01fb2SAntonio Nino Diaz * Shifts and masks to access fields of an mmap_attr_t 53*7bb01fb2SAntonio Nino Diaz */ 54*7bb01fb2SAntonio Nino Diaz #define MT_TYPE_MASK 0x7 55*7bb01fb2SAntonio Nino Diaz #define MT_TYPE(_attr) ((_attr) & MT_TYPE_MASK) 56*7bb01fb2SAntonio Nino Diaz /* Access permissions (RO/RW) */ 57*7bb01fb2SAntonio Nino Diaz #define MT_PERM_SHIFT 3 58*7bb01fb2SAntonio Nino Diaz /* Security state (SECURE/NS) */ 59*7bb01fb2SAntonio Nino Diaz #define MT_SEC_SHIFT 4 60*7bb01fb2SAntonio Nino Diaz /* Access permissions for instruction execution (EXECUTE/EXECUTE_NEVER) */ 61*7bb01fb2SAntonio Nino Diaz #define MT_EXECUTE_SHIFT 5 62*7bb01fb2SAntonio Nino Diaz 63*7bb01fb2SAntonio Nino Diaz /* 64*7bb01fb2SAntonio Nino Diaz * Memory mapping attributes 65*7bb01fb2SAntonio Nino Diaz */ 66*7bb01fb2SAntonio Nino Diaz typedef enum { 67*7bb01fb2SAntonio Nino Diaz /* 68*7bb01fb2SAntonio Nino Diaz * Memory types supported. 69*7bb01fb2SAntonio Nino Diaz * These are organised so that, going down the list, the memory types 70*7bb01fb2SAntonio Nino Diaz * are getting weaker; conversely going up the list the memory types are 71*7bb01fb2SAntonio Nino Diaz * getting stronger. 72*7bb01fb2SAntonio Nino Diaz */ 73*7bb01fb2SAntonio Nino Diaz MT_DEVICE, 74*7bb01fb2SAntonio Nino Diaz MT_NON_CACHEABLE, 75*7bb01fb2SAntonio Nino Diaz MT_MEMORY, 76*7bb01fb2SAntonio Nino Diaz /* Values up to 7 are reserved to add new memory types in the future */ 77*7bb01fb2SAntonio Nino Diaz 78*7bb01fb2SAntonio Nino Diaz MT_RO = 0 << MT_PERM_SHIFT, 79*7bb01fb2SAntonio Nino Diaz MT_RW = 1 << MT_PERM_SHIFT, 80*7bb01fb2SAntonio Nino Diaz 81*7bb01fb2SAntonio Nino Diaz MT_SECURE = 0 << MT_SEC_SHIFT, 82*7bb01fb2SAntonio Nino Diaz MT_NS = 1 << MT_SEC_SHIFT, 83*7bb01fb2SAntonio Nino Diaz 84*7bb01fb2SAntonio Nino Diaz /* 85*7bb01fb2SAntonio Nino Diaz * Access permissions for instruction execution are only relevant for 86*7bb01fb2SAntonio Nino Diaz * normal read-only memory, i.e. MT_MEMORY | MT_RO. They are ignored 87*7bb01fb2SAntonio Nino Diaz * (and potentially overridden) otherwise: 88*7bb01fb2SAntonio Nino Diaz * - Device memory is always marked as execute-never. 89*7bb01fb2SAntonio Nino Diaz * - Read-write normal memory is always marked as execute-never. 90*7bb01fb2SAntonio Nino Diaz */ 91*7bb01fb2SAntonio Nino Diaz MT_EXECUTE = 0 << MT_EXECUTE_SHIFT, 92*7bb01fb2SAntonio Nino Diaz MT_EXECUTE_NEVER = 1 << MT_EXECUTE_SHIFT, 93*7bb01fb2SAntonio Nino Diaz } mmap_attr_t; 94*7bb01fb2SAntonio Nino Diaz 95*7bb01fb2SAntonio Nino Diaz #define MT_CODE (MT_MEMORY | MT_RO | MT_EXECUTE) 96*7bb01fb2SAntonio Nino Diaz #define MT_RO_DATA (MT_MEMORY | MT_RO | MT_EXECUTE_NEVER) 97*7bb01fb2SAntonio Nino Diaz 98*7bb01fb2SAntonio Nino Diaz /* 99*7bb01fb2SAntonio Nino Diaz * Structure for specifying a single region of memory. 100*7bb01fb2SAntonio Nino Diaz */ 101*7bb01fb2SAntonio Nino Diaz typedef struct mmap_region { 102*7bb01fb2SAntonio Nino Diaz unsigned long long base_pa; 103*7bb01fb2SAntonio Nino Diaz uintptr_t base_va; 104*7bb01fb2SAntonio Nino Diaz size_t size; 105*7bb01fb2SAntonio Nino Diaz mmap_attr_t attr; 106*7bb01fb2SAntonio Nino Diaz } mmap_region_t; 107*7bb01fb2SAntonio Nino Diaz 108*7bb01fb2SAntonio Nino Diaz /* Generic translation table APIs */ 109*7bb01fb2SAntonio Nino Diaz void init_xlat_tables(void); 110*7bb01fb2SAntonio Nino Diaz void mmap_add_region(unsigned long long base_pa, uintptr_t base_va, 111*7bb01fb2SAntonio Nino Diaz size_t size, unsigned int attr); 112*7bb01fb2SAntonio Nino Diaz void mmap_add(const mmap_region_t *mm); 113*7bb01fb2SAntonio Nino Diaz 114*7bb01fb2SAntonio Nino Diaz #endif /*__ASSEMBLY__*/ 115*7bb01fb2SAntonio Nino Diaz #endif /* __XLAT_TABLES_H__ */ 116