hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/include/linux/pm_domain.h
....@@ -1,31 +1,84 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * pm_domain.h - Definitions and headers related to device power domains.
34 *
45 * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp.
5
- *
6
- * This file is released under the GPLv2.
76 */
87
98 #ifndef _LINUX_PM_DOMAIN_H
109 #define _LINUX_PM_DOMAIN_H
1110
1211 #include <linux/device.h>
12
+#include <linux/ktime.h>
1313 #include <linux/mutex.h>
1414 #include <linux/pm.h>
1515 #include <linux/err.h>
1616 #include <linux/of.h>
1717 #include <linux/notifier.h>
1818 #include <linux/spinlock.h>
19
+#include <linux/cpumask.h>
1920
20
-/* Defines used for the flags field in the struct generic_pm_domain */
21
-#define GENPD_FLAG_PM_CLK (1U << 0) /* PM domain uses PM clk */
22
-#define GENPD_FLAG_IRQ_SAFE (1U << 1) /* PM domain operates in atomic */
23
-#define GENPD_FLAG_ALWAYS_ON (1U << 2) /* PM domain is always powered on */
24
-#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) /* Keep devices active if wakeup */
21
+/*
22
+ * Flags to control the behaviour of a genpd.
23
+ *
24
+ * These flags may be set in the struct generic_pm_domain's flags field by a
25
+ * genpd backend driver. The flags must be set before it calls pm_genpd_init(),
26
+ * which initializes a genpd.
27
+ *
28
+ * GENPD_FLAG_PM_CLK: Instructs genpd to use the PM clk framework,
29
+ * while powering on/off attached devices.
30
+ *
31
+ * GENPD_FLAG_IRQ_SAFE: This informs genpd that its backend callbacks,
32
+ * ->power_on|off(), doesn't sleep. Hence, these
33
+ * can be invoked from within atomic context, which
34
+ * enables genpd to power on/off the PM domain,
35
+ * even when pm_runtime_is_irq_safe() returns true,
36
+ * for any of its attached devices. Note that, a
37
+ * genpd having this flag set, requires its
38
+ * masterdomains to also have it set.
39
+ *
40
+ * GENPD_FLAG_ALWAYS_ON: Instructs genpd to always keep the PM domain
41
+ * powered on.
42
+ *
43
+ * GENPD_FLAG_ACTIVE_WAKEUP: Instructs genpd to keep the PM domain powered
44
+ * on, in case any of its attached devices is used
45
+ * in the wakeup path to serve system wakeups.
46
+ *
47
+ * GENPD_FLAG_CPU_DOMAIN: Instructs genpd that it should expect to get
48
+ * devices attached, which may belong to CPUs or
49
+ * possibly have subdomains with CPUs attached.
50
+ * This flag enables the genpd backend driver to
51
+ * deploy idle power management support for CPUs
52
+ * and groups of CPUs. Note that, the backend
53
+ * driver must then comply with the so called,
54
+ * last-man-standing algorithm, for the CPUs in the
55
+ * PM domain.
56
+ *
57
+ * GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain
58
+ * powered on except for system suspend.
59
+ *
60
+ * GENPD_FLAG_MIN_RESIDENCY: Enable the genpd governor to consider its
61
+ * components' next wakeup when determining the
62
+ * optimal idle state.
63
+ */
64
+#define GENPD_FLAG_PM_CLK (1U << 0)
65
+#define GENPD_FLAG_IRQ_SAFE (1U << 1)
66
+#define GENPD_FLAG_ALWAYS_ON (1U << 2)
67
+#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
68
+#define GENPD_FLAG_CPU_DOMAIN (1U << 4)
69
+#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
70
+#define GENPD_FLAG_MIN_RESIDENCY (1U << 6)
2571
2672 enum gpd_status {
27
- GPD_STATE_ACTIVE = 0, /* PM domain is active */
28
- GPD_STATE_POWER_OFF, /* PM domain is off */
73
+ GENPD_STATE_ON = 0, /* PM domain is on */
74
+ GENPD_STATE_OFF, /* PM domain is off */
75
+};
76
+
77
+enum genpd_notication {
78
+ GENPD_NOTIFY_PRE_OFF = 0,
79
+ GENPD_NOTIFY_OFF,
80
+ GENPD_NOTIFY_PRE_ON,
81
+ GENPD_NOTIFY_ON,
2982 };
3083
3184 struct dev_power_governor {
....@@ -42,19 +95,23 @@
4295 s64 power_off_latency_ns;
4396 s64 power_on_latency_ns;
4497 s64 residency_ns;
98
+ u64 usage;
99
+ u64 rejected;
45100 struct fwnode_handle *fwnode;
46101 ktime_t idle_time;
102
+ void *data;
47103 };
48104
49105 struct genpd_lock_ops;
50106 struct dev_pm_opp;
107
+struct opp_table;
51108
52109 struct generic_pm_domain {
53110 struct device dev;
54111 struct dev_pm_domain domain; /* PM domain operations */
55112 struct list_head gpd_list_node; /* Node in the global PM domains list */
56
- struct list_head master_links; /* Links with PM domain as a master */
57
- struct list_head slave_links; /* Links with PM domain as a slave */
113
+ struct list_head parent_links; /* Links with PM domain as a parent */
114
+ struct list_head child_links; /* Links with PM domain as a child */
58115 struct list_head dev_list; /* List of devices */
59116 struct dev_power_governor *gov;
60117 struct work_struct power_off_work;
....@@ -67,26 +124,31 @@
67124 unsigned int suspended_count; /* System suspend device counter */
68125 unsigned int prepared_count; /* Suspend counter of prepared devices */
69126 unsigned int performance_state; /* Aggregated max performance state */
70
- bool suspend_power_off; /* Power status before system suspend */
127
+ cpumask_var_t cpus; /* A cpumask of the attached CPUs */
71128 int (*power_off)(struct generic_pm_domain *domain);
72129 int (*power_on)(struct generic_pm_domain *domain);
130
+ struct raw_notifier_head power_notifiers; /* Power on/off notifiers */
131
+ struct opp_table *opp_table; /* OPP table of the genpd */
73132 unsigned int (*opp_to_performance_state)(struct generic_pm_domain *genpd,
74133 struct dev_pm_opp *opp);
75134 int (*set_performance_state)(struct generic_pm_domain *genpd,
76135 unsigned int state);
77136 struct gpd_dev_ops dev_ops;
78137 s64 max_off_time_ns; /* Maximum allowed "suspended" time. */
138
+ ktime_t next_wakeup; /* Maintained by the domain governor */
79139 bool max_off_time_changed;
80140 bool cached_power_down_ok;
141
+ bool cached_power_down_state_idx;
81142 int (*attach_dev)(struct generic_pm_domain *domain,
82143 struct device *dev);
83144 void (*detach_dev)(struct generic_pm_domain *domain,
84145 struct device *dev);
85146 unsigned int flags; /* Bit field of configs for genpd */
86147 struct genpd_power_state *states;
148
+ void (*free_states)(struct genpd_power_state *states,
149
+ unsigned int state_count);
87150 unsigned int state_count; /* number of states */
88151 unsigned int state_idx; /* state that genpd will go to when off */
89
- void *free; /* Free the state that was allocated for default */
90152 ktime_t on_time;
91153 ktime_t accounting_time;
92154 const struct genpd_lock_ops *lock_ops;
....@@ -106,10 +168,14 @@
106168 }
107169
108170 struct gpd_link {
109
- struct generic_pm_domain *master;
110
- struct list_head master_node;
111
- struct generic_pm_domain *slave;
112
- struct list_head slave_node;
171
+ struct generic_pm_domain *parent;
172
+ struct list_head parent_node;
173
+ struct generic_pm_domain *child;
174
+ struct list_head child_node;
175
+
176
+ /* Sub-domain's per-master domain performance state */
177
+ unsigned int performance_state;
178
+ unsigned int prev_performance_state;
113179 };
114180
115181 struct gpd_timing_data {
....@@ -129,7 +195,10 @@
129195 struct pm_domain_data base;
130196 struct gpd_timing_data td;
131197 struct notifier_block nb;
198
+ struct notifier_block *power_nb;
199
+ int cpu;
132200 unsigned int performance_state;
201
+ ktime_t next_wakeup;
133202 void *data;
134203 };
135204
....@@ -147,16 +216,22 @@
147216 int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev);
148217 int pm_genpd_remove_device(struct device *dev);
149218 int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
150
- struct generic_pm_domain *new_subdomain);
219
+ struct generic_pm_domain *subdomain);
151220 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
152
- struct generic_pm_domain *target);
221
+ struct generic_pm_domain *subdomain);
153222 int pm_genpd_init(struct generic_pm_domain *genpd,
154223 struct dev_power_governor *gov, bool is_off);
155224 int pm_genpd_remove(struct generic_pm_domain *genpd);
156225 int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state);
226
+int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb);
227
+int dev_pm_genpd_remove_notifier(struct device *dev);
228
+void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next);
157229
158230 extern struct dev_power_governor simple_qos_governor;
159231 extern struct dev_power_governor pm_domain_always_on_gov;
232
+#ifdef CONFIG_CPU_IDLE
233
+extern struct dev_power_governor pm_domain_cpu_gov;
234
+#endif
160235 #else
161236
162237 static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev)
....@@ -173,12 +248,12 @@
173248 return -ENOSYS;
174249 }
175250 static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
176
- struct generic_pm_domain *new_sd)
251
+ struct generic_pm_domain *subdomain)
177252 {
178253 return -ENOSYS;
179254 }
180255 static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
181
- struct generic_pm_domain *target)
256
+ struct generic_pm_domain *subdomain)
182257 {
183258 return -ENOSYS;
184259 }
....@@ -198,16 +273,30 @@
198273 return -ENOTSUPP;
199274 }
200275
276
+static inline int dev_pm_genpd_add_notifier(struct device *dev,
277
+ struct notifier_block *nb)
278
+{
279
+ return -ENOTSUPP;
280
+}
281
+
282
+static inline int dev_pm_genpd_remove_notifier(struct device *dev)
283
+{
284
+ return -ENOTSUPP;
285
+}
286
+
287
+static inline void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next)
288
+{ }
289
+
201290 #define simple_qos_governor (*(struct dev_power_governor *)(NULL))
202291 #define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL))
203292 #endif
204293
205294 #ifdef CONFIG_PM_GENERIC_DOMAINS_SLEEP
206
-void pm_genpd_syscore_poweroff(struct device *dev);
207
-void pm_genpd_syscore_poweron(struct device *dev);
295
+void dev_pm_genpd_suspend(struct device *dev);
296
+void dev_pm_genpd_resume(struct device *dev);
208297 #else
209
-static inline void pm_genpd_syscore_poweroff(struct device *dev) {}
210
-static inline void pm_genpd_syscore_poweron(struct device *dev) {}
298
+static inline void dev_pm_genpd_suspend(struct device *dev) {}
299
+static inline void dev_pm_genpd_resume(struct device *dev) {}
211300 #endif
212301
213302 /* OF PM domain providers */
....@@ -229,19 +318,21 @@
229318 struct genpd_onecell_data *data);
230319 void of_genpd_del_provider(struct device_node *np);
231320 int of_genpd_add_device(struct of_phandle_args *args, struct device *dev);
232
-int of_genpd_add_subdomain(struct of_phandle_args *parent,
233
- struct of_phandle_args *new_subdomain);
321
+int of_genpd_add_subdomain(struct of_phandle_args *parent_spec,
322
+ struct of_phandle_args *subdomain_spec);
323
+int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec,
324
+ struct of_phandle_args *subdomain_spec);
234325 struct generic_pm_domain *of_genpd_remove_last(struct device_node *np);
235326 int of_genpd_parse_idle_states(struct device_node *dn,
236327 struct genpd_power_state **states, int *n);
237
-unsigned int of_genpd_opp_to_performance_state(struct device *dev,
238
- struct device_node *np);
328
+unsigned int pm_genpd_opp_to_performance_state(struct device *genpd_dev,
329
+ struct dev_pm_opp *opp);
239330
240331 int genpd_dev_pm_attach(struct device *dev);
241332 struct device *genpd_dev_pm_attach_by_id(struct device *dev,
242333 unsigned int index);
243334 struct device *genpd_dev_pm_attach_by_name(struct device *dev,
244
- char *name);
335
+ const char *name);
245336 #else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
246337 static inline int of_genpd_add_provider_simple(struct device_node *np,
247338 struct generic_pm_domain *genpd)
....@@ -263,8 +354,14 @@
263354 return -ENODEV;
264355 }
265356
266
-static inline int of_genpd_add_subdomain(struct of_phandle_args *parent,
267
- struct of_phandle_args *new_subdomain)
357
+static inline int of_genpd_add_subdomain(struct of_phandle_args *parent_spec,
358
+ struct of_phandle_args *subdomain_spec)
359
+{
360
+ return -ENODEV;
361
+}
362
+
363
+static inline int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec,
364
+ struct of_phandle_args *subdomain_spec)
268365 {
269366 return -ENODEV;
270367 }
....@@ -276,8 +373,8 @@
276373 }
277374
278375 static inline unsigned int
279
-of_genpd_opp_to_performance_state(struct device *dev,
280
- struct device_node *np)
376
+pm_genpd_opp_to_performance_state(struct device *genpd_dev,
377
+ struct dev_pm_opp *opp)
281378 {
282379 return 0;
283380 }
....@@ -294,7 +391,7 @@
294391 }
295392
296393 static inline struct device *genpd_dev_pm_attach_by_name(struct device *dev,
297
- char *name)
394
+ const char *name)
298395 {
299396 return NULL;
300397 }
....@@ -311,8 +408,9 @@
311408 struct device *dev_pm_domain_attach_by_id(struct device *dev,
312409 unsigned int index);
313410 struct device *dev_pm_domain_attach_by_name(struct device *dev,
314
- char *name);
411
+ const char *name);
315412 void dev_pm_domain_detach(struct device *dev, bool power_off);
413
+int dev_pm_domain_start(struct device *dev);
316414 void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd);
317415 #else
318416 static inline int dev_pm_domain_attach(struct device *dev, bool power_on)
....@@ -325,11 +423,15 @@
325423 return NULL;
326424 }
327425 static inline struct device *dev_pm_domain_attach_by_name(struct device *dev,
328
- char *name)
426
+ const char *name)
329427 {
330428 return NULL;
331429 }
332430 static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {}
431
+static inline int dev_pm_domain_start(struct device *dev)
432
+{
433
+ return 0;
434
+}
333435 static inline void dev_pm_domain_set(struct device *dev,
334436 struct dev_pm_domain *pd) {}
335437 #endif