Skip to content

Commit 3563f55

Browse files
committed
Merge tag 'pm-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management updates from Rafael Wysocki: "These add hybrid processors support to the intel_pstate driver and make it work with more processor models when HWP is disabled, make the intel_idle driver use special C6 idle state paremeters when package C-states are disabled, add cooling support to the tegra30 devfreq driver, rework the TEO (timer events oriented) cpuidle governor, extend the OPP (operating performance points) framework to use the required-opps DT property in more cases, fix some issues and clean up a number of assorted pieces of code. Specifics: - Make intel_pstate support hybrid processors using abstract performance units in the HWP interface (Rafael Wysocki). - Add Icelake servers and Cometlake support in no-HWP mode to intel_pstate (Giovanni Gherdovich). - Make cpufreq_online() error path be consistent with the CPU device removal path in cpufreq (Rafael Wysocki). - Clean up 3 cpufreq drivers and the statistics code (Hailong Liu, Randy Dunlap, Shaokun Zhang). - Make intel_idle use special idle state parameters for C6 when package C-states are disabled (Chen Yu). - Rework the TEO (timer events oriented) cpuidle governor to address some theoretical shortcomings in it (Rafael Wysocki). - Drop unneeded semicolon from the TEO governor (Wan Jiabing). - Modify the runtime PM framework to accept unassigned suspend and resume callback pointers (Ulf Hansson). - Improve pm_runtime_get_sync() documentation (Krzysztof Kozlowski). - Improve device performance states support in the generic power domains (genpd) framework (Ulf Hansson). - Fix some documentation issues in genpd (Yang Yingliang). - Make the operating performance points (OPP) framework use the required-opps DT property in use cases that are not related to genpd (Hsin-Yi Wang). - Make lazy_link_required_opp_table() use list_del_init instead of list_del/INIT_LIST_HEAD (Yang Yingliang). - Simplify wake IRQs handling in the core system-wide sleep support code and clean up some coding style inconsistencies in it (Tian Tao, Zhen Lei). - Add cooling support to the tegra30 devfreq driver and improve its DT bindings (Dmitry Osipenko). - Fix some assorted issues in the devfreq core and drivers (Chanwoo Choi, Dong Aisheng, YueHaibing)" * tag 'pm-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (39 commits) PM / devfreq: passive: Fix get_target_freq when not using required-opp cpufreq: Make cpufreq_online() call driver->offline() on errors opp: Allow required-opps to be used for non genpd use cases cpuidle: teo: remove unneeded semicolon in teo_select() dt-bindings: devfreq: tegra30-actmon: Add cooling-cells dt-bindings: devfreq: tegra30-actmon: Convert to schema PM / devfreq: userspace: Use DEVICE_ATTR_RW macro PM: runtime: Clarify documentation when callbacks are unassigned PM: runtime: Allow unassigned ->runtime_suspend|resume callbacks PM: runtime: Improve path in rpm_idle() when no callback PM: hibernate: remove leading spaces before tabs PM: sleep: remove trailing spaces and tabs PM: domains: Drop/restore performance state votes for devices at runtime PM PM: domains: Return early if perf state is already set for the device PM: domains: Split code in dev_pm_genpd_set_performance_state() cpuidle: teo: Use kerneldoc documentation in admin-guide cpuidle: teo: Rework most recent idle duration values treatment cpuidle: teo: Change the main idle state selection logic cpuidle: teo: Cosmetic modification of teo_select() cpuidle: teo: Cosmetic modifications of teo_update() ...
2 parents 1dfb0f4 + 22b65d3 commit 3563f55

31 files changed

+775
-481
lines changed

Documentation/admin-guide/pm/cpuidle.rst

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -347,81 +347,8 @@ for tickless systems. It follows the same basic strategy as the ``menu`` `one
347347
<menu-gov_>`_: it always tries to find the deepest idle state suitable for the
348348
given conditions. However, it applies a different approach to that problem.
349349

350-
First, it does not use sleep length correction factors, but instead it attempts
351-
to correlate the observed idle duration values with the available idle states
352-
and use that information to pick up the idle state that is most likely to
353-
"match" the upcoming CPU idle interval. Second, it does not take the tasks
354-
that were running on the given CPU in the past and are waiting on some I/O
355-
operations to complete now at all (there is no guarantee that they will run on
356-
the same CPU when they become runnable again) and the pattern detection code in
357-
it avoids taking timer wakeups into account. It also only uses idle duration
358-
values less than the current time till the closest timer (with the scheduler
359-
tick excluded) for that purpose.
360-
361-
Like in the ``menu`` governor `case <menu-gov_>`_, the first step is to obtain
362-
the *sleep length*, which is the time until the closest timer event with the
363-
assumption that the scheduler tick will be stopped (that also is the upper bound
364-
on the time until the next CPU wakeup). That value is then used to preselect an
365-
idle state on the basis of three metrics maintained for each idle state provided
366-
by the ``CPUIdle`` driver: ``hits``, ``misses`` and ``early_hits``.
367-
368-
The ``hits`` and ``misses`` metrics measure the likelihood that a given idle
369-
state will "match" the observed (post-wakeup) idle duration if it "matches" the
370-
sleep length. They both are subject to decay (after a CPU wakeup) every time
371-
the target residency of the idle state corresponding to them is less than or
372-
equal to the sleep length and the target residency of the next idle state is
373-
greater than the sleep length (that is, when the idle state corresponding to
374-
them "matches" the sleep length). The ``hits`` metric is increased if the
375-
former condition is satisfied and the target residency of the given idle state
376-
is less than or equal to the observed idle duration and the target residency of
377-
the next idle state is greater than the observed idle duration at the same time
378-
(that is, it is increased when the given idle state "matches" both the sleep
379-
length and the observed idle duration). In turn, the ``misses`` metric is
380-
increased when the given idle state "matches" the sleep length only and the
381-
observed idle duration is too short for its target residency.
382-
383-
The ``early_hits`` metric measures the likelihood that a given idle state will
384-
"match" the observed (post-wakeup) idle duration if it does not "match" the
385-
sleep length. It is subject to decay on every CPU wakeup and it is increased
386-
when the idle state corresponding to it "matches" the observed (post-wakeup)
387-
idle duration and the target residency of the next idle state is less than or
388-
equal to the sleep length (i.e. the idle state "matching" the sleep length is
389-
deeper than the given one).
390-
391-
The governor walks the list of idle states provided by the ``CPUIdle`` driver
392-
and finds the last (deepest) one with the target residency less than or equal
393-
to the sleep length. Then, the ``hits`` and ``misses`` metrics of that idle
394-
state are compared with each other and it is preselected if the ``hits`` one is
395-
greater (which means that that idle state is likely to "match" the observed idle
396-
duration after CPU wakeup). If the ``misses`` one is greater, the governor
397-
preselects the shallower idle state with the maximum ``early_hits`` metric
398-
(or if there are multiple shallower idle states with equal ``early_hits``
399-
metric which also is the maximum, the shallowest of them will be preselected).
400-
[If there is a wakeup latency constraint coming from the `PM QoS framework
401-
<cpu-pm-qos_>`_ which is hit before reaching the deepest idle state with the
402-
target residency within the sleep length, the deepest idle state with the exit
403-
latency within the constraint is preselected without consulting the ``hits``,
404-
``misses`` and ``early_hits`` metrics.]
405-
406-
Next, the governor takes several idle duration values observed most recently
407-
into consideration and if at least a half of them are greater than or equal to
408-
the target residency of the preselected idle state, that idle state becomes the
409-
final candidate to ask for. Otherwise, the average of the most recent idle
410-
duration values below the target residency of the preselected idle state is
411-
computed and the governor walks the idle states shallower than the preselected
412-
one and finds the deepest of them with the target residency within that average.
413-
That idle state is then taken as the final candidate to ask for.
414-
415-
Still, at this point the governor may need to refine the idle state selection if
416-
it has not decided to `stop the scheduler tick <idle-cpus-and-tick_>`_. That
417-
generally happens if the target residency of the idle state selected so far is
418-
less than the tick period and the tick has not been stopped already (in a
419-
previous iteration of the idle loop). Then, like in the ``menu`` governor
420-
`case <menu-gov_>`_, the sleep length used in the previous computations may not
421-
reflect the real time until the closest timer event and if it really is greater
422-
than that time, a shallower state with a suitable target residency may need to
423-
be selected.
424-
350+
.. kernel-doc:: drivers/cpuidle/governors/teo.c
351+
:doc: teo-description
425352

426353
.. _idle-states-representation:
427354

Documentation/admin-guide/pm/intel_pstate.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ argument is passed to the kernel in the command line.
365365
inclusive) including both turbo and non-turbo P-states (see
366366
`Turbo P-states Support`_).
367367

368+
This attribute is present only if the value exposed by it is the same
369+
for all of the CPUs in the system.
370+
368371
The value of this attribute is not affected by the ``no_turbo``
369372
setting described `below <no_turbo_attr_>`_.
370373

@@ -374,6 +377,9 @@ argument is passed to the kernel in the command line.
374377
Ratio of the `turbo range <turbo_>`_ size to the size of the entire
375378
range of supported P-states, in percent.
376379

380+
This attribute is present only if the value exposed by it is the same
381+
for all of the CPUs in the system.
382+
377383
This attribute is read-only.
378384

379385
.. _no_turbo_attr:

Documentation/devicetree/bindings/arm/tegra/nvidia,tegra30-actmon.txt

Lines changed: 0 additions & 57 deletions
This file was deleted.
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+
%YAML 1.2
3+
---
4+
$id: http://devicetree.org/schemas/devfreq/nvidia,tegra30-actmon.yaml#
5+
$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+
title: NVIDIA Tegra30 Activity Monitor
8+
9+
maintainers:
10+
- Dmitry Osipenko <[email protected]>
11+
- Jon Hunter <[email protected]>
12+
- Thierry Reding <[email protected]>
13+
14+
description: |
15+
The activity monitor block collects statistics about the behaviour of other
16+
components in the system. This information can be used to derive the rate at
17+
which the external memory needs to be clocked in order to serve all requests
18+
from the monitored clients.
19+
20+
properties:
21+
compatible:
22+
enum:
23+
- nvidia,tegra30-actmon
24+
- nvidia,tegra114-actmon
25+
- nvidia,tegra124-actmon
26+
- nvidia,tegra210-actmon
27+
28+
reg:
29+
maxItems: 1
30+
31+
clocks:
32+
maxItems: 2
33+
34+
clock-names:
35+
items:
36+
- const: actmon
37+
- const: emc
38+
39+
resets:
40+
maxItems: 1
41+
42+
reset-names:
43+
items:
44+
- const: actmon
45+
46+
interrupts:
47+
maxItems: 1
48+
49+
interconnects:
50+
minItems: 1
51+
maxItems: 12
52+
53+
interconnect-names:
54+
minItems: 1
55+
maxItems: 12
56+
description:
57+
Should include name of the interconnect path for each interconnect
58+
entry. Consult TRM documentation for information about available
59+
memory clients, see MEMORY CONTROLLER and ACTIVITY MONITOR sections.
60+
61+
operating-points-v2:
62+
description:
63+
Should contain freqs and voltages and opp-supported-hw property, which
64+
is a bitfield indicating SoC speedo ID mask.
65+
66+
"#cooling-cells":
67+
const: 2
68+
69+
required:
70+
- compatible
71+
- reg
72+
- clocks
73+
- clock-names
74+
- resets
75+
- reset-names
76+
- interrupts
77+
- interconnects
78+
- interconnect-names
79+
- operating-points-v2
80+
- "#cooling-cells"
81+
82+
additionalProperties: false
83+
84+
examples:
85+
- |
86+
#include <dt-bindings/memory/tegra30-mc.h>
87+
88+
mc: memory-controller@7000f000 {
89+
compatible = "nvidia,tegra30-mc";
90+
reg = <0x7000f000 0x400>;
91+
clocks = <&clk 32>;
92+
clock-names = "mc";
93+
94+
interrupts = <0 77 4>;
95+
96+
#iommu-cells = <1>;
97+
#reset-cells = <1>;
98+
#interconnect-cells = <1>;
99+
};
100+
101+
emc: external-memory-controller@7000f400 {
102+
compatible = "nvidia,tegra30-emc";
103+
reg = <0x7000f400 0x400>;
104+
interrupts = <0 78 4>;
105+
clocks = <&clk 57>;
106+
107+
nvidia,memory-controller = <&mc>;
108+
operating-points-v2 = <&dvfs_opp_table>;
109+
power-domains = <&domain>;
110+
111+
#interconnect-cells = <0>;
112+
};
113+
114+
actmon@6000c800 {
115+
compatible = "nvidia,tegra30-actmon";
116+
reg = <0x6000c800 0x400>;
117+
interrupts = <0 45 4>;
118+
clocks = <&clk 119>, <&clk 57>;
119+
clock-names = "actmon", "emc";
120+
resets = <&rst 119>;
121+
reset-names = "actmon";
122+
operating-points-v2 = <&dvfs_opp_table>;
123+
interconnects = <&mc TEGRA30_MC_MPCORER &emc>;
124+
interconnect-names = "cpu-read";
125+
#cooling-cells = <2>;
126+
};

Documentation/power/runtime_pm.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,11 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
378378

379379
`int pm_runtime_get_sync(struct device *dev);`
380380
- increment the device's usage counter, run pm_runtime_resume(dev) and
381-
return its result
381+
return its result;
382+
note that it does not drop the device's usage counter on errors, so
383+
consider using pm_runtime_resume_and_get() instead of it, especially
384+
if its return value is checked by the caller, as this is likely to
385+
result in cleaner code.
382386

383387
`int pm_runtime_get_if_in_use(struct device *dev);`
384388
- return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the
@@ -827,6 +831,15 @@ or driver about runtime power changes. Instead, the driver for the device's
827831
parent must take responsibility for telling the device's driver when the
828832
parent's power state changes.
829833

834+
Note that, in some cases it may not be desirable for subsystems/drivers to call
835+
pm_runtime_no_callbacks() for their devices. This could be because a subset of
836+
the runtime PM callbacks needs to be implemented, a platform dependent PM
837+
domain could get attached to the device or that the device is power managed
838+
through a supplier device link. For these reasons and to avoid boilerplate code
839+
in subsystems/drivers, the PM core allows runtime PM callbacks to be
840+
unassigned. More precisely, if a callback pointer is NULL, the PM core will act
841+
as though there was a callback and it returned 0.
842+
830843
9. Autosuspend, or automatically-delayed suspends
831844
=================================================
832845

0 commit comments

Comments
 (0)