Commit 7217cee3 authored by Yaxing Guo's avatar Yaxing Guo Committed by Joerg Roedel
Browse files

iommu/riscv: Skip IRQ count check when using MSI interrupts



In RISC-V IOMMU platform devices that use MSI interrupts (indicated by the
presence of 'msi-parent' in the device tree), there are no wired interrupt
lines, so calling platform_get_irq_count() returns 0 or -ENXIO, causing the
driver to fail during probe.

However, MSI interrupts are allocated dynamically via the MSI subsystem and
do not appear in the device tree 'interrupts' property. Therefore, the
driver should not require a non-zero IRQ count when 'msi-parent' is present.

This patch fixes the bug where probe fails when using MSI interrupts
 (which do not have an 'interrupts' property in the device tree)..

Fixes: <d5f88acd> ("iommu/riscv: Add support for platform msi")

Signed-off-by: default avatarYaxing Guo <guoyaxing@bosc.ac.cn>
Reviewed-by: default avatarAndrew Jones <andrew.jones@oss.qualcomm.com>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent f5c262b5
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -68,11 +68,6 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev)
	iommu->caps = riscv_iommu_readq(iommu, RISCV_IOMMU_REG_CAPABILITIES);
	iommu->fctl = riscv_iommu_readl(iommu, RISCV_IOMMU_REG_FCTL);

	iommu->irqs_count = platform_irq_count(pdev);
	if (iommu->irqs_count <= 0)
		return dev_err_probe(dev, -ENODEV,
				     "no IRQ resources provided\n");
	if (iommu->irqs_count > RISCV_IOMMU_INTR_COUNT)
	iommu->irqs_count = RISCV_IOMMU_INTR_COUNT;

	igs = FIELD_GET(RISCV_IOMMU_CAPABILITIES_IGS, iommu->caps);
@@ -120,6 +115,13 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev)
		fallthrough;

	case RISCV_IOMMU_CAPABILITIES_IGS_WSI:
		iommu->irqs_count = platform_irq_count(pdev);
		if (iommu->irqs_count <= 0)
			return dev_err_probe(dev, -ENODEV,
					     "no IRQ resources provided\n");
		if (iommu->irqs_count > RISCV_IOMMU_INTR_COUNT)
			iommu->irqs_count = RISCV_IOMMU_INTR_COUNT;

		for (vec = 0; vec < iommu->irqs_count; vec++)
			iommu->irqs[vec] = platform_get_irq(pdev, vec);