static struct cxl_port *cxl_port_alloc(struct device *uport,
                                       resource_size_t component_reg_phys,
-                                      struct cxl_port *parent_port)
+                                      struct cxl_dport *parent_dport)
 {
        struct cxl_port *port;
        struct device *dev;
         * description.
         */
        dev = &port->dev;
-       if (parent_port) {
+       if (parent_dport) {
+               struct cxl_port *parent_port = parent_dport->port;
                struct cxl_port *iter;
 
                dev->parent = &parent_port->dev;
                port->depth = parent_port->depth + 1;
+               port->parent_dport = parent_dport;
 
                /*
                 * walk to the host bridge, or the first ancestor that knows
  * @host: host device for devm operations
  * @uport: "physical" device implementing this upstream port
  * @component_reg_phys: (optional) for configurable cxl_port instances
- * @parent_port: next hop up in the CXL memory decode hierarchy
+ * @parent_dport: next hop up in the CXL memory decode hierarchy
  */
 struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
                                   resource_size_t component_reg_phys,
-                                  struct cxl_port *parent_port)
+                                  struct cxl_dport *parent_dport)
 {
        struct cxl_port *port;
        struct device *dev;
        int rc;
 
-       port = cxl_port_alloc(uport, component_reg_phys, parent_port);
+       port = cxl_port_alloc(uport, component_reg_phys, parent_dport);
        if (IS_ERR(port))
                return port;
 
        dev = &port->dev;
        if (is_cxl_memdev(uport))
                rc = dev_set_name(dev, "endpoint%d", port->id);
-       else if (parent_port)
+       else if (parent_dport)
                rc = dev_set_name(dev, "port%d", port->id);
        else
                rc = dev_set_name(dev, "root%d", port->id);
        struct cxl_port *parent_port;
        struct device *parent;
 
-       parent_port = cxl_mem_find_port(cxlmd);
+       parent_port = cxl_mem_find_port(cxlmd, NULL);
        if (!parent_port)
                goto out;
        parent = &parent_port->dev;
 {
        struct device *dparent = grandparent(dport_dev);
        struct cxl_port *port, *parent_port = NULL;
+       struct cxl_dport *dport, *parent_dport;
        resource_size_t component_reg_phys;
-       struct cxl_dport *dport;
        int rc;
 
        if (!dparent) {
                return -ENXIO;
        }
 
-       parent_port = find_cxl_port(dparent, NULL);
+       parent_port = find_cxl_port(dparent, &parent_dport);
        if (!parent_port) {
                /* iterate to create this parent_port */
                return -EAGAIN;
        if (!port) {
                component_reg_phys = find_component_registers(uport_dev);
                port = devm_cxl_add_port(&parent_port->dev, uport_dev,
-                                        component_reg_phys, parent_port);
+                                        component_reg_phys, parent_dport);
                /* retry find to pick up the new dport information */
                if (!IS_ERR(port))
                        port = find_cxl_port_at(parent_port, dport_dev, &dport);
 }
 EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, CXL);
 
-struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd)
+struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,
+                                  struct cxl_dport **dport)
 {
-       return find_cxl_port(grandparent(&cxlmd->dev), NULL);
+       return find_cxl_port(grandparent(&cxlmd->dev), dport);
 }
 EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, CXL);
 
 
  * @id: id for port device-name
  * @dports: cxl_dport instances referenced by decoders
  * @endpoints: cxl_ep instances, endpoints that are a descendant of this port
+ * @parent_dport: dport that points to this port in the parent
  * @decoder_ida: allocator for decoder ids
  * @hdm_end: track last allocated HDM decoder instance for allocation ordering
  * @component_reg_phys: component register capability base address (optional)
        int id;
        struct list_head dports;
        struct list_head endpoints;
+       struct cxl_dport *parent_dport;
        struct ida decoder_ida;
        int hdm_end;
        resource_size_t component_reg_phys;
 struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port);
 struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
                                   resource_size_t component_reg_phys,
-                                  struct cxl_port *parent_port);
+                                  struct cxl_dport *parent_dport);
 struct cxl_port *find_cxl_root(struct device *dev);
 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
 int cxl_bus_rescan(void);
-struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd);
+struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,
+                                  struct cxl_dport **dport);
 bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd);
 
 struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port,
 
  */
 
 static int create_endpoint(struct cxl_memdev *cxlmd,
-                          struct cxl_port *parent_port)
+                          struct cxl_dport *parent_dport)
 {
+       struct cxl_port *parent_port = parent_dport->port;
        struct cxl_dev_state *cxlds = cxlmd->cxlds;
        struct cxl_port *endpoint;
        int rc;
 
        endpoint = devm_cxl_add_port(&parent_port->dev, &cxlmd->dev,
-                                    cxlds->component_reg_phys, parent_port);
+                                    cxlds->component_reg_phys, parent_dport);
        if (IS_ERR(endpoint))
                return PTR_ERR(endpoint);
 
 {
        struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
        struct cxl_port *parent_port;
+       struct cxl_dport *dport;
        struct dentry *dentry;
        int rc;
 
        if (rc)
                return rc;
 
-       parent_port = cxl_mem_find_port(cxlmd);
+       parent_port = cxl_mem_find_port(cxlmd, &dport);
        if (!parent_port) {
                dev_err(dev, "CXL port topology not found\n");
                return -ENXIO;
                goto unlock;
        }
 
-       rc = create_endpoint(cxlmd, parent_port);
+       rc = create_endpoint(cxlmd, dport);
 unlock:
        device_unlock(&parent_port->dev);
        put_device(&parent_port->dev);