lkml.org 
[lkml]   [2023]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: sched/core] cpuidle, OMAP4: Push RCU-idle into omap4_enter_lowpower()
    The following commit has been merged into the sched/core branch of tip:

    Commit-ID: a282e5ef2954e0bc2740c0c8c278f777933cc4fb
    Gitweb: https://git.kernel.org/tip/a282e5ef2954e0bc2740c0c8c278f777933cc4fb
    Author: Tony Lindgren <tony@atomide.com>
    AuthorDate: Thu, 12 Jan 2023 20:43:52 +01:00
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitterDate: Fri, 13 Jan 2023 11:48:17 +01:00

    cpuidle, OMAP4: Push RCU-idle into omap4_enter_lowpower()

    OMAP4 uses full SoC suspend modes as idle states, as such it needs the
    whole power-domain and clock-domain code from the idle path.

    All that code is not suitable to run with RCU disabled, as such push
    RCU-idle deeper still.

    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Tested-by: Tony Lindgren <tony@atomide.com>
    Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: Frederic Weisbecker <frederic@kernel.org>
    Link: https://lkml.kernel.org/r/Yqcv6crSNKuSWoTu@atomide.com
    Link: https://lore.kernel.org/r/20230112195541.660272394@infradead.org
    ---
    arch/arm/mach-omap2/common.h | 6 ++++--
    arch/arm/mach-omap2/cpuidle44xx.c | 8 ++------
    arch/arm/mach-omap2/omap-mpuss-lowpower.c | 12 +++++++++++-
    arch/arm/mach-omap2/pm44xx.c | 2 +-
    4 files changed, 18 insertions(+), 10 deletions(-)

    diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
    index bd59819..b745ff5 100644
    --- a/arch/arm/mach-omap2/common.h
    +++ b/arch/arm/mach-omap2/common.h
    @@ -284,11 +284,13 @@ extern u32 omap4_get_cpu1_ns_pa_addr(void);

    #if defined(CONFIG_SMP) && defined(CONFIG_PM)
    extern int omap4_mpuss_init(void);
    -extern int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state);
    +extern int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state,
    + bool rcuidle);
    extern int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state);
    #else
    static inline int omap4_enter_lowpower(unsigned int cpu,
    - unsigned int power_state)
    + unsigned int power_state,
    + bool rcuidle)
    {
    cpu_do_idle();
    return 0;
    diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
    index 3c97d56..df10652 100644
    --- a/arch/arm/mach-omap2/cpuidle44xx.c
    +++ b/arch/arm/mach-omap2/cpuidle44xx.c
    @@ -105,9 +105,7 @@ static int omap_enter_idle_smp(struct cpuidle_device *dev,
    }
    raw_spin_unlock_irqrestore(&mpu_lock, flag);

    - ct_cpuidle_enter();
    - omap4_enter_lowpower(dev->cpu, cx->cpu_state);
    - ct_cpuidle_exit();
    + omap4_enter_lowpower(dev->cpu, cx->cpu_state, true);

    raw_spin_lock_irqsave(&mpu_lock, flag);
    if (cx->mpu_state_vote == num_online_cpus())
    @@ -186,10 +184,8 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
    }
    }

    - ct_cpuidle_enter();
    - omap4_enter_lowpower(dev->cpu, cx->cpu_state);
    + omap4_enter_lowpower(dev->cpu, cx->cpu_state, true);
    cpu_done[dev->cpu] = true;
    - ct_cpuidle_exit();

    /* Wakeup CPU1 only if it is not offlined */
    if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
    diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
    index 9fba98c..7f29e17 100644
    --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c
    +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
    @@ -33,6 +33,7 @@
    * and first to wake-up when MPUSS low power states are excercised
    */

    +#include <linux/cpuidle.h>
    #include <linux/kernel.h>
    #include <linux/io.h>
    #include <linux/errno.h>
    @@ -214,6 +215,7 @@ static void __init save_l2x0_context(void)
    * of OMAP4 MPUSS subsystem
    * @cpu : CPU ID
    * @power_state: Low power state.
    + * @rcuidle: RCU needs to be idled
    *
    * MPUSS states for the context save:
    * save_state =
    @@ -222,7 +224,8 @@ static void __init save_l2x0_context(void)
    * 2 - CPUx L1 and logic lost + GIC lost: MPUSS OSWR
    * 3 - CPUx L1 and logic lost + GIC + L2 lost: DEVICE OFF
    */
    -int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
    +int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state,
    + bool rcuidle)
    {
    struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu);
    unsigned int save_state = 0, cpu_logic_state = PWRDM_POWER_RET;
    @@ -268,6 +271,10 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
    cpu_clear_prev_logic_pwrst(cpu);
    pwrdm_set_next_pwrst(pm_info->pwrdm, power_state);
    pwrdm_set_logic_retst(pm_info->pwrdm, cpu_logic_state);
    +
    + if (rcuidle)
    + ct_cpuidle_enter();
    +
    set_cpu_wakeup_addr(cpu, __pa_symbol(omap_pm_ops.resume));
    omap_pm_ops.scu_prepare(cpu, power_state);
    l2x0_pwrst_prepare(cpu, save_state);
    @@ -283,6 +290,9 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
    if (IS_PM44XX_ERRATUM(PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD) && cpu)
    gic_dist_enable();

    + if (rcuidle)
    + ct_cpuidle_exit();
    +
    /*
    * Restore the CPUx power state to ON otherwise CPUx
    * power domain can transitions to programmed low power
    diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
    index 5a7a949..f57802f 100644
    --- a/arch/arm/mach-omap2/pm44xx.c
    +++ b/arch/arm/mach-omap2/pm44xx.c
    @@ -76,7 +76,7 @@ static int omap4_pm_suspend(void)
    * domain CSWR is not supported by hardware.
    * More details can be found in OMAP4430 TRM section 4.3.4.2.
    */
    - omap4_enter_lowpower(cpu_id, cpu_suspend_state);
    + omap4_enter_lowpower(cpu_id, cpu_suspend_state, false);

    /* Restore next powerdomain state */
    list_for_each_entry(pwrst, &pwrst_list, node) {
    \
     
     \ /
      Last update: 2023-03-26 23:39    [W:2.975 / U:0.484 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site