drm/amdgpu: KFD graphics interop support compute partition
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>
This commit is contained in:
parent
3ebfd221c1
commit
2fa9ff25de
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue