aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch390
1 files changed, 390 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch
new file mode 100644
index 00000000..564bf74b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1444-drm-amdkfd-Add-debugfs-entry-for-hexdump-of-MQDs.patch
@@ -0,0 +1,390 @@
+From c0fc257e0981bdb2ba1ddac05ee9a72eb58b183d Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Fri, 3 Jun 2016 20:32:53 -0400
+Subject: [PATCH 1444/4131] drm/amdkfd: Add debugfs entry for hexdump of MQDs
+
+This commit adds initial Debugfs support to KFD and implements a list
+of all queues by process with hexdumps of the MQDs. This can be
+useful for debugging CP scheduler problems.
+
+Change-Id: Ia63a65af8927e40d24a747d4c35b5907fe59c4b4
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: kalyan alle <kalyan.alle@amd.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_device.c | 56 +++++++++++++++++++
+ drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 4 ++
+ drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 27 ++++++++++
+ drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 25 +++++++++
+ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 13 +++++
+ drivers/gpu/drm/amd/amdkfd/kfd_process.c | 28 ++++++++++
+ .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 63 ++++++++++++++++++++++
+ 7 files changed, 216 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+index aae4e5a..64f41d6 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+@@ -25,6 +25,7 @@
+ #include <linux/pci.h>
+ #include <linux/slab.h>
+ #include <linux/highmem.h>
++#include <linux/debugfs.h>
+ #include "kfd_priv.h"
+ #include "kfd_device_queue_manager.h"
+ #include "kfd_pm4_headers.h"
+@@ -331,6 +332,58 @@ static void kfd_cwsr_fini(struct kfd_dev *kfd)
+ __free_pages(kfd->cwsr_pages, get_order(kfd->cwsr_size));
+ }
+
++#if defined(CONFIG_DEBUG_FS)
++
++static int kfd_debugfs_open(struct inode *inode, struct file *file)
++{
++ int (*show)(struct seq_file *, void *) = inode->i_private;
++
++ return single_open(file, show, NULL);
++}
++
++static const struct file_operations kfd_debugfs_fops = {
++ .owner = THIS_MODULE,
++ .open = kfd_debugfs_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = single_release,
++};
++
++static void kfd_debugfs_init(struct kfd_dev *kfd)
++{
++ struct dentry *ent;
++
++ kfd->debugfs_root = debugfs_create_dir("kfd", NULL);
++ if (kfd->debugfs_root == NULL ||
++ kfd->debugfs_root == ERR_PTR(-ENODEV)) {
++ dev_warn(kfd_device, "Failed to create kfd debugfs dir\n");
++ return;
++ }
++
++ ent = debugfs_create_file("mqds", S_IFREG | S_IRUGO, kfd->debugfs_root,
++ kfd_debugfs_mqds_by_process,
++ &kfd_debugfs_fops);
++ if (ent == NULL)
++ dev_warn(kfd_device, "Failed to create mqds in kfd debugfs\n");
++}
++
++static void kfd_debugfs_fini(struct kfd_dev *kfd)
++{
++ debugfs_remove_recursive(kfd->debugfs_root);
++}
++
++#else
++
++static void kfd_debugfs_init(struct kfd_dev *kfd)
++{
++}
++
++static void kfd_debugfs_fini(struct kfd_dev *kfd)
++{
++}
++
++#endif
++
+ bool kgd2kfd_device_init(struct kfd_dev *kfd,
+ const struct kgd2kfd_shared_resources *gpu_resources)
+ {
+@@ -439,6 +492,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
+ if (kfd_resume(kfd))
+ goto kfd_resume_error;
+
++ kfd_debugfs_init(kfd);
++
+ kfd->dbgmgr = NULL;
+
+ kfd->init_complete = true;
+@@ -472,6 +527,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
+ void kgd2kfd_device_exit(struct kfd_dev *kfd)
+ {
+ if (kfd->init_complete) {
++ kfd_debugfs_fini(kfd);
+ kgd2kfd_suspend(kfd);
+ kfd_cwsr_fini(kfd);
+ device_queue_manager_uninit(kfd->dqm);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
+index eb60192..574684f 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
+@@ -85,6 +85,10 @@ struct mqd_manager {
+ uint64_t queue_address, uint32_t pipe_id,
+ uint32_t queue_id);
+
++#if defined(CONFIG_DEBUG_FS)
++ int (*debugfs_show_mqd)(struct seq_file *m, void *data);
++#endif
++
+ struct mutex mqd_mutex;
+ struct kfd_dev *dev;
+ };
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
+index 85ba086..e565bee 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
+@@ -475,6 +475,24 @@ static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
+ return 0;
+ }
+
++#if defined(CONFIG_DEBUG_FS)
++
++static int debugfs_show_mqd(struct seq_file *m, void *data)
++{
++ seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4,
++ data, sizeof(struct cik_mqd), false);
++ return 0;
++}
++
++static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)
++{
++ seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4,
++ data, sizeof(struct cik_sdma_rlc_registers), false);
++ return 0;
++}
++
++#endif
++
+
+ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
+ struct kfd_dev *dev)
+@@ -501,6 +519,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
+ mqd->update_mqd = update_mqd;
+ mqd->destroy_mqd = destroy_mqd;
+ mqd->is_occupied = is_occupied;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd;
++#endif
+ break;
+ case KFD_MQD_TYPE_HIQ:
+ mqd->init_mqd = init_mqd_hiq;
+@@ -509,6 +530,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
+ mqd->update_mqd = update_mqd_hiq;
+ mqd->destroy_mqd = destroy_mqd;
+ mqd->is_occupied = is_occupied;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd;
++#endif
+ break;
+ case KFD_MQD_TYPE_SDMA:
+ mqd->init_mqd = init_mqd_sdma;
+@@ -517,6 +541,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
+ mqd->update_mqd = update_mqd_sdma;
+ mqd->destroy_mqd = destroy_mqd_sdma;
+ mqd->is_occupied = is_occupied_sdma;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;
++#endif
+ break;
+ default:
+ kfree(mqd);
+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 4260c2f..25c1269 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
+@@ -426,7 +426,23 @@ static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
+ return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->kgd, mqd);
+ }
+
++#if defined(CONFIG_DEBUG_FS)
+
++static int debugfs_show_mqd(struct seq_file *m, void *data)
++{
++ seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4,
++ data, sizeof(struct vi_mqd), false);
++ return 0;
++}
++
++static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)
++{
++ seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4,
++ data, sizeof(struct vi_sdma_mqd), false);
++ return 0;
++}
++
++#endif
+
+ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
+ struct kfd_dev *dev)
+@@ -453,6 +469,9 @@ 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;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd;
++#endif
+ break;
+ case KFD_MQD_TYPE_HIQ:
+ mqd->init_mqd = init_mqd_hiq;
+@@ -461,6 +480,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
+ mqd->update_mqd = update_mqd_hiq;
+ mqd->destroy_mqd = destroy_mqd;
+ mqd->is_occupied = is_occupied;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd;
++#endif
+ break;
+ case KFD_MQD_TYPE_SDMA:
+ mqd->init_mqd = init_mqd_sdma;
+@@ -469,6 +491,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
+ mqd->update_mqd = update_mqd_sdma;
+ mqd->destroy_mqd = destroy_mqd_sdma;
+ mqd->is_occupied = is_occupied_sdma;
++#if defined(CONFIG_DEBUG_FS)
++ mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;
++#endif
+ break;
+ default:
+ kfree(mqd);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+index 6727e4a..5e7b4d2 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+@@ -34,6 +34,7 @@
+ #include <linux/kfd_ioctl.h>
+ #include <linux/pid.h>
+ #include <linux/interval_tree.h>
++#include <linux/seq_file.h>
+ #include <kgd_kfd_interface.h>
+
+ #include <drm/amd_rdma.h>
+@@ -269,6 +270,11 @@ struct kfd_dev {
+ struct page *cwsr_pages;
+ uint32_t cwsr_size;
+ uint32_t tma_offset; /*Offset for TMA from the start of cwsr_mem*/
++
++ /* Debugfs */
++#if defined(CONFIG_DEBUG_FS)
++ struct dentry *debugfs_root;
++#endif
+ };
+
+ struct kfd_bo {
+@@ -911,5 +917,12 @@ int restore(struct kfd_dev *kfd);
+ int kfd_init_peer_direct(void);
+ void kfd_close_peer_direct(void);
+
++/* Debugfs */
++#if defined(CONFIG_DEBUG_FS)
++
++int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data);
++int pqm_debugfs_mqds(struct seq_file *m, void *data);
++
++#endif
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+index 3b312b7..ff1669b 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+@@ -994,3 +994,31 @@ int kfd_reserved_mem_mmap(struct kfd_process *process, struct vm_area_struct *vm
+ return ret;
+ }
+
++#if defined(CONFIG_DEBUG_FS)
++
++int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data)
++{
++ struct kfd_process *p;
++ unsigned int temp;
++ int r = 0;
++
++ int idx = srcu_read_lock(&kfd_processes_srcu);
++
++ hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
++ seq_printf(m, "Process %d PASID %d:\n",
++ p->lead_thread->tgid, p->pasid);
++
++ down_read(&p->lock);
++ r = pqm_debugfs_mqds(m, &p->pqm);
++ up_read(&p->lock);
++
++ if (r != 0)
++ break;
++ }
++
++ srcu_read_unlock(&kfd_processes_srcu, idx);
++
++ return r;
++}
++
++#endif
+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 fe3d7ff..cf08e824 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
+@@ -425,4 +425,67 @@ struct kernel_queue *pqm_get_kernel_queue(
+ return NULL;
+ }
+
++#if defined(CONFIG_DEBUG_FS)
+
++int pqm_debugfs_mqds(struct seq_file *m, void *data)
++{
++ struct process_queue_manager *pqm = data;
++ struct process_queue_node *pqn;
++ struct queue *q;
++ enum KFD_MQD_TYPE mqd_type;
++ struct mqd_manager *mqd_manager;
++ int r = 0;
++
++ list_for_each_entry(pqn, &pqm->queues, process_queue_list) {
++ if (pqn->q) {
++ q = pqn->q;
++ switch (q->properties.type) {
++ case KFD_QUEUE_TYPE_SDMA:
++ seq_printf(m, " SDMA queue on device %x\n",
++ q->device->id);
++ mqd_type = KFD_MQD_TYPE_SDMA;
++ break;
++ case KFD_QUEUE_TYPE_COMPUTE:
++ seq_printf(m, " Compute queue on device %x\n",
++ q->device->id);
++ mqd_type = KFD_MQD_TYPE_CP;
++ break;
++ default:
++ seq_printf(m,
++ " Bad user queue type %d on device %x\n",
++ q->properties.type, q->device->id);
++ continue;
++ }
++ mqd_manager = q->device->dqm->ops.get_mqd_manager(
++ q->device->dqm, mqd_type);
++ } else if (pqn->kq) {
++ q = pqn->kq->queue;
++ mqd_manager = pqn->kq->mqd;
++ switch (q->properties.type) {
++ case KFD_QUEUE_TYPE_DIQ:
++ seq_printf(m, " DIQ on device %x\n",
++ pqn->kq->dev->id);
++ mqd_type = KFD_MQD_TYPE_HIQ;
++ break;
++ default:
++ seq_printf(m,
++ " Bad kernel queue type %d on device %x\n",
++ q->properties.type,
++ pqn->kq->dev->id);
++ continue;
++ }
++ } else {
++ seq_printf(m,
++ " Weird: Queue node with neither kernel nor user queue\n");
++ continue;
++ }
++
++ r = mqd_manager->debugfs_show_mqd(m, q->mqd);
++ if (r != 0)
++ break;
++ }
++
++ return r;
++}
++
++#endif
+--
+2.7.4
+