{
        struct irq_domain *middle_domain, *msi_domain;
 
-       middle_domain = irq_domain_create_linear(domain_handle,
-                                               priv->num_irqs,
-                                               &pch_msi_middle_domain_ops,
-                                               priv);
+       middle_domain = irq_domain_create_hierarchy(parent, 0, priv->num_irqs,
+                                                   domain_handle,
+                                                   &pch_msi_middle_domain_ops,
+                                                   priv);
        if (!middle_domain) {
                pr_err("Failed to create the MSI middle domain\n");
                return -ENOMEM;
        }
 
-       middle_domain->parent = parent;
        irq_domain_update_bus_token(middle_domain, DOMAIN_BUS_NEXUS);
 
        msi_domain = pci_msi_create_irq_domain(domain_handle,