summaryrefslogtreecommitdiff
path: root/drivers/gpu/arm/midgard/mali_kbase_debug_job_fault.c
diff options
context:
space:
mode:
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.c68
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);