| From 544808f7e21cb9ccdb8f3aa7de594c05b1419061 Mon Sep 17 00:00:00 2001 |
| From: Andre Przywara <andre.przywara@arm.com> |
| Date: Mon, 4 Apr 2022 12:08:42 +0100 |
| Subject: irqchip/gic, gic-v3: Prevent GSI to SGI translations |
| |
| From: Andre Przywara <andre.przywara@arm.com> |
| |
| commit 544808f7e21cb9ccdb8f3aa7de594c05b1419061 upstream. |
| |
| At the moment the GIC IRQ domain translation routine happily converts |
| ACPI table GSI numbers below 16 to GIC SGIs (Software Generated |
| Interrupts aka IPIs). On the Devicetree side we explicitly forbid this |
| translation, actually the function will never return HWIRQs below 16 when |
| using a DT based domain translation. |
| |
| We expect SGIs to be handled in the first part of the function, and any |
| further occurrence should be treated as a firmware bug, so add a check |
| and print to report this explicitly and avoid lengthy debug sessions. |
| |
| Fixes: 64b499d8df40 ("irqchip/gic-v3: Configure SGIs as standard interrupts") |
| Signed-off-by: Andre Przywara <andre.przywara@arm.com> |
| Signed-off-by: Marc Zyngier <maz@kernel.org> |
| Link: https://lore.kernel.org/r/20220404110842.2882446-1-andre.przywara@arm.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/irqchip/irq-gic-v3.c | 6 ++++++ |
| drivers/irqchip/irq-gic.c | 6 ++++++ |
| 2 files changed, 12 insertions(+) |
| |
| --- a/drivers/irqchip/irq-gic-v3.c |
| +++ b/drivers/irqchip/irq-gic-v3.c |
| @@ -1466,6 +1466,12 @@ static int gic_irq_domain_translate(stru |
| if(fwspec->param_count != 2) |
| return -EINVAL; |
| |
| + if (fwspec->param[0] < 16) { |
| + pr_err(FW_BUG "Illegal GSI%d translation request\n", |
| + fwspec->param[0]); |
| + return -EINVAL; |
| + } |
| + |
| *hwirq = fwspec->param[0]; |
| *type = fwspec->param[1]; |
| |
| --- a/drivers/irqchip/irq-gic.c |
| +++ b/drivers/irqchip/irq-gic.c |
| @@ -1085,6 +1085,12 @@ static int gic_irq_domain_translate(stru |
| if(fwspec->param_count != 2) |
| return -EINVAL; |
| |
| + if (fwspec->param[0] < 16) { |
| + pr_err(FW_BUG "Illegal GSI%d translation request\n", |
| + fwspec->param[0]); |
| + return -EINVAL; |
| + } |
| + |
| *hwirq = fwspec->param[0]; |
| *type = fwspec->param[1]; |
| |