aboutsummaryrefslogtreecommitdiffstats
path: root/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch')
-rw-r--r--meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch152
1 files changed, 152 insertions, 0 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch
new file mode 100644
index 00000000..021b7eb4
--- /dev/null
+++ b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1146-drm-amdkfd-Add-kfd-hqds-entry-to-debugfs.patch
@@ -0,0 +1,152 @@
+From 8b10b92a11358248a734793f4e364c19a8718a63 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Mon, 6 Jun 2016 21:25:04 -0400
+Subject: [PATCH 1146/4131] drm/amdkfd: Add kfd/hqds entry to debugfs
+
+This dumps all HQDs on all GPUs for KFD-controlled compute and
+SDMA RLC queues.
+
+Change-Id: I89f18a9f9b65ce1761ccef6bbc5712fbb71a001a
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_device.c | 6 +++
+ .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 61 ++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 +
+ drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 25 +++++++++
+ 4 files changed, 94 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+index 64f41d6..58ed979 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+@@ -365,6 +365,12 @@ static void kfd_debugfs_init(struct kfd_dev *kfd)
+ &kfd_debugfs_fops);
+ if (ent == NULL)
+ dev_warn(kfd_device, "Failed to create mqds in kfd debugfs\n");
++
++ ent = debugfs_create_file("hqds", S_IFREG | S_IRUGO, kfd->debugfs_root,
++ kfd_debugfs_hqds_by_device,
++ &kfd_debugfs_fops);
++ if (ent == NULL)
++ dev_warn(kfd_device, "Failed to create hqds in kfd debugfs\n");
+ }
+
+ static void kfd_debugfs_fini(struct kfd_dev *kfd)
+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 6f01393..d5672b9 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+@@ -1562,3 +1562,64 @@ int kfd_process_vm_fault(struct device_queue_manager *dqm,
+
+ return ret;
+ }
++
++static void seq_reg_dump(struct seq_file *m,
++ uint32_t (*dump)[2], uint32_t n_regs)
++{
++ uint32_t i, count;
++
++ for (i = 0, count = 0; i < n_regs; i++) {
++ if (count == 0 ||
++ dump[i-1][0] + sizeof(uint32_t) != dump[i][0]) {
++ seq_printf(m, "%s %08x: %08x",
++ i ? "\n" : "",
++ dump[i][0], dump[i][1]);
++ count = 7;
++ } else {
++ seq_printf(m, " %08x", dump[i][1]);
++ count--;
++ }
++ }
++
++ seq_puts(m, "\n");
++}
++
++int device_queue_manager_debugfs_hqds(struct seq_file *m, void *data)
++{
++ struct device_queue_manager *dqm = data;
++ uint32_t (*dump)[2], n_regs;
++ int pipe, queue;
++ int r = 0;
++
++ for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) {
++ for (queue = 0; queue < get_queues_per_pipe(dqm); queue++) {
++ r = dqm->dev->kfd2kgd->hqd_dump(
++ dqm->dev->kgd, pipe, queue, &dump, &n_regs);
++ if (r != 0)
++ break;
++
++ seq_printf(m, " CP Pipe %d, Queue %d\n",
++ pipe, queue);
++ seq_reg_dump(m, dump, n_regs);
++
++ kfree(dump);
++ }
++ }
++
++ for (pipe = 0; pipe < CIK_SDMA_ENGINE_NUM; pipe++) {
++ for (queue = 0; queue < CIK_SDMA_QUEUES_PER_ENGINE; queue++) {
++ r = dqm->dev->kfd2kgd->hqd_sdma_dump(
++ dqm->dev->kgd, pipe, queue, &dump, &n_regs);
++ if (r != 0)
++ break;
++
++ seq_printf(m, " SDMA Engine %d, RLC %d\n",
++ pipe, queue);
++ seq_reg_dump(m, dump, n_regs);
++
++ kfree(dump);
++ }
++ }
++
++ return r;
++}
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+index ee91cf7..80128e9 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+@@ -922,6 +922,8 @@ void kfd_close_peer_direct(void);
+
+ int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data);
+ int pqm_debugfs_mqds(struct seq_file *m, void *data);
++int kfd_debugfs_hqds_by_device(struct seq_file *m, void *data);
++int device_queue_manager_debugfs_hqds(struct seq_file *m, void *data);
+
+ #endif
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+index 8253036..13cd720 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+@@ -1250,3 +1250,28 @@ int kfd_get_proximity_domain(const struct pci_bus *bus)
+
+ return proximity_domain;
+ }
++
++int kfd_debugfs_hqds_by_device(struct seq_file *m, void *data)
++{
++ struct kfd_topology_device *dev;
++ unsigned i = 0;
++ int r = 0;
++
++ down_read(&topology_lock);
++
++ list_for_each_entry(dev, &topology_device_list, list) {
++ if (!dev->gpu) {
++ i++;
++ continue;
++ }
++
++ seq_printf(m, "Node %u, gpu_id %x:\n", i++, dev->gpu->id);
++ r = device_queue_manager_debugfs_hqds(m, dev->gpu->dqm);
++ if (r != 0)
++ break;
++ }
++
++ up_read(&topology_lock);
++
++ return r;
++}
+--
+2.7.4
+