Hello,
This small series addresses two suspend-resume bugs: one affects Tegra30+
due to a typo in the code, other fixes CPU hang on Tegra30 specifically.
Please review and apply, thanks!
Dmitry Osipenko (2):
ARM: tegra: Fix FLOW_CTLR_HALT register clobbering by tegra_resume()
ARM: tegra: Use WFE for power-gating on Tegra30
arch/arm/mach-tegra/reset-handler.S | 6 +++---
arch/arm/mach-tegra/sleep-tegra30.S | 4 +++-
drivers/soc/tegra/flowctrl.c | 19 +++++++++++++++++--
3 files changed, 23 insertions(+), 6 deletions(-)
--
2.22.0
Turned out that WFI doesn't work reliably on Tegra30 as a trigger for
the power-gating, it causes CPU hang under some circumstances like having
memory controller running of PLLP. The TRM doc states that WFI should be
used for the Big-Little "Cluster Switch", while WFE for the power-gating.
Hence let's use the WFE for CPU0 power-gating, like it is done for the
power-gating of a secondary cores. This fixes CPU hang after entering LP2
with memory running off PLLP.
Signed-off-by: Dmitry Osipenko <[email protected]>
---
arch/arm/mach-tegra/sleep-tegra30.S | 4 +++-
drivers/soc/tegra/flowctrl.c | 19 +++++++++++++++++--
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-tegra/sleep-tegra30.S b/arch/arm/mach-tegra/sleep-tegra30.S
index e95e46d65e8c..2e42f2bc0630 100644
--- a/arch/arm/mach-tegra/sleep-tegra30.S
+++ b/arch/arm/mach-tegra/sleep-tegra30.S
@@ -683,10 +683,12 @@ tegra30_enter_sleep:
dsb
ldr r0, [r6, r2] /* memory barrier */
+ cmp r10, #TEGRA30
halted:
isb
dsb
- wfi /* CPU should be power gated here */
+ wfine /* CPU should be power gated here */
+ wfeeq
/* !!!FIXME!!! Implement halt failure handler */
b halted
diff --git a/drivers/soc/tegra/flowctrl.c b/drivers/soc/tegra/flowctrl.c
index b6bdeef33db1..b62ff4c1b997 100644
--- a/drivers/soc/tegra/flowctrl.c
+++ b/drivers/soc/tegra/flowctrl.c
@@ -91,8 +91,23 @@ void flowctrl_cpu_suspend_enter(unsigned int cpuid)
reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
/* clear wfi bitmap */
reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;
- /* pwr gating on wfi */
- reg |= TEGRA30_FLOW_CTRL_CSR_WFI_CPU0 << cpuid;
+
+ if (tegra_get_chip_id() == TEGRA30) {
+ /*
+ * The wfi doesn't work well on Tegra30 because
+ * CPU hangs under some odd circumstances after
+ * power-gating (like memory running off PLLP),
+ * hence use wfe that is working perfectly well.
+ * Note that Tegra30 TRM doc clearly stands that
+ * wfi should be used for "Cluster Switching",
+ * while wfe for the power-gating just like it is
+ * done on Tegra20.
+ */
+ reg |= TEGRA20_FLOW_CTRL_CSR_WFE_CPU0 << cpuid;
+ } else {
+ /* pwr gating on wfi */
+ reg |= TEGRA30_FLOW_CTRL_CSR_WFI_CPU0 << cpuid;
+ }
break;
}
reg |= FLOW_CTRL_CSR_INTR_FLAG; /* clear intr flag */
--
2.22.0
08.07.2019 2:03, Dmitry Osipenko пишет:
> Hello,
>
> This small series addresses two suspend-resume bugs: one affects Tegra30+
> due to a typo in the code, other fixes CPU hang on Tegra30 specifically.
>
> Please review and apply, thanks!
>
> Dmitry Osipenko (2):
> ARM: tegra: Fix FLOW_CTLR_HALT register clobbering by tegra_resume()
> ARM: tegra: Use WFE for power-gating on Tegra30
>
> arch/arm/mach-tegra/reset-handler.S | 6 +++---
> arch/arm/mach-tegra/sleep-tegra30.S | 4 +++-
> drivers/soc/tegra/flowctrl.c | 19 +++++++++++++++++--
> 3 files changed, 23 insertions(+), 6 deletions(-)
>
Hello Peter,
We were talking about these fixes on the IRC not so long time ago, does
it look good to you? Care to give an ACK?
On Tue, Jul 23, 2019 at 04:28:35AM +0300, Dmitry Osipenko wrote:
> 08.07.2019 2:03, Dmitry Osipenko пишет:
> > Hello,
> >
> > This small series addresses two suspend-resume bugs: one affects Tegra30+
> > due to a typo in the code, other fixes CPU hang on Tegra30 specifically.
> >
> > Please review and apply, thanks!
> >
> > Dmitry Osipenko (2):
> > ARM: tegra: Fix FLOW_CTLR_HALT register clobbering by tegra_resume()
> > ARM: tegra: Use WFE for power-gating on Tegra30
> >
> > arch/arm/mach-tegra/reset-handler.S | 6 +++---
> > arch/arm/mach-tegra/sleep-tegra30.S | 4 +++-
> > drivers/soc/tegra/flowctrl.c | 19 +++++++++++++++++--
> > 3 files changed, 23 insertions(+), 6 deletions(-)
> >
>
> Hello Peter,
>
> We were talking about these fixes on the IRC not so long time ago, does
> it look good to you? Care to give an ACK?
Acked-By Peter De Schrijver <[email protected]>
25.07.2019 12:40, Peter De Schrijver пишет:
> On Tue, Jul 23, 2019 at 04:28:35AM +0300, Dmitry Osipenko wrote:
>> 08.07.2019 2:03, Dmitry Osipenko пишет:
>>> Hello,
>>>
>>> This small series addresses two suspend-resume bugs: one affects Tegra30+
>>> due to a typo in the code, other fixes CPU hang on Tegra30 specifically.
>>>
>>> Please review and apply, thanks!
>>>
>>> Dmitry Osipenko (2):
>>> ARM: tegra: Fix FLOW_CTLR_HALT register clobbering by tegra_resume()
>>> ARM: tegra: Use WFE for power-gating on Tegra30
>>>
>>> arch/arm/mach-tegra/reset-handler.S | 6 +++---
>>> arch/arm/mach-tegra/sleep-tegra30.S | 4 +++-
>>> drivers/soc/tegra/flowctrl.c | 19 +++++++++++++++++--
>>> 3 files changed, 23 insertions(+), 6 deletions(-)
>>>
>>
>> Hello Peter,
>>
>> We were talking about these fixes on the IRC not so long time ago, does
>> it look good to you? Care to give an ACK?
>
> Acked-By Peter De Schrijver <[email protected]>
>
Thanks!