aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4163-drm-amdgpu-kfd2kgd-Support-BO-create-from-sg.patch
diff options
context:
space:
mode:
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.patch141
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
+