linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ARM: OMAP4+: PM: Program CPU logic power state
@ 2014-10-21 20:24 Nishanth Menon
  2014-10-24 18:03 ` Kevin Hilman
  0 siblings, 1 reply; 3+ messages in thread
From: Nishanth Menon @ 2014-10-21 20:24 UTC (permalink / raw)
  To: linux-arm-kernel

CPU logic power state is never programmed in either the initialization
or the suspend/resume logic, instead, we depend on mpuss to program this
properly. However, this leaves CPU logic power state indeterminate and
most probably in reset configuration (If bootloader or other similar
software have'nt monkeyed with the register). This can make powerstate=
RET be either programmed for CSWR (logic=ret) or OSWR(logic = OFF) and
in OSWR, there can be context loss when the code does not expect it.

To prevent all these confusions, just support clearly ON, INA, CSWR,
OFF which is the intent of the existing code by explicitly programming
logic state.

NOTE: since this is a hot path (using in cpuidle), the exit path just
programs powerstate (logic state is immaterial when powerstate is ON).

Without doing this, we end up with lockups when CPUs enter OSWR and
multiple blocks loose context, when we expect them to hit CSWR.

Signed-off-by: Nishanth Menon <nm@ti.com>
---
 arch/arm/mach-omap2/omap-mpuss-lowpower.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
index 6944ae3..79f49d9 100644
--- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c
+++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
@@ -227,7 +227,7 @@ static void __init save_l2x0_context(void)
 int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
 {
 	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu);
-	unsigned int save_state = 0;
+	unsigned int save_state = 0, cpu_logic_state = PWRDM_POWER_RET;
 	unsigned int wakeup_cpu;
 
 	if (omap_rev() == OMAP4430_REV_ES1_0)
@@ -239,6 +239,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
 		save_state = 0;
 		break;
 	case PWRDM_POWER_OFF:
+		cpu_logic_state = PWRDM_POWER_OFF;
 		save_state = 1;
 		break;
 	case PWRDM_POWER_RET:
@@ -270,6 +271,7 @@ 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);
 	set_cpu_wakeup_addr(cpu, virt_to_phys(omap_pm_ops.resume));
 	omap_pm_ops.scu_prepare(cpu, power_state);
 	l2x0_pwrst_prepare(cpu, save_state);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH] ARM: OMAP4+: PM: Program CPU logic power state
  2014-10-21 20:24 [PATCH] ARM: OMAP4+: PM: Program CPU logic power state Nishanth Menon
@ 2014-10-24 18:03 ` Kevin Hilman
  2014-11-11  0:03   ` Tony Lindgren
  0 siblings, 1 reply; 3+ messages in thread
From: Kevin Hilman @ 2014-10-24 18:03 UTC (permalink / raw)
  To: linux-arm-kernel

Nishanth Menon <nm@ti.com> writes:

> CPU logic power state is never programmed in either the initialization
> or the suspend/resume logic, instead, we depend on mpuss to program this
> properly. However, this leaves CPU logic power state indeterminate and
> most probably in reset configuration (If bootloader or other similar
> software have'nt monkeyed with the register). This can make powerstate=
> RET be either programmed for CSWR (logic=ret) or OSWR(logic = OFF) and
> in OSWR, there can be context loss when the code does not expect it.
>
> To prevent all these confusions, just support clearly ON, INA, CSWR,
> OFF which is the intent of the existing code by explicitly programming
> logic state.
>
> NOTE: since this is a hot path (using in cpuidle), the exit path just
> programs powerstate (logic state is immaterial when powerstate is ON).
>
> Without doing this, we end up with lockups when CPUs enter OSWR and
> multiple blocks loose context, when we expect them to hit CSWR.
>
> Signed-off-by: Nishanth Menon <nm@ti.com>

Acked-by: Kevin Hilman <khilman@linaro.org>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] ARM: OMAP4+: PM: Program CPU logic power state
  2014-10-24 18:03 ` Kevin Hilman
@ 2014-11-11  0:03   ` Tony Lindgren
  0 siblings, 0 replies; 3+ messages in thread
From: Tony Lindgren @ 2014-11-11  0:03 UTC (permalink / raw)
  To: linux-arm-kernel

* Kevin Hilman <khilman@kernel.org> [141024 11:04]:
> Nishanth Menon <nm@ti.com> writes:
> 
> > CPU logic power state is never programmed in either the initialization
> > or the suspend/resume logic, instead, we depend on mpuss to program this
> > properly. However, this leaves CPU logic power state indeterminate and
> > most probably in reset configuration (If bootloader or other similar
> > software have'nt monkeyed with the register). This can make powerstate=
> > RET be either programmed for CSWR (logic=ret) or OSWR(logic = OFF) and
> > in OSWR, there can be context loss when the code does not expect it.
> >
> > To prevent all these confusions, just support clearly ON, INA, CSWR,
> > OFF which is the intent of the existing code by explicitly programming
> > logic state.
> >
> > NOTE: since this is a hot path (using in cpuidle), the exit path just
> > programs powerstate (logic state is immaterial when powerstate is ON).
> >
> > Without doing this, we end up with lockups when CPUs enter OSWR and
> > multiple blocks loose context, when we expect them to hit CSWR.
> >
> > Signed-off-by: Nishanth Menon <nm@ti.com>
> 
> Acked-by: Kevin Hilman <khilman@linaro.org>

Applying into omap-for-v3.19/soc thanks.

Tony

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-11-11  0:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-21 20:24 [PATCH] ARM: OMAP4+: PM: Program CPU logic power state Nishanth Menon
2014-10-24 18:03 ` Kevin Hilman
2014-11-11  0:03   ` Tony Lindgren

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).