summaryrefslogtreecommitdiff
path: root/drivers/gpu/arm/midgard
diff options
context:
space:
mode:
authorZhen Chen <chenzhen@rock-chips.com>2018-07-08 15:25:35 +0800
committerTao Huang <huangtao@rock-chips.com>2018-07-23 11:19:08 +0800
commit94f98e877ce40db83ee49789b81b463b6202b6fd (patch)
tree197990b67fa368577ff6e8586c71616d49845d84 /drivers/gpu/arm/midgard
parent7dc1699c5d1b1f323b641289eda3a4b9d7763b1b (diff)
Mali: midgard: add an error handling pass in kbase_mmu_interrupt()
For RK redmine Defect #168230. Change-Id: I3cd6544dd23b833138e4cc700a8f2cdd627ff592 Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
Diffstat (limited to 'drivers/gpu/arm/midgard')
-rw-r--r--drivers/gpu/arm/midgard/backend/gpu/mali_kbase_mmu_hw_direct.c6
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_ctx_sched.c7
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_ctx_sched.h5
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_js.c15
4 files changed, 26 insertions, 7 deletions
diff --git a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_mmu_hw_direct.c b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_mmu_hw_direct.c
index aa1817c8bca9..ba826184dd3f 100644
--- a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_mmu_hw_direct.c
+++ b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_mmu_hw_direct.c
@@ -14,6 +14,8 @@
*/
+/* #define ENABLE_DEBUG_LOG */
+#include "../../platform/rk/custom_log.h"
#include <linux/bitops.h>
@@ -164,6 +166,10 @@ void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat)
* the MMU is updated
*/
kctx = kbasep_js_runpool_lookup_ctx(kbdev, as_no);
+ if (!kctx) {
+ E("fail to lookup ctx, to break out.");
+ break;
+ }
/* find faulting address */
diff --git a/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.c b/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.c
index e2f7baabad43..ce004841403f 100644
--- a/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.c
+++ b/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.c
@@ -131,16 +131,21 @@ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx)
return kctx->as_nr;
}
-void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx)
+int kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx)
{
struct kbase_device *const kbdev = kctx->kbdev;
lockdep_assert_held(&kbdev->hwaccess_lock);
WARN_ON(atomic_read(&kctx->refcount) == 0);
+ if (atomic_read(&kctx->refcount) == 0)
+ return -1;
+
WARN_ON(kctx->as_nr == KBASEP_AS_NR_INVALID);
WARN_ON(kbdev->as_to_kctx[kctx->as_nr] != kctx);
atomic_inc(&kctx->refcount);
+
+ return 0;
}
void kbase_ctx_sched_release_ctx(struct kbase_context *kctx)
diff --git a/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.h b/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.h
index e55152547c31..47474fecc2a9 100644
--- a/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.h
+++ b/drivers/gpu/arm/midgard/mali_kbase_ctx_sched.h
@@ -87,8 +87,11 @@ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx);
* it doesn't get descheduled.
*
* The kbase_device::hwaccess_lock must be held whilst calling this function
+ * @return
+ * 若成功, 返回 0;
+ * 若 *kctx 状态异常, 返回 -1.
*/
-void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx);
+int kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx);
/* kbase_ctx_sched_release_ctx - Release a reference to the @ref kbase_context
*
diff --git a/drivers/gpu/arm/midgard/mali_kbase_js.c b/drivers/gpu/arm/midgard/mali_kbase_js.c
index b053ce1f22a1..10a1d5909bbe 100644
--- a/drivers/gpu/arm/midgard/mali_kbase_js.c
+++ b/drivers/gpu/arm/midgard/mali_kbase_js.c
@@ -13,9 +13,8 @@
*
*/
-
-
-
+/* #define ENABLE_DEBUG_LOG */
+#include "./platform/rk/custom_log.h"
/*
* Job Scheduler Implementation
@@ -1245,6 +1244,7 @@ bool kbasep_js_runpool_retain_ctx(struct kbase_device *kbdev,
struct kbase_context *kbasep_js_runpool_lookup_ctx(struct kbase_device *kbdev,
int as_nr)
{
+ int ret = 0;
unsigned long flags;
struct kbasep_js_device_data *js_devdata;
struct kbase_context *found_kctx = NULL;
@@ -1257,8 +1257,13 @@ struct kbase_context *kbasep_js_runpool_lookup_ctx(struct kbase_device *kbdev,
found_kctx = kbdev->as_to_kctx[as_nr];
- if (found_kctx != NULL)
- kbase_ctx_sched_retain_ctx_refcount(found_kctx);
+ if (found_kctx != NULL) {
+ ret = kbase_ctx_sched_retain_ctx_refcount(found_kctx);
+ if (ret != 0) {
+ E("fail to retain ctx_refcount, ret : %d.", ret);
+ found_kctx = NULL;
+ }
+ }
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);