component_reg_phys);
 }
 
-static int cxl_dport_setup_regs(struct cxl_dport *dport,
+static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport,
                                resource_size_t component_reg_phys)
 {
+       int rc;
+
        if (dev_is_platform(dport->dport_dev))
                return 0;
-       return cxl_setup_comp_regs(dport->dport_dev, &dport->comp_map,
-                                  component_reg_phys);
+
+       /*
+        * use @dport->dport_dev for the context for error messages during
+        * register probing, and fixup @host after the fact, since @host may be
+        * NULL.
+        */
+       rc = cxl_setup_comp_regs(dport->dport_dev, &dport->comp_map,
+                                component_reg_phys);
+       dport->comp_map.host = host;
+       return rc;
 }
 
 static struct cxl_port *__devm_cxl_add_port(struct device *host,
        if (!dport)
                return ERR_PTR(-ENOMEM);
 
-       if (rcrb != CXL_RESOURCE_NONE) {
+       dport->dport_dev = dport_dev;
+       dport->port_id = port_id;
+       dport->port = port;
+
+       if (rcrb == CXL_RESOURCE_NONE) {
+               rc = cxl_dport_setup_regs(&port->dev, dport,
+                                         component_reg_phys);
+               if (rc)
+                       return ERR_PTR(rc);
+       } else {
                dport->rcrb.base = rcrb;
                component_reg_phys = __rcrb_to_component(dport_dev, &dport->rcrb,
                                                         CXL_RCRB_DOWNSTREAM);
                        return ERR_PTR(-ENXIO);
                }
 
+               /*
+                * RCH @dport is not ready to map until associated with its
+                * memdev
+                */
+               rc = cxl_dport_setup_regs(NULL, dport, component_reg_phys);
+               if (rc)
+                       return ERR_PTR(rc);
+
                dport->rch = true;
        }
 
                dev_dbg(dport_dev, "Component Registers found for dport: %pa\n",
                        &component_reg_phys);
 
-       dport->dport_dev = dport_dev;
-       dport->port_id = port_id;
-       dport->port = port;
-
-       rc = cxl_dport_setup_regs(dport, component_reg_phys);
-       if (rc)
-               return ERR_PTR(rc);
-
        cond_cxl_root_lock(port);
        rc = add_dport(port, dport);
        cond_cxl_root_unlock(port);