Skip to content

Commit 983fa37

Browse files
gaming_control: add custom gpu/cpus freq and voltage selections
1 parent dfc0962 commit 983fa37

File tree

5 files changed

+209
-11
lines changed

5 files changed

+209
-11
lines changed

drivers/gpu/arm/exynos/frontend/gpex_clock.c

+4
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,12 @@ void gpex_clock_term()
379379

380380
int gpex_clock_get_table_idx(int clock)
381381
{
382+
int fake_freq = fake_freq_gaming(DVFS_G3D);
382383
int i;
383384

385+
if (fake_freq)
386+
clock = fake_freq;
387+
384388
if (clock < clk_info.gpu_min_clock)
385389
return -1;
386390

drivers/gpu/arm/exynos/frontend/gpex_dvfs_internal.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222
#define _GPEX_DVFS_INTERNAL_H_
2323

2424
#include <gpex_clock.h>
25+
#include <linux/gaming_control.h>
2526

2627
#define DVFS_ASSERT(x) \
2728
do { \
28-
if (x) \
29+
if (x || fake_freq_gaming(DVFS_G3D)) \
2930
break; \
3031
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %s\n", __FILE__, __func__, \
3132
__LINE__, #x); \

drivers/misc/gaming_control.c

+181-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,19 @@
2525
#include <linux/slab.h>
2626
#include <linux/pm_qos.h>
2727
#include <linux/gaming_control.h>
28-
28+
#include <soc/samsung/cal-if.h>
29+
#include <soc/samsung/exynos-cpu_hotplug.h>
30+
#include <dt-bindings/clock/exynos9810.h>
31+
#include "../soc/samsung/cal-if/exynos9810/cmucal-vclk.h"
32+
#include "../soc/samsung/cal-if/exynos9810/cmucal-node.h"
33+
34+
extern unsigned long arg_cpu_max_c1;
35+
extern unsigned long arg_cpu_min_c1;
36+
extern unsigned long arg_cpu_max_c2;
37+
extern unsigned long arg_cpu_min_c2;
38+
extern unsigned long arg_gpu_min;
39+
extern unsigned long arg_gpu_max;
40+
extern int exynos_cpufreq_update_volt_table(void);
2941
extern void exynos_cpufreq_set_gaming_mode(void);
3042

3143
/* PM QoS implementation */
@@ -43,9 +55,13 @@ static unsigned int min_big_freq = 1469000;
4355
static unsigned int max_big_freq = 2886000;
4456
static unsigned int min_gpu_freq = 598000;
4557
static unsigned int max_gpu_freq = 598000;
58+
static unsigned int custom_little_freq, custom_little_voltage, custom_big_freq, custom_big_voltage, custom_gpu_freq, custom_gpu_voltage = 0;
59+
static unsigned int back_little_freq, back_little_voltage, back_big_freq, back_big_voltage, back_gpu_freq, back_gpu_voltage = 0;
4660
static int nr_running_games = 0;
4761
static bool always_on = 0;
4862
static bool battery_idle = 0;
63+
static bool gaming_mode_initialized = 0;
64+
4965
bool gaming_mode;
5066

5167
char games_list[GAME_LIST_LENGTH] = {0};
@@ -55,25 +71,169 @@ pid_t games_pid[NUM_SUPPORTED_RUNNING_GAMES] = {
5571

5672
static inline void set_gaming_mode(bool mode, bool force)
5773
{
74+
unsigned int little_max, little_min, big_max, big_min, gpu_max, gpu_min;
75+
5876
if (always_on)
5977
mode = 1;
6078

6179
if (mode == gaming_mode && !force)
6280
return;
6381
else
6482
gaming_mode = mode;
65-
83+
84+
if (!mode)
85+
gaming_mode_initialized = 0;
86+
87+
little_max = max_little_freq;
88+
little_min = min_little_freq;
89+
big_max = max_big_freq;
90+
big_min = min_big_freq;
91+
gpu_max = max_gpu_freq;
92+
gpu_min = min_gpu_freq;
93+
94+
if (custom_little_freq) {
95+
if (custom_little_freq <= arg_cpu_min_c1)
96+
little_max = little_min = arg_cpu_min_c1;
97+
else if (custom_little_freq >= arg_cpu_max_c1)
98+
little_max = little_min = arg_cpu_max_c1;
99+
}
100+
101+
if (!back_little_freq)
102+
back_little_freq = little_max;
103+
104+
if (custom_little_voltage && mode && !back_little_voltage) {
105+
back_little_voltage = fvmap_read(DVFS_CPUCL0, READ_VOLT, back_little_freq);
106+
fvmap_patch(DVFS_CPUCL0, back_little_freq, custom_little_voltage);
107+
} else if (!mode && back_little_voltage) {
108+
fvmap_patch(DVFS_CPUCL0, back_little_freq, back_little_voltage);
109+
back_little_freq = back_little_voltage = 0;
110+
}
111+
112+
if (custom_big_freq) {
113+
if (custom_big_freq <= arg_cpu_min_c2)
114+
big_max = big_min = arg_cpu_min_c2;
115+
else if (custom_big_freq >= arg_cpu_max_c2)
116+
big_max = big_min = arg_cpu_max_c2;
117+
}
118+
119+
if (!back_big_freq)
120+
back_big_freq = big_max;
121+
122+
if (custom_big_voltage && mode && !back_big_voltage) {
123+
back_big_voltage = fvmap_read(DVFS_CPUCL1, READ_VOLT, back_big_freq);
124+
fvmap_patch(DVFS_CPUCL1, back_big_freq, custom_big_voltage);
125+
} else if (!mode && back_big_voltage) {
126+
fvmap_patch(DVFS_CPUCL1, back_big_freq, back_big_voltage);
127+
back_big_freq = back_big_voltage = 0;
128+
}
129+
130+
if (custom_gpu_freq) {
131+
if (custom_gpu_freq <= arg_gpu_min)
132+
gpu_max = gpu_min = arg_gpu_min;
133+
else if (custom_gpu_freq >= arg_gpu_max)
134+
gpu_max = gpu_min = arg_gpu_max;
135+
}
136+
137+
if (!back_gpu_freq)
138+
back_gpu_freq = gpu_max;
139+
140+
if (custom_gpu_voltage && mode && !back_gpu_voltage) {
141+
back_gpu_voltage = gpex_clock_get_voltage(back_gpu_freq);
142+
fvmap_patch(DVFS_G3D, back_gpu_freq, custom_gpu_voltage);
143+
} else if (!mode && back_gpu_voltage) {
144+
fvmap_patch(DVFS_G3D, back_gpu_freq, back_gpu_voltage);
145+
back_gpu_freq = back_gpu_voltage = 0;
146+
}
147+
148+
gpex_clock_update_config_data_from_dt();
149+
exynos_cpufreq_update_volt_table();
66150
exynos_cpufreq_set_gaming_mode();
67151

68152
pm_qos_update_request(&gaming_control_min_int_qos, mode && min_int_freq ? min_int_freq : PM_QOS_DEVICE_THROUGHPUT_DEFAULT_VALUE);
69153
pm_qos_update_request(&gaming_control_min_mif_qos, mode && min_mif_freq ? min_mif_freq : PM_QOS_BUS_THROUGHPUT_DEFAULT_VALUE);
70-
pm_qos_update_request(&gaming_control_min_little_qos, mode && min_little_freq ? min_little_freq : PM_QOS_CLUSTER0_FREQ_MIN_DEFAULT_VALUE);
71-
pm_qos_update_request(&gaming_control_max_little_qos, mode && max_little_freq ? max_little_freq : PM_QOS_CLUSTER0_FREQ_MAX_DEFAULT_VALUE);
72-
pm_qos_update_request(&gaming_control_min_big_qos, mode && min_big_freq ? min_big_freq : PM_QOS_CLUSTER1_FREQ_MIN_DEFAULT_VALUE);
73-
pm_qos_update_request(&gaming_control_max_big_qos, mode && max_big_freq ? max_big_freq : PM_QOS_CLUSTER1_FREQ_MAX_DEFAULT_VALUE);
74-
75-
gpu_custom_max_clock(mode ? max_gpu_freq : 0);
76-
gpu_custom_min_clock(mode ? min_gpu_freq : 0);
154+
pm_qos_update_request(&gaming_control_min_little_qos, mode && little_min ? little_min : PM_QOS_CLUSTER0_FREQ_MIN_DEFAULT_VALUE);
155+
pm_qos_update_request(&gaming_control_max_little_qos, mode && little_max ? little_max : PM_QOS_CLUSTER0_FREQ_MAX_DEFAULT_VALUE);
156+
pm_qos_update_request(&gaming_control_min_big_qos, mode && big_min ? big_min : PM_QOS_CLUSTER1_FREQ_MIN_DEFAULT_VALUE);
157+
pm_qos_update_request(&gaming_control_max_big_qos, mode && big_max ? big_max : PM_QOS_CLUSTER1_FREQ_MAX_DEFAULT_VALUE);
158+
159+
gpu_custom_max_clock(mode ? gpu_max : 0);
160+
gpu_custom_min_clock(mode ? gpu_min : 0);
161+
162+
if (mode)
163+
gaming_mode_initialized = 1;
164+
165+
if (custom_little_freq) {
166+
__cal_dfs_set_rate(ACPM_DVFS_CPUCL0, mode ? custom_little_freq : little_max);
167+
__cal_dfs_set_rate(VCLK_CLUSTER0, (mode ? custom_little_freq : little_max) * 1000);
168+
__cal_dfs_set_rate(PLL_CPUCL0, (mode ? custom_little_freq : little_max) * 1000);
169+
}
170+
171+
if (custom_big_freq) {
172+
__cal_dfs_set_rate(ACPM_DVFS_CPUCL1, mode ? custom_big_freq : big_max);
173+
__cal_dfs_set_rate(VCLK_CLUSTER1, (mode ? custom_big_freq : big_max) * 1000);
174+
__cal_dfs_set_rate(PLL_CPUCL1, (mode ? custom_big_freq : big_max) * 1000);
175+
}
176+
177+
if (custom_gpu_freq) {
178+
__cal_dfs_set_rate(ACPM_DVFS_G3D, mode ? custom_gpu_freq : gpu_max);
179+
__cal_dfs_set_rate(VCLK_GPU, (mode ? custom_gpu_freq : gpu_max) * 1000);
180+
__cal_dfs_set_rate(PLL_G3D, (mode ? custom_gpu_freq : gpu_max) * 1000);
181+
}
182+
}
183+
184+
unsigned long cal_dfs_check_gaming_mode(unsigned int id) {
185+
unsigned long ret = 0;
186+
187+
if (!gaming_mode_initialized)
188+
return ret;
189+
190+
switch (id) {
191+
/* LITTLE */
192+
case ACPM_DVFS_CPUCL0:
193+
ret = custom_little_freq;
194+
break;
195+
/* BIG */
196+
case ACPM_DVFS_CPUCL1:
197+
ret = custom_big_freq;
198+
break;
199+
/* GPU */
200+
case ACPM_DVFS_G3D:
201+
ret = custom_gpu_freq;
202+
break;
203+
default:
204+
break;
205+
}
206+
207+
return ret;
208+
}
209+
210+
int fake_freq_gaming(int id) {
211+
int ret = 0;
212+
213+
if (!gaming_mode)
214+
return ret;
215+
216+
switch (id) {
217+
/* LITTLE */
218+
case ACPM_DVFS_CPUCL0:
219+
case DVFS_CPUCL0:
220+
ret = back_little_freq;
221+
break;
222+
/* BIG */
223+
case ACPM_DVFS_CPUCL1:
224+
case DVFS_CPUCL1:
225+
ret = back_big_freq;
226+
break;
227+
/* GPU */
228+
case ACPM_DVFS_G3D:
229+
case DVFS_G3D:
230+
ret = back_gpu_freq;
231+
break;
232+
default:
233+
break;
234+
}
235+
236+
return ret;
77237
}
78238

79239
bool battery_idle_gaming(void) {
@@ -250,6 +410,12 @@ attr_value(min_big_freq);
250410
attr_value(max_big_freq);
251411
attr_value(min_gpu_freq);
252412
attr_value(max_gpu_freq);
413+
attr_value(custom_little_freq);
414+
attr_value(custom_little_voltage);
415+
attr_value(custom_big_freq);
416+
attr_value(custom_big_voltage);
417+
attr_value(custom_gpu_freq);
418+
attr_value(custom_gpu_voltage);
253419

254420
static ssize_t version_show(struct kobject *kobj,
255421
struct kobj_attribute *attr, char *buf)
@@ -276,6 +442,12 @@ static struct attribute *gaming_control_attributes[] = {
276442
&max_big_freq_attribute.attr,
277443
&min_gpu_freq_attribute.attr,
278444
&max_gpu_freq_attribute.attr,
445+
&custom_little_freq_attribute.attr,
446+
&custom_little_voltage_attribute.attr,
447+
&custom_big_freq_attribute.attr,
448+
&custom_big_voltage_attribute.attr,
449+
&custom_gpu_freq_attribute.attr,
450+
&custom_gpu_voltage_attribute.attr,
279451
NULL
280452
};
281453

drivers/soc/samsung/cal-if/cal-if.c

+15
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <soc/samsung/ect_parser.h>
44
#include <soc/samsung/cal-if.h>
55
#include <soc/samsung/acpm_mfd.h>
6+
#include <linux/gaming_control.h>
67

78
#include "pwrcal-env.h"
89
#include "pwrcal-rae.h"
@@ -67,6 +68,9 @@ int __cal_dfs_set_rate(unsigned int id, unsigned long rate)
6768

6869
int cal_dfs_set_rate(unsigned int id, unsigned long rate)
6970
{
71+
if (cal_dfs_check_gaming_mode(id))
72+
return 0;
73+
7074
return __cal_dfs_set_rate(id, rate);
7175
}
7276

@@ -101,6 +105,10 @@ unsigned long cal_dfs_get_rate(unsigned int id)
101105
{
102106
int ret;
103107

108+
ret = cal_dfs_check_gaming_mode(id);
109+
if (ret)
110+
return ret;
111+
104112
ret = vclk_recalc_rate(id);
105113

106114
return ret;
@@ -119,6 +127,9 @@ int cal_clk_setrate(unsigned int id, unsigned long rate)
119127
{
120128
int ret = -EINVAL;
121129

130+
if (cal_dfs_check_gaming_mode(id))
131+
return 0;
132+
122133
ret = vclk_set_rate(id, rate);
123134

124135
return ret;
@@ -128,6 +139,10 @@ unsigned long cal_clk_getrate(unsigned int id)
128139
{
129140
int ret = 0;
130141

142+
ret = cal_dfs_check_gaming_mode(id);
143+
if (ret)
144+
return ret;
145+
131146
ret = vclk_recalc_rate(id);
132147

133148
return ret;

include/linux/gaming_control.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
#define GAME_LIST_LENGTH 1024
2323
#define NUM_SUPPORTED_RUNNING_GAMES 20
24-
#define GAMING_CONTROL_VERSION "0.4"
24+
#define GAMING_CONTROL_VERSION "0.6"
2525

2626
#define TASK_STARTED 1
2727

@@ -47,17 +47,23 @@ enum dvfs_id {
4747
DVFS_CP,
4848
};
4949

50+
int gpex_clock_update_config_data_from_dt(void);
51+
int gpex_clock_get_voltage(int clk);
5052
int gpu_custom_min_clock(int gpu_min_clock);
5153
int gpu_custom_max_clock(int gpu_max_clock);
5254

5355
#ifdef CONFIG_GAMING_CONTROL
5456
extern bool gaming_mode;
5557
extern void game_option(struct task_struct *tsk, enum game_opts opts);
5658
extern bool battery_idle_gaming(void);
59+
extern int fake_freq_gaming(int id);
60+
extern unsigned long cal_dfs_check_gaming_mode(unsigned int id);
5761
#else
5862
static bool gaming_mode = 0;
5963
static void game_option(struct task_struct *tsk, enum game_opts opts) {};
6064
static bool battery_idle_gaming(void) {return false;};
65+
static int fake_freq_gaming(int id) {return 0;};
66+
static unsigned long cal_dfs_check_gaming_mode(unsigned int id) {return 0;};
6167
#endif /* CONFIG_GAMING_CONTROL */
6268

6369
#endif /* _GAMING_CONTROL_H_ */

0 commit comments

Comments
 (0)