_mali_osk_errcode_t mali_gp_scheduler_initialize(void) { u32 i; _MALI_OSK_INIT_LIST_HEAD(&job_queue); gp_scheduler_lock = _mali_osk_lock_init(_MALI_OSK_LOCKFLAG_ORDERED | _MALI_OSK_LOCKFLAG_NONINTERRUPTABLE, 0, _MALI_OSK_LOCK_ORDER_SCHEDULER); gp_scheduler_working_wait_queue = _mali_osk_wait_queue_init(); if (NULL == gp_scheduler_lock) { return _MALI_OSK_ERR_NOMEM; } if (NULL == gp_scheduler_working_wait_queue) { _mali_osk_lock_term(gp_scheduler_lock); return _MALI_OSK_ERR_NOMEM; } /* Find all the available GP cores */ for (i = 0; i < mali_cluster_get_glob_num_clusters(); i++) { u32 group_id = 0; struct mali_cluster *curr_cluster = mali_cluster_get_global_cluster(i); struct mali_group *group = mali_cluster_get_group(curr_cluster, group_id); while (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 are only one GP, no point in looking for more */ } group_id++; group = mali_cluster_get_group(curr_cluster, group_id); } } return _MALI_OSK_ERR_OK; }
_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; }