diff options
| author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-10-07 23:17:07 +0200 | 
|---|---|---|
| committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-10-07 23:17:07 +0200 | 
| commit | 9696cc90071e3660ec02a3728acdedb68afdce4c (patch) | |
| tree | 99783d31dd42262c29346c92760f7896c3d81cb6 /include/linux | |
| parent | c28b56b1d46b1bbb1be33c8f2632a88b0de1ef68 (diff) | |
| parent | e3cba3243eb853a052613c804dea033bc4c9cf2d (diff) | |
| download | olio-linux-3.10-9696cc90071e3660ec02a3728acdedb68afdce4c.tar.xz olio-linux-3.10-9696cc90071e3660ec02a3728acdedb68afdce4c.zip  | |
Merge branch 'pm-qos' into pm-for-linus
* pm-qos:
  PM / QoS: Update Documentation for the pm_qos and dev_pm_qos frameworks
  PM / QoS: Add function dev_pm_qos_read_value() (v3)
  PM QoS: Add global notification mechanism for device constraints
  PM QoS: Implement per-device PM QoS constraints
  PM QoS: Generalize and export constraints management code
  PM QoS: Reorganize data structs
  PM QoS: Code reorganization
  PM QoS: Minor clean-ups
  PM QoS: Move and rename the implementation files
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/netdevice.h | 4 | ||||
| -rw-r--r-- | include/linux/pm.h | 3 | ||||
| -rw-r--r-- | include/linux/pm_qos.h | 155 | ||||
| -rw-r--r-- | include/linux/pm_qos_params.h | 38 | 
4 files changed, 160 insertions, 40 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ddee79bb8f1..f38ab5b7e76 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -31,7 +31,7 @@  #include <linux/if_link.h>  #ifdef __KERNEL__ -#include <linux/pm_qos_params.h> +#include <linux/pm_qos.h>  #include <linux/timer.h>  #include <linux/delay.h>  #include <linux/atomic.h> @@ -964,7 +964,7 @@ struct net_device {  	 */  	char			name[IFNAMSIZ]; -	struct pm_qos_request_list pm_qos_req; +	struct pm_qos_request	pm_qos_req;  	/* device name hash chain */  	struct hlist_node	name_hlist; diff --git a/include/linux/pm.h b/include/linux/pm.h index f497ed06ee1..91f248bbe4f 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -326,6 +326,7 @@ extern struct dev_pm_ops generic_subsys_pm_ops;   *			requested by a driver.   */ +#define PM_EVENT_INVALID	(-1)  #define PM_EVENT_ON		0x0000  #define PM_EVENT_FREEZE 	0x0001  #define PM_EVENT_SUSPEND	0x0002 @@ -346,6 +347,7 @@ extern struct dev_pm_ops generic_subsys_pm_ops;  #define PM_EVENT_AUTO_SUSPEND	(PM_EVENT_AUTO | PM_EVENT_SUSPEND)  #define PM_EVENT_AUTO_RESUME	(PM_EVENT_AUTO | PM_EVENT_RESUME) +#define PMSG_INVALID	((struct pm_message){ .event = PM_EVENT_INVALID, })  #define PMSG_ON		((struct pm_message){ .event = PM_EVENT_ON, })  #define PMSG_FREEZE	((struct pm_message){ .event = PM_EVENT_FREEZE, })  #define PMSG_QUIESCE	((struct pm_message){ .event = PM_EVENT_QUIESCE, }) @@ -481,6 +483,7 @@ struct dev_pm_info {  	unsigned long		accounting_timestamp;  #endif  	struct pm_subsys_data	*subsys_data;  /* Owned by the subsystem. */ +	struct pm_qos_constraints *constraints;  };  extern void update_pm_runtime_accounting(struct device *dev); diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h new file mode 100644 index 00000000000..83b0ea302a8 --- /dev/null +++ b/include/linux/pm_qos.h @@ -0,0 +1,155 @@ +#ifndef _LINUX_PM_QOS_H +#define _LINUX_PM_QOS_H +/* interface for the pm_qos_power infrastructure of the linux kernel. + * + * Mark Gross <mgross@linux.intel.com> + */ +#include <linux/plist.h> +#include <linux/notifier.h> +#include <linux/miscdevice.h> +#include <linux/device.h> + +#define PM_QOS_RESERVED 0 +#define PM_QOS_CPU_DMA_LATENCY 1 +#define PM_QOS_NETWORK_LATENCY 2 +#define PM_QOS_NETWORK_THROUGHPUT 3 + +#define PM_QOS_NUM_CLASSES 4 +#define PM_QOS_DEFAULT_VALUE -1 + +#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE	0 +#define PM_QOS_DEV_LAT_DEFAULT_VALUE		0 + +struct pm_qos_request { +	struct plist_node node; +	int pm_qos_class; +}; + +struct dev_pm_qos_request { +	struct plist_node node; +	struct device *dev; +}; + +enum pm_qos_type { +	PM_QOS_UNITIALIZED, +	PM_QOS_MAX,		/* return the largest value */ +	PM_QOS_MIN		/* return the smallest value */ +}; + +/* + * Note: The lockless read path depends on the CPU accessing + * target_value atomically.  Atomic access is only guaranteed on all CPU + * types linux supports for 32 bit quantites + */ +struct pm_qos_constraints { +	struct plist_head list; +	s32 target_value;	/* Do not change to 64 bit */ +	s32 default_value; +	enum pm_qos_type type; +	struct blocking_notifier_head *notifiers; +}; + +/* Action requested to pm_qos_update_target */ +enum pm_qos_req_action { +	PM_QOS_ADD_REQ,		/* Add a new request */ +	PM_QOS_UPDATE_REQ,	/* Update an existing request */ +	PM_QOS_REMOVE_REQ	/* Remove an existing request */ +}; + +static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) +{ +	return req->dev != 0; +} + +#ifdef CONFIG_PM +int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, +			 enum pm_qos_req_action action, int value); +void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, +			s32 value); +void pm_qos_update_request(struct pm_qos_request *req, +			   s32 new_value); +void pm_qos_remove_request(struct pm_qos_request *req); + +int pm_qos_request(int pm_qos_class); +int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); +int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); +int pm_qos_request_active(struct pm_qos_request *req); +s32 pm_qos_read_value(struct pm_qos_constraints *c); + +s32 dev_pm_qos_read_value(struct device *dev); +int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, +			   s32 value); +int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); +int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); +int dev_pm_qos_add_notifier(struct device *dev, +			    struct notifier_block *notifier); +int dev_pm_qos_remove_notifier(struct device *dev, +			       struct notifier_block *notifier); +int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); +int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); +void dev_pm_qos_constraints_init(struct device *dev); +void dev_pm_qos_constraints_destroy(struct device *dev); +#else +static inline int pm_qos_update_target(struct pm_qos_constraints *c, +				       struct plist_node *node, +				       enum pm_qos_req_action action, +				       int value) +			{ return 0; } +static inline void pm_qos_add_request(struct pm_qos_request *req, +				      int pm_qos_class, s32 value) +			{ return; } +static inline void pm_qos_update_request(struct pm_qos_request *req, +					 s32 new_value) +			{ return; } +static inline void pm_qos_remove_request(struct pm_qos_request *req) +			{ return; } + +static inline int pm_qos_request(int pm_qos_class) +			{ return 0; } +static inline int pm_qos_add_notifier(int pm_qos_class, +				      struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_remove_notifier(int pm_qos_class, +					 struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_request_active(struct pm_qos_request *req) +			{ return 0; } +static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) +			{ return 0; } + +static inline s32 dev_pm_qos_read_value(struct device *dev) +			{ return 0; } +static inline int dev_pm_qos_add_request(struct device *dev, +					 struct dev_pm_qos_request *req, +					 s32 value) +			{ return 0; } +static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, +					    s32 new_value) +			{ return 0; } +static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) +			{ return 0; } +static inline int dev_pm_qos_add_notifier(struct device *dev, +					  struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_notifier(struct device *dev, +					     struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_add_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline void dev_pm_qos_constraints_init(struct device *dev) +{ +	dev->power.power_state = PMSG_ON; +} +static inline void dev_pm_qos_constraints_destroy(struct device *dev) +{ +	dev->power.power_state = PMSG_INVALID; +} +#endif + +#endif diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h deleted file mode 100644 index a7d87f911ca..00000000000 --- a/include/linux/pm_qos_params.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _LINUX_PM_QOS_PARAMS_H -#define _LINUX_PM_QOS_PARAMS_H -/* interface for the pm_qos_power infrastructure of the linux kernel. - * - * Mark Gross <mgross@linux.intel.com> - */ -#include <linux/plist.h> -#include <linux/notifier.h> -#include <linux/miscdevice.h> - -#define PM_QOS_RESERVED 0 -#define PM_QOS_CPU_DMA_LATENCY 1 -#define PM_QOS_NETWORK_LATENCY 2 -#define PM_QOS_NETWORK_THROUGHPUT 3 - -#define PM_QOS_NUM_CLASSES 4 -#define PM_QOS_DEFAULT_VALUE -1 - -#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) -#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) -#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE	0 - -struct pm_qos_request_list { -	struct plist_node list; -	int pm_qos_class; -}; - -void pm_qos_add_request(struct pm_qos_request_list *l, int pm_qos_class, s32 value); -void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, -		s32 new_value); -void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); - -int pm_qos_request(int pm_qos_class); -int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); -int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); -int pm_qos_request_active(struct pm_qos_request_list *req); - -#endif  |