mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
tools/x86/kcpuid: Recognize all leaves with subleaves
cpuid.csv will be extended in further commits with all-publicly-known CPUID leaves and bitfields. Thus, modify has_subleafs() to identify all known leaves with subleaves. Remove the redundant "is_amd" check since all x86 vendors already report the maxium supported extended leaf at leaf 0x80000000 EAX register. The extra mentioned leaves are: - Leaf 0x12, Intel Software Guard Extensions (SGX) enumeration - Leaf 0x14, Intel process trace (PT) enumeration - Leaf 0x17, Intel SoC vendor attributes enumeration - Leaf 0x1b, Intel PCONFIG (Platform configuration) enumeration - Leaf 0x1d, Intel AMX (Advanced Matrix Extensions) tile information - Leaf 0x1f, Intel v2 extended topology enumeration - Leaf 0x23, Intel ArchPerfmonExt (Architectural PMU ext) enumeration - Leaf 0x80000020, AMD Platform QoS extended features enumeration - Leaf 0x80000026, AMD v2 extended topology enumeration Set the 'max_subleaf' variable for all the newly marked leaves with extra subleaves. Ideally, this should be fetched from the CSV file instead, but the current kcpuid code architecture has two runs: one run to serially invoke the cpuid instructions and save all the output in-memory, and one run to parse this in-memory output through the CSV specification. Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20240718134755.378115-7-darwi@linutronix.de
This commit is contained in:
parent
9ecbc60a5e
commit
b0a59d1496
|
|
@ -98,27 +98,17 @@ static inline void cpuid(u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
|
|||
|
||||
static inline bool has_subleafs(u32 f)
|
||||
{
|
||||
if (f == 0x7 || f == 0xd)
|
||||
return true;
|
||||
u32 with_subleaves[] = {
|
||||
0x4, 0x7, 0xb, 0xd, 0xf, 0x10, 0x12,
|
||||
0x14, 0x17, 0x18, 0x1b, 0x1d, 0x1f, 0x23,
|
||||
0x8000001d, 0x80000020, 0x80000026,
|
||||
};
|
||||
|
||||
if (is_amd) {
|
||||
if (f == 0x8000001d)
|
||||
for (unsigned i = 0; i < ARRAY_SIZE(with_subleaves); i++)
|
||||
if (f == with_subleaves[i])
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (f) {
|
||||
case 0x4:
|
||||
case 0xb:
|
||||
case 0xf:
|
||||
case 0x10:
|
||||
case 0x14:
|
||||
case 0x18:
|
||||
case 0x1f:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void leaf_print_raw(struct subleaf *leaf)
|
||||
|
|
@ -253,11 +243,18 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax)
|
|||
* Some can provide the exact number of subleafs,
|
||||
* others have to be tried (0xf)
|
||||
*/
|
||||
if (f == 0x7 || f == 0x14 || f == 0x17 || f == 0x18)
|
||||
if (f == 0x7 || f == 0x14 || f == 0x17 || f == 0x18 || f == 0x1d)
|
||||
max_subleaf = min((eax & 0xff) + 1, max_subleaf);
|
||||
|
||||
if (f == 0xb)
|
||||
max_subleaf = 2;
|
||||
if (f == 0x1f)
|
||||
max_subleaf = 6;
|
||||
if (f == 0x23)
|
||||
max_subleaf = 4;
|
||||
if (f == 0x80000020)
|
||||
max_subleaf = 4;
|
||||
if (f == 0x80000026)
|
||||
max_subleaf = 5;
|
||||
|
||||
for (subleaf = 1; subleaf < max_subleaf; subleaf++) {
|
||||
eax = f;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user