Anup Patel <apatel@xxxxxxxxxxxxxxxx> writes: > The Linux PCI framework requires it's own dedicated MSI irqdomain so > let us create PCI MSI irqdomain as child of the IMSIC base irqdomain. > > Signed-off-by: Anup Patel <apatel@xxxxxxxxxxxxxxxx> > --- > drivers/irqchip/Kconfig | 7 +++ > drivers/irqchip/irq-riscv-imsic-platform.c | 51 ++++++++++++++++++++++ > drivers/irqchip/irq-riscv-imsic-state.h | 1 + > 3 files changed, 59 insertions(+) > > diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig > index bdd80716114d..c1d69b418dfb 100644 > --- a/drivers/irqchip/Kconfig > +++ b/drivers/irqchip/Kconfig > @@ -552,6 +552,13 @@ config RISCV_IMSIC > select IRQ_DOMAIN_HIERARCHY > select GENERIC_MSI_IRQ > > +config RISCV_IMSIC_PCI > + bool > + depends on RISCV_IMSIC > + depends on PCI > + depends on PCI_MSI > + default RISCV_IMSIC > + > config EXYNOS_IRQ_COMBINER > bool "Samsung Exynos IRQ combiner support" if COMPILE_TEST > depends on (ARCH_EXYNOS && ARM) || COMPILE_TEST > diff --git a/drivers/irqchip/irq-riscv-imsic-platform.c b/drivers/irqchip/irq-riscv-imsic-platform.c > index 23d286cb017e..cdb659401199 100644 > --- a/drivers/irqchip/irq-riscv-imsic-platform.c > +++ b/drivers/irqchip/irq-riscv-imsic-platform.c > @@ -13,6 +13,7 @@ > #include <linux/irqdomain.h> > #include <linux/module.h> > #include <linux/msi.h> > +#include <linux/pci.h> > #include <linux/platform_device.h> > #include <linux/spinlock.h> > #include <linux/smp.h> > @@ -215,6 +216,42 @@ static const struct irq_domain_ops imsic_base_domain_ops = { > #endif > }; > > +#ifdef CONFIG_RISCV_IMSIC_PCI > + > +static void imsic_pci_mask_irq(struct irq_data *d) > +{ > + pci_msi_mask_irq(d); > + irq_chip_mask_parent(d); I've asked this before, but I still don't get why you need to propagate to the parent? Why isn't masking on PCI enough? Björn