diff options
author | Marat Dukhan <marat@fb.com> | 2018-04-19 22:10:51 -0700 |
---|---|---|
committer | Marat Dukhan <marat@fb.com> | 2018-04-19 22:10:51 -0700 |
commit | 04634bd1635a1cef618410e5aa3e0307d56c5c12 (patch) | |
tree | 14a9ae23ac7a6ffbf007423602c96b2101ac80fb | |
parent | b1e99599dac4408eae09fde7976e4771b794e748 (diff) | |
download | cpuinfo-04634bd1635a1cef618410e5aa3e0307d56c5c12.tar.gz |
Detect RDM extension on Kryo 385 cores
-rw-r--r-- | src/arm/linux/aarch64-isa.c | 14 | ||||
-rw-r--r-- | src/arm/linux/api.h | 1 | ||||
-rw-r--r-- | src/arm/linux/init.c | 12 |
3 files changed, 19 insertions, 8 deletions
diff --git a/src/arm/linux/aarch64-isa.c b/src/arm/linux/aarch64-isa.c index 0b67a12..aa40e4b 100644 --- a/src/arm/linux/aarch64-isa.c +++ b/src/arm/linux/aarch64-isa.c @@ -6,6 +6,7 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo( uint32_t features, + uint32_t midr, struct cpuinfo_arm_isa isa[restrict static 1]) { if (features & CPUINFO_ARM_LINUX_FEATURE_AES) { @@ -34,8 +35,17 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo( } else if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDHP) { cpuinfo_log_warning("FP16 arithmetics disabled: detected support only for SIMD operations"); } - if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDRDM) { - isa->rdm = true; + /* Qualcomm Kryo 385 may have buggy kernel configuration that doesn't report VQRDMLAH/VQRDMLSH instructions */ + switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) { + case UINT32_C(0x51008020): /* Kryo 385 Gold (Cortex-A75) */ + case UINT32_C(0x51008030): /* Kryo 385 Silver (Cortex-A55) */ + isa->rdm = true; + break; + default: + if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDRDM) { + isa->rdm = 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 d8f5d4c..7599c2e 100644 --- a/src/arm/linux/api.h +++ b/src/arm/linux/api.h @@ -265,6 +265,7 @@ bool cpuinfo_arm_linux_parse_proc_cpuinfo( uint32_t cpuinfo_arm_linux_hwcap_from_getauxval(void); void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo( uint32_t features, + uint32_t midr, struct cpuinfo_arm_isa isa[restrict static 1]); #endif diff --git a/src/arm/linux/init.c b/src/arm/linux/init.c index 17ec79b..604dd27 100644 --- a/src/arm/linux/init.c +++ b/src/arm/linux/init.c @@ -169,9 +169,9 @@ void cpuinfo_arm_linux_init(void) { } } - uint32_t usable_processors = 0; + uint32_t usable_processors = 0, last_midr = 0; #if CPUINFO_ARCH_ARM - uint32_t last_midr = 0, last_architecture_version = 0, last_architecture_flags = 0; + uint32_t last_architecture_version = 0, last_architecture_flags = 0; #endif for (uint32_t i = 0; i < arm_linux_processors_count; i++) { arm_linux_processors[i].system_processor_id = i; @@ -186,10 +186,10 @@ void cpuinfo_arm_linux_init(void) { cpuinfo_log_info("processor %"PRIu32" is not listed in /proc/cpuinfo", i); } + if (bitmask_all(arm_linux_processors[i].flags, CPUINFO_ARM_LINUX_VALID_MIDR)) { + last_midr = arm_linux_processors[i].midr; + } #if CPUINFO_ARCH_ARM - if (bitmask_all(arm_linux_processors[i].flags, CPUINFO_ARM_LINUX_VALID_MIDR)) { - last_midr = arm_linux_processors[i].midr; - } if (bitmask_all(arm_linux_processors[i].flags, CPUINFO_ARM_LINUX_VALID_ARCHITECTURE)) { last_architecture_version = arm_linux_processors[i].architecture_version; last_architecture_flags = arm_linux_processors[i].architecture_flags; @@ -248,7 +248,7 @@ void cpuinfo_arm_linux_init(void) { #elif CPUINFO_ARCH_ARM64 /* getauxval is always available on ARM64 Android */ const uint32_t isa_features = cpuinfo_arm_linux_hwcap_from_getauxval(); - cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(isa_features, &cpuinfo_isa); + cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(isa_features, last_midr, &cpuinfo_isa); #endif /* Detect min/max frequency and package ID */ |