at v6.16 564 lines 17 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * pm_domain.h - Definitions and headers related to device power domains. 4 * 5 * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp. 6 */ 7 8#ifndef _LINUX_PM_DOMAIN_H 9#define _LINUX_PM_DOMAIN_H 10 11#include <linux/device.h> 12#include <linux/ktime.h> 13#include <linux/mutex.h> 14#include <linux/pm.h> 15#include <linux/err.h> 16#include <linux/of.h> 17#include <linux/notifier.h> 18#include <linux/spinlock.h> 19#include <linux/cpumask_types.h> 20#include <linux/time64.h> 21 22/* 23 * Flags to control the behaviour when attaching a device to its PM domains. 24 * 25 * PD_FLAG_NO_DEV_LINK: As the default behaviour creates a device-link 26 * for every PM domain that gets attached, this 27 * flag can be used to skip that. 28 * 29 * PD_FLAG_DEV_LINK_ON: Add the DL_FLAG_RPM_ACTIVE to power-on the 30 * supplier and its PM domain when creating the 31 * device-links. 32 * 33 * PD_FLAG_REQUIRED_OPP: Assign required_devs for the required OPPs. The 34 * index of the required OPP must correspond to the 35 * index in the array of the pd_names. If pd_names 36 * isn't specified, the index just follows the 37 * index for the attached PM domain. 38 * 39 */ 40#define PD_FLAG_NO_DEV_LINK BIT(0) 41#define PD_FLAG_DEV_LINK_ON BIT(1) 42#define PD_FLAG_REQUIRED_OPP BIT(2) 43 44struct dev_pm_domain_attach_data { 45 const char * const *pd_names; 46 const u32 num_pd_names; 47 const u32 pd_flags; 48}; 49 50struct dev_pm_domain_list { 51 struct device **pd_devs; 52 struct device_link **pd_links; 53 u32 *opp_tokens; 54 u32 num_pds; 55}; 56 57/* 58 * Flags to control the behaviour of a genpd. 59 * 60 * These flags may be set in the struct generic_pm_domain's flags field by a 61 * genpd backend driver. The flags must be set before it calls pm_genpd_init(), 62 * which initializes a genpd. 63 * 64 * GENPD_FLAG_PM_CLK: Instructs genpd to use the PM clk framework, 65 * while powering on/off attached devices. 66 * 67 * GENPD_FLAG_IRQ_SAFE: This informs genpd that its backend callbacks, 68 * ->power_on|off(), doesn't sleep. Hence, these 69 * can be invoked from within atomic context, which 70 * enables genpd to power on/off the PM domain, 71 * even when pm_runtime_is_irq_safe() returns true, 72 * for any of its attached devices. Note that, a 73 * genpd having this flag set, requires its 74 * masterdomains to also have it set. 75 * 76 * GENPD_FLAG_ALWAYS_ON: Instructs genpd to always keep the PM domain 77 * powered on. 78 * 79 * GENPD_FLAG_ACTIVE_WAKEUP: Instructs genpd to keep the PM domain powered 80 * on, in case any of its attached devices is used 81 * in the wakeup path to serve system wakeups. 82 * 83 * GENPD_FLAG_CPU_DOMAIN: Instructs genpd that it should expect to get 84 * devices attached, which may belong to CPUs or 85 * possibly have subdomains with CPUs attached. 86 * This flag enables the genpd backend driver to 87 * deploy idle power management support for CPUs 88 * and groups of CPUs. Note that, the backend 89 * driver must then comply with the so called, 90 * last-man-standing algorithm, for the CPUs in the 91 * PM domain. 92 * 93 * GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain 94 * powered on except for system suspend. 95 * 96 * GENPD_FLAG_MIN_RESIDENCY: Enable the genpd governor to consider its 97 * components' next wakeup when determining the 98 * optimal idle state. 99 * 100 * GENPD_FLAG_OPP_TABLE_FW: The genpd provider supports performance states, 101 * but its corresponding OPP tables are not 102 * described in DT, but are given directly by FW. 103 * 104 * GENPD_FLAG_DEV_NAME_FW: Instructs genpd to generate an unique device name 105 * using ida. It is used by genpd providers which 106 * get their genpd-names directly from FW. 107 */ 108#define GENPD_FLAG_PM_CLK (1U << 0) 109#define GENPD_FLAG_IRQ_SAFE (1U << 1) 110#define GENPD_FLAG_ALWAYS_ON (1U << 2) 111#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) 112#define GENPD_FLAG_CPU_DOMAIN (1U << 4) 113#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5) 114#define GENPD_FLAG_MIN_RESIDENCY (1U << 6) 115#define GENPD_FLAG_OPP_TABLE_FW (1U << 7) 116#define GENPD_FLAG_DEV_NAME_FW (1U << 8) 117 118enum gpd_status { 119 GENPD_STATE_ON = 0, /* PM domain is on */ 120 GENPD_STATE_OFF, /* PM domain is off */ 121}; 122 123enum genpd_notication { 124 GENPD_NOTIFY_PRE_OFF = 0, 125 GENPD_NOTIFY_OFF, 126 GENPD_NOTIFY_PRE_ON, 127 GENPD_NOTIFY_ON, 128}; 129 130struct dev_power_governor { 131 bool (*power_down_ok)(struct dev_pm_domain *domain); 132 bool (*suspend_ok)(struct device *dev); 133}; 134 135struct gpd_dev_ops { 136 int (*start)(struct device *dev); 137 int (*stop)(struct device *dev); 138}; 139 140struct genpd_governor_data { 141 s64 max_off_time_ns; 142 bool max_off_time_changed; 143 ktime_t next_wakeup; 144 ktime_t next_hrtimer; 145 ktime_t last_enter; 146 bool reflect_residency; 147 bool cached_power_down_ok; 148 bool cached_power_down_state_idx; 149}; 150 151struct genpd_power_state { 152 const char *name; 153 s64 power_off_latency_ns; 154 s64 power_on_latency_ns; 155 s64 residency_ns; 156 u64 usage; 157 u64 rejected; 158 u64 above; 159 u64 below; 160 struct fwnode_handle *fwnode; 161 u64 idle_time; 162 void *data; 163}; 164 165struct genpd_lock_ops; 166struct opp_table; 167 168struct generic_pm_domain { 169 struct device dev; 170 struct dev_pm_domain domain; /* PM domain operations */ 171 struct list_head gpd_list_node; /* Node in the global PM domains list */ 172 struct list_head parent_links; /* Links with PM domain as a parent */ 173 struct list_head child_links; /* Links with PM domain as a child */ 174 struct list_head dev_list; /* List of devices */ 175 struct dev_power_governor *gov; 176 struct genpd_governor_data *gd; /* Data used by a genpd governor. */ 177 struct work_struct power_off_work; 178 struct fwnode_handle *provider; /* Identity of the domain provider */ 179 bool has_provider; 180 const char *name; 181 atomic_t sd_count; /* Number of subdomains with power "on" */ 182 enum gpd_status status; /* Current state of the domain */ 183 unsigned int device_count; /* Number of devices */ 184 unsigned int device_id; /* unique device id */ 185 unsigned int suspended_count; /* System suspend device counter */ 186 unsigned int prepared_count; /* Suspend counter of prepared devices */ 187 unsigned int performance_state; /* Aggregated max performance state */ 188 cpumask_var_t cpus; /* A cpumask of the attached CPUs */ 189 bool synced_poweroff; /* A consumer needs a synced poweroff */ 190 int (*power_off)(struct generic_pm_domain *domain); 191 int (*power_on)(struct generic_pm_domain *domain); 192 struct raw_notifier_head power_notifiers; /* Power on/off notifiers */ 193 struct opp_table *opp_table; /* OPP table of the genpd */ 194 int (*set_performance_state)(struct generic_pm_domain *genpd, 195 unsigned int state); 196 struct gpd_dev_ops dev_ops; 197 int (*set_hwmode_dev)(struct generic_pm_domain *domain, 198 struct device *dev, bool enable); 199 bool (*get_hwmode_dev)(struct generic_pm_domain *domain, 200 struct device *dev); 201 int (*attach_dev)(struct generic_pm_domain *domain, 202 struct device *dev); 203 void (*detach_dev)(struct generic_pm_domain *domain, 204 struct device *dev); 205 unsigned int flags; /* Bit field of configs for genpd */ 206 struct genpd_power_state *states; 207 void (*free_states)(struct genpd_power_state *states, 208 unsigned int state_count); 209 unsigned int state_count; /* number of states */ 210 unsigned int state_idx; /* state that genpd will go to when off */ 211 u64 on_time; 212 u64 accounting_time; 213 const struct genpd_lock_ops *lock_ops; 214 union { 215 struct mutex mlock; 216 struct { 217 spinlock_t slock; 218 unsigned long lock_flags; 219 }; 220 struct { 221 raw_spinlock_t raw_slock; 222 unsigned long raw_lock_flags; 223 }; 224 }; 225}; 226 227static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) 228{ 229 return container_of(pd, struct generic_pm_domain, domain); 230} 231 232struct gpd_link { 233 struct generic_pm_domain *parent; 234 struct list_head parent_node; 235 struct generic_pm_domain *child; 236 struct list_head child_node; 237 238 /* Sub-domain's per-master domain performance state */ 239 unsigned int performance_state; 240 unsigned int prev_performance_state; 241}; 242 243struct gpd_timing_data { 244 s64 suspend_latency_ns; 245 s64 resume_latency_ns; 246 s64 effective_constraint_ns; 247 ktime_t next_wakeup; 248 bool constraint_changed; 249 bool cached_suspend_ok; 250}; 251 252struct pm_domain_data { 253 struct list_head list_node; 254 struct device *dev; 255}; 256 257struct generic_pm_domain_data { 258 struct pm_domain_data base; 259 struct gpd_timing_data *td; 260 struct notifier_block nb; 261 struct notifier_block *power_nb; 262 int cpu; 263 unsigned int performance_state; 264 unsigned int default_pstate; 265 unsigned int rpm_pstate; 266 unsigned int opp_token; 267 bool hw_mode; 268 bool rpm_always_on; 269 void *data; 270}; 271 272#ifdef CONFIG_PM_GENERIC_DOMAINS 273static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd) 274{ 275 return container_of(pdd, struct generic_pm_domain_data, base); 276} 277 278static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev) 279{ 280 return to_gpd_data(dev->power.subsys_data->domain_data); 281} 282 283int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev); 284int pm_genpd_remove_device(struct device *dev); 285int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 286 struct generic_pm_domain *subdomain); 287int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, 288 struct generic_pm_domain *subdomain); 289int pm_genpd_init(struct generic_pm_domain *genpd, 290 struct dev_power_governor *gov, bool is_off); 291int pm_genpd_remove(struct generic_pm_domain *genpd); 292void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, 293 unsigned int state_idx); 294struct device *dev_to_genpd_dev(struct device *dev); 295int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state); 296int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb); 297int dev_pm_genpd_remove_notifier(struct device *dev); 298void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next); 299ktime_t dev_pm_genpd_get_next_hrtimer(struct device *dev); 300void dev_pm_genpd_synced_poweroff(struct device *dev); 301int dev_pm_genpd_set_hwmode(struct device *dev, bool enable); 302bool dev_pm_genpd_get_hwmode(struct device *dev); 303int dev_pm_genpd_rpm_always_on(struct device *dev, bool on); 304 305extern struct dev_power_governor simple_qos_governor; 306extern struct dev_power_governor pm_domain_always_on_gov; 307#ifdef CONFIG_CPU_IDLE 308extern struct dev_power_governor pm_domain_cpu_gov; 309#endif 310#else 311 312static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev) 313{ 314 return ERR_PTR(-ENOSYS); 315} 316static inline int pm_genpd_add_device(struct generic_pm_domain *genpd, 317 struct device *dev) 318{ 319 return -ENOSYS; 320} 321static inline int pm_genpd_remove_device(struct device *dev) 322{ 323 return -ENOSYS; 324} 325static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 326 struct generic_pm_domain *subdomain) 327{ 328 return -ENOSYS; 329} 330static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, 331 struct generic_pm_domain *subdomain) 332{ 333 return -ENOSYS; 334} 335static inline int pm_genpd_init(struct generic_pm_domain *genpd, 336 struct dev_power_governor *gov, bool is_off) 337{ 338 return -ENOSYS; 339} 340static inline int pm_genpd_remove(struct generic_pm_domain *genpd) 341{ 342 return -EOPNOTSUPP; 343} 344 345static inline void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, 346 unsigned int state_idx) 347{ } 348 349static inline struct device *dev_to_genpd_dev(struct device *dev) 350{ 351 return ERR_PTR(-EOPNOTSUPP); 352} 353 354static inline int dev_pm_genpd_set_performance_state(struct device *dev, 355 unsigned int state) 356{ 357 return -EOPNOTSUPP; 358} 359 360static inline int dev_pm_genpd_add_notifier(struct device *dev, 361 struct notifier_block *nb) 362{ 363 return -EOPNOTSUPP; 364} 365 366static inline int dev_pm_genpd_remove_notifier(struct device *dev) 367{ 368 return -EOPNOTSUPP; 369} 370 371static inline void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next) 372{ } 373 374static inline ktime_t dev_pm_genpd_get_next_hrtimer(struct device *dev) 375{ 376 return KTIME_MAX; 377} 378static inline void dev_pm_genpd_synced_poweroff(struct device *dev) 379{ } 380 381static inline int dev_pm_genpd_set_hwmode(struct device *dev, bool enable) 382{ 383 return -EOPNOTSUPP; 384} 385 386static inline bool dev_pm_genpd_get_hwmode(struct device *dev) 387{ 388 return false; 389} 390 391static inline int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) 392{ 393 return -EOPNOTSUPP; 394} 395 396#define simple_qos_governor (*(struct dev_power_governor *)(NULL)) 397#define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL)) 398#endif 399 400#ifdef CONFIG_PM_GENERIC_DOMAINS_SLEEP 401void dev_pm_genpd_suspend(struct device *dev); 402void dev_pm_genpd_resume(struct device *dev); 403#else 404static inline void dev_pm_genpd_suspend(struct device *dev) {} 405static inline void dev_pm_genpd_resume(struct device *dev) {} 406#endif 407 408/* OF PM domain providers */ 409struct of_device_id; 410 411typedef struct generic_pm_domain *(*genpd_xlate_t)(const struct of_phandle_args *args, 412 void *data); 413 414struct genpd_onecell_data { 415 struct generic_pm_domain **domains; 416 unsigned int num_domains; 417 genpd_xlate_t xlate; 418}; 419 420#ifdef CONFIG_PM_GENERIC_DOMAINS_OF 421int of_genpd_add_provider_simple(struct device_node *np, 422 struct generic_pm_domain *genpd); 423int of_genpd_add_provider_onecell(struct device_node *np, 424 struct genpd_onecell_data *data); 425void of_genpd_del_provider(struct device_node *np); 426int of_genpd_add_device(const struct of_phandle_args *args, struct device *dev); 427int of_genpd_add_subdomain(const struct of_phandle_args *parent_spec, 428 const struct of_phandle_args *subdomain_spec); 429int of_genpd_remove_subdomain(const struct of_phandle_args *parent_spec, 430 const struct of_phandle_args *subdomain_spec); 431struct generic_pm_domain *of_genpd_remove_last(struct device_node *np); 432int of_genpd_parse_idle_states(struct device_node *dn, 433 struct genpd_power_state **states, int *n); 434 435int genpd_dev_pm_attach(struct device *dev); 436struct device *genpd_dev_pm_attach_by_id(struct device *dev, 437 unsigned int index); 438struct device *genpd_dev_pm_attach_by_name(struct device *dev, 439 const char *name); 440#else /* !CONFIG_PM_GENERIC_DOMAINS_OF */ 441static inline int of_genpd_add_provider_simple(struct device_node *np, 442 struct generic_pm_domain *genpd) 443{ 444 return -EOPNOTSUPP; 445} 446 447static inline int of_genpd_add_provider_onecell(struct device_node *np, 448 struct genpd_onecell_data *data) 449{ 450 return -EOPNOTSUPP; 451} 452 453static inline void of_genpd_del_provider(struct device_node *np) {} 454 455static inline int of_genpd_add_device(const struct of_phandle_args *args, 456 struct device *dev) 457{ 458 return -ENODEV; 459} 460 461static inline int of_genpd_add_subdomain(const struct of_phandle_args *parent_spec, 462 const struct of_phandle_args *subdomain_spec) 463{ 464 return -ENODEV; 465} 466 467static inline int of_genpd_remove_subdomain(const struct of_phandle_args *parent_spec, 468 const struct of_phandle_args *subdomain_spec) 469{ 470 return -ENODEV; 471} 472 473static inline int of_genpd_parse_idle_states(struct device_node *dn, 474 struct genpd_power_state **states, int *n) 475{ 476 return -ENODEV; 477} 478 479static inline int genpd_dev_pm_attach(struct device *dev) 480{ 481 return 0; 482} 483 484static inline struct device *genpd_dev_pm_attach_by_id(struct device *dev, 485 unsigned int index) 486{ 487 return NULL; 488} 489 490static inline struct device *genpd_dev_pm_attach_by_name(struct device *dev, 491 const char *name) 492{ 493 return NULL; 494} 495 496static inline 497struct generic_pm_domain *of_genpd_remove_last(struct device_node *np) 498{ 499 return ERR_PTR(-EOPNOTSUPP); 500} 501#endif /* CONFIG_PM_GENERIC_DOMAINS_OF */ 502 503#ifdef CONFIG_PM 504int dev_pm_domain_attach(struct device *dev, bool power_on); 505struct device *dev_pm_domain_attach_by_id(struct device *dev, 506 unsigned int index); 507struct device *dev_pm_domain_attach_by_name(struct device *dev, 508 const char *name); 509int dev_pm_domain_attach_list(struct device *dev, 510 const struct dev_pm_domain_attach_data *data, 511 struct dev_pm_domain_list **list); 512int devm_pm_domain_attach_list(struct device *dev, 513 const struct dev_pm_domain_attach_data *data, 514 struct dev_pm_domain_list **list); 515void dev_pm_domain_detach(struct device *dev, bool power_off); 516void dev_pm_domain_detach_list(struct dev_pm_domain_list *list); 517int dev_pm_domain_start(struct device *dev); 518void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd); 519int dev_pm_domain_set_performance_state(struct device *dev, unsigned int state); 520#else 521static inline int dev_pm_domain_attach(struct device *dev, bool power_on) 522{ 523 return 0; 524} 525static inline struct device *dev_pm_domain_attach_by_id(struct device *dev, 526 unsigned int index) 527{ 528 return NULL; 529} 530static inline struct device *dev_pm_domain_attach_by_name(struct device *dev, 531 const char *name) 532{ 533 return NULL; 534} 535static inline int dev_pm_domain_attach_list(struct device *dev, 536 const struct dev_pm_domain_attach_data *data, 537 struct dev_pm_domain_list **list) 538{ 539 return 0; 540} 541 542static inline int devm_pm_domain_attach_list(struct device *dev, 543 const struct dev_pm_domain_attach_data *data, 544 struct dev_pm_domain_list **list) 545{ 546 return 0; 547} 548 549static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {} 550static inline void dev_pm_domain_detach_list(struct dev_pm_domain_list *list) {} 551static inline int dev_pm_domain_start(struct device *dev) 552{ 553 return 0; 554} 555static inline void dev_pm_domain_set(struct device *dev, 556 struct dev_pm_domain *pd) {} 557static inline int dev_pm_domain_set_performance_state(struct device *dev, 558 unsigned int state) 559{ 560 return 0; 561} 562#endif 563 564#endif /* _LINUX_PM_DOMAIN_H */