Skip to content

Commit 0d9eb6d

Browse files
authored
Merge branch 'main' into cpuinfo-modified
2 parents 085a58d + 5e3d244 commit 0d9eb6d

27 files changed

+484
-157
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ IF(CPUINFO_SUPPORTED_PLATFORM)
187187
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^Windows" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(ARM64|arm64)$")
188188
LIST(APPEND CPUINFO_SRCS
189189
src/arm/windows/init-by-logical-sys-info.c
190-
src/arm/windows/init.c)
190+
src/arm/windows/init.c
191+
src/arm/uarch.c)
191192
ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64|arm64.*)$" OR IOS_ARCH MATCHES "^(armv7.*|arm64.*)$")
192193
LIST(APPEND CPUINFO_SRCS
193194
src/arm/uarch.c

include/cpuinfo-mock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ ssize_t CPUINFO_ABI cpuinfo_mock_read(int fd, void* buffer, size_t capacity);
6060
void CPUINFO_ABI cpuinfo_set_hwcap(uint32_t hwcap);
6161
#endif
6262
#if CPUINFO_ARCH_ARM
63-
void CPUINFO_ABI cpuinfo_set_hwcap2(uint32_t hwcap2);
63+
void CPUINFO_ABI cpuinfo_set_hwcap2(uint64_t hwcap2);
6464
#endif
6565
#endif
6666

include/cpuinfo.h

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ enum cpuinfo_uarch {
419419
cpuinfo_uarch_zen3 = 0x0020010B,
420420
/** AMD Zen 4 microarchitecture. */
421421
cpuinfo_uarch_zen4 = 0x0020010C,
422+
/** AMD Zen 5 microarchitecture. */
423+
cpuinfo_uarch_zen5 = 0x0020010D,
422424

423425
/** NSC Geode and AMD Geode GX and LX. */
424426
cpuinfo_uarch_geode = 0x00200200,
@@ -520,6 +522,8 @@ enum cpuinfo_uarch {
520522
cpuinfo_uarch_falkor = 0x00400103,
521523
/** Qualcomm Saphira. */
522524
cpuinfo_uarch_saphira = 0x00400104,
525+
/** Qualcomm Oryon. */
526+
cpuinfo_uarch_oryon = 0x00400105,
523527

524528
/** Nvidia Denver. */
525529
cpuinfo_uarch_denver = 0x00500100,
@@ -818,6 +822,8 @@ struct cpuinfo_x86_isa {
818822
bool avx512vp2intersect;
819823
bool avx512_4vnniw;
820824
bool avx512_4fmaps;
825+
bool avx10_1;
826+
bool avx10_2;
821827
bool amx_bf16;
822828
bool amx_tile;
823829
bool amx_int8;
@@ -1460,6 +1466,22 @@ static inline bool cpuinfo_has_x86_avx_ne_convert(void) {
14601466
#endif
14611467
}
14621468

1469+
static inline bool cpuinfo_has_x86_avx10_1(void) {
1470+
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1471+
return cpuinfo_isa.avx10_1;
1472+
#else
1473+
return false;
1474+
#endif
1475+
}
1476+
1477+
static inline bool cpuinfo_has_x86_avx10_2(void) {
1478+
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1479+
return cpuinfo_isa.avx10_2;
1480+
#else
1481+
return false;
1482+
#endif
1483+
}
1484+
14631485
static inline bool cpuinfo_has_x86_hle(void) {
14641486
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
14651487
return cpuinfo_isa.hle;
@@ -1698,6 +1720,12 @@ struct cpuinfo_arm_isa {
16981720
bool sve2;
16991721
bool i8mm;
17001722
bool sme;
1723+
bool sme2;
1724+
bool sme2p1;
1725+
bool sme_i16i32;
1726+
bool sme_bi32i32;
1727+
bool sme_b16b16;
1728+
bool sme_f16f16;
17011729
uint32_t svelen;
17021730
#endif
17031731
bool rdm;
@@ -2088,6 +2116,54 @@ static inline bool cpuinfo_has_arm_sme(void) {
20882116
#endif
20892117
}
20902118

2119+
static inline bool cpuinfo_has_arm_sme2(void) {
2120+
#if CPUINFO_ARCH_ARM64
2121+
return cpuinfo_isa.sme2;
2122+
#else
2123+
return false;
2124+
#endif
2125+
}
2126+
2127+
static inline bool cpuinfo_has_arm_sme2p1(void) {
2128+
#if CPUINFO_ARCH_ARM64
2129+
return cpuinfo_isa.sme2p1;
2130+
#else
2131+
return false;
2132+
#endif
2133+
}
2134+
2135+
static inline bool cpuinfo_has_arm_sme_i16i32(void) {
2136+
#if CPUINFO_ARCH_ARM64
2137+
return cpuinfo_isa.sme_i16i32;
2138+
#else
2139+
return false;
2140+
#endif
2141+
}
2142+
2143+
static inline bool cpuinfo_has_arm_sme_bi32i32(void) {
2144+
#if CPUINFO_ARCH_ARM64
2145+
return cpuinfo_isa.sme_bi32i32;
2146+
#else
2147+
return false;
2148+
#endif
2149+
}
2150+
2151+
static inline bool cpuinfo_has_arm_sme_b16b16(void) {
2152+
#if CPUINFO_ARCH_ARM64
2153+
return cpuinfo_isa.sme_b16b16;
2154+
#else
2155+
return false;
2156+
#endif
2157+
}
2158+
2159+
static inline bool cpuinfo_has_arm_sme_f16f16(void) {
2160+
#if CPUINFO_ARCH_ARM64
2161+
return cpuinfo_isa.sme_f16f16;
2162+
#else
2163+
return false;
2164+
#endif
2165+
}
2166+
20912167
#if CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
20922168
/* This structure is not a part of stable API. Use cpuinfo_has_riscv_* functions
20932169
* instead. */

libcpuinfo.pc.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ exec_prefix=@CMAKE_INSTALL_PREFIX@
33
libdir=@libdir_for_pc_file@
44
includedir=@includedir_for_pc_file@
55

6-
Name: lib@CMAKE_PROJECT_NAME@
6+
Name: lib@PROJECT_NAME@
77
Description: Library to detect essential performance optimization information about host CPU.
88
Version:
99
URL: @PROJECT_HOMEPAGE_URL@

src/arm/api.h

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
#pragma once
22

3+
#ifdef _MSC_VER
4+
#define RESTRICT_STATIC /* nothing for MSVC */
5+
#else
6+
#define RESTRICT_STATIC restrict static
7+
#endif
8+
39
#include <stdbool.h>
410
#include <stdint.h>
511

@@ -64,6 +70,7 @@ enum cpuinfo_arm_chipset_series {
6470
cpuinfo_arm_chipset_series_telechips_tcc,
6571
cpuinfo_arm_chipset_series_texas_instruments_omap,
6672
cpuinfo_arm_chipset_series_unisoc_t,
73+
cpuinfo_arm_chipset_series_unisoc_ums,
6774
cpuinfo_arm_chipset_series_wondermedia_wm,
6875
cpuinfo_arm_chipset_series_max,
6976
};
@@ -81,11 +88,11 @@ struct cpuinfo_arm_chipset {
8188

8289
#ifndef __cplusplus
8390
CPUINFO_INTERNAL void cpuinfo_arm_chipset_to_string(
84-
const struct cpuinfo_arm_chipset chipset[restrict static 1],
85-
char name[restrict static CPUINFO_ARM_CHIPSET_NAME_MAX]);
91+
const struct cpuinfo_arm_chipset chipset[RESTRICT_STATIC 1],
92+
char name[RESTRICT_STATIC CPUINFO_ARM_CHIPSET_NAME_MAX]);
8693

8794
CPUINFO_INTERNAL void cpuinfo_arm_fixup_chipset(
88-
struct cpuinfo_arm_chipset chipset[restrict static 1],
95+
struct cpuinfo_arm_chipset chipset[RESTRICT_STATIC 1],
8996
uint32_t cores,
9097
uint32_t max_cpu_freq_max);
9198

@@ -94,23 +101,23 @@ CPUINFO_INTERNAL void cpuinfo_arm_decode_vendor_uarch(
94101
#if CPUINFO_ARCH_ARM
95102
bool has_vfpv4,
96103
#endif
97-
enum cpuinfo_vendor vendor[restrict static 1],
98-
enum cpuinfo_uarch uarch[restrict static 1]);
104+
enum cpuinfo_vendor vendor[RESTRICT_STATIC 1],
105+
enum cpuinfo_uarch uarch[RESTRICT_STATIC 1]);
99106

100107
CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
101108
enum cpuinfo_uarch uarch,
102109
uint32_t cluster_cores,
103110
uint32_t midr,
104-
const struct cpuinfo_arm_chipset chipset[restrict static 1],
111+
const struct cpuinfo_arm_chipset chipset[RESTRICT_STATIC 1],
105112
uint32_t cluster_id,
106113
uint32_t arch_version,
107-
struct cpuinfo_cache l1i[restrict static 1],
108-
struct cpuinfo_cache l1d[restrict static 1],
109-
struct cpuinfo_cache l2[restrict static 1],
110-
struct cpuinfo_cache l3[restrict static 1]);
114+
struct cpuinfo_cache l1i[RESTRICT_STATIC 1],
115+
struct cpuinfo_cache l1d[RESTRICT_STATIC 1],
116+
struct cpuinfo_cache l2[RESTRICT_STATIC 1],
117+
struct cpuinfo_cache l3[RESTRICT_STATIC 1]);
111118

112119
CPUINFO_INTERNAL uint32_t
113-
cpuinfo_arm_compute_max_cache_size(const struct cpuinfo_processor processor[restrict static 1]);
120+
cpuinfo_arm_compute_max_cache_size(const struct cpuinfo_processor processor[RESTRICT_STATIC 1]);
114121
#else /* defined(__cplusplus) */
115122
CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
116123
enum cpuinfo_uarch uarch,

src/arm/cache.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,8 @@ void cpuinfo_arm_decode_cache(
13411341
* information, please refer to the technical manuals
13421342
* linked above
13431343
*/
1344-
const uint32_t min_l2_size_KB = uarch == cpuinfo_uarch_neoverse_v2 ? 1024 : 256;
1344+
const uint32_t min_l2_size_KB =
1345+
(uarch == cpuinfo_uarch_neoverse_v2 || midr_is_ampere_altra(midr)) ? 1024 : 256;
13451346
const uint32_t min_l3_size_KB = 0;
13461347

13471348
*l1i = (struct cpuinfo_cache){

src/arm/linux/aarch32-isa.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void cpuinfo_set_wcid(uint32_t wcid) {
2424

2525
void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo(
2626
uint32_t features,
27-
uint32_t features2,
27+
uint64_t features2,
2828
uint32_t midr,
2929
uint32_t architecture_version,
3030
uint32_t architecture_flags,
@@ -147,6 +147,8 @@ void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo(
147147
"VDOT instructions disabled: cause occasional SIGILL on Spreadtrum SC9863A");
148148
} else if (chipset->series == cpuinfo_arm_chipset_series_unisoc_t && chipset->model == 310) {
149149
cpuinfo_log_warning("VDOT instructions disabled: cause occasional SIGILL on Unisoc T310");
150+
} else if (chipset->series == cpuinfo_arm_chipset_series_unisoc_ums && chipset->model == 312) {
151+
cpuinfo_log_warning("VDOT instructions disabled: cause occasional SIGILL on Unisoc UMS312");
150152
} else {
151153
switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) {
152154
case UINT32_C(0x4100D0B0): /* Cortex-A76 */

src/arm/linux/aarch64-isa.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
99
uint32_t features,
10-
uint32_t features2,
10+
uint64_t features2,
1111
uint32_t midr,
1212
const struct cpuinfo_arm_chipset chipset[restrict static 1],
1313
struct cpuinfo_arm_isa isa[restrict static 1]) {
@@ -147,6 +147,24 @@ void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
147147
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME) {
148148
isa->sme = true;
149149
}
150+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME2) {
151+
isa->sme2 = true;
152+
}
153+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME2P1) {
154+
isa->sme2p1 = true;
155+
}
156+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME_I16I32) {
157+
isa->sme_i16i32 = true;
158+
}
159+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME_BI32I32) {
160+
isa->sme_bi32i32 = true;
161+
}
162+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME_B16B16) {
163+
isa->sme_b16b16 = true;
164+
}
165+
if (features2 & CPUINFO_ARM_LINUX_FEATURE2_SME_F16F16) {
166+
isa->sme_f16f16 = true;
167+
}
150168
// SVEBF16 is set iff SVE and BF16 are both supported, but the SVEBF16
151169
// feature flag was added in Linux kernel before the BF16 feature flag,
152170
// so we check for either.

src/arm/linux/api.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ struct cpuinfo_arm_linux_proc_cpuinfo_cache {
138138
#define CPUINFO_ARM_LINUX_FEATURE2_RNG UINT32_C(0x00010000)
139139
#define CPUINFO_ARM_LINUX_FEATURE2_BTI UINT32_C(0x00020000)
140140
#define CPUINFO_ARM_LINUX_FEATURE2_SME UINT32_C(0x00800000)
141+
#define CPUINFO_ARM_LINUX_FEATURE2_SME2 UINT64_C(0x0000002000000000)
142+
#define CPUINFO_ARM_LINUX_FEATURE2_SME2P1 UINT64_C(0x0000004000000000)
143+
#define CPUINFO_ARM_LINUX_FEATURE2_SME_I16I32 UINT64_C(0x0000008000000000)
144+
#define CPUINFO_ARM_LINUX_FEATURE2_SME_BI32I32 UINT64_C(0x0000010000000000)
145+
#define CPUINFO_ARM_LINUX_FEATURE2_SME_B16B16 UINT64_C(0x0000020000000000)
146+
#define CPUINFO_ARM_LINUX_FEATURE2_SME_F16F16 UINT64_C(0x0000040000000000)
141147
#endif
142148

143149
#define CPUINFO_ARM_LINUX_VALID_ARCHITECTURE UINT32_C(0x00010000)
@@ -173,7 +179,7 @@ struct cpuinfo_arm_linux_processor {
173179
struct cpuinfo_arm_linux_proc_cpuinfo_cache proc_cpuinfo_cache;
174180
#endif
175181
uint32_t features;
176-
uint32_t features2;
182+
uint64_t features2;
177183
/**
178184
* Main ID Register value.
179185
*/
@@ -296,14 +302,14 @@ CPUINFO_INTERNAL bool cpuinfo_arm_linux_parse_proc_cpuinfo(
296302
#if CPUINFO_ARCH_ARM
297303
CPUINFO_INTERNAL bool cpuinfo_arm_linux_hwcap_from_getauxval(
298304
uint32_t hwcap[restrict static 1],
299-
uint32_t hwcap2[restrict static 1]);
305+
uint64_t hwcap2[restrict static 1]);
300306
CPUINFO_INTERNAL bool cpuinfo_arm_linux_hwcap_from_procfs(
301307
uint32_t hwcap[restrict static 1],
302-
uint32_t hwcap2[restrict static 1]);
308+
uint64_t hwcap2[restrict static 1]);
303309

304310
CPUINFO_INTERNAL void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo(
305311
uint32_t features,
306-
uint32_t features2,
312+
uint64_t features2,
307313
uint32_t midr,
308314
uint32_t architecture_version,
309315
uint32_t architecture_flags,
@@ -312,11 +318,11 @@ CPUINFO_INTERNAL void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo(
312318
#elif CPUINFO_ARCH_ARM64
313319
CPUINFO_INTERNAL void cpuinfo_arm_linux_hwcap_from_getauxval(
314320
uint32_t hwcap[restrict static 1],
315-
uint32_t hwcap2[restrict static 1]);
321+
uint64_t hwcap2[restrict static 1]);
316322

317323
CPUINFO_INTERNAL void cpuinfo_arm64_linux_decode_isa_from_proc_cpuinfo(
318324
uint32_t features,
319-
uint32_t features2,
325+
uint64_t features2,
320326
uint32_t midr,
321327
const struct cpuinfo_arm_chipset chipset[restrict static 1],
322328
struct cpuinfo_arm_isa isa[restrict static 1]);

0 commit comments

Comments
 (0)