#include <linux/slab.h>
 #include <linux/sys_soc.h>
 #include <linux/memblock.h>
+#include <linux/pci.h>
+#include <linux/bug.h>
 
 #include <asm/bootinfo.h>
 #include <asm/mipsregs.h>
 
 static void *detect_magic __initdata = detect_memory_region;
 
+int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
+{
+       struct resource_entry *entry;
+       resource_size_t mask;
+
+       entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
+       if (!entry) {
+               pr_err("Cannot get memory resource\n");
+               return -EINVAL;
+       }
+
+       if (mips_cps_numiocu(0)) {
+               /*
+                * Hardware doesn't accept mask values with 1s after
+                * 0s (e.g. 0xffef), so warn if that's happen
+                */
+               mask = ~(entry->res->end - entry->res->start) & CM_GCR_REGn_MASK_ADDRMASK;
+               WARN_ON(mask && BIT(ffz(~mask)) - 1 != ~mask);
+
+               write_gcr_reg1_base(entry->res->start);
+               write_gcr_reg1_mask(mask | CM_GCR_REGn_MASK_CMTGT_IOCU0);
+               pr_info("PCI coherence region base: 0x%08llx, mask/settings: 0x%08llx\n",
+                       (unsigned long long)read_gcr_reg1_base(),
+                       (unsigned long long)read_gcr_reg1_mask());
+       }
+
+       return 0;
+}
+
 phys_addr_t mips_cpc_default_phys_base(void)
 {
        panic("Cannot detect cpc address");
 
                reset_control_assert(port->pcie_rst);
 }
 
-static int setup_cm_memory_region(struct pci_host_bridge *host)
-{
-       struct mt7621_pcie *pcie = pci_host_bridge_priv(host);
-       struct device *dev = pcie->dev;
-       struct resource_entry *entry;
-       resource_size_t mask;
-
-       entry = resource_list_first_type(&host->windows, IORESOURCE_MEM);
-       if (!entry) {
-               dev_err(dev, "cannot get memory resource\n");
-               return -EINVAL;
-       }
-
-       if (mips_cps_numiocu(0)) {
-               /*
-                * FIXME: hardware doesn't accept mask values with 1s after
-                * 0s (e.g. 0xffef), so it would be great to warn if that's
-                * about to happen
-                */
-               mask = ~(entry->res->end - entry->res->start);
-
-               write_gcr_reg1_base(entry->res->start);
-               write_gcr_reg1_mask(mask | CM_GCR_REGn_MASK_CMTGT_IOCU0);
-               dev_info(dev, "PCI coherence region base: 0x%08llx, mask/settings: 0x%08llx\n",
-                        (unsigned long long)read_gcr_reg1_base(),
-                        (unsigned long long)read_gcr_reg1_mask());
-       }
-
-       return 0;
-}
-
 static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie,
                                  struct device_node *node,
                                  int slot)
                goto remove_resets;
        }
 
-       err = setup_cm_memory_region(bridge);
-       if (err) {
-               dev_err(dev, "error setting up iocu mem regions\n");
-               goto remove_resets;
-       }
-
        return mt7621_pcie_register_host(bridge);
 
 remove_resets: