diff mbox

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

Message ID 1344379659-26152-1-git-send-email-khilman@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kevin Hilman Aug. 7, 2012, 10:47 p.m. UTC
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.

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.

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@newoldbits.com>
Cc: Tero Kristo <t-kristo@ti.com>
Cc: Rajendra Nayak <rnayak@ti.com>
Reported-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
 arch/arm/mach-omap2/pm34xx.c |   19 ++++---------------
 1 file changed, 4 insertions(+), 15 deletions(-)

Comments

Grazvydas Ignotas Aug. 8, 2012, 10:56 a.m. UTC | #1
On Wed, Aug 8, 2012 at 1:47 AM, Kevin Hilman <khilman@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@newoldbits.com>
> Cc: Tero Kristo <t-kristo@ti.com>
> Cc: Rajendra Nayak <rnayak@ti.com>
> Reported-by: Paul Walmsley <paul@pwsan.com>
> Signed-off-by: Kevin Hilman <khilman@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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kevin Hilman Aug. 8, 2012, 5:06 p.m. UTC | #2
Grazvydas Ignotas <notasas@gmail.com> writes:

> On Wed, Aug 8, 2012 at 1:47 AM, Kevin Hilman <khilman@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?

Unfortunately, that's also where we're currently doing the accounting 
for when power domains lose context.  Drivers rely on this to determine
whether or not to restore context, so it's not a debug only feature.

>> 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'..

Yes.  The goal of the use-counting series is so that proper accounting
can be done when the usecount changes so that not all of them have to be
done in the idle path.

Kevin

>> 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@newoldbits.com>
>> Cc: Tero Kristo <t-kristo@ti.com>
>> Cc: Rajendra Nayak <rnayak@ti.com>
>> Reported-by: Paul Walmsley <paul@pwsan.com>
>> Signed-off-by: Kevin Hilman <khilman@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@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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)