Skip to content

Commit 638757c

Browse files
committed
Merge branches 'pm-em' and 'pm-opp'
Merge energy model management updates and operating performance points (OPP) library changes for 6.19-rc1: - Add support for sending netlink notifications to user space on energy model updates (Changwoo Mini, Peng Fan) - Minor improvements to the Rust OPP interface (Tamir Duberstein) - Fixes to scope-based pointers in the OPP library (Viresh Kumar) * pm-em: PM: EM: Add to em_pd_list only when no failure PM: EM: Notify an event when the performance domain changes PM: EM: Implement em_notify_pd_created/updated() PM: EM: Implement em_notify_pd_deleted() PM: EM: Implement em_nl_get_pd_table_doit() PM: EM: Implement em_nl_get_pds_doit() PM: EM: Add an iterator and accessor for the performance domain PM: EM: Add a skeleton code for netlink notification PM: EM: Add em.yaml and autogen files PM: EM: Expose the ID of a performance domain via debugfs PM: EM: Assign a unique ID when creating a performance domain * pm-opp: rust: opp: simplify callers of `to_c_str_array` OPP: Initialize scope-based pointers inline rust: opp: fix broken rustdoc link
3 parents bf7ae17 + 65df3a9 + 8dfa8bb commit 638757c

14 files changed

Lines changed: 867 additions & 151 deletions

File tree

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2+
3+
name: em
4+
5+
doc: |
6+
Energy model netlink interface to notify its changes.
7+
8+
protocol: genetlink
9+
10+
uapi-header: linux/energy_model.h
11+
12+
attribute-sets:
13+
-
14+
name: pds
15+
attributes:
16+
-
17+
name: pd
18+
type: nest
19+
nested-attributes: pd
20+
multi-attr: true
21+
-
22+
name: pd
23+
attributes:
24+
-
25+
name: pad
26+
type: pad
27+
-
28+
name: pd-id
29+
type: u32
30+
-
31+
name: flags
32+
type: u64
33+
-
34+
name: cpus
35+
type: string
36+
-
37+
name: pd-table
38+
attributes:
39+
-
40+
name: pd-id
41+
type: u32
42+
-
43+
name: ps
44+
type: nest
45+
nested-attributes: ps
46+
multi-attr: true
47+
-
48+
name: ps
49+
attributes:
50+
-
51+
name: pad
52+
type: pad
53+
-
54+
name: performance
55+
type: u64
56+
-
57+
name: frequency
58+
type: u64
59+
-
60+
name: power
61+
type: u64
62+
-
63+
name: cost
64+
type: u64
65+
-
66+
name: flags
67+
type: u64
68+
69+
operations:
70+
list:
71+
-
72+
name: get-pds
73+
attribute-set: pds
74+
doc: Get the list of information for all performance domains.
75+
do:
76+
reply:
77+
attributes:
78+
- pd
79+
-
80+
name: get-pd-table
81+
attribute-set: pd-table
82+
doc: Get the energy model table of a performance domain.
83+
do:
84+
request:
85+
attributes:
86+
- pd-id
87+
reply:
88+
attributes:
89+
- pd-id
90+
- ps
91+
-
92+
name: pd-created
93+
doc: A performance domain is created.
94+
notify: get-pd-table
95+
mcgrp: event
96+
-
97+
name: pd-updated
98+
doc: A performance domain is updated.
99+
notify: get-pd-table
100+
mcgrp: event
101+
-
102+
name: pd-deleted
103+
doc: A performance domain is deleted.
104+
attribute-set: pd-table
105+
event:
106+
attributes:
107+
- pd-id
108+
mcgrp: event
109+
110+
mcast-groups:
111+
list:
112+
-
113+
name: event

MAINTAINERS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9188,6 +9188,9 @@ S: Maintained
91889188
F: kernel/power/energy_model.c
91899189
F: include/linux/energy_model.h
91909190
F: Documentation/power/energy-model.rst
9191+
F: Documentation/netlink/specs/em.yaml
9192+
F: include/uapi/linux/energy_model.h
9193+
F: kernel/power/em_netlink*.*
91919194

91929195
EPAPR HYPERVISOR BYTE CHANNEL DEVICE DRIVER
91939196
M: Laurentiu Tudor <laurentiu.tudor@nxp.com>

drivers/opp/core.c

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_is_turbo);
309309
*/
310310
unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
311311
{
312-
struct opp_table *opp_table __free(put_opp_table);
312+
struct opp_table *opp_table __free(put_opp_table) =
313+
_find_opp_table(dev);
313314

314-
opp_table = _find_opp_table(dev);
315315
if (IS_ERR(opp_table))
316316
return 0;
317317

@@ -327,7 +327,6 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency);
327327
*/
328328
unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
329329
{
330-
struct opp_table *opp_table __free(put_opp_table);
331330
struct dev_pm_opp *opp;
332331
struct regulator *reg;
333332
unsigned long latency_ns = 0;
@@ -337,7 +336,9 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
337336
unsigned long max;
338337
} *uV;
339338

340-
opp_table = _find_opp_table(dev);
339+
struct opp_table *opp_table __free(put_opp_table) =
340+
_find_opp_table(dev);
341+
341342
if (IS_ERR(opp_table))
342343
return 0;
343344

@@ -409,10 +410,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_transition_latency);
409410
*/
410411
unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
411412
{
412-
struct opp_table *opp_table __free(put_opp_table);
413413
unsigned long freq = 0;
414414

415-
opp_table = _find_opp_table(dev);
415+
struct opp_table *opp_table __free(put_opp_table) =
416+
_find_opp_table(dev);
417+
416418
if (IS_ERR(opp_table))
417419
return 0;
418420

@@ -447,9 +449,9 @@ int _get_opp_count(struct opp_table *opp_table)
447449
*/
448450
int dev_pm_opp_get_opp_count(struct device *dev)
449451
{
450-
struct opp_table *opp_table __free(put_opp_table);
452+
struct opp_table *opp_table __free(put_opp_table) =
453+
_find_opp_table(dev);
451454

452-
opp_table = _find_opp_table(dev);
453455
if (IS_ERR(opp_table)) {
454456
dev_dbg(dev, "%s: OPP table not found (%ld)\n",
455457
__func__, PTR_ERR(opp_table));
@@ -605,9 +607,9 @@ _find_key(struct device *dev, unsigned long *key, int index, bool available,
605607
unsigned long opp_key, unsigned long key),
606608
bool (*assert)(struct opp_table *opp_table, unsigned int index))
607609
{
608-
struct opp_table *opp_table __free(put_opp_table);
610+
struct opp_table *opp_table __free(put_opp_table) =
611+
_find_opp_table(dev);
609612

610-
opp_table = _find_opp_table(dev);
611613
if (IS_ERR(opp_table)) {
612614
dev_err(dev, "%s: OPP table not found (%ld)\n", __func__,
613615
PTR_ERR(opp_table));
@@ -1410,12 +1412,13 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table,
14101412
*/
14111413
int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
14121414
{
1413-
struct opp_table *opp_table __free(put_opp_table);
14141415
struct dev_pm_opp *opp __free(put_opp) = NULL;
14151416
unsigned long freq = 0, temp_freq;
14161417
bool forced = false;
14171418

1418-
opp_table = _find_opp_table(dev);
1419+
struct opp_table *opp_table __free(put_opp_table) =
1420+
_find_opp_table(dev);
1421+
14191422
if (IS_ERR(opp_table)) {
14201423
dev_err(dev, "%s: device's opp table doesn't exist\n", __func__);
14211424
return PTR_ERR(opp_table);
@@ -1477,9 +1480,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_set_rate);
14771480
*/
14781481
int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
14791482
{
1480-
struct opp_table *opp_table __free(put_opp_table);
1483+
struct opp_table *opp_table __free(put_opp_table) =
1484+
_find_opp_table(dev);
14811485

1482-
opp_table = _find_opp_table(dev);
14831486
if (IS_ERR(opp_table)) {
14841487
dev_err(dev, "%s: device opp doesn't exist\n", __func__);
14851488
return PTR_ERR(opp_table);
@@ -1794,10 +1797,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_put);
17941797
*/
17951798
void dev_pm_opp_remove(struct device *dev, unsigned long freq)
17961799
{
1797-
struct opp_table *opp_table __free(put_opp_table);
17981800
struct dev_pm_opp *opp = NULL, *iter;
17991801

1800-
opp_table = _find_opp_table(dev);
1802+
struct opp_table *opp_table __free(put_opp_table) =
1803+
_find_opp_table(dev);
1804+
18011805
if (IS_ERR(opp_table))
18021806
return;
18031807

@@ -1885,9 +1889,9 @@ bool _opp_remove_all_static(struct opp_table *opp_table)
18851889
*/
18861890
void dev_pm_opp_remove_all_dynamic(struct device *dev)
18871891
{
1888-
struct opp_table *opp_table __free(put_opp_table);
1892+
struct opp_table *opp_table __free(put_opp_table) =
1893+
_find_opp_table(dev);
18891894

1890-
opp_table = _find_opp_table(dev);
18911895
if (IS_ERR(opp_table))
18921896
return;
18931897

@@ -2871,10 +2875,11 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
28712875
bool availability_req)
28722876
{
28732877
struct dev_pm_opp *opp __free(put_opp) = ERR_PTR(-ENODEV), *tmp_opp;
2874-
struct opp_table *opp_table __free(put_opp_table);
28752878

28762879
/* Find the opp_table */
2877-
opp_table = _find_opp_table(dev);
2880+
struct opp_table *opp_table __free(put_opp_table) =
2881+
_find_opp_table(dev);
2882+
28782883
if (IS_ERR(opp_table)) {
28792884
dev_warn(dev, "%s: Device OPP not found (%ld)\n", __func__,
28802885
PTR_ERR(opp_table));
@@ -2932,11 +2937,12 @@ int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
29322937

29332938
{
29342939
struct dev_pm_opp *opp __free(put_opp) = ERR_PTR(-ENODEV), *tmp_opp;
2935-
struct opp_table *opp_table __free(put_opp_table);
29362940
int r;
29372941

29382942
/* Find the opp_table */
2939-
opp_table = _find_opp_table(dev);
2943+
struct opp_table *opp_table __free(put_opp_table) =
2944+
_find_opp_table(dev);
2945+
29402946
if (IS_ERR(opp_table)) {
29412947
r = PTR_ERR(opp_table);
29422948
dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);
@@ -2986,12 +2992,13 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_adjust_voltage);
29862992
*/
29872993
int dev_pm_opp_sync_regulators(struct device *dev)
29882994
{
2989-
struct opp_table *opp_table __free(put_opp_table);
29902995
struct regulator *reg;
29912996
int ret, i;
29922997

29932998
/* Device may not have OPP table */
2994-
opp_table = _find_opp_table(dev);
2999+
struct opp_table *opp_table __free(put_opp_table) =
3000+
_find_opp_table(dev);
3001+
29953002
if (IS_ERR(opp_table))
29963003
return 0;
29973004

@@ -3062,9 +3069,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_disable);
30623069
*/
30633070
int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
30643071
{
3065-
struct opp_table *opp_table __free(put_opp_table);
3072+
struct opp_table *opp_table __free(put_opp_table) =
3073+
_find_opp_table(dev);
30663074

3067-
opp_table = _find_opp_table(dev);
30683075
if (IS_ERR(opp_table))
30693076
return PTR_ERR(opp_table);
30703077

@@ -3082,9 +3089,9 @@ EXPORT_SYMBOL(dev_pm_opp_register_notifier);
30823089
int dev_pm_opp_unregister_notifier(struct device *dev,
30833090
struct notifier_block *nb)
30843091
{
3085-
struct opp_table *opp_table __free(put_opp_table);
3092+
struct opp_table *opp_table __free(put_opp_table) =
3093+
_find_opp_table(dev);
30863094

3087-
opp_table = _find_opp_table(dev);
30883095
if (IS_ERR(opp_table))
30893096
return PTR_ERR(opp_table);
30903097

@@ -3101,10 +3108,10 @@ EXPORT_SYMBOL(dev_pm_opp_unregister_notifier);
31013108
*/
31023109
void dev_pm_opp_remove_table(struct device *dev)
31033110
{
3104-
struct opp_table *opp_table __free(put_opp_table);
3105-
31063111
/* Check for existing table for 'dev' */
3107-
opp_table = _find_opp_table(dev);
3112+
struct opp_table *opp_table __free(put_opp_table) =
3113+
_find_opp_table(dev);
3114+
31083115
if (IS_ERR(opp_table)) {
31093116
int error = PTR_ERR(opp_table);
31103117

drivers/opp/cpu.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ int dev_pm_opp_init_cpufreq_table(struct device *dev,
5656
return -ENOMEM;
5757

5858
for (i = 0, rate = 0; i < max_opps; i++, rate++) {
59-
struct dev_pm_opp *opp __free(put_opp);
60-
6159
/* find next rate */
62-
opp = dev_pm_opp_find_freq_ceil(dev, &rate);
60+
struct dev_pm_opp *opp __free(put_opp) =
61+
dev_pm_opp_find_freq_ceil(dev, &rate);
62+
6363
if (IS_ERR(opp)) {
6464
ret = PTR_ERR(opp);
6565
goto out;
@@ -154,12 +154,13 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_cpumask_remove_table);
154154
int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev,
155155
const struct cpumask *cpumask)
156156
{
157-
struct opp_table *opp_table __free(put_opp_table);
158157
struct opp_device *opp_dev;
159158
struct device *dev;
160159
int cpu;
161160

162-
opp_table = _find_opp_table(cpu_dev);
161+
struct opp_table *opp_table __free(put_opp_table) =
162+
_find_opp_table(cpu_dev);
163+
163164
if (IS_ERR(opp_table))
164165
return PTR_ERR(opp_table);
165166

@@ -201,10 +202,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_set_sharing_cpus);
201202
*/
202203
int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
203204
{
204-
struct opp_table *opp_table __free(put_opp_table);
205205
struct opp_device *opp_dev;
206206

207-
opp_table = _find_opp_table(cpu_dev);
207+
struct opp_table *opp_table __free(put_opp_table) =
208+
_find_opp_table(cpu_dev);
209+
208210
if (IS_ERR(opp_table))
209211
return PTR_ERR(opp_table);
210212

0 commit comments

Comments
 (0)