summaryrefslogtreecommitdiff
path: root/drivers/gpu/arm/midgard/mali_kbase_event.c
diff options
context:
space:
mode:
authorchenzhen <chenzhen@rock-chips.com>2015-09-09 09:28:51 +0800
committerGerrit Code Review <gerrit@rock-chips.com>2016-03-08 17:31:21 +0800
commita9f9e723bcea23cb9a7ca5bfadf3d3e7932d81c6 (patch)
treea69704e31f21380e42f4a51e55e8dc882d12a558 /drivers/gpu/arm/midgard/mali_kbase_event.c
parent504990202432113cb29513925cd89762e6d390d2 (diff)
MALI: rockchip: upgrade to DDK r7p0-02rel0.
Conflicts: drivers/gpu/arm/midgard/mali_kbase_config.h Change-Id: I2d93041a0525ce6f1399c3a456c4c8f7be22243e Signed-off-by: chenzhen <chenzhen@rock-chips.com>
Diffstat (limited to 'drivers/gpu/arm/midgard/mali_kbase_event.c')
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_event.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/drivers/gpu/arm/midgard/mali_kbase_event.c b/drivers/gpu/arm/midgard/mali_kbase_event.c
index 784acecae173..25b30f0b976e 100644
--- a/drivers/gpu/arm/midgard/mali_kbase_event.c
+++ b/drivers/gpu/arm/midgard/mali_kbase_event.c
@@ -28,6 +28,8 @@ static struct base_jd_udata kbase_event_process(struct kbase_context *kctx, stru
{
struct base_jd_udata data;
+ lockdep_assert_held(&kctx->jctx.lock);
+
KBASE_DEBUG_ASSERT(kctx != NULL);
KBASE_DEBUG_ASSERT(katom != NULL);
KBASE_DEBUG_ASSERT(katom->status == KBASE_JD_ATOM_STATE_COMPLETED);
@@ -41,9 +43,7 @@ static struct base_jd_udata kbase_event_process(struct kbase_context *kctx, stru
kbase_tlstream_tl_del_atom(katom);
#endif
- mutex_lock(&kctx->jctx.lock);
katom->status = KBASE_JD_ATOM_STATE_UNUSED;
- mutex_unlock(&kctx->jctx.lock);
wake_up(&katom->completed);
@@ -98,32 +98,72 @@ int kbase_event_dequeue(struct kbase_context *ctx, struct base_jd_event_v2 *ueve
dev_dbg(ctx->kbdev->dev, "event dequeuing %p\n", (void *)atom);
uevent->event_code = atom->event_code;
uevent->atom_number = (atom - ctx->jctx.atoms);
+
+ if (atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
+ kbase_jd_free_external_resources(atom);
+
+ mutex_lock(&ctx->jctx.lock);
uevent->udata = kbase_event_process(ctx, atom);
+ mutex_unlock(&ctx->jctx.lock);
return 0;
}
KBASE_EXPORT_TEST_API(kbase_event_dequeue);
-static void kbase_event_post_worker(struct work_struct *data)
+/**
+ * kbase_event_process_noreport_worker - Worker for processing atoms that do not
+ * return an event but do have external
+ * resources
+ * @data: Work structure
+ */
+static void kbase_event_process_noreport_worker(struct work_struct *data)
{
- struct kbase_jd_atom *atom = container_of(data, struct kbase_jd_atom, work);
- struct kbase_context *ctx = atom->kctx;
+ struct kbase_jd_atom *katom = container_of(data, struct kbase_jd_atom,
+ work);
+ struct kbase_context *kctx = katom->kctx;
- if (atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
- kbase_jd_free_external_resources(atom);
+ if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
+ kbase_jd_free_external_resources(katom);
+ mutex_lock(&kctx->jctx.lock);
+ kbase_event_process(kctx, katom);
+ mutex_unlock(&kctx->jctx.lock);
+}
+
+/**
+ * kbase_event_process_noreport - Process atoms that do not return an event
+ * @kctx: Context pointer
+ * @katom: Atom to be processed
+ *
+ * Atoms that do not have external resources will be processed immediately.
+ * Atoms that do have external resources will be processed on a workqueue, in
+ * order to avoid locking issues.
+ */
+static void kbase_event_process_noreport(struct kbase_context *kctx,
+ struct kbase_jd_atom *katom)
+{
+ if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) {
+ INIT_WORK(&katom->work, kbase_event_process_noreport_worker);
+ queue_work(kctx->event_workq, &katom->work);
+ } else {
+ kbase_event_process(kctx, katom);
+ }
+}
+
+void kbase_event_post(struct kbase_context *ctx, struct kbase_jd_atom *atom)
+{
if (atom->core_req & BASE_JD_REQ_EVENT_ONLY_ON_FAILURE) {
if (atom->event_code == BASE_JD_EVENT_DONE) {
/* Don't report the event */
- kbase_event_process(ctx, atom);
+ kbase_event_process_noreport(ctx, atom);
return;
}
}
if (atom->core_req & BASEP_JD_REQ_EVENT_NEVER) {
/* Don't report the event */
- kbase_event_process(ctx, atom);
+ kbase_event_process_noreport(ctx, atom);
return;
}
@@ -133,17 +173,6 @@ static void kbase_event_post_worker(struct work_struct *data)
kbase_event_wakeup(ctx);
}
-
-void kbase_event_post(struct kbase_context *ctx, struct kbase_jd_atom *atom)
-{
- KBASE_DEBUG_ASSERT(ctx);
- KBASE_DEBUG_ASSERT(ctx->event_workq);
- KBASE_DEBUG_ASSERT(atom);
-
- INIT_WORK(&atom->work, kbase_event_post_worker);
- queue_work(ctx->event_workq, &atom->work);
-}
-
KBASE_EXPORT_TEST_API(kbase_event_post);
void kbase_event_close(struct kbase_context *kctx)