aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2018-04-19 22:10:51 -0700
committerMarat Dukhan <marat@fb.com>2018-04-19 22:10:51 -0700
commit04634bd1635a1cef618410e5aa3e0307d56c5c12 (patch)
tree14a9ae23ac7a6ffbf007423602c96b2101ac80fb
parentb1e99599dac4408eae09fde7976e4771b794e748 (diff)
downloadcpuinfo-04634bd1635a1cef618410e5aa3e0307d56c5c12.tar.gz
Detect RDM extension on Kryo 385 cores
-rw-r--r--src/arm/linux/aarch64-isa.c14
-rw-r--r--src/arm/linux/api.h1
-rw-r--r--src/arm/linux/init.c12
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 */