]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
intel_idle: clean up BYT/CHT auto demotion disable
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Mon, 10 Feb 2025 07:12:53 +0000 (09:12 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 19 Feb 2025 12:04:45 +0000 (13:04 +0100)
Bay Trail (BYT) and Cherry Trail (CHT) platforms have a very specific way
of disabling auto-demotion via specific MSR bits. Clean up the code so that
BYT/CHT-specifics do not show up in the common 'struct idle_cpu' data
structure.

Remove the 'byt_auto_demotion_disable_flag' flag from 'struct idle_cpu',
because a better coding pattern is to avoid very case-specific fields like
'bool byt_auto_demotion_disable_flag' in a common data structure, which is
used for all platforms, not only BYT/CHT. The code is just more readable
when common data structures contain only commonly used fields.

Instead, match BYT/CHT in the 'intel_idle_init_cstates_icpu()' function,
and introduce a small helper to take care of BYT/CHT auto-demotion. This
is consistent with how platform-specific things are done for other
platforms.

No intended functional changes, compile-tested only.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Link: https://patch.msgid.link/20250210071253.2991030-1-dedekind1@gmail.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/idle/intel_idle.c

index 118fe1d37c226fd1b5e2831d50fc695f815feecf..324814dc34fadbd0df53f5e097f0050df2159f57 100644 (file)
@@ -89,7 +89,6 @@ struct idle_cpu {
         * Indicate which enable bits to clear here.
         */
        unsigned long auto_demotion_disable_flags;
-       bool byt_auto_demotion_disable_flag;
        bool disable_promotion_to_c1e;
        bool use_acpi;
 };
@@ -1463,13 +1462,11 @@ static const struct idle_cpu idle_cpu_snx __initconst = {
 static const struct idle_cpu idle_cpu_byt __initconst = {
        .state_table = byt_cstates,
        .disable_promotion_to_c1e = true,
-       .byt_auto_demotion_disable_flag = true,
 };
 
 static const struct idle_cpu idle_cpu_cht __initconst = {
        .state_table = cht_cstates,
        .disable_promotion_to_c1e = true,
-       .byt_auto_demotion_disable_flag = true,
 };
 
 static const struct idle_cpu idle_cpu_ivb __initconst = {
@@ -2055,6 +2052,15 @@ static void __init spr_idle_state_table_update(void)
        }
 }
 
+/**
+ * byt_cht_auto_demotion_disable - Disable Bay/Cherry Trail auto-demotion.
+ */
+static void __init byt_cht_auto_demotion_disable(void)
+{
+       wrmsrl(MSR_CC6_DEMOTION_POLICY_CONFIG, 0);
+       wrmsrl(MSR_MC6_DEMOTION_POLICY_CONFIG, 0);
+}
+
 static bool __init intel_idle_verify_cstate(unsigned int mwait_hint)
 {
        unsigned int mwait_cstate = (MWAIT_HINT2CSTATE(mwait_hint) + 1) &
@@ -2136,6 +2142,10 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
        case INTEL_ATOM_GRACEMONT:
                adl_idle_state_table_update();
                break;
+       case INTEL_ATOM_SILVERMONT:
+       case INTEL_ATOM_AIRMONT:
+               byt_cht_auto_demotion_disable();
+               break;
        }
 
        for (cstate = 0; cstate < CPUIDLE_STATE_MAX; ++cstate) {
@@ -2178,11 +2188,6 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
 
                drv->state_count++;
        }
-
-       if (icpu->byt_auto_demotion_disable_flag) {
-               wrmsrl(MSR_CC6_DEMOTION_POLICY_CONFIG, 0);
-               wrmsrl(MSR_MC6_DEMOTION_POLICY_CONFIG, 0);
-       }
 }
 
 /**