pass: plugin: Add the get/set_freq for CPU/BUS/GPU frequency h/w resource
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 29 Jun 2016 07:42:26 +0000 (16:42 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 16 Jan 2017 11:35:37 +0000 (20:35 +0900)
This patch adds the funcions to handle the h/w resource of CPU, Memory bus
and GPU frequency. This functions can handle the maximum/minimum/current
frequency of h/w resource.

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

index 8b2faa60989c6fa8809b80e6236ac993aac0d70e..fa88a775db1ea584baa0935fbdbded781b08754e 100644 (file)
@@ -73,81 +73,131 @@ int get_pass_cpu_stats(struct pass_policy *policy)
        return 0;
 }
 
-/*
- * Get/Set maximum cpu frequency
- */
-int get_cpufreq_scaling_max_freq(unsigned int cpu)
+enum FUNC_TYPE {
+       FUNC_GET = 0,
+       FUNC_SET,
+};
+
+enum FREQ_TYPE {
+       CPUFREQ = 0,
+       BUSFREQ,
+       GPUFREQ,
+};
+
+enum FREQ_VALUE_TYPE {
+       FREQ_CUR = 0,
+       FREQ_MAX,
+       FREQ_MIN,
+       FREQ_TYPE_NUM,
+};
+
+static int handle_freq(enum FUNC_TYPE func_type,
+                       enum FREQ_TYPE freq_type,
+                       enum FREQ_VALUE_TYPE value_type,
+                       char *dev_name, unsigned int cpu, unsigned int val)
 {
+       static char cpufreq[FREQ_TYPE_NUM][BUFF_MAX] = {
+                               "scaling_cur_freq",
+                               "scaling_max_freq",
+                               "scaling_min_freq" };
+       static char devfreq[FREQ_TYPE_NUM][BUFF_MAX] = {
+                               "cur_freq",
+                               "max_freq",
+                               "min_freq" };
        char path[BUFF_MAX];
-       int online;
+       int freq = 0;
        int ret;
 
-       ret = sprintf(path,
-               "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu);
-       if (ret < 0)
+       switch (freq_type) {
+       case CPUFREQ:
+               ret = sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/%s",
+                                       cpu, cpufreq[value_type]);
+               if (ret < 0)
+                       return -EINVAL;
+               break;
+       case BUSFREQ:
+       case GPUFREQ:
+               ret = sprintf(path, "/sys/class/devfreq/%s/%s",
+                                       dev_name, devfreq[value_type]);
+               if (ret < 0)
+                       return -EINVAL;
+               break;
+       default:
                return -EINVAL;
+       }
+
+       switch (func_type) {
+       case FUNC_GET:
+               ret = sys_get_int(path, &freq);
+       case FUNC_SET:
+               ret = sys_set_int(path, val);
+       default:
+               return -EINVAL;
+       };
 
-       ret = sys_get_int(path, &online);
        if (ret < 0)
                return -EAGAIN;
-
-       return online;
+       return freq;
 }
 
-int set_cpufreq_scaling_max_freq(unsigned int cpu, int freq)
-{
-       char path[BUFF_MAX];
-       int ret;
+#define GET_FREQ(name, freq_type, val_type)                            \
+int name (unsigned int cpu, char *dev_name) {                          \
+       return handle_freq(FUNC_GET, freq_type, val_type, dev_name, cpu, 0); \
+}                                                                      \
 
-       ret = sprintf(path,
-               "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu);
-       if (ret < 0) {
-               return -EINVAL;
-       }
+#define SET_FREQ(name, freq_type, val_type)                            \
+int name (unsigned int cpu, char *dev_name, unsigned int val) {                \
+       return handle_freq(FUNC_SET, freq_type, val_type, dev_name, cpu, val); \
+}                                                                      \
 
-       ret = sys_set_int(path, freq);
-       if (ret < 0) {
-               return -EAGAIN;
-       }
+/* Get/Set the max/min/curr frequenc for CPU */
+GET_FREQ(get_cpufreq_max_freq, CPUFREQ, FREQ_MAX);
+GET_FREQ(get_cpufreq_min_freq, CPUFREQ, FREQ_MIN);
+GET_FREQ(get_cpufreq_cur_freq, CPUFREQ, FREQ_CUR);
 
-       return 0;
-}
+SET_FREQ(set_cpufreq_max_freq, CPUFREQ, FREQ_MAX);
+SET_FREQ(set_cpufreq_min_freq, CPUFREQ, FREQ_MIN);
+SET_FREQ(set_cpufreq_cur_freq, CPUFREQ, FREQ_CUR);
 
-int get_cpufreq_scaling_min_freq(unsigned int cpu)
-{
-       char path[BUFF_MAX];
-       int online;
-       int ret;
+/* Get/Set the max/min/curr frequenc for memory bus */
+GET_FREQ(get_busfreq_max_freq, BUSFREQ, FREQ_MAX);
+GET_FREQ(get_busfreq_min_freq, BUSFREQ, FREQ_MIN);
+GET_FREQ(get_busfreq_cur_freq, BUSFREQ, FREQ_CUR);
 
-       ret = sprintf(path,
-               "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu);
-       if (ret < 0)
-               return -EINVAL;
+SET_FREQ(set_busfreq_max_freq, BUSFREQ, FREQ_MAX);
+SET_FREQ(set_busfreq_min_freq, BUSFREQ, FREQ_MIN);
+SET_FREQ(set_busfreq_cur_freq, BUSFREQ, FREQ_CUR);
 
-       ret = sys_get_int(path, &online);
-       if (ret < 0)
-               return -EAGAIN;
+/* Get/Set the max/min/curr frequenc for GPU */
+GET_FREQ(get_gpufreq_max_freq, GPUFREQ, FREQ_MAX);
+GET_FREQ(get_gpufreq_min_freq, GPUFREQ, FREQ_MIN);
+GET_FREQ(get_gpufreq_cur_freq, GPUFREQ, FREQ_CUR);
 
-       return online;
-}
+SET_FREQ(set_gpufreq_max_freq, GPUFREQ, FREQ_MAX);
+SET_FREQ(set_gpufreq_min_freq, GPUFREQ, FREQ_MIN);
+SET_FREQ(set_gpufreq_cur_freq, GPUFREQ, FREQ_CUR);
 
-int set_cpufreq_scaling_min_freq(unsigned int cpu, int freq)
+/*
+ * Get/Set maximum cpu frequency
+ */
+int get_cpufreq_scaling_max_freq(unsigned int cpu)
 {
-       char path[BUFF_MAX];
-       int ret;
+       return get_cpufreq_max_freq(cpu, NULL);
+}
 
-       ret = sprintf(path,
-               "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu);
-       if (ret < 0) {
-               return -EINVAL;
-       }
+int set_cpufreq_scaling_max_freq(unsigned int cpu, int freq)
+{
+       return set_cpufreq_max_freq(cpu, NULL, freq);
+}
 
-       ret = sys_set_int(path, freq);
-       if (ret < 0) {
-               return -EAGAIN;
-       }
+int get_cpufreq_scaling_min_freq(unsigned int cpu)
+{
+       return get_cpufreq_min_freq(cpu, NULL);
+}
 
-       return 0;
+int set_cpufreq_scaling_min_freq(unsigned int cpu, int freq)
+{
+       return set_cpufreq_min_freq(cpu, NULL, freq);
 }
 
 int get_cpu_online(unsigned int cpu)