diff options
Diffstat (limited to 'mali_kbase')
-rw-r--r-- | mali_kbase/mali_kbase_config.c | 18 | ||||
-rw-r--r-- | mali_kbase/mali_kbase_config.h | 36 | ||||
-rw-r--r-- | mali_kbase/mali_kbase_ctx_sched.c | 2 |
3 files changed, 56 insertions, 0 deletions
diff --git a/mali_kbase/mali_kbase_config.c b/mali_kbase/mali_kbase_config.c index 32f404b..72080a7 100644 --- a/mali_kbase/mali_kbase_config.c +++ b/mali_kbase/mali_kbase_config.c @@ -83,6 +83,24 @@ void kbasep_platform_context_term(struct kbase_context *kctx) platform_funcs_p->platform_handler_context_term_func(kctx); } +void kbasep_platform_context_active(struct kbase_context *kctx) +{ + struct kbase_platform_funcs_conf *platform_funcs_p; + + platform_funcs_p = (struct kbase_platform_funcs_conf*)PLATFORM_FUNCS; + if (platform_funcs_p && platform_funcs_p->platform_handler_context_active) + platform_funcs_p->platform_handler_context_active(kctx); +} + +void kbasep_platform_context_idle(struct kbase_context *kctx) +{ + struct kbase_platform_funcs_conf *platform_funcs_p; + + platform_funcs_p = (struct kbase_platform_funcs_conf*)PLATFORM_FUNCS; + if (platform_funcs_p && platform_funcs_p->platform_handler_context_idle) + platform_funcs_p->platform_handler_context_idle(kctx); +} + void kbasep_platform_event_work_begin(void *param) { struct kbase_platform_funcs_conf *platform_funcs_p; diff --git a/mali_kbase/mali_kbase_config.h b/mali_kbase/mali_kbase_config.h index c7a6b32..7f6d3ed 100644 --- a/mali_kbase/mali_kbase_config.h +++ b/mali_kbase/mali_kbase_config.h @@ -121,6 +121,23 @@ struct kbase_platform_funcs_conf { */ void (*platform_handler_context_term_func)(struct kbase_context *kctx); /** + * platform_handler_context_active - Platform specific handler, called when a context is + * (re)activated. + * + * @kctx: kbase_context pointer + * + * Context: Atomic context + */ + void (*platform_handler_context_active)(struct kbase_context *kctx); + /** + * platform_handler_context_idle - Platform specific handler, called when a context is idled. + * + * @kctx: kbase_context pointer + * + * Context: Atomic context + */ + void (*platform_handler_context_idle)(struct kbase_context *kctx); + /** * platform_handler_work_begin_func - Platform specific handler whose * function changes depending on the * backend used. @@ -565,6 +582,25 @@ int kbasep_platform_context_init(struct kbase_context *kctx); void kbasep_platform_context_term(struct kbase_context *kctx); /** + * kbasep_platform_context_active - Platform specific callback, called when a context is + * (re)activated. + * + * @kctx: kbase_context pointer + * + * Function calls a platform defined routine if specified in the configuration attributes. + */ +void kbasep_platform_context_active(struct kbase_context *kctx); + +/** + * kbasep_platform_context_idle - Platform specific callback, called when a context is idled. + * + * @kctx: kbase_context pointer + * + * Function calls a platform defined routine if specified in the configuration attributes. + */ +void kbasep_platform_context_idle(struct kbase_context *kctx); + +/** * kbasep_platform_event_work_begin - Platform specific callback whose function * changes depending on the backend used. * Signals that a unit of work has started diff --git a/mali_kbase/mali_kbase_ctx_sched.c b/mali_kbase/mali_kbase_ctx_sched.c index 41f8c9c..8c3d52e 100644 --- a/mali_kbase/mali_kbase_ctx_sched.c +++ b/mali_kbase/mali_kbase_ctx_sched.c @@ -118,6 +118,7 @@ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx) if (free_as >= 0) { kbdev->as_free &= ~(1u << free_as); + kbasep_platform_context_active(kctx); /* Only program the MMU if the context has not been * assigned the same address space before. */ @@ -185,6 +186,7 @@ void kbase_ctx_sched_release_ctx(struct kbase_context *kctx) new_ref_count = atomic_dec_return(&kctx->refcount); if (new_ref_count == 0) { + kbasep_platform_context_idle(kctx); if (likely((kctx->as_nr >= 0) && (kctx->as_nr < BASE_MAX_NR_AS))) { kbdev->as_free |= (1u << kctx->as_nr); if (kbase_ctx_flag(kctx, KCTX_AS_DISABLED_ON_FAULT)) { |