/* Create PCI MSI/MSIx irqdomain, use @parent as the parent irqdomain. */
 extern struct irq_domain *arch_create_msi_irq_domain(struct irq_domain *parent);
+extern struct irq_domain *
+arch_create_remap_msi_irq_domain(struct irq_domain *par, const char *n, int id);
 
 /* Get parent irqdomain for interrupt remapping irqdomain */
 static inline struct irq_domain *arch_get_ir_parent_domain(void)
 
        .handler_name   = "edge",
 };
 
+struct irq_domain *arch_create_remap_msi_irq_domain(struct irq_domain *parent,
+                                                   const char *name, int id)
+{
+       struct fwnode_handle *fn;
+       struct irq_domain *d;
+
+       fn = irq_domain_alloc_named_id_fwnode(name, id);
+       if (!fn)
+               return NULL;
+       d = pci_msi_create_irq_domain(fn, &pci_msi_ir_domain_info, parent);
+       irq_domain_free_fwnode(fn);
+       return d;
+}
+
 struct irq_domain *arch_create_msi_irq_domain(struct irq_domain *parent)
 {
        return pci_msi_create_irq_domain(NULL, &pci_msi_ir_domain_info, parent);
 }
+
 #endif
 
 #ifdef CONFIG_DMAR_TABLE