blob: 27bb6d3877ed6cc64ea1fc5bde5c1094a6ab34b0 [file] [log] [blame]
Dirk Brandewie93f08222013-02-06 09:02:13 -08001/*
Srinivas Pandruvadad1b68482013-04-09 22:38:18 +00002 * intel_pstate.c: Native P state management for Intel processors
Dirk Brandewie93f08222013-02-06 09:02:13 -08003 *
4 * (C) Copyright 2012 Intel Corporation
5 * Author: Dirk Brandewie <dirk.j.brandewie@intel.com>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; version 2
10 * of the License.
11 */
12
13#include <linux/kernel.h>
14#include <linux/kernel_stat.h>
15#include <linux/module.h>
16#include <linux/ktime.h>
17#include <linux/hrtimer.h>
18#include <linux/tick.h>
19#include <linux/slab.h>
20#include <linux/sched.h>
21#include <linux/list.h>
22#include <linux/cpu.h>
23#include <linux/cpufreq.h>
24#include <linux/sysfs.h>
25#include <linux/types.h>
26#include <linux/fs.h>
27#include <linux/debugfs.h>
Adrian Huangfbbcdc02013-10-31 23:24:05 +080028#include <linux/acpi.h>
Dirk Brandewie93f08222013-02-06 09:02:13 -080029#include <trace/events/power.h>
30
31#include <asm/div64.h>
32#include <asm/msr.h>
33#include <asm/cpu_device_id.h>
34
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -080035#define BYT_RATIOS 0x66a
36#define BYT_VIDS 0x66b
37#define BYT_TURBO_RATIOS 0x66c
Dirk Brandewie21855ff2014-05-08 12:57:23 -070038#define BYT_TURBO_VIDS 0x66d
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -080039
Dirk Brandewief0fe3cd2014-05-29 09:32:23 -070040#define FRAC_BITS 8
Dirk Brandewie93f08222013-02-06 09:02:13 -080041#define int_tofp(X) ((int64_t)(X) << FRAC_BITS)
42#define fp_toint(X) ((X) >> FRAC_BITS)
Dirk Brandewief0fe3cd2014-05-29 09:32:23 -070043
Dirk Brandewie93f08222013-02-06 09:02:13 -080044
45static inline int32_t mul_fp(int32_t x, int32_t y)
46{
47 return ((int64_t)x * (int64_t)y) >> FRAC_BITS;
48}
49
50static inline int32_t div_fp(int32_t x, int32_t y)
51{
Stratos Karafotisfa30dff2014-07-18 08:37:18 -070052 return div_s64((int64_t)x << FRAC_BITS, y);
Dirk Brandewie93f08222013-02-06 09:02:13 -080053}
54
Dirk Brandewied022a652014-10-13 08:37:44 -070055static inline int ceiling_fp(int32_t x)
56{
57 int mask, ret;
58
59 ret = fp_toint(x);
60 mask = (1 << FRAC_BITS) - 1;
61 if (x & mask)
62 ret += 1;
63 return ret;
64}
65
Dirk Brandewie93f08222013-02-06 09:02:13 -080066struct sample {
Brennan Shacklettd253d2a2013-10-21 09:20:32 -070067 int32_t core_pct_busy;
Dirk Brandewie93f08222013-02-06 09:02:13 -080068 u64 aperf;
69 u64 mperf;
70 int freq;
Dirk Brandewiec4ee8412014-05-29 09:32:24 -070071 ktime_t time;
Dirk Brandewie93f08222013-02-06 09:02:13 -080072};
73
74struct pstate_data {
75 int current_pstate;
76 int min_pstate;
77 int max_pstate;
Dirk Brandewieb27580b2014-10-13 08:37:43 -070078 int scaling;
Dirk Brandewie93f08222013-02-06 09:02:13 -080079 int turbo_pstate;
80};
81
Dirk Brandewie007bea02013-12-18 10:32:39 -080082struct vid_data {
Dirk Brandewie21855ff2014-05-08 12:57:23 -070083 int min;
84 int max;
85 int turbo;
Dirk Brandewie007bea02013-12-18 10:32:39 -080086 int32_t ratio;
87};
88
Dirk Brandewie93f08222013-02-06 09:02:13 -080089struct _pid {
90 int setpoint;
91 int32_t integral;
92 int32_t p_gain;
93 int32_t i_gain;
94 int32_t d_gain;
95 int deadband;
Brennan Shacklettd253d2a2013-10-21 09:20:32 -070096 int32_t last_err;
Dirk Brandewie93f08222013-02-06 09:02:13 -080097};
98
99struct cpudata {
100 int cpu;
101
Dirk Brandewie93f08222013-02-06 09:02:13 -0800102 struct timer_list timer;
103
Dirk Brandewie93f08222013-02-06 09:02:13 -0800104 struct pstate_data pstate;
Dirk Brandewie007bea02013-12-18 10:32:39 -0800105 struct vid_data vid;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800106 struct _pid pid;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800107
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700108 ktime_t last_sample_time;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800109 u64 prev_aperf;
110 u64 prev_mperf;
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800111 struct sample sample;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800112};
113
114static struct cpudata **all_cpu_data;
115struct pstate_adjust_policy {
116 int sample_rate_ms;
117 int deadband;
118 int setpoint;
119 int p_gain_pct;
120 int d_gain_pct;
121 int i_gain_pct;
122};
123
Dirk Brandewie016c8152013-10-21 09:20:34 -0700124struct pstate_funcs {
125 int (*get_max)(void);
126 int (*get_min)(void);
127 int (*get_turbo)(void);
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700128 int (*get_scaling)(void);
Dirk Brandewie007bea02013-12-18 10:32:39 -0800129 void (*set)(struct cpudata*, int pstate);
130 void (*get_vid)(struct cpudata *);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800131};
132
Dirk Brandewie016c8152013-10-21 09:20:34 -0700133struct cpu_defaults {
134 struct pstate_adjust_policy pid_policy;
135 struct pstate_funcs funcs;
136};
137
138static struct pstate_adjust_policy pid_params;
139static struct pstate_funcs pstate_funcs;
140
Dirk Brandewie93f08222013-02-06 09:02:13 -0800141struct perf_limits {
142 int no_turbo;
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700143 int turbo_disabled;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800144 int max_perf_pct;
145 int min_perf_pct;
146 int32_t max_perf;
147 int32_t min_perf;
Dirk Brandewied8f469e2013-05-07 08:20:26 -0700148 int max_policy_pct;
149 int max_sysfs_pct;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800150};
151
152static struct perf_limits limits = {
153 .no_turbo = 0,
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700154 .turbo_disabled = 0,
Dirk Brandewie93f08222013-02-06 09:02:13 -0800155 .max_perf_pct = 100,
156 .max_perf = int_tofp(1),
157 .min_perf_pct = 0,
158 .min_perf = 0,
Dirk Brandewied8f469e2013-05-07 08:20:26 -0700159 .max_policy_pct = 100,
160 .max_sysfs_pct = 100,
Dirk Brandewie93f08222013-02-06 09:02:13 -0800161};
162
163static inline void pid_reset(struct _pid *pid, int setpoint, int busy,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700164 int deadband, int integral) {
Dirk Brandewie93f08222013-02-06 09:02:13 -0800165 pid->setpoint = setpoint;
166 pid->deadband = deadband;
167 pid->integral = int_tofp(integral);
Dirk Brandewied98d0992014-02-12 10:01:05 -0800168 pid->last_err = int_tofp(setpoint) - int_tofp(busy);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800169}
170
171static inline void pid_p_gain_set(struct _pid *pid, int percent)
172{
173 pid->p_gain = div_fp(int_tofp(percent), int_tofp(100));
174}
175
176static inline void pid_i_gain_set(struct _pid *pid, int percent)
177{
178 pid->i_gain = div_fp(int_tofp(percent), int_tofp(100));
179}
180
181static inline void pid_d_gain_set(struct _pid *pid, int percent)
182{
Dirk Brandewie93f08222013-02-06 09:02:13 -0800183 pid->d_gain = div_fp(int_tofp(percent), int_tofp(100));
184}
185
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700186static signed int pid_calc(struct _pid *pid, int32_t busy)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800187{
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700188 signed int result;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800189 int32_t pterm, dterm, fp_error;
190 int32_t integral_limit;
191
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700192 fp_error = int_tofp(pid->setpoint) - busy;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800193
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700194 if (abs(fp_error) <= int_tofp(pid->deadband))
Dirk Brandewie93f08222013-02-06 09:02:13 -0800195 return 0;
196
197 pterm = mul_fp(pid->p_gain, fp_error);
198
199 pid->integral += fp_error;
200
201 /* limit the integral term */
202 integral_limit = int_tofp(30);
203 if (pid->integral > integral_limit)
204 pid->integral = integral_limit;
205 if (pid->integral < -integral_limit)
206 pid->integral = -integral_limit;
207
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700208 dterm = mul_fp(pid->d_gain, fp_error - pid->last_err);
209 pid->last_err = fp_error;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800210
211 result = pterm + mul_fp(pid->integral, pid->i_gain) + dterm;
Doug Smythies51d211e2014-06-17 13:36:10 -0700212 result = result + (1 << (FRAC_BITS-1));
Dirk Brandewie93f08222013-02-06 09:02:13 -0800213 return (signed int)fp_toint(result);
214}
215
216static inline void intel_pstate_busy_pid_reset(struct cpudata *cpu)
217{
Dirk Brandewie016c8152013-10-21 09:20:34 -0700218 pid_p_gain_set(&cpu->pid, pid_params.p_gain_pct);
219 pid_d_gain_set(&cpu->pid, pid_params.d_gain_pct);
220 pid_i_gain_set(&cpu->pid, pid_params.i_gain_pct);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800221
Stratos Karafotis2d8d1f12014-07-18 08:37:20 -0700222 pid_reset(&cpu->pid, pid_params.setpoint, 100, pid_params.deadband, 0);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800223}
224
Dirk Brandewie93f08222013-02-06 09:02:13 -0800225static inline void intel_pstate_reset_all_pid(void)
226{
227 unsigned int cpu;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700228
Dirk Brandewie93f08222013-02-06 09:02:13 -0800229 for_each_online_cpu(cpu) {
230 if (all_cpu_data[cpu])
231 intel_pstate_busy_pid_reset(all_cpu_data[cpu]);
232 }
233}
234
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700235static inline void update_turbo_state(void)
236{
237 u64 misc_en;
238 struct cpudata *cpu;
239
240 cpu = all_cpu_data[0];
241 rdmsrl(MSR_IA32_MISC_ENABLE, misc_en);
242 limits.turbo_disabled =
243 (misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE ||
244 cpu->pstate.max_pstate == cpu->pstate.turbo_pstate);
245}
246
Dirk Brandewie93f08222013-02-06 09:02:13 -0800247/************************** debugfs begin ************************/
248static int pid_param_set(void *data, u64 val)
249{
250 *(u32 *)data = val;
251 intel_pstate_reset_all_pid();
252 return 0;
253}
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700254
Dirk Brandewie93f08222013-02-06 09:02:13 -0800255static int pid_param_get(void *data, u64 *val)
256{
257 *val = *(u32 *)data;
258 return 0;
259}
Stratos Karafotis2d8d1f12014-07-18 08:37:20 -0700260DEFINE_SIMPLE_ATTRIBUTE(fops_pid_param, pid_param_get, pid_param_set, "%llu\n");
Dirk Brandewie93f08222013-02-06 09:02:13 -0800261
262struct pid_param {
263 char *name;
264 void *value;
265};
266
267static struct pid_param pid_files[] = {
Dirk Brandewie016c8152013-10-21 09:20:34 -0700268 {"sample_rate_ms", &pid_params.sample_rate_ms},
269 {"d_gain_pct", &pid_params.d_gain_pct},
270 {"i_gain_pct", &pid_params.i_gain_pct},
271 {"deadband", &pid_params.deadband},
272 {"setpoint", &pid_params.setpoint},
273 {"p_gain_pct", &pid_params.p_gain_pct},
Dirk Brandewie93f08222013-02-06 09:02:13 -0800274 {NULL, NULL}
275};
276
Stratos Karafotis317dd502014-07-18 08:37:17 -0700277static void __init intel_pstate_debug_expose_params(void)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800278{
Stratos Karafotis317dd502014-07-18 08:37:17 -0700279 struct dentry *debugfs_parent;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800280 int i = 0;
281
282 debugfs_parent = debugfs_create_dir("pstate_snb", NULL);
283 if (IS_ERR_OR_NULL(debugfs_parent))
284 return;
285 while (pid_files[i].name) {
286 debugfs_create_file(pid_files[i].name, 0660,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700287 debugfs_parent, pid_files[i].value,
288 &fops_pid_param);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800289 i++;
290 }
291}
292
293/************************** debugfs end ************************/
294
295/************************** sysfs begin ************************/
296#define show_one(file_name, object) \
297 static ssize_t show_##file_name \
298 (struct kobject *kobj, struct attribute *attr, char *buf) \
299 { \
300 return sprintf(buf, "%u\n", limits.object); \
301 }
302
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700303static ssize_t show_no_turbo(struct kobject *kobj,
304 struct attribute *attr, char *buf)
305{
306 ssize_t ret;
307
308 update_turbo_state();
309 if (limits.turbo_disabled)
310 ret = sprintf(buf, "%u\n", limits.turbo_disabled);
311 else
312 ret = sprintf(buf, "%u\n", limits.no_turbo);
313
314 return ret;
315}
316
Dirk Brandewie93f08222013-02-06 09:02:13 -0800317static ssize_t store_no_turbo(struct kobject *a, struct attribute *b,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700318 const char *buf, size_t count)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800319{
320 unsigned int input;
321 int ret;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700322
Dirk Brandewie93f08222013-02-06 09:02:13 -0800323 ret = sscanf(buf, "%u", &input);
324 if (ret != 1)
325 return -EINVAL;
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700326
327 update_turbo_state();
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700328 if (limits.turbo_disabled) {
329 pr_warn("Turbo disabled by BIOS or unavailable on processor\n");
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700330 return -EPERM;
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700331 }
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700332 limits.no_turbo = clamp_t(int, input, 0, 1);
333
Dirk Brandewie93f08222013-02-06 09:02:13 -0800334 return count;
335}
336
337static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700338 const char *buf, size_t count)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800339{
340 unsigned int input;
341 int ret;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700342
Dirk Brandewie93f08222013-02-06 09:02:13 -0800343 ret = sscanf(buf, "%u", &input);
344 if (ret != 1)
345 return -EINVAL;
346
Dirk Brandewied8f469e2013-05-07 08:20:26 -0700347 limits.max_sysfs_pct = clamp_t(int, input, 0 , 100);
348 limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800349 limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100));
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700350
Dirk Brandewie93f08222013-02-06 09:02:13 -0800351 return count;
352}
353
354static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700355 const char *buf, size_t count)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800356{
357 unsigned int input;
358 int ret;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700359
Dirk Brandewie93f08222013-02-06 09:02:13 -0800360 ret = sscanf(buf, "%u", &input);
361 if (ret != 1)
362 return -EINVAL;
363 limits.min_perf_pct = clamp_t(int, input, 0 , 100);
364 limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
365
366 return count;
367}
368
Dirk Brandewie93f08222013-02-06 09:02:13 -0800369show_one(max_perf_pct, max_perf_pct);
370show_one(min_perf_pct, min_perf_pct);
371
372define_one_global_rw(no_turbo);
373define_one_global_rw(max_perf_pct);
374define_one_global_rw(min_perf_pct);
375
376static struct attribute *intel_pstate_attributes[] = {
377 &no_turbo.attr,
378 &max_perf_pct.attr,
379 &min_perf_pct.attr,
380 NULL
381};
382
383static struct attribute_group intel_pstate_attr_group = {
384 .attrs = intel_pstate_attributes,
385};
Dirk Brandewie93f08222013-02-06 09:02:13 -0800386
Stratos Karafotis317dd502014-07-18 08:37:17 -0700387static void __init intel_pstate_sysfs_expose_params(void)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800388{
Stratos Karafotis317dd502014-07-18 08:37:17 -0700389 struct kobject *intel_pstate_kobject;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800390 int rc;
391
392 intel_pstate_kobject = kobject_create_and_add("intel_pstate",
393 &cpu_subsys.dev_root->kobj);
394 BUG_ON(!intel_pstate_kobject);
Stratos Karafotis2d8d1f12014-07-18 08:37:20 -0700395 rc = sysfs_create_group(intel_pstate_kobject, &intel_pstate_attr_group);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800396 BUG_ON(rc);
397}
398
399/************************** sysfs end ************************/
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700400static int byt_get_min_pstate(void)
401{
402 u64 value;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700403
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700404 rdmsrl(BYT_RATIOS, value);
Dirk Brandewiec16ed062014-06-20 07:27:58 -0700405 return (value >> 8) & 0x7F;
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700406}
Dirk Brandewie93f08222013-02-06 09:02:13 -0800407
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700408static int byt_get_max_pstate(void)
409{
410 u64 value;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700411
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700412 rdmsrl(BYT_RATIOS, value);
Dirk Brandewiec16ed062014-06-20 07:27:58 -0700413 return (value >> 16) & 0x7F;
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700414}
415
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -0800416static int byt_get_turbo_pstate(void)
417{
418 u64 value;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700419
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -0800420 rdmsrl(BYT_TURBO_RATIOS, value);
Dirk Brandewiec16ed062014-06-20 07:27:58 -0700421 return value & 0x7F;
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -0800422}
423
Dirk Brandewie007bea02013-12-18 10:32:39 -0800424static void byt_set_pstate(struct cpudata *cpudata, int pstate)
425{
426 u64 val;
427 int32_t vid_fp;
428 u32 vid;
429
430 val = pstate << 8;
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700431 if (limits.no_turbo && !limits.turbo_disabled)
Dirk Brandewie007bea02013-12-18 10:32:39 -0800432 val |= (u64)1 << 32;
433
434 vid_fp = cpudata->vid.min + mul_fp(
435 int_tofp(pstate - cpudata->pstate.min_pstate),
436 cpudata->vid.ratio);
437
438 vid_fp = clamp_t(int32_t, vid_fp, cpudata->vid.min, cpudata->vid.max);
Dirk Brandewied022a652014-10-13 08:37:44 -0700439 vid = ceiling_fp(vid_fp);
Dirk Brandewie007bea02013-12-18 10:32:39 -0800440
Dirk Brandewie21855ff2014-05-08 12:57:23 -0700441 if (pstate > cpudata->pstate.max_pstate)
442 vid = cpudata->vid.turbo;
443
Dirk Brandewie007bea02013-12-18 10:32:39 -0800444 val |= vid;
445
446 wrmsrl(MSR_IA32_PERF_CTL, val);
447}
448
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700449#define BYT_BCLK_FREQS 5
450static int byt_freq_table[BYT_BCLK_FREQS] = { 833, 1000, 1333, 1167, 800};
451
452static int byt_get_scaling(void)
453{
454 u64 value;
455 int i;
456
457 rdmsrl(MSR_FSB_FREQ, value);
458 i = value & 0x3;
459
460 BUG_ON(i > BYT_BCLK_FREQS);
461
462 return byt_freq_table[i] * 100;
463}
464
Dirk Brandewie007bea02013-12-18 10:32:39 -0800465static void byt_get_vid(struct cpudata *cpudata)
466{
467 u64 value;
468
469 rdmsrl(BYT_VIDS, value);
Dirk Brandewiec16ed062014-06-20 07:27:58 -0700470 cpudata->vid.min = int_tofp((value >> 8) & 0x7f);
471 cpudata->vid.max = int_tofp((value >> 16) & 0x7f);
Dirk Brandewie007bea02013-12-18 10:32:39 -0800472 cpudata->vid.ratio = div_fp(
473 cpudata->vid.max - cpudata->vid.min,
474 int_tofp(cpudata->pstate.max_pstate -
475 cpudata->pstate.min_pstate));
Dirk Brandewie21855ff2014-05-08 12:57:23 -0700476
477 rdmsrl(BYT_TURBO_VIDS, value);
478 cpudata->vid.turbo = value & 0x7f;
Dirk Brandewie007bea02013-12-18 10:32:39 -0800479}
480
Dirk Brandewie016c8152013-10-21 09:20:34 -0700481static int core_get_min_pstate(void)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800482{
483 u64 value;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700484
Konrad Rzeszutek Wilk05e99c8cf2013-03-20 14:21:10 +0000485 rdmsrl(MSR_PLATFORM_INFO, value);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800486 return (value >> 40) & 0xFF;
487}
488
Dirk Brandewie016c8152013-10-21 09:20:34 -0700489static int core_get_max_pstate(void)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800490{
491 u64 value;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700492
Konrad Rzeszutek Wilk05e99c8cf2013-03-20 14:21:10 +0000493 rdmsrl(MSR_PLATFORM_INFO, value);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800494 return (value >> 8) & 0xFF;
495}
496
Dirk Brandewie016c8152013-10-21 09:20:34 -0700497static int core_get_turbo_pstate(void)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800498{
499 u64 value;
500 int nont, ret;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700501
Konrad Rzeszutek Wilk05e99c8cf2013-03-20 14:21:10 +0000502 rdmsrl(MSR_NHM_TURBO_RATIO_LIMIT, value);
Dirk Brandewie016c8152013-10-21 09:20:34 -0700503 nont = core_get_max_pstate();
Stratos Karafotis285cb992014-07-18 08:37:21 -0700504 ret = (value) & 255;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800505 if (ret <= nont)
506 ret = nont;
507 return ret;
508}
509
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700510static inline int core_get_scaling(void)
511{
512 return 100000;
513}
514
Dirk Brandewie007bea02013-12-18 10:32:39 -0800515static void core_set_pstate(struct cpudata *cpudata, int pstate)
Dirk Brandewie016c8152013-10-21 09:20:34 -0700516{
517 u64 val;
518
519 val = pstate << 8;
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700520 if (limits.no_turbo && !limits.turbo_disabled)
Dirk Brandewie016c8152013-10-21 09:20:34 -0700521 val |= (u64)1 << 32;
522
Dirk Brandewiebb180082014-03-19 08:45:54 -0700523 wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val);
Dirk Brandewie016c8152013-10-21 09:20:34 -0700524}
525
526static struct cpu_defaults core_params = {
527 .pid_policy = {
528 .sample_rate_ms = 10,
529 .deadband = 0,
530 .setpoint = 97,
531 .p_gain_pct = 20,
532 .d_gain_pct = 0,
533 .i_gain_pct = 0,
534 },
535 .funcs = {
536 .get_max = core_get_max_pstate,
537 .get_min = core_get_min_pstate,
538 .get_turbo = core_get_turbo_pstate,
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700539 .get_scaling = core_get_scaling,
Dirk Brandewie016c8152013-10-21 09:20:34 -0700540 .set = core_set_pstate,
541 },
542};
543
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700544static struct cpu_defaults byt_params = {
545 .pid_policy = {
546 .sample_rate_ms = 10,
547 .deadband = 0,
548 .setpoint = 97,
549 .p_gain_pct = 14,
550 .d_gain_pct = 0,
551 .i_gain_pct = 4,
552 },
553 .funcs = {
554 .get_max = byt_get_max_pstate,
555 .get_min = byt_get_min_pstate,
Dirk Brandewie61d8d2a2014-02-12 10:01:07 -0800556 .get_turbo = byt_get_turbo_pstate,
Dirk Brandewie007bea02013-12-18 10:32:39 -0800557 .set = byt_set_pstate,
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700558 .get_scaling = byt_get_scaling,
Dirk Brandewie007bea02013-12-18 10:32:39 -0800559 .get_vid = byt_get_vid,
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700560 },
561};
562
Dirk Brandewie93f08222013-02-06 09:02:13 -0800563static void intel_pstate_get_min_max(struct cpudata *cpu, int *min, int *max)
564{
565 int max_perf = cpu->pstate.turbo_pstate;
Dirk Brandewie7244cb62013-10-21 09:20:33 -0700566 int max_perf_adj;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800567 int min_perf;
Stratos Karafotis845c1cb2014-07-18 08:37:19 -0700568
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700569 if (limits.no_turbo || limits.turbo_disabled)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800570 max_perf = cpu->pstate.max_pstate;
571
Dirk Brandewie7244cb62013-10-21 09:20:33 -0700572 max_perf_adj = fp_toint(mul_fp(int_tofp(max_perf), limits.max_perf));
573 *max = clamp_t(int, max_perf_adj,
Dirk Brandewie93f08222013-02-06 09:02:13 -0800574 cpu->pstate.min_pstate, cpu->pstate.turbo_pstate);
575
576 min_perf = fp_toint(mul_fp(int_tofp(max_perf), limits.min_perf));
Stratos Karafotis2d8d1f12014-07-18 08:37:20 -0700577 *min = clamp_t(int, min_perf, cpu->pstate.min_pstate, max_perf);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800578}
579
580static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
581{
582 int max_perf, min_perf;
583
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700584 update_turbo_state();
585
Dirk Brandewie93f08222013-02-06 09:02:13 -0800586 intel_pstate_get_min_max(cpu, &min_perf, &max_perf);
587
588 pstate = clamp_t(int, pstate, min_perf, max_perf);
589
590 if (pstate == cpu->pstate.current_pstate)
591 return;
592
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700593 trace_cpu_frequency(pstate * cpu->pstate.scaling, cpu->cpu);
Dirk Brandewie35363e92013-05-07 08:20:30 -0700594
Dirk Brandewie93f08222013-02-06 09:02:13 -0800595 cpu->pstate.current_pstate = pstate;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800596
Dirk Brandewie007bea02013-12-18 10:32:39 -0800597 pstate_funcs.set(cpu, pstate);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800598}
599
Dirk Brandewie93f08222013-02-06 09:02:13 -0800600static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
601{
Dirk Brandewie016c8152013-10-21 09:20:34 -0700602 cpu->pstate.min_pstate = pstate_funcs.get_min();
603 cpu->pstate.max_pstate = pstate_funcs.get_max();
604 cpu->pstate.turbo_pstate = pstate_funcs.get_turbo();
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700605 cpu->pstate.scaling = pstate_funcs.get_scaling();
Dirk Brandewie93f08222013-02-06 09:02:13 -0800606
Dirk Brandewie007bea02013-12-18 10:32:39 -0800607 if (pstate_funcs.get_vid)
608 pstate_funcs.get_vid(cpu);
Dirk Brandewied40a63c2014-05-08 12:57:24 -0700609 intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800610}
611
Stratos Karafotis6b17ddb2014-04-29 20:53:49 +0300612static inline void intel_pstate_calc_busy(struct cpudata *cpu)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800613{
Stratos Karafotis6b17ddb2014-04-29 20:53:49 +0300614 struct sample *sample = &cpu->sample;
Doug Smythiesbf810222014-05-30 10:10:57 -0700615 int64_t core_pct;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800616
Doug Smythiesbf810222014-05-30 10:10:57 -0700617 core_pct = int_tofp(sample->aperf) * int_tofp(100);
Stratos Karafotis78e27082014-07-18 08:37:27 -0700618 core_pct = div64_u64(core_pct, int_tofp(sample->mperf));
Dirk Brandewiefcb6a152014-02-03 08:55:31 -0800619
Dirk Brandewiefcb6a152014-02-03 08:55:31 -0800620 sample->freq = fp_toint(
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700621 mul_fp(int_tofp(
622 cpu->pstate.max_pstate * cpu->pstate.scaling / 100),
623 core_pct));
Dirk Brandewiefcb6a152014-02-03 08:55:31 -0800624
Doug Smythiesbf810222014-05-30 10:10:57 -0700625 sample->core_pct_busy = (int32_t)core_pct;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800626}
627
628static inline void intel_pstate_sample(struct cpudata *cpu)
629{
Dirk Brandewie93f08222013-02-06 09:02:13 -0800630 u64 aperf, mperf;
Stratos Karafotis4ab60c32014-07-18 08:37:24 -0700631 unsigned long flags;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800632
Stratos Karafotis4ab60c32014-07-18 08:37:24 -0700633 local_irq_save(flags);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800634 rdmsrl(MSR_IA32_APERF, aperf);
635 rdmsrl(MSR_IA32_MPERF, mperf);
Stratos Karafotis4ab60c32014-07-18 08:37:24 -0700636 local_irq_restore(flags);
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800637
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700638 cpu->last_sample_time = cpu->sample.time;
639 cpu->sample.time = ktime_get();
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800640 cpu->sample.aperf = aperf;
641 cpu->sample.mperf = mperf;
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800642 cpu->sample.aperf -= cpu->prev_aperf;
643 cpu->sample.mperf -= cpu->prev_mperf;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800644
Stratos Karafotis6b17ddb2014-04-29 20:53:49 +0300645 intel_pstate_calc_busy(cpu);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800646
Dirk Brandewie93f08222013-02-06 09:02:13 -0800647 cpu->prev_aperf = aperf;
648 cpu->prev_mperf = mperf;
649}
650
651static inline void intel_pstate_set_sample_time(struct cpudata *cpu)
652{
Stratos Karafotisabf013b2014-07-18 08:37:22 -0700653 int delay;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800654
Stratos Karafotisabf013b2014-07-18 08:37:22 -0700655 delay = msecs_to_jiffies(pid_params.sample_rate_ms);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800656 mod_timer_pinned(&cpu->timer, jiffies + delay);
657}
658
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700659static inline int32_t intel_pstate_get_scaled_busy(struct cpudata *cpu)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800660{
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700661 int32_t core_busy, max_pstate, current_pstate, sample_ratio;
662 u32 duration_us;
663 u32 sample_time;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800664
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800665 core_busy = cpu->sample.core_pct_busy;
Dirk Brandewie2134ed42013-07-18 08:48:42 -0700666 max_pstate = int_tofp(cpu->pstate.max_pstate);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800667 current_pstate = int_tofp(cpu->pstate.current_pstate);
Dirk Brandewiee66c1762014-02-25 10:35:37 -0800668 core_busy = mul_fp(core_busy, div_fp(max_pstate, current_pstate));
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700669
Stratos Karafotis285cb992014-07-18 08:37:21 -0700670 sample_time = pid_params.sample_rate_ms * USEC_PER_MSEC;
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700671 duration_us = (u32) ktime_us_delta(cpu->sample.time,
Stratos Karafotisc4108332014-07-18 08:37:23 -0700672 cpu->last_sample_time);
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700673 if (duration_us > sample_time * 3) {
674 sample_ratio = div_fp(int_tofp(sample_time),
Stratos Karafotisc4108332014-07-18 08:37:23 -0700675 int_tofp(duration_us));
Dirk Brandewiec4ee8412014-05-29 09:32:24 -0700676 core_busy = mul_fp(core_busy, sample_ratio);
677 }
678
Dirk Brandewief0fe3cd2014-05-29 09:32:23 -0700679 return core_busy;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800680}
681
682static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu)
683{
Brennan Shacklettd253d2a2013-10-21 09:20:32 -0700684 int32_t busy_scaled;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800685 struct _pid *pid;
Stratos Karafotis4b707c82014-07-18 08:37:26 -0700686 signed int ctl;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800687
688 pid = &cpu->pid;
689 busy_scaled = intel_pstate_get_scaled_busy(cpu);
690
691 ctl = pid_calc(pid, busy_scaled);
692
Stratos Karafotis4b707c82014-07-18 08:37:26 -0700693 /* Negative values of ctl increase the pstate and vice versa */
694 intel_pstate_set_pstate(cpu, cpu->pstate.current_pstate - ctl);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800695}
696
Dirk Brandewie93f08222013-02-06 09:02:13 -0800697static void intel_pstate_timer_func(unsigned long __data)
698{
699 struct cpudata *cpu = (struct cpudata *) __data;
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800700 struct sample *sample;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800701
702 intel_pstate_sample(cpu);
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800703
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800704 sample = &cpu->sample;
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800705
Dirk Brandewieca182ae2013-05-07 08:20:27 -0700706 intel_pstate_adjust_busy_pstate(cpu);
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800707
708 trace_pstate_sample(fp_toint(sample->core_pct_busy),
709 fp_toint(intel_pstate_get_scaled_busy(cpu)),
710 cpu->pstate.current_pstate,
711 sample->mperf,
712 sample->aperf,
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800713 sample->freq);
714
Dirk Brandewie93f08222013-02-06 09:02:13 -0800715 intel_pstate_set_sample_time(cpu);
716}
717
718#define ICPU(model, policy) \
Dirk Brandewie6cbd7ee2014-01-06 10:59:16 -0800719 { X86_VENDOR_INTEL, 6, model, X86_FEATURE_APERFMPERF,\
720 (unsigned long)&policy }
Dirk Brandewie93f08222013-02-06 09:02:13 -0800721
722static const struct x86_cpu_id intel_pstate_cpu_ids[] = {
Dirk Brandewie016c8152013-10-21 09:20:34 -0700723 ICPU(0x2a, core_params),
724 ICPU(0x2d, core_params),
Dirk Brandewie19e77c22013-10-21 09:20:35 -0700725 ICPU(0x37, byt_params),
Dirk Brandewie016c8152013-10-21 09:20:34 -0700726 ICPU(0x3a, core_params),
727 ICPU(0x3c, core_params),
Dirk Brandewiec7e241d2014-05-08 12:57:27 -0700728 ICPU(0x3d, core_params),
Dirk Brandewie016c8152013-10-21 09:20:34 -0700729 ICPU(0x3e, core_params),
730 ICPU(0x3f, core_params),
731 ICPU(0x45, core_params),
732 ICPU(0x46, core_params),
Mika Westerberg16405f92014-08-22 13:05:44 +0300733 ICPU(0x4c, byt_params),
Dirk Brandewiec7e241d2014-05-08 12:57:27 -0700734 ICPU(0x4f, core_params),
735 ICPU(0x56, core_params),
Dirk Brandewie93f08222013-02-06 09:02:13 -0800736 {}
737};
738MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids);
739
740static int intel_pstate_init_cpu(unsigned int cpunum)
741{
Dirk Brandewie93f08222013-02-06 09:02:13 -0800742 struct cpudata *cpu;
743
Dirk Brandewiec0348712014-10-13 08:37:42 -0700744 if (!all_cpu_data[cpunum])
745 all_cpu_data[cpunum] = kzalloc(sizeof(struct cpudata),
746 GFP_KERNEL);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800747 if (!all_cpu_data[cpunum])
748 return -ENOMEM;
749
750 cpu = all_cpu_data[cpunum];
751
Dirk Brandewie93f08222013-02-06 09:02:13 -0800752 cpu->cpu = cpunum;
Vincent Minet179e8472014-07-05 01:51:33 +0200753 intel_pstate_get_cpu_pstates(cpu);
Dirk Brandewie016c8152013-10-21 09:20:34 -0700754
Dirk Brandewie93f08222013-02-06 09:02:13 -0800755 init_timer_deferrable(&cpu->timer);
756 cpu->timer.function = intel_pstate_timer_func;
Stratos Karafotis2d8d1f12014-07-18 08:37:20 -0700757 cpu->timer.data = (unsigned long)cpu;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800758 cpu->timer.expires = jiffies + HZ/100;
759 intel_pstate_busy_pid_reset(cpu);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800760 intel_pstate_sample(cpu);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800761
762 add_timer_on(&cpu->timer, cpunum);
763
Andi Kleence717612014-08-27 10:17:08 -0700764 pr_debug("Intel pstate controlling: cpu %d\n", cpunum);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800765
766 return 0;
767}
768
769static unsigned int intel_pstate_get(unsigned int cpu_num)
770{
771 struct sample *sample;
772 struct cpudata *cpu;
773
774 cpu = all_cpu_data[cpu_num];
775 if (!cpu)
776 return 0;
Dirk Brandewied37e2b72014-02-12 10:01:04 -0800777 sample = &cpu->sample;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800778 return sample->freq;
779}
780
781static int intel_pstate_set_policy(struct cpufreq_policy *policy)
782{
Dirk Brandewied3929b82013-03-05 14:15:26 -0800783 if (!policy->cpuinfo.max_freq)
784 return -ENODEV;
785
Dirk Brandewie93f08222013-02-06 09:02:13 -0800786 if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
787 limits.min_perf_pct = 100;
788 limits.min_perf = int_tofp(1);
Pali Rohár36b4bed2014-10-16 01:16:51 +0200789 limits.max_policy_pct = 100;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800790 limits.max_perf_pct = 100;
791 limits.max_perf = int_tofp(1);
Gabriele Mazzotta4521e1a02014-10-13 08:37:41 -0700792 limits.no_turbo = 0;
Srinivas Pandruvadad1b68482013-04-09 22:38:18 +0000793 return 0;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800794 }
Srinivas Pandruvadad1b68482013-04-09 22:38:18 +0000795 limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
796 limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100);
797 limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
798
Stratos Karafotis285cb992014-07-18 08:37:21 -0700799 limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;
Dirk Brandewied8f469e2013-05-07 08:20:26 -0700800 limits.max_policy_pct = clamp_t(int, limits.max_policy_pct, 0 , 100);
801 limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct);
Srinivas Pandruvadad1b68482013-04-09 22:38:18 +0000802 limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100));
Dirk Brandewie93f08222013-02-06 09:02:13 -0800803
804 return 0;
805}
806
807static int intel_pstate_verify_policy(struct cpufreq_policy *policy)
808{
Viresh Kumarbe49e342013-10-02 14:13:19 +0530809 cpufreq_verify_within_cpu_limits(policy);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800810
Stratos Karafotis285cb992014-07-18 08:37:21 -0700811 if (policy->policy != CPUFREQ_POLICY_POWERSAVE &&
Stratos Karafotisc4108332014-07-18 08:37:23 -0700812 policy->policy != CPUFREQ_POLICY_PERFORMANCE)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800813 return -EINVAL;
814
815 return 0;
816}
817
Dirk Brandewiebb180082014-03-19 08:45:54 -0700818static void intel_pstate_stop_cpu(struct cpufreq_policy *policy)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800819{
Dirk Brandewiebb180082014-03-19 08:45:54 -0700820 int cpu_num = policy->cpu;
821 struct cpudata *cpu = all_cpu_data[cpu_num];
Dirk Brandewie93f08222013-02-06 09:02:13 -0800822
Dirk Brandewiebb180082014-03-19 08:45:54 -0700823 pr_info("intel_pstate CPU %d exiting\n", cpu_num);
824
Dirk Brandewiec2294a22014-03-24 07:41:29 -0700825 del_timer_sync(&all_cpu_data[cpu_num]->timer);
Dirk Brandewiebb180082014-03-19 08:45:54 -0700826 intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
Dirk Brandewie93f08222013-02-06 09:02:13 -0800827}
828
Paul Gortmaker27609842013-06-19 13:54:04 -0400829static int intel_pstate_cpu_init(struct cpufreq_policy *policy)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800830{
Dirk Brandewie93f08222013-02-06 09:02:13 -0800831 struct cpudata *cpu;
Dirk Brandewie52e0a502013-10-15 11:06:14 -0700832 int rc;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800833
834 rc = intel_pstate_init_cpu(policy->cpu);
835 if (rc)
836 return rc;
837
838 cpu = all_cpu_data[policy->cpu];
839
Dirk Brandewiedd5fbf72014-06-20 07:27:59 -0700840 if (limits.min_perf_pct == 100 && limits.max_perf_pct == 100)
Dirk Brandewie93f08222013-02-06 09:02:13 -0800841 policy->policy = CPUFREQ_POLICY_PERFORMANCE;
842 else
843 policy->policy = CPUFREQ_POLICY_POWERSAVE;
844
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700845 policy->min = cpu->pstate.min_pstate * cpu->pstate.scaling;
846 policy->max = cpu->pstate.turbo_pstate * cpu->pstate.scaling;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800847
848 /* cpuinfo and default policy values */
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700849 policy->cpuinfo.min_freq = cpu->pstate.min_pstate * cpu->pstate.scaling;
850 policy->cpuinfo.max_freq =
851 cpu->pstate.turbo_pstate * cpu->pstate.scaling;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800852 policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
853 cpumask_set_cpu(policy->cpu, policy->cpus);
854
855 return 0;
856}
857
858static struct cpufreq_driver intel_pstate_driver = {
859 .flags = CPUFREQ_CONST_LOOPS,
860 .verify = intel_pstate_verify_policy,
861 .setpolicy = intel_pstate_set_policy,
862 .get = intel_pstate_get,
863 .init = intel_pstate_cpu_init,
Dirk Brandewiebb180082014-03-19 08:45:54 -0700864 .stop_cpu = intel_pstate_stop_cpu,
Dirk Brandewie93f08222013-02-06 09:02:13 -0800865 .name = "intel_pstate",
Dirk Brandewie93f08222013-02-06 09:02:13 -0800866};
867
Dirk Brandewie6be26492013-02-15 22:55:10 +0100868static int __initdata no_load;
869
Dirk Brandewieb563b4e2013-03-22 01:29:28 +0100870static int intel_pstate_msrs_not_valid(void)
871{
872 /* Check that all the msr's we are using are valid. */
873 u64 aperf, mperf, tmp;
874
875 rdmsrl(MSR_IA32_APERF, aperf);
876 rdmsrl(MSR_IA32_MPERF, mperf);
877
Dirk Brandewie016c8152013-10-21 09:20:34 -0700878 if (!pstate_funcs.get_max() ||
Stratos Karafotisc4108332014-07-18 08:37:23 -0700879 !pstate_funcs.get_min() ||
880 !pstate_funcs.get_turbo())
Dirk Brandewieb563b4e2013-03-22 01:29:28 +0100881 return -ENODEV;
882
883 rdmsrl(MSR_IA32_APERF, tmp);
884 if (!(tmp - aperf))
885 return -ENODEV;
886
887 rdmsrl(MSR_IA32_MPERF, tmp);
888 if (!(tmp - mperf))
889 return -ENODEV;
890
891 return 0;
892}
Dirk Brandewie016c8152013-10-21 09:20:34 -0700893
Dirk Brandewiee0a261a2013-10-30 08:38:32 -0700894static void copy_pid_params(struct pstate_adjust_policy *policy)
Dirk Brandewie016c8152013-10-21 09:20:34 -0700895{
896 pid_params.sample_rate_ms = policy->sample_rate_ms;
897 pid_params.p_gain_pct = policy->p_gain_pct;
898 pid_params.i_gain_pct = policy->i_gain_pct;
899 pid_params.d_gain_pct = policy->d_gain_pct;
900 pid_params.deadband = policy->deadband;
901 pid_params.setpoint = policy->setpoint;
902}
903
Dirk Brandewiee0a261a2013-10-30 08:38:32 -0700904static void copy_cpu_funcs(struct pstate_funcs *funcs)
Dirk Brandewie016c8152013-10-21 09:20:34 -0700905{
906 pstate_funcs.get_max = funcs->get_max;
907 pstate_funcs.get_min = funcs->get_min;
908 pstate_funcs.get_turbo = funcs->get_turbo;
Dirk Brandewieb27580b2014-10-13 08:37:43 -0700909 pstate_funcs.get_scaling = funcs->get_scaling;
Dirk Brandewie016c8152013-10-21 09:20:34 -0700910 pstate_funcs.set = funcs->set;
Dirk Brandewie007bea02013-12-18 10:32:39 -0800911 pstate_funcs.get_vid = funcs->get_vid;
Dirk Brandewie016c8152013-10-21 09:20:34 -0700912}
913
Adrian Huangfbbcdc02013-10-31 23:24:05 +0800914#if IS_ENABLED(CONFIG_ACPI)
915#include <acpi/processor.h>
916
917static bool intel_pstate_no_acpi_pss(void)
918{
919 int i;
920
921 for_each_possible_cpu(i) {
922 acpi_status status;
923 union acpi_object *pss;
924 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
925 struct acpi_processor *pr = per_cpu(processors, i);
926
927 if (!pr)
928 continue;
929
930 status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer);
931 if (ACPI_FAILURE(status))
932 continue;
933
934 pss = buffer.pointer;
935 if (pss && pss->type == ACPI_TYPE_PACKAGE) {
936 kfree(pss);
937 return false;
938 }
939
940 kfree(pss);
941 }
942
943 return true;
944}
945
946struct hw_vendor_info {
947 u16 valid;
948 char oem_id[ACPI_OEM_ID_SIZE];
949 char oem_table_id[ACPI_OEM_TABLE_ID_SIZE];
950};
951
952/* Hardware vendor-specific info that has its own power management modes */
953static struct hw_vendor_info vendor_info[] = {
954 {1, "HP ", "ProLiant"},
955 {0, "", ""},
956};
957
958static bool intel_pstate_platform_pwr_mgmt_exists(void)
959{
960 struct acpi_table_header hdr;
961 struct hw_vendor_info *v_info;
962
Stratos Karafotisc4108332014-07-18 08:37:23 -0700963 if (acpi_disabled ||
964 ACPI_FAILURE(acpi_get_table_header(ACPI_SIG_FADT, 0, &hdr)))
Adrian Huangfbbcdc02013-10-31 23:24:05 +0800965 return false;
966
967 for (v_info = vendor_info; v_info->valid; v_info++) {
Stratos Karafotisc4108332014-07-18 08:37:23 -0700968 if (!strncmp(hdr.oem_id, v_info->oem_id, ACPI_OEM_ID_SIZE) &&
969 !strncmp(hdr.oem_table_id, v_info->oem_table_id, ACPI_OEM_TABLE_ID_SIZE) &&
970 intel_pstate_no_acpi_pss())
Adrian Huangfbbcdc02013-10-31 23:24:05 +0800971 return true;
972 }
973
974 return false;
975}
976#else /* CONFIG_ACPI not enabled */
977static inline bool intel_pstate_platform_pwr_mgmt_exists(void) { return false; }
978#endif /* CONFIG_ACPI */
979
Dirk Brandewie93f08222013-02-06 09:02:13 -0800980static int __init intel_pstate_init(void)
981{
Dirk Brandewie907cc902013-03-05 14:15:27 -0800982 int cpu, rc = 0;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800983 const struct x86_cpu_id *id;
Dirk Brandewie016c8152013-10-21 09:20:34 -0700984 struct cpu_defaults *cpu_info;
Dirk Brandewie93f08222013-02-06 09:02:13 -0800985
Dirk Brandewie6be26492013-02-15 22:55:10 +0100986 if (no_load)
987 return -ENODEV;
988
Dirk Brandewie93f08222013-02-06 09:02:13 -0800989 id = x86_match_cpu(intel_pstate_cpu_ids);
990 if (!id)
991 return -ENODEV;
992
Adrian Huangfbbcdc02013-10-31 23:24:05 +0800993 /*
994 * The Intel pstate driver will be ignored if the platform
995 * firmware has its own power management modes.
996 */
997 if (intel_pstate_platform_pwr_mgmt_exists())
998 return -ENODEV;
999
Dirk Brandewie016c8152013-10-21 09:20:34 -07001000 cpu_info = (struct cpu_defaults *)id->driver_data;
1001
1002 copy_pid_params(&cpu_info->pid_policy);
1003 copy_cpu_funcs(&cpu_info->funcs);
1004
Dirk Brandewieb563b4e2013-03-22 01:29:28 +01001005 if (intel_pstate_msrs_not_valid())
1006 return -ENODEV;
1007
Dirk Brandewie93f08222013-02-06 09:02:13 -08001008 pr_info("Intel P-state driver initializing.\n");
1009
Wei Yongjunb57ffac2013-05-13 08:03:43 +00001010 all_cpu_data = vzalloc(sizeof(void *) * num_possible_cpus());
Dirk Brandewie93f08222013-02-06 09:02:13 -08001011 if (!all_cpu_data)
1012 return -ENOMEM;
Dirk Brandewie93f08222013-02-06 09:02:13 -08001013
1014 rc = cpufreq_register_driver(&intel_pstate_driver);
1015 if (rc)
1016 goto out;
1017
1018 intel_pstate_debug_expose_params();
1019 intel_pstate_sysfs_expose_params();
Dirk Brandewieb69880f2014-01-16 10:32:25 -08001020
Dirk Brandewie93f08222013-02-06 09:02:13 -08001021 return rc;
1022out:
Dirk Brandewie907cc902013-03-05 14:15:27 -08001023 get_online_cpus();
1024 for_each_online_cpu(cpu) {
1025 if (all_cpu_data[cpu]) {
1026 del_timer_sync(&all_cpu_data[cpu]->timer);
1027 kfree(all_cpu_data[cpu]);
1028 }
1029 }
1030
1031 put_online_cpus();
1032 vfree(all_cpu_data);
Dirk Brandewie93f08222013-02-06 09:02:13 -08001033 return -ENODEV;
1034}
1035device_initcall(intel_pstate_init);
1036
Dirk Brandewie6be26492013-02-15 22:55:10 +01001037static int __init intel_pstate_setup(char *str)
1038{
1039 if (!str)
1040 return -EINVAL;
1041
1042 if (!strcmp(str, "disable"))
1043 no_load = 1;
1044 return 0;
1045}
1046early_param("intel_pstate", intel_pstate_setup);
1047
Dirk Brandewie93f08222013-02-06 09:02:13 -08001048MODULE_AUTHOR("Dirk Brandewie <dirk.j.brandewie@intel.com>");
1049MODULE_DESCRIPTION("'intel_pstate' - P state driver Intel Core processors");
1050MODULE_LICENSE("GPL");