4 #include <pass/hal-log.h>
9 #include "../shared/sysfs.h"
12 #define HAL_VERSION MAKE_2B_CODE_4(VER_MAJOR,VER_MINOR,VER_REVISION,VER_RELEASE)
13 #define DEV_VERSION_GPU MAKE_2B_CODE_2(1,0)
15 #define DEVFREQ_GPU_PATH_PREFIX "/sys/class/devfreq/"
16 #define DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX "/governor"
17 #define DEVFREQ_GPU_CURR_FREQ_PATH_SUFFIX "/cur_freq"
18 #define DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX "/min_freq"
19 #define DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX "/max_freq"
21 #define TMU_PATH_PREFIX "/sys/class/thermal/thermal_zone"
22 #define TMU_TEMP_PATH_SUFFIX "/temp"
23 #define TMU_POLICY_PATH_SUFFIX "/policy"
25 #define TM2_GPU_THERMAL_ZONE_NUM 2
27 static int tm2_dvfs_get_curr_governor(char *res_name, char *governor)
32 if ((!res_name) || (!governor))
35 snprintf(path, PATH_MAX, "%s%s%s",
36 DEVFREQ_GPU_PATH_PREFIX,
38 DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX);
40 ret = sysfs_read_str(path, governor, BUFF_MAX);
47 static int tm2_dvfs_set_curr_governor(char *res_name, char *governor)
52 if ((!res_name) || (!governor))
55 snprintf(path, PATH_MAX, "%s%s%s",
56 DEVFREQ_GPU_PATH_PREFIX,
58 DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX);
60 ret = sysfs_write_str(path, governor);
67 static int tm2_dvfs_get_curr_freq(char *res_name)
75 snprintf(path, PATH_MAX, "%s%s%s",
76 DEVFREQ_GPU_PATH_PREFIX,
78 DEVFREQ_GPU_CURR_FREQ_PATH_SUFFIX);
80 ret = sysfs_read_int(path, &freq);
87 static int tm2_dvfs_get_min_freq(char *res_name)
95 snprintf(path, PATH_MAX, "%s%s%s",
96 DEVFREQ_GPU_PATH_PREFIX,
98 DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX);
100 ret = sysfs_read_int(path, &freq);
107 static int tm2_dvfs_set_min_freq(char *res_name, int freq)
112 if ((!res_name) || (freq < 0))
115 snprintf(path, PATH_MAX, "%s%s%s",
116 DEVFREQ_GPU_PATH_PREFIX,
118 DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX);
120 ret = sysfs_write_int(path, freq);
127 static int tm2_dvfs_get_max_freq(char *res_name)
135 snprintf(path, PATH_MAX, "%s%s%s",
136 DEVFREQ_GPU_PATH_PREFIX,
138 DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX);
140 ret = sysfs_read_int(path, &freq);
147 static int tm2_dvfs_set_max_freq(char *res_name, int freq)
152 if ((!res_name) || (freq < 0))
155 snprintf(path, PATH_MAX, "%s%s%s",
156 DEVFREQ_GPU_PATH_PREFIX,
158 DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX);
160 ret = sysfs_write_int(path, freq);
167 static struct pass_resource_dvfs_ops tm2_gpu_dvfs_ops = {
168 .get_curr_governor = tm2_dvfs_get_curr_governor,
169 .set_curr_governor = tm2_dvfs_set_curr_governor,
170 .get_avail_governor = NULL,
171 .get_curr_freq = tm2_dvfs_get_curr_freq,
172 .get_min_freq = tm2_dvfs_get_min_freq,
173 .set_min_freq = tm2_dvfs_set_min_freq,
174 .get_max_freq = tm2_dvfs_get_max_freq,
175 .set_max_freq = tm2_dvfs_set_max_freq,
176 .get_up_threshold = NULL,
177 .set_up_threshold = NULL,
178 .get_load_table = NULL,
181 static int tm2_tmu_get_temp(char *res_name)
190 snprintf(path, PATH_MAX, "%s%d%s",
192 TM2_GPU_THERMAL_ZONE_NUM,
193 TMU_TEMP_PATH_SUFFIX);
195 ret = sysfs_read_int(path, &temp);
202 static int tm2_tmu_get_policy(char *res_name, char *policy)
207 if ((!res_name) || (!policy))
210 snprintf(path, PATH_MAX, "%s%d%s",
212 TM2_GPU_THERMAL_ZONE_NUM,
213 TMU_POLICY_PATH_SUFFIX);
215 ret = sysfs_read_str(path, policy, BUFF_MAX);
222 static struct pass_resource_tmu_ops tm2_gpu_tmu_ops = {
223 .get_temp = tm2_tmu_get_temp,
224 .get_policy = tm2_tmu_get_policy,
227 static int tm2_gpu_open(struct pass_resource_info *info,
228 struct pass_resource_common **common)
230 struct pass_resource_gpu *gpu_res;
235 /* TODO: Possibility of a memory leak */
236 gpu_res = calloc(1, sizeof(struct pass_resource_gpu));
240 gpu_res->common.info = info;
241 gpu_res->dvfs = tm2_gpu_dvfs_ops;
242 gpu_res->tmu = tm2_gpu_tmu_ops;
244 *common = (struct pass_resource_common *) gpu_res;
249 static int tm2_gpu_close(struct pass_resource_common *common)
259 HAL_MODULE_STRUCTURE = {
260 .magic = HAL_INFO_TAG,
261 .hal_version = HAL_VERSION,
262 .device_version = DEV_VERSION_GPU,
263 .id = PASS_RESOURCE_GPU_ID,
264 .name = PASS_RESOURCE_GPU_NAME,
265 .author = "Wook Song <wook16.song@samsung.com>",
266 .open = tm2_gpu_open,
267 .close = tm2_gpu_close,