From: Chanwoo Choi Date: Wed, 29 Jun 2016 07:42:26 +0000 (+0900) Subject: pass: plugin: Add the get/set_freq for CPU/BUS/GPU frequency h/w resource X-Git-Tag: submit/tizen/20170328.004502~93 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5260f9255463b3be99e81a834295ca5b50ce6457;p=platform%2Fcore%2Fsystem%2Fpass.git pass: plugin: Add the get/set_freq for CPU/BUS/GPU frequency h/w resource 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 --- diff --git a/src/pass/pass-plugin.c b/src/pass/pass-plugin.c index 8b2faa6..fa88a77 100644 --- a/src/pass/pass-plugin.c +++ b/src/pass/pass-plugin.c @@ -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)