[tip: irq/urgent] irqchip/gic-v5: Disable IRSes on probe failures
From: tip-bot2 for Lorenzo Pieralisi
Date: Thu Aug 20 2026 - 04:27:42 EST
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: 79b115c2a29204cb7e836b0df0b8c466be4b2250
Gitweb: https://git.kernel.org/tip/79b115c2a29204cb7e836b0df0b8c466be4b2250
Author: Lorenzo Pieralisi <lpieralisi@xxxxxxxxxx>
AuthorDate: Wed, 12 Aug 2026 11:10:31 +02:00
Committer: Thomas Gleixner <tglx@xxxxxxxxxx>
CommitterDate: Thu, 20 Aug 2026 10:23:53 +02:00
irqchip/gic-v5: Disable IRSes on probe failures
GICv5 driver probe failures cause IRSes initialized by the kernel to be
unmapped and their data structures to be destroyed but the current driver
leaves the probed IRSes enabled, whereas they should be disabled.
Disable IRSes on driver probe failures so that the IRSes are brought back
to their quiescent HW state.
Fixes: 5cb1b6dab2de ("irqchip/gic-v5: Add GICv5 IRS/SPI support")
Fixes: 35866efa52fe ("irqchip/gic-v5: Add ACPI IRS probing")
Signed-off-by: Lorenzo Pieralisi <lpieralisi@xxxxxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxx>
Link: https://sashiko.dev/#/message/20260810104747.E5CE71F000E9%40smtp.kernel.org
Link: https://patch.msgid.link/20260812-gicv5-7-2-fixes-v1-3-3743e82c69a4@xxxxxxxxxx
---
drivers/irqchip/irq-gic-v5-irs.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/irqchip/irq-gic-v5-irs.c b/drivers/irqchip/irq-gic-v5-irs.c
index 0bd9ae9..9d25ce8 100644
--- a/drivers/irqchip/irq-gic-v5-irs.c
+++ b/drivers/irqchip/irq-gic-v5-irs.c
@@ -488,6 +488,12 @@ static int gicv5_irs_wait_for_idle(struct gicv5_irs_chip_data *irs_data)
GICV5_IRS_CR0_IDLE, NULL);
}
+static void __init gicv5_irs_disable(struct gicv5_irs_chip_data *irs_data)
+{
+ irs_writel_relaxed(irs_data, 0, GICV5_IRS_CR0);
+ gicv5_irs_wait_for_idle(irs_data);
+}
+
void gicv5_irs_syncr(void)
{
struct gicv5_irs_chip_data *irs_data;
@@ -786,6 +792,7 @@ static int __init gicv5_irs_of_init(struct device_node *node)
out_iomem:
gicv5_irs_clear_affinity(irs_data);
+ gicv5_irs_disable(irs_data);
iounmap(irs_base);
out_err:
kfree(irs_data);
@@ -801,6 +808,7 @@ void __init gicv5_irs_remove(void)
list_for_each_entry_safe(irs_data, tmp_data, &irs_nodes, entry) {
gicv5_irs_clear_affinity(irs_data);
+ gicv5_irs_disable(irs_data);
iounmap(irs_data->irs_base);
list_del(&irs_data->entry);
kfree(irs_data);
@@ -968,6 +976,7 @@ static int __init gic_acpi_parse_madt_irs(union acpi_subtable_headers *header,
out_map:
gicv5_irs_clear_affinity(irs_data);
+ gicv5_irs_disable(irs_data);
iounmap(irs_base);
out_release:
release_mem_region(r->start, resource_size(r));