diff options
| author | Samuel Holland <samuel.holland@sifive.com> | 2024-11-14 12:01:30 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-12-05 14:01:23 +0100 |
| commit | 285a07810ab3bcedc2bd380ebacbf6b4942a889a (patch) | |
| tree | d1d9007dc6b8b795d570ce55a381b07b0c794832 | |
| parent | 3fc6fc23d07dec0395b917d9d2ba364e60d988df (diff) | |
| download | linux-285a07810ab3bcedc2bd380ebacbf6b4942a889a.tar.gz linux-285a07810ab3bcedc2bd380ebacbf6b4942a889a.tar.bz2 linux-285a07810ab3bcedc2bd380ebacbf6b4942a889a.zip | |
irqchip/riscv-aplic: Prevent crash when MSI domain is missing
[ Upstream commit 1f181d1cda56c2fbe379c5ace1aa1fac6306669e ]
If the APLIC driver is probed before the IMSIC driver, the parent MSI
domain will be missing, which causes a NULL pointer dereference in
msi_create_device_irq_domain().
Avoid this by deferring probe until the parent MSI domain is available. Use
dev_err_probe() to avoid printing an error message when returning
-EPROBE_DEFER.
Fixes: ca8df97fe679 ("irqchip/riscv-aplic: Add support for MSI-mode")
Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20241114200133.3069460-1-samuel.holland@sifive.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
| -rw-r--r-- | drivers/irqchip/irq-riscv-aplic-main.c | 3 | ||||
| -rw-r--r-- | drivers/irqchip/irq-riscv-aplic-msi.c | 3 |
2 files changed, 5 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-riscv-aplic-main.c b/drivers/irqchip/irq-riscv-aplic-main.c index 900e72541db9..93e7c51f944a 100644 --- a/drivers/irqchip/irq-riscv-aplic-main.c +++ b/drivers/irqchip/irq-riscv-aplic-main.c @@ -207,7 +207,8 @@ static int aplic_probe(struct platform_device *pdev) else rc = aplic_direct_setup(dev, regs); if (rc) - dev_err(dev, "failed to setup APLIC in %s mode\n", msi_mode ? "MSI" : "direct"); + dev_err_probe(dev, rc, "failed to setup APLIC in %s mode\n", + msi_mode ? "MSI" : "direct"); #ifdef CONFIG_ACPI if (!acpi_disabled) diff --git a/drivers/irqchip/irq-riscv-aplic-msi.c b/drivers/irqchip/irq-riscv-aplic-msi.c index 945bff28265c..fb8d1838609f 100644 --- a/drivers/irqchip/irq-riscv-aplic-msi.c +++ b/drivers/irqchip/irq-riscv-aplic-msi.c @@ -266,6 +266,9 @@ int aplic_msi_setup(struct device *dev, void __iomem *regs) if (msi_domain) dev_set_msi_domain(dev, msi_domain); } + + if (!dev_get_msi_domain(dev)) + return -EPROBE_DEFER; } if (!msi_create_device_irq_domain(dev, MSI_DEFAULT_DOMAIN, &aplic_msi_template, |
