[PATCH v7 058/120] RAS/AMD/FMPM: Use parsed CPUID(0x1)

"Ahmed S. Darwish" <[email protected]> Thu, 28 May 2026 17:38:20 +0200
Newsgroups dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Use parsed CPUID(0x1) instead of a direct CPUID query.  This centralizes
CPUID parsing and access for the kernel.

Note, follow the API requirements by checking the for NULL beforehand.

Signed-off-by: Ahmed S. Darwish <[email protected]>
---
 drivers/ras/amd/fmpm.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/ras/amd/fmpm.c b/drivers/ras/amd/fmpm.c
index 4ccaaf7b70bf..bd8450ec61e2 100644
--- a/drivers/ras/amd/fmpm.c
+++ b/drivers/ras/amd/fmpm.c
@@ -564,11 +564,15 @@ static int save_new_records(void)
 /* Check that the record matches expected types for the current system.*/
 static bool fmp_is_usable(struct fru_rec *rec)
 {
+	const struct cpuid_regs *l1 = cpuid_leaf_raw(&boot_cpu_data, 0x1);
 	struct cper_sec_fru_mem_poison *fmp = &rec->fmp;
 	u64 cpuid;
 
 	pr_debug("Validation bits: 0x%016llx\n", fmp->validation_bits);
 
+	if (!l1)
+		return false;
+
 	if (!(fmp->validation_bits & FMP_VALID_ARCH_TYPE)) {
 		pr_debug("Arch type unknown\n");
 		return false;
@@ -584,7 +588,7 @@ static bool fmp_is_usable(struct fru_rec *rec)
 		return false;
 	}
 
-	cpuid = cpuid_eax(1);
+	cpuid = l1->eax;
 	if (fmp->fru_arch != cpuid) {
 		pr_debug("Arch value mismatch: record = 0x%016llx, system = 0x%016llx\n",
 			 fmp->fru_arch, cpuid);
@@ -719,15 +723,19 @@ static int get_saved_records(void)
 	return ret;
 }
 
-static void set_fmp_fields(struct fru_rec *rec, unsigned int cpu)
+static int set_fmp_fields(struct fru_rec *rec, unsigned int cpu)
 {
+	const struct cpuid_regs *l1 = cpuid_leaf_raw(&boot_cpu_data, 0x1);
 	struct cper_sec_fru_mem_poison *fmp = &rec->fmp;
 
+	if (!l1)
+		return -EIO;
+
 	fmp->fru_arch_type    = FMP_ARCH_TYPE_X86_CPUID_1_EAX;
 	fmp->validation_bits |= FMP_VALID_ARCH_TYPE;
 
 	/* Assume all CPUs in the system have the same value for now. */
-	fmp->fru_arch	      = cpuid_eax(1);
+	fmp->fru_arch	      = l1->eax;
 	fmp->validation_bits |= FMP_VALID_ARCH;
 
 	fmp->fru_id_type      = FMP_ID_TYPE_X86_PPIN;
@@ -735,6 +743,8 @@ static void set_fmp_fields(struct fru_rec *rec, unsigned int cpu)
 
 	fmp->fru_id	      = topology_ppin(cpu);
 	fmp->validation_bits |= FMP_VALID_ID;
+
+	return 0;
 }
 
 static int init_fmps(void)
@@ -761,7 +771,9 @@ static int init_fmps(void)
 			break;
 		}
 
-		set_fmp_fields(rec, fru_cpu);
+		ret = set_fmp_fields(rec, fru_cpu);
+		if (ret)
+			break;
 	}
 
 	return ret;
-- 
2.54.0