History

Merge tag 'pm+acpi-4.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management and ACPI fixes from Rafael Wysocki: "Fixes for some issues discovered after recent changes and for some that have just been found lately regardless of those changes (intel_pstate, intel_idle, PM core, mailbox/pcc, turbostat) plus support for some new CPU models (intel_idle, Intel RAPL driver, turbostat) and documentation updates (intel_pstate, PM core). Specifics: - intel_pstate fixes for two issues exposed by the recent switch over from using timers and for one issue introduced during the 4.4 cycle plus new comments describing data structures used by the driver (Rafael Wysocki, Srinivas Pandruvada). - intel_idle fixes related to CPU offline/online (Richard Cochran). - intel_idle support (new CPU IDs and state definitions mostly) for Skylake-X and Kabylake processors (Len Brown). - PCC mailbox driver fix for an out-of-bounds memory access that may cause the kernel to panic() (Shanker Donthineni). - New (missing) CPU ID for one apparently overlooked Haswell model in the Intel RAPL power capping driver (Srinivas Pandruvada). - Fix for the PM core's wakeup IRQs framework to make it work after wakeup settings reconfiguration from sysfs (Grygorii Strashko). - Runtime PM documentation update to make it describe what needs to be done during device removal more precisely (Krzysztof Kozlowski). - Stale comment removal cleanup in the cpufreq-dt driver (Viresh Kumar). - turbostat utility fixes and support for Broxton, Skylake-X and Kabylake processors (Len Brown)" * tag 'pm+acpi-4.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (28 commits) PM / wakeirq: fix wakeirq setting after wakup re-configuration from sysfs tools/power turbostat: work around RC6 counter wrap tools/power turbostat: initial KBL support tools/power turbostat: initial SKX support tools/power turbostat: decode BXT TSC frequency via CPUID tools/power turbostat: initial BXT support tools/power turbostat: print IRTL MSRs tools/power turbostat: SGX state should print only if --debug intel_idle: Add KBL support intel_idle: Add SKX support intel_idle: Clean up all registered devices on exit. intel_idle: Propagate hot plug errors. intel_idle: Don't overreact to a cpuidle registration failure. intel_idle: Setup the timer broadcast only on successful driver load. intel_idle: Avoid a double free of the per-CPU data. intel_idle: Fix dangling registration on error path. intel_idle: Fix deallocation order on the driver exit path. intel_idle: Remove redundant initialization calls. intel_idle: Fix a helper function's return value. intel_idle: remove useless return from void function. ...

Linus Torvalds committed 10 years ago

Commit 40bca9d2 parents 9ef11ce 73659be9 files · +380 −62Browse files

Unified · Split

9 files
  1. Documentation/power/runtime_pm.txt +4 −0
  2. arch/x86/include/asm/msr-index.h +8 −0
  3. drivers/base/power/wakeup.c +2 −0
  4. drivers/cpufreq/cpufreq-dt.c +0 −3
  5. drivers/cpufreq/intel_pstate.c +189 −17
  6. drivers/idle/intel_idle.c +67 −30
  7. drivers/mailbox/pcc.c +2 −2
  8. drivers/powercap/intel_rapl.c +1 −0
  9. tools/power/x86/turbostat/turbostat.c +107 −10
Documentation/power/runtime_pm.txt+4−0
@@ -586,6 +586,10 @@ drivers to make their ->remove() callbacks avoid races with runtime PM directly, · 585 unmodified lines
586586 but also it allows of more flexibility in the handling of devices during the
587587 removal of their drivers.
588588
589+Drivers in ->remove() callback should undo the runtime PM changes done
590+in ->probe(). Usually this means calling pm_runtime_disable(),
591+pm_runtime_dont_use_autosuspend() etc.
592+
589593 The user space can effectively disallow the driver of the device to power manage
590594 it at run time by changing the value of its /sys/devices/.../power/control
591595 attribute to "on", which causes pm_runtime_forbid() to be called. In principle,
arch/x86/include/asm/msr-index.h+8−0
@@ -167,6 +167,14 @@ · 166 unmodified lines
167167 #define MSR_PKG_C9_RESIDENCY 0x00000631
168168 #define MSR_PKG_C10_RESIDENCY 0x00000632
169169
170+/* Interrupt Response Limit */
171+#define MSR_PKGC3_IRTL 0x0000060a
172+#define MSR_PKGC6_IRTL 0x0000060b
173+#define MSR_PKGC7_IRTL 0x0000060c
174+#define MSR_PKGC8_IRTL 0x00000633
175+#define MSR_PKGC9_IRTL 0x00000634
176+#define MSR_PKGC10_IRTL 0x00000635
177+
170178 /* Run Time Average Power Limiting (RAPL) Interface */
171179
172180 #define MSR_RAPL_POWER_UNIT 0x00000606
drivers/base/power/wakeup.c+2−0
@@ -246,6 +246,8 @@ static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws) · 245 unmodified lines
246246 return -EEXIST;
247247 }
248248 dev->power.wakeup = ws;
249+ if (dev->power.wakeirq)
250+ device_wakeup_attach_irq(dev, dev->power.wakeirq);
249251 spin_unlock_irq(&dev->power.lock);
250252 return 0;
251253 }
drivers/cpufreq/cpufreq-dt.c+0−3
@@ -4,9 +4,6 @@ · 3 unmodified lines
44 * Copyright (C) 2014 Linaro.
55 * Viresh Kumar <viresh.kumar@linaro.org>
66 *
7− * The OPP code in function set_target() is reused from
8− * drivers/cpufreq/omap-cpufreq.c
9− *
107 * This program is free software; you can redistribute it and/or modify
118 * it under the terms of the GNU General Public License version 2 as
129 * published by the Free Software Foundation.
drivers/cpufreq/intel_pstate.c+189−17
@@ -64,6 +64,25 @@ static inline int ceiling_fp(int32_t x) · 63 unmodified lines
6464 return ret;
6565 }
6666
67+/**
68+ * struct sample - Store performance sample
69+ * @core_pct_busy: Ratio of APERF/MPERF in percent, which is actual
70+ * performance during last sample period
71+ * @busy_scaled: Scaled busy value which is used to calculate next
72+ * P state. This can be different than core_pct_busy
73+ * to account for cpu idle period
74+ * @aperf: Difference of actual performance frequency clock count
75+ * read from APERF MSR between last and current sample
76+ * @mperf: Difference of maximum performance frequency clock count
77+ * read from MPERF MSR between last and current sample
78+ * @tsc: Difference of time stamp counter between last and
79+ * current sample
80+ * @freq: Effective frequency calculated from APERF/MPERF
81+ * @time: Current time from scheduler
82+ *
83+ * This structure is used in the cpudata structure to store performance sample
84+ * data for choosing next P State.
85+ */
6786 struct sample {
6887 int32_t core_pct_busy;
6988 int32_t busy_scaled;
@@ -74,6 +93,20 @@ struct sample { · 4 unmodified lines
7493 u64 time;
7594 };
7695
96+/**
97+ * struct pstate_data - Store P state data
98+ * @current_pstate: Current requested P state
99+ * @min_pstate: Min P state possible for this platform
100+ * @max_pstate: Max P state possible for this platform
101+ * @max_pstate_physical:This is physical Max P state for a processor
102+ * This can be higher than the max_pstate which can
103+ * be limited by platform thermal design power limits
104+ * @scaling: Scaling factor to convert frequency to cpufreq
105+ * frequency units
106+ * @turbo_pstate: Max Turbo P state possible for this platform
107+ *
108+ * Stores the per cpu model P state limits and current P state.
109+ */
77110 struct pstate_data {
78111 int current_pstate;
79112 int min_pstate;
@@ -83,6 +116,19 @@ struct pstate_data { · 3 unmodified lines
83116 int turbo_pstate;
84117 };
85118
119+/**
120+ * struct vid_data - Stores voltage information data
121+ * @min: VID data for this platform corresponding to
122+ * the lowest P state
123+ * @max: VID data corresponding to the highest P State.
124+ * @turbo: VID data for turbo P state
125+ * @ratio: Ratio of (vid max - vid min) /
126+ * (max P state - Min P State)
127+ *
128+ * Stores the voltage data for DVFS (Dynamic Voltage and Frequency Scaling)
129+ * This data is used in Atom platforms, where in addition to target P state,
130+ * the voltage data needs to be specified to select next P State.
131+ */
86132 struct vid_data {
87133 int min;
88134 int max;
@@ -90,6 +136,18 @@ struct vid_data { · 1 unmodified line
90136 int32_t ratio;
91137 };
92138
139+/**
140+ * struct _pid - Stores PID data
141+ * @setpoint: Target set point for busyness or performance
142+ * @integral: Storage for accumulated error values
143+ * @p_gain: PID proportional gain
144+ * @i_gain: PID integral gain
145+ * @d_gain: PID derivative gain
146+ * @deadband: PID deadband
147+ * @last_err: Last error storage for integral part of PID calculation
148+ *
149+ * Stores PID coefficients and last error for PID controller.
150+ */
93151 struct _pid {
94152 int setpoint;
95153 int32_t integral;
@@ -100,6 +158,23 @@ struct _pid { · 4 unmodified lines
100158 int32_t last_err;
101159 };
102160
161+/**
162+ * struct cpudata - Per CPU instance data storage
163+ * @cpu: CPU number for this instance data
164+ * @update_util: CPUFreq utility callback information
165+ * @pstate: Stores P state limits for this CPU
166+ * @vid: Stores VID limits for this CPU
167+ * @pid: Stores PID parameters for this CPU
168+ * @last_sample_time: Last Sample time
169+ * @prev_aperf: Last APERF value read from APERF MSR
170+ * @prev_mperf: Last MPERF value read from MPERF MSR
171+ * @prev_tsc: Last timestamp counter (TSC) value
172+ * @prev_cummulative_iowait: IO Wait time difference from last and
173+ * current sample
174+ * @sample: Storage for storing last Sample data
175+ *
176+ * This structure stores per CPU instance data for all CPUs.
177+ */
103178 struct cpudata {
104179 int cpu;
105180
@@ -118,6 +193,19 @@ struct cpudata { · 12 unmodified lines
118193 };
119194
120195 static struct cpudata **all_cpu_data;
196+
197+/**
198+ * struct pid_adjust_policy - Stores static PID configuration data
199+ * @sample_rate_ms: PID calculation sample rate in ms
200+ * @sample_rate_ns: Sample rate calculation in ns
201+ * @deadband: PID deadband
202+ * @setpoint: PID Setpoint
203+ * @p_gain_pct: PID proportional gain
204+ * @i_gain_pct: PID integral gain
205+ * @d_gain_pct: PID derivative gain
206+ *
207+ * Stores per CPU model static PID configuration data.
208+ */
121209 struct pstate_adjust_policy {
122210 int sample_rate_ms;
123211 s64 sample_rate_ns;
@@ -128,6 +216,20 @@ struct pstate_adjust_policy { · 4 unmodified lines
128216 int i_gain_pct;
129217 };
130218
219+/**
220+ * struct pstate_funcs - Per CPU model specific callbacks
221+ * @get_max: Callback to get maximum non turbo effective P state
222+ * @get_max_physical: Callback to get maximum non turbo physical P state
223+ * @get_min: Callback to get minimum P state
224+ * @get_turbo: Callback to get turbo P state
225+ * @get_scaling: Callback to get frequency scaling factor
226+ * @get_val: Callback to convert P state to actual MSR write value
227+ * @get_vid: Callback to get VID data for Atom platforms
228+ * @get_target_pstate: Callback to a function to calculate next P state to use
229+ *
230+ * Core and Atom CPU models have different way to get P State limits. This
231+ * structure is used to store those callbacks.
232+ */
131233 struct pstate_funcs {
132234 int (*get_max)(void);
133235 int (*get_max_physical)(void);
@@ -139,6 +241,11 @@ struct pstate_funcs { · 5 unmodified lines
139241 int32_t (*get_target_pstate)(struct cpudata *);
140242 };
141243
244+/**
245+ * struct cpu_defaults- Per CPU model default config data
246+ * @pid_policy: PID config data
247+ * @funcs: Callback function data
248+ */
142249 struct cpu_defaults {
143250 struct pstate_adjust_policy pid_policy;
144251 struct pstate_funcs funcs;
@@ -151,6 +258,34 @@ static struct pstate_adjust_policy pid_params; · 6 unmodified lines
151258 static struct pstate_funcs pstate_funcs;
152259 static int hwp_active;
153260
261+
262+/**
263+ * struct perf_limits - Store user and policy limits
264+ * @no_turbo: User requested turbo state from intel_pstate sysfs
265+ * @turbo_disabled: Platform turbo status either from msr
266+ * MSR_IA32_MISC_ENABLE or when maximum available pstate
267+ * matches the maximum turbo pstate
268+ * @max_perf_pct: Effective maximum performance limit in percentage, this
269+ * is minimum of either limits enforced by cpufreq policy
270+ * or limits from user set limits via intel_pstate sysfs
271+ * @min_perf_pct: Effective minimum performance limit in percentage, this
272+ * is maximum of either limits enforced by cpufreq policy
273+ * or limits from user set limits via intel_pstate sysfs
274+ * @max_perf: This is a scaled value between 0 to 255 for max_perf_pct
275+ * This value is used to limit max pstate
276+ * @min_perf: This is a scaled value between 0 to 255 for min_perf_pct
277+ * This value is used to limit min pstate
278+ * @max_policy_pct: The maximum performance in percentage enforced by
279+ * cpufreq setpolicy interface
280+ * @max_sysfs_pct: The maximum performance in percentage enforced by
281+ * intel pstate sysfs interface
282+ * @min_policy_pct: The minimum performance in percentage enforced by
283+ * cpufreq setpolicy interface
284+ * @min_sysfs_pct: The minimum performance in percentage enforced by
285+ * intel pstate sysfs interface
286+ *
287+ * Storage for user and policy defined limits.
288+ */
154289 struct perf_limits {
155290 int no_turbo;
156291 int turbo_disabled;
@@ -910,7 +1045,14 @@ static inline bool intel_pstate_sample(struct cpudata *cpu, u64 time) · 753 unmodified lines
9101045 cpu->prev_aperf = aperf;
9111046 cpu->prev_mperf = mperf;
9121047 cpu->prev_tsc = tsc;
913− return true;
1048+ /*
1049+ * First time this function is invoked in a given cycle, all of the
1050+ * previous sample data fields are equal to zero or stale and they must
1051+ * be populated with meaningful numbers for things to work, so assume
1052+ * that sample.time will always be reset before setting the utilization
1053+ * update hook and make the caller skip the sample then.
1054+ */
1055+ return !!cpu->last_sample_time;
9141056 }
9151057
9161058 static inline int32_t get_avg_frequency(struct cpudata *cpu)
@@ -984,8 +1126,7 @@ static inline int32_t get_target_pstate_use_performance(struct cpudata *cpu) · 67 unmodified lines
9841126 * enough period of time to adjust our busyness.
9851127 */
9861128 duration_ns = cpu->sample.time - cpu->last_sample_time;
987− if ((s64)duration_ns > pid_params.sample_rate_ns * 3
988− && cpu->last_sample_time > 0) {
1129+ if ((s64)duration_ns > pid_params.sample_rate_ns * 3) {
9891130 sample_ratio = div_fp(int_tofp(pid_params.sample_rate_ns),
9901131 int_tofp(duration_ns));
9911132 core_busy = mul_fp(core_busy, sample_ratio);
@@ -1100,10 +1241,8 @@ static int intel_pstate_init_cpu(unsigned int cpunum) · 108 unmodified lines
11001241 intel_pstate_get_cpu_pstates(cpu);
11011242
11021243 intel_pstate_busy_pid_reset(cpu);
1103− intel_pstate_sample(cpu, 0);
11041244
11051245 cpu->update_util.func = intel_pstate_update_util;
1106− cpufreq_set_update_util_data(cpunum, &cpu->update_util);
11071246
11081247 pr_debug("intel_pstate: controlling: cpu %d\n", cpunum);
11091248
@@ -1122,22 +1261,54 @@ static unsigned int intel_pstate_get(unsigned int cpu_num) · 12 unmodified lines
11221261 return get_avg_frequency(cpu);
11231262 }
11241263
1264+static void intel_pstate_set_update_util_hook(unsigned int cpu_num)
1265+{
1266+ struct cpudata *cpu = all_cpu_data[cpu_num];
1267+
1268+ /* Prevent intel_pstate_update_util() from using stale data. */
1269+ cpu->sample.time = 0;
1270+ cpufreq_set_update_util_data(cpu_num, &cpu->update_util);
1271+}
1272+
1273+static void intel_pstate_clear_update_util_hook(unsigned int cpu)
1274+{
1275+ cpufreq_set_update_util_data(cpu, NULL);
1276+ synchronize_sched();
1277+}
1278+
1279+static void intel_pstate_set_performance_limits(struct perf_limits *limits)
1280+{
1281+ limits->no_turbo = 0;
1282+ limits->turbo_disabled = 0;
1283+ limits->max_perf_pct = 100;
1284+ limits->max_perf = int_tofp(1);
1285+ limits->min_perf_pct = 100;
1286+ limits->min_perf = int_tofp(1);
1287+ limits->max_policy_pct = 100;
1288+ limits->max_sysfs_pct = 100;
1289+ limits->min_policy_pct = 0;
1290+ limits->min_sysfs_pct = 0;
1291+}
1292+
11251293 static int intel_pstate_set_policy(struct cpufreq_policy *policy)
11261294 {
11271295 if (!policy->cpuinfo.max_freq)
11281296 return -ENODEV;
11291297
1130− if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
1131− policy->max >= policy->cpuinfo.max_freq) {
1132− pr_debug("intel_pstate: set performance\n");
1298+ intel_pstate_clear_update_util_hook(policy->cpu);
1299+
1300+ if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
11331301 limits = &performance_limits;
1134− if (hwp_active)
1135− intel_pstate_hwp_set(policy->cpus);
1136− return 0;
1302+ if (policy->max >= policy->cpuinfo.max_freq) {
1303+ pr_debug("intel_pstate: set performance\n");
1304+ intel_pstate_set_performance_limits(limits);
1305+ goto out;
1306+ }
1307+ } else {
1308+ pr_debug("intel_pstate: set powersave\n");
1309+ limits = &powersave_limits;
11371310 }
11381311
1139− pr_debug("intel_pstate: set powersave\n");
1140− limits = &powersave_limits;
11411312 limits->min_policy_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
11421313 limits->min_policy_pct = clamp_t(int, limits->min_policy_pct, 0 , 100);
11431314 limits->max_policy_pct = DIV_ROUND_UP(policy->max * 100,
@@ -1163,6 +1334,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) · 19 unmodified lines
11631334 limits->max_perf = div_fp(int_tofp(limits->max_perf_pct),
11641335 int_tofp(100));
11651336
1337+ out:
1338+ intel_pstate_set_update_util_hook(policy->cpu);
1339+
11661340 if (hwp_active)
11671341 intel_pstate_hwp_set(policy->cpus);
11681342
@@ -1187,8 +1361,7 @@ static void intel_pstate_stop_cpu(struct cpufreq_policy *policy) · 18 unmodified lines
11871361
11881362 pr_debug("intel_pstate: CPU %d exiting\n", cpu_num);
11891363
1190− cpufreq_set_update_util_data(cpu_num, NULL);
1191− synchronize_sched();
1364+ intel_pstate_clear_update_util_hook(cpu_num);
11921365
11931366 if (hwp_active)
11941367 return;
@@ -1455,8 +1628,7 @@ out: · 260 unmodified lines
14551628 get_online_cpus();
14561629 for_each_online_cpu(cpu) {
14571630 if (all_cpu_data[cpu]) {
1458− cpufreq_set_update_util_data(cpu, NULL);
1459− synchronize_sched();
1631+ intel_pstate_clear_update_util_hook(cpu);
14601632 kfree(all_cpu_data[cpu]);
14611633 }
14621634 }
drivers/idle/intel_idle.c+67−30
@@ -660,6 +660,35 @@ static struct cpuidle_state skl_cstates[] = { · 659 unmodified lines
660660 .enter = NULL }
661661 };
662662
663+static struct cpuidle_state skx_cstates[] = {
664+ {
665+ .name = "C1-SKX",
666+ .desc = "MWAIT 0x00",
667+ .flags = MWAIT2flg(0x00),
668+ .exit_latency = 2,
669+ .target_residency = 2,
670+ .enter = &intel_idle,
671+ .enter_freeze = intel_idle_freeze, },
672+ {
673+ .name = "C1E-SKX",
674+ .desc = "MWAIT 0x01",
675+ .flags = MWAIT2flg(0x01),
676+ .exit_latency = 10,
677+ .target_residency = 20,
678+ .enter = &intel_idle,
679+ .enter_freeze = intel_idle_freeze, },
680+ {
681+ .name = "C6-SKX",
682+ .desc = "MWAIT 0x20",
683+ .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
684+ .exit_latency = 133,
685+ .target_residency = 600,
686+ .enter = &intel_idle,
687+ .enter_freeze = intel_idle_freeze, },
688+ {
689+ .enter = NULL }
690+};
691+
663692 static struct cpuidle_state atom_cstates[] = {
664693 {
665694 .name = "C1E-ATM",
@@ -818,8 +847,11 @@ static int cpu_hotplug_notify(struct notifier_block *n, · 152 unmodified lines
818847 * driver in this case
819848 */
820849 dev = per_cpu_ptr(intel_idle_cpuidle_devices, hotcpu);
821− if (!dev->registered)
822− intel_idle_cpu_init(hotcpu);
850+ if (dev->registered)
851+ break;
852+
853+ if (intel_idle_cpu_init(hotcpu))
854+ return NOTIFY_BAD;
823855
824856 break;
825857 }
@@ -904,6 +936,10 @@ static const struct idle_cpu idle_cpu_skl = { · 78 unmodified lines
904936 .disable_promotion_to_c1e = true,
905937 };
906938
939+static const struct idle_cpu idle_cpu_skx = {
940+ .state_table = skx_cstates,
941+ .disable_promotion_to_c1e = true,
942+};
907943
908944 static const struct idle_cpu idle_cpu_avn = {
909945 .state_table = avn_cstates,
@@ -945,6 +981,9 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = { · 35 unmodified lines
945981 ICPU(0x56, idle_cpu_bdw),
946982 ICPU(0x4e, idle_cpu_skl),
947983 ICPU(0x5e, idle_cpu_skl),
984+ ICPU(0x8e, idle_cpu_skl),
985+ ICPU(0x9e, idle_cpu_skl),
986+ ICPU(0x55, idle_cpu_skx),
948987 ICPU(0x57, idle_cpu_knl),
949988 {}
950989 };
@@ -987,22 +1026,15 @@ static int __init intel_idle_probe(void) · 36 unmodified lines
9871026 icpu = (const struct idle_cpu *)id->driver_data;
9881027 cpuidle_state_table = icpu->state_table;
9891028
990− if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
991− lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE;
992− else
993− on_each_cpu(__setup_broadcast_timer, (void *)true, 1);
994−
9951029 pr_debug(PREFIX "v" INTEL_IDLE_VERSION
9961030 " model 0x%X\n", boot_cpu_data.x86_model);
9971031
998− pr_debug(PREFIX "lapic_timer_reliable_states 0x%x\n",
999− lapic_timer_reliable_states);
10001032 return 0;
10011033 }
10021034
10031035 /*
10041036 * intel_idle_cpuidle_devices_uninit()
1005− * unregister, free cpuidle_devices
1037+ * Unregisters the cpuidle devices.
10061038 */
10071039 static void intel_idle_cpuidle_devices_uninit(void)
10081040 {
@@ -1013,9 +1045,6 @@ static void intel_idle_cpuidle_devices_uninit(void) · 4 unmodified lines
10131045 dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
10141046 cpuidle_unregister_device(dev);
10151047 }
1016−
1017− free_percpu(intel_idle_cpuidle_devices);
1018− return;
10191048 }
10201049
10211050 /*
@@ -1111,7 +1140,7 @@ static void intel_idle_state_table_update(void) · 89 unmodified lines
11111140 * intel_idle_cpuidle_driver_init()
11121141 * allocate, initialize cpuidle_states
11131142 */
1114−static int __init intel_idle_cpuidle_driver_init(void)
1143+static void __init intel_idle_cpuidle_driver_init(void)
11151144 {
11161145 int cstate;
11171146 struct cpuidle_driver *drv = &intel_idle_driver;
@@ -1163,18 +1192,10 @@ static int __init intel_idle_cpuidle_driver_init(void) · 45 unmodified lines
11631192 drv->state_count += 1;
11641193 }
11651194
1166− if (icpu->auto_demotion_disable_flags)
1167− on_each_cpu(auto_demotion_disable, NULL, 1);
1168−
11691195 if (icpu->byt_auto_demotion_disable_flag) {
11701196 wrmsrl(MSR_CC6_DEMOTION_POLICY_CONFIG, 0);
11711197 wrmsrl(MSR_MC6_DEMOTION_POLICY_CONFIG, 0);
11721198 }
1173−
1174− if (icpu->disable_promotion_to_c1e) /* each-cpu is redundant */
1175− on_each_cpu(c1e_promotion_disable, NULL, 1);
1176−
1177− return 0;
11781199 }
11791200
11801201
@@ -1193,7 +1214,6 @@ static int intel_idle_cpu_init(int cpu) · 12 unmodified lines
11931214
11941215 if (cpuidle_register_device(dev)) {
11951216 pr_debug(PREFIX "cpuidle_register_device %d failed!\n", cpu);
1196− intel_idle_cpuidle_devices_uninit();
11971217 return -EIO;
11981218 }
11991219
@@ -1218,40 +1238,51 @@ static int __init intel_idle_init(void) · 18 unmodified lines
12181238 if (retval)
12191239 return retval;
12201240
1241+ intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
1242+ if (intel_idle_cpuidle_devices == NULL)
1243+ return -ENOMEM;
1244+
12211245 intel_idle_cpuidle_driver_init();
12221246 retval = cpuidle_register_driver(&intel_idle_driver);
12231247 if (retval) {
12241248 struct cpuidle_driver *drv = cpuidle_get_driver();
12251249 printk(KERN_DEBUG PREFIX "intel_idle yielding to %s",
12261250 drv ? drv->name : "none");
1251+ free_percpu(intel_idle_cpuidle_devices);
12271252 return retval;
12281253 }
12291254
1230− intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
1231− if (intel_idle_cpuidle_devices == NULL)
1232− return -ENOMEM;
1233−
12341255 cpu_notifier_register_begin();
12351256
12361257 for_each_online_cpu(i) {
12371258 retval = intel_idle_cpu_init(i);
12381259 if (retval) {
1260+ intel_idle_cpuidle_devices_uninit();
12391261 cpu_notifier_register_done();
12401262 cpuidle_unregister_driver(&intel_idle_driver);
1263+ free_percpu(intel_idle_cpuidle_devices);
12411264 return retval;
12421265 }
12431266 }
12441267 __register_cpu_notifier(&cpu_hotplug_notifier);
12451268
1269+ if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
1270+ lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE;
1271+ else
1272+ on_each_cpu(__setup_broadcast_timer, (void *)true, 1);
1273+
12461274 cpu_notifier_register_done();
12471275
1276+ pr_debug(PREFIX "lapic_timer_reliable_states 0x%x\n",
1277+ lapic_timer_reliable_states);
1278+
12481279 return 0;
12491280 }
12501281
12511282 static void __exit intel_idle_exit(void)
12521283 {
1253− intel_idle_cpuidle_devices_uninit();
1254− cpuidle_unregister_driver(&intel_idle_driver);
1284+ struct cpuidle_device *dev;
1285+ int i;
12551286
12561287 cpu_notifier_register_begin();
12571288
@@ -1259,9 +1290,15 @@ static void __exit intel_idle_exit(void) · 1 unmodified line
12591290 on_each_cpu(__setup_broadcast_timer, (void *)false, 1);
12601291 __unregister_cpu_notifier(&cpu_hotplug_notifier);
12611292
1293+ for_each_possible_cpu(i) {
1294+ dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
1295+ cpuidle_unregister_device(dev);
1296+ }
1297+
12621298 cpu_notifier_register_done();
12631299
1264− return;
1300+ cpuidle_unregister_driver(&intel_idle_driver);
1301+ free_percpu(intel_idle_cpuidle_devices);
12651302 }
12661303
12671304 module_init(intel_idle_init);
drivers/mailbox/pcc.c+2−2
@@ -361,8 +361,6 @@ static int __init acpi_pcc_probe(void) · 360 unmodified lines
361361 struct acpi_generic_address *db_reg;
362362 struct acpi_pcct_hw_reduced *pcct_ss;
363363 pcc_mbox_channels[i].con_priv = pcct_entry;
364− pcct_entry = (struct acpi_subtable_header *)
365− ((unsigned long) pcct_entry + pcct_entry->length);
366364
367365 /* If doorbell is in system memory cache the virt address */
368366 pcct_ss = (struct acpi_pcct_hw_reduced *)pcct_entry;
@@ -370,6 +368,8 @@ static int __init acpi_pcc_probe(void) · 1 unmodified line
370368 if (db_reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
371369 pcc_doorbell_vaddr[i] = acpi_os_ioremap(db_reg->address,
372370 db_reg->bit_width/8);
371+ pcct_entry = (struct acpi_subtable_header *)
372+ ((unsigned long) pcct_entry + pcct_entry->length);
373373 }
374374
375375 pcc_mbox_ctrl.num_chans = count;
drivers/powercap/intel_rapl.c+1−0
@@ -1091,6 +1091,7 @@ static const struct x86_cpu_id rapl_ids[] __initconst = { · 1090 unmodified lines
10911091 RAPL_CPU(0x3f, rapl_defaults_hsw_server),/* Haswell servers */
10921092 RAPL_CPU(0x4f, rapl_defaults_hsw_server),/* Broadwell servers */
10931093 RAPL_CPU(0x45, rapl_defaults_core),/* Haswell ULT */
1094+ RAPL_CPU(0x46, rapl_defaults_core),/* Haswell */
10941095 RAPL_CPU(0x47, rapl_defaults_core),/* Broadwell-H */
10951096 RAPL_CPU(0x4E, rapl_defaults_core),/* Skylake */
10961097 RAPL_CPU(0x4C, rapl_defaults_cht),/* Braswell/Cherryview */
tools/power/x86/turbostat/turbostat.c+107−10
@@ -66,6 +66,8 @@ unsigned int do_slm_cstates; · 65 unmodified lines
6666 unsigned int use_c1_residency_msr;
6767 unsigned int has_aperf;
6868 unsigned int has_epb;
69+unsigned int do_irtl_snb;
70+unsigned int do_irtl_hsw;
6971 unsigned int units = 1000000; /* MHz etc */
7072 unsigned int genuine_intel;
7173 unsigned int has_invariant_tsc;
@@ -187,7 +189,7 @@ struct pkg_data { · 115 unmodified lines
187189 unsigned long long pkg_any_core_c0;
188190 unsigned long long pkg_any_gfxe_c0;
189191 unsigned long long pkg_both_core_gfxe_c0;
190− unsigned long long gfx_rc6_ms;
192+ long long gfx_rc6_ms;
191193 unsigned int gfx_mhz;
192194 unsigned int package_id;
193195 unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */
@@ -621,8 +623,14 @@ int format_counters(struct thread_data *t, struct core_data *c, · 427 unmodified lines
621623 outp += sprintf(outp, "%8d", p->pkg_temp_c);
622624
623625 /* GFXrc6 */
624− if (do_gfx_rc6_ms)
625− outp += sprintf(outp, "%8.2f", 100.0 * p->gfx_rc6_ms / 1000.0 / interval_float);
626+ if (do_gfx_rc6_ms) {
627+ if (p->gfx_rc6_ms == -1) { /* detect counter reset */
628+ outp += sprintf(outp, " ***.**");
629+ } else {
630+ outp += sprintf(outp, "%8.2f",
631+ p->gfx_rc6_ms / 10.0 / interval_float);
632+ }
633+ }
626634
627635 /* GFXMHz */
628636 if (do_gfx_mhz)
@@ -766,7 +774,12 @@ delta_package(struct pkg_data *new, struct pkg_data *old) · 137 unmodified lines
766774 old->pc10 = new->pc10 - old->pc10;
767775 old->pkg_temp_c = new->pkg_temp_c;
768776
769− old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms;
777+ /* flag an error when rc6 counter resets/wraps */
778+ if (old->gfx_rc6_ms > new->gfx_rc6_ms)
779+ old->gfx_rc6_ms = -1;
780+ else
781+ old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms;
782+
770783 old->gfx_mhz = new->gfx_mhz;
771784
772785 DELTA_WRAP32(new->energy_pkg, old->energy_pkg);
@@ -1296,6 +1309,7 @@ int hsw_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, · 523 unmodified lines
12961309 int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
12971310 int amt_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
12981311 int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
1312+int bxt_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
12991313
13001314
13011315 static void
@@ -1579,6 +1593,47 @@ dump_config_tdp(void) · 277 unmodified lines
15791593 fprintf(outf, " lock=%d", (unsigned int)(msr >> 31) & 1);
15801594 fprintf(outf, ")\n");
15811595 }
1596+
1597+unsigned int irtl_time_units[] = {1, 32, 1024, 32768, 1048576, 33554432, 0, 0 };
1598+
1599+void print_irtl(void)
1600+{
1601+ unsigned long long msr;
1602+
1603+ get_msr(base_cpu, MSR_PKGC3_IRTL, &msr);
1604+ fprintf(outf, "cpu%d: MSR_PKGC3_IRTL: 0x%08llx (", base_cpu, msr);
1605+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1606+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1607+
1608+ get_msr(base_cpu, MSR_PKGC6_IRTL, &msr);
1609+ fprintf(outf, "cpu%d: MSR_PKGC6_IRTL: 0x%08llx (", base_cpu, msr);
1610+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1611+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1612+
1613+ get_msr(base_cpu, MSR_PKGC7_IRTL, &msr);
1614+ fprintf(outf, "cpu%d: MSR_PKGC7_IRTL: 0x%08llx (", base_cpu, msr);
1615+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1616+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1617+
1618+ if (!do_irtl_hsw)
1619+ return;
1620+
1621+ get_msr(base_cpu, MSR_PKGC8_IRTL, &msr);
1622+ fprintf(outf, "cpu%d: MSR_PKGC8_IRTL: 0x%08llx (", base_cpu, msr);
1623+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1624+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1625+
1626+ get_msr(base_cpu, MSR_PKGC9_IRTL, &msr);
1627+ fprintf(outf, "cpu%d: MSR_PKGC9_IRTL: 0x%08llx (", base_cpu, msr);
1628+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1629+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1630+
1631+ get_msr(base_cpu, MSR_PKGC10_IRTL, &msr);
1632+ fprintf(outf, "cpu%d: MSR_PKGC10_IRTL: 0x%08llx (", base_cpu, msr);
1633+ fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT",
1634+ (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
1635+
1636+}
15821637 void free_fd_percpu(void)
15831638 {
15841639 int i;
@@ -2144,6 +2199,9 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) · 559 unmodified lines
21442199 case 0x56: /* BDX-DE */
21452200 case 0x4E: /* SKL */
21462201 case 0x5E: /* SKL */
2202+ case 0x8E: /* KBL */
2203+ case 0x9E: /* KBL */
2204+ case 0x55: /* SKX */
21472205 pkg_cstate_limits = hsw_pkg_cstate_limits;
21482206 break;
21492207 case 0x37: /* BYT */
@@ -2156,6 +2214,9 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) · 6 unmodified lines
21562214 case 0x57: /* PHI */
21572215 pkg_cstate_limits = phi_pkg_cstate_limits;
21582216 break;
2217+ case 0x5C: /* BXT */
2218+ pkg_cstate_limits = bxt_pkg_cstate_limits;
2219+ break;
21592220 default:
21602221 return 0;
21612222 }
@@ -2248,6 +2309,9 @@ int has_config_tdp(unsigned int family, unsigned int model) · 86 unmodified lines
22482309 case 0x56: /* BDX-DE */
22492310 case 0x4E: /* SKL */
22502311 case 0x5E: /* SKL */
2312+ case 0x8E: /* KBL */
2313+ case 0x9E: /* KBL */
2314+ case 0x55: /* SKX */
22512315
22522316 case 0x57: /* Knights Landing */
22532317 return 1;
@@ -2585,13 +2649,19 @@ void rapl_probe(unsigned int family, unsigned int model) · 331 unmodified lines
25852649 case 0x47: /* BDW */
25862650 do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO;
25872651 break;
2652+ case 0x5C: /* BXT */
2653+ do_rapl = RAPL_PKG | RAPL_PKG_POWER_INFO;
2654+ break;
25882655 case 0x4E: /* SKL */
25892656 case 0x5E: /* SKL */
2657+ case 0x8E: /* KBL */
2658+ case 0x9E: /* KBL */
25902659 do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO;
25912660 break;
25922661 case 0x3F: /* HSX */
25932662 case 0x4F: /* BDX */
25942663 case 0x56: /* BDX-DE */
2664+ case 0x55: /* SKX */
25952665 case 0x57: /* KNL */
25962666 do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO;
25972667 break;
@@ -2871,6 +2941,10 @@ int has_snb_msrs(unsigned int family, unsigned int model) · 273 unmodified lines
28712941 case 0x56: /* BDX-DE */
28722942 case 0x4E: /* SKL */
28732943 case 0x5E: /* SKL */
2944+ case 0x8E: /* KBL */
2945+ case 0x9E: /* KBL */
2946+ case 0x55: /* SKX */
2947+ case 0x5C: /* BXT */
28742948 return 1;
28752949 }
28762950 return 0;
@@ -2879,9 +2953,14 @@ int has_snb_msrs(unsigned int family, unsigned int model) · 2 unmodified lines
28792953 /*
28802954 * HSW adds support for additional MSRs:
28812955 *
2882− * MSR_PKG_C8_RESIDENCY 0x00000630
2883− * MSR_PKG_C9_RESIDENCY 0x00000631
2884− * MSR_PKG_C10_RESIDENCY 0x00000632
2956+ * MSR_PKG_C8_RESIDENCY 0x00000630
2957+ * MSR_PKG_C9_RESIDENCY 0x00000631
2958+ * MSR_PKG_C10_RESIDENCY 0x00000632
2959+ *
2960+ * MSR_PKGC8_IRTL 0x00000633
2961+ * MSR_PKGC9_IRTL 0x00000634
2962+ * MSR_PKGC10_IRTL 0x00000635
2963+ *
28852964 */
28862965 int has_hsw_msrs(unsigned int family, unsigned int model)
28872966 {
@@ -2893,6 +2972,9 @@ int has_hsw_msrs(unsigned int family, unsigned int model) · 5 unmodified lines
28932972 case 0x3D: /* BDW */
28942973 case 0x4E: /* SKL */
28952974 case 0x5E: /* SKL */
2975+ case 0x8E: /* KBL */
2976+ case 0x9E: /* KBL */
2977+ case 0x5C: /* BXT */
28962978 return 1;
28972979 }
28982980 return 0;
@@ -2914,6 +2996,8 @@ int has_skl_msrs(unsigned int family, unsigned int model) · 15 unmodified lines
29142996 switch (model) {
29152997 case 0x4E: /* SKL */
29162998 case 0x5E: /* SKL */
2999+ case 0x8E: /* KBL */
3000+ case 0x9E: /* KBL */
29173001 return 1;
29183002 }
29193003 return 0;
@@ -3187,7 +3271,7 @@ void process_cpuid() · 267 unmodified lines
31873271 if (debug)
31883272 decode_misc_enable_msr();
31893273
3190− if (max_level >= 0x7) {
3274+ if (max_level >= 0x7 && debug) {
31913275 int has_sgx;
31923276
31933277 ecx = 0;
@@ -3221,7 +3305,15 @@ void process_cpuid() · 27 unmodified lines
32213305 switch(model) {
32223306 case 0x4E: /* SKL */
32233307 case 0x5E: /* SKL */
3224− crystal_hz = 24000000; /* 24 MHz */
3308+ case 0x8E: /* KBL */
3309+ case 0x9E: /* KBL */
3310+ crystal_hz = 24000000; /* 24.0 MHz */
3311+ break;
3312+ case 0x55: /* SKX */
3313+ crystal_hz = 25000000; /* 25.0 MHz */
3314+ break;
3315+ case 0x5C: /* BXT */
3316+ crystal_hz = 19200000; /* 19.2 MHz */
32253317 break;
32263318 default:
32273319 crystal_hz = 0;
@@ -3254,11 +3346,13 @@ void process_cpuid() · 26 unmodified lines
32543346
32553347 do_nhm_platform_info = do_nhm_cstates = do_smi = probe_nhm_msrs(family, model);
32563348 do_snb_cstates = has_snb_msrs(family, model);
3349+ do_irtl_snb = has_snb_msrs(family, model);
32573350 do_pc2 = do_snb_cstates && (pkg_cstate_limit >= PCL__2);
32583351 do_pc3 = (pkg_cstate_limit >= PCL__3);
32593352 do_pc6 = (pkg_cstate_limit >= PCL__6);
32603353 do_pc7 = do_snb_cstates && (pkg_cstate_limit >= PCL__7);
32613354 do_c8_c9_c10 = has_hsw_msrs(family, model);
3355+ do_irtl_hsw = has_hsw_msrs(family, model);
32623356 do_skl_residency = has_skl_msrs(family, model);
32633357 do_slm_cstates = is_slm(family, model);
32643358 do_knl_cstates = is_knl(family, model);
@@ -3564,6 +3658,9 @@ void turbostat_init() · 299 unmodified lines
35643658
35653659 if (debug)
35663660 for_all_cpus(print_thermal, ODD_COUNTERS);
3661+
3662+ if (debug && do_irtl_snb)
3663+ print_irtl();
35673664 }
35683665
35693666 int fork_it(char **argv)
@@ -3629,7 +3726,7 @@ int get_and_dump_counters(void) · 59 unmodified lines
36293726 }
36303727
36313728 void print_version() {
3632− fprintf(outf, "turbostat version 4.11 27 Feb 2016"
3729+ fprintf(outf, "turbostat version 4.12 5 Apr 2016"
36333730 " - Len Brown <lenb@kernel.org>\n");
36343731 }
36353732