[PATCH v2] Revert "ARM: OMAP3: PM: call pre/post transition per powerdomain"

Grazvydas Ignotas notasas at gmail.com
Wed Aug 8 06:56:33 EDT 2012


On Wed, Aug 8, 2012 at 1:47 AM, Kevin Hilman <khilman at ti.com> wrote:
> This reverts commit 58f0829b7186150318c79515f0e0850c5e7a9c89.
>
> Converstion to per-pwrdm per/post transition calls was a bit
> premature.  Only tracking MPU, PER & CORE in the idle path means we
> lose the accounting for all the other powerdomains which may also
> transition in idle.  On OMAP3, due to autodeps, several powerdomains
> transition along with MPU (e.g. DSS, USBHOST), and the accounting for
> these was lost with this patch.  Since the accounting includes the
> context loss counters, drivers for devices in those power domains
> would never notice context lost, so would likely hang after any
> off-mode transitions.

That's a shame, pwrdm_pre_transition/pwrdm_post_transition are the
main contributors to idle latency and cause large performance loss on
small and frequent loads, like short DMAs. Could we perhaps only do it
when PM_DEBUG is on or when off transitions happen instead?

> This patch should be revisited when the upcoming clkdm/pwrmdm/voltdm
> use-counting seires is merged since then we can properly do accounting
> without relying on a call in the idle path.

So all hope of getting rid of those pre/post transition calls goes here then?
Small typo with 'seires'..

> In addition, the original patch had another bug because the PER
> powerdomain accounting was not updated until after the GPIO resume
> hook is called.  Since gpio_resume_after_idle() checks the context
> loss count (which is not yet updated) it would not properly restore
> context, leaving the GPIO banks in an undefined state.
>
> Cc: Jean Pihet <jean.pihet at newoldbits.com>
> Cc: Tero Kristo <t-kristo at ti.com>
> Cc: Rajendra Nayak <rnayak at ti.com>
> Reported-by: Paul Walmsley <paul at pwsan.com>
> Signed-off-by: Kevin Hilman <khilman at ti.com>
> ---
>  arch/arm/mach-omap2/pm34xx.c |   19 ++++---------------
>  1 file changed, 4 insertions(+), 15 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index e4fc88c..05bd8f0 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -272,21 +272,16 @@ void omap_sram_idle(void)
>         per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
>         core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
>
> -       if (mpu_next_state < PWRDM_POWER_ON) {
> -               pwrdm_pre_transition(mpu_pwrdm);
> -               pwrdm_pre_transition(neon_pwrdm);
> -       }
> +       pwrdm_pre_transition(NULL);
>
>         /* PER */
>         if (per_next_state < PWRDM_POWER_ON) {
> -               pwrdm_pre_transition(per_pwrdm);
>                 per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
>                 omap2_gpio_prepare_for_idle(per_going_off);
>         }
>
>         /* CORE */
>         if (core_next_state < PWRDM_POWER_ON) {
> -               pwrdm_pre_transition(core_pwrdm);
>                 if (core_next_state == PWRDM_POWER_OFF) {
>                         omap3_core_save_context();
>                         omap3_cm_save_context();
> @@ -339,20 +334,14 @@ void omap_sram_idle(void)
>                         omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK,
>                                                OMAP3430_GR_MOD,
>                                                OMAP3_PRM_VOLTCTRL_OFFSET);
> -               pwrdm_post_transition(core_pwrdm);
>         }
>         omap3_intc_resume_idle();
>
> +       pwrdm_post_transition(NULL);
> +
>         /* PER */
> -       if (per_next_state < PWRDM_POWER_ON) {
> +       if (per_next_state < PWRDM_POWER_ON)
>                 omap2_gpio_resume_after_idle();
> -               pwrdm_post_transition(per_pwrdm);
> -       }
> -
> -       if (mpu_next_state < PWRDM_POWER_ON) {
> -               pwrdm_post_transition(mpu_pwrdm);
> -               pwrdm_post_transition(neon_pwrdm);
> -       }
>  }
>
>  static void omap3_pm_idle(void)
> --
> 1.7.9.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Gražvydas



More information about the linux-arm-kernel mailing list