return 0;
}
+
+/*
+ * pass_rescon_init - Initialize ResCon (Resource Controller) module
+ *
+ * @res: the instance of struct pass_resource
+ */
+int pass_rescon_init(struct pass_resource *res)
+{
+ struct pass_rescon *rescon;
+ int ret;
+
+ if (!res || res->rescon.state == PASS_ON)
+ return -1;
+
+ rescon = &res->rescon;
+
+ /* Initialize the variables of resource-controller */
+ rescon->curr_level = 0;
+ rescon->prev_level = 0;
+
+ if (!rescon->min_level)
+ rescon->min_level = 0;
+ res->config_data.default_min_level = rescon->min_level;
+
+ if (!rescon->max_level)
+ rescon->max_level = res->config_data.num_levels - 1;
+ res->config_data.default_max_level = rescon->max_level;
+
+ if (!rescon->init_level)
+ rescon->init_level = rescon->min_level;
+ else if (rescon->init_level > rescon->max_level)
+ rescon->init_level = rescon->max_level;
+
+ /*
+ * Save the current data of h/w resource. The saved data
+ * will be used for restoring the h/w resource on exit().
+ */
+ ret = pass_save_initdata(res);
+ if (ret < 0) {
+ _E("failed to save initdata of '%s' resource (%d)\n",
+ res->config_data.res_name, ret);
+ return ret;
+ }
+
+ /* Set initial level according to init_level from configuration */
+ ret = pass_rescon_set_level(res, rescon->init_level);
+ if (ret < 0) {
+ _E("failed to set level%d\n", rescon->init_level);
+ return ret;
+ }
+
+ rescon->state = PASS_ON;
+
+ return 0;
+}
+
+/*
+ * pass_rescon_exit - Exit ResCon (Resource Controller) module
+ *
+ * @res: the instance of struct pass_resource
+ */
+int pass_rescon_exit(struct pass_resource *res)
+{
+ struct pass_rescon *rescon;
+ int ret;
+
+ if (!res || res->rescon.state == PASS_OFF)
+ return -1;
+
+ rescon = &res->rescon;
+
+ /* Restore the h/w resource by using the saved data */
+ ret = pass_restore_initdata(res);
+ if (ret < 0)
+ _E("failed to restore initdata of '%s' resource (%d)\n",
+ res->config_data.res_name, ret);
+
+ /* Initialize the variables of resource-controller */
+ rescon->curr_level = 0;
+ rescon->prev_level = 0;
+ rescon->min_level = 0;
+ rescon->max_level = 0;
+ rescon->init_level = 0;
+
+ rescon->state = PASS_OFF;
+
+ return ret;
+}
/*
- * PASS (Power Aware System Service) Governor
+ * PASS (Power Aware System Service) Resource-Controller
*
- * Copyright (c) 2012 - 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2012 - 2018 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
int pass_rescon_set_level(struct pass_resource *res, int new_level);
int pass_rescon_set_level_scope(struct pass_resource *res, int new_level,
int min_level, int max_level, void *data);
+
#endif /* __PASS_RESCON__ */
#include "pass-parser.h"
#include "pass-pmqos.h"
#include "pass-hal.h"
+#include "pass-rescon.h"
#define DBUS_CORE_I_START_HANDLER "handle_start"
#define DBUS_CORE_I_STOP_HANDLER "handle_stop"
#define DBUS_CORE_INTERFACE "org.tizen.system.pass.core"
#define DBUS_CORE_PATH "/Org/Tizen/System/Pass/Core"
#define PASS_CONF_PATH "/etc/pass/pass.conf"
-#define PASS_DEFAULT_MIN_LEVEL 0
+extern int pass_rescon_init(struct pass_resource *res);
+extern int pass_rescon_exit(struct pass_resource *res);
extern int pass_governor_init(struct pass_resource *res);
extern int pass_governor_exit(struct pass_resource *res);
return -1;
}
- /*
- * Set default value to global pass_resource instance
- * if variable isn't initialized.
- */
- if (!res->rescon.min_level)
- res->rescon.min_level = PASS_DEFAULT_MIN_LEVEL;
- res->config_data.default_min_level = res->rescon.min_level;
-
- if (!res->rescon.max_level)
- res->rescon.max_level = res->config_data.num_levels - 1;
- res->config_data.default_max_level = res->rescon.max_level;
-
- if (!res->rescon.init_level)
- res->rescon.init_level = PASS_DEFAULT_MIN_LEVEL;
-
for (i = 0; i < res->config_data.num_levels; i++)
if (res->config_data.levels[i].gov_timeout == 0)
res->config_data.levels[i].gov_timeout =
res->config_data.gov_timeout;
+ /*
+ * Have to initialize the ResCon (Resource-Controller) before calling
+ * the init function of modules. Because there are ordering dependency.
+ */
+ ret = pass_rescon_init(res);
+ if (ret < 0) {
+ _E("cannot initialize PASS Resource-Controller");
+ return ret;
+ }
+
ret = pass_governor_init(res);
if (ret < 0) {
_E("cannot initialize PASS governor");
- return -1;
+ goto err_cpuhp;
}
ret = pass_pmqos_init(res);
if (ret < 0) {
_E("cannot initialize PASS PMQoS");
- goto err;
+ goto err_pmqos;
}
return 0;
-err:
+
+err_pmqos:
if (pass_governor_exit(res) < 0)
_E("cannot exit PASS governor");
+err_cpuhp:
+ if (pass_rescon_exit(res) < 0)
+ _E("cannot exit PASS Resource-Controller");
return ret;
}
return ret;
}
+ /*
+ * Have to exit the ResCon (Resource-Controller) after called
+ * the exit function of modules. Because there are ordering dependency.
+ */
+ ret = pass_rescon_exit(res);
+ if (ret < 0) {
+ _E("cannot exit PASS Resource-Controller");
+ return ret;
+ }
+
return 0;
}
continue;
}
- ret = pass_save_initdata(res);
- if (ret < 0) {
- _E("Cannot save initdata of '%s' resource (%d)\n",
- config_data->res_name, ret);
-
- ret = pass_put_resource(res);
- if (ret < 0)
- _E("Cannot put the pass '%s' resource (%d)\n",
- config_data->res_name, ret);
-
- res->state = PASS_UNUSED;
- continue;
- }
-
ret = pass_init_resource(res);
if (ret < 0) {
_E("Cannot initialize the pass '%s' resource (%d)\n",
config_data->res_name, ret);
- ret = pass_restore_initdata(res);
- if (ret < 0)
- _E("Cannot restore the initdata of '%s' "
- "resource (%d)\n", config_data->res_name, ret);
-
ret = pass_put_resource(res);
if (ret < 0)
_E("Cannot put the pass '%s' resource (%d)\n",
_E("Cannot exit the pass '%s' resource (%d)\n",
config_data->res_name, ret);
- ret = pass_restore_initdata(res);
- if (ret < 0)
- _E("Cannot restore initdata of '%s' resource (%d)\n",
- config_data->res_name, ret);
-
ret = pass_put_resource(res);
if (ret < 0) {
_E("Cannot put the pass '%s' resource (%d)\n",