drm/amdgpu: KFD graphics interop support compute partition
authorPhilip Yang <Philip.Yang@amd.com>
Fri, 10 Mar 2023 00:30:02 +0000 (19:30 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 14:36:41 +0000 (10:36 -0400)
kfd_ioctl_get_dmabuf use the amdgpu bo xcp_id to get the gpu_id of the
KFD node from the exported dmabuf_adev, and then create kfd bo on the
correct adev and KFD node when importing the amdgpu bo to KFD.

Remove function kfd_device_by_adev, it is not needed as it is the same
result as dmabuf_adev->kfd.dev->nodes[0]->id.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_topology.c

index bbbfe9e..00edb13 100644 (file)
@@ -498,7 +498,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,
                                  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;
@@ -542,6 +542,8 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,
                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);
index 05c5477..4e6221b 100644 (file)
@@ -241,7 +241,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,
                                  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,
index f85ac4d..fcad90d 100644 (file)
@@ -1499,6 +1499,7 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,
        struct amdgpu_device *dmabuf_adev;
        void *metadata_buffer = NULL;
        uint32_t flags;
+       int8_t xcp_id;
        unsigned int i;
        int r;
 
@@ -1519,17 +1520,14 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,
        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 */
index 214d950..44f4d55 100644 (file)
@@ -1068,7 +1068,6 @@ struct kfd_topology_device *kfd_topology_device_by_proximity_domain_no_lock(
 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)
 {
index a8e25ae..dbb6159 100644 (file)
@@ -125,24 +125,6 @@ struct kfd_node *kfd_device_by_pci_dev(const struct pci_dev *pdev)
        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)
 {