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;
}
Ejemplo n.º 2
0
/*
 * hps num_possible_cpus
 */
int hps_get_num_possible_cpus(unsigned int * little_cpu_ptr, unsigned int * big_cpu_ptr)
{
    if (hps_ctxt.init_state != INIT_STATE_DONE)
        return -1;

    if ((little_cpu_ptr == NULL) || (big_cpu_ptr == NULL))
        return -1;

    *little_cpu_ptr = num_possible_little_cpus();
    *big_cpu_ptr = num_possible_big_cpus();

    return 0;
}
Ejemplo n.º 3
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;
}