From: Dave Hansen <dave.hansen@linux.intel.com>
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>
Cc: Thomas Gleixner <tglx@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Cc: x86@kernel.org
Cc: Jon Kohler <jon@nutanix.com>
--
Changes from v2:
* rename x86_platform_id=>intel_platform_id and remove
initialization from generic code
* Add a amd_unused so it's clear the AMD folks have a
free field to play with.
---
b/arch/x86/include/asm/microcode.h | 2 ++
b/arch/x86/include/asm/processor.h | 5 +++++
b/arch/x86/kernel/cpu/intel.c | 1 +
b/arch/x86/kernel/cpu/microcode/intel.c | 2 +-
4 files changed, 9 insertions(+), 1 deletion(-)
diff -puN arch/x86/include/asm/microcode.h~cpu-x86_stepping arch/x86/include/asm/microcode.h
--- a/arch/x86/include/asm/microcode.h~cpu-x86_stepping 2026-02-24 15:37:21.947261472 -0800
+++ b/arch/x86/include/asm/microcode.h 2026-02-24 15:37:21.955261858 -0800
@@ -61,6 +61,8 @@ static inline int intel_microcode_get_da
return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
}
+extern u32 intel_get_platform_id(void);
+
static inline u32 intel_get_microcode_revision(void)
{
u32 rev, dummy;
diff -puN arch/x86/include/asm/processor.h~cpu-x86_stepping arch/x86/include/asm/processor.h
--- a/arch/x86/include/asm/processor.h~cpu-x86_stepping 2026-02-24 15:37:21.949261568 -0800
+++ b/arch/x86/include/asm/processor.h 2026-02-24 15:37:21.955261858 -0800
@@ -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;
diff -puN arch/x86/kernel/cpu/intel.c~cpu-x86_stepping arch/x86/kernel/cpu/intel.c
--- a/arch/x86/kernel/cpu/intel.c~cpu-x86_stepping 2026-02-24 15:37:21.950261617 -0800
+++ b/arch/x86/kernel/cpu/intel.c 2026-02-24 15:37:21.955261858 -0800
@@ -205,6 +205,7 @@ static void early_init_intel(struct cpui
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) ||
diff -puN arch/x86/kernel/cpu/microcode/intel.c~cpu-x86_stepping arch/x86/kernel/cpu/microcode/intel.c
--- a/arch/x86/kernel/cpu/microcode/intel.c~cpu-x86_stepping 2026-02-24 15:37:21.952261713 -0800
+++ b/arch/x86/kernel/cpu/microcode/intel.c 2026-02-24 15:37:21.955261858 -0800
@@ -133,7 +133,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];
_
On Wed, Mar 04, 2026 at 10:10:20AM -0800, Dave Hansen wrote:
>
> From: Dave Hansen <dave.hansen@linux.intel.com>
>
> 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>
> Cc: Thomas Gleixner <tglx@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Borislav Petkov <bp@alien8.de>
> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Tony Luck <tony.luck@intel.com>
> Cc: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
> Cc: x86@kernel.org
> Cc: Jon Kohler <jon@nutanix.com>
>
> --
>
> Changes from v2:
> * rename x86_platform_id=>intel_platform_id and remove
> initialization from generic code
> * Add a amd_unused so it's clear the AMD folks have a
> free field to play with.
> ---
>
> b/arch/x86/include/asm/microcode.h | 2 ++
> b/arch/x86/include/asm/processor.h | 5 +++++
> b/arch/x86/kernel/cpu/intel.c | 1 +
> b/arch/x86/kernel/cpu/microcode/intel.c | 2 +-
> 4 files changed, 9 insertions(+), 1 deletion(-)
>
> diff -puN arch/x86/include/asm/microcode.h~cpu-x86_stepping arch/x86/include/asm/microcode.h
> --- a/arch/x86/include/asm/microcode.h~cpu-x86_stepping 2026-02-24 15:37:21.947261472 -0800
> +++ b/arch/x86/include/asm/microcode.h 2026-02-24 15:37:21.955261858 -0800
> @@ -61,6 +61,8 @@ static inline int intel_microcode_get_da
> return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
> }
>
> +extern u32 intel_get_platform_id(void);
> +
> static inline u32 intel_get_microcode_revision(void)
> {
> u32 rev, dummy;
> diff -puN arch/x86/include/asm/processor.h~cpu-x86_stepping arch/x86/include/asm/processor.h
> --- a/arch/x86/include/asm/processor.h~cpu-x86_stepping 2026-02-24 15:37:21.949261568 -0800
> +++ b/arch/x86/include/asm/processor.h 2026-02-24 15:37:21.955261858 -0800
> @@ -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;
> diff -puN arch/x86/kernel/cpu/intel.c~cpu-x86_stepping arch/x86/kernel/cpu/intel.c
> --- a/arch/x86/kernel/cpu/intel.c~cpu-x86_stepping 2026-02-24 15:37:21.950261617 -0800
> +++ b/arch/x86/kernel/cpu/intel.c 2026-02-24 15:37:21.955261858 -0800
> @@ -205,6 +205,7 @@ static void early_init_intel(struct cpui
>
> if (c->x86 >= 6 && !cpu_has(c, X86_FEATURE_IA64))
> c->microcode = intel_get_microcode_revision();
> + c->intel_platform_id = intel_get_platform_id();
Just want to make sure that c->intel_platform_id not getting explicitly
initialized for !CONFIG_CPU_SUP_INTEL is okay. I believe it is fine because
the global boot_cpu_data should be zero-initialized.
I see model and stepping are being initialized in identify_cpu(), but I
don't see any vendor specific initialization here:
identify_cpu()
{
int i;
c->loops_per_jiffy = loops_per_jiffy;
c->x86_cache_size = 0;
c->x86_vendor = X86_VENDOR_UNKNOWN;
c->x86_model = c->x86_stepping = 0; /* So far unknown... */
Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
On 3/4/26 18:26, Pawan Gupta wrote:
> Just want to make sure that c->intel_platform_id not getting explicitly
> initialized for !CONFIG_CPU_SUP_INTEL is okay. I believe it is fine because
> the global boot_cpu_data should be zero-initialized.
>
> I see model and stepping are being initialized in identify_cpu(), but I
> don't see any vendor specific initialization here:
>
> identify_cpu()
> {
> int i;
>
> c->loops_per_jiffy = loops_per_jiffy;
> c->x86_cache_size = 0;
> c->x86_vendor = X86_VENDOR_UNKNOWN;
> c->x86_model = c->x86_stepping = 0; /* So far unknown... */
Yeah, I believe it's OK. The model/stepping initialization is probably
unnecessary in the first place, and all of the Intel code that use the
platform IDs will have set it properly.
The following commit has been merged into the x86/microcode branch of tip:
Commit-ID: d8630b67ca1edeea728dbb309b09d239e9db6bdf
Gitweb: https://git.kernel.org/tip/d8630b67ca1edeea728dbb309b09d239e9db6bdf
Author: Dave Hansen <dave.hansen@linux.intel.com>
AuthorDate: Wed, 04 Mar 2026 10:10:20 -08:00
Committer: Dave Hansen <dave.hansen@linux.intel.com>
CommitterDate: Thu, 05 Mar 2026 12:25:32 -08:00
x86/cpu: Add platform ID to CPU info structure
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 | 2 ++
arch/x86/include/asm/processor.h | 5 +++++
arch/x86/kernel/cpu/intel.c | 1 +
arch/x86/kernel/cpu/microcode/intel.c | 2 +-
4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
index 8b41f26..3c317d1 100644
--- a/arch/x86/include/asm/microcode.h
+++ b/arch/x86/include/asm/microcode.h
@@ -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;
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index a24c780..10b5355 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -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;
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 646ff33..f28c0ef 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -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) ||
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index 83c6cd2..37ac4af 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -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];
The following commit has been merged into the x86/microcode branch of tip:
Commit-ID: 55ed3712b70c2c80a2fe09d7f7be48459867754d
Gitweb: https://git.kernel.org/tip/55ed3712b70c2c80a2fe09d7f7be48459867754d
Author: Dave Hansen <dave.hansen@linux.intel.com>
AuthorDate: Wed, 04 Mar 2026 10:10:20 -08:00
Committer: Dave Hansen <dave.hansen@linux.intel.com>
CommitterDate: Thu, 05 Mar 2026 10:41:30 -08:00
x86/cpu: Add platform ID to CPU info structure
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.
--
Changes from v2:
* rename x86_platform_id=>intel_platform_id and remove
initialization from generic code
* Add a amd_unused so it's clear the AMD folks have a
free field to play with.
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 | 2 ++
arch/x86/include/asm/processor.h | 5 +++++
arch/x86/kernel/cpu/intel.c | 1 +
arch/x86/kernel/cpu/microcode/intel.c | 2 +-
4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
index 8b41f26..3c317d1 100644
--- a/arch/x86/include/asm/microcode.h
+++ b/arch/x86/include/asm/microcode.h
@@ -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;
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index a24c780..10b5355 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -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;
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 646ff33..f28c0ef 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -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) ||
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index 83c6cd2..37ac4af 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -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];
© 2016 - 2026 Red Hat, Inc.