diff options
Diffstat (limited to 'mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c')
-rw-r--r-- | mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c | 129 |
1 files changed, 17 insertions, 112 deletions
diff --git a/mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c b/mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c index 0c315d0..56742d0 100644 --- a/mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c +++ b/mali_kbase/csf/mali_kbase_csf_cpu_queue_debugfs.c @@ -20,24 +20,12 @@ */ #include "mali_kbase_csf_cpu_queue_debugfs.h" -#include <mali_kbase.h> -#include <linux/seq_file.h> #if IS_ENABLED(CONFIG_DEBUG_FS) - -bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx, - struct base_csf_notification *req) -{ - if (atomic_cmpxchg(&kctx->csf.cpu_queue.dump_req_status, - BASE_CSF_CPU_QUEUE_DUMP_ISSUED, - BASE_CSF_CPU_QUEUE_DUMP_PENDING) != - BASE_CSF_CPU_QUEUE_DUMP_ISSUED) { - return false; - } - - req->type = BASE_CSF_NOTIFICATION_CPU_QUEUE_DUMP; - return true; -} +#include "mali_kbase_csf_cpu_queue.h" +#include "mali_kbase_csf_util.h" +#include <mali_kbase.h> +#include <linux/seq_file.h> /** * kbasep_csf_cpu_queue_debugfs_show() - Print cpu queue information for per context @@ -49,45 +37,18 @@ bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx, */ static int kbasep_csf_cpu_queue_debugfs_show(struct seq_file *file, void *data) { - struct kbase_context *kctx = file->private; - - mutex_lock(&kctx->csf.lock); - if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) != - BASE_CSF_CPU_QUEUE_DUMP_COMPLETE) { - seq_puts(file, "Dump request already started! (try again)\n"); - mutex_unlock(&kctx->csf.lock); - return -EBUSY; + struct kbasep_printer *kbpr; + struct kbase_context *const kctx = file->private; + int ret = -EINVAL; + CSTD_UNUSED(data); + + kbpr = kbasep_printer_file_init(file); + if (kbpr != NULL) { + ret = kbasep_csf_cpu_queue_dump_print(kctx, kbpr); + kbasep_printer_term(kbpr); } - atomic_set(&kctx->csf.cpu_queue.dump_req_status, BASE_CSF_CPU_QUEUE_DUMP_ISSUED); - init_completion(&kctx->csf.cpu_queue.dump_cmp); - kbase_event_wakeup(kctx); - mutex_unlock(&kctx->csf.lock); - - seq_puts(file, - "CPU Queues table (version:v" __stringify(MALI_CSF_CPU_QUEUE_DEBUGFS_VERSION) "):\n"); - - wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, - msecs_to_jiffies(3000)); - - mutex_lock(&kctx->csf.lock); - if (kctx->csf.cpu_queue.buffer) { - WARN_ON(atomic_read(&kctx->csf.cpu_queue.dump_req_status) != - BASE_CSF_CPU_QUEUE_DUMP_PENDING); - - seq_printf(file, "%s\n", kctx->csf.cpu_queue.buffer); - - kfree(kctx->csf.cpu_queue.buffer); - kctx->csf.cpu_queue.buffer = NULL; - kctx->csf.cpu_queue.buffer_size = 0; - } else - seq_puts(file, "Dump error! (time out)\n"); - - atomic_set(&kctx->csf.cpu_queue.dump_req_status, - BASE_CSF_CPU_QUEUE_DUMP_COMPLETE); - - mutex_unlock(&kctx->csf.lock); - return 0; + return ret; } static int kbasep_csf_cpu_queue_debugfs_open(struct inode *in, struct file *file) @@ -109,59 +70,14 @@ void kbase_csf_cpu_queue_debugfs_init(struct kbase_context *kctx) if (WARN_ON(!kctx || IS_ERR_OR_NULL(kctx->kctx_dentry))) return; - file = debugfs_create_file("cpu_queue", 0444, kctx->kctx_dentry, - kctx, &kbasep_csf_cpu_queue_debugfs_fops); + file = debugfs_create_file("cpu_queue", 0444, kctx->kctx_dentry, kctx, + &kbasep_csf_cpu_queue_debugfs_fops); if (IS_ERR_OR_NULL(file)) { - dev_warn(kctx->kbdev->dev, - "Unable to create cpu queue debugfs entry"); + dev_warn(kctx->kbdev->dev, "Unable to create cpu queue debugfs entry"); } - - kctx->csf.cpu_queue.buffer = NULL; - kctx->csf.cpu_queue.buffer_size = 0; - atomic_set(&kctx->csf.cpu_queue.dump_req_status, - BASE_CSF_CPU_QUEUE_DUMP_COMPLETE); } -int kbase_csf_cpu_queue_dump(struct kbase_context *kctx, - u64 buffer, size_t buf_size) -{ - size_t alloc_size = buf_size; - char *dump_buffer; - - if (!buffer || !alloc_size) - return 0; - - alloc_size = (alloc_size + PAGE_SIZE) & ~(PAGE_SIZE - 1); - dump_buffer = kzalloc(alloc_size, GFP_KERNEL); - if (!dump_buffer) - return -ENOMEM; - - WARN_ON(kctx->csf.cpu_queue.buffer != NULL); - - if (copy_from_user(dump_buffer, - u64_to_user_ptr(buffer), - buf_size)) { - kfree(dump_buffer); - return -EFAULT; - } - - mutex_lock(&kctx->csf.lock); - - kfree(kctx->csf.cpu_queue.buffer); - - if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) == - BASE_CSF_CPU_QUEUE_DUMP_PENDING) { - kctx->csf.cpu_queue.buffer = dump_buffer; - kctx->csf.cpu_queue.buffer_size = buf_size; - complete_all(&kctx->csf.cpu_queue.dump_cmp); - } else - kfree(dump_buffer); - - mutex_unlock(&kctx->csf.lock); - - return 0; -} #else /* * Stub functions for when debugfs is disabled @@ -170,15 +86,4 @@ void kbase_csf_cpu_queue_debugfs_init(struct kbase_context *kctx) { } -bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx, - struct base_csf_notification *req) -{ - return false; -} - -int kbase_csf_cpu_queue_dump(struct kbase_context *kctx, - u64 buffer, size_t buf_size) -{ - return 0; -} #endif /* CONFIG_DEBUG_FS */ |