PCI: xilinx-xdma: Switch to msi_create_parent_irq_domain()

Switch to msi_create_parent_irq_domain() from pci_msi_create_irq_domain()
which was using legacy MSI domain setup.

Signed-off-by: Nam Cao <namcao@linutronix.de>
[mani: reworded commit message]
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
[bhelgaas: rebase on dev_fwnode() conversion]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://patch.msgid.link/b4620dc1808f217a69d0ae50700ffa12ffd657eb.1750858083.git.namcao@linutronix.de
This commit is contained in:
Nam Cao 2025-06-26 16:48:00 +02:00 committed by Bjorn Helgaas
parent dd26c1a23f
commit d08c7e502c
2 changed files with 21 additions and 27 deletions

View File

@ -331,6 +331,7 @@ config PCIE_XILINX_DMA_PL
depends on ARCH_ZYNQMP || COMPILE_TEST depends on ARCH_ZYNQMP || COMPILE_TEST
depends on PCI_MSI depends on PCI_MSI
select PCI_HOST_COMMON select PCI_HOST_COMMON
select IRQ_MSI_LIB
help help
Say 'Y' here if you want kernel support for the Xilinx PL DMA Say 'Y' here if you want kernel support for the Xilinx PL DMA
PCIe host bridge. The controller is a Soft IP which can act as PCIe host bridge. The controller is a Soft IP which can act as

View File

@ -7,6 +7,7 @@
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/irqchip/irq-msi-lib.h>
#include <linux/irqdomain.h> #include <linux/irqdomain.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
@ -90,7 +91,6 @@ struct xilinx_pl_dma_variant {
}; };
struct xilinx_msi { struct xilinx_msi {
struct irq_domain *msi_domain;
unsigned long *bitmap; unsigned long *bitmap;
struct irq_domain *dev_domain; struct irq_domain *dev_domain;
struct mutex lock; /* Protect bitmap variable */ struct mutex lock; /* Protect bitmap variable */
@ -373,20 +373,20 @@ static irqreturn_t xilinx_pl_dma_pcie_intr_handler(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static struct irq_chip xilinx_msi_irq_chip = { #define XILINX_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
.name = "pl_dma:PCIe MSI", MSI_FLAG_USE_DEF_CHIP_OPS | \
.irq_enable = pci_msi_unmask_irq, MSI_FLAG_NO_AFFINITY)
.irq_disable = pci_msi_mask_irq,
.irq_mask = pci_msi_mask_irq,
.irq_unmask = pci_msi_unmask_irq,
};
static struct msi_domain_info xilinx_msi_domain_info = { #define XILINX_MSI_FLAGS_SUPPORTED (MSI_GENERIC_FLAGS_MASK | \
.flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | MSI_FLAG_MULTI_PCI_MSI)
MSI_FLAG_NO_AFFINITY | MSI_FLAG_MULTI_PCI_MSI,
.chip = &xilinx_msi_irq_chip,
};
static const struct msi_parent_ops xilinx_msi_parent_ops = {
.required_flags = XILINX_MSI_FLAGS_REQUIRED,
.supported_flags = XILINX_MSI_FLAGS_SUPPORTED,
.bus_select_token = DOMAIN_BUS_PCI_MSI,
.prefix = "pl_dma-",
.init_dev_msi_info = msi_lib_init_dev_msi_info,
};
static void xilinx_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) static void xilinx_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
{ {
struct pl_dma_pcie *pcie = irq_data_get_irq_chip_data(data); struct pl_dma_pcie *pcie = irq_data_get_irq_chip_data(data);
@ -458,11 +458,6 @@ static void xilinx_pl_dma_pcie_free_irq_domains(struct pl_dma_pcie *port)
irq_domain_remove(msi->dev_domain); irq_domain_remove(msi->dev_domain);
msi->dev_domain = NULL; msi->dev_domain = NULL;
} }
if (msi->msi_domain) {
irq_domain_remove(msi->msi_domain);
msi->msi_domain = NULL;
}
} }
static int xilinx_pl_dma_pcie_init_msi_irq_domain(struct pl_dma_pcie *port) static int xilinx_pl_dma_pcie_init_msi_irq_domain(struct pl_dma_pcie *port)
@ -470,19 +465,17 @@ static int xilinx_pl_dma_pcie_init_msi_irq_domain(struct pl_dma_pcie *port)
struct device *dev = port->dev; struct device *dev = port->dev;
struct xilinx_msi *msi = &port->msi; struct xilinx_msi *msi = &port->msi;
int size = BITS_TO_LONGS(XILINX_NUM_MSI_IRQS) * sizeof(long); int size = BITS_TO_LONGS(XILINX_NUM_MSI_IRQS) * sizeof(long);
struct fwnode_handle *fwnode = dev_fwnode(port->dev); struct irq_domain_info info = {
.fwnode = dev_fwnode(port->dev),
.ops = &dev_msi_domain_ops,
.host_data = port,
.size = XILINX_NUM_MSI_IRQS,
};
msi->dev_domain = irq_domain_create_linear(NULL, XILINX_NUM_MSI_IRQS, msi->dev_domain = msi_create_parent_irq_domain(&info, &xilinx_msi_parent_ops);
&dev_msi_domain_ops, port);
if (!msi->dev_domain) if (!msi->dev_domain)
goto out; goto out;
msi->msi_domain = pci_msi_create_irq_domain(fwnode,
&xilinx_msi_domain_info,
msi->dev_domain);
if (!msi->msi_domain)
goto out;
mutex_init(&msi->lock); mutex_init(&msi->lock);
msi->bitmap = kzalloc(size, GFP_KERNEL); msi->bitmap = kzalloc(size, GFP_KERNEL);
if (!msi->bitmap) if (!msi->bitmap)