Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

x86/cpu: Add platform ID to CPU matching structure

The existing x86_match_cpu() infrastructure can be used to match
a bunch of attributes of a CPU: vendor, family, model, steppings
and CPU features.

But, there's one more attribute that's missing and unable to be
matched against: the platform ID, enumerated on Intel CPUs in
MSR_IA32_PLATFORM_ID. It is a little more obscure and is only
queried during microcode loading. This is because Intel sometimes
has CPUs with identical family/model/stepping but which need
different microcode. These CPUs are differentiated with the
platform ID.

Add a field in 'struct x86_cpu_id' for the platform ID. Similar
to the stepping field, make the new field a mask of platform IDs.
Some examples:

0x01: matches only platform ID 0x0
0x02: matches only platform ID 0x1
0x03: matches platform IDs 0x0 or 0x1
0x80: matches only platform ID 0x7
0xff: matches all 8 possible platform IDs

Since the mask is only a byte wide, it nestles in next to another
u8 and does not even increase the size of 'struct x86_cpu_id'.

Reserve the all 0's value as the wildcard (X86_PLATFORM_ANY). This
avoids forcing changes to existing 'struct x86_cpu_id' users. They
can just continue to fill the field with 0's and their matching will
work exactly as before.

Note: If someone is ever looking for space in 'struct x86_cpu_id',
this new field could probably get stuck over in ->driver_data
for the one user that there is.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Sohil Mehta <sohil.mehta@intel.com>
Link: https://patch.msgid.link/20260304181022.058DF07C@davehans-spike.ostc.intel.com

+5
+3
arch/x86/kernel/cpu/match.c
··· 76 76 if (m->steppings != X86_STEPPING_ANY && 77 77 !(BIT(c->x86_stepping) & m->steppings)) 78 78 continue; 79 + if (m->platform_mask != X86_PLATFORM_ANY && 80 + !(BIT(c->intel_platform_id) & m->platform_mask)) 81 + continue; 79 82 if (m->feature != X86_FEATURE_ANY && !cpu_has(c, m->feature)) 80 83 continue; 81 84 if (!x86_match_vendor_cpu_type(c, m))
+2
include/linux/mod_devicetable.h
··· 691 691 __u16 feature; /* bit index */ 692 692 /* Solely for kernel-internal use: DO NOT EXPORT to userspace! */ 693 693 __u16 flags; 694 + __u8 platform_mask; 694 695 __u8 type; 695 696 kernel_ulong_t driver_data; 696 697 }; ··· 703 702 #define X86_STEPPING_ANY 0 704 703 #define X86_STEP_MIN 0 705 704 #define X86_STEP_MAX 0xf 705 + #define X86_PLATFORM_ANY 0x0 706 706 #define X86_FEATURE_ANY 0 /* Same as FPU, you can't test for that */ 707 707 #define X86_CPU_TYPE_ANY 0 708 708