static void iommu_disable_irq_remapping(struct intel_iommu *iommu);
 static int __init parse_ioapics_under_ir(void);
+static const struct msi_parent_ops dmar_msi_parent_ops;
 
 static bool ir_pre_enabled(struct intel_iommu *iommu)
 {
 {
        struct dmar_drhd_unit *drhd = dmar_find_matched_drhd_unit(dev);
 
-       return drhd ? drhd->iommu->ir_msi_domain : NULL;
+       return drhd ? drhd->iommu->ir_domain : NULL;
 }
 
 static int clear_entries(struct irq_2_iommu *irq_iommu)
                pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id);
                goto out_free_fwnode;
        }
-       iommu->ir_msi_domain =
-               arch_create_remap_msi_irq_domain(iommu->ir_domain,
-                                                "INTEL-IR-MSI",
-                                                iommu->seq_id);
+
+       irq_domain_update_bus_token(iommu->ir_domain,  DOMAIN_BUS_DMAR);
+       iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT;
+       iommu->ir_domain->msi_parent_ops = &dmar_msi_parent_ops;
 
        ir_table->base = page_address(pages);
        ir_table->bitmap = bitmap;
        return 0;
 
 out_free_ir_domain:
-       if (iommu->ir_msi_domain)
-               irq_domain_remove(iommu->ir_msi_domain);
-       iommu->ir_msi_domain = NULL;
        irq_domain_remove(iommu->ir_domain);
        iommu->ir_domain = NULL;
 out_free_fwnode:
        struct fwnode_handle *fn;
 
        if (iommu && iommu->ir_table) {
-               if (iommu->ir_msi_domain) {
-                       fn = iommu->ir_msi_domain->fwnode;
-
-                       irq_domain_remove(iommu->ir_msi_domain);
-                       irq_domain_free_fwnode(fn);
-                       iommu->ir_msi_domain = NULL;
-               }
                if (iommu->ir_domain) {
                        fn = iommu->ir_domain->fwnode;
 
        .deactivate = intel_irq_remapping_deactivate,
 };
 
+static const struct msi_parent_ops dmar_msi_parent_ops = {
+       .supported_flags        = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
+       .prefix                 = "IR-",
+       .init_dev_msi_info      = msi_parent_init_dev_msi_info,
+};
+
 /*
  * Support of Interrupt Remapping Unit Hotplug
  */