pass: rescon: Move initialization code to guarantee the independnecy 31/169031/2
authorChanwoo Choi <cw00.choi@samsung.com>
Fri, 2 Feb 2018 00:54:02 +0000 (09:54 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Fri, 2 Feb 2018 04:12:46 +0000 (13:12 +0900)
Each module have to initialize/control their own variables
included in module structure. Move initialization code of ResCon
(Resource Controller) from pass.c/pass-gov.c to pass-rescon.c
in orer to guarantee the independnecy among modules.

Change-Id: I4568e2bfe3c6b6ba37b0161dce802bbcef4d6ba6
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
src/pass/pass-gov.c
src/pass/pass-rescon.c
src/pass/pass-rescon.h
src/pass/pass.c
src/pass/pass.h

index d4e0b73609c16f43dff8f842e9f8368eadfff393..098e5ad3f8c0494636ec96932cddcf80479ac19d 100644 (file)
@@ -386,11 +386,6 @@ static int __pass_governor_exit(struct pass_resource *res)
        cpuhp->num_pass_cpu_stats = 0;
        cpuhp->governor = NULL;
 
-       res->rescon.prev_level = 0;
-       res->rescon.curr_level = 0;
-       res->rescon.min_level = 0;
-       res->rescon.max_level = 0;
-
        return 0;
 }
 
index 60618734093a3266c2c004768e7be9d66c93393c..0bcfaff7cedbf962741aa56175185c9a41eef246 100644 (file)
@@ -185,3 +185,91 @@ int pass_rescon_set_level_scope(struct pass_resource *res, int new_level,
 
        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;
+}
index e98a407810b055f95c4a3ecf919262d550b18f85..9e06cd964a197c91320c793dfe5b033ac988dd5c 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * 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.
@@ -22,4 +22,5 @@
 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__ */
index e38f01951f74aa31fe297339a79a09a78c49bc05..39cf534f93c2a370be7a6ace6eb3f04a63418a2a 100644 (file)
@@ -31,6 +31,7 @@
 #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"
@@ -38,8 +39,9 @@
 #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);
 
@@ -134,42 +136,41 @@ static int pass_init_resource(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;
 }
@@ -193,6 +194,16 @@ static int pass_exit_resource(struct pass_resource *res)
                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;
 }
 
@@ -236,30 +247,11 @@ static int pass_init_done(void *data, void *user_data)
                        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",
@@ -294,11 +286,6 @@ static int pass_exit_done(void)
                        _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",
index 09cdae86e425bf4c902fef18209203685155f212..7619c7ef41cf5f6c5cfe31461aeb00d64d76c99d 100644 (file)
@@ -190,6 +190,7 @@ struct pass_scenario {
 /*
  * struct pass_rescon - Represent ResCon (Resource-Controller) module
  *
+ * @state: the state of ResCon (either enabled or disabled).
  * @init_level: the required initial level when initializing h/w resource..
  * @curr_level: the current level controlled by resource-controller.
  * @prev_level: the previous level controlled by resource-controller.
@@ -199,6 +200,8 @@ struct pass_scenario {
  * ResCon should be always enabled in order to controle h/w resources.
  */
 struct pass_rescon {
+       enum pass_state state;
+
        unsigned int init_level;
        unsigned int curr_level;
        unsigned int prev_level;