Commit b0c3bc35 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'irq-urgent-2025-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull misc irq fixes from Ingo Molnar:

 - Fix BCM2712 irqchip driver Kconfig dependencies required on the
   Raspberry PI5

 - Fix spurious interrupts on RZ/G3E SMARC EVK systems

 - Fix crash regression on Sun/NIU hardware

 - Apply MSI driver quirk for Sun Neptune chips

* tag 'irq-urgent-2025-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/irq-bcm2712-mip: Enable driver when ARCH_BCM2835 is enabled
  irqchip/renesas-rzv2h: Prevent TINT spurious interrupt
  net/niu: Niu requires MSIX ENTRY_DATA fields touch before entry reads
  PCI/MSI: Add an option to write MSIX ENTRY_DATA before any reads
parents 84aca3ca 9b3ae50c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -114,8 +114,8 @@ config I8259

config BCM2712_MIP
	tristate "Broadcom BCM2712 MSI-X Interrupt Peripheral support"
	depends on ARCH_BRCMSTB || COMPILE_TEST
	default m if ARCH_BRCMSTB
	depends on ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST
	default m if ARCH_BRCMSTB || ARCH_BCM2835
	depends on ARM_GIC
	select GENERIC_IRQ_CHIP
	select IRQ_DOMAIN_HIERARCHY
+8 −0
Original line number Diff line number Diff line
@@ -170,6 +170,14 @@ static void rzv2h_tint_irq_endisable(struct irq_data *d, bool enable)
	else
		tssr &= ~ICU_TSSR_TIEN(tssel_n, priv->info->field_width);
	writel_relaxed(tssr, priv->base + priv->info->t_offs + ICU_TSSR(k));

	/*
	 * A glitch in the edge detection circuit can cause a spurious
	 * interrupt. Clear the status flag after setting the ICU_TSSRk
	 * registers, which is recommended by the hardware manual as a
	 * countermeasure.
	 */
	writel_relaxed(BIT(tint_nr), priv->base + priv->info->t_offs + ICU_TSCLR);
}

static void rzv2h_icu_irq_disable(struct irq_data *d)
+2 −0
Original line number Diff line number Diff line
@@ -9064,6 +9064,8 @@ static void niu_try_msix(struct niu *np, u8 *ldg_num_map)
		msi_vec[i].entry = i;
	}

	pdev->dev_flags |= PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST;

	num_irqs = pci_enable_msix_range(pdev, msi_vec, 1, num_irqs);
	if (num_irqs < 0) {
		np->flags &= ~NIU_FLAGS_MSIX;
+3 −0
Original line number Diff line number Diff line
@@ -615,6 +615,9 @@ void msix_prepare_msi_desc(struct pci_dev *dev, struct msi_desc *desc)
		void __iomem *addr = pci_msix_desc_addr(desc);

		desc->pci.msi_attrib.can_mask = 1;
		/* Workaround for SUN NIU insanity, which requires write before read */
		if (dev->dev_flags & PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST)
			writel(0, addr + PCI_MSIX_ENTRY_DATA);
		desc->pci.msix_ctrl = readl(addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -245,6 +245,8 @@ enum pci_dev_flags {
	PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
	/* Device does honor MSI masking despite saying otherwise */
	PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12),
	/* Device requires write to PCI_MSIX_ENTRY_DATA before any MSIX reads */
	PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST = (__force pci_dev_flags_t) (1 << 13),
};

enum pci_irq_reroute_variant {