diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch new file mode 100644 index 00000000..1a14d4dc --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch @@ -0,0 +1,141 @@ +From 911066d0a097bd5cee306247cb953fb4359add37 Mon Sep 17 00:00:00 2001 +From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +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 <Harish.Kasiviswanathan@amd.com> +--- + 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 + |