All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/ACPI: _PDC bits vs HWP/CPPC
@ 2026-03-04 14:37 Jan Beulich
  2026-03-04 16:36 ` Roger Pau Monné
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2026-03-04 14:37 UTC (permalink / raw)
  To: xen-devel@lists.xenproject.org
  Cc: Andrew Cooper, Roger Pau Monné, Jason Andryuk, Penny Zheng

The treatment of ACPI_PDC_CPPC_NATIVE_INTR should follow that of other P-
state related bits. Add the bit to ACPI_PDC_P_MASK and apply "mask" in
arch_acpi_set_pdc_bits() when setting that bit. Move this next to the
other P-state related logic.

Further apply ACPI_PDC_P_MASK also when the amd-cppc driver is in use.

Also leave a comment regarding the clearing of bits and add a couple of
blank lines.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
Including XEN_PROCESSOR_PM_CPPC may need accompanying with some change to
arch_acpi_set_pdc_bits(), but it's entirely unclear to me what to do
there. I'm unaware of an AMD counterpart of Intel's "Intel® Processor
Vendor-Specific ACPI". Plus even when the powernow driver is in use, we
never set any bits, as EIST is an Intel-only feature.

acpi_set_pdc_bits() having moved to the cpufreq driver looks to have been
a mistake. It covers not only P-state related bits, but also C-state and
T-state ones. (This is only a latent issue as long as
https://lists.xen.org/archives/html/xen-devel/2026-02/msg00875.html
wouldn't land.)

--- a/xen/arch/x86/acpi/lib.c
+++ b/xen/arch/x86/acpi/lib.c
@@ -124,6 +124,9 @@ int arch_acpi_set_pdc_bits(u32 acpi_id,
 	if (cpu_has(c, X86_FEATURE_EIST))
 		pdc[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP & mask;
 
+	if (hwp_active())
+		pdc[2] |= ACPI_PDC_CPPC_NATIVE_INTR & mask;
+
 	if (cpu_has(c, X86_FEATURE_ACPI))
 		pdc[2] |= ACPI_PDC_T_FFH & mask;
 
@@ -142,8 +145,5 @@ int arch_acpi_set_pdc_bits(u32 acpi_id,
 	    !(ecx & CPUID5_ECX_INTERRUPT_BREAK))
 		pdc[2] &= ~(ACPI_PDC_C_C1_FFH | ACPI_PDC_C_C2C3_FFH);
 
-	if (hwp_active())
-		pdc[2] |= ACPI_PDC_CPPC_NATIVE_INTR;
-
 	return 0;
 }
--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -694,14 +694,23 @@ int acpi_set_pdc_bits(unsigned int acpi_
     {
         uint32_t mask = 0;
 
+        /*
+         * Accumulate all the bits under Xen's control, to mask them off, for
+         * arch_acpi_set_pdc_bits() to then set those we want set.
+         */
         if ( xen_processor_pmbits & XEN_PROCESSOR_PM_CX )
             mask |= ACPI_PDC_C_MASK | ACPI_PDC_SMP_C1PT;
-        if ( xen_processor_pmbits & XEN_PROCESSOR_PM_PX )
+
+        if ( xen_processor_pmbits &
+             (XEN_PROCESSOR_PM_PX | XEN_PROCESSOR_PM_CPPC) )
             mask |= ACPI_PDC_P_MASK | ACPI_PDC_SMP_C1PT;
+
         if ( xen_processor_pmbits & XEN_PROCESSOR_PM_TX )
             mask |= ACPI_PDC_T_MASK | ACPI_PDC_SMP_C1PT;
+
         bits[2] &= (ACPI_PDC_C_MASK | ACPI_PDC_P_MASK | ACPI_PDC_T_MASK |
                     ACPI_PDC_SMP_C1PT) & ~mask;
+
         ret = arch_acpi_set_pdc_bits(acpi_id, bits, mask);
     }
     if ( !ret && __copy_to_guest_offset(pdc, 2, bits + 2, 1) )
--- a/xen/include/acpi/pdc_intel.h
+++ b/xen/include/acpi/pdc_intel.h
@@ -43,7 +43,8 @@
 
 #define ACPI_PDC_P_MASK			(ACPI_PDC_P_FFH | \
 					 ACPI_PDC_SMP_P_SWCOORD | \
-					 ACPI_PDC_SMP_P_HWCOORD)
+					 ACPI_PDC_SMP_P_HWCOORD | \
+					 ACPI_PDC_CPPC_NATIVE_INTR)
 
 #define ACPI_PDC_T_MASK			(ACPI_PDC_T_FFH | \
 					 ACPI_PDC_SMP_T_SWCOORD)


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-03-05 20:25 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-04 14:37 [PATCH] x86/ACPI: _PDC bits vs HWP/CPPC Jan Beulich
2026-03-04 16:36 ` Roger Pau Monné
2026-03-05  8:17   ` Jan Beulich
2026-03-05  8:50     ` Roger Pau Monné
2026-03-05  9:20       ` Jan Beulich
2026-03-05 10:17         ` Roger Pau Monné
2026-03-05 11:39           ` Jan Beulich
2026-03-05 12:30             ` Roger Pau Monné
2026-03-05 12:40               ` Jan Beulich
2026-03-05 20:25                 ` Roger Pau Monné

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.