示例#1
0
_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;
}
示例#2
0
_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;
}