diff options
author | chenzhen <chenzhen@rock-chips.com> | 2015-09-09 09:28:51 +0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@rock-chips.com> | 2016-03-08 17:31:21 +0800 |
commit | a9f9e723bcea23cb9a7ca5bfadf3d3e7932d81c6 (patch) | |
tree | a69704e31f21380e42f4a51e55e8dc882d12a558 /drivers/gpu/arm/midgard/mali_kbase_event.c | |
parent | 504990202432113cb29513925cd89762e6d390d2 (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.c | 69 |
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) |