diff options
author | Kulin Seth <kulinseth@gmail.com> | 2022-07-15 19:25:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-15 19:25:34 +0300 |
commit | 60324e22653a37778a2c7e8c5281365f83e1ca81 (patch) | |
tree | a654fe8859cf51219e6cf6c6303a81c2b401bc5f | |
parent | 0c5d43135059ed9386782e12f4499038ca02e2e5 (diff) |
Add support for Arm I8MM (#103)
Co-authored-by: Developer-Ecosystem-Engineering <65677710+Developer-Ecosystem-Engineering@users.noreply.github.com>
-rw-r--r-- | include/cpuinfo.h | 9 | ||||
-rw-r--r-- | src/arm/linux/aarch64-isa.c | 3 | ||||
-rw-r--r-- | src/arm/linux/cpuinfo.c | 4 | ||||
-rw-r--r-- | src/arm/mach/init.c | 5 |
4 files changed, 21 insertions, 0 deletions
diff --git a/include/cpuinfo.h b/include/cpuinfo.h index 7bcb931..e7ce9ed 100644 --- a/include/cpuinfo.h +++ b/include/cpuinfo.h @@ -1467,6 +1467,7 @@ static inline bool cpuinfo_has_x86_sha(void) { bool bf16; bool sve; bool sve2; + bool i8mm; #endif bool rdm; bool fp16arith; @@ -1758,6 +1759,14 @@ static inline bool cpuinfo_has_arm_fcma(void) { #endif } +static inline bool cpuinfo_has_arm_i8mm(void) { + #if CPUINFO_ARCH_ARM64 + return cpuinfo_isa.i8mm; + #else + return false; + #endif +} + static inline bool cpuinfo_has_arm_aes(void) { #if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64 return cpuinfo_isa.aes; diff --git a/src/arm/linux/aarch64-isa.c b/src/arm/linux/aarch64-isa.c index 4090d10..9019949 100644 --- a/src/arm/linux/aarch64-isa.c +++ b/src/arm/linux/aarch64-isa.c @@ -82,6 +82,9 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo( break; } } + if (features2 & CPUINFO_ARM_LINUX_FEATURE2_I8MM) { + isa->i8mm = true; + } /* * Many phones ship with an old kernel configuration that doesn't report UDOT/SDOT instructions. diff --git a/src/arm/linux/cpuinfo.c b/src/arm/linux/cpuinfo.c index 90e1631..bc98c14 100644 --- a/src/arm/linux/cpuinfo.c +++ b/src/arm/linux/cpuinfo.c @@ -177,6 +177,10 @@ static void parse_features( #if CPUINFO_ARCH_ARM64 processor->features |= CPUINFO_ARM_LINUX_FEATURE_FCMA; #endif + } else if (memcmp(feature_start, "i8mm", feature_length) == 0) { + #if CPUINFO_ARCH_ARM64 + processor->features2 |= CPUINFO_ARM_LINUX_FEATURE2_I8MM; + #endif #if CPUINFO_ARCH_ARM } else if (memcmp(feature_start, "half", feature_length) == 0) { processor->features |= CPUINFO_ARM_LINUX_FEATURE_HALF; diff --git a/src/arm/mach/init.c b/src/arm/mach/init.c index ef3aace..1f4780a 100644 --- a/src/arm/mach/init.c +++ b/src/arm/mach/init.c @@ -371,6 +371,11 @@ void cpuinfo_arm_mach_init(void) { cpuinfo_isa.bf16 = true; } + const uint32_t has_FEAT_I8MM = get_sys_info_by_name("hw.optional.arm.FEAT_I8MM"); + if (has_FEAT_I8MM != 0) { + cpuinfo_isa.i8mm = true; + } + uint32_t num_clusters = 1; for (uint32_t i = 0; i < mach_topology.cores; i++) { cores[i] = (struct cpuinfo_core) { |