irqchip/riscv-aplic: Prevent crash when MSI domain is missing

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: ca8df97fe6 ("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
This commit is contained in:
Samuel Holland 2024-11-14 12:01:30 -08:00 committed by Thomas Gleixner
parent f9ed1f7c2e
commit 1f181d1cda
2 changed files with 5 additions and 1 deletions

View File

@ -207,7 +207,8 @@ static int aplic_probe(struct platform_device *pdev)
else else
rc = aplic_direct_setup(dev, regs); rc = aplic_direct_setup(dev, regs);
if (rc) 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 #ifdef CONFIG_ACPI
if (!acpi_disabled) if (!acpi_disabled)

View File

@ -266,6 +266,9 @@ int aplic_msi_setup(struct device *dev, void __iomem *regs)
if (msi_domain) if (msi_domain)
dev_set_msi_domain(dev, 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, if (!msi_create_device_irq_domain(dev, MSI_DEFAULT_DOMAIN, &aplic_msi_template,