lkml.org 
[lkml]   [2020]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 071/152] ARM: OMAP2+: Manage MPU state properly for omap_enter_idle_coupled()
    Date
    From: Tony Lindgren <tony@atomide.com>

    [ Upstream commit 294a3317bef52b189139c813b50dd14d344fa9ec ]

    Based on more testing, commit 8ca5ee624b4c ("ARM: OMAP2+: Restore MPU
    power domain if cpu_cluster_pm_enter() fails") is a poor fix for handling
    cpu_cluster_pm_enter() returned errors.

    We should not override the cpuidle states with a hardcoded PWRDM_POWER_ON
    value. Instead, we should use a configured idle state that does not cause
    the context to be lost. Otherwise we end up configuring a potentially
    improper state for the MPUSS. We also want to update the returned state
    index for the selected state.

    Let's just select the highest power idle state C1 to ensure no context
    loss is allowed on cpu_cluster_pm_enter() errors. With these changes we
    can now unconditionally call omap4_enter_lowpower() for WFI like we did
    earlier before commit 55be2f50336f ("ARM: OMAP2+: Handle errors for
    cpu_pm"). And we can return the selected state index.

    Fixes: 8f04aea048d5 ("ARM: OMAP2+: Restore MPU power domain if cpu_cluster_pm_enter() fails")
    Fixes: 55be2f50336f ("ARM: OMAP2+: Handle errors for cpu_pm")
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/mach-omap2/cpuidle44xx.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
    index a92d277f81a08..c8d317fafe2ea 100644
    --- a/arch/arm/mach-omap2/cpuidle44xx.c
    +++ b/arch/arm/mach-omap2/cpuidle44xx.c
    @@ -175,8 +175,11 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
    if (mpuss_can_lose_context) {
    error = cpu_cluster_pm_enter();
    if (error) {
    - omap_set_pwrdm_state(mpu_pd, PWRDM_POWER_ON);
    - goto cpu_cluster_pm_out;
    + index = 0;
    + cx = state_ptr + index;
    + pwrdm_set_logic_retst(mpu_pd, cx->mpu_logic_state);
    + omap_set_pwrdm_state(mpu_pd, cx->mpu_state);
    + mpuss_can_lose_context = 0;
    }
    }
    }
    @@ -184,7 +187,6 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
    omap4_enter_lowpower(dev->cpu, cx->cpu_state);
    cpu_done[dev->cpu] = true;

    -cpu_cluster_pm_out:
    /* Wakeup CPU1 only if it is not offlined */
    if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-01 10:41    [W:4.764 / U:0.712 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site