aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch326
1 files changed, 0 insertions, 326 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch
deleted file mode 100644
index ca0eb1a4..00000000
--- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1294-drm-amdkfd-Add-wavefront-context-save-state-retrieva.patch
+++ /dev/null
@@ -1,326 +0,0 @@
-From 73e2c7822b620b3ba71b33c5fca52fed217640b0 Mon Sep 17 00:00:00 2001
-From: Jay Cornwall <Jay.Cornwall@amd.com>
-Date: Tue, 2 May 2017 17:39:37 -0500
-Subject: [PATCH 1294/4131] drm/amdkfd: Add wavefront context save state
- retrieval ioctl
-
-Wavefront context save data is of interest to userspace clients for
-debugging static wavefront state. The MQD contains two parameters
-required to parse the control stack and the control stack itself
-is kept in the MQD from gfx9 onwards.
-
-Add an ioctl to fetch the context save area and control stack offsets
-and to copy the control stack to a userspace address if it is kept in
-the MQD.
-
-Change-Id: I51145096e07e99511a9af67d5aa5cda28f344751
-Signed-off-by: Jay Cornwall <Jay.Cornwall@amd.com>
-Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
----
- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 23 +++++++++++++-
- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 37 ++++++++++++++++++++++
- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | 8 +++++
- drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 8 +++++
- drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c | 24 ++++++++++++++
- drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 23 ++++++++++++++
- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 5 +++
- .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 22 +++++++++++++
- 8 files changed, 149 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
-index 72c3109..fe7de4c 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
-@@ -2000,6 +2000,24 @@ static int kfd_ioctl_cross_memory_copy(struct file *filep,
- }
- #endif
-
-+static int kfd_ioctl_get_queue_wave_state(struct file *filep,
-+ struct kfd_process *p, void *data)
-+{
-+ struct kfd_ioctl_get_queue_wave_state_args *args = data;
-+ int r;
-+
-+ down_read(&p->lock);
-+
-+ r = pqm_get_wave_state(&p->pqm, args->queue_id,
-+ (void __user *)args->ctl_stack_address,
-+ &args->ctl_stack_used_size,
-+ &args->save_area_used_size);
-+
-+ up_read(&p->lock);
-+
-+ return r;
-+}
-+
- #define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
- [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
- .cmd_drv = 0, .name = #ioctl}
-@@ -2100,7 +2118,10 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
- kfd_ioctl_ipc_export_handle, 0),
-
- AMDKFD_IOCTL_DEF(AMDKFD_IOC_CROSS_MEMORY_COPY,
-- kfd_ioctl_cross_memory_copy, 0)
-+ kfd_ioctl_cross_memory_copy, 0),
-+
-+ AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_QUEUE_WAVE_STATE,
-+ kfd_ioctl_get_queue_wave_state, 0)
-
- };
-
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
-index 172eddc..1c1535e 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
-@@ -1441,6 +1441,41 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm,
- return retval;
- }
-
-+static int get_wave_state(struct device_queue_manager *dqm,
-+ struct queue *q,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size)
-+{
-+ struct mqd_manager *mqd;
-+ int r;
-+
-+ mutex_lock(&dqm->lock);
-+
-+ if (q->properties.type != KFD_QUEUE_TYPE_COMPUTE ||
-+ q->properties.is_active || !q->device->cwsr_enabled) {
-+ r = -EINVAL;
-+ goto dqm_unlock;
-+ }
-+
-+ mqd = dqm->ops.get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE);
-+ if (!mqd) {
-+ r = -ENOMEM;
-+ goto dqm_unlock;
-+ }
-+
-+ if (!mqd->get_wave_state) {
-+ r = -EINVAL;
-+ goto dqm_unlock;
-+ }
-+
-+ r = mqd->get_wave_state(mqd, q->mqd, ctl_stack, ctl_stack_used_size,
-+ save_area_used_size);
-+
-+dqm_unlock:
-+ mutex_unlock(&dqm->lock);
-+ return r;
-+}
-
- static int process_termination_cpsch(struct device_queue_manager *dqm,
- struct qcm_process_device *qpd)
-@@ -1545,6 +1580,7 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev)
- dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
- dqm->ops.set_trap_handler = set_trap_handler;
- dqm->ops.process_termination = process_termination_cpsch;
-+ dqm->ops.get_wave_state = get_wave_state;
- break;
- case KFD_SCHED_POLICY_NO_HWS:
- /* initialize dqm for no cp scheduling */
-@@ -1561,6 +1597,7 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev)
- dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
- dqm->ops.set_trap_handler = set_trap_handler;
- dqm->ops.process_termination = process_termination_nocpsch;
-+ dqm->ops.get_wave_state = get_wave_state;
- break;
- default:
- pr_err("Invalid scheduling policy %d\n", dqm->sched_policy);
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
-index 113ac1f..841283a 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
-@@ -85,6 +85,8 @@ struct device_process_node {
- *
- * @process_termination: Clears all process queues belongs to that device.
- *
-+ * @get_wave_state: Retrieves context save state and optionally copies the
-+ * control stack, if kept in the MQD, to the given userspace address.
- */
-
- struct device_queue_manager_ops {
-@@ -136,6 +138,12 @@ struct device_queue_manager_ops {
-
- int (*process_termination)(struct device_queue_manager *dqm,
- struct qcm_process_device *qpd);
-+
-+ int (*get_wave_state)(struct device_queue_manager *dqm,
-+ struct queue *q,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size);
- };
-
- struct device_queue_manager_asic_ops {
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
-index 6f33b79..dcaeda8 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
-@@ -43,6 +43,9 @@
- *
- * @is_occupied: Checks if the relevant HQD slot is occupied.
- *
-+ * @get_wave_state: Retrieves context save state and optionally copies the
-+ * control stack, if kept in the MQD, to the given userspace address.
-+ *
- * @mqd_mutex: Mqd manager mutex.
- *
- * @dev: The kfd device structure coupled with this module.
-@@ -86,6 +89,11 @@ struct mqd_manager {
- uint64_t queue_address, uint32_t pipe_id,
- uint32_t queue_id);
-
-+ int (*get_wave_state)(struct mqd_manager *mm, void *mqd,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size);
-+
- #if defined(CONFIG_DEBUG_FS)
- int (*debugfs_show_mqd)(struct seq_file *m, void *data);
- #endif
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
-index 7327cda..1e956ff 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
-@@ -23,6 +23,7 @@
-
- #include <linux/printk.h>
- #include <linux/slab.h>
-+#include <linux/uaccess.h>
- #include "kfd_priv.h"
- #include "kfd_mqd_manager.h"
- #include "v9_structs.h"
-@@ -292,6 +293,28 @@ static bool is_occupied(struct mqd_manager *mm, void *mqd,
- pipe_id, queue_id);
- }
-
-+static int get_wave_state(struct mqd_manager *mm, void *mqd,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size)
-+{
-+ struct v9_mqd *m;
-+
-+ /* Control stack is located one page after MQD. */
-+ void *mqd_ctl_stack = (void *)((uintptr_t)mqd + PAGE_SIZE);
-+
-+ m = get_mqd(mqd);
-+
-+ *ctl_stack_used_size = m->cp_hqd_cntl_stack_size -
-+ m->cp_hqd_cntl_stack_offset;
-+ *save_area_used_size = m->cp_hqd_wg_state_offset;
-+
-+ if (copy_to_user(ctl_stack, mqd_ctl_stack, m->cp_hqd_cntl_stack_size))
-+ return -EFAULT;
-+
-+ return 0;
-+}
-+
- static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
- struct queue_properties *q)
-@@ -468,6 +491,7 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
- mqd->update_mqd = update_mqd;
- mqd->destroy_mqd = destroy_mqd;
- mqd->is_occupied = is_occupied;
-+ mqd->get_wave_state = get_wave_state;
- #if defined(CONFIG_DEBUG_FS)
- mqd->debugfs_show_mqd = debugfs_show_mqd;
- #endif
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
-index c1d35f4..670bbba9 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
-@@ -309,6 +309,28 @@ static bool is_occupied(struct mqd_manager *mm, void *mqd,
- pipe_id, queue_id);
- }
-
-+static int get_wave_state(struct mqd_manager *mm, void *mqd,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size)
-+{
-+ struct vi_mqd *m;
-+
-+ m = get_mqd(mqd);
-+
-+ *ctl_stack_used_size = m->cp_hqd_cntl_stack_size -
-+ m->cp_hqd_cntl_stack_offset;
-+ *save_area_used_size = m->cp_hqd_wg_state_offset -
-+ m->cp_hqd_cntl_stack_size;
-+
-+ /* Control stack is not copied to user mode for GFXv8 because
-+ * it's part of the context save area that is already
-+ * accessible to user mode
-+ */
-+
-+ return 0;
-+}
-+
- static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
- struct queue_properties *q)
-@@ -480,6 +502,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
- mqd->update_mqd = update_mqd;
- mqd->destroy_mqd = destroy_mqd;
- mqd->is_occupied = is_occupied;
-+ mqd->get_wave_state = get_wave_state;
- #if defined(CONFIG_DEBUG_FS)
- mqd->debugfs_show_mqd = debugfs_show_mqd;
- #endif
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-index 9777543..ad84996 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-@@ -935,6 +935,11 @@ int pqm_set_cu_mask(struct process_queue_manager *pqm, unsigned int qid,
- struct queue_properties *p);
- struct kernel_queue *pqm_get_kernel_queue(struct process_queue_manager *pqm,
- unsigned int qid);
-+int pqm_get_wave_state(struct process_queue_manager *pqm,
-+ unsigned int qid,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size);
- int kgd2kfd_quiesce_mm(struct kfd_dev *kfd, struct mm_struct *mm);
- int kgd2kfd_resume_mm(struct kfd_dev *kfd, struct mm_struct *mm);
-
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
-index f249f96..0f82684 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
-@@ -421,6 +421,28 @@ struct kernel_queue *pqm_get_kernel_queue(
- return NULL;
- }
-
-+int pqm_get_wave_state(struct process_queue_manager *pqm,
-+ unsigned int qid,
-+ void __user *ctl_stack,
-+ u32 *ctl_stack_used_size,
-+ u32 *save_area_used_size)
-+{
-+ struct process_queue_node *pqn;
-+
-+ pqn = get_queue_by_qid(pqm, qid);
-+ if (!pqn) {
-+ pr_debug("amdkfd: No queue %d exists for operation\n",
-+ qid);
-+ return -EFAULT;
-+ }
-+
-+ return pqn->q->device->dqm->ops.get_wave_state(pqn->q->device->dqm,
-+ pqn->q,
-+ ctl_stack,
-+ ctl_stack_used_size,
-+ save_area_used_size);
-+}
-+
- #if defined(CONFIG_DEBUG_FS)
-
- int pqm_debugfs_mqds(struct seq_file *m, void *data)
---
-2.7.4
-