aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch')
-rw-r--r--common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch b/common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch
new file mode 100644
index 00000000..767f5174
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0130-drm-amdkfd-add-H-W-debugger-IOCTL-set-definitions.patch
@@ -0,0 +1,128 @@
+From aef11009c45ca594c18ecc822f101e3908ca3fb4 Mon Sep 17 00:00:00 2001
+From: Yair Shachar <yair.shachar@amd.com>
+Date: Sun, 7 Dec 2014 17:05:22 +0200
+Subject: [PATCH 0130/1050] drm/amdkfd: add H/W debugger IOCTL set definitions
+
+This patch adds four new IOCTLs to amdkfd. These IOCTLs expose a H/W
+debugger functionality to the userspace.
+
+The IOCTLs are:
+
+- AMDKFD_IOC_DBG_REGISTER:
+
+The purpose of this IOCTL is to notify amdkfd that a process wants to use
+GPU debugging facilities on itself only.
+It is expected that this IOCTL would be called before any other H/W
+debugger requests are sent to amdkfd and for each GPU where the H/W
+debugging needs to be enabled. The use of this IOCTL ensures that only
+one instance of a debugger is active in the system.
+
+- AMDKFD_IOC_DBG_UNREGISTER:
+
+This IOCTL detaches the debugger/debugged process from the H/W
+Debug which was established by the AMDKFD_IOC_DBG_REGISTER IOCTL.
+
+- AMDKFD_IOC_DBG_ADDRESS_WATCH:
+
+This IOCTL allows to set different watchpoints with various conditions as
+indicated by the IOCTL's arguments. The available number of watchpoints
+is retrieved from topology. This operation is confined to the current
+debugged process, which was registered through AMDKFD_IOC_DBG_REGISTER.
+
+- AMDKFD_IOC_DBG_WAVE_CONTROL:
+
+This IOCTL allows to control a wavefront as indicated by the IOCTL's
+arguments. For example, you can halt/resume or kill either a
+single wavefront or a set of wavefronts. This operation is confined to
+the current debugged process, which was registered through
+AMDKFD_IOC_DBG_REGISTER.
+
+Because the arguments for the address watch IOCTL and wave control IOCTL
+are dynamic, meaning that they could vary in size, the userspace passes a
+pointer to a structure (in userspace) that contains the value of the
+arguments. The kernel driver is responsible to parse this structure and
+validate its contents.
+
+v2: change void* to uint64_t inside ioctl arguments
+
+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 | 54 ++++++++++++++++++++++++++++++++
+ 1 file changed, 54 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+index b2c6109..b358e91 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+@@ -432,6 +432,48 @@ out:
+ return err;
+ }
+
++static int kfd_ioctl_dbg_register(struct file *filep,
++ struct kfd_process *p, void *data)
++{
++ long status = -EFAULT;
++
++ return status;
++}
++
++static int kfd_ioctl_dbg_unrgesiter(struct file *filep,
++ struct kfd_process *p, void *data)
++{
++ long status = -EFAULT;
++
++ return status;
++}
++
++/*
++ * Parse and generate variable size data structure for address watch.
++ * Total size of the buffer and # watch points is limited in order
++ * to prevent kernel abuse. (no bearing to the much smaller HW limitation
++ * which is enforced by dbgdev module)
++ * please also note that the watch address itself are not "copied from user",
++ * since it be set into the HW in user mode values.
++ *
++ */
++static int kfd_ioctl_dbg_address_watch(struct file *filep,
++ struct kfd_process *p, void *data)
++{
++ long status = -EFAULT;
++
++ return status;
++}
++
++/* Parse and generate fixed size data structure for wave control */
++static int kfd_ioctl_dbg_wave_control(struct file *filep,
++ struct kfd_process *p, void *data)
++{
++ long status = -EFAULT;
++
++ return status;
++}
++
+ static int kfd_ioctl_get_clock_counters(struct file *filep,
+ struct kfd_process *p, void *data)
+ {
+@@ -612,6 +654,18 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
+
+ AMDKFD_IOCTL_DEF(AMDKFD_IOC_WAIT_EVENTS,
+ kfd_ioctl_wait_events, 0),
++
++ AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_REGISTER,
++ kfd_ioctl_dbg_register, 0),
++
++ AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_UNREGISTER,
++ kfd_ioctl_dbg_unrgesiter, 0),
++
++ AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_ADDRESS_WATCH,
++ kfd_ioctl_dbg_address_watch, 0),
++
++ AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_WAVE_CONTROL,
++ kfd_ioctl_dbg_wave_control, 0),
+ };
+
+ #define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
+--
+1.9.1
+