2015-05-09 20:07:04

by Lucas Stach

[permalink] [raw]
Subject: [PATCH] irqchip: tegra: fix wrong data being passed as the irqdomain chip data

The irq chip functions use the irq chipdata directly as the base register
address of the controller, so this should be passed in instead of a pointer
to the array address holding the base address.

This fixes Tegra20 CPUidle as now the un-/masking of IRQs at the LIC level
works again, but more importantly it fixes the resulting memory corruption.

Signed-off-by: Lucas Stach <[email protected]>
---
This is an important fix and should go into 4.1.
---
drivers/irqchip/irq-tegra.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
index 51c485d..f67bbd8 100644
--- a/drivers/irqchip/irq-tegra.c
+++ b/drivers/irqchip/irq-tegra.c
@@ -264,7 +264,7 @@ static int tegra_ictlr_domain_alloc(struct irq_domain *domain,

irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i,
&tegra_ictlr_chip,
- &info->base[ictlr]);
+ info->base[ictlr]);
}

parent_args = *args;
--
2.1.0


Subject: [tip:irq/urgent] irqchip: tegra: Set the proper base address in irq chip data

Commit-ID: 9cf82e72ec449b4516843377ac7a20abe300c64f
Gitweb: http://git.kernel.org/tip/9cf82e72ec449b4516843377ac7a20abe300c64f
Author: Lucas Stach <[email protected]>
AuthorDate: Sat, 9 May 2015 22:06:54 +0200
Committer: Thomas Gleixner <[email protected]>
CommitDate: Wed, 13 May 2015 10:46:07 +0200

irqchip: tegra: Set the proper base address in irq chip data

The irq chip functions use the irq chipdata directly as the base register
address of the controller, so this should be passed in instead of a pointer
to the array address holding the base address.

This fixes Tegra20 CPUidle as now the un-/masking of IRQs at the LIC level
works again, but more importantly it fixes the resulting memory corruption.

Fixes: de3ce0804916 ' irqchip: tegra: Add DT-based support for legacy interrupt controller'
Signed-off-by: Lucas Stach <[email protected]>
Cc: Stephen Warren <[email protected]>
Cc: Thierry Reding <[email protected]>
Cc: Alexandre Courbot <[email protected]>
Cc: Jason Cooper <[email protected]>
Cc: Marc Zyngier <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Thomas Gleixner <[email protected]>
---
drivers/irqchip/irq-tegra.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
index 51c485d..f67bbd8 100644
--- a/drivers/irqchip/irq-tegra.c
+++ b/drivers/irqchip/irq-tegra.c
@@ -264,7 +264,7 @@ static int tegra_ictlr_domain_alloc(struct irq_domain *domain,

irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i,
&tegra_ictlr_chip,
- &info->base[ictlr]);
+ info->base[ictlr]);
}

parent_args = *args;

2015-05-13 09:35:20

by Thierry Reding

[permalink] [raw]
Subject: Re: [PATCH] irqchip: tegra: fix wrong data being passed as the irqdomain chip data

On Sat, May 09, 2015 at 10:06:54PM +0200, Lucas Stach wrote:
> The irq chip functions use the irq chipdata directly as the base register
> address of the controller, so this should be passed in instead of a pointer
> to the array address holding the base address.
>
> This fixes Tegra20 CPUidle as now the un-/masking of IRQs at the LIC level
> works again, but more importantly it fixes the resulting memory corruption.
>
> Signed-off-by: Lucas Stach <[email protected]>
> ---
> This is an important fix and should go into 4.1.
> ---
> drivers/irqchip/irq-tegra.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)

This does indeed fix a boot regression on Tegra20. Unfortunately this is
not exposed on any platform that uses PCIe because PCIe needs to disable
the CPUidle LP2 state as a workaround for a hardware bug. However, I was
able to reproduce the regression on TrimSlice by disabling PCIe, hence
keeping CPUidle LP2 activated. I reproduced with v4.1-rc3 and applying
this patch on top restores functionality.

Thanks for tracking this down Lucas.

I just noticed that Thomas already applied this while I was testing it,
but here goes anyway:

Tested-by: Thierry Reding <[email protected]>
Acked-by: Thierry Reding <[email protected]>


Attachments:
(No filename) (1.22 kB)
(No filename) (819.00 B)
Download all attachments

2015-05-13 22:18:17

by Stephen Warren

[permalink] [raw]
Subject: Re: [PATCH] irqchip: tegra: fix wrong data being passed as the irqdomain chip data

On 05/09/2015 02:06 PM, Lucas Stach wrote:
> The irq chip functions use the irq chipdata directly as the base register
> address of the controller, so this should be passed in instead of a pointer
> to the array address holding the base address.
>
> This fixes Tegra20 CPUidle as now the un-/masking of IRQs at the LIC level
> works again, but more importantly it fixes the resulting memory corruption.

Tested-by: Stephen Warren <[email protected]>

Tested on NVIDIA Seaboard (which is affected by the bug in the default
configuration/DT) with the patch applied on to of 4.1-rc3.