Skip to content

Commit 94b59d5

Browse files
covanamKAGA-KOKO
authored andcommitted
irqchip/ls-scfg-msi: Switch to use msi_create_parent_irq_domain()
Move away from the legacy MSI domain setup, switch to use msi_create_parent_irq_domain(). Signed-off-by: Nam Cao <namcao@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/6d23d93fa1f1e65526698f97c9888fa5d12abc7b.1750860131.git.namcao@linutronix.de
1 parent bafb290 commit 94b59d5

2 files changed

Lines changed: 23 additions & 27 deletions

File tree

drivers/irqchip/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ config LS_SCFG_MSI
436436
def_bool y if SOC_LS1021A || ARCH_LAYERSCAPE
437437
select IRQ_MSI_IOMMU
438438
depends on PCI_MSI
439+
select IRQ_MSI_LIB
439440

440441
config PARTITION_PERCPU
441442
bool

drivers/irqchip/irq-ls-scfg-msi.c

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <linux/iommu.h>
1515
#include <linux/irq.h>
1616
#include <linux/irqchip/chained_irq.h>
17+
#include <linux/irqchip/irq-msi-lib.h>
1718
#include <linux/irqdomain.h>
1819
#include <linux/of_irq.h>
1920
#include <linux/of_pci.h>
@@ -47,7 +48,6 @@ struct ls_scfg_msi {
4748
spinlock_t lock;
4849
struct platform_device *pdev;
4950
struct irq_domain *parent;
50-
struct irq_domain *msi_domain;
5151
void __iomem *regs;
5252
phys_addr_t msiir_addr;
5353
struct ls_scfg_msi_cfg *cfg;
@@ -57,17 +57,18 @@ struct ls_scfg_msi {
5757
unsigned long *used;
5858
};
5959

60-
static struct irq_chip ls_scfg_msi_irq_chip = {
61-
.name = "MSI",
62-
.irq_mask = pci_msi_mask_irq,
63-
.irq_unmask = pci_msi_unmask_irq,
64-
};
65-
66-
static struct msi_domain_info ls_scfg_msi_domain_info = {
67-
.flags = (MSI_FLAG_USE_DEF_DOM_OPS |
68-
MSI_FLAG_USE_DEF_CHIP_OPS |
69-
MSI_FLAG_PCI_MSIX),
70-
.chip = &ls_scfg_msi_irq_chip,
60+
#define MPIC_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
61+
MSI_FLAG_USE_DEF_CHIP_OPS)
62+
#define MPIC_MSI_FLAGS_SUPPORTED (MSI_FLAG_PCI_MSIX | \
63+
MSI_GENERIC_FLAGS_MASK)
64+
65+
static const struct msi_parent_ops ls_scfg_msi_parent_ops = {
66+
.required_flags = MPIC_MSI_FLAGS_REQUIRED,
67+
.supported_flags = MPIC_MSI_FLAGS_SUPPORTED,
68+
.bus_select_token = DOMAIN_BUS_NEXUS,
69+
.bus_select_mask = MATCH_PCI_MSI,
70+
.prefix = "MSI-",
71+
.init_dev_msi_info = msi_lib_init_dev_msi_info,
7172
};
7273

7374
static int msi_affinity_flag = 1;
@@ -185,6 +186,7 @@ static void ls_scfg_msi_domain_irq_free(struct irq_domain *domain,
185186
}
186187

187188
static const struct irq_domain_ops ls_scfg_msi_domain_ops = {
189+
.select = msi_lib_irq_domain_select,
188190
.alloc = ls_scfg_msi_domain_irq_alloc,
189191
.free = ls_scfg_msi_domain_irq_free,
190192
};
@@ -214,21 +216,15 @@ static void ls_scfg_msi_irq_handler(struct irq_desc *desc)
214216

215217
static int ls_scfg_msi_domains_init(struct ls_scfg_msi *msi_data)
216218
{
217-
/* Initialize MSI domain parent */
218-
msi_data->parent = irq_domain_create_linear(NULL,
219-
msi_data->irqs_num,
220-
&ls_scfg_msi_domain_ops,
221-
msi_data);
219+
struct irq_domain_info info = {
220+
.fwnode = of_fwnode_handle(msi_data->pdev->dev.of_node),
221+
.ops = &ls_scfg_msi_domain_ops,
222+
.host_data = msi_data,
223+
.size = msi_data->irqs_num,
224+
};
225+
226+
msi_data->parent = msi_create_parent_irq_domain(&info, &ls_scfg_msi_parent_ops);
222227
if (!msi_data->parent) {
223-
dev_err(&msi_data->pdev->dev, "failed to create IRQ domain\n");
224-
return -ENOMEM;
225-
}
226-
227-
msi_data->msi_domain = pci_msi_create_irq_domain(
228-
of_fwnode_handle(msi_data->pdev->dev.of_node),
229-
&ls_scfg_msi_domain_info,
230-
msi_data->parent);
231-
if (!msi_data->msi_domain) {
232228
dev_err(&msi_data->pdev->dev, "failed to create MSI domain\n");
233229
irq_domain_remove(msi_data->parent);
234230
return -ENOMEM;
@@ -405,7 +401,6 @@ static void ls_scfg_msi_remove(struct platform_device *pdev)
405401
for (i = 0; i < msi_data->msir_num; i++)
406402
ls_scfg_msi_teardown_hwirq(&msi_data->msir[i]);
407403

408-
irq_domain_remove(msi_data->msi_domain);
409404
irq_domain_remove(msi_data->parent);
410405

411406
platform_set_drvdata(pdev, NULL);

0 commit comments

Comments
 (0)