Re: [PATCH] cpufreq: intel_pstate: Add DMI quirk for Dell Inspiron systems

From: srinivas pandruvada
Date: Sun Jun 08 2025 - 21:10:55 EST


On Fri, 2025-06-06 at 16:15 -0700, Joe Walter wrote:
> Some Dell Inspiron systems experience frequency scaling issues with
> intel_pstate driver where the CPU gets locked at 900MHz after load.
>
> Add DMI quirk table to detect affected Dell Inspiron models and
> prevent
> intel_pstate from loading, allowing acpi-cpufreq to handle frequency
> scaling instead.

This is the first time in 10+ years a quirk using DMI..

>
> Affected models:
> - Dell Inspiron 15 7000 Gaming
> - Dell Inspiron 7567
> - Dell Inspiron 7559

I think these all are using KabyLake CPU models around 2017.

Do you have turbostat logs to see why it is dropping to 900 MHz? If not
please attach. Most of such drops usually triggered by power/thermal
limits. We have to check the power limit settings.



Try with a different EPP settings instead of default by using
/sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference


Also try:
echo passive > /sys/devices/system/cpu/intel_pstate/status

Thanks,
Srinivas

>
> Tested-by: Joe Walter <joe.walter@xxxxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Joe Walter <joe.walter@xxxxxxxxxxxxxxxxxxxxxx>
> ---
>  drivers/cpufreq/intel_pstate.c | 65 ++++++++++++++++++++++----------
> --
>  1 file changed, 42 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/cpufreq/intel_pstate.c
> b/drivers/cpufreq/intel_pstate.c
> index 1b1f62ccec92..3aeb04755afa 100644
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -28,7 +28,6 @@
>  #include <linux/pm_qos.h>
>  #include <linux/bitfield.h>
>  #include <trace/events/power.h>
> -#include <linux/dmi.h>
>  #include <linux/units.h>
>  
>  #include <asm/cpu.h>
> @@ -48,6 +47,7 @@
>  #ifdef CONFIG_ACPI
>  #include <acpi/processor.h>
>  #include <acpi/cppc_acpi.h>
> +#include <linux/dmi.h>
>  #endif
>  
>  #define FRAC_BITS 8
> @@ -299,25 +299,6 @@ struct pstate_funcs {
>  
>  static struct pstate_funcs pstate_funcs __read_mostly;
>  
> -/* DMI quirk table for systems that should prefer acpi-cpufreq over
> intel_pstate */
> -static int intel_pstate_prefer_acpi_cpufreq(const struct
> dmi_system_id *id)
> -{
> - pr_info("Preferring acpi-cpufreq for %s due to performance
> issues with intel_pstate\n",
> - id->ident);
> - return 1;
> -}
> -
> -static const struct dmi_system_id intel_pstate_acpi_cpufreq_prefer[]
> = {
> - {
> - .callback = intel_pstate_prefer_acpi_cpufreq,
> - .ident = "Dell Inspiron 15 7000 Gaming",
> - .matches = {
> - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 15
> 7000 Gaming"),
> - },
> - },
> - { }
> -};
>  static bool hwp_active __ro_after_init;
>  static int hwp_mode_bdw __ro_after_init;
>  static bool per_cpu_limits __ro_after_init;
> @@ -2799,6 +2780,41 @@ static const struct x86_cpu_id
> intel_pstate_cpu_ids[] = {
>  };
>  MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids);
>  
> +/* DMI quirk table for systems that should prefer acpi-cpufreq over
> intel_pstate */
> +static int intel_pstate_prefer_acpi_cpufreq(const struct
> dmi_system_id *id)
> +{
> + pr_info("Detected %s, preferring acpi-cpufreq\n", id-
> >ident);
> + return 0;
> +}
> +
> +static const struct dmi_system_id intel_pstate_acpi_cpufreq_prefer[]
> = {
> + {
> + .ident = "Dell Inspiron 15 7000 Gaming",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 15
> 7000 Gaming"),
> + },
> + .callback = intel_pstate_prefer_acpi_cpufreq,
> + },
> + {
> + .ident = "Dell Inspiron 7567",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron
> 7567"),
> + },
> + .callback = intel_pstate_prefer_acpi_cpufreq,
> + },
> + {
> + .ident = "Dell Inspiron 7559",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron
> 7559"),
> + },
> + .callback = intel_pstate_prefer_acpi_cpufreq,
> + },
> + {}
> +};
> +
>  #ifdef CONFIG_ACPI
>  static const struct x86_cpu_id intel_pstate_cpu_oob_ids[]
> __initconst = {
>   X86_MATCH(INTEL_BROADWELL_D, core_funcs),
> @@ -3825,6 +3841,12 @@ static int __init intel_pstate_init(void)
>   const struct x86_cpu_id *id;
>   int rc;
>  
> +
> + /* Early DMI check - prevent intel_pstate on problematic
> systems */
> + if (dmi_check_system(intel_pstate_acpi_cpufreq_prefer)) {
> + pr_info("intel_pstate: system prefers acpi-cpufreq,
> not loading\n");
> + return -ENODEV;
> + }
>   if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
>   return -ENODEV;
>  
> @@ -3887,9 +3909,6 @@ static int __init intel_pstate_init(void)
>   pr_info("Invalid MSRs\n");
>   return -ENODEV;
>   }
> -/* Check for systems that should prefer acpi-cpufreq */
> - if (!default_driver &&
> dmi_check_system(intel_pstate_acpi_cpufreq_prefer))
> - default_driver = &intel_cpufreq;
>   /* Without HWP start in the passive mode. */
>   if (!default_driver)
>   default_driver = &intel_cpufreq;