[PATCH v7 070/120] thermal: intel: hfi: Use parsed CPUID(0x6)

"Ahmed S. Darwish" <[email protected]> Thu, 28 May 2026 17:38:32 +0200
Newsgroups dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Use parsed CPUID(0x6) instead of direct CPUID queries and custom data
types.

Signed-off-by: Ahmed S. Darwish <[email protected]>
---
 drivers/thermal/intel/intel_hfi.c | 62 ++++++++++---------------------
 1 file changed, 20 insertions(+), 42 deletions(-)

diff --git a/drivers/thermal/intel/intel_hfi.c b/drivers/thermal/intel/intel_hfi.c
index 3273b8fe3d4d..4f0cb157b5d8 100644
--- a/drivers/thermal/intel/intel_hfi.c
+++ b/drivers/thermal/intel/intel_hfi.c
@@ -53,29 +53,6 @@
 #define HW_FEEDBACK_PTR_VALID_BIT		BIT(0)
 #define HW_FEEDBACK_CONFIG_HFI_ENABLE_BIT	BIT(0)
 
-/* CPUID detection and enumeration definitions for HFI */
-
-#define CPUID_HFI_LEAF 6
-
-union hfi_capabilities {
-	struct {
-		u8	performance:1;
-		u8	energy_efficiency:1;
-		u8	__reserved:6;
-	} split;
-	u8 bits;
-};
-
-union cpuid6_edx {
-	struct {
-		union hfi_capabilities	capabilities;
-		u32			table_pages:4;
-		u32			__reserved:4;
-		s32			index:16;
-	} split;
-	u32 full;
-};
-
 /**
  * struct hfi_cpu_data - HFI capabilities per CPU
  * @perf_cap:		Performance capability
@@ -326,16 +303,20 @@ void intel_hfi_process_event(__u64 pkg_therm_status_msr_val)
 			   msecs_to_jiffies(HFI_UPDATE_DELAY_MS));
 }
 
-static void init_hfi_cpu_index(struct hfi_cpu_info *info)
+static bool init_hfi_cpu_index(struct hfi_cpu_info *info, int cpu)
 {
-	union cpuid6_edx edx;
+	const struct leaf_0x6_0 *l6 = cpuid_leaf(&cpu_data(cpu), 0x6);
 
 	/* Do not re-read @cpu's index if it has already been initialized. */
 	if (info->index > -1)
-		return;
+		return true;
+
+	/* Cannot do anything if CPUID(0x6) is missing */
+	if (!l6)
+		return false;
 
-	edx.full = cpuid_edx(CPUID_HFI_LEAF);
-	info->index = edx.split.index;
+	info->index = l6->this_lcpu_hwfdbk_idx;
+	return true;
 }
 
 /*
@@ -436,7 +417,8 @@ void intel_hfi_online(unsigned int cpu)
 		info->hfi_instance = hfi_instance;
 	}
 
-	init_hfi_cpu_index(info);
+	if (!init_hfi_cpu_index(info, cpu))
+		return;
 
 	/*
 	 * Now check if the HFI instance of the package of @cpu has been
@@ -535,19 +517,13 @@ void intel_hfi_offline(unsigned int cpu)
 
 static __init int hfi_parse_features(void)
 {
-	unsigned int nr_capabilities;
-	union cpuid6_edx edx;
+	const struct leaf_0x6_0 *l6 = cpuid_leaf(&boot_cpu_data, 0x6);
+	unsigned int nr_capabilities = 0;
 
-	if (!boot_cpu_has(X86_FEATURE_HFI))
+	if (!boot_cpu_has(X86_FEATURE_HFI) || !l6)
 		return -ENODEV;
 
-	/*
-	 * If we are here we know that CPUID_HFI_LEAF exists. Parse the
-	 * supported capabilities and the size of the HFI table.
-	 */
-	edx.full = cpuid_edx(CPUID_HFI_LEAF);
-
-	if (!edx.split.capabilities.split.performance) {
+	if (!l6->perfcap_reporting) {
 		pr_debug("Performance reporting not supported! Not using HFI\n");
 		return -ENODEV;
 	}
@@ -556,11 +532,13 @@ static __init int hfi_parse_features(void)
 	 * The number of supported capabilities determines the number of
 	 * columns in the HFI table. Exclude the reserved bits.
 	 */
-	edx.split.capabilities.split.__reserved = 0;
-	nr_capabilities = hweight8(edx.split.capabilities.bits);
+	if (l6->perfcap_reporting)
+		nr_capabilities++;
+	if (l6->encap_reporting)
+		nr_capabilities++;
 
 	/* The number of 4KB pages required by the table */
-	hfi_features.nr_table_pages = edx.split.table_pages + 1;
+	hfi_features.nr_table_pages = l6->feedback_sz + 1;
 
 	/*
 	 * The header contains change indications for each supported feature.
-- 
2.54.0