mirror of
https://github.com/Dr-Noob/cpufetch.git
synced 2026-03-25 16:00:39 +01:00
[v1.05] Implement new approach to infer SoC from the uarch. Add support for Kunpeng SoCs
This commit is contained in:
@@ -237,7 +237,7 @@ struct cpuInfo* get_cpu_info_linux(struct cpuInfo* cpu) {
|
||||
cpu->num_cpus = sockets;
|
||||
cpu->hv = emalloc(sizeof(struct hypervisor));
|
||||
cpu->hv->present = false;
|
||||
cpu->soc = get_soc();
|
||||
cpu->soc = get_soc(cpu);
|
||||
cpu->peak_performance = get_peak_performance(cpu);
|
||||
|
||||
return cpu;
|
||||
@@ -374,19 +374,19 @@ struct cpuInfo* get_cpu_info_mach(struct cpuInfo* cpu) {
|
||||
// the CPU is an Apple SoC
|
||||
if(cpu_family == CPUFAMILY_ARM_FIRESTORM_ICESTORM) {
|
||||
fill_cpu_info_firestorm_icestorm(cpu, pcores, ecores);
|
||||
cpu->soc = get_soc();
|
||||
cpu->soc = get_soc(cpu);
|
||||
cpu->peak_performance = get_peak_performance(cpu);
|
||||
}
|
||||
else if(cpu_family == CPUFAMILY_ARM_AVALANCHE_BLIZZARD) {
|
||||
fill_cpu_info_avalanche_blizzard(cpu, pcores, ecores);
|
||||
cpu->soc = get_soc();
|
||||
cpu->soc = get_soc(cpu);
|
||||
cpu->peak_performance = get_peak_performance(cpu);
|
||||
}
|
||||
else if(cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH ||
|
||||
cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH_PRO ||
|
||||
cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH_MAX) {
|
||||
fill_cpu_info_everest_sawtooth(cpu, pcores, ecores);
|
||||
cpu->soc = get_soc();
|
||||
cpu->soc = get_soc(cpu);
|
||||
cpu->peak_performance = get_peak_performance(cpu);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "soc.h"
|
||||
#include "socs.h"
|
||||
#include "udev.h"
|
||||
#include "uarch.h"
|
||||
#include "../common/global.h"
|
||||
|
||||
#if defined(__APPLE__) || defined(__MACH__)
|
||||
@@ -801,6 +802,38 @@ struct system_on_chip* guess_soc_from_nvmem(struct system_on_chip* soc) {
|
||||
return soc;
|
||||
}
|
||||
|
||||
struct system_on_chip* guess_soc_from_uarch(struct system_on_chip* soc, struct cpuInfo* cpu) {
|
||||
// Currently we only support CPUs with only one uarch (in other words, one socket)
|
||||
struct uarch* arch = cpu->arch;
|
||||
if (arch == NULL) {
|
||||
printWarn("guess_soc_from_uarch: uarch is NULL");
|
||||
return soc;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
MICROARCH u;
|
||||
struct system_on_chip soc;
|
||||
} uarchToSoC;
|
||||
|
||||
uarchToSoC socFromUarch[] = {
|
||||
{UARCH_TAISHAN_V110, {SOC_KUNPENG_920, SOC_VENDOR_KUNPENG, 7, "920", NULL} },
|
||||
{UARCH_TAISHAN_V200, {SOC_KUNPENG_930, SOC_VENDOR_KUNPENG, 7, "930", NULL} }, // manufacturing process is not well-known
|
||||
{UARCH_UNKNOWN, {UNKNOWN, SOC_VENDOR_UNKNOWN, -1, "", NULL} }
|
||||
};
|
||||
|
||||
int index = 0;
|
||||
while(socFromUarch[index].u != UARCH_UNKNOWN) {
|
||||
if(socFromUarch[index].u == get_uarch(arch)) {
|
||||
fill_soc(soc, socFromUarch[index].soc.soc_name, socFromUarch[index].soc.soc_model, socFromUarch[index].soc.process);
|
||||
return soc;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
printWarn("guess_soc_from_uarch: No uarch matched the list");
|
||||
return soc;
|
||||
}
|
||||
|
||||
int hex2int(char c) {
|
||||
if (c >= '0' && c <= '9')
|
||||
return c - '0';
|
||||
@@ -935,7 +968,7 @@ struct system_on_chip* guess_soc_apple(struct system_on_chip* soc) {
|
||||
}
|
||||
#endif
|
||||
|
||||
struct system_on_chip* get_soc(void) {
|
||||
struct system_on_chip* get_soc(struct cpuInfo* cpu) {
|
||||
struct system_on_chip* soc = emalloc(sizeof(struct system_on_chip));
|
||||
soc->raw_name = NULL;
|
||||
soc->soc_vendor = SOC_VENDOR_UNKNOWN;
|
||||
@@ -975,6 +1008,10 @@ struct system_on_chip* get_soc(void) {
|
||||
if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) {
|
||||
soc = guess_soc_from_nvmem(soc);
|
||||
}
|
||||
// If everything else failed, try infering it from the microarchitecture
|
||||
if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) {
|
||||
soc = guess_soc_from_uarch(soc, cpu);
|
||||
}
|
||||
}
|
||||
#elif defined __APPLE__ || __MACH__
|
||||
soc = guess_soc_apple(soc);
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
#include "../common/soc.h"
|
||||
#include <stdint.h>
|
||||
|
||||
struct system_on_chip* get_soc(void);
|
||||
struct system_on_chip* get_soc(struct cpuInfo* cpu);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -29,6 +29,9 @@ enum {
|
||||
SOC_HISILICON_3670,
|
||||
SOC_HISILICON_3680,
|
||||
SOC_HISILICON_3690,
|
||||
// Kunpeng //
|
||||
SOC_KUNPENG_920,
|
||||
SOC_KUNPENG_930,
|
||||
// Exynos //
|
||||
SOC_EXYNOS_3475,
|
||||
SOC_EXYNOS_4210,
|
||||
@@ -367,6 +370,7 @@ enum {
|
||||
inline static VENDOR get_soc_vendor_from_soc(SOC soc) {
|
||||
if(soc >= SOC_BCM_2835 && soc <= SOC_BCM_2712) return SOC_VENDOR_BROADCOM;
|
||||
else if(soc >= SOC_HISILICON_3620 && soc <= SOC_HISILICON_3690) return SOC_VENDOR_KIRIN;
|
||||
else if(soc >= SOC_KUNPENG_920 && soc <= SOC_KUNPENG_930) return SOC_VENDOR_KUNPENG;
|
||||
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_SM8450) return SOC_VENDOR_SNAPDRAGON;
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
// Data not available
|
||||
#define NA -1
|
||||
|
||||
typedef uint32_t MICROARCH;
|
||||
typedef uint32_t ISA;
|
||||
|
||||
struct uarch {
|
||||
@@ -37,89 +36,6 @@ enum {
|
||||
ISA_ARMv9_A
|
||||
};
|
||||
|
||||
enum {
|
||||
UARCH_UNKNOWN,
|
||||
// ARM
|
||||
UARCH_ARM7,
|
||||
UARCH_ARM9,
|
||||
UARCH_ARM1136,
|
||||
UARCH_ARM1156,
|
||||
UARCH_ARM1176,
|
||||
UARCH_ARM11MPCORE,
|
||||
UARCH_CORTEX_A5,
|
||||
UARCH_CORTEX_A7,
|
||||
UARCH_CORTEX_A8,
|
||||
UARCH_CORTEX_A9,
|
||||
UARCH_CORTEX_A12,
|
||||
UARCH_CORTEX_A15,
|
||||
UARCH_CORTEX_A17,
|
||||
UARCH_CORTEX_A32,
|
||||
UARCH_CORTEX_A35,
|
||||
UARCH_CORTEX_A53,
|
||||
UARCH_CORTEX_A55r0, // ARM Cortex-A55 revision 0 (restricted dual-issue capabilities compared to revision 1+).
|
||||
UARCH_CORTEX_A55,
|
||||
UARCH_CORTEX_A57,
|
||||
UARCH_CORTEX_A65,
|
||||
UARCH_CORTEX_A72,
|
||||
UARCH_CORTEX_A73,
|
||||
UARCH_CORTEX_A75,
|
||||
UARCH_CORTEX_A76,
|
||||
UARCH_CORTEX_A77,
|
||||
UARCH_CORTEX_A78,
|
||||
UARCH_CORTEX_A510,
|
||||
UARCH_CORTEX_A710,
|
||||
UARCH_CORTEX_A715,
|
||||
UARCH_CORTEX_X1,
|
||||
UARCH_CORTEX_X2,
|
||||
UARCH_CORTEX_X3,
|
||||
UARCH_NEOVERSE_N1,
|
||||
UARCH_NEOVERSE_E1,
|
||||
UARCH_NEOVERSE_V1,
|
||||
UARCH_SCORPION,
|
||||
UARCH_KRAIT,
|
||||
UARCH_KYRO,
|
||||
UARCH_FALKOR,
|
||||
UARCH_SAPHIRA,
|
||||
UARCH_DENVER,
|
||||
UARCH_DENVER2,
|
||||
UARCH_CARMEL,
|
||||
// SAMSUNG
|
||||
UARCH_EXYNOS_M1, // Samsung Exynos M1 (Exynos 8890 big cores)
|
||||
UARCH_EXYNOS_M2, // Samsung Exynos M2 (Exynos 8895 big cores)
|
||||
UARCH_EXYNOS_M3, // Samsung Exynos M3 (Exynos 9810 big cores)
|
||||
UARCH_EXYNOS_M4, // Samsung Exynos M4 (Exynos 9820 big cores)
|
||||
UARCH_EXYNOS_M5, // Samsung Exynos M5 (Exynos 9830 big cores)
|
||||
// APPLE
|
||||
UARCH_SWIFT, // Apple A6 and A6X processors.
|
||||
UARCH_CYCLONE, // Apple A7 processor.
|
||||
UARCH_TYPHOON, // Apple A8 and A8X processor
|
||||
UARCH_TWISTER, // Apple A9 and A9X processor.
|
||||
UARCH_HURRICANE, // Apple A10 and A10X processor.
|
||||
UARCH_MONSOON, // Apple A11 processor (big cores).
|
||||
UARCH_MISTRAL, // Apple A11 processor (little cores).
|
||||
UARCH_VORTEX, // Apple A12 processor (big cores).
|
||||
UARCH_TEMPEST, // Apple A12 processor (big cores).
|
||||
UARCH_LIGHTNING, // Apple A13 processor (big cores).
|
||||
UARCH_THUNDER, // Apple A13 processor (little cores).
|
||||
UARCH_ICESTORM, // Apple M1 processor (little cores).
|
||||
UARCH_FIRESTORM, // Apple M1 processor (big cores).
|
||||
UARCH_BLIZZARD, // Apple M2 processor (little cores).
|
||||
UARCH_AVALANCHE, // Apple M2 processor (big cores).
|
||||
UARCH_SAWTOOTH, // Apple M3 processor (little cores).
|
||||
UARCH_EVEREST, // Apple M3 processor (big cores).
|
||||
// CAVIUM
|
||||
UARCH_THUNDERX, // Cavium ThunderX
|
||||
UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan).
|
||||
// MARVELL
|
||||
UARCH_PJ4,
|
||||
UARCH_BRAHMA_B15,
|
||||
UARCH_BRAHMA_B53,
|
||||
UARCH_XGENE, // Applied Micro X-Gene.
|
||||
UARCH_TAISHAN_V110, // HiSilicon TaiShan v110 (Huawei Kunpeng 920 series processors).
|
||||
// PHYTIUM
|
||||
UARCH_XIAOMI, // Not to be confused with Xiaomi Inc
|
||||
};
|
||||
|
||||
static const ISA isas_uarch[] = {
|
||||
[UARCH_ARM1136] = ISA_ARMv6,
|
||||
[UARCH_ARM1156] = ISA_ARMv6_T2,
|
||||
@@ -159,6 +75,7 @@ static const ISA isas_uarch[] = {
|
||||
[UARCH_THUNDERX] = ISA_ARMv8_A,
|
||||
[UARCH_THUNDERX2] = ISA_ARMv8_1_A,
|
||||
[UARCH_TAISHAN_V110] = ISA_ARMv8_2_A,
|
||||
[UARCH_TAISHAN_V200] = ISA_ARMv8_2_A, // Not confirmed
|
||||
[UARCH_DENVER] = ISA_ARMv8_A,
|
||||
[UARCH_DENVER2] = ISA_ARMv8_A,
|
||||
[UARCH_CARMEL] = ISA_ARMv8_A,
|
||||
@@ -284,8 +201,9 @@ struct uarch* get_uarch_from_midr(uint32_t midr, struct cpuInfo* cpu) {
|
||||
CHECK_UARCH(arch, cpu, 'C', 0x0A3, NA, NA, "ThunderX 81XX", UARCH_THUNDERX, CPU_VENDOR_CAVIUM)
|
||||
CHECK_UARCH(arch, cpu, 'C', 0x0AF, NA, NA, "ThunderX2 99XX", UARCH_THUNDERX2, CPU_VENDOR_CAVIUM)
|
||||
|
||||
CHECK_UARCH(arch, cpu, 'H', 0xD01, NA, NA, "TaiShan v110", UARCH_TAISHAN_V110, CPU_VENDOR_HUAWUEI) // Kunpeng 920 series
|
||||
CHECK_UARCH(arch, cpu, 'H', 0xD40, NA, NA, "Cortex-A76", UARCH_CORTEX_A76, CPU_VENDOR_ARM) // Kirin 980 Big/Medium cores -> Cortex-A76
|
||||
CHECK_UARCH(arch, cpu, 'H', 0xD01, NA, NA, "TaiShan v110", UARCH_TAISHAN_V110, CPU_VENDOR_HUAWEI) // Kunpeng 920 series
|
||||
CHECK_UARCH(arch, cpu, 'H', 0xD02, NA, NA, "TaiShan v200", UARCH_TAISHAN_V200, CPU_VENDOR_HUAWEI) // Kunpeng 930 series (found in openeuler: https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/XQCV7NX2UKRIUWUFKRF4PO3QENCOUFR3)
|
||||
CHECK_UARCH(arch, cpu, 'H', 0xD40, NA, NA, "Cortex-A76", UARCH_CORTEX_A76, CPU_VENDOR_ARM) // Kirin 980 Big/Medium cores -> Cortex-A76
|
||||
|
||||
CHECK_UARCH(arch, cpu, 'N', 0x000, NA, NA, "Denver", UARCH_DENVER, CPU_VENDOR_NVIDIA)
|
||||
CHECK_UARCH(arch, cpu, 'N', 0x003, NA, NA, "Denver2", UARCH_DENVER2, CPU_VENDOR_NVIDIA)
|
||||
@@ -437,6 +355,10 @@ char* get_str_uarch(struct cpuInfo* cpu) {
|
||||
return cpu->arch->uarch_str;
|
||||
}
|
||||
|
||||
MICROARCH get_uarch(struct uarch* arch) {
|
||||
return arch->uarch;
|
||||
}
|
||||
|
||||
void free_uarch_struct(struct uarch* arch) {
|
||||
free(arch->uarch_str);
|
||||
free(arch);
|
||||
|
||||
@@ -5,11 +5,98 @@
|
||||
|
||||
#include "midr.h"
|
||||
|
||||
enum {
|
||||
UARCH_UNKNOWN,
|
||||
// ARM
|
||||
UARCH_ARM7,
|
||||
UARCH_ARM9,
|
||||
UARCH_ARM1136,
|
||||
UARCH_ARM1156,
|
||||
UARCH_ARM1176,
|
||||
UARCH_ARM11MPCORE,
|
||||
UARCH_CORTEX_A5,
|
||||
UARCH_CORTEX_A7,
|
||||
UARCH_CORTEX_A8,
|
||||
UARCH_CORTEX_A9,
|
||||
UARCH_CORTEX_A12,
|
||||
UARCH_CORTEX_A15,
|
||||
UARCH_CORTEX_A17,
|
||||
UARCH_CORTEX_A32,
|
||||
UARCH_CORTEX_A35,
|
||||
UARCH_CORTEX_A53,
|
||||
UARCH_CORTEX_A55r0, // ARM Cortex-A55 revision 0 (restricted dual-issue capabilities compared to revision 1+).
|
||||
UARCH_CORTEX_A55,
|
||||
UARCH_CORTEX_A57,
|
||||
UARCH_CORTEX_A65,
|
||||
UARCH_CORTEX_A72,
|
||||
UARCH_CORTEX_A73,
|
||||
UARCH_CORTEX_A75,
|
||||
UARCH_CORTEX_A76,
|
||||
UARCH_CORTEX_A77,
|
||||
UARCH_CORTEX_A78,
|
||||
UARCH_CORTEX_A510,
|
||||
UARCH_CORTEX_A710,
|
||||
UARCH_CORTEX_A715,
|
||||
UARCH_CORTEX_X1,
|
||||
UARCH_CORTEX_X2,
|
||||
UARCH_CORTEX_X3,
|
||||
UARCH_NEOVERSE_N1,
|
||||
UARCH_NEOVERSE_E1,
|
||||
UARCH_NEOVERSE_V1,
|
||||
UARCH_SCORPION,
|
||||
UARCH_KRAIT,
|
||||
UARCH_KYRO,
|
||||
UARCH_FALKOR,
|
||||
UARCH_SAPHIRA,
|
||||
UARCH_DENVER,
|
||||
UARCH_DENVER2,
|
||||
UARCH_CARMEL,
|
||||
// SAMSUNG
|
||||
UARCH_EXYNOS_M1, // Samsung Exynos M1 (Exynos 8890 big cores)
|
||||
UARCH_EXYNOS_M2, // Samsung Exynos M2 (Exynos 8895 big cores)
|
||||
UARCH_EXYNOS_M3, // Samsung Exynos M3 (Exynos 9810 big cores)
|
||||
UARCH_EXYNOS_M4, // Samsung Exynos M4 (Exynos 9820 big cores)
|
||||
UARCH_EXYNOS_M5, // Samsung Exynos M5 (Exynos 9830 big cores)
|
||||
// APPLE
|
||||
UARCH_SWIFT, // Apple A6 and A6X processors.
|
||||
UARCH_CYCLONE, // Apple A7 processor.
|
||||
UARCH_TYPHOON, // Apple A8 and A8X processor
|
||||
UARCH_TWISTER, // Apple A9 and A9X processor.
|
||||
UARCH_HURRICANE, // Apple A10 and A10X processor.
|
||||
UARCH_MONSOON, // Apple A11 processor (big cores).
|
||||
UARCH_MISTRAL, // Apple A11 processor (little cores).
|
||||
UARCH_VORTEX, // Apple A12 processor (big cores).
|
||||
UARCH_TEMPEST, // Apple A12 processor (big cores).
|
||||
UARCH_LIGHTNING, // Apple A13 processor (big cores).
|
||||
UARCH_THUNDER, // Apple A13 processor (little cores).
|
||||
UARCH_ICESTORM, // Apple M1 processor (little cores).
|
||||
UARCH_FIRESTORM, // Apple M1 processor (big cores).
|
||||
UARCH_BLIZZARD, // Apple M2 processor (little cores).
|
||||
UARCH_AVALANCHE, // Apple M2 processor (big cores).
|
||||
UARCH_SAWTOOTH, // Apple M3 processor (little cores).
|
||||
UARCH_EVEREST, // Apple M3 processor (big cores).
|
||||
// CAVIUM
|
||||
UARCH_THUNDERX, // Cavium ThunderX
|
||||
UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan).
|
||||
// MARVELL
|
||||
UARCH_PJ4,
|
||||
UARCH_BRAHMA_B15,
|
||||
UARCH_BRAHMA_B53,
|
||||
UARCH_XGENE, // Applied Micro X-Gene.
|
||||
UARCH_TAISHAN_V110, // HiSilicon TaiShan v110
|
||||
UARCH_TAISHAN_V200, // HiSilicon TaiShan v200
|
||||
// PHYTIUM
|
||||
UARCH_XIAOMI, // Not to be confused with Xiaomi Inc
|
||||
};
|
||||
|
||||
typedef uint32_t MICROARCH;
|
||||
|
||||
struct uarch* get_uarch_from_midr(uint32_t midr, struct cpuInfo* cpu);
|
||||
int get_number_of_vpus(struct cpuInfo* cpu);
|
||||
int get_vpus_width(struct cpuInfo* cpu);
|
||||
bool has_fma_support(struct cpuInfo* cpu);
|
||||
char* get_str_uarch(struct cpuInfo* cpu);
|
||||
void free_uarch_struct(struct uarch* arch);
|
||||
MICROARCH get_uarch(struct uarch* arch);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user