Ejemplo n.º 1
0
/*
 * hps cpu num limit
 */
int hps_set_cpu_num_limit(hps_limit_type_e type, unsigned int little_cpu, unsigned int big_cpu)
{
    if (hps_ctxt.init_state != INIT_STATE_DONE)
        return -1;

    if ((type < 0) || (type >= LIMIT_COUNT))
        return -1;

    if ((little_cpu > num_possible_little_cpus()) || (little_cpu < 1))
        return -1;

    if (hps_ctxt.is_hmp && (big_cpu > num_possible_big_cpus()))
        return -1;

    mutex_lock(&hps_ctxt.lock);

    switch (type)
    {
    case LIMIT_THERMAL:
        hps_ctxt.little_num_limit_thermal = little_cpu;
        if (hps_ctxt.is_hmp)
            hps_ctxt.big_num_limit_thermal = big_cpu;
        break;
    case LIMIT_LOW_BATTERY:
        hps_ctxt.little_num_limit_low_battery = little_cpu;
        if (hps_ctxt.is_hmp)
            hps_ctxt.big_num_limit_low_battery = big_cpu;
        break;
    case LIMIT_ULTRA_POWER_SAVING:
        hps_ctxt.little_num_limit_ultra_power_saving = little_cpu;
        if (hps_ctxt.is_hmp)
            hps_ctxt.big_num_limit_ultra_power_saving = big_cpu;
        break;
    case LIMIT_POWER_SERV:
        hps_ctxt.little_num_limit_power_serv = little_cpu;
        if (hps_ctxt.is_hmp)
            hps_ctxt.big_num_limit_power_serv = big_cpu;
        break;
    default:
        break;
    }

    if (hps_ctxt.is_hmp)
    {
        if (num_online_big_cpus() > big_cpu)
            hps_task_wakeup_nolock();
        else if (num_online_little_cpus() > little_cpu)
            hps_task_wakeup_nolock();
    }
    else
    {
        if (num_online_little_cpus() > little_cpu)
            hps_task_wakeup_nolock();
    }

    mutex_unlock(&hps_ctxt.lock);

    return 0;
}
void hps_task_wakeup(void)
{
	mutex_lock(&hps_ctxt.lock);

	hps_task_wakeup_nolock();

	mutex_unlock(&hps_ctxt.lock);
}
int hps_restart_timer(void)
{
#if 1
	unsigned long long time_differ = 0;

	time_differ = hps_get_current_time_ms() - hps_cancel_time;
	if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_TIMER) {
		/*init timer */
		init_timer(&hps_ctxt.tmr_list);
		/*init_timer_deferrable(&hps_ctxt.tmr_list); */
		hps_ctxt.tmr_list.function = (void *)&_hps_timer_callback;
		hps_ctxt.tmr_list.data = (unsigned long)&hps_ctxt;

		if (time_differ >= HPS_TIMER_INTERVAL_MS) {
			hps_ctxt.tmr_list.expires =
			    jiffies + msecs_to_jiffies(HPS_TIMER_INTERVAL_MS);
			add_timer(&hps_ctxt.tmr_list);
			hps_task_wakeup_nolock();
			hps_cancel_time = 0;
		} else {
			hps_ctxt.tmr_list.expires =
			    jiffies + msecs_to_jiffies(HPS_TIMER_INTERVAL_MS - time_differ);
			add_timer(&hps_ctxt.tmr_list);
		}
	} else if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_HR_TIMER) {
#if 1
		hrtimer_start(&hps_ctxt.hr_timer, ktime, HRTIMER_MODE_REL);
		if (time_differ >= HPS_TIMER_INTERVAL_MS) {
			hps_task_wakeup_nolock();
			hps_cancel_time = 0;
		}
#else
		if (time_differ >= HPS_TIMER_INTERVAL_MS) {
			/*init Hrtimer */
			hrtimer_start(&hps_ctxt.hr_timer, ktime, HRTIMER_MODE_REL);
			hps_task_wakeup_nolock();
			hps_cancel_time = 0;
		}
#endif
	}
#endif
	return 0;
}
Ejemplo n.º 4
0
/*
 * hps cpu num base
 */
int hps_set_cpu_num_base(hps_base_type_e type, unsigned int little_cpu, unsigned int big_cpu)
{
    unsigned int num_online;

    if (hps_ctxt.init_state != INIT_STATE_DONE)
        return -1;

    if ((type < 0) || (type >= BASE_COUNT))
        return -1;

    if ((little_cpu > num_possible_little_cpus()) || (little_cpu < 1))
        return -1;

    if (hps_ctxt.is_hmp && (big_cpu > num_possible_big_cpus()))
        return -1;

    //XXX: check mutex lock or not? use hps_ctxt.lock!
    mutex_lock(&hps_ctxt.lock);

    switch (type)
    {
    case BASE_PERF_SERV:
        hps_ctxt.little_num_base_perf_serv = little_cpu;
        if (hps_ctxt.is_hmp)
            hps_ctxt.big_num_base_perf_serv = big_cpu;
        break;
    default:
        break;
    }

    if (hps_ctxt.is_hmp)
    {
        num_online = num_online_big_cpus();
        if ((num_online < big_cpu) &&
            (num_online < min(hps_ctxt.big_num_limit_thermal, hps_ctxt.big_num_limit_low_battery)))
        {
            hps_task_wakeup_nolock();
        }
        else
        {
            num_online = num_online_little_cpus();
            if ((num_online < little_cpu) &&
                (num_online < min(hps_ctxt.little_num_limit_thermal, hps_ctxt.little_num_limit_low_battery)) &&
                (num_online_cpus() < (little_cpu + big_cpu)))
                hps_task_wakeup_nolock();
        }
    }
    else
    {
        num_online = num_online_little_cpus();
        if ((num_online < little_cpu) &&
            (num_online < min(hps_ctxt.little_num_limit_thermal, hps_ctxt.little_num_limit_low_battery)))
        {
            hps_task_wakeup_nolock();
        }
    }

    mutex_unlock(&hps_ctxt.lock);

    return 0;
}