From db14c2271115946c3c99671eda59344d0be6ccff Mon Sep 17 00:00:00 2001 From: Marat Dukhan Date: Wed, 19 Dec 2018 02:34:17 -0800 Subject: Detect ARMv8.2 NEON DOT production instructions --- src/arm/linux/aarch32-isa.c | 17 +++++++++++++++++ src/arm/linux/aarch64-isa.c | 19 +++++++++++++++++++ src/arm/linux/api.h | 13 +++++++++++++ 3 files changed, 49 insertions(+) (limited to 'src/arm') diff --git a/src/arm/linux/aarch32-isa.c b/src/arm/linux/aarch32-isa.c index d552ca2..92095e1 100644 --- a/src/arm/linux/aarch32-isa.c +++ b/src/arm/linux/aarch32-isa.c @@ -74,6 +74,23 @@ void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo( } break; } + + /* + * NEON VDOT instructions are not indicated in /proc/cpuinfo. + * Use a MIDR-based heuristic to whitelist processors known to support it: + * - Processors with Qualcomm-modified Cortex-A76 cores + * - Kirin 980 processor + */ + switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) { + case UINT32_C(0x51008040): /* Kryo 485 Gold (Cortex-A76) */ + isa->dot = true; + break; + default: + if (chipset->series == cpuinfo_arm_chipset_series_hisilicon_kirin && chipset->model == 980) { + isa->dot = true; + } + break; + } } else { /* ARMv7 or lower: use feature flags to detect optional features */ diff --git a/src/arm/linux/aarch64-isa.c b/src/arm/linux/aarch64-isa.c index 462aee5..f193e81 100644 --- a/src/arm/linux/aarch64-isa.c +++ b/src/arm/linux/aarch64-isa.c @@ -65,6 +65,25 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo( } break; } + /* + * Many phones ship with an old kernel configuration that doesn't report UDOT/SDOT instructions. + * Use a MIDR-based heuristic to whitelist processors known to support it: + * - Processors with Qualcomm-modified Cortex-A76 cores + * - Kirin 980 processor + */ + switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) { + case UINT32_C(0x51008040): /* Kryo 485 Gold (Cortex-A76) */ + isa->dot = true; + break; + default: + if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDDP) { + isa->dot = true; + } + if (chipset->series == cpuinfo_arm_chipset_series_hisilicon_kirin && chipset->model == 980) { + isa->dot = true; + } + break; + } if (features & CPUINFO_ARM_LINUX_FEATURE_JSCVT) { isa->jscvt = true; } diff --git a/src/arm/linux/api.h b/src/arm/linux/api.h index 73d56df..ab3741d 100644 --- a/src/arm/linux/api.h +++ b/src/arm/linux/api.h @@ -95,6 +95,19 @@ struct cpuinfo_arm_linux_proc_cpuinfo_cache { #define CPUINFO_ARM_LINUX_FEATURE_JSCVT UINT32_C(0x00002000) #define CPUINFO_ARM_LINUX_FEATURE_FCMA UINT32_C(0x00004000) #define CPUINFO_ARM_LINUX_FEATURE_LRCPC UINT32_C(0x00008000) + #define CPUINFO_ARM_LINUX_FEATURE_DCPOP UINT32_C(0x00010000) + #define CPUINFO_ARM_LINUX_FEATURE_SHA3 UINT32_C(0x00020000) + #define CPUINFO_ARM_LINUX_FEATURE_SM3 UINT32_C(0x00040000) + #define CPUINFO_ARM_LINUX_FEATURE_SM4 UINT32_C(0x00080000) + #define CPUINFO_ARM_LINUX_FEATURE_ASIMDDP UINT32_C(0x00100000) + #define CPUINFO_ARM_LINUX_FEATURE_SHA512 UINT32_C(0x00200000) + #define CPUINFO_ARM_LINUX_FEATURE_SVE UINT32_C(0x00400000) + #define CPUINFO_ARM_LINUX_FEATURE_ASIMDFHM UINT32_C(0x00800000) + #define CPUINFO_ARM_LINUX_FEATURE_DIT UINT32_C(0x01000000) + #define CPUINFO_ARM_LINUX_FEATURE_USCAT UINT32_C(0x02000000) + #define CPUINFO_ARM_LINUX_FEATURE_ILRCPC UINT32_C(0x04000000) + #define CPUINFO_ARM_LINUX_FEATURE_FLAGM UINT32_C(0x08000000) + #define CPUINFO_ARM_LINUX_FEATURE_SSBS UINT32_C(0x10000000) #endif #define CPUINFO_ARM_LINUX_VALID_ARCHITECTURE UINT32_C(0x00010000) -- cgit v1.2.3