pass: rescon: Set init_level for init step to write the required level 42/169042/1
authorChanwoo Choi <cw00.choi@samsung.com>
Fri, 2 Feb 2018 03:53:52 +0000 (12:53 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Fri, 2 Feb 2018 04:12:46 +0000 (13:12 +0900)
The existing exported pass_rescon_set_level() controls the level
if required new level is different from current level. But, the init step
of ResCon (Resource Controller) always have to set the init_level
according to each resource's configuration file.

To support following two cases, add internal rescon_set_level() function
which doesn't check the available range of required level. Define internal
function instead of adding new exported function or changing the defintion
of existing function.
- case1: Change PASS level always if required.
- case2: Change PASS level if current level is different from required level.

Functions to control the h/w resource by PASS level.
- exported function : pass_rescon_set_level ()
- internal function : rescon_set_level ()

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

index 0bcfaff..2deefa8 100644 (file)
@@ -53,38 +53,17 @@ static void hotplug_set_online(struct pass_resource *res,
        hotplug->online = min_num;
 }
 
-/*
- * pass_rescon_set_level - Change frequency and number of online resources
- *
- * @res: the instance of struct pass_resource
- * @new_level: the desired pass level
- */
-int pass_rescon_set_level(struct pass_resource *res, int new_level)
+static int rescon_set_level(struct pass_resource *res, int new_level)
 {
-       struct pass_level *levels;
+       struct pass_level *levels = res->config_data.levels;;
        struct pass_cpuhp *cpuhp = &res->cpuhp;
-       int curr_level;
+       int curr_level = res->rescon.curr_level;
        int limit_max_freq;
        int limit_min_freq;
        int limit_min_cpu;
        int fault_around_bytes;
        int ret;
 
-       if (!res)
-               return -EINVAL;
-
-       levels = res->config_data.levels;
-       curr_level = res->rescon.curr_level;
-
-       if (new_level > res->rescon.max_level)
-               new_level = res->rescon.max_level;
-
-       if (new_level < res->rescon.min_level)
-               new_level = res->rescon.min_level;
-
-       if (new_level == curr_level)
-               return 0;
-
        /* Get the detailed resource value according to PASS level */
        limit_max_freq = levels[new_level].limit_max_freq;
        limit_min_freq = levels[new_level].limit_min_freq;
@@ -145,6 +124,29 @@ int pass_rescon_set_level(struct pass_resource *res, int new_level)
 };
 
 /*
+ * pass_rescon_set_level - Change frequency and number of online resources
+ *
+ * @res: the instance of struct pass_resource
+ * @new_level: the desired pass level
+ */
+int pass_rescon_set_level(struct pass_resource *res, int new_level)
+{
+       if (!res)
+               return -EINVAL;
+
+       if (new_level > res->rescon.max_level)
+               new_level = res->rescon.max_level;
+
+       if (new_level < res->rescon.min_level)
+               new_level = res->rescon.min_level;
+
+       if (new_level == res->rescon.curr_level)
+               return 0;
+
+       return rescon_set_level(res, new_level);
+};
+
+/*
  * pass_rescon_set_level_scope - Change the scope of pass level
  *
  * @res: the instance of struct pass_resource
@@ -230,7 +232,7 @@ int pass_rescon_init(struct pass_resource *res)
        }
 
        /* Set initial level according to init_level from configuration */
-       ret = pass_rescon_set_level(res, rescon->init_level);
+       ret = rescon_set_level(res, rescon->init_level);
        if (ret < 0) {
                _E("failed to set level%d\n", rescon->init_level);
                return ret;