void mali_scheduler_terminate(void) { #if defined(MALI_SCHEDULER_USE_DEFERRED_PP_JOB_QUEUE) if (NULL != scheduler_pp_job_queue_lock) { _mali_osk_spinlock_irq_term(scheduler_pp_job_queue_lock); scheduler_pp_job_queue_lock = NULL; } if (NULL != scheduler_wq_pp_job_queue) { _mali_osk_wq_delete_work(scheduler_wq_pp_job_queue); scheduler_wq_pp_job_queue = NULL; } #endif /* defined(MALI_SCHEDULER_USE_DEFERRED_PP_JOB_QUEUE) */ #if defined(MALI_SCHEDULER_USE_DEFERRED_PP_JOB_DELETE) if (NULL != scheduler_pp_job_delete_lock) { _mali_osk_spinlock_irq_term(scheduler_pp_job_delete_lock); scheduler_pp_job_delete_lock = NULL; } if (NULL != scheduler_wq_pp_job_delete) { _mali_osk_wq_delete_work(scheduler_wq_pp_job_delete); scheduler_wq_pp_job_delete = NULL; } #endif /* defined(MALI_SCHEDULER_USE_DEFERRED_PP_JOB_DELETE) */ if (NULL != mali_scheduler_lock_obj) { _mali_osk_spinlock_irq_term(mali_scheduler_lock_obj); mali_scheduler_lock_obj = NULL; } _mali_osk_atomic_term(&mali_job_cache_order_autonumber); _mali_osk_atomic_term(&mali_job_id_autonumber); }
void mali_session_terminate(void) { if (NULL != mali_sessions_lock) { _mali_osk_spinlock_irq_term(mali_sessions_lock); mali_sessions_lock = NULL; } }
void mali_pm_domain_delete(struct mali_pm_domain *domain) { if (NULL == domain) { return; } _mali_osk_spinlock_irq_term(domain->lock); _mali_osk_free(domain); }
void mali_spinlock_reentrant_term(struct mali_spinlock_reentrant *spinlock) { MALI_DEBUG_ASSERT_POINTER(spinlock); MALI_DEBUG_ASSERT(0 == spinlock->counter && 0 == spinlock->owner); if (NULL != spinlock->lock) { _mali_osk_spinlock_irq_term(spinlock->lock); } _mali_osk_free(spinlock); }
void mali_soft_job_system_destroy(struct mali_soft_job_system *system) { MALI_DEBUG_ASSERT_POINTER(system); /* All jobs should be free at this point. */ MALI_DEBUG_ASSERT(_mali_osk_list_empty(&(system->jobs_used))); if (NULL != system) { if (NULL != system->lock) { _mali_osk_spinlock_irq_term(system->lock); } _mali_osk_free(system); } }
void mali_gp_scheduler_terminate(void) { MALI_DEBUG_ASSERT(MALI_GP_SLOT_STATE_IDLE == slot.state || MALI_GP_SLOT_STATE_DISABLED == slot.state); MALI_DEBUG_ASSERT_POINTER(slot.group); mali_group_delete(slot.group); _mali_osk_wait_queue_term(gp_scheduler_working_wait_queue); #if defined(MALI_UPPER_HALF_SCHEDULING) _mali_osk_spinlock_irq_term(gp_scheduler_lock); #else _mali_osk_spinlock_term(gp_scheduler_lock); #endif /* defined(MALI_UPPER_HALF_SCHEDULING) */ }
void mali_pm_terminate(void) { if (NULL != pm_work) { _mali_osk_wq_delete_work(pm_work); pm_work = NULL; } mali_pm_domain_terminate(); if (NULL != pm_lock_exec) { _mali_osk_mutex_term(pm_lock_exec); pm_lock_exec = NULL; } if (NULL != pm_lock_state) { _mali_osk_spinlock_irq_term(pm_lock_state); pm_lock_state = NULL; } }
_mali_osk_errcode_t mali_gp_scheduler_initialize(void) { u32 num_groups; u32 i; _mali_osk_errcode_t ret = _MALI_OSK_ERR_OK; #if defined(MALI_UPPER_HALF_SCHEDULING) gp_scheduler_lock = _mali_osk_spinlock_irq_init(_MALI_OSK_LOCKFLAG_ORDERED, _MALI_OSK_LOCK_ORDER_SCHEDULER); #else gp_scheduler_lock = _mali_osk_spinlock_init(_MALI_OSK_LOCKFLAG_ORDERED, _MALI_OSK_LOCK_ORDER_SCHEDULER); #endif /* defined(MALI_UPPER_HALF_SCHEDULING) */ if (NULL == gp_scheduler_lock) { ret = _MALI_OSK_ERR_NOMEM; goto cleanup; } gp_scheduler_working_wait_queue = _mali_osk_wait_queue_init(); if (NULL == gp_scheduler_working_wait_queue) { ret = _MALI_OSK_ERR_NOMEM; goto cleanup; } /* Find all the available GP cores */ num_groups = mali_group_get_glob_num_groups(); for (i = 0; i < num_groups; i++) { struct mali_group *group = mali_group_get_glob_group(i); MALI_DEBUG_ASSERT(NULL != group); if (NULL != group) { struct mali_gp_core *gp_core = mali_group_get_gp_core(group); if (NULL != gp_core) { if (0 == gp_version) { /* Retrieve GP version */ gp_version = mali_gp_core_get_version(gp_core); } slot.group = group; slot.state = MALI_GP_SLOT_STATE_IDLE; break; /* There is only one GP, no point in looking for more */ } } else { ret = _MALI_OSK_ERR_ITEM_NOT_FOUND; goto cleanup; } } return _MALI_OSK_ERR_OK; cleanup: if (NULL != gp_scheduler_working_wait_queue) { _mali_osk_wait_queue_term(gp_scheduler_working_wait_queue); gp_scheduler_working_wait_queue = NULL; } if (NULL != gp_scheduler_lock) { #if defined(MALI_UPPER_HALF_SCHEDULING) _mali_osk_spinlock_irq_term(gp_scheduler_lock); #else _mali_osk_spinlock_term(gp_scheduler_lock); #endif /* defined(MALI_UPPER_HALF_SCHEDULING) */ gp_scheduler_lock = NULL; } return ret; }
void mali_session_terminate(void) { _mali_osk_spinlock_irq_term(mali_sessions_lock); }