#include <fcntl.h>
#include <pass/common.h>
-#include <pass/config-parser.h>
#include <pass/pass-hal.h>
#include "pass.h"
#define MAX_TIMEOUT_SEC 3600.0 /* 1 hour */
#define INIT_VALUE -1
-static int compare_compatible_name(char *compatible, char *path_compatible)
+static int compare_compatible_name(const char *compatible,
+ const char *path_compatible)
{
char buf[BUFF_MAX];
int len, ret;
return 0;
}
-static enum pass_state is_supported(char *value)
-{
- enum pass_state state;
-
- if (!value)
- return -EINVAL;
-
- if (MATCH(value, "yes"))
- state = PASS_ON;
- else if (MATCH(value, "no"))
- state = PASS_OFF;
- else
- state = PASS_UNUSED;
-
- return state;
-}
-
static void init_scenario(struct pass_scenario *scenario)
{
scenario->state = PASS_UNUSED;
/**
* @brief Parse scenario section to get scenario name and information
- * @param [in] result Parsed raw data from configuration
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
* @param [in] scenario Parsed data of a scenario will be saved to it
* @return @c 0 on success, otherwise error value
*/
-static int parse_scenario(struct parse_result *result,
+static int parse_scenario(struct pass_resource *res, json_object *obj,
struct pass_scenario *scenario)
{
- int ret;
-
- if (!result || !scenario)
- return 0;
-
- if (!result->section || !result->name || !result->value)
- return 0;
+ const char *name = NULL;
+ int support;
+ int target_level;
+ int cpuhp_min_level;
+ int cpuhp_max_level;
+ int temperature;
+ int timer_interval_ms;
+
+ /* Get property values */
+ name = get_string_from_object(obj, "name");
+ support = get_boolean_from_object(obj, "support");
+ target_level= get_int_from_object(obj, "target_level");
+
+ /* - property for only pmqos module */
+ cpuhp_min_level = get_int_from_object(obj, "cpuhp_min_level");
+ cpuhp_max_level = get_int_from_object(obj, "cpuhp_max_level");
+
+ /* - property for only thermal module */
+ temperature = get_int_from_object(obj, "temperature");
+ timer_interval_ms = get_int_from_object(obj, "timer_interval_ms");
+
+ /* Check the mandatory property values are valid or not */
+ if (!name) {
+ _E("Failed to get 'name' property in scenario section\n");
+ return -EINVAL;
+ } else if (target_level < 0) {
+ _E("Failed to get 'target_level' property in scenario section\n");
+ return -EINVAL;
+ }
- /* Parse 'Scenario' section */
- if (MATCH(result->name, "name")) {
- snprintf(scenario->name, BUFF_MAX, "%s", result->value);
- } else if (MATCH(result->name, "support")) {
- scenario->state = is_supported(result->value);
- if (scenario->state < 0)
- return -EINVAL;
- } else if (MATCH(result->name, "scenario_level")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- scenario->level = ret;
+ /* Initialize config_data from property values of confiugartion file */
+ snprintf(scenario->name, NAME_MAX, "%s", name);
+ scenario->state = (support < 0) ? 1 : support;
+ scenario->level = target_level;
- /* Parse properties for only PASS_MODULE_PMQOS */
- } else if (MATCH(result->name, "min_level")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- scenario->pmqos.min_level = ret;
- } else if (MATCH(result->name, "max_level")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- scenario->pmqos.max_level = ret;
+ /* - property for only pmqos module */
+ scenario->pmqos.min_level = cpuhp_min_level;
+ scenario->pmqos.max_level = cpuhp_max_level;
- /* Parse properties for only PASS_MODULE_THERMAL */
- } else if (MATCH(result->name, "temperature")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- scenario->thermal.temperature = ret;
- } else if (MATCH(result->name, "timer_interval_ms")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- scenario->thermal.timer_interval = ret;
- }
+ /* - property for only thermal module */
+ scenario->thermal.temperature = temperature;
+ scenario->thermal.timer_interval = timer_interval_ms;
return 0;
}
return 0;
}
-static void init_level(struct pass_level *level)
+static void initialize_level(struct pass_level *level)
{
level->limit_max_freq = INIT_VALUE;
level->limit_min_freq = INIT_VALUE;
level->fault_around_bytes = INIT_VALUE;
}
-static int parse_level(struct parse_result *result,
- struct pass_level *level)
+static int parse_level(struct pass_resource *res, json_object *obj,
+ struct pass_level *target_level, int level_idx)
{
- int ret;
-
- if (!result || !level)
- return 0;
+ int level;
+ int minimum_frequency_khz;
+ int maximum_frequency_khz;
+ int number_of_minimum_cpu;
+ int number_of_maximum_cpu;
+ int num_down_cond;
+ int num_down_cond_freq;
+ int num_down_cond_nr_running;
+ int num_down_cond_busy_cpu;
+ int num_up_cond;
+ int num_up_cond_freq;
+ int num_up_cond_nr_running;
+ int num_up_cond_busy_cpu;
+ int num_right_cond;
+ int num_right_cond_freq;
+ int num_right_cond_nr_running;
+ int num_right_cond_busy_cpu;
+ int num_left_cond;
+ int num_left_cond_freq;
+ int num_left_cond_nr_running;
+ int num_left_cond_busy_cpu;
+ double governor_timeout_sec;
+ int fault_around_bytes;
+
+ /* Get property values */
+ level = get_int_from_object(obj, "level");
+ minimum_frequency_khz = get_int_from_object(obj, "dvfs,minimum_frequency_khz");
+ maximum_frequency_khz = get_int_from_object(obj, "dvfs,maximum_frequency_khz");
+ number_of_minimum_cpu = get_int_from_object(obj, "hotplug,number_of_minimum_cpu");
+ number_of_maximum_cpu = get_int_from_object(obj, "hotplug,number_of_maximum_cpu");
+
+ num_down_cond = get_int_from_object(obj, "hotplug,num_down_cond");
+ num_down_cond_freq = get_int_from_object(obj, "hotplug,num_down_cond_freq");
+ num_down_cond_nr_running = get_int_from_object(obj, "hotplug,num_down_cond_nr_running");
+ num_down_cond_busy_cpu = get_int_from_object(obj, "hotplug,num_down_cond_busy_cpu");
+
+ num_up_cond = get_int_from_object(obj, "hotplug,num_up_cond");
+ num_up_cond_freq = get_int_from_object(obj, "hotplug,num_up_cond_freq");
+ num_up_cond_nr_running = get_int_from_object(obj, "hotplug,num_up_cond_nr_running");
+ num_up_cond_busy_cpu = get_int_from_object(obj, "hotplug,num_up_cond_busy_cpu");
+
+ num_right_cond = get_int_from_object(obj, "hotplug,num_right_cond");
+ num_right_cond_freq = get_int_from_object(obj, "hotplug,num_right_cond_freq");
+ num_right_cond_nr_running = get_int_from_object(obj, "hotplug,num_right_cond_nr_running");
+ num_right_cond_busy_cpu = get_int_from_object(obj, "hotplug,num_right_cond_busy_cpu");
+
+ num_left_cond = get_int_from_object(obj, "hotplug,num_left_cond");
+ num_left_cond_freq = get_int_from_object(obj, "hotplug,num_left_cond_freq");
+ num_left_cond_nr_running = get_int_from_object(obj, "hotplug,num_left_cond_nr_running");
+ num_left_cond_busy_cpu = get_int_from_object(obj, "hotplug,num_left_cond_busy_cpu");
+
+ governor_timeout_sec = get_double_from_object(obj, "hotplug,governor_timeout_sec");
+
+ fault_around_bytes = get_int_from_object(obj, "memory,fault_around_bytes");
+
+ /* Check the mandatory property values are valid or not */
+ if (level < 0) {
+ _E("Failed to get 'level' property in 'level_list' section\n");
+ return -EINVAL;
+ } else if (level != level_idx) {
+ _E("Invalid 'level' property value(%d) in 'level_list' section\n",
+ level);
+ return -EINVAL;
+ }
- if (!result->section || !result->name || !result->value)
- return 0;
+ /* Initialize config_data from property values of confiugartion file */
/*
* Properties for the following h/w resources:
* - PASS_RESOURCE_BUS_ID
* - PASS_RESOURCE_GPU_ID
*/
- 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;
+ if (minimum_frequency_khz >= 0)
+ target_level->limit_min_freq = minimum_frequency_khz;
+ if (maximum_frequency_khz >= 0)
+ target_level->limit_max_freq = maximum_frequency_khz;
/*
* Properties for the following h/w resources:
* - PASS_RESOURCE_CPU_ID
*/
- } else if (MATCH(result->name, "limit_max_cpu")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- level->limit_max_cpu = ret;
- } else if (MATCH(result->name, "limit_min_cpu")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- level->limit_min_cpu = ret;
- } 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;
+ if (number_of_minimum_cpu >= 0)
+ target_level->limit_min_cpu = number_of_minimum_cpu;
+ if (number_of_maximum_cpu >= 0)
+ target_level->limit_max_cpu = number_of_maximum_cpu;
+
+ if (num_down_cond >= 0)
+ target_level->num_down_cond = num_down_cond;
+ if (num_down_cond_freq >= 0)
+ target_level->down_cond[0].freq = num_down_cond_freq;
+ if (num_down_cond_nr_running >= 0)
+ target_level->down_cond[0].nr_running = num_down_cond_nr_running;
+ if (num_down_cond_busy_cpu >= 0)
+ target_level->down_cond[0].busy_cpu = num_down_cond_busy_cpu;
+
+ if (num_up_cond >= 0)
+ target_level->num_up_cond = num_up_cond;
+ if (num_up_cond_freq >= 0)
+ target_level->up_cond[0].freq = num_up_cond_freq;
+ if (num_up_cond_nr_running >= 0)
+ target_level->up_cond[0].nr_running = num_up_cond_nr_running;
+ if (num_up_cond_busy_cpu >= 0)
+ target_level->up_cond[0].busy_cpu = num_up_cond_busy_cpu;
+
+ if (num_left_cond >= 0)
+ target_level->num_left_cond = num_left_cond;
+ if (num_left_cond_freq >= 0)
+ target_level->left_cond[0].freq = num_left_cond_freq;
+ if (num_left_cond_nr_running >= 0)
+ target_level->left_cond[0].nr_running = num_left_cond_nr_running;
+ if (num_left_cond_busy_cpu >= 0)
+ target_level->left_cond[0].busy_cpu = num_left_cond_busy_cpu;
+
+ if (num_right_cond >= 0)
+ target_level->num_right_cond = num_right_cond;
+ if (num_right_cond_freq >= 0)
+ target_level->right_cond[0].freq = num_right_cond_freq;
+ if (num_right_cond_nr_running >= 0)
+ target_level->right_cond[0].nr_running = num_right_cond_nr_running;
+ if (num_right_cond_busy_cpu >= 0)
+ target_level->right_cond[0].busy_cpu = num_right_cond_busy_cpu;
+
+ if (governor_timeout_sec >= 0) {
+ if (governor_timeout_sec < MIN_TIMEOUT_SEC
+ || governor_timeout_sec > MAX_TIMEOUT_SEC)
+ governor_timeout_sec = MIN_TIMEOUT_SEC;
+ target_level->gov_timeout = governor_timeout_sec;
+ }
/*
* Properties for the following h/w resources:
* - PASS_RESOURCE_MEMORY_ID
*/
- } else if (MATCH(result->name, "fault_around_bytes")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- level->fault_around_bytes = ret;
- }
+ if (fault_around_bytes >= 0)
+ target_level->fault_around_bytes = fault_around_bytes;
return 0;
}
/**
* @brief Parse pmqos section to get PASS_MODULE_PMQOS information
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_pmqos(struct parse_result *result, void *user_data)
+static int parse_pmqos(struct pass_resource *res, json_object *obj)
{
- struct pass_resource *res = user_data;
- struct pass_pmqos *pmqos = &res->pmqos;
-
- if (!result)
- return 0;
-
- if (!result->section || !result->name || !result->value)
+ int pmqos_support;
+ json_object *pmqos_scenario_list = NULL;
+ int num_scenarios = 0, ret, i;
+
+ /* Get property values */
+ pmqos_support = get_boolean_from_object(obj, "pmqos_support");
+ if (json_object_object_get_ex(obj, "pmqos_scenario_list",
+ &pmqos_scenario_list))
+ num_scenarios = json_object_array_length(pmqos_scenario_list);
+
+ /* Check the mandatory property values are valid or not */
+ if (pmqos_support <= 0)
return 0;
- /* Parse 'PassScenario' section */
- if (MATCH(result->name, "pass_scenario_support")) {
- pmqos->state = is_supported(result->value);
- if (pmqos->state < 0)
- return -EINVAL;
+ /* Initialize config_data from property values of confiugartion file */
+ res->pmqos.state = pmqos_support;
+ res->pmqos.scenarios = calloc(num_scenarios,
+ sizeof(struct pass_scenario));
+ if (!res->pmqos.scenarios) {
+ _E("cannot allocate memory for Scenario\n");
+ return -EINVAL;
+ }
+ res->pmqos.num_scenarios = num_scenarios;
- } else if (MATCH(result->name, "pass_num_scenarios")) {
- unsigned int num_scenarios;
- int ret;
+ for (i = 0; i < res->pmqos.num_scenarios; i++) {
+ json_object *scenario_obj
+ = json_object_array_get_idx(pmqos_scenario_list, i);
+ struct pass_scenario *scenario = &(res->pmqos.scenarios[i]);
- ret = sys_strtol(result->value);
- if (ret < 0)
+ init_scenario(scenario);
+ ret = parse_scenario(res, scenario_obj, scenario);
+ if (ret < 0) {
+ _E("cannot parse 'pmqos.scenario%d' section\n", i);
return ret;
- num_scenarios = ret;
-
- if (num_scenarios > MAX_NUM) {
- _E("cannot parse %s\n", result->name);
- return -EINVAL;
- }
-
- if (num_scenarios > 0 && !pmqos->scenarios) {
- int i;
-
- pmqos->scenarios = calloc(num_scenarios,
- sizeof(struct pass_scenario));
- if (!pmqos->scenarios) {
- _E("cannot allocate memory for Scenario\n");
- return -EINVAL;
- }
-
- pmqos->num_scenarios = num_scenarios;
-
- for (i = 0; i < num_scenarios; i++)
- init_scenario(&pmqos->scenarios[i]);
}
}
/**
* @brief Parse thermal section to get PASS_MODULE_THERMAL information
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_thermal(struct parse_result *result, void *user_data)
+static int parse_thermal(struct pass_resource *res, json_object *obj)
{
- struct pass_resource *res = user_data;
- struct pass_thermal *thermal = &res->thermal;
- int ret;
-
- if (!result)
- return 0;
-
- if (!result->section || !result->name || !result->value)
+ int thermal_support;
+ int thermal_timer_interval_ms;
+ json_object *thermal_scenario_list = NULL;
+ int num_scenarios = 0, ret, i;
+
+ /* Get property values */
+ thermal_support = get_boolean_from_object(obj, "thermal_support");
+ thermal_timer_interval_ms
+ = get_int_from_object(obj, "thermal_timer_interval_ms");
+ if (json_object_object_get_ex(obj, "thermal_scenario_list",
+ &thermal_scenario_list))
+ num_scenarios = json_object_array_length(thermal_scenario_list);
+
+ /* Check the mandatory property values are valid or not */
+ if (thermal_support <= 0)
return 0;
- /* Parse 'thermal' section */
- if (MATCH(result->name, "thermal_support")) {
- thermal->state = is_supported(result->value);
- if (thermal->state < 0)
- return -EINVAL;
- } else if (MATCH(result->name, "thermal_number_of_scenario")) {
- unsigned int num_scenarios;
-
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- num_scenarios = ret;
+ /* Initialize config_data from property values of confiugartion file */
+ res->thermal.state = thermal_support;
+ res->thermal.timer_interval = thermal_timer_interval_ms;
- if (num_scenarios > MAX_NUM) {
- _E("cannot parse %s\n", result->name);
- return -EINVAL;
- }
-
- if (num_scenarios > 0 && !thermal->scenarios) {
- int i;
+ res->thermal.scenarios = calloc(num_scenarios,
+ sizeof(struct pass_scenario));
+ if (!res->thermal.scenarios) {
+ _E("cannot allocate memory for Scenario\n");
+ return -EINVAL;
+ }
+ res->thermal.num_scenarios = num_scenarios;
- thermal->scenarios = calloc(num_scenarios,
- sizeof(struct pass_scenario));
- if (!thermal->scenarios) {
- _E("cannot allocate memory for Scenario\n");
- return -EINVAL;
- }
- thermal->num_scenarios = num_scenarios;
+ for (i = 0; i < res->thermal.num_scenarios; i++) {
+ json_object *scenario_obj
+ = json_object_array_get_idx(thermal_scenario_list, i);
+ struct pass_scenario *scenario = &(res->thermal.scenarios[i]);
- for (i = 0; i < num_scenarios; i++)
- init_scenario(&thermal->scenarios[i]);
- }
- } else if (MATCH(result->name, "thermal_timer_interval_ms")) {
- ret = sys_strtol(result->value);
- if (ret < 0)
+ init_scenario(scenario);
+ ret = parse_scenario(res, scenario_obj, scenario);
+ if (ret < 0) {
+ _E("cannot parse 'thermal.scenario%d' section\n", i);
return ret;
- thermal->timer_interval = ret;
+ }
}
return 0;
}
/**
- * @brief Parse core section to get module information
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
+ * @brief Parse cpuhp section to get module information
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_core(struct parse_result *result, void *user_data)
+static int parse_cpuhp(struct pass_resource *res, json_object *obj)
{
- struct pass_resource *res = user_data;
- int ret;
-
- if (!result)
+ int cpuhp_support;
+ int cpuhp_governor;
+ double cpuhp_timer_interval_sec;
+ int cpuhp_min_level;
+ int cpuhp_max_level;
+ int cpuhp_init_level;
+ int cpuhp_cpu_threshold;
+ int cpuhp_up_threshold;
+ int cpuhp_down_threshold;
+ json_object *cpuhp_level_list = NULL;
+ int cpuhp_num_levels = 0, ret, i;
+
+ /* Get property values */
+ cpuhp_support = get_int_from_object(obj, "cpuhp_support");
+ cpuhp_governor = get_int_from_object(obj, "cpuhp_governor");
+ cpuhp_timer_interval_sec = get_int_from_object(obj, "cpuhp_timer_interval_sec");
+ cpuhp_min_level = get_int_from_object(obj, "cpuhp_min_level");
+ cpuhp_max_level = get_int_from_object(obj, "cpuhp_max_level");
+ cpuhp_init_level = get_int_from_object(obj, "cpuhp_init_level");
+ cpuhp_cpu_threshold = get_int_from_object(obj, "cpuhp_cpu_threshold");
+ cpuhp_up_threshold = get_int_from_object(obj, "cpuhp_up_threshold");
+ cpuhp_down_threshold= get_int_from_object(obj, "cpuhp_down_threshold");
+
+ if (json_object_object_get_ex(obj, "cpuhp_level_list", &cpuhp_level_list))
+ cpuhp_num_levels = json_object_array_length(cpuhp_level_list);
+
+ /* Check the mandatory property values are valid or not */
+ if (cpuhp_support <= 0) {
return 0;
-
- if (!result->section || !result->name || !result->value)
- return 0;
-
- if (MATCH(result->name, "pass_support")) {
- int state;
-
- state = sys_strtol(result->value);
- if (state < 0)
- return state;
- res->config_data.state = state;
- } else if (MATCH(result->name, "pass_gov_type")) {
- int gov_type;
-
- gov_type = sys_strtol(result->value);
- if (gov_type < 0)
- return gov_type;
- res->config_data.gov_type = gov_type;
- } else if (MATCH(result->name, "pass_num_levels")) {
- int num_levels;
-
- num_levels = sys_strtol(result->value);
- if (num_levels < 0)
- return num_levels;
- 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")) {
- 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_num_scenario_levels")) {
- int num_scenario_levels;
-
- num_scenario_levels = sys_strtol(result->value);
- if (num_scenario_levels < 0)
- return num_scenario_levels;
- if (num_scenario_levels > MAX_NUM) {
- _E("cannot parse %s\n", result->name);
- return -EINVAL;
- }
- res->config_data.num_scenario_levels = num_scenario_levels;
- } else if (MATCH(result->name, "pass_init_scenario_level")) {
- unsigned int init_level;
-
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- init_level = ret;
-
- if (init_level > MAX_NUM) {
- _E("cannot parse %s\n", result->name);
- return -EINVAL;
- }
- res->rescon.init_scenario_level = init_level;
-
- } 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;
+ } else if (cpuhp_governor < 0) {
+ _E("Failed to get 'cpuhp_governor' property\n");
+ return -EINVAL;
+ } else if (!cpuhp_level_list) {
+ _E("Failed to get 'cpuhp_level_list' property\n");
+ return -EINVAL;
+ } else if (cpuhp_num_levels <= 0) {
+ _E("Must need to add at least one level in 'cpuhp_level_list' section\n");
+ return -EINVAL;
}
- if (res->config_data.num_levels > 0 && !res->config_data.levels) {
- int i;
+ /* Initialize config_data from property values of confiugartion file */
+ /* - core */
+ res->config_data.state = cpuhp_support;
+ res->config_data.gov_type = cpuhp_governor;
+ res->config_data.gov_timeout = cpuhp_timer_interval_sec;
+ 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;
+
+ /* - properties for rescon module */
+ res->rescon.min_level = cpuhp_min_level;
+ res->rescon.max_level = cpuhp_max_level;
+ res->rescon.init_level = cpuhp_init_level;
+
+ /* - properties for cpuhp module */
+ res->cpuhp.pass_cpu_threshold = cpuhp_cpu_threshold;
+ res->cpuhp.up_threshold = cpuhp_up_threshold;
+ res->cpuhp.down_threshold = cpuhp_down_threshold;
+
+ res->config_data.num_levels = cpuhp_num_levels;
+ res->config_data.levels = calloc(res->config_data.num_levels,
+ sizeof(struct pass_level));
+ if (!res->config_data.levels) {
+ _E("cannot allocate memory for cpuhp level list\n");
+ return -EINVAL;
+ }
- res->config_data.levels = calloc(res->config_data.num_levels,
- sizeof(struct pass_level));
- if (!res->config_data.levels) {
- _E("cannot allocate memory for levels\n");
- return -EINVAL;
- }
+ for (i = 0; i < res->config_data.num_levels; i++) {
+ json_object *level_obj = json_object_array_get_idx(cpuhp_level_list, i);
+ struct pass_level *level = &res->config_data.levels[i];
- /* Initialize pass_level before parsing */
- for (i = 0; i < res->config_data.num_levels; i++)
- init_level(&res->config_data.levels[i]);
- } else if (res->config_data.num_scenario_levels > 0
- && !res->config_data.scenario_levels) {
- int i;
-
- res->config_data.scenario_levels =
- calloc(res->config_data.num_scenario_levels,
- sizeof(struct pass_level));
- if (!res->config_data.scenario_levels) {
- _E("cannot allocate memory for levels\n");
- return -EINVAL;
+ initialize_level(level);
+ ret = parse_level(res, level_obj, level, i);
+ if (ret < 0) {
+ _E("cannot parse level%d in 'level_list' section\n", i);
+ return ret;
}
-
- /* Initialize scenariop pass_level before parsing */
- for (i = 0; i < res->config_data.num_scenario_levels; i++)
- init_level(&res->config_data.scenario_levels[i]);
}
return 0;
}
+
/**
- * @brief Parse configuration for each h/w resource
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
+ * @brief Parse core section to get module information
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_each_resource(struct parse_result *result, void *user_data)
+static int parse_header(struct pass_resource *res, json_object *obj)
{
- struct pass_resource *res = user_data;
- struct pass_pmqos *pmqos = &res->pmqos;
- struct pass_thermal *thermal = &res->thermal;
- struct pass_level *level;
- char section_name[BUFF_MAX];
- int i, ret;
-
- if (!result)
- return 0;
-
- if (!result->section || !result->name || !result->value)
- return 0;
-
- /* Parsing 'PASS' section */
- if (MATCH(result->section, "Pass")) {
- ret = parse_core(result, user_data);
- if (ret < 0) {
- _E("cannot parse the core part\n");
- return ret;
- }
-
- goto out;
+ int support;
+ int init_level;
+ json_object *level_list = NULL;
+ int num_levels = 0, ret, i;
+
+ /* Get property values */
+ support = get_boolean_from_object(obj, "support");
+ init_level = get_int_from_object(obj, "init_level");
+ if (json_object_object_get_ex(obj, "level_list", &level_list))
+ num_levels = json_object_array_length(level_list);
+
+ /* Check the mandatory property values are valid or not */
+ if (support < 0) {
+ _E("Failed to get 'support' property\n");
+ return -EINVAL;
+ } else if (!level_list) {
+ _E("Failed to get 'level_list' property\n");
+ return -EINVAL;
+ } else if (num_levels <= 0) {
+ _E("Must need to add at least one level in 'level_list' section\n");
+ return -EINVAL;
+ } else if (init_level > num_levels) {
+ _E("Invalid 'init_level' in core section\n");
+ return -EINVAL;
}
- /* Parsing 'Level' section */
- for (i = 0; i < res->config_data.num_levels; i++) {
- ret = snprintf(section_name, BUFF_MAX, "Level%d", i);
+ if (init_level < 0)
+ init_level = 0;
- if (MATCH(result->section, section_name)) {
- ret = parse_level(result, &res->config_data.levels[i]);
- if (ret < 0) {
- _E("cannot parse 'Level%d' section\n", i);
- return ret;
- }
- goto out;
- }
+ /* Initialize config_data from property values of confiugartion file */
+ res->config_data.state = support;
+ res->config_data.num_scenario_levels = num_levels;
+ res->rescon.init_scenario_level = init_level;
+ res->config_data.scenario_levels = calloc(
+ res->config_data.num_scenario_levels,
+ sizeof(struct pass_level));
+ if (!res->config_data.scenario_levels) {
+ _E("cannot allocate memory for scenario level list\n");
+ return -EINVAL;
}
- /* Parsing 'ScenarioLevel' section */
for (i = 0; i < res->config_data.num_scenario_levels; i++) {
- ret = snprintf(section_name, BUFF_MAX, "ScenarioLevel%d", i);
-
- if (MATCH(result->section, section_name)) {
- level = &res->config_data.scenario_levels[i];
-
- ret = parse_level(result, level);
- if (ret < 0) {
- _E("cannot parse 'ScenarioLevel%d' section\n", i);
- return ret;
- }
+ json_object *level_obj = json_object_array_get_idx(level_list, i);
+ struct pass_level *level = &res->config_data.scenario_levels[i];
- goto out;
- }
- }
-
- /* Parsing 'PassScenario' section */
- if (MATCH(result->section, "PassScenario")) {
- ret = parse_pmqos(result, user_data);
+ initialize_level(level);
+ ret = parse_level(res, level_obj, level, i);
if (ret < 0) {
- _E("cannot parse 'PassScenario' section\n");
+ _E("cannot parse level%d in 'level_list' section\n", i);
return ret;
}
-
- goto out;
}
- /* Parsing 'Scenario' section */
- for (i = 0; i < pmqos->num_scenarios; i++) {
- ret = snprintf(section_name, BUFF_MAX, "Scenario%d", i);
+ return 0;
+}
- if (MATCH(result->section, section_name)) {
- ret = parse_scenario(result, &pmqos->scenarios[i]);
- if (ret < 0) {
- _E("cannot parse 'Scenario%d' section\n", i);
- return ret;
- }
+/**
+ * @brief Parse configuration for each h/w resource
+ * @param [in] res Instance of h/w resource
+ * @param [in] obj Instance of json_object for h/w resource
+ * @return @c 0 on success, otherwise error value
+ */
+static int parse_each_resource(struct pass_resource *res, json_object *obj)
+{
+ int ret;
- goto out;
- }
+ /* Parse header */
+ ret = parse_header(res, obj);
+ if (ret < 0) {
+ _E("cannot parse the core part\n");
+ return ret;
}
- /* Parsing 'thermal' section */
- if (MATCH(result->section, "thermal")) {
- ret = parse_thermal(result, user_data);
- if (ret < 0) {
- _E("cannot parse 'thermal' section\n");
- return ret;
- }
-
- goto out;
+ /* Parse pmqos module */
+ ret = parse_pmqos(res, obj);
+ if (ret < 0) {
+ _E("cannot parse 'PassScenario' section\n");
+ return ret;
}
- /* Parsing 'thermal.scenario' section */
- for (i = 0; i < thermal->num_scenarios; i++) {
- ret = snprintf(section_name, BUFF_MAX, "thermal.scenario%d", i);
-
- if (MATCH(result->section, section_name)) {
- ret = parse_scenario(result, &thermal->scenarios[i]);
- if (ret < 0) {
- _E("cannot parse 'thermal.scenario%d' section\n", i);
- return ret;
- }
+ /* Parse thermal module */
+ ret = parse_thermal(res, obj);
+ if (ret < 0) {
+ _E("cannot parse 'thermal' section\n");
+ return ret;
+ }
- goto out;
- }
+ /* Parse cpuhp module */
+ ret = parse_cpuhp(res, obj);
+ if (ret < 0) {
+ _E("cannot parse the cpuhp part\n");
+ return ret;
}
-out:
return 0;
}
/**
* @brief Parse resource section in pass.conf for each h/w resource
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
- * @param [in] id Resource index number
+ * @param [in] pass Instance of struct pass
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_resource_data(struct parse_result *result,
- void *user_data, int id)
+static int parse_resource_data(struct pass *pass, int id, json_object *obj)
{
- char buf[BUFF_MAX];
- struct pass *pass = user_data;
struct pass_resource_config_data *config_data
= &(pass->res[id].config_data);
- int ret;
-
- if (!result)
- return 0;
+ const char *device_type;
+ const char *device_name;
+ const char *thermal_device_name;
+ const char *device_config_path;
+ const char *cpu_load_path;
+ int number_of_cpus;
+ int first_cpu;
+
+ /* Get property values */
+ /* - mandatory properties */
+ device_type = get_string_from_object(obj, "device_type");
+ device_name = get_string_from_object(obj, "device_name");
+ device_config_path = get_string_from_object(obj, "device_config_path");
+
+ /* - optional properties */
+ thermal_device_name = get_string_from_object(obj, "thermal_device_name");
+
+ /* - optional properties for only CPU */
+ cpu_load_path = get_string_from_object(obj, "cpu,cpu_load_path");
+ number_of_cpus = get_int_from_object(obj, "cpu,number_of_cpus");
+ first_cpu = get_int_from_object(obj, "cpu,first_cpu");
+
+ /* Check the mandatory property values are valid or not */
+ if (!device_type) {
+ _E("Failed to get 'device_type' property of resource in 'device_list' of %s\n",
+ config_data->res_name);
+ return -EINVAL;
+ } else if (!device_name) {
+ _E("Failed to get 'device_name' property of resource in 'device_list' of %s\n",
+ config_data->res_name);
+ return -EINVAL;
+ } else if (!device_config_path) {
+ _E("Failed to get 'device_config_path' property of resource in 'device_list' of %s\n",
+ config_data->res_name);
+ return -EINVAL;
+ }
- if (MATCH(result->name, "pass_res_type")) {
- int i;
-
- memset(buf, 0, BUFF_MAX);
- for (i = 0; i < strlen(result->value); i++)
- buf[i] = tolower(result->value[i]);
-
- if (!strncmp(buf, PASS_RESOURCE_CPU_NAME, strlen(buf)))
- config_data->res_type = PASS_RESOURCE_CPU_ID;
- else if (!strncmp(buf, PASS_RESOURCE_GPU_NAME, strlen(buf)))
- config_data->res_type = PASS_RESOURCE_GPU_ID;
- else if (!strncmp(buf, PASS_RESOURCE_BUS_NAME, strlen(buf)))
- config_data->res_type = PASS_RESOURCE_BUS_ID;
- else if (!strncmp(buf, PASS_RESOURCE_MEMORY_NAME, strlen(buf)))
- config_data->res_type = PASS_RESOURCE_MEMORY_ID;
- else if (!strncmp(buf, PASS_RESOURCE_NONSTANDARD_NAME, strlen(buf)))
- config_data->res_type = PASS_RESOURCE_NONSTANDARD_ID;
- else
- return -EINVAL;
- } else if (MATCH(result->name, "pass_res_name")) {
- snprintf(config_data->res_name, BUFF_MAX, "%s", result->value);
- } else if (MATCH(result->name, "pass_res_thermal_name")) {
- snprintf(config_data->res_thermal_name, BUFF_MAX, "%s", result->value);
- } else if (MATCH(result->name, "pass_path_conf_file")) {
- snprintf(config_data->path_conf_file, BUFF_MAX, "%s", result->value);
- } else if (MATCH(result->name, "pass_path_load_table")) {
- snprintf(config_data->path_load_table, BUFF_MAX, "%s", result->value);
- } else if (MATCH(result->name, "pass_first_cpu")) {
- int res_type = config_data->res_type;
-
- switch (res_type) {
- case PASS_RESOURCE_CPU_ID:
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- config_data->cpu = ret;
- break;
- default:
- return -EINVAL;
- }
- } else if (MATCH(result->name, "pass_num_cpus")) {
- int res_type = config_data->res_type;
-
- switch (res_type) {
- case PASS_RESOURCE_CPU_ID:
- ret = sys_strtol(result->value);
- if (ret < 0)
- return ret;
- config_data->num_cpus = ret;
- break;
- default:
+ switch (config_data->res_type) {
+ case PASS_RESOURCE_CPU_ID:
+ if (number_of_cpus < 0 || first_cpu < 0) {
+ _E("Invalid 'number_of_cpus'(%d) or 'first_cpu'(%d) property value of %s\n",
+ number_of_cpus, first_cpu, config_data->res_name);
return -EINVAL;
}
+ break;
+ default:
+ break;
+ }
+
+ /* Initialize config_data from property values of confiugartion file */
+ if (!strncmp(device_type, PASS_RESOURCE_CPU_NAME, strlen(device_type)))
+ config_data->res_type = PASS_RESOURCE_CPU_ID;
+ else if (!strncmp(device_type, PASS_RESOURCE_GPU_NAME, strlen(device_type)))
+ config_data->res_type = PASS_RESOURCE_GPU_ID;
+ else if (!strncmp(device_type, PASS_RESOURCE_BUS_NAME, strlen(device_type)))
+ config_data->res_type = PASS_RESOURCE_BUS_ID;
+ else if (!strncmp(device_type, PASS_RESOURCE_MEMORY_NAME, strlen(device_type)))
+ config_data->res_type = PASS_RESOURCE_MEMORY_ID;
+ else if (!strncmp(device_type, PASS_RESOURCE_NONSTANDARD_NAME, strlen(device_type)))
+ config_data->res_type = PASS_RESOURCE_NONSTANDARD_ID;
+ else {
+ _E("Unknown 'device_type' property value (%s)\n", device_type);
+ return -EINVAL;
}
+ snprintf(config_data->res_name, BUFF_MAX, "%s", device_name);
+ snprintf(config_data->res_thermal_name, BUFF_MAX, "%s", thermal_device_name);
+ snprintf(config_data->path_conf_file, BUFF_MAX, "%s", device_config_path);
+ snprintf(config_data->path_load_table, BUFF_MAX, "%s", cpu_load_path);
+ config_data->num_cpus = number_of_cpus;
+ config_data->cpu = first_cpu;
+
return 0;
}
/**
* @brief Parse pass.conf for all h/w resources to get list of supported
* h/w resources
- * @param [in] result Parsed raw data from configuration
- * @param [in] user_data Instance of h/w resource
+ * @param [in] pass Instance of struct pass
+ * @param [in] obj Instance of json_object for h/w resource
* @return @c 0 on success, otherwise error value
*/
-static int parse_resource(struct parse_result *result, void *user_data)
+static int parse_resource(struct pass *pass, json_object *obj)
{
- static char path[BUFF_MAX];
- static bool is_compatible = false;
- static char compatible[BUFF_MAX];
- struct pass *pass = user_data;
- char section_name[BUFF_MAX];
- int id, len, ret;
-
- if (!result)
- return 0;
+ json_object *device_list = NULL;
+ const char *board_name = NULL;
+ const char *board_name_path = NULL;
+ int num_resources = 0, ret, i;
+
+ /* Get property values */
+ /* - mandatory properties */
+ board_name = get_string_from_object(obj, "board_name");
+ board_name_path = get_string_from_object(obj, "board_name_path");
+ if (json_object_object_get_ex(obj, "device_list", &device_list))
+ num_resources = json_object_array_length(device_list);
+
+ /* Check the mandatory property values are valid or not */
+ if (!board_name || !board_name_path) {
+ _E("Failed to get 'board_name' property\n");
+ return -EINVAL;
+ } else if (!device_list) {
+ _E("Failed to get 'device_list' property\n");
+ return -EINVAL;
+ } else if (num_resources <= 0) {
+ _E("Must need to add at least one resource in 'device_list' section\n");
+ return -EINVAL;
+ }
- if (!result->section || !result->name || !result->value)
- return 0;
+ ret = compare_compatible_name(board_name, board_name_path);
+ if (ret < 0) {
+ _E("Cannot match 'board_name' from 'board_name_path'\n");
+ return -EINVAL;
+ }
- /* Parsing 'PassResource' section */
- if (MATCH(result->section, "PassResource")) {
- if (MATCH(result->name, "pass_compatible")) {
- len = strlen(result->value);
- snprintf(compatible, len + 1, "%s", result->value);
-
- len = strlen(path);
- if (len > 0) {
- ret = compare_compatible_name(compatible, path);
- if (ret < 0)
- return ret;
-
- is_compatible = true;
- }
- } else if (MATCH(result->name, "pass_path_compatible")) {
- len = strlen(result->value);
- snprintf(path, len + 1, "%s", result->value);
-
- len = strlen(compatible);
- if (len > 0) {
- ret = compare_compatible_name(compatible, path);
- if (ret < 0)
- return ret;
-
- is_compatible = true;
- }
- } else if (MATCH(result->name, "pass_num_resources")) {
- 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)) {
- _E("cannot parse %s\n", result->name);
- return -EINVAL;
- }
-
- pass->res = calloc(num_resources,
- sizeof(struct pass_resource));
- if (!pass->res) {
- _E("cannot allocate the memory for resource");
- return -ENOMEM;
- }
-
- pass->num_resources = num_resources;
-
- /* Set init. value of initdata for each h/w resource */
- for (i = 0; i < num_resources ; i++) {
- struct pass_resource *cur;
-
- cur = &pass->res[i];
-
- cur->init_data.dvfs.governor = NULL;
- cur->init_data.dvfs.min_freq = -1;
- cur->init_data.dvfs.max_freq = -1;
- cur->init_data.dvfs.up_threshold = -1;
-
- cur->init_data.hotplug.online_state = NULL;
- cur->init_data.hotplug.online_min_num = -1;
- cur->init_data.hotplug.online_max_num = -1;
-
- cur->init_data.memory.fault_around_bytes = -1;
- }
- } else {
- _E("cannot parse the number of resource\n");
- return -ENOENT;
- }
+ /* Initialize config_data from property values of confiugartion file */
+ pass->res = calloc(num_resources, sizeof(struct pass_resource));
+ if (!pass->res) {
+ _E("Cannot allocate the memory for resources");
+ return -ENOMEM;
}
+ pass->num_resources = num_resources;
+
+ for (i = 0; i < num_resources ; i++) {
+ struct pass_resource *cur;
+ json_object *resource_obj =
+ json_object_array_get_idx(device_list, i);
+
+ cur = &pass->res[i];
+
+ cur->init_data.dvfs.governor = NULL;
+ cur->init_data.dvfs.min_freq = -1;
+ cur->init_data.dvfs.max_freq = -1;
+ cur->init_data.dvfs.up_threshold = -1;
- /* Parsing 'PassResource[X]' section */
- for (id = 0; id < pass->num_resources; id++) {
- ret = snprintf(section_name, BUFF_MAX, "PassResource%d", id);
-
- if (MATCH(section_name, result->section)) {
- if (!is_compatible) {
- _E("cannot match [compatible] with the string read from [path]\n");
- return -EINVAL;
- }
- ret = parse_resource_data(result, pass, id);
- if (ret < 0) {
- _E("cannot parse 'PassResource%d' section\n",
- id);
- return ret;
- }
+ cur->init_data.hotplug.online_state = NULL;
+ cur->init_data.hotplug.online_min_num = -1;
+ cur->init_data.hotplug.online_max_num = -1;
+
+ cur->init_data.memory.fault_around_bytes = -1;
+
+ ret = parse_resource_data(pass, i, resource_obj);
+ if (ret < 0) {
+ _E("cannot parse of %dth resource in 'device_list' section\n", i);
+ ret = -EINVAL;
+ goto err;
}
}
return 0;
+
+err:
+ pass->num_resources = 0;
+ free(pass->res);
+
+ return ret;
}
/**
*/
int pass_parser_get_resource_config(struct pass *pass, char *path)
{
- return config_parse(path, parse_resource, pass);
+ int ret;
+ json_object *obj = NULL;
+
+ obj = json_object_from_file(path);
+ if (!obj) {
+ _E("Failed to get json_object from %s (%s)\n",
+ path, json_util_get_last_err());
+ return -EINVAL;
+ }
+
+ ret = parse_resource(pass, obj);
+ if (ret < 0)
+ _E("Failed to parse resource from %s\n", path);
+
+ json_object_put(obj);
+
+ return ret;
}
/**
struct pass_pmqos *pmqos;
struct pass_thermal *thermal;
int ret, i;
+ json_object *obj = NULL;
if (!res)
return -EINVAL;
/* Initialize the Thermal's data */
thermal->state = PASS_UNUSED;
- /* Parse pass_level */
- ret = config_parse(path, parse_each_resource, res);
- if (ret < 0) {
- _E("cannot parse %s\n", path);
+ /* Parse configuration */
+ obj = json_object_from_file(path);
+ if (!obj) {
+ _E("Failed to get json_object from %s (%s)\n",
+ path, json_util_get_last_err());
return -EINVAL;
}
+ ret = parse_each_resource(res, obj);
+ if (ret < 0) {
+ _E("Failed to parse %s\n", path);
+ goto out;
+ }
+
/* Verify the parsed pass_level */
for (i = 0; i < res->config_data.num_levels; i++)
ret |= verify_level(res->config_data.res_type,
if (ret < 0) {
_E("failed to verify Level of '%s' resource\n",
res->config_data.res_name);
- return -EINVAL;
+ goto out;
}
/* Verify the parsed scenario pass_level */
if (ret < 0) {
_E("failed to verify ScenarioLevel of '%s' resource\n",
res->config_data.res_name);
- return -EINVAL;
+ goto out;
}
- if (res->config_data.state == PASS_UNUSED)
- return -EINVAL;
+ if (res->config_data.state == PASS_UNUSED) {
+ ret = -EINVAL;
+ goto out;
+ }
if (pmqos->state == PASS_UNUSED)
_W("don't include the list of pass-scenario\n");
else if (pmqos->state == PASS_OFF)
_I("cannot use pass-scenario");
- return 0;
+out:
+ json_object_put(obj);
+
+ return ret;
}
/**