aboutsummaryrefslogtreecommitdiff
path: root/sys/x86
diff options
context:
space:
mode:
authorShengYi Hung <aokblast@FreeBSD.org>2026-06-01 09:46:37 +0000
committerShengYi Hung <aokblast@FreeBSD.org>2026-06-02 06:41:41 +0000
commit7b26353a59d66dc1bc611fd042a49b9e3bd13699 (patch)
treef75d2f1414e3a00d018096f9efa9a7a2cdd33c83 /sys/x86
parent553ef188f7ecc23a384bd7ef1f3d5015fb8661da (diff)
Diffstat (limited to 'sys/x86')
-rw-r--r--sys/x86/cpufreq/hwpstate_intel.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/x86/cpufreq/hwpstate_intel.c b/sys/x86/cpufreq/hwpstate_intel.c
index 3d2cc0a5966b..db8600d7b89a 100644
--- a/sys/x86/cpufreq/hwpstate_intel.c
+++ b/sys/x86/cpufreq/hwpstate_intel.c
@@ -321,9 +321,19 @@ out:
return (ret);
}
+static void
+intel_hwpstate_hybrid_cb(void *ctx)
+{
+ uint32_t *small_cores = ctx;
+
+ atomic_add_32(small_cores, PCPU_GET(small_core));
+}
+
void
intel_hwpstate_identify(driver_t *driver, device_t parent)
{
+ uint32_t small_cores = 0;
+
if (device_find_child(parent, "hwpstate_intel", DEVICE_UNIT_ANY) != NULL)
return;
@@ -343,6 +353,17 @@ intel_hwpstate_identify(driver_t *driver, device_t parent)
if ((cpu_power_eax & CPUTPM1_HWP) == 0)
return;
+ /*
+ * On hybrid-core systems, package-level control cannot be used.
+ * It may cause all cores to run at the E-core frequency because
+ * the resulting package frequency depends on the last core that
+ * sets the frequency.
+ */
+ smp_rendezvous_cpus(all_cpus, smp_no_rendezvous_barrier,
+ intel_hwpstate_hybrid_cb, smp_no_rendezvous_barrier, &small_cores);
+ if (small_cores > 0 && small_cores < mp_ncores)
+ hwpstate_pkg_ctrl_enable = false;
+
if (BUS_ADD_CHILD(parent, 10, "hwpstate_intel", device_get_unit(parent))
== NULL)
device_printf(parent, "hwpstate_intel: add child failed\n");