From 52ba038527bac3ed0ded1ee5c564e0ddda9f35bb Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Wed, 25 May 2022 22:11:48 +0100 Subject: [PATCH] [v1.02][ARM] Add support for M1 Ultra --- src/arm/midr.c | 15 +++++++++++---- src/arm/soc.c | 18 +++++++++++++++++- src/arm/socs.h | 3 ++- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/arm/midr.c b/src/arm/midr.c index 1ceae14..73be390 100644 --- a/src/arm/midr.c +++ b/src/arm/midr.c @@ -287,13 +287,20 @@ struct cpuInfo* get_cpu_info_mach(struct cpuInfo* cpu) { fill_cpu_info_firestorm_icestorm(cpu, 4, 4); } else if(cpu_subfamily == CPUSUBFAMILY_ARM_HS || cpu_subfamily == CPUSUBFAMILY_ARM_HC_HD) { - // Apple M1 Pro/Max. Detect number of cores + // Apple M1 Pro/Max/Ultra. Detect number of cores uint32_t physicalcpu = get_sys_info_by_name("hw.physicalcpu"); - if(physicalcpu < 8 || physicalcpu > 10) { - printBug("Found invalid physicalcpu: 0x%.8X", physicalcpu); + if(physicalcpu == 20) { + // M1 Ultra + fill_cpu_info_firestorm_icestorm(cpu, 16, 4); + } + else if(physicalcpu == 8 || physicalcpu == 10) { + // M1 Pro/Max + fill_cpu_info_firestorm_icestorm(cpu, physicalcpu-2, 2); + } + else { + printBug("Found invalid physical cpu number: %d", physicalcpu); return NULL; } - fill_cpu_info_firestorm_icestorm(cpu, physicalcpu-2, 2); } else { printBug("Found invalid cpu_subfamily: 0x%.8X", cpu_subfamily); diff --git a/src/arm/soc.c b/src/arm/soc.c index 27a6d15..aa48a7e 100644 --- a/src/arm/soc.c +++ b/src/arm/soc.c @@ -649,6 +649,7 @@ struct system_on_chip* guess_soc_raspbery_pi(struct system_on_chip* soc) { #if defined(__APPLE__) || defined(__MACH__) struct system_on_chip* guess_soc_apple(struct system_on_chip* soc) { uint32_t cpu_subfamily = get_sys_info_by_name("hw.cpusubfamily"); + if(cpu_subfamily == CPUSUBFAMILY_ARM_HG) { fill_soc(soc, "M1", SOC_APPLE_M1, 5); } @@ -656,7 +657,22 @@ struct system_on_chip* guess_soc_apple(struct system_on_chip* soc) { fill_soc(soc, "M1 Pro", SOC_APPLE_M1_PRO, 5); } else if(cpu_subfamily == CPUSUBFAMILY_ARM_HC_HD) { - fill_soc(soc, "M1 Max", SOC_APPLE_M1_MAX, 5); + // Could be M1 Max or M1 Ultra (2x M1 Max) + uint32_t physicalcpu = get_sys_info_by_name("hw.physicalcpu"); + if(physicalcpu == 20) { + fill_soc(soc, "M1 Ultra", SOC_APPLE_M1_ULTRA, 5); + } + else if(physicalcpu == 10) { + fill_soc(soc, "M1 Max", SOC_APPLE_M1_MAX, 5); + } + else { + printBug("Found invalid physical cpu number: %d", physicalcpu); + soc->soc_vendor = SOC_VENDOR_UNKNOWN; + } + } + else { + printBug("Found invalid cpu_subfamily: 0x%.8X", cpu_subfamily); + soc->soc_vendor = SOC_VENDOR_UNKNOWN; } return soc; } diff --git a/src/arm/socs.h b/src/arm/socs.h index 7632bc3..9b7ecd0 100644 --- a/src/arm/socs.h +++ b/src/arm/socs.h @@ -256,6 +256,7 @@ enum { SOC_APPLE_M1, SOC_APPLE_M1_PRO, SOC_APPLE_M1_MAX, + SOC_APPLE_M1_ULTRA, // ALLWINNER SOC_ALLWINNER_A10, SOC_ALLWINNER_A13, @@ -288,7 +289,7 @@ inline static VENDOR get_soc_vendor_from_soc(SOC soc) { else if(soc >= SOC_EXYNOS_3475 && soc <= SOC_EXYNOS_880) return SOC_VENDOR_EXYNOS; else if(soc >= SOC_MTK_MT6893 && soc <= SOC_MTK_MT8783) return SOC_VENDOR_MEDIATEK; else if(soc >= SOC_SNAPD_QSD8650 && soc <= SOC_SNAPD_SM8350) return SOC_VENDOR_SNAPDRAGON; - else if(soc >= SOC_APPLE_M1 && soc <= SOC_APPLE_M1_MAX) return SOC_VENDOR_APPLE; + else if(soc >= SOC_APPLE_M1 && soc <= SOC_APPLE_M1_ULTRA) return SOC_VENDOR_APPLE; else if(soc >= SOC_ALLWINNER_A10 && soc <= SOC_ALLWINNER_R328) return SOC_VENDOR_ALLWINNER; return SOC_VENDOR_UNKNOWN; }