Skip to content

Commit f29861a

Browse files
covanambjorn-helgaas
authored andcommitted
PCI: xilinx: 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 <[email protected]> [mani: reworded commit message] Signed-off-by: Manivannan Sadhasivam <[email protected]> [bhelgaas: rebase on dev_fwnode() conversion, drop fwnode local var] Signed-off-by: Bjorn Helgaas <[email protected]> Reviewed-by: Thomas Gleixner <[email protected]> Link: https://patch.msgid.link/b1353c797ce53714c22823de3bd2ae3d09fcd84f.1750858083.git.namcao@linutronix.de
1 parent 710a149 commit f29861a

File tree

2 files changed

+32
-25
lines changed

2 files changed

+32
-25
lines changed

drivers/pci/controller/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ config PCIE_XILINX
322322
bool "Xilinx AXI PCIe controller"
323323
depends on OF
324324
depends on PCI_MSI
325+
select IRQ_MSI_LIB
325326
help
326327
Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
327328
Host Bridge driver.

drivers/pci/controller/pcie-xilinx.c

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include <linux/interrupt.h>
1414
#include <linux/irq.h>
15+
#include <linux/irqchip/irq-msi-lib.h>
1516
#include <linux/irqdomain.h>
1617
#include <linux/kernel.h>
1718
#include <linux/init.h>
@@ -203,11 +204,6 @@ static void xilinx_msi_top_irq_ack(struct irq_data *d)
203204
*/
204205
}
205206

206-
static struct irq_chip xilinx_msi_top_chip = {
207-
.name = "PCIe MSI",
208-
.irq_ack = xilinx_msi_top_irq_ack,
209-
};
210-
211207
static void xilinx_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
212208
{
213209
struct xilinx_pcie *pcie = irq_data_get_irq_chip_data(data);
@@ -264,29 +260,42 @@ static const struct irq_domain_ops xilinx_msi_domain_ops = {
264260
.free = xilinx_msi_domain_free,
265261
};
266262

267-
static struct msi_domain_info xilinx_msi_info = {
268-
.flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
269-
MSI_FLAG_NO_AFFINITY,
270-
.chip = &xilinx_msi_top_chip,
263+
static bool xilinx_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
264+
struct irq_domain *real_parent, struct msi_domain_info *info)
265+
{
266+
struct irq_chip *chip = info->chip;
267+
268+
if (!msi_lib_init_dev_msi_info(dev, domain, real_parent, info))
269+
return false;
270+
271+
chip->irq_ack = xilinx_msi_top_irq_ack;
272+
return true;
273+
}
274+
275+
#define XILINX_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
276+
MSI_FLAG_USE_DEF_CHIP_OPS | \
277+
MSI_FLAG_NO_AFFINITY)
278+
279+
static const struct msi_parent_ops xilinx_msi_parent_ops = {
280+
.required_flags = XILINX_MSI_FLAGS_REQUIRED,
281+
.supported_flags = MSI_GENERIC_FLAGS_MASK,
282+
.bus_select_token = DOMAIN_BUS_PCI_MSI,
283+
.prefix = "xilinx-",
284+
.init_dev_msi_info = xilinx_init_dev_msi_info,
271285
};
272286

273287
static int xilinx_allocate_msi_domains(struct xilinx_pcie *pcie)
274288
{
275-
struct fwnode_handle *fwnode = dev_fwnode(pcie->dev);
276-
struct irq_domain *parent;
277-
278-
parent = irq_domain_create_linear(fwnode, XILINX_NUM_MSI_IRQS,
279-
&xilinx_msi_domain_ops, pcie);
280-
if (!parent) {
281-
dev_err(pcie->dev, "failed to create IRQ domain\n");
282-
return -ENOMEM;
283-
}
284-
irq_domain_update_bus_token(parent, DOMAIN_BUS_NEXUS);
285-
286-
pcie->msi_domain = pci_msi_create_irq_domain(fwnode, &xilinx_msi_info, parent);
289+
struct irq_domain_info info = {
290+
.fwnode = dev_fwnode(pcie->dev),
291+
.ops = &xilinx_msi_domain_ops,
292+
.host_data = pcie,
293+
.size = XILINX_NUM_MSI_IRQS,
294+
};
295+
296+
pcie->msi_domain = msi_create_parent_irq_domain(&info, &xilinx_msi_parent_ops);
287297
if (!pcie->msi_domain) {
288298
dev_err(pcie->dev, "failed to create MSI domain\n");
289-
irq_domain_remove(parent);
290299
return -ENOMEM;
291300
}
292301

@@ -295,10 +304,7 @@ static int xilinx_allocate_msi_domains(struct xilinx_pcie *pcie)
295304

296305
static void xilinx_free_msi_domains(struct xilinx_pcie *pcie)
297306
{
298-
struct irq_domain *parent = pcie->msi_domain->parent;
299-
300307
irq_domain_remove(pcie->msi_domain);
301-
irq_domain_remove(parent);
302308
}
303309

304310
/* INTx Functions */

0 commit comments

Comments
 (0)