sparc32, leon: Enable interrupts before going idle to avoid getting stuck

Submitted by Andreas Larsson on June 10, 2013, 6:56 a.m.

Details

Message ID 1370847401-766-1-git-send-email-andreas@gaisler.com
State Accepted
Delegated to: David Miller
Headers show

Commit Message

Andreas Larsson June 10, 2013, 6:56 a.m.
This enables interrupts for Leon before having the CPU enter power-down mode.

Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092, "sparc: Use generic idle loop",
gets the CPU stuck on idle for Leon systems. On Leon, disabling interrupts and
powering down the processor will get the processor stuck waiting for an
interrupt that will never be reacted to.

Signed-off-by: Andreas Larsson <andreas@gaisler.com>
---

I assume that going idle with interrupts disabled is the right thing to
do for the other users of the sparc_idle function pointer. Otherwise,
the right way to go is probably to enable interrupts in the 32-bit
arch_cpu_idle before calling the idle function instead.

 arch/sparc/kernel/leon_pmc.c |    7 +++++++
 1 file changed, 7 insertions(+)

Comments

Andreas Larsson June 17, 2013, 6:13 a.m.
On 2013-06-10 08:56, Andreas Larsson wrote:
> This enables interrupts for Leon before having the CPU enter power-down mode.
>
> Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092, "sparc: Use generic idle loop",
> gets the CPU stuck on idle for Leon systems. On Leon, disabling interrupts and
> powering down the processor will get the processor stuck waiting for an
> interrupt that will never be reacted to.

Anything stopping this from going into v3.10-rc7? The issue is critical. 
Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092 outright breaks the 
kernel for Leon systems.

Best Regards,
Andreas Larsson


>
> Signed-off-by: Andreas Larsson <andreas@gaisler.com>
> ---
>
> I assume that going idle with interrupts disabled is the right thing to
> do for the other users of the sparc_idle function pointer. Otherwise,
> the right way to go is probably to enable interrupts in the 32-bit
> arch_cpu_idle before calling the idle function instead.
>
>   arch/sparc/kernel/leon_pmc.c |    7 +++++++
>   1 file changed, 7 insertions(+)
>
> diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c
> index bdf53d9..b0b3967 100644
> --- a/arch/sparc/kernel/leon_pmc.c
> +++ b/arch/sparc/kernel/leon_pmc.c
> @@ -47,6 +47,10 @@ void pmc_leon_idle_fixup(void)
>   	 * MMU does not get a TLB miss here by using the MMU BYPASS ASI.
>   	 */
>   	register unsigned int address = (unsigned int)leon3_irqctrl_regs;
> +
> +	/* Interrupts need to be enabled to not hang the CPU */
> +	local_irq_enable();
> +
>   	__asm__ __volatile__ (
>   		"wr	%%g0, %%asr19\n"
>   		"lda	[%0] %1, %%g0\n"
> @@ -60,6 +64,9 @@ void pmc_leon_idle_fixup(void)
>    */
>   void pmc_leon_idle(void)
>   {
> +	/* Interrupts need to be enabled to not hang the CPU */
> +	local_irq_enable();
> +
>   	/* For systems without power-down, this will be no-op */
>   	__asm__ __volatile__ ("wr	%g0, %asr19\n\t");
>   }
>

--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller June 17, 2013, 6:53 a.m.
From: Andreas Larsson <andreas@gaisler.com>
Date: Mon, 17 Jun 2013 08:13:41 +0200

> On 2013-06-10 08:56, Andreas Larsson wrote:
>> This enables interrupts for Leon before having the CPU enter
>> power-down mode.
>>
>> Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092, "sparc: Use generic
>> idle loop",
>> gets the CPU stuck on idle for Leon systems. On Leon, disabling
>> interrupts and
>> powering down the processor will get the processor stuck waiting for
>> an
>> interrupt that will never be reacted to.
> 
> Anything stopping this from going into v3.10-rc7? The issue is
> critical. Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092 outright
> breaks the kernel for Leon systems.

I'm just backlogged, I'll take care of this tomorrow.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller June 19, 2013, 9:14 a.m.
From: Andreas Larsson <andreas@gaisler.com>
Date: Mon, 10 Jun 2013 08:56:41 +0200

> This enables interrupts for Leon before having the CPU enter power-down mode.
> 
> Commit 87fa05aeb3a5e8e21b1a5510eef6983650eff092, "sparc: Use generic idle loop",
> gets the CPU stuck on idle for Leon systems. On Leon, disabling interrupts and
> powering down the processor will get the processor stuck waiting for an
> interrupt that will never be reacted to.
> 
> Signed-off-by: Andreas Larsson <andreas@gaisler.com>

Applied.
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch hide | download patch | download mbox

diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c
index bdf53d9..b0b3967 100644
--- a/arch/sparc/kernel/leon_pmc.c
+++ b/arch/sparc/kernel/leon_pmc.c
@@ -47,6 +47,10 @@  void pmc_leon_idle_fixup(void)
 	 * MMU does not get a TLB miss here by using the MMU BYPASS ASI.
 	 */
 	register unsigned int address = (unsigned int)leon3_irqctrl_regs;
+
+	/* Interrupts need to be enabled to not hang the CPU */
+	local_irq_enable();
+
 	__asm__ __volatile__ (
 		"wr	%%g0, %%asr19\n"
 		"lda	[%0] %1, %%g0\n"
@@ -60,6 +64,9 @@  void pmc_leon_idle_fixup(void)
  */
 void pmc_leon_idle(void)
 {
+	/* Interrupts need to be enabled to not hang the CPU */
+	local_irq_enable();
+
 	/* For systems without power-down, this will be no-op */
 	__asm__ __volatile__ ("wr	%g0, %asr19\n\t");
 }