summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAgustin Vega-Frias <agustinv@codeaurora.org>2017-02-02 18:23:57 -0500
committerMarc Zyngier <marc.zyngier@arm.com>2017-02-03 10:03:40 -0500
commitfa20b176f609c813d2c677f54c814cbb7ea5f1d1 (patch)
tree270153e3ec9c6974b584e64350883ea15ed17fef
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
ACPI: Generic GSI: Do not attempt to map non-GSI IRQs during bus scan
ACPI extended IRQ resources may contain a Resource Source field to specify an alternate interrupt controller, attempting to map them as GSIs is incorrect, so just disable the platform resource. Since this field is currently ignored, we make this change conditional on CONFIG_ACPI_GENERIC_GSI to keep the current behavior on x86 platforms, in case some existing ACPI tables are using this incorrectly. Acked-by: Rafael J. Wysocki <rafael@kernel.org> Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org> Tested-by: Hanjun Guo <hanjun.guo@linaro.org> Signed-off-by: Agustin Vega-Frias <agustinv@codeaurora.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r--drivers/acpi/resource.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c
index cb57962ef7c4..8b11d6d385dc 100644
--- a/drivers/acpi/resource.c
+++ b/drivers/acpi/resource.c
@@ -43,6 +43,19 @@ static inline bool
43acpi_iospace_resource_valid(struct resource *res) { return true; } 43acpi_iospace_resource_valid(struct resource *res) { return true; }
44#endif 44#endif
45 45
46#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)
47static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
48{
49 return ext_irq->resource_source.string_length == 0 &&
50 ext_irq->producer_consumer == ACPI_CONSUMER;
51}
52#else
53static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
54{
55 return true;
56}
57#endif
58
46static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io) 59static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io)
47{ 60{
48 u64 reslen = end - start + 1; 61 u64 reslen = end - start + 1;
@@ -470,9 +483,12 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
470 acpi_dev_irqresource_disabled(res, 0); 483 acpi_dev_irqresource_disabled(res, 0);
471 return false; 484 return false;
472 } 485 }
473 acpi_dev_get_irqresource(res, ext_irq->interrupts[index], 486 if (is_gsi(ext_irq))
487 acpi_dev_get_irqresource(res, ext_irq->interrupts[index],
474 ext_irq->triggering, ext_irq->polarity, 488 ext_irq->triggering, ext_irq->polarity,
475 ext_irq->sharable, false); 489 ext_irq->sharable, false);
490 else
491 acpi_dev_irqresource_disabled(res, 0);
476 break; 492 break;
477 default: 493 default:
478 res->flags = 0; 494 res->flags = 0;