/* * 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; }
/* * 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; }