diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/arch/aarch64/arch.h | 5 | ||||
-rw-r--r-- | include/arch/aarch64/arch_features.h | 6 | ||||
-rw-r--r-- | include/lib/xlat_tables/aarch32/xlat_tables_aarch32.h | 3 | ||||
-rw-r--r-- | include/lib/xlat_tables/aarch64/xlat_tables_aarch64.h | 29 | ||||
-rw-r--r-- | include/lib/xlat_tables/xlat_tables_arch.h | 12 | ||||
-rw-r--r-- | include/lib/xlat_tables/xlat_tables_v2_helpers.h | 3 |
6 files changed, 33 insertions, 25 deletions
diff --git a/include/arch/aarch64/arch.h b/include/arch/aarch64/arch.h index 9e2bfface1..76c3e277bd 100644 --- a/include/arch/aarch64/arch.h +++ b/include/arch/aarch64/arch.h @@ -204,6 +204,10 @@ /* ID_AA64MMFR2_EL1 definitions */ #define ID_AA64MMFR2_EL1 S3_0_C0_C7_2 + +#define ID_AA64MMFR2_EL1_ST_SHIFT U(28) +#define ID_AA64MMFR2_EL1_ST_MASK ULL(0xf) + #define ID_AA64MMFR2_EL1_CNP_SHIFT U(0) #define ID_AA64MMFR2_EL1_CNP_MASK ULL(0xf) @@ -427,6 +431,7 @@ #define TCR_TxSZ_MIN ULL(16) #define TCR_TxSZ_MAX ULL(39) +#define TCR_TxSZ_MAX_TTST ULL(48) /* (internal) physical address size bits in EL3/EL1 */ #define TCR_PS_BITS_4GB ULL(0x0) diff --git a/include/arch/aarch64/arch_features.h b/include/arch/aarch64/arch_features.h index 2b09ba07f9..9bf43bf85a 100644 --- a/include/arch/aarch64/arch_features.h +++ b/include/arch/aarch64/arch_features.h @@ -17,4 +17,10 @@ static inline bool is_armv8_2_ttcnp_present(void) ID_AA64MMFR2_EL1_CNP_MASK) != 0U; } +static inline bool is_armv8_4_ttst_present(void) +{ + return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) & + ID_AA64MMFR2_EL1_ST_MASK) == 1U; +} + #endif /* ARCH_FEATURES_H */ diff --git a/include/lib/xlat_tables/aarch32/xlat_tables_aarch32.h b/include/lib/xlat_tables/aarch32/xlat_tables_aarch32.h index a333d1e4e3..30eb5e9ec4 100644 --- a/include/lib/xlat_tables/aarch32/xlat_tables_aarch32.h +++ b/include/lib/xlat_tables/aarch32/xlat_tables_aarch32.h @@ -63,8 +63,7 @@ * is 1. * * Note that this macro assumes that the given virtual address space size is - * valid. Therefore, the caller is expected to check it is the case using the - * CHECK_VIRT_ADDR_SPACE_SIZE() macro first. + * valid. */ #define GET_XLAT_TABLE_LEVEL_BASE(_virt_addr_space_sz) \ (((_virt_addr_space_sz) > (ULL(1) << L1_XLAT_ADDRESS_SHIFT)) ? \ diff --git a/include/lib/xlat_tables/aarch64/xlat_tables_aarch64.h b/include/lib/xlat_tables/aarch64/xlat_tables_aarch64.h index cc5624c91e..3014c8fea4 100644 --- a/include/lib/xlat_tables/aarch64/xlat_tables_aarch64.h +++ b/include/lib/xlat_tables/aarch64/xlat_tables_aarch64.h @@ -43,14 +43,22 @@ unsigned long long tcr_physical_addr_size_bits(unsigned long long max_addr); * state. * * TCR.TxSZ is calculated as 64 minus the width of said address space. - * The value of TCR.TxSZ must be in the range 16 to 39 [1], which means that - * the virtual address space width must be in the range 48 to 25 bits. + * The value of TCR.TxSZ must be in the range 16 to 39 [1] or 48 [2], + * depending on Small Translation Table Support which means that + * the virtual address space width must be in the range 48 to 25 or 16 bits. * * [1] See the ARMv8-A Architecture Reference Manual (DDI 0487A.j) for more * information: * Page 1730: 'Input address size', 'For all translation stages'. + * [2] See section 12.2.55 in the ARMv8-A Architecture Reference Manual + * (DDI 0487D.a) */ +/* Maximum value of TCR_ELx.T(0,1)SZ is 39 */ #define MIN_VIRT_ADDR_SPACE_SIZE (ULL(1) << (U(64) - TCR_TxSZ_MAX)) + +/* Maximum value of TCR_ELx.T(0,1)SZ is 48 */ +#define MIN_VIRT_ADDR_SPACE_SIZE_TTST \ + (ULL(1) << (U(64) - TCR_TxSZ_MAX_TTST)) #define MAX_VIRT_ADDR_SPACE_SIZE (ULL(1) << (U(64) - TCR_TxSZ_MIN)) /* @@ -58,9 +66,13 @@ unsigned long long tcr_physical_addr_size_bits(unsigned long long max_addr); * virtual address space size. For a 4 KB page size, * - level 0 supports virtual address spaces of widths 48 to 40 bits; * - level 1 from 39 to 31; - * - level 2 from 30 to 25. + * - level 2 from 30 to 22. + * - level 3 from 21 to 16. * - * Wider or narrower address spaces are not supported. As a result, level 3 + * Small Translation Table (Armv8.4-TTST) support allows the starting level + * of the translation table from 3 for 4KB granularity. See section 12.2.55 in + * the ARMv8-A Architecture Reference Manual (DDI 0487D.a). In Armv8.3 and below + * wider or narrower address spaces are not supported. As a result, level 3 * cannot be used as initial lookup level with 4 KB granularity. See section * D4.2.5 in the ARMv8-A Architecture Reference Manual (DDI 0487A.j) for more * information. @@ -71,13 +83,14 @@ unsigned long long tcr_physical_addr_size_bits(unsigned long long max_addr); * is 1. * * Note that this macro assumes that the given virtual address space size is - * valid. Therefore, the caller is expected to check it is the case using the - * CHECK_VIRT_ADDR_SPACE_SIZE() macro first. + * valid. */ #define GET_XLAT_TABLE_LEVEL_BASE(_virt_addr_space_sz) \ (((_virt_addr_space_sz) > (ULL(1) << L0_XLAT_ADDRESS_SHIFT)) \ ? 0U \ - : (((_virt_addr_space_sz) > (ULL(1) << L1_XLAT_ADDRESS_SHIFT)) \ - ? 1U : 2U)) + : (((_virt_addr_space_sz) > (ULL(1) << L1_XLAT_ADDRESS_SHIFT)) \ + ? 1U \ + : (((_virt_addr_space_sz) > (ULL(1) << L2_XLAT_ADDRESS_SHIFT)) \ + ? 2U : 3U))) #endif /* XLAT_TABLES_AARCH64_H */ diff --git a/include/lib/xlat_tables/xlat_tables_arch.h b/include/lib/xlat_tables/xlat_tables_arch.h index 251b0206ac..723753403b 100644 --- a/include/lib/xlat_tables/xlat_tables_arch.h +++ b/include/lib/xlat_tables/xlat_tables_arch.h @@ -14,18 +14,6 @@ #endif /* - * Evaluates to 1 if the given virtual address space size is valid, or 0 if it's - * not. - * - * A valid size is one that is a power of 2 and is within the architectural - * limits. Not that these limits are different for AArch32 and AArch64. - */ -#define CHECK_VIRT_ADDR_SPACE_SIZE(size) \ - (((unsigned long long)(size) >= MIN_VIRT_ADDR_SPACE_SIZE) && \ - ((unsigned long long)(size) <= MAX_VIRT_ADDR_SPACE_SIZE) && \ - IS_POWER_OF_TWO(size)) - -/* * Evaluates to 1 if the given physical address space size is a power of 2, * or 0 if it's not. */ diff --git a/include/lib/xlat_tables/xlat_tables_v2_helpers.h b/include/lib/xlat_tables/xlat_tables_v2_helpers.h index ce5cf820a0..6a1be3258c 100644 --- a/include/lib/xlat_tables/xlat_tables_v2_helpers.h +++ b/include/lib/xlat_tables/xlat_tables_v2_helpers.h @@ -125,9 +125,6 @@ struct xlat_ctx { #define REGISTER_XLAT_CONTEXT_FULL_SPEC(_ctx_name, _mmap_count, \ _xlat_tables_count, _virt_addr_space_size, \ _phy_addr_space_size, _xlat_regime, _section_name)\ - CASSERT(CHECK_VIRT_ADDR_SPACE_SIZE(_virt_addr_space_size), \ - assert_invalid_virtual_addr_space_size_for_##_ctx_name);\ - \ CASSERT(CHECK_PHY_ADDR_SPACE_SIZE(_phy_addr_space_size), \ assert_invalid_physical_addr_space_sizefor_##_ctx_name);\ \ |