Skip to content

Commit b0c3bc3

Browse files
committed
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
2 parents 84aca3c + 9b3ae50 commit b0c3bc3

File tree

5 files changed

+17
-2
lines changed

5 files changed

+17
-2
lines changed

drivers/irqchip/Kconfig

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ config I8259
114114

115115
config BCM2712_MIP
116116
tristate "Broadcom BCM2712 MSI-X Interrupt Peripheral support"
117-
depends on ARCH_BRCMSTB || COMPILE_TEST
118-
default m if ARCH_BRCMSTB
117+
depends on ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST
118+
default m if ARCH_BRCMSTB || ARCH_BCM2835
119119
depends on ARM_GIC
120120
select GENERIC_IRQ_CHIP
121121
select IRQ_DOMAIN_HIERARCHY

drivers/irqchip/irq-renesas-rzv2h.c

+8
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ static void rzv2h_tint_irq_endisable(struct irq_data *d, bool enable)
170170
else
171171
tssr &= ~ICU_TSSR_TIEN(tssel_n, priv->info->field_width);
172172
writel_relaxed(tssr, priv->base + priv->info->t_offs + ICU_TSSR(k));
173+
174+
/*
175+
* A glitch in the edge detection circuit can cause a spurious
176+
* interrupt. Clear the status flag after setting the ICU_TSSRk
177+
* registers, which is recommended by the hardware manual as a
178+
* countermeasure.
179+
*/
180+
writel_relaxed(BIT(tint_nr), priv->base + priv->info->t_offs + ICU_TSCLR);
173181
}
174182

175183
static void rzv2h_icu_irq_disable(struct irq_data *d)

drivers/net/ethernet/sun/niu.c

+2
Original file line numberDiff line numberDiff line change
@@ -9064,6 +9064,8 @@ static void niu_try_msix(struct niu *np, u8 *ldg_num_map)
90649064
msi_vec[i].entry = i;
90659065
}
90669066

9067+
pdev->dev_flags |= PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST;
9068+
90679069
num_irqs = pci_enable_msix_range(pdev, msi_vec, 1, num_irqs);
90689070
if (num_irqs < 0) {
90699071
np->flags &= ~NIU_FLAGS_MSIX;

drivers/pci/msi/msi.c

+3
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,9 @@ void msix_prepare_msi_desc(struct pci_dev *dev, struct msi_desc *desc)
615615
void __iomem *addr = pci_msix_desc_addr(desc);
616616

617617
desc->pci.msi_attrib.can_mask = 1;
618+
/* Workaround for SUN NIU insanity, which requires write before read */
619+
if (dev->dev_flags & PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST)
620+
writel(0, addr + PCI_MSIX_ENTRY_DATA);
618621
desc->pci.msix_ctrl = readl(addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
619622
}
620623
}

include/linux/pci.h

+2
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ enum pci_dev_flags {
245245
PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
246246
/* Device does honor MSI masking despite saying otherwise */
247247
PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12),
248+
/* Device requires write to PCI_MSIX_ENTRY_DATA before any MSIX reads */
249+
PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST = (__force pci_dev_flags_t) (1 << 13),
248250
};
249251

250252
enum pci_irq_reroute_variant {

0 commit comments

Comments
 (0)