]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/pm_domain.h
Revert "drm/amdkfd: New IOCTL to allocate queue GWS"
[linux.git] / include / linux / pm_domain.h
index 1ed5874bcee09afef28c505574bbd2d213abd785..91d9bf4970710bb012090f0104b61d6e8ed0ddfe 100644 (file)
@@ -1,9 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
 /*
  * pm_domain.h - Definitions and headers related to device power domains.
  *
  * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp.
- *
- * This file is released under the GPLv2.
  */
 
 #ifndef _LINUX_PM_DOMAIN_H
@@ -16,6 +15,7 @@
 #include <linux/of.h>
 #include <linux/notifier.h>
 #include <linux/spinlock.h>
+#include <linux/cpumask.h>
 
 /*
  * Flags to control the behaviour of a genpd.
  * GENPD_FLAG_ACTIVE_WAKEUP:   Instructs genpd to keep the PM domain powered
  *                             on, in case any of its attached devices is used
  *                             in the wakeup path to serve system wakeups.
+ *
+ * GENPD_FLAG_CPU_DOMAIN:      Instructs genpd that it should expect to get
+ *                             devices attached, which may belong to CPUs or
+ *                             possibly have subdomains with CPUs attached.
+ *                             This flag enables the genpd backend driver to
+ *                             deploy idle power management support for CPUs
+ *                             and groups of CPUs. Note that, the backend
+ *                             driver must then comply with the so called,
+ *                             last-man-standing algorithm, for the CPUs in the
+ *                             PM domain.
+ *
+ * GENPD_FLAG_RPM_ALWAYS_ON:   Instructs genpd to always keep the PM domain
+ *                             powered on except for system suspend.
  */
 #define GENPD_FLAG_PM_CLK       (1U << 0)
 #define GENPD_FLAG_IRQ_SAFE     (1U << 1)
 #define GENPD_FLAG_ALWAYS_ON    (1U << 2)
 #define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
+#define GENPD_FLAG_CPU_DOMAIN   (1U << 4)
+#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
 
 enum gpd_status {
        GPD_STATE_ACTIVE = 0,   /* PM domain is active */
@@ -69,6 +84,7 @@ struct genpd_power_state {
        s64 residency_ns;
        struct fwnode_handle *fwnode;
        ktime_t idle_time;
+       void *data;
 };
 
 struct genpd_lock_ops;
@@ -93,6 +109,7 @@ struct generic_pm_domain {
        unsigned int suspended_count;   /* System suspend device counter */
        unsigned int prepared_count;    /* Suspend counter of prepared devices */
        unsigned int performance_state; /* Aggregated max performance state */
+       cpumask_var_t cpus;             /* A cpumask of the attached CPUs */
        int (*power_off)(struct generic_pm_domain *domain);
        int (*power_on)(struct generic_pm_domain *domain);
        struct opp_table *opp_table;    /* OPP table of the genpd */
@@ -104,15 +121,17 @@ struct generic_pm_domain {
        s64 max_off_time_ns;    /* Maximum allowed "suspended" time. */
        bool max_off_time_changed;
        bool cached_power_down_ok;
+       bool cached_power_down_state_idx;
        int (*attach_dev)(struct generic_pm_domain *domain,
                          struct device *dev);
        void (*detach_dev)(struct generic_pm_domain *domain,
                           struct device *dev);
        unsigned int flags;             /* Bit field of configs for genpd */
        struct genpd_power_state *states;
+       void (*free_states)(struct genpd_power_state *states,
+                           unsigned int state_count);
        unsigned int state_count; /* number of states */
        unsigned int state_idx; /* state that genpd will go to when off */
-       void *free; /* Free the state that was allocated for default */
        ktime_t on_time;
        ktime_t accounting_time;
        const struct genpd_lock_ops *lock_ops;
@@ -159,6 +178,7 @@ struct generic_pm_domain_data {
        struct pm_domain_data base;
        struct gpd_timing_data td;
        struct notifier_block nb;
+       int cpu;
        unsigned int performance_state;
        void *data;
 };
@@ -187,6 +207,9 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state);
 
 extern struct dev_power_governor simple_qos_governor;
 extern struct dev_power_governor pm_domain_always_on_gov;
+#ifdef CONFIG_CPU_IDLE
+extern struct dev_power_governor pm_domain_cpu_gov;
+#endif
 #else
 
 static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev)