]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpuidle: psci: Enable the hierarchical topology for s2idle on PREEMPT_RT
authorUlf Hansson <ulf.hansson@linaro.org>
Mon, 27 May 2024 14:25:57 +0000 (16:25 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 5 Aug 2024 11:25:45 +0000 (13:25 +0200)
To enable the domain-idle-states to be used during s2idle on a PREEMPT_RT
based configuration, let's allow the re-assignment of the ->enter_s2idle()
callback to psci_enter_s2idle_domain_idle_state().

Similar to s2ram, let's leave the support for CPU hotplug outside
PREEMPT_RT, as it's depending on using runtime PM. For s2idle, this means
that an offline CPU's PM domain will remain powered-on. In practise this
may lead to that a shallower idle-state than necessary gets selected, which
shouldn't be an issue (besides wasting power).

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Raghavendra Kakarla <quic_rkakarla@quicinc.com> # qcm6490 with PREEMPT_RT set
Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://lore.kernel.org/r/20240527142557.321610-8-ulf.hansson@linaro.org
drivers/cpuidle/cpuidle-psci.c

index ad6ce9fe12b445eb7720651e79629ab0a7b0335d..2562dc001fc1de69732ef28f383d2809262a3d96 100644 (file)
@@ -233,18 +233,17 @@ static int psci_dt_cpu_init_topology(struct cpuidle_driver *drv,
 
        psci_cpuidle_use_syscore = true;
 
-       /* The hierarchical topology is limited to s2ram on PREEMPT_RT. */
-       if (IS_ENABLED(CONFIG_PREEMPT_RT))
-               return 0;
-
        /*
         * Using the deepest state for the CPU to trigger a potential selection
         * of a shared state for the domain, assumes the domain states are all
-        * deeper states.
+        * deeper states. On PREEMPT_RT the hierarchical topology is limited to
+        * s2ram and s2idle.
         */
-       drv->states[state_count - 1].enter = psci_enter_domain_idle_state;
        drv->states[state_count - 1].enter_s2idle = psci_enter_s2idle_domain_idle_state;
-       psci_cpuidle_use_cpuhp = true;
+       if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
+               drv->states[state_count - 1].enter = psci_enter_domain_idle_state;
+               psci_cpuidle_use_cpuhp = true;
+       }
 
        return 0;
 }