Blame view

include/linux/pm_qos.h 5.38 KB
e8db0be12   Jean Pihet   PM QoS: Move and ...
1
2
  #ifndef _LINUX_PM_QOS_H
  #define _LINUX_PM_QOS_H
d82b35186   Mark Gross   pm qos infrastruc...
3
4
  /* interface for the pm_qos_power infrastructure of the linux kernel.
   *
bf1db69fb   Richard Hughes   pm_qos: spelling ...
5
   * Mark Gross <mgross@linux.intel.com>
d82b35186   Mark Gross   pm qos infrastruc...
6
   */
82f682514   James Bottomley   pm_qos: Get rid o...
7
  #include <linux/plist.h>
d82b35186   Mark Gross   pm qos infrastruc...
8
9
  #include <linux/notifier.h>
  #include <linux/miscdevice.h>
1a9a91525   Rafael J. Wysocki   PM / QoS: Add fun...
10
  #include <linux/device.h>
d82b35186   Mark Gross   pm qos infrastruc...
11
12
13
14
15
16
17
18
  
  #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
333c5ae99   Tim Chen   idle governor: Av...
19
20
21
  #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
91ff4cb80   Jean Pihet   PM QoS: Implement...
22
  #define PM_QOS_DEV_LAT_DEFAULT_VALUE		0
333c5ae99   Tim Chen   idle governor: Av...
23

cc7499861   Jean Pihet   PM QoS: Minor cle...
24
25
  struct pm_qos_request {
  	struct plist_node node;
82f682514   James Bottomley   pm_qos: Get rid o...
26
27
  	int pm_qos_class;
  };
d82b35186   Mark Gross   pm qos infrastruc...
28

91ff4cb80   Jean Pihet   PM QoS: Implement...
29
30
31
32
  struct dev_pm_qos_request {
  	struct plist_node node;
  	struct device *dev;
  };
4e1779baa   Jean Pihet   PM QoS: Reorganiz...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  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;
  };
abe98ec2d   Jean Pihet   PM QoS: Generaliz...
51
52
53
54
55
56
  /* 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 */
  };
91ff4cb80   Jean Pihet   PM QoS: Implement...
57
58
59
60
  static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req)
  {
  	return req->dev != 0;
  }
e8db0be12   Jean Pihet   PM QoS: Move and ...
61
  #ifdef CONFIG_PM
abe98ec2d   Jean Pihet   PM QoS: Generaliz...
62
63
  int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
  			 enum pm_qos_req_action action, int value);
cc7499861   Jean Pihet   PM QoS: Minor cle...
64
65
66
  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,
e8db0be12   Jean Pihet   PM QoS: Move and ...
67
  			   s32 new_value);
cc7499861   Jean Pihet   PM QoS: Minor cle...
68
  void pm_qos_remove_request(struct pm_qos_request *req);
d82b35186   Mark Gross   pm qos infrastruc...
69

ed77134bf   Mark Gross   PM QOS update
70
71
72
  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);
cc7499861   Jean Pihet   PM QoS: Minor cle...
73
  int pm_qos_request_active(struct pm_qos_request *req);
b66213cdb   Jean Pihet   PM QoS: Add globa...
74
  s32 pm_qos_read_value(struct pm_qos_constraints *c);
91ff4cb80   Jean Pihet   PM QoS: Implement...
75

00dc9ad18   Rafael J. Wysocki   PM / Runtime: Use...
76
  s32 __dev_pm_qos_read_value(struct device *dev);
1a9a91525   Rafael J. Wysocki   PM / QoS: Add fun...
77
  s32 dev_pm_qos_read_value(struct device *dev);
91ff4cb80   Jean Pihet   PM QoS: Implement...
78
79
80
81
82
83
84
85
  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);
b66213cdb   Jean Pihet   PM QoS: Add globa...
86
87
  int dev_pm_qos_add_global_notifier(struct notifier_block *notifier);
  int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier);
91ff4cb80   Jean Pihet   PM QoS: Implement...
88
89
  void dev_pm_qos_constraints_init(struct device *dev);
  void dev_pm_qos_constraints_destroy(struct device *dev);
40a5f8be2   Rafael J. Wysocki   PM / QoS: Introdu...
90
91
  int dev_pm_qos_add_ancestor_request(struct device *dev,
  				    struct dev_pm_qos_request *req, s32 value);
e8db0be12   Jean Pihet   PM QoS: Move and ...
92
  #else
abe98ec2d   Jean Pihet   PM QoS: Generaliz...
93
94
95
96
97
  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; }
cc7499861   Jean Pihet   PM QoS: Minor cle...
98
  static inline void pm_qos_add_request(struct pm_qos_request *req,
e8db0be12   Jean Pihet   PM QoS: Move and ...
99
100
  				      int pm_qos_class, s32 value)
  			{ return; }
cc7499861   Jean Pihet   PM QoS: Minor cle...
101
  static inline void pm_qos_update_request(struct pm_qos_request *req,
e8db0be12   Jean Pihet   PM QoS: Move and ...
102
103
  					 s32 new_value)
  			{ return; }
cc7499861   Jean Pihet   PM QoS: Minor cle...
104
  static inline void pm_qos_remove_request(struct pm_qos_request *req)
e8db0be12   Jean Pihet   PM QoS: Move and ...
105
106
107
108
109
110
111
112
113
114
  			{ 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; }
cc7499861   Jean Pihet   PM QoS: Minor cle...
115
  static inline int pm_qos_request_active(struct pm_qos_request *req)
e8db0be12   Jean Pihet   PM QoS: Move and ...
116
  			{ return 0; }
b66213cdb   Jean Pihet   PM QoS: Add globa...
117
118
  static inline s32 pm_qos_read_value(struct pm_qos_constraints *c)
  			{ return 0; }
91ff4cb80   Jean Pihet   PM QoS: Implement...
119

00dc9ad18   Rafael J. Wysocki   PM / Runtime: Use...
120
121
  static inline s32 __dev_pm_qos_read_value(struct device *dev)
  			{ return 0; }
1a9a91525   Rafael J. Wysocki   PM / QoS: Add fun...
122
123
  static inline s32 dev_pm_qos_read_value(struct device *dev)
  			{ return 0; }
91ff4cb80   Jean Pihet   PM QoS: Implement...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  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; }
b66213cdb   Jean Pihet   PM QoS: Add globa...
139
140
141
142
143
144
  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; }
91ff4cb80   Jean Pihet   PM QoS: Implement...
145
  static inline void dev_pm_qos_constraints_init(struct device *dev)
1a9a91525   Rafael J. Wysocki   PM / QoS: Add fun...
146
147
148
  {
  	dev->power.power_state = PMSG_ON;
  }
91ff4cb80   Jean Pihet   PM QoS: Implement...
149
  static inline void dev_pm_qos_constraints_destroy(struct device *dev)
1a9a91525   Rafael J. Wysocki   PM / QoS: Add fun...
150
151
152
  {
  	dev->power.power_state = PMSG_INVALID;
  }
40a5f8be2   Rafael J. Wysocki   PM / QoS: Introdu...
153
154
155
  static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
  				    struct dev_pm_qos_request *req, s32 value)
  			{ return 0; }
e8db0be12   Jean Pihet   PM QoS: Move and ...
156
  #endif
d82b35186   Mark Gross   pm qos infrastruc...
157

82f682514   James Bottomley   pm_qos: Get rid o...
158
  #endif