/* 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.
*/
/* * Flags to control the behaviour when attaching a device to its PM domains. * * PD_FLAG_NO_DEV_LINK: As the default behaviour creates a device-link * for every PM domain that gets attached, this * flag can be used to skip that. * * PD_FLAG_DEV_LINK_ON: Add the DL_FLAG_RPM_ACTIVE to power-on the * supplier and its PM domain when creating the * device-links. * * PD_FLAG_REQUIRED_OPP: Assign required_devs for the required OPPs. The * index of the required OPP must correspond to the * index in the array of the pd_names. If pd_names * isn't specified, the index just follows the * index for the attached PM domain. * * PD_FLAG_ATTACH_POWER_ON: Power on the domain during attach. * * PD_FLAG_DETACH_POWER_OFF: Power off the domain during detach. *
*/ #define PD_FLAG_NO_DEV_LINK BIT(0) #define PD_FLAG_DEV_LINK_ON BIT(1) #define PD_FLAG_REQUIRED_OPP BIT(2) #define PD_FLAG_ATTACH_POWER_ON BIT(3) #define PD_FLAG_DETACH_POWER_OFF BIT(4)
/* * Flags to control the behaviour of a genpd. * * These flags may be set in the struct generic_pm_domain's flags field by a * genpd backend driver. The flags must be set before it calls pm_genpd_init(), * which initializes a genpd. * * GENPD_FLAG_PM_CLK: Instructs genpd to use the PM clk framework, * while powering on/off attached devices. * * GENPD_FLAG_IRQ_SAFE: This informs genpd that its backend callbacks, * ->power_on|off(), doesn't sleep. Hence, these * can be invoked from within atomic context, which * enables genpd to power on/off the PM domain, * even when pm_runtime_is_irq_safe() returns true, * for any of its attached devices. Note that, a * genpd having this flag set, requires its * masterdomains to also have it set. * * GENPD_FLAG_ALWAYS_ON: Instructs genpd to always keep the PM domain * powered on. * * 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. * * GENPD_FLAG_MIN_RESIDENCY: Enable the genpd governor to consider its * components' next wakeup when determining the * optimal idle state. * * GENPD_FLAG_OPP_TABLE_FW: The genpd provider supports performance states, * but its corresponding OPP tables are not * described in DT, but are given directly by FW. * * GENPD_FLAG_DEV_NAME_FW: Instructs genpd to generate an unique device name * using ida. It is used by genpd providers which * get their genpd-names directly from FW. * * GENPD_FLAG_NO_SYNC_STATE: The ->sync_state() support is implemented in a * genpd provider specific way, likely through a * parent device node. This flag makes genpd to * skip its internal support for this. * * GENPD_FLAG_NO_STAY_ON: For genpd OF providers a powered-on PM domain at * initialization is prevented from being * powered-off until the ->sync_state() callback is * invoked. This flag informs genpd to allow a * power-off without waiting for ->sync_state().
*/ #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) #define GENPD_FLAG_MIN_RESIDENCY (1U << 6) #define GENPD_FLAG_OPP_TABLE_FW (1U << 7) #define GENPD_FLAG_DEV_NAME_FW (1U << 8) #define GENPD_FLAG_NO_SYNC_STATE (1U << 9) #define GENPD_FLAG_NO_STAY_ON (1U << 10)
enum gpd_status {
GENPD_STATE_ON = 0, /* PM domain is on */
GENPD_STATE_OFF, /* PM domain is off */
};
struct generic_pm_domain { struct device dev; struct dev_pm_domain domain; /* PM domain operations */ struct list_head gpd_list_node; /* Node in the global PM domains list */ struct list_head parent_links; /* Links with PM domain as a parent */ struct list_head child_links; /* Links with PM domain as a child */ struct list_head dev_list; /* List of devices */ struct dev_power_governor *gov; struct genpd_governor_data *gd; /* Data used by a genpd governor. */ struct work_struct power_off_work; struct fwnode_handle *provider; /* Identity of the domain provider */ bool has_provider; constchar *name;
atomic_t sd_count; /* Number of subdomains with power "on" */ enum gpd_status status; /* Current state of the domain */ unsignedint device_count; /* Number of devices */ unsignedint device_id; /* unique device id */ unsignedint suspended_count; /* System suspend device counter */ unsignedint prepared_count; /* Suspend counter of prepared devices */ unsignedint performance_state; /* Aggregated max performance state */
cpumask_var_t cpus; /* A cpumask of the attached CPUs */ bool synced_poweroff; /* A consumer needs a synced poweroff */ bool stay_on; /* Stay powered-on during boot. */ enum genpd_sync_state sync_state; /* How sync_state is managed. */ int (*power_off)(struct generic_pm_domain *domain); int (*power_on)(struct generic_pm_domain *domain); struct raw_notifier_head power_notifiers; /* Power on/off notifiers */ struct opp_table *opp_table; /* OPP table of the genpd */ int (*set_performance_state)(struct generic_pm_domain *genpd, unsignedint state); struct gpd_dev_ops dev_ops; int (*set_hwmode_dev)(struct generic_pm_domain *domain, struct device *dev, bool enable); bool (*get_hwmode_dev)(struct generic_pm_domain *domain, struct device *dev); int (*attach_dev)(struct generic_pm_domain *domain, struct device *dev); void (*detach_dev)(struct generic_pm_domain *domain, struct device *dev); unsignedint flags; /* Bit field of configs for genpd */ struct genpd_power_state *states; void (*free_states)(struct genpd_power_state *states, unsignedint state_count); unsignedint state_count; /* number of states */ unsignedint state_idx; /* state that genpd will go to when off */
u64 on_time;
u64 accounting_time; conststruct genpd_lock_ops *lock_ops; union { struct mutex mlock; struct {
spinlock_t slock; unsignedlong lock_flags;
}; struct {
raw_spinlock_t raw_slock; unsignedlong raw_lock_flags;
};
};
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.