aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2018-04-19 22:26:58 -0700
committerMarat Dukhan <marat@fb.com>2018-04-19 22:26:58 -0700
commit9f8b886650f780dd40d2be2f19e68d91d81c0eb9 (patch)
tree27100a43a166a1efed2c6d6e073a675189b8d2a8 /src
parent110d1ab9912537cb655b88fe14f8ba62803c3a50 (diff)
downloadcpuinfo-9f8b886650f780dd40d2be2f19e68d91d81c0eb9.tar.gz
Avoid misdetecting FP16 compute support on Exynos 9810
Diffstat (limited to 'src')
-rw-r--r--src/arm/linux/aarch64-isa.c8
-rw-r--r--src/arm/linux/api.h1
-rw-r--r--src/arm/linux/init.c23
3 files changed, 20 insertions, 12 deletions
diff --git a/src/arm/linux/aarch64-isa.c b/src/arm/linux/aarch64-isa.c
index aa40e4b..783b8e8 100644
--- a/src/arm/linux/aarch64-isa.c
+++ b/src/arm/linux/aarch64-isa.c
@@ -7,6 +7,7 @@
void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
uint32_t features,
uint32_t midr,
+ const struct cpuinfo_arm_chipset chipset[restrict static 1],
struct cpuinfo_arm_isa isa[restrict static 1])
{
if (features & CPUINFO_ARM_LINUX_FEATURE_AES) {
@@ -29,7 +30,12 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
}
const uint32_t fp16arith_mask = CPUINFO_ARM_LINUX_FEATURE_FPHP | CPUINFO_ARM_LINUX_FEATURE_ASIMDHP;
if ((features & fp16arith_mask) == fp16arith_mask) {
- isa->fp16arith = true;
+ if (chipset->series == cpuinfo_arm_chipset_series_samsung_exynos && chipset->model == 9810) {
+ /* Exynos 9810 reports that it supports FP16 compute, but in fact only little cores do */
+ cpuinfo_log_warning("FP16 arithmetics disabled: only little cores of Exynos 9810 support FP16 compute");
+ } else {
+ isa->fp16arith = true;
+ }
} else if (features & CPUINFO_ARM_LINUX_FEATURE_FPHP) {
cpuinfo_log_warning("FP16 arithmetics disabled: detected support only for scalar operations");
} else if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDHP) {
diff --git a/src/arm/linux/api.h b/src/arm/linux/api.h
index 7599c2e..554a8b9 100644
--- a/src/arm/linux/api.h
+++ b/src/arm/linux/api.h
@@ -266,6 +266,7 @@ bool cpuinfo_arm_linux_parse_proc_cpuinfo(
void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
uint32_t features,
uint32_t midr,
+ const struct cpuinfo_arm_chipset chipset[restrict static 1],
struct cpuinfo_arm_isa isa[restrict static 1]);
#endif
diff --git a/src/arm/linux/init.c b/src/arm/linux/init.c
index 604dd27..27ae823 100644
--- a/src/arm/linux/init.c
+++ b/src/arm/linux/init.c
@@ -203,6 +203,16 @@ void cpuinfo_arm_linux_init(void) {
}
}
+#if defined(__ANDROID__)
+ const struct cpuinfo_arm_chipset chipset =
+ cpuinfo_arm_android_decode_chipset(&android_properties, usable_processors, 0);
+#else
+ const struct cpuinfo_arm_chipset chipset = {
+ .vendor = cpuinfo_arm_chipset_vendor_unknown,
+ .series = cpuinfo_arm_chipset_series_unknown,
+ };
+#endif
+
#if CPUINFO_ARCH_ARM
uint32_t isa_features = 0, isa_features2 = 0;
#ifdef __ANDROID__
@@ -248,7 +258,8 @@ 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, last_midr, &cpuinfo_isa);
+ cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
+ isa_features, last_midr, &chipset, &cpuinfo_isa);
#endif
/* Detect min/max frequency and package ID */
@@ -324,16 +335,6 @@ void cpuinfo_arm_linux_init(void) {
cpuinfo_arm_linux_count_cluster_processors(arm_linux_processors_count, arm_linux_processors);
-#if defined(__ANDROID__)
- const struct cpuinfo_arm_chipset chipset =
- cpuinfo_arm_android_decode_chipset(&android_properties, usable_processors, 0);
-#else
- const struct cpuinfo_arm_chipset chipset = {
- .vendor = cpuinfo_arm_chipset_vendor_unknown,
- .series = cpuinfo_arm_chipset_series_unknown,
- };
-#endif
-
const uint32_t cluster_count = cpuinfo_arm_linux_detect_cluster_midr(
&chipset,
arm_linux_processors_count, usable_processors, arm_linux_processors);