diff options
Diffstat (limited to 'drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c')
-rw-r--r-- | drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c | 68 |
1 files changed, 18 insertions, 50 deletions
diff --git a/drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c b/drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c index 83c5c37942bd..f3e426f9539b 100644 --- a/drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c +++ b/drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c @@ -1,6 +1,6 @@ /* * - * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -15,71 +15,51 @@ -#include <mali_kbase.h> -#include <linux/spinlock.h> +#include "mali_kbase_debug_job_fault.h" #ifdef CONFIG_DEBUG_FS -static bool kbase_is_job_fault_event_pending(struct kbase_device *kbdev) +static bool kbase_is_job_fault_event_pending(struct list_head *event_list) { - struct list_head *event_list = &kbdev->job_fault_event_list; - unsigned long flags; - bool ret; + bool ret; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); - ret = !list_empty(event_list); - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); + ret = (!list_empty(event_list)); return ret; } -static bool kbase_ctx_has_no_event_pending(struct kbase_context *kctx) +static bool kbase_ctx_has_no_event_pending( + struct kbase_context *kctx, struct list_head *event_list) { - struct kbase_device *kbdev = kctx->kbdev; - struct list_head *event_list = &kctx->kbdev->job_fault_event_list; struct base_job_fault_event *event; - unsigned long flags; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); - if (list_empty(event_list)) { - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); + if (list_empty(event_list)) return true; - } list_for_each_entry(event, event_list, head) { - if (event->katom->kctx == kctx) { - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, - flags); + if (event->katom->kctx == kctx) return false; - } } - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); - return true; + return false; } /* wait until the fault happen and copy the event */ static int kbase_job_fault_event_wait(struct kbase_device *kbdev, + struct list_head *event_list, struct base_job_fault_event *event) { - struct list_head *event_list = &kbdev->job_fault_event_list; struct base_job_fault_event *event_in; - unsigned long flags; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); if (list_empty(event_list)) { - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); if (wait_event_interruptible(kbdev->job_fault_wq, - kbase_is_job_fault_event_pending(kbdev))) + kbase_is_job_fault_event_pending(event_list))) return -ERESTARTSYS; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); } event_in = list_entry(event_list->next, struct base_job_fault_event, head); + event->event_code = event_in->event_code; event->katom = event_in->katom; - - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); - return 0; } @@ -122,16 +102,12 @@ static void kbase_job_fault_resume_event_cleanup(struct kbase_context *kctx) static void kbase_job_fault_event_cleanup(struct kbase_device *kbdev) { struct list_head *event_list = &kbdev->job_fault_event_list; - unsigned long flags; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); while (!list_empty(event_list)) { + kbase_job_fault_event_dequeue(kbdev, event_list); - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); wake_up(&kbdev->job_fault_resume_wq); - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); } - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); } static void kbase_job_fault_resume_worker(struct work_struct *data) @@ -153,7 +129,8 @@ static void kbase_job_fault_resume_worker(struct work_struct *data) * atoms belong to the same context. */ wait_event(kctx->kbdev->job_fault_resume_wq, - kbase_ctx_has_no_event_pending(kctx)); + kbase_ctx_has_no_event_pending(kctx, + &kctx->kbdev->job_fault_event_list)); atomic_set(&kctx->job_fault_count, 0); kbase_jd_done_worker(&katom->work); @@ -189,12 +166,9 @@ static void kbase_job_fault_event_post(struct kbase_device *kbdev, struct kbase_jd_atom *katom, u32 completion_code) { struct base_job_fault_event *event; - unsigned long flags; - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); event = kbase_job_fault_event_queue(&kbdev->job_fault_event_list, katom, completion_code); - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); wake_up_interruptible(&kbdev->job_fault_wq); @@ -319,10 +293,9 @@ static void *debug_job_fault_start(struct seq_file *m, loff_t *pos) */ if (*pos == 0) { event = kmalloc(sizeof(*event), GFP_KERNEL); - if (!event) - return NULL; event->reg_offset = 0; - if (kbase_job_fault_event_wait(kbdev, event)) { + if (kbase_job_fault_event_wait(kbdev, + &kbdev->job_fault_event_list, event)) { kfree(event); return NULL; } @@ -356,15 +329,11 @@ static void debug_job_fault_stop(struct seq_file *m, void *v) dev_info(kbdev->dev, "debug job fault seq stop stage 1"); } else { - unsigned long flags; - - spin_lock_irqsave(&kbdev->job_fault_event_lock, flags); if (!list_empty(&kbdev->job_fault_event_list)) { kbase_job_fault_event_dequeue(kbdev, &kbdev->job_fault_event_list); wake_up(&kbdev->job_fault_resume_wq); } - spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags); dev_info(kbdev->dev, "debug job fault seq stop stage 2"); } @@ -435,7 +404,6 @@ int kbase_debug_job_fault_dev_init(struct kbase_device *kbdev) init_waitqueue_head(&(kbdev->job_fault_wq)); init_waitqueue_head(&(kbdev->job_fault_resume_wq)); - spin_lock_init(&kbdev->job_fault_event_lock); kbdev->job_fault_resume_workq = alloc_workqueue( "kbase_job_fault_resume_work_queue", WQ_MEM_RECLAIM, 1); |