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
7374static int msi_affinity_flag = 1 ;
@@ -185,6 +186,7 @@ static void ls_scfg_msi_domain_irq_free(struct irq_domain *domain,
185186}
186187
187188static 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
215217static 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