1 /* 2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef __XLAT_TABLES_PRIVATE_H__ 8 #define __XLAT_TABLES_PRIVATE_H__ 9 10 #include <cassert.h> 11 #include <platform_def.h> 12 #include <utils_def.h> 13 14 /* 15 * If the platform hasn't defined a physical and a virtual address space size 16 * default to ADDR_SPACE_SIZE. 17 */ 18 #if ERROR_DEPRECATED 19 # ifdef ADDR_SPACE_SIZE 20 # error "ADDR_SPACE_SIZE is deprecated. Use PLAT_xxx_ADDR_SPACE_SIZE instead." 21 # endif 22 #elif defined(ADDR_SPACE_SIZE) 23 # ifndef PLAT_PHY_ADDR_SPACE_SIZE 24 # define PLAT_PHY_ADDR_SPACE_SIZE ADDR_SPACE_SIZE 25 # endif 26 # ifndef PLAT_VIRT_ADDR_SPACE_SIZE 27 # define PLAT_VIRT_ADDR_SPACE_SIZE ADDR_SPACE_SIZE 28 # endif 29 #endif 30 31 /* The virtual and physical address space sizes must be powers of two. */ 32 CASSERT(IS_POWER_OF_TWO(PLAT_VIRT_ADDR_SPACE_SIZE), 33 assert_valid_virt_addr_space_size); 34 CASSERT(IS_POWER_OF_TWO(PLAT_PHY_ADDR_SPACE_SIZE), 35 assert_valid_phy_addr_space_size); 36 37 /* 38 * In AArch32 state, the MMU only supports 4KB page granularity, which means 39 * that the first translation table level is either 1 or 2. Both of them are 40 * allowed to have block and table descriptors. See section G4.5.6 of the 41 * ARMv8-A Architecture Reference Manual (DDI 0487A.k) for more information. 42 * 43 * In AArch64 state, the MMU may support 4 KB, 16 KB and 64 KB page 44 * granularity. For 4KB granularity, a level 0 table descriptor doesn't support 45 * block translation. For 16KB, the same thing happens to levels 0 and 1. For 46 * 64KB, same for level 1. See section D4.3.1 of the ARMv8-A Architecture 47 * Reference Manual (DDI 0487A.k) for more information. 48 * 49 * The define below specifies the first table level that allows block 50 * descriptors. 51 */ 52 53 #ifdef AARCH32 54 55 # define XLAT_BLOCK_LEVEL_MIN 1 56 57 #else /* if AArch64 */ 58 59 # if PAGE_SIZE == (4*1024) /* 4KB */ 60 # define XLAT_BLOCK_LEVEL_MIN 1 61 # else /* 16KB or 64KB */ 62 # define XLAT_BLOCK_LEVEL_MIN 2 63 # endif 64 65 #endif /* AARCH32 */ 66 67 void print_mmap(void); 68 void init_xlation_table(uintptr_t base_va, uint64_t *table, 69 int level, uintptr_t *max_va, 70 unsigned long long *max_pa); 71 72 #endif /* __XLAT_TABLES_PRIVATE_H__ */ 73