[PATCH v7 064/120] x86/process: Use parsed CPUID(0x5)

"Ahmed S. Darwish" <[email protected]> Thu, 28 May 2026 17:38:26 +0200
Newsgroups dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Use parsed CPUID(0x5) instead of doing manual bitwise operations and a
direct CPUID query..

Remove the MWAIT_C1_SUBSTATE_MASK flag as it has no more users.

Signed-off-by: Ahmed S. Darwish <[email protected]>
---
 arch/x86/include/asm/mwait.h |  1 -
 arch/x86/kernel/process.c    | 10 ++++------
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
index e4815e15dc9a..40c827e7929e 100644
--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -13,7 +13,6 @@
 #define MWAIT_SUBSTATE_SIZE		4
 #define MWAIT_HINT2CSTATE(hint)		(((hint) >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK)
 #define MWAIT_HINT2SUBSTATE(hint)	((hint) & MWAIT_CSTATE_MASK)
-#define MWAIT_C1_SUBSTATE_MASK  0xf0
 
 #define CPUID5_ECX_EXTENSIONS_SUPPORTED 0x1
 #define CPUID5_ECX_INTERRUPT_BREAK	0x2
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 4c718f8adc59..6c1a69dbc71f 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -876,34 +876,32 @@ void __noreturn stop_this_cpu(void *dummy)
 static __init bool prefer_mwait_c1_over_halt(void)
 {
 	const struct cpuinfo_x86 *c = &boot_cpu_data;
-	u32 eax, ebx, ecx, edx;
+	const struct leaf_0x5_0 *l5 = cpuid_leaf(c, 0x5);
 
 	/* If override is enforced on the command line, fall back to HALT. */
 	if (boot_option_idle_override != IDLE_NO_OVERRIDE)
 		return false;
 
 	/* MWAIT is not supported on this platform. Fallback to HALT */
-	if (!cpu_has(c, X86_FEATURE_MWAIT))
+	if (!cpu_has(c, X86_FEATURE_MWAIT) || !l5)
 		return false;
 
 	/* Monitor has a bug or APIC stops in C1E. Fallback to HALT */
 	if (boot_cpu_has_bug(X86_BUG_MONITOR) || boot_cpu_has_bug(X86_BUG_AMD_APIC_C1E))
 		return false;
 
-	cpuid(CPUID_LEAF_MWAIT, &eax, &ebx, &ecx, &edx);
-
 	/*
 	 * If MWAIT extensions are not available, it is safe to use MWAIT
 	 * with EAX=0, ECX=0.
 	 */
-	if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED))
+	if (!l5->mwait_ext)
 		return true;
 
 	/*
 	 * If MWAIT extensions are available, there should be at least one
 	 * MWAIT C1 substate present.
 	 */
-	return !!(edx & MWAIT_C1_SUBSTATE_MASK);
+	return l5->n_c1_substates;
 }
 
 /*
-- 
2.54.0