#include <linux/hpet.h>
 #include <linux/pci.h>
 #include <linux/irq.h>
+#include <linux/irqchip/irq-msi-lib.h>
 #include <linux/acpi.h>
 #include <linux/irqdomain.h>
 #include <linux/crash_dump.h>
 
 static int intel_setup_irq_remapping(struct intel_iommu *iommu)
 {
+       struct irq_domain_info info = {
+               .ops            = &intel_ir_domain_ops,
+               .parent         = arch_get_ir_parent_domain(),
+               .domain_flags   = IRQ_DOMAIN_FLAG_ISOLATED_MSI,
+               .size           = INTR_REMAP_TABLE_ENTRIES,
+               .host_data      = iommu,
+       };
        struct ir_table *ir_table;
-       struct fwnode_handle *fn;
        unsigned long *bitmap;
        void *ir_table_base;
 
                goto out_free_pages;
        }
 
-       fn = irq_domain_alloc_named_id_fwnode("INTEL-IR", iommu->seq_id);
-       if (!fn)
+       info.fwnode = irq_domain_alloc_named_id_fwnode("INTEL-IR", iommu->seq_id);
+       if (!info.fwnode)
                goto out_free_bitmap;
 
-       iommu->ir_domain =
-               irq_domain_create_hierarchy(arch_get_ir_parent_domain(),
-                                           0, INTR_REMAP_TABLE_ENTRIES,
-                                           fn, &intel_ir_domain_ops,
-                                           iommu);
+       iommu->ir_domain = msi_create_parent_irq_domain(&info, &dmar_msi_parent_ops);
        if (!iommu->ir_domain) {
                pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id);
                goto out_free_fwnode;
        }
 
-       irq_domain_update_bus_token(iommu->ir_domain,  DOMAIN_BUS_DMAR);
-       iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT |
-                                  IRQ_DOMAIN_FLAG_ISOLATED_MSI;
-       iommu->ir_domain->msi_parent_ops = &dmar_msi_parent_ops;
-
        ir_table->base = ir_table_base;
        ir_table->bitmap = bitmap;
        iommu->ir_table = ir_table;
        irq_domain_remove(iommu->ir_domain);
        iommu->ir_domain = NULL;
 out_free_fwnode:
-       irq_domain_free_fwnode(fn);
+       irq_domain_free_fwnode(info.fwnode);
 out_free_bitmap:
        bitmap_free(bitmap);
 out_free_pages:
 
 static const struct msi_parent_ops dmar_msi_parent_ops = {
        .supported_flags        = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
+       .bus_select_token       = DOMAIN_BUS_DMAR,
+       .bus_select_mask        = MATCH_PCI_MSI,
        .prefix                 = "IR-",
        .init_dev_msi_info      = msi_parent_init_dev_msi_info,
 };