12559b2c8SAntonio Nino Diaz /* 2fd1dd4cbSAndre Przywara * Copyright (c) 2019-2023, Arm Limited. All rights reserved. 32559b2c8SAntonio Nino Diaz * 42559b2c8SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 52559b2c8SAntonio Nino Diaz */ 62559b2c8SAntonio Nino Diaz 72559b2c8SAntonio Nino Diaz #ifndef ARCH_FEATURES_H 82559b2c8SAntonio Nino Diaz #define ARCH_FEATURES_H 92559b2c8SAntonio Nino Diaz 102559b2c8SAntonio Nino Diaz #include <stdbool.h> 112559b2c8SAntonio Nino Diaz 122559b2c8SAntonio Nino Diaz #include <arch_helpers.h> 13fc8d2d39SAndre Przywara #include <common/feat_detect.h> 142559b2c8SAntonio Nino Diaz 15fd1dd4cbSAndre Przywara #define ISOLATE_FIELD(reg, feat) \ 16fd1dd4cbSAndre Przywara ((unsigned int)(((reg) >> (feat ## _SHIFT)) & (feat ## _MASK))) 17fd1dd4cbSAndre Przywara 1829a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void) 1929a24134SAntonio Nino Diaz { 20fd1dd4cbSAndre Przywara return ISOLATE_FIELD(read_id_pfr1(), ID_PFR1_GENTIMER) != 0U; 2129a24134SAntonio Nino Diaz } 2229a24134SAntonio Nino Diaz 232559b2c8SAntonio Nino Diaz static inline bool is_armv8_2_ttcnp_present(void) 242559b2c8SAntonio Nino Diaz { 25fd1dd4cbSAndre Przywara return ISOLATE_FIELD(read_id_mmfr4(), ID_MMFR4_CNP) != 0U; 262559b2c8SAntonio Nino Diaz } 272559b2c8SAntonio Nino Diaz 28*b57e16a4SAndre Przywara static unsigned int read_feat_amu_id_field(void) 29*b57e16a4SAndre Przywara { 30*b57e16a4SAndre Przywara return ISOLATE_FIELD(read_id_pfr0(), ID_PFR0_AMU); 31*b57e16a4SAndre Przywara } 32*b57e16a4SAndre Przywara 33*b57e16a4SAndre Przywara static inline bool is_feat_amu_supported(void) 34*b57e16a4SAndre Przywara { 35*b57e16a4SAndre Przywara if (ENABLE_FEAT_AMU == FEAT_STATE_DISABLED) { 36*b57e16a4SAndre Przywara return false; 37*b57e16a4SAndre Przywara } 38*b57e16a4SAndre Przywara 39*b57e16a4SAndre Przywara if (ENABLE_FEAT_AMU == FEAT_STATE_ALWAYS) { 40*b57e16a4SAndre Przywara return true; 41*b57e16a4SAndre Przywara } 42*b57e16a4SAndre Przywara 43*b57e16a4SAndre Przywara return read_feat_amu_id_field() >= ID_PFR0_AMU_V1; 44*b57e16a4SAndre Przywara } 45*b57e16a4SAndre Przywara 46*b57e16a4SAndre Przywara static inline bool is_feat_amuv1p1_supported(void) 47*b57e16a4SAndre Przywara { 48*b57e16a4SAndre Przywara if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_DISABLED) { 49*b57e16a4SAndre Przywara return false; 50*b57e16a4SAndre Przywara } 51*b57e16a4SAndre Przywara 52*b57e16a4SAndre Przywara if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_ALWAYS) { 53*b57e16a4SAndre Przywara return true; 54*b57e16a4SAndre Przywara } 55*b57e16a4SAndre Przywara 56*b57e16a4SAndre Przywara return read_feat_amu_id_field() >= ID_PFR0_AMU_V1P1; 57*b57e16a4SAndre Przywara } 58*b57e16a4SAndre Przywara 59fc8d2d39SAndre Przywara static inline unsigned int read_feat_trf_id_field(void) 60fc8d2d39SAndre Przywara { 61fc8d2d39SAndre Przywara return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_TRACEFILT); 62fc8d2d39SAndre Przywara } 63fc8d2d39SAndre Przywara 64fc8d2d39SAndre Przywara static inline bool is_feat_trf_supported(void) 65fc8d2d39SAndre Przywara { 66fc8d2d39SAndre Przywara if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) { 67fc8d2d39SAndre Przywara return false; 68fc8d2d39SAndre Przywara } 69fc8d2d39SAndre Przywara 70fc8d2d39SAndre Przywara if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) { 71fc8d2d39SAndre Przywara return true; 72fc8d2d39SAndre Przywara } 73fc8d2d39SAndre Przywara 74fc8d2d39SAndre Przywara return read_feat_trf_id_field() != 0U; 75fc8d2d39SAndre Przywara } 76fc8d2d39SAndre Przywara 77603a0c6fSAndre Przywara static inline unsigned int read_feat_coptrc_id_field(void) 78603a0c6fSAndre Przywara { 79603a0c6fSAndre Przywara return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_COPTRC); 80603a0c6fSAndre Przywara } 81603a0c6fSAndre Przywara 82603a0c6fSAndre Przywara static inline bool is_feat_sys_reg_trace_supported(void) 83603a0c6fSAndre Przywara { 84603a0c6fSAndre Przywara if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) { 85603a0c6fSAndre Przywara return false; 86603a0c6fSAndre Przywara } 87603a0c6fSAndre Przywara 88603a0c6fSAndre Przywara if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) { 89603a0c6fSAndre Przywara return true; 90603a0c6fSAndre Przywara } 91603a0c6fSAndre Przywara 92603a0c6fSAndre Przywara return read_feat_coptrc_id_field() != 0U; 93603a0c6fSAndre Przywara } 94603a0c6fSAndre Przywara 956437a09aSAndre Przywara static inline bool is_feat_spe_supported(void) 966437a09aSAndre Przywara { 976437a09aSAndre Przywara /* FEAT_SPE is AArch64 only */ 986437a09aSAndre Przywara return false; 996437a09aSAndre Przywara } 1006437a09aSAndre Przywara 1012559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */ 102