diff options
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.patch | 128 |
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 + |