diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0135-drm-amdkfd-Implement-un-register-debugger-IOCTLs.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0135-drm-amdkfd-Implement-un-register-debugger-IOCTLs.patch | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0135-drm-amdkfd-Implement-un-register-debugger-IOCTLs.patch b/common/recipes-kernel/linux/files/0135-drm-amdkfd-Implement-un-register-debugger-IOCTLs.patch new file mode 100644 index 00000000..999f4af5 --- /dev/null +++ b/common/recipes-kernel/linux/files/0135-drm-amdkfd-Implement-un-register-debugger-IOCTLs.patch @@ -0,0 +1,113 @@ +From 037ed9a2ac262e496bb0ddc924895e5f72969961 Mon Sep 17 00:00:00 2001 +From: Yair Shachar <yair.shachar@amd.com> +Date: Wed, 20 May 2015 14:08:55 +0300 +Subject: [PATCH 0135/1050] drm/amdkfd: Implement (un)register debugger IOCTLs + +v2: rename get_dbgmgr_mutex to kfd_get_dbgmgr_mutex to namespace it + +Signed-off-by: Yair Shachar <yair.shachar@amd.com> +Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 72 +++++++++++++++++++++++++++++++- + 1 file changed, 70 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +index b358e91..54a3e29 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +@@ -35,6 +35,7 @@ + #include <asm/processor.h> + #include "kfd_priv.h" + #include "kfd_device_queue_manager.h" ++#include "kfd_dbgmgr.h" + + static long kfd_ioctl(struct file *, unsigned int, unsigned long); + static int kfd_open(struct inode *, struct file *); +@@ -435,7 +436,53 @@ out: + static int kfd_ioctl_dbg_register(struct file *filep, + struct kfd_process *p, void *data) + { +- long status = -EFAULT; ++ struct kfd_ioctl_dbg_register_args *args = data; ++ struct kfd_dev *dev; ++ struct kfd_dbgmgr *dbgmgr_ptr; ++ struct kfd_process_device *pdd; ++ bool create_ok; ++ long status = 0; ++ ++ dev = kfd_device_by_id(args->gpu_id); ++ if (dev == NULL) ++ return -EINVAL; ++ ++ if (dev->device_info->asic_family == CHIP_CARRIZO) { ++ pr_debug("kfd_ioctl_dbg_register not supported on CZ\n"); ++ return -EINVAL; ++ } ++ ++ mutex_lock(kfd_get_dbgmgr_mutex()); ++ mutex_lock(&p->mutex); ++ ++ /* ++ * make sure that we have pdd, if this the first queue created for ++ * this process ++ */ ++ pdd = kfd_bind_process_to_device(dev, p); ++ if (IS_ERR(pdd)) { ++ mutex_unlock(&p->mutex); ++ mutex_unlock(kfd_get_dbgmgr_mutex()); ++ return PTR_ERR(pdd); ++ } ++ ++ if (dev->dbgmgr == NULL) { ++ /* In case of a legal call, we have no dbgmgr yet */ ++ create_ok = kfd_dbgmgr_create(&dbgmgr_ptr, dev); ++ if (create_ok) { ++ status = kfd_dbgmgr_register(dbgmgr_ptr, p); ++ if (status != 0) ++ kfd_dbgmgr_destroy(dbgmgr_ptr); ++ else ++ dev->dbgmgr = dbgmgr_ptr; ++ } ++ } else { ++ pr_debug("debugger already registered\n"); ++ status = -EINVAL; ++ } ++ ++ mutex_unlock(&p->mutex); ++ mutex_unlock(kfd_get_dbgmgr_mutex()); + + return status; + } +@@ -443,7 +490,28 @@ static int kfd_ioctl_dbg_register(struct file *filep, + static int kfd_ioctl_dbg_unrgesiter(struct file *filep, + struct kfd_process *p, void *data) + { +- long status = -EFAULT; ++ struct kfd_ioctl_dbg_unregister_args *args = data; ++ struct kfd_dev *dev; ++ long status; ++ ++ dev = kfd_device_by_id(args->gpu_id); ++ if (dev == NULL) ++ return -EINVAL; ++ ++ if (dev->device_info->asic_family == CHIP_CARRIZO) { ++ pr_debug("kfd_ioctl_dbg_unrgesiter not supported on CZ\n"); ++ return -EINVAL; ++ } ++ ++ mutex_lock(kfd_get_dbgmgr_mutex()); ++ ++ status = kfd_dbgmgr_unregister(dev->dbgmgr, p); ++ if (status == 0) { ++ kfd_dbgmgr_destroy(dev->dbgmgr); ++ dev->dbgmgr = NULL; ++ } ++ ++ mutex_unlock(kfd_get_dbgmgr_mutex()); + + return status; + } +-- +1.9.1 + |