]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/cpu: Add platform ID to CPU info structure
authorDave Hansen <dave.hansen@linux.intel.com>
Wed, 4 Mar 2026 18:10:20 +0000 (10:10 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Thu, 5 Mar 2026 20:25:32 +0000 (12:25 -0800)
The end goal here is to be able to do x86_match_cpu() and match on a
specific platform ID. While it would be possible to stash this ID
off somewhere or read it dynamically, that approaches would not be
consistent with the other fields which can be matched.

Read the platform ID and store it in cpuinfo_x86.

There are lots of sites to set this new field. Place it near
the place c->microcode is established since the platform ID is
so closely intertwined with microcode updates.

Note: This should not grow the size of 'struct cpuinfo_x86' in
practice since the u8 fits next to another u8 in the structure.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Sohil Mehta <sohil.mehta@intel.com>
Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Link: https://patch.msgid.link/20260304181020.8D518228@davehans-spike.ostc.intel.com
arch/x86/include/asm/microcode.h
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/intel.c
arch/x86/kernel/cpu/microcode/intel.c

index 8b41f26f003b09e0e5aa3bbfb77e13bea9ae846b..3c317d1557716fc6b6ee751068b4f33446e9448f 100644 (file)
@@ -61,6 +61,8 @@ static inline int intel_microcode_get_datasize(struct microcode_header_intel *hd
        return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
 }
 
+extern u32 intel_get_platform_id(void);
+
 static inline u32 intel_get_microcode_revision(void)
 {
        u32 rev, dummy;
index a24c7805acdb5c25051af30f305449f7f808834a..10b5355b323e24af9e5ba07556a620200ee6dc12 100644 (file)
@@ -140,6 +140,11 @@ struct cpuinfo_x86 {
                __u32           x86_vfm;
        };
        __u8                    x86_stepping;
+       union {
+               // MSR_IA32_PLATFORM_ID[52-50]
+               __u8                    intel_platform_id;
+               __u8                    amd_unused;
+       };
 #ifdef CONFIG_X86_64
        /* Number of 4K pages in DTLB/ITLB combined(in pages): */
        int                     x86_tlbsize;
index 646ff33c4651db45665f6e82675e759b1d5d7920..f28c0efb7c8f1325b6d4fc99e247bde08f1884c8 100644 (file)
@@ -205,6 +205,7 @@ static void early_init_intel(struct cpuinfo_x86 *c)
 
        if (c->x86 >= 6 && !cpu_has(c, X86_FEATURE_IA64))
                c->microcode = intel_get_microcode_revision();
+       c->intel_platform_id = intel_get_platform_id();
 
        /* Now if any of them are set, check the blacklist and clear the lot */
        if ((cpu_has(c, X86_FEATURE_SPEC_CTRL) ||
index 83c6cd23d648314bf36b9bbfe196f44b2982c4d4..37ac4afe09724b1ef2f2c5254f4504cee77d74ed 100644 (file)
@@ -134,7 +134,7 @@ static u32 intel_cpuid_vfm(void)
        return IFM(fam, model);
 }
 
-static u32 intel_get_platform_id(void)
+u32 intel_get_platform_id(void)
 {
        unsigned int val[2];