From 9f8b886650f780dd40d2be2f19e68d91d81c0eb9 Mon Sep 17 00:00:00 2001 From: Marat Dukhan Date: Thu, 19 Apr 2018 22:26:58 -0700 Subject: Avoid misdetecting FP16 compute support on Exynos 9810 --- src/arm/linux/aarch64-isa.c | 8 +++++++- src/arm/linux/api.h | 1 + src/arm/linux/init.c | 23 ++++++++++++----------- 3 files changed, 20 insertions(+), 12 deletions(-) (limited to 'src') 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); -- cgit v1.2.3