Commit fa20b176 authored by Agustin Vega-Frias's avatar Agustin Vega-Frias Committed by Marc Zyngier

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: default avatarRafael J. Wysocki <rafael@kernel.org>
Acked-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
Tested-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: default avatarAgustin Vega-Frias <agustinv@codeaurora.org>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 566cf877
...@@ -43,6 +43,19 @@ static inline bool ...@@ -43,6 +43,19 @@ static inline bool
acpi_iospace_resource_valid(struct resource *res) { return true; } acpi_iospace_resource_valid(struct resource *res) { return true; }
#endif #endif
#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)
static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
{
return ext_irq->resource_source.string_length == 0 &&
ext_irq->producer_consumer == ACPI_CONSUMER;
}
#else
static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
{
return true;
}
#endif
static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io) static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io)
{ {
u64 reslen = end - start + 1; u64 reslen = end - start + 1;
...@@ -470,9 +483,12 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index, ...@@ -470,9 +483,12 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
acpi_dev_irqresource_disabled(res, 0); acpi_dev_irqresource_disabled(res, 0);
return false; return false;
} }
acpi_dev_get_irqresource(res, ext_irq->interrupts[index], if (is_gsi(ext_irq))
acpi_dev_get_irqresource(res, ext_irq->interrupts[index],
ext_irq->triggering, ext_irq->polarity, ext_irq->triggering, ext_irq->polarity,
ext_irq->sharable, false); ext_irq->sharable, false);
else
acpi_dev_irqresource_disabled(res, 0);
break; break;
default: default:
res->flags = 0; res->flags = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment