From 911066d0a097bd5cee306247cb953fb4359add37 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Tue, 27 Mar 2018 11:28:55 -0400 Subject: [PATCH 4163/5725] drm/amdgpu: kfd2kgd: Support BO create from sg Change-Id: I3d50a285f6c5645995dcd45b66129fb8837f2bd4 Signed-off-by: Harish Kasiviswanathan --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 23 +++++++++++++++++++---- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 2 +- drivers/gpu/drm/amd/amdkfd/kfd_process.c | 3 ++- drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 63dbe3c..5c785ac 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -181,7 +181,7 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( struct kgd_dev *kgd, uint64_t va, uint64_t size, - void *vm, struct kgd_mem **mem, + void *vm, struct sg_table *sg, struct kgd_mem **mem, uint64_t *offset, uint32_t flags); int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( struct kgd_dev *kgd, struct kgd_mem *mem); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index b3112fb..83ed761 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -911,6 +911,17 @@ static struct sg_table *create_doorbell_sg(uint64_t addr, uint32_t size) return sg; } +static bool check_sg_size(struct sg_table *sgt, uint64_t size) +{ + unsigned int count; + struct scatterlist *sg; + + for_each_sg(sgt->sgl, sg, sgt->nents, count) + size -= sg->length; + + return (size == 0); +} + static int process_validate_vms(struct amdkfd_process_info *process_info) { struct amdgpu_vm *peer_vm; @@ -1158,13 +1169,12 @@ uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( struct kgd_dev *kgd, uint64_t va, uint64_t size, - void *vm, struct kgd_mem **mem, + void *vm, struct sg_table *sg, struct kgd_mem **mem, uint64_t *offset, uint32_t flags) { struct amdgpu_device *adev = get_amdgpu_device(kgd); struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; uint64_t user_addr = 0; - struct sg_table *sg = NULL; enum ttm_bo_type bo_type = ttm_bo_type_device; struct amdgpu_bo *bo; int byte_align; @@ -1185,6 +1195,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( } else if (flags & ALLOC_MEM_FLAGS_GTT) { domain = alloc_domain = AMDGPU_GEM_DOMAIN_GTT; alloc_flags = 0; + if (sg && !check_sg_size(sg, size)) + return -EINVAL; } else if (flags & ALLOC_MEM_FLAGS_USERPTR) { domain = AMDGPU_GEM_DOMAIN_GTT; alloc_domain = AMDGPU_GEM_DOMAIN_CPU; @@ -1194,18 +1206,21 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( user_addr = *offset; } else if (flags & ALLOC_MEM_FLAGS_DOORBELL) { domain = AMDGPU_GEM_DOMAIN_GTT; - alloc_domain = AMDGPU_GEM_DOMAIN_CPU; alloc_flags = 0; if (size > UINT_MAX) return -EINVAL; + WARN_ON(sg); sg = create_doorbell_sg(*offset, size); if (!sg) return -ENOMEM; - bo_type = ttm_bo_type_sg; } else { return -EINVAL; } + if (sg) { + alloc_domain = AMDGPU_GEM_DOMAIN_CPU; + bo_type = ttm_bo_type_sg; + } *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL); if (!*mem) { ret = -ENOMEM; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index bd09647..1a35938 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -1301,7 +1301,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, err = dev->kfd2kgd->alloc_memory_of_gpu( dev->kgd, args->va_addr, args->size, - pdd->vm, (struct kgd_mem **) &mem, &offset, + pdd->vm, NULL, (struct kgd_mem **) &mem, &offset, flags); if (err) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 5c6f124..ef71670 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -120,7 +120,8 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd, int err; err = kdev->kfd2kgd->alloc_memory_of_gpu(kdev->kgd, gpu_va, size, - pdd->vm, &mem, NULL, flags); + pdd->vm, NULL, &mem, NULL, + flags); if (err) goto err_alloc_mem; diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index e164abb..5060052 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h @@ -345,7 +345,7 @@ struct kfd2kgd_calls { int (*sync_memory)(struct kgd_dev *kgd, struct kgd_mem *mem, bool intr); int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va, - uint64_t size, void *vm, + uint64_t size, void *vm, struct sg_table *sg, struct kgd_mem **mem, uint64_t *offset, uint32_t flags); int (*free_memory_of_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem); -- 2.7.4