_mali_osk_errcode_t _mali_ukk_gp_start_job(void *ctx, _mali_uk_gp_start_job_s *uargs) { struct mali_session_data *session; struct mali_gp_job *job; MALI_DEBUG_ASSERT_POINTER(uargs); MALI_DEBUG_ASSERT_POINTER(ctx); session = (struct mali_session_data*)ctx; job = mali_gp_job_create(session, uargs, mali_scheduler_get_new_id()); if (NULL == job) { return _MALI_OSK_ERR_NOMEM; } #if PROFILING_SKIP_PP_AND_GP_JOBS #warning GP jobs will not be executed mali_gp_scheduler_return_job_to_user(job, MALI_TRUE); return _MALI_OSK_ERR_OK; #endif mali_pm_core_event(MALI_CORE_EVENT_GP_START); mali_gp_scheduler_lock(); _mali_osk_list_addtail(&job->list, &job_queue); mali_gp_scheduler_unlock(); MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Job %u (0x%08X) queued\n", mali_gp_job_get_id(job), job)); mali_gp_scheduler_schedule(); return _MALI_OSK_ERR_OK; }
void mali_gp_scheduler_do_schedule(void) { mali_gp_scheduler_lock(); mali_gp_scheduler_schedule(); mali_gp_scheduler_unlock(); }
void mali_gp_scheduler_resume(void) { mali_gp_scheduler_lock(); pause_count--; /* Decrement pause_count to allow scheduling again (if it reaches 0) */ mali_gp_scheduler_unlock(); if (0 == pause_count) { mali_gp_scheduler_schedule(); } }
void mali_gp_scheduler_resume(void) { mali_gp_scheduler_lock(); pause_count--; if (0 == pause_count) { mali_gp_scheduler_schedule(); } mali_gp_scheduler_unlock(); }
_mali_osk_errcode_t _mali_ukk_gp_start_job(_mali_uk_gp_start_job_s *args) { struct mali_session_data *session; struct mali_gp_job *job; MALI_DEBUG_ASSERT_POINTER(args); if (NULL == args->ctx) { return _MALI_OSK_ERR_INVALID_ARGS; } session = (struct mali_session_data*)args->ctx; if (NULL == session) { return _MALI_OSK_ERR_FAULT; } job = mali_gp_job_create(session, args, mali_scheduler_get_new_id()); if (NULL == job) { return _MALI_OSK_ERR_NOMEM; } #if PROFILING_SKIP_PP_AND_GP_JOBS #warning GP jobs will not be executed mali_gp_scheduler_return_job_to_user(job, MALI_TRUE); return _MALI_OSK_ERR_OK; #endif mali_gp_scheduler_lock(); _mali_osk_list_addtail(&job->list, &job_queue); MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Job %u (0x%08X) queued\n", mali_gp_job_get_id(job), job)); mali_gp_scheduler_schedule(); mali_gp_scheduler_unlock(); return _MALI_OSK_ERR_OK; }
void mali_gp_scheduler_job_done(struct mali_group *group, struct mali_gp_job *job, mali_bool success) { MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Job %u (0x%08X) completed (%s)\n", mali_gp_job_get_id(job), job, success ? "success" : "failure")); mali_gp_scheduler_lock(); /* Mark slot as idle again */ slot.state = MALI_GP_SLOT_STATE_IDLE; /* If paused, then this was the last job, so wake up sleeping workers */ if (pause_count > 0) { _mali_osk_wait_queue_wake_up(gp_scheduler_working_wait_queue); } else { mali_gp_scheduler_schedule(); } mali_gp_scheduler_unlock(); mali_gp_scheduler_return_job_to_user(job, success); }
void mali_gp_scheduler_job_done(struct mali_group *group, struct mali_gp_job *job, mali_bool success) { MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Job %u (0x%08X) completed (%s)\n", mali_gp_job_get_id(job), job, success ? "success" : "failure")); mali_gp_scheduler_lock(); slot.state = MALI_GP_SLOT_STATE_IDLE; if (pause_count > 0) { _mali_osk_wait_queue_wake_up(gp_scheduler_working_wait_queue); } else { mali_gp_scheduler_schedule(); } mali_gp_scheduler_unlock(); mali_gp_scheduler_return_job_to_user(job, success); }
_mali_osk_errcode_t _mali_ukk_gp_start_job(_mali_uk_gp_start_job_s *args) { struct mali_session_data *session; struct mali_gp_job *job; MALI_DEBUG_ASSERT_POINTER(args); if (NULL == args->ctx) { return _MALI_OSK_ERR_INVALID_ARGS; } session = (struct mali_session_data*)args->ctx; if (NULL == session) { return _MALI_OSK_ERR_FAULT; } job = mali_gp_job_create(session, args, mali_scheduler_get_new_id()); if (NULL == job) { return _MALI_OSK_ERR_NOMEM; } mali_gp_scheduler_lock(); _mali_osk_list_addtail(&job->list, &job_queue); MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Job %u (0x%08X) queued\n", mali_gp_job_get_id(job), job)); mali_gp_scheduler_schedule(); mali_gp_scheduler_unlock(); return _MALI_OSK_ERR_OK; }
void mali_scheduler_schedule_from_mask(mali_scheduler_mask mask, mali_bool deferred_schedule) { if (MALI_SCHEDULER_MASK_GP & mask) { /* GP needs scheduling. */ if (deferred_schedule) { /* Schedule GP deferred. */ _mali_osk_wq_schedule_work_high_pri(gp_scheduler_wq_high_pri); } else { /* Schedule GP now. */ mali_gp_scheduler_schedule(); } } if (MALI_SCHEDULER_MASK_PP & mask) { /* PP needs scheduling. */ if (deferred_schedule) { /* Schedule PP deferred. */ _mali_osk_wq_schedule_work_high_pri(pp_scheduler_wq_high_pri); } else { /* Schedule PP now. */ mali_pp_scheduler_schedule(); } } }
static void mali_scheduler_wq_schedule_gp(void *arg) { MALI_IGNORE(arg); mali_gp_scheduler_schedule(); }