aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch139
1 files changed, 139 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch
new file mode 100644
index 00000000..3f5351fb
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1510-drm-amdgpu-Introduce-amdkfd_vm-structure.patch
@@ -0,0 +1,139 @@
+From 91d7956c48b020a6e4858394a9844306a5261be6 Mon Sep 17 00:00:00 2001
+From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+Date: Mon, 27 Jun 2016 12:20:18 -0400
+Subject: [PATCH 1510/4131] drm/amdgpu: Introduce amdkfd_vm structure
+
+For KFD process use amdkfd_vm instead of amdgpu_vm but keep pointer
+compatability between these two structures.
+
+struct amdkfd_vm will aid KGD in keeping track of all KFD BOs and VMs
+belonging to a KFD process. This is useful for KFD memory eviction and
+restore since KFD eviction / restore is done per process.
+
+Change-Id: I83383a183c7f0c6b95d46c72b37dbaaaaa1e93f8
+Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 29 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 18 ++++++++-------
+ 2 files changed, 39 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index 70b8652..b66b03a 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -29,6 +29,7 @@
+ #include <linux/mm.h>
+ #include <linux/workqueue.h>
+ #include <kgd_kfd_interface.h>
++#include "amdgpu.h"
+
+ extern const struct kgd2kfd_calls *kgd2kfd;
+
+@@ -70,6 +71,34 @@ struct kgd_mem {
+ };
+
+
++/* struct amdkfd_vm -
++ * For Memory Eviction KGD requires a mechanism to keep track of all KFD BOs
++ * belonging to a KFD process. All the VMs belonging to the same process point
++ * to the same master VM. The master VM points to itself.
++ * For master VM kfd_bo_list will contain the list of all KFD BOs and it will
++ * be empty for all the other VMs. The master VM is decided by KFD and it will
++ * pass it on KGD via create_process_vm interface
++ */
++struct amdkfd_vm {
++ /* Keep base as the first parameter for pointer compatibility between
++ * amdkfd_vm and amdgpu_vm.
++ */
++ struct amdgpu_vm base;
++ /* Points to master VM of the KFD process */
++ struct amdkfd_vm *master;
++ /* List Head for all KFD BOs that belong to a KFD process. Non-empty
++ * only for Master VM.
++ */
++ struct list_head kfd_bo_list;
++ /* Lock to protect kfd_bo_list */
++ struct mutex lock;
++ /* List of VMs that belong to a KFD process */
++ struct list_head kfd_vm_list;
++ /* Number of VMs including master VM */
++ unsigned n_vms;
++ struct amdgpu_device *adev;
++};
++
+ int amdgpu_amdkfd_init(void);
+ void amdgpu_amdkfd_fini(void);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index fefdfe2..123adfb 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -27,7 +27,6 @@
+ #include <linux/list.h>
+ #include <drm/drmP.h>
+ #include <linux/dma-buf.h>
+-#include "amdgpu.h"
+ #include "amdgpu_amdkfd.h"
+ #include "amdgpu_ucode.h"
+ #include "gca/gfx_8_0_sh_mask.h"
+@@ -1038,14 +1037,14 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
+ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm)
+ {
+ int ret;
+- struct amdgpu_vm *new_vm;
++ struct amdkfd_vm *new_vm;
+ struct amdgpu_bo *pd;
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+
+ BUG_ON(kgd == NULL);
+ BUG_ON(vm == NULL);
+
+- new_vm = kzalloc(sizeof(struct amdgpu_vm), GFP_KERNEL);
++ new_vm = kzalloc(sizeof(struct amdkfd_vm), GFP_KERNEL);
+ if (new_vm == NULL)
+ return -ENOMEM;
+
+@@ -1054,11 +1053,14 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm)
+ if (ret != 0) {
+ pr_err("amdgpu: failed init vm ret %d\n", ret);
+ /* Undo everything related to the new VM context */
+- amdgpu_vm_fini(adev, new_vm);
++ amdgpu_vm_fini(adev, &new_vm->base);
+ kfree(new_vm);
+ new_vm = NULL;
+ }
+-
++ new_vm->adev = adev;
++ mutex_init(&new_vm->lock);
++ INIT_LIST_HEAD(&new_vm->kfd_bo_list);
++ INIT_LIST_HEAD(&new_vm->kfd_vm_list);
+ *vm = (void *) new_vm;
+
+ /*
+@@ -1066,12 +1068,12 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm)
+ * removed from PT. This function is called here because it requires
+ * the radeon_vm::mutex to be locked and PT to be reserved
+ */
+- ret = amdgpu_vm_clear_freed(adev, new_vm);
++ ret = amdgpu_vm_clear_freed(adev, &new_vm->base);
+ if (ret != 0)
+ pr_err("amdgpu: Failed to amdgpu_vm_clear_freed\n");
+
+ /* Pin the PD directory */
+- pd = new_vm->page_directory;
++ pd = new_vm->base.page_directory;
+ amdgpu_bo_reserve(pd, true);
+ ret = try_pin_bo(pd, AMDGPU_GEM_DOMAIN_VRAM);
+ amdgpu_bo_unreserve(pd);
+@@ -1079,7 +1081,7 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm)
+ pr_err("amdkfd: Failed to pin PD\n");
+
+ pr_debug("amdgpu: created process vm with address 0x%llx\n",
+- amdgpu_bo_gpu_offset(new_vm->page_directory));
++ amdgpu_bo_gpu_offset(new_vm->base.page_directory));
+
+ return ret;
+ }
+--
+2.7.4
+