Define X-macros to generate tables for all user-facing CPU properties,
including fractional properties.

Properties that map to fields that are not supported by the linux kernel
(i.e. not in the ftr_bits array) are not included.

Co-authored-by: Khushit Shah <[email protected]>
Signed-off-by: Shaju Abraham <[email protected]>
---
 target/arm/arm-cpu-frac.inc.h  |  34 +++++++
 target/arm/arm-cpu-props.inc.h | 180 +++++++++++++++++++++++++++++++++
 2 files changed, 214 insertions(+)
 create mode 100644 target/arm/arm-cpu-frac.inc.h
 create mode 100644 target/arm/arm-cpu-props.inc.h

diff --git a/target/arm/arm-cpu-frac.inc.h b/target/arm/arm-cpu-frac.inc.h
new file mode 100644
index 0000000000..6c194daf7c
--- /dev/null
+++ b/target/arm/arm-cpu-frac.inc.h
@@ -0,0 +1,34 @@
+
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+FRAC_TABLE_START(CSV2)
+FRAC_VAL("0.0", 0, 0)
+FRAC_VAL("1.0", 1, 0)
+FRAC_VAL("1.1", 1, 1)
+FRAC_VAL("1.2", 1, 2)
+FRAC_VAL("2.0", 2, 0)
+FRAC_VAL("3.0", 3, 0)
+FRAC_TABLE_END(CSV2)
+
+FRAC_TABLE_START(MPAM)
+FRAC_VAL("0.0", 0, 0)
+FRAC_VAL("0.1", 0, 1)
+FRAC_VAL("1.0", 1, 0)
+FRAC_VAL("1.1", 1, 1)
+FRAC_TABLE_END(MPAM)
+
+FRAC_TABLE_START(RAS)
+FRAC_VAL("0.0", 0, 0)
+FRAC_VAL("1.0", 1, 0)
+FRAC_VAL("1.1", 1, 1)
+FRAC_VAL("1.1_base", 2, 0)
+FRAC_VAL("2.0", 3, 0)
+FRAC_TABLE_END(RAS)
+
+FRAC_TABLE_START(NV)
+FRAC_VAL("0.0", 0, 0)
+FRAC_VAL("1.0", 1, 0)
+FRAC_VAL("2.0", 2, 0)
+FRAC_VAL("2.0_only", 2, 1)
+FRAC_VAL("2.1", 2, 2)
+FRAC_TABLE_END(NV)
diff --git a/target/arm/arm-cpu-props.inc.h b/target/arm/arm-cpu-props.inc.h
new file mode 100644
index 0000000000..13a82e5b22
--- /dev/null
+++ b/target/arm/arm-cpu-props.inc.h
@@ -0,0 +1,180 @@
+
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+ARM_PROP("feat_AES",         STRING,  ID_AA64ISAR0, AES)
+ARM_PROP("feat_SHA1",        STRING,  ID_AA64ISAR0, SHA1)
+ARM_PROP("feat_SHA2",        STRING,  ID_AA64ISAR0, SHA2)
+ARM_PROP("feat_CRC32",       STRING,  ID_AA64ISAR0, CRC32)
+ARM_PROP("feat_ATOMIC",      STRING,  ID_AA64ISAR0, ATOMIC)
+ARM_PROP("feat_RDM",         STRING,  ID_AA64ISAR0, RDM)
+ARM_PROP("feat_SHA3",        STRING,  ID_AA64ISAR0, SHA3)
+ARM_PROP("feat_SM3",         STRING,  ID_AA64ISAR0, SM3)
+ARM_PROP("feat_SM4",         STRING,  ID_AA64ISAR0, SM4)
+ARM_PROP("feat_DP",          STRING,  ID_AA64ISAR0, DP)
+ARM_PROP("feat_FHM",         STRING,  ID_AA64ISAR0, FHM)
+ARM_PROP("feat_TS",          STRING,  ID_AA64ISAR0, TS)
+ARM_PROP("feat_TLB",         STRING,  ID_AA64ISAR0, TLB)
+ARM_PROP("feat_RNDR",        STRING,  ID_AA64ISAR0, RNDR)
+
+ARM_PROP("feat_DPB",         STRING,  ID_AA64ISAR1, DPB)
+ARM_PROP("hw_prop_APA",      STRING,  ID_AA64ISAR1, APA)
+ARM_PROP("hw_prop_API",      STRING,  ID_AA64ISAR1, API)
+ARM_PROP("feat_JSCVT",       STRING,  ID_AA64ISAR1, JSCVT)
+ARM_PROP("feat_FCMA",        STRING,  ID_AA64ISAR1, FCMA)
+ARM_PROP("feat_LRCPC",       STRING,  ID_AA64ISAR1, LRCPC)
+ARM_PROP("hw_prop_GPA",      STRING,  ID_AA64ISAR1, GPA)
+ARM_PROP("hw_prop_GPI",      STRING,  ID_AA64ISAR1, GPI)
+ARM_PROP("feat_FRINTTS",     STRING,  ID_AA64ISAR1, FRINTTS)
+ARM_PROP("feat_SB",          STRING,  ID_AA64ISAR1, SB)
+ARM_PROP("feat_SPECRES",     STRING,  ID_AA64ISAR1, SPECRES)
+ARM_PROP("feat_BF16",        STRING,  ID_AA64ISAR1, BF16)
+ARM_PROP("feat_DGH",         STRING,  ID_AA64ISAR1, DGH)
+ARM_PROP("feat_I8MM",        STRING,  ID_AA64ISAR1, I8MM)
+ARM_PROP("feat_XS",          STRING,  ID_AA64ISAR1, XS)
+ARM_PROP("feat_LS64",        STRING,  ID_AA64ISAR1, LS64)
+
+ARM_PROP("feat_WFXT",        STRING,  ID_AA64ISAR2, WFXT)
+ARM_PROP("feat_RPRES",       STRING,  ID_AA64ISAR2, RPRES)
+ARM_PROP("hw_prop_GPA3",     STRING,  ID_AA64ISAR2, GPA3)
+ARM_PROP("hw_prop_APA3",     STRING,  ID_AA64ISAR2, APA3)
+ARM_PROP("feat_MOPS",        STRING,  ID_AA64ISAR2, MOPS)
+ARM_PROP("feat_BC",          STRING,  ID_AA64ISAR2, BC)
+ARM_PROP("feat_CLRBHB",      STRING,  ID_AA64ISAR2, CLRBHB)
+ARM_PROP("feat_RPRFM",       STRING,  ID_AA64ISAR2, RPRFM)
+ARM_PROP("feat_CSSC",        STRING,  ID_AA64ISAR2, CSSC)
+ARM_PROP("feat_LUT",         STRING,  ID_AA64ISAR2, LUT)
+
+ARM_PROP("feat_FAMINMAX",    STRING,  ID_AA64ISAR3, FAMINMAX)
+ARM_PROP("feat_LSFE",        STRING,  ID_AA64ISAR3, LSFE)
+ARM_PROP("feat_FPRCVT",      STRING,  ID_AA64ISAR3, FPRCVT)
+
+ARM_PROP("el0_mode",         STRING,  ID_AA64PFR0, EL0)
+ARM_PROP("el1_mode",         STRING,  ID_AA64PFR0, EL1)
+ARM_PROP("el2_mode",         STRING,  ID_AA64PFR0, EL2)
+ARM_PROP("el3_mode",         STRING,  ID_AA64PFR0, EL3)
+ARM_PROP("feat_FP",          STRING,  ID_AA64PFR0, FP)
+ARM_PROP("feat_AdvSIMD",     STRING,  ID_AA64PFR0, ADVSIMD)
+ARM_PROP("feat_GIC",         STRING,  ID_AA64PFR0, GIC)
+ARM_PROP("feat_SVE",         STRING,  ID_AA64PFR0, SVE)
+ARM_PROP("feat_SEL2",        STRING,  ID_AA64PFR0, SEL2)
+ARM_PROP("feat_AMU",         STRING,  ID_AA64PFR0, AMU)
+ARM_PROP("feat_DIT",         STRING,  ID_AA64PFR0, DIT)
+ARM_PROP("feat_CSV3",        STRING,  ID_AA64PFR0, CSV3)
+
+ARM_PROP("feat_BT",          STRING,  ID_AA64PFR1, BT)
+ARM_PROP("feat_SSBS",        STRING,  ID_AA64PFR1, SSBS)
+ARM_PROP("feat_MTE",         STRING,  ID_AA64PFR1, MTE)
+ARM_PROP("feat_NMI",         STRING,  ID_AA64PFR1, NMI)
+ARM_PROP("feat_MTE_FRAC",    STRING,  ID_AA64PFR1, MTE_FRAC)
+ARM_PROP("feat_GCS",         STRING,  ID_AA64PFR1, GCS)
+ARM_PROP("feat_DF2",         STRING,  ID_AA64PFR1, DF2)
+
+ARM_PROP("feat_MTESTOREONLY", STRING, ID_AA64PFR2, MTESTOREONLY)
+ARM_PROP("feat_MTEFAR",      STRING,  ID_AA64PFR2, MTEFAR)
+ARM_PROP("feat_FPMR",        STRING,  ID_AA64PFR2, FPMR)
+
+ARM_PROP("hw_prop_PARANGE",  STRING,  ID_AA64MMFR0, PARANGE)
+ARM_PROP("hw_prop_ASIDBITS", STRING,  ID_AA64MMFR0, ASIDBITS)
+ARM_PROP("feat_BIGEND",      STRING,  ID_AA64MMFR0, BIGEND)
+ARM_PROP("feat_SNSMEM",      STRING,  ID_AA64MMFR0, SNSMEM)
+ARM_PROP("feat_BIGENDEL0",   STRING,  ID_AA64MMFR0, BIGENDEL0)
+ARM_PROP("hw_prop_TGRAN16",  STRING,  ID_AA64MMFR0, TGRAN16)
+ARM_PROP("hw_prop_TGRAN64",  STRING,  ID_AA64MMFR0, TGRAN64)
+ARM_PROP("hw_prop_TGRAN4",   STRING,  ID_AA64MMFR0, TGRAN4)
+ARM_PROP("hw_prop_TGRAN16_2", STRING, ID_AA64MMFR0, TGRAN16_2)
+ARM_PROP("hw_prop_TGRAN64_2", STRING, ID_AA64MMFR0, TGRAN64_2)
+ARM_PROP("hw_prop_TGRAN4_2", STRING,  ID_AA64MMFR0, TGRAN4_2)
+ARM_PROP("feat_EXS",         STRING,  ID_AA64MMFR0, EXS)
+ARM_PROP("feat_FGT",         STRING,  ID_AA64MMFR0, FGT)
+ARM_PROP("feat_ECV",         STRING,  ID_AA64MMFR0, ECV)
+
+ARM_PROP("feat_HAFDBS",      STRING,  ID_AA64MMFR1, HAFDBS)
+ARM_PROP("hw_prop_VMIDBITS", STRING,  ID_AA64MMFR1, VMIDBITS)
+ARM_PROP("feat_VH",          STRING,  ID_AA64MMFR1, VH)
+ARM_PROP("feat_HPDS",        STRING,  ID_AA64MMFR1, HPDS)
+ARM_PROP("feat_LO",          STRING,  ID_AA64MMFR1, LO)
+ARM_PROP("feat_PAN",         STRING,  ID_AA64MMFR1, PAN)
+ARM_PROP("feat_SpecSEI",     STRING,  ID_AA64MMFR1, SPECSEI)
+ARM_PROP("feat_XNX",         STRING,  ID_AA64MMFR1, XNX)
+ARM_PROP("feat_TWED",        STRING,  ID_AA64MMFR1, TWED)
+ARM_PROP("feat_ETS",         STRING,  ID_AA64MMFR1, ETS)
+ARM_PROP("feat_HCX",         STRING,  ID_AA64MMFR1, HCX)
+ARM_PROP("feat_AFP",         STRING,  ID_AA64MMFR1, AFP)
+ARM_PROP("feat_TIDCP1",      STRING,  ID_AA64MMFR1, TIDCP1)
+ARM_PROP("feat_ECBHB",       STRING,  ID_AA64MMFR1, ECBHB)
+
+ARM_PROP("feat_CNP",         STRING,  ID_AA64MMFR2, CNP)
+ARM_PROP("feat_UAO",         STRING,  ID_AA64MMFR2, UAO)
+ARM_PROP("feat_LSM",         STRING,  ID_AA64MMFR2, LSM)
+ARM_PROP("feat_IESB",        STRING,  ID_AA64MMFR2, IESB)
+ARM_PROP("hw_prop_VARANGE",  STRING,  ID_AA64MMFR2, VARANGE)
+ARM_PROP("hw_prop_CCIDX",    STRING,  ID_AA64MMFR2, CCIDX)
+ARM_PROP("hw_prop_ST",       STRING,  ID_AA64MMFR2, ST)
+ARM_PROP("feat_AT",          STRING,  ID_AA64MMFR2, AT)
+ARM_PROP("hw_prop_IDS",      STRING,  ID_AA64MMFR2, IDS)
+ARM_PROP("hw_prop_FWB",      STRING,  ID_AA64MMFR2, FWB)
+ARM_PROP("feat_TTL",         STRING,  ID_AA64MMFR2, TTL)
+ARM_PROP("feat_BBM",         STRING,  ID_AA64MMFR2, BBM)
+ARM_PROP("feat_EVT",         STRING,  ID_AA64MMFR2, EVT)
+ARM_PROP("feat_E0PD",        STRING,  ID_AA64MMFR2, E0PD)
+
+ARM_PROP("feat_TCRX",        STRING,  ID_AA64MMFR3, TCRX)
+ARM_PROP("feat_SCTLRX",      STRING,  ID_AA64MMFR3, SCTLRX)
+ARM_PROP("feat_S1PIE",       STRING,  ID_AA64MMFR3, S1PIE)
+ARM_PROP("feat_S1POE",       STRING,  ID_AA64MMFR3, S1POE)
+
+ARM_PROP("feat_E2H0",        STRING,  ID_AA64MMFR4, E2H0)
+
+ARM_PROP("feat_DBG",         STRING,  ID_AA64DFR0, DEBUGVER)
+ARM_PROP("feat_PMU",         STRING,  ID_AA64DFR0, PMUVER)
+ARM_PROP("hw_prop_BRPS",     NUMERIC, ID_AA64DFR0, BRPS)
+ARM_PROP("hw_prop_WRPs",     NUMERIC, ID_AA64DFR0, WRPS)
+ARM_PROP("hw_prop_CTX_CMPs", NUMERIC, ID_AA64DFR0, CTX_CMPS)
+ARM_PROP("hw_prop_PMSVer",   STRING,  ID_AA64DFR0, PMSVER)
+ARM_PROP("feat_DoubleLock",  STRING,  ID_AA64DFR0, DOUBLELOCK)
+
+ARM_PROP("hw_prop_SVEVer",   STRING,  ID_AA64ZFR0, SVEVER)
+ARM_PROP("feat_SVE_AES",     STRING,  ID_AA64ZFR0, AES)
+ARM_PROP("feat_SVE_ELTPERM", STRING,  ID_AA64ZFR0, ELTPERM)
+ARM_PROP("feat_SVE_BITPERM", STRING,  ID_AA64ZFR0, BITPERM)
+ARM_PROP("feat_SVE_BFLOAT16", STRING, ID_AA64ZFR0, BFLOAT16)
+ARM_PROP("feat_SVE_B16B16",  STRING,  ID_AA64ZFR0, B16B16)
+ARM_PROP("feat_SVE_SHA3",    STRING,  ID_AA64ZFR0, SHA3)
+ARM_PROP("feat_SVE_SM4",     STRING,  ID_AA64ZFR0, SM4)
+ARM_PROP("feat_SVE_I8MM",    STRING,  ID_AA64ZFR0, I8MM)
+ARM_PROP("feat_SVE_F16MM",   STRING,  ID_AA64ZFR0, F16MM)
+ARM_PROP("feat_SVE_F32MM",   STRING,  ID_AA64ZFR0, F32MM)
+ARM_PROP("feat_SVE_F64MM",   STRING,  ID_AA64ZFR0, F64MM)
+
+ARM_PROP("feat_F8E5M2",      BOOLEAN, ID_AA64FPFR0, F8E5M2)
+ARM_PROP("feat_F8E4M3",      BOOLEAN, ID_AA64FPFR0, F8E4M3)
+ARM_PROP("feat_F8MM4",       BOOLEAN, ID_AA64FPFR0, F8MM4)
+ARM_PROP("feat_F8MM8",       BOOLEAN, ID_AA64FPFR0, F8MM8)
+ARM_PROP("feat_F8DP2",       BOOLEAN, ID_AA64FPFR0, F8DP2)
+ARM_PROP("feat_F8DP4",       BOOLEAN, ID_AA64FPFR0, F8DP4)
+ARM_PROP("feat_F8FMA",       BOOLEAN, ID_AA64FPFR0, F8FMA)
+ARM_PROP("feat_F8CVT",       BOOLEAN, ID_AA64FPFR0, F8CVT)
+
+ARM_PROP("hw_prop_IMInline", NUMERIC, CTR_EL0, IMINLINE)
+ARM_PROP("hw_prop_L1IP",     STRING,  CTR_EL0, L1IP)
+ARM_PROP("hw_prop_DMInline", NUMERIC, CTR_EL0, DMINLINE)
+ARM_PROP("hw_prop_ERG",      NUMERIC, CTR_EL0, ERG)
+ARM_PROP("hw_prop_CWG",      NUMERIC, CTR_EL0, CWG)
+ARM_PROP("hw_prop_IDC",      BOOLEAN, CTR_EL0, IDC)
+ARM_PROP("hw_prop_DIC",      BOOLEAN, CTR_EL0, DIC)
+ARM_PROP("hw_prop_BS",       NUMERIC, DCZID_EL0, BS)
+ARM_PROP("hw_prop_DZP",      BOOLEAN, DCZID_EL0, DZP)
+
+ARM_PROP("cpu_revision",     NUMERIC, MIDR, REVISION)
+ARM_PROP("cpu_partnum",      NUMERIC, MIDR, PARTNUM)
+ARM_PROP("cpu_architecture", NUMERIC, MIDR, ARCHITECTURE)
+ARM_PROP("cpu_variant",      NUMERIC, MIDR, VARIANT)
+ARM_PROP("cpu_implementer",  NUMERIC, MIDR, IMPLEMENTER)
+ARM_PROP("cpu_revidr",       NUMERIC, REVIDR, VAL)
+ARM_PROP("cpu_aidr",         NUMERIC, AIDR, VAL)
+
+/* Fractional properties */
+ARM_FRACTIONAL_PROP("feat_CSV2", ID_AA64PFR0, CSV2, ID_AA64PFR1, CSV2_FRAC)
+ARM_FRACTIONAL_PROP("feat_MPAM", ID_AA64PFR0, MPAM, ID_AA64PFR1, MPAM_FRAC)
+ARM_FRACTIONAL_PROP("feat_RAS",  ID_AA64PFR0, RAS,  ID_AA64PFR1, RAS_FRAC)
+ARM_FRACTIONAL_PROP("feat_NV",   ID_AA64MMFR2, NV,  ID_AA64MMFR4, NV_FRAC)
-- 
2.52.0


Reply via email to