Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/pytorch/cpuinfo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/arm/linux/aarch64-isa.c')
-rw-r--r--src/arm/linux/aarch64-isa.c87
1 files changed, 52 insertions, 35 deletions
diff --git a/src/arm/linux/aarch64-isa.c b/src/arm/linux/aarch64-isa.c
index 619cda5..2000e1a 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 features2,
uint32_t midr,
const struct cpuinfo_arm_chipset chipset[restrict static 1],
struct cpuinfo_arm_isa isa[restrict static 1])
@@ -28,43 +29,56 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
if (features & CPUINFO_ARM_LINUX_FEATURE_ATOMICS) {
isa->atomics = true;
}
- const uint32_t fp16arith_mask = CPUINFO_ARM_LINUX_FEATURE_FPHP | CPUINFO_ARM_LINUX_FEATURE_ASIMDHP;
- if ((features & fp16arith_mask) == fp16arith_mask) {
- 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) {
- cpuinfo_log_warning("FP16 arithmetics disabled: detected support only for SIMD operations");
- }
+
/*
- * Many phones ship with an old kernel configuration that doesn't report
- * SQRDMLAH/SQRDMLSH/UQRDMLAH/UQRDMLSH instructions.
+ * Some phones ship with an old kernel configuration that doesn't report NEON FP16 compute extension and SQRDMLAH/SQRDMLSH/UQRDMLAH/UQRDMLSH instructions.
* Use a MIDR-based heuristic to whitelist processors known to support it:
- * - Processors with Qualcomm-modified Cortex-A55 cores
- * - Processors with Qualcomm-modified Cortex-A75 cores
- * - Processors with Qualcomm-modified Cortex-A76 cores
- * - Kirin 980 processor
+ * - Processors with Cortex-A55 cores
+ * - Processors with Cortex-A65 cores
+ * - Processors with Cortex-A75 cores
+ * - Processors with Cortex-A76 cores
+ * - Processors with Cortex-A77 cores
+ * - Processors with Exynos M4 cores
+ * - Processors with Exynos M5 cores
+ * - Neoverse N1 cores
*/
- 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) */
- case UINT32_C(0x51008040): /* Kryo 485 Gold (Cortex-A76) */
- isa->rdm = true;
- break;
- default:
- if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDRDM) {
- isa->rdm = true;
- }
- if (chipset->series == cpuinfo_arm_chipset_series_hisilicon_kirin && chipset->model == 980) {
+ 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 and RDM disabled: only little cores in Exynos 9810 support these extensions");
+ } else {
+ const uint32_t fp16arith_mask = CPUINFO_ARM_LINUX_FEATURE_FPHP | CPUINFO_ARM_LINUX_FEATURE_ASIMDHP;
+ switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) {
+ case UINT32_C(0x4100D050): /* Cortex-A55 */
+ case UINT32_C(0x4100D060): /* Cortex-A65 */
+ case UINT32_C(0x4100D0B0): /* Cortex-A76 */
+ case UINT32_C(0x4100D0C0): /* Neoverse N1 */
+ case UINT32_C(0x4100D0D0): /* Cortex-A77 */
+ case UINT32_C(0x4100D0E0): /* Cortex-A76AE */
+ case UINT32_C(0x4800D400): /* Cortex-A76 (HiSilicon) */
+ case UINT32_C(0x51008020): /* Kryo 385 Gold (Cortex-A75) */
+ case UINT32_C(0x51008030): /* Kryo 385 Silver (Cortex-A55) */
+ case UINT32_C(0x51008040): /* Kryo 485 Gold (Cortex-A76) */
+ case UINT32_C(0x51008050): /* Kryo 485 Silver (Cortex-A55) */
+ case UINT32_C(0x53000030): /* Exynos M4 */
+ case UINT32_C(0x53000040): /* Exynos M5 */
+ isa->fp16arith = true;
isa->rdm = true;
- }
- break;
+ break;
+ default:
+ if ((features & fp16arith_mask) == fp16arith_mask) {
+ 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) {
+ cpuinfo_log_warning("FP16 arithmetics disabled: detected support only for SIMD operations");
+ }
+ if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDRDM) {
+ isa->rdm = true;
+ }
+ 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.
@@ -98,13 +112,16 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
if (features & CPUINFO_ARM_LINUX_FEATURE_JSCVT) {
isa->jscvt = true;
}
- if (features & CPUINFO_ARM_LINUX_FEATURE_ASIMDRDM) {
- isa->rdm = true;
- }
if (features & CPUINFO_ARM_LINUX_FEATURE_JSCVT) {
isa->jscvt = true;
}
if (features & CPUINFO_ARM_LINUX_FEATURE_FCMA) {
isa->fcma = true;
}
+ if (features & CPUINFO_ARM_LINUX_FEATURE_SVE) {
+ isa->sve = true;
+ }
+ if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SVE2) {
+ isa->sve2 = true;
+ }
}