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/devices/platform/soc/"
16 #define DEVFREQ_GPU_PATH_INFIX "/devfreq/"
17 #define DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX "/governor"
18 #define DEVFREQ_GPU_CURR_FREQ_PATH_SUFFIX "/cur_freq"
19 #define DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX "/min_freq"
20 #define DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX "/max_freq"
22 #define TMU_PATH_PREFIX "/sys/class/thermal/thermal_zone"
23 #define TMU_TEMP_PATH_SUFFIX "/temp"
24 #define TMU_POLICY_PATH_SUFFIX "/policy"
26 #define TM2_GPU_THERMAL_ZONE_NUM 2
28 static int tm2_dvfs_get_curr_governor(char *res_name, char *governor)
33 if ((!res_name) || (!governor))
36 snprintf(path, PATH_MAX, "%s%s%s%s%s",
37 DEVFREQ_GPU_PATH_PREFIX,
39 DEVFREQ_GPU_PATH_INFIX,
41 DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX);
43 ret = sysfs_read_str(path, governor, BUFF_MAX);
50 static int tm2_dvfs_set_curr_governor(char *res_name, char *governor)
55 if ((!res_name) || (!governor))
58 snprintf(path, PATH_MAX, "%s%s%s%s%s",
59 DEVFREQ_GPU_PATH_PREFIX,
61 DEVFREQ_GPU_PATH_INFIX,
63 DEVFREQ_GPU_CURR_GOVERNOR_PATH_SUFFIX);
65 ret = sysfs_write_str(path, governor);
72 static int tm2_dvfs_get_curr_freq(char *res_name)
80 snprintf(path, PATH_MAX, "%s%s%s%s%s",
81 DEVFREQ_GPU_PATH_PREFIX,
83 DEVFREQ_GPU_PATH_INFIX,
85 DEVFREQ_GPU_CURR_FREQ_PATH_SUFFIX);
87 ret = sysfs_read_int(path, &freq);
94 static int tm2_dvfs_get_min_freq(char *res_name)
102 snprintf(path, PATH_MAX, "%s%s%s%s%s",
103 DEVFREQ_GPU_PATH_PREFIX,
105 DEVFREQ_GPU_PATH_INFIX,
107 DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX);
109 ret = sysfs_read_int(path, &freq);
116 static int tm2_dvfs_set_min_freq(char *res_name, int freq)
121 if ((!res_name) || (freq < 0))
124 snprintf(path, PATH_MAX, "%s%s%s%s%s",
125 DEVFREQ_GPU_PATH_PREFIX,
127 DEVFREQ_GPU_PATH_INFIX,
129 DEVFREQ_GPU_MIN_FREQ_PATH_SUFFIX);
131 ret = sysfs_write_int(path, freq);
138 static int tm2_dvfs_get_max_freq(char *res_name)
146 snprintf(path, PATH_MAX, "%s%s%s%s%s",
147 DEVFREQ_GPU_PATH_PREFIX,
149 DEVFREQ_GPU_PATH_INFIX,
151 DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX);
153 ret = sysfs_read_int(path, &freq);
160 static int tm2_dvfs_set_max_freq(char *res_name, int freq)
165 if ((!res_name) || (freq < 0))
168 snprintf(path, PATH_MAX, "%s%s%s%s%s",
169 DEVFREQ_GPU_PATH_PREFIX,
171 DEVFREQ_GPU_PATH_INFIX,
173 DEVFREQ_GPU_MAX_FREQ_PATH_SUFFIX);
175 ret = sysfs_write_int(path, freq);
182 static struct pass_resource_dvfs_ops tm2_gpu_dvfs_ops = {
183 .get_curr_governor = tm2_dvfs_get_curr_governor,
184 .set_curr_governor = tm2_dvfs_set_curr_governor,
185 .get_avail_governor = NULL,
186 .get_curr_freq = tm2_dvfs_get_curr_freq,
187 .get_min_freq = tm2_dvfs_get_min_freq,
188 .set_min_freq = tm2_dvfs_set_min_freq,
189 .get_max_freq = tm2_dvfs_get_max_freq,
190 .set_max_freq = tm2_dvfs_set_max_freq,
191 .get_up_threshold = NULL,
192 .set_up_threshold = NULL,
193 .get_load_table = NULL,
196 static int tm2_tmu_get_temp(char *res_name)
205 snprintf(path, PATH_MAX, "%s%d%s",
207 TM2_GPU_THERMAL_ZONE_NUM,
208 TMU_TEMP_PATH_SUFFIX);
210 ret = sysfs_read_int(path, &temp);
217 static int tm2_tmu_get_policy(char *res_name, char *policy)
222 if ((!res_name) || (!policy))
225 snprintf(path, PATH_MAX, "%s%d%s",
227 TM2_GPU_THERMAL_ZONE_NUM,
228 TMU_POLICY_PATH_SUFFIX);
230 ret = sysfs_read_str(path, policy, BUFF_MAX);
237 static struct pass_resource_tmu_ops tm2_gpu_tmu_ops = {
238 .get_temp = tm2_tmu_get_temp,
239 .get_policy = tm2_tmu_get_policy,
242 static int tm2_gpu_open(struct pass_resource_info *info,
243 struct pass_resource_common **common)
245 struct pass_resource_gpu *gpu_res;
250 /* TODO: Possibility of a memory leak */
251 gpu_res = calloc(1, sizeof(struct pass_resource_gpu));
255 gpu_res->common.info = info;
256 gpu_res->dvfs = tm2_gpu_dvfs_ops;
257 gpu_res->tmu = tm2_gpu_tmu_ops;
259 *common = (struct pass_resource_common *) gpu_res;
264 static int tm2_gpu_close(struct pass_resource_common *common)
274 HAL_MODULE_STRUCTURE = {
275 .magic = HAL_INFO_TAG,
276 .hal_version = HAL_VERSION,
277 .device_version = DEV_VERSION_GPU,
278 .id = PASS_RESOURCE_GPU_ID,
279 .name = PASS_RESOURCE_GPU_NAME,
280 .author = "Wook Song <wook16.song@samsung.com>",
281 .open = tm2_gpu_open,
282 .close = tm2_gpu_close,