1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. 4 */ 5 6 #include <arch.h> 7 #include <arch_helpers.h> 8 #include <assert.h> 9 #include <stdint.h> 10 #include <utils_def.h> 11 12 /* 13 * Return the PA width supported by the current system. 14 */ arch_feat_get_pa_width(void)15unsigned int arch_feat_get_pa_width(void) 16 { 17 /* 18 * Physical Address ranges supported in the AArch64 Memory Model. 19 * Value 0b110 is supported in ARMv8.2 onwards but not used in RMM. 20 */ 21 static const unsigned int pa_range_bits_arr[] = { 22 PARANGE_0000_WIDTH, PARANGE_0001_WIDTH, PARANGE_0010_WIDTH, 23 PARANGE_0011_WIDTH, PARANGE_0100_WIDTH, PARANGE_0101_WIDTH, 24 /* 25 * FEAT_LPA/LPA2 is not supported yet in RMM, 26 * so max PA width is 48. 27 */ 28 PARANGE_0101_WIDTH 29 }; 30 31 register_t pa_range = (read_id_aa64mmfr0_el1() >> 32 ID_AA64MMFR0_EL1_PARANGE_SHIFT) & 33 ID_AA64MMFR0_EL1_PARANGE_MASK; 34 35 assert(pa_range < ARRAY_SIZE(pa_range_bits_arr)); 36 37 return pa_range_bits_arr[pa_range]; 38 } 39