struct amdgpu_device **dmabuf_adev,
                                  uint64_t *bo_size, void *metadata_buffer,
                                  size_t buffer_size, uint32_t *metadata_size,
-                                 uint32_t *flags)
+                                 uint32_t *flags, int8_t *xcp_id)
 {
        struct dma_buf *dma_buf;
        struct drm_gem_object *obj;
                if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
                        *flags |= KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC;
        }
+       if (xcp_id)
+               *xcp_id = bo->xcp_id;
 
 out_put:
        dma_buf_put(dma_buf);
 
                                  struct amdgpu_device **dmabuf_adev,
                                  uint64_t *bo_size, void *metadata_buffer,
                                  size_t buffer_size, uint32_t *metadata_size,
-                                 uint32_t *flags);
+                                 uint32_t *flags, int8_t *xcp_id);
 uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct amdgpu_device *dst,
                                          struct amdgpu_device *src);
 int amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(struct amdgpu_device *dst,
 
        struct amdgpu_device *dmabuf_adev;
        void *metadata_buffer = NULL;
        uint32_t flags;
+       int8_t xcp_id;
        unsigned int i;
        int r;
 
        r = amdgpu_amdkfd_get_dmabuf_info(dev->adev, args->dmabuf_fd,
                                          &dmabuf_adev, &args->size,
                                          metadata_buffer, args->metadata_size,
-                                         &args->metadata_size, &flags);
+                                         &args->metadata_size, &flags, &xcp_id);
        if (r)
                goto exit;
 
-       /* Reverse-lookup gpu_id from kgd pointer */
-       dev = kfd_device_by_adev(dmabuf_adev);
-       if (!dev) {
-               r = -EINVAL;
-               goto exit;
-       }
-       args->gpu_id = dev->id;
+       if (xcp_id >= 0)
+               args->gpu_id = dmabuf_adev->kfd.dev->nodes[xcp_id]->id;
+       else
+               args->gpu_id = dmabuf_adev->kfd.dev->nodes[0]->id;
        args->flags = flags;
 
        /* Copy metadata buffer to user mode */
 
 struct kfd_topology_device *kfd_topology_device_by_id(uint32_t gpu_id);
 struct kfd_node *kfd_device_by_id(uint32_t gpu_id);
 struct kfd_node *kfd_device_by_pci_dev(const struct pci_dev *pdev);
-struct kfd_node *kfd_device_by_adev(const struct amdgpu_device *adev);
 static inline bool kfd_irq_is_from_node(struct kfd_node *node, uint32_t node_id,
                                        uint32_t vmid)
 {
 
        return device;
 }
 
-struct kfd_node *kfd_device_by_adev(const struct amdgpu_device *adev)
-{
-       struct kfd_topology_device *top_dev;
-       struct kfd_node *device = NULL;
-
-       down_read(&topology_lock);
-
-       list_for_each_entry(top_dev, &topology_device_list, list)
-               if (top_dev->gpu && top_dev->gpu->adev == adev) {
-                       device = top_dev->gpu;
-                       break;
-               }
-
-       up_read(&topology_lock);
-
-       return device;
-}
-
 /* Called with write topology_lock acquired */
 static void kfd_release_topology_device(struct kfd_topology_device *dev)
 {