#include "pass.h"
-#define MAX_NUM 255
-#define MIN_TIMEOUT_SEC 0.2
+#define MAX_NUM 255
+#define MIN_TIMEOUT_SEC 0.2 /* 200 millisecond */
+#define MAX_TIMEOUT_SEC 3600.0 /* 1 hour */
static int compare_compatible_name(char *compatible, char *path_compatible)
{
static int parse_scenario(struct parse_result *result,
struct pass_scenario *scenario)
{
+ int ret;
+
if (!result || !scenario)
return 0;
/* Parse properties for only PASS_MODULE_PMQOS */
} else if (MATCH(result->name, "min_level")) {
- scenario->pmqos.min_level = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ scenario->pmqos.min_level = ret;
} else if (MATCH(result->name, "max_level")) {
- scenario->pmqos.max_level = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ scenario->pmqos.max_level = ret;
/* Parse properties for only PASS_MODULE_THERMAL */
} else if (MATCH(result->name, "temperature")) {
- scenario->thermal.temperature = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ scenario->thermal.temperature = ret;
} else if (MATCH(result->name, "timer_interval_ms")) {
- scenario->thermal.timer_interval = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ scenario->thermal.timer_interval = ret;
}
return 0;
static int parse_level(struct parse_result *result,
struct pass_level *level)
{
+ int ret;
+
if (!result || !level)
return 0;
* - PASS_RESOURCE_BUS_ID
* - PASS_RESOURCE_GPU_ID
*/
- if (MATCH(result->name, "limit_max_freq"))
- level->limit_max_freq = atoi(result->value);
- else if (MATCH(result->name, "limit_min_freq"))
- level->limit_min_freq = atoi(result->value);
- else if (MATCH(result->name, "limit_min_cpu"))
- level->limit_min_cpu = atoi(result->value);
+ if (MATCH(result->name, "limit_max_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->limit_max_freq = ret;
+ } else if (MATCH(result->name, "limit_min_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->limit_min_freq = ret;
+ } else if (MATCH(result->name, "limit_min_cpu")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->limit_min_cpu = ret;
/*
* Properties for the following h/w resources:
* - PASS_RESOURCE_CPU_ID
*/
- else if (MATCH(result->name, "num_down_cond"))
- level->num_down_cond = atoi(result->value);
- else if (MATCH(result->name, "num_down_cond_freq"))
- level->down_cond[0].freq = atoi(result->value);
- else if (MATCH(result->name, "num_down_cond_nr_running"))
- level->down_cond[0].nr_running = atoi(result->value);
- else if (MATCH(result->name, "num_down_cond_busy_cpu"))
- level->down_cond[0].busy_cpu = atoi(result->value);
-
- else if (MATCH(result->name, "num_up_cond"))
- level->num_up_cond = atoi(result->value);
- else if (MATCH(result->name, "num_up_cond_freq"))
- level->up_cond[0].freq = atoi(result->value);
- else if (MATCH(result->name, "num_up_cond_nr_running"))
- level->up_cond[0].nr_running = atoi(result->value);
- else if (MATCH(result->name, "num_up_cond_busy_cpu"))
- level->up_cond[0].busy_cpu = atoi(result->value);
-
- else if (MATCH(result->name, "num_left_cond"))
- level->num_left_cond = atoi(result->value);
- else if (MATCH(result->name, "num_left_cond_freq"))
- level->left_cond[0].freq = atoi(result->value);
- else if (MATCH(result->name, "num_left_cond_nr_running"))
- level->left_cond[0].nr_running = atoi(result->value);
- else if (MATCH(result->name, "num_left_cond_busy_cpu"))
- level->left_cond[0].busy_cpu = atoi(result->value);
-
- else if (MATCH(result->name, "num_right_cond"))
- level->num_right_cond = atoi(result->value);
- else if (MATCH(result->name, "num_right_cond_freq"))
- level->right_cond[0].freq = atoi(result->value);
- else if (MATCH(result->name, "num_right_cond_nr_running"))
- level->right_cond[0].nr_running = atoi(result->value);
- else if (MATCH(result->name, "num_right_cond_busy_cpu"))
- level->right_cond[0].busy_cpu = atoi(result->value);
- else if (MATCH(result->name, "gov_timeout")) {
- double gov_timeout = atof(result->value);
-
- if (gov_timeout < MIN_TIMEOUT_SEC)
+ } else if (MATCH(result->name, "num_down_cond")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->num_down_cond = ret;
+ } else if (MATCH(result->name, "num_down_cond_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->down_cond[0].freq = ret;
+ } else if (MATCH(result->name, "num_down_cond_nr_running")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->down_cond[0].nr_running = ret;
+ } else if (MATCH(result->name, "num_down_cond_busy_cpu")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->down_cond[0].busy_cpu = ret;
+
+ } else if (MATCH(result->name, "num_up_cond")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->num_up_cond = ret;
+ } else if (MATCH(result->name, "num_up_cond_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->up_cond[0].freq = ret;
+ } else if (MATCH(result->name, "num_up_cond_nr_running")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->up_cond[0].nr_running = ret;
+ } else if (MATCH(result->name, "num_up_cond_busy_cpu")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->up_cond[0].busy_cpu = ret;
+
+ } else if (MATCH(result->name, "num_left_cond")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->num_left_cond = ret;
+ } else if (MATCH(result->name, "num_left_cond_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->left_cond[0].freq = ret;
+ } else if (MATCH(result->name, "num_left_cond_nr_running")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->left_cond[0].nr_running = ret;
+ } else if (MATCH(result->name, "num_left_cond_busy_cpu")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->left_cond[0].busy_cpu = ret;
+
+ } else if (MATCH(result->name, "num_right_cond")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->num_right_cond = ret;
+ } else if (MATCH(result->name, "num_right_cond_freq")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->right_cond[0].freq = ret;
+ } else if (MATCH(result->name, "num_right_cond_nr_running")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->right_cond[0].nr_running = ret;
+ } else if (MATCH(result->name, "num_right_cond_busy_cpu")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->right_cond[0].busy_cpu = ret;
+
+ } else if (MATCH(result->name, "gov_timeout")) {
+ double gov_timeout = strtod(result->value, (char **)NULL);
+
+ if (gov_timeout < MIN_TIMEOUT_SEC
+ || gov_timeout > MAX_TIMEOUT_SEC)
gov_timeout = MIN_TIMEOUT_SEC;
level->gov_timeout = gov_timeout;
- }
/*
* Properties for the following h/w resources:
* - PASS_RESOURCE_MEMORY_ID
*/
- else if (MATCH(result->name, "fault_around_bytes"))
- level->fault_around_bytes = atoi(result->value);
+ } else if (MATCH(result->name, "fault_around_bytes")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ level->fault_around_bytes = ret;
+ }
return 0;
}
} else if (MATCH(result->name, "pass_num_scenarios")) {
unsigned int num_scenarios;
+ int ret;
+
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ num_scenarios = ret;
- num_scenarios = atoi(result->value);
if (num_scenarios > MAX_NUM) {
_E("cannot parse %s\n", result->name);
return -EINVAL;
{
struct pass_resource *res = user_data;
struct pass_thermal *thermal = &res->thermal;
+ int ret;
if (!result)
return 0;
} else if (MATCH(result->name, "thermal_number_of_scenario")) {
unsigned int num_scenarios;
- num_scenarios = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ num_scenarios = ret;
+
if (num_scenarios > MAX_NUM) {
_E("cannot parse %s\n", result->name);
return -EINVAL;
thermal->num_scenarios = num_scenarios;
}
} else if (MATCH(result->name, "thermal_timer_interval_ms")) {
- thermal->timer_interval = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ thermal->timer_interval = ret;
}
return 0;
static int parse_core(struct parse_result *result, void *user_data)
{
struct pass_resource *res = user_data;
+ int ret;
if (!result)
return 0;
if (!result->section || !result->name || !result->value)
return 0;
- if (MATCH(result->name, "pass_support"))
- res->config_data.state = atoi(result->value);
- else if (MATCH(result->name, "pass_gov_type"))
- res->config_data.gov_type = atoi(result->value);
- else if (MATCH(result->name, "pass_num_levels")) {
- unsigned int num_levels = atoi(result->value);
+ if (MATCH(result->name, "pass_support")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->config_data.state = ret;
+ } else if (MATCH(result->name, "pass_gov_type")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->config_data.gov_type = ret;
+ } else if (MATCH(result->name, "pass_num_levels")) {
+ unsigned int num_levels;
+
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ num_levels = ret;
if (num_levels > MAX_NUM) {
_E("cannot parse %s\n", result->name);
return -EINVAL;
}
res->config_data.num_levels = num_levels;
- } else if (MATCH(result->name, "pass_min_level"))
- res->rescon.min_level = atoi(result->value);
- else if (MATCH(result->name, "pass_max_level"))
- res->rescon.max_level = atoi(result->value);
- else if (MATCH(result->name, "pass_init_level"))
- res->rescon.init_level = atoi(result->value);
-
- else if (MATCH(result->name, "pass_cpu_threshold"))
- res->cpuhp.pass_cpu_threshold = atoi(result->value);
- else if (MATCH(result->name, "pass_up_threshold"))
- res->cpuhp.up_threshold = atoi(result->value);
- else if (MATCH(result->name, "pass_down_threshold"))
- res->cpuhp.down_threshold = atoi(result->value);
- else if (MATCH(result->name, "pass_governor_timeout")) {
- res->config_data.gov_timeout = atof(result->value);
-
- if (MIN_TIMEOUT_SEC > res->config_data.gov_timeout)
+ } else if (MATCH(result->name, "pass_min_level")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->rescon.min_level = ret;
+ } else if (MATCH(result->name, "pass_max_level")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->rescon.max_level = ret;
+ } else if (MATCH(result->name, "pass_init_level")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->rescon.init_level = ret;
+
+ } else if (MATCH(result->name, "pass_cpu_threshold")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->cpuhp.pass_cpu_threshold = ret;
+ } else if (MATCH(result->name, "pass_up_threshold")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->cpuhp.up_threshold = ret;
+ } else if (MATCH(result->name, "pass_down_threshold")) {
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ res->cpuhp.down_threshold = ret;
+ } else if (MATCH(result->name, "pass_governor_timeout")) {
+ res->config_data.gov_timeout
+ = strtod(result->value, (char **)NULL);
+
+ if (res->config_data.gov_timeout < MIN_TIMEOUT_SEC
+ || res->config_data.gov_timeout > MAX_TIMEOUT_SEC)
res->config_data.gov_timeout = MIN_TIMEOUT_SEC;
}
struct pass *pass = user_data;
struct pass_resource_config_data *config_data
= &(pass->res[id].config_data);
+ int ret;
if (!result)
return 0;
switch (res_type) {
case PASS_RESOURCE_CPU_ID:
- config_data->cpu = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ config_data->cpu = ret;
break;
default:
return -EINVAL;
switch (res_type) {
case PASS_RESOURCE_CPU_ID:
- config_data->num_cpus = atoi(result->value);
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ config_data->num_cpus = ret;
break;
default:
return -EINVAL;
is_compatible = true;
}
} else if (MATCH(result->name, "pass_num_resources")) {
- unsigned int num_resources = atoi(result->value);
- int i;
+ unsigned int num_resources;
+ int i, ret;
+
+ ret = sys_strtol(result->value);
+ if (ret < 0)
+ return ret;
+ num_resources = ret;
if ((num_resources > MAX_NUM) ||
(num_resources < 1)) {