aboutsummaryrefslogtreecommitdiff
path: root/src/arm
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2018-12-19 02:34:17 -0800
committerMarat Dukhan <marat@fb.com>2018-12-19 02:34:17 -0800
commitdb14c2271115946c3c99671eda59344d0be6ccff (patch)
treee8da323c9eca2a2b924d042369530c61e7a7997c /src/arm
parenta281cc9278b0ccaf8cfd607e8cbc56d194029b9d (diff)
downloadcpuinfo-db14c2271115946c3c99671eda59344d0be6ccff.tar.gz
Detect ARMv8.2 NEON DOT production instructions
Diffstat (limited to 'src/arm')
-rw-r--r--src/arm/linux/aarch32-isa.c17
-rw-r--r--src/arm/linux/aarch64-isa.c19
-rw-r--r--src/arm/linux/api.h13
3 files changed, 49 insertions, 0 deletions
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)