0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef _LINUX_PM_QOS_H
0013 #define _LINUX_PM_QOS_H
0014
0015 #include <linux/plist.h>
0016 #include <linux/notifier.h>
0017 #include <linux/device.h>
0018
0019 enum pm_qos_flags_status {
0020 PM_QOS_FLAGS_UNDEFINED = -1,
0021 PM_QOS_FLAGS_NONE,
0022 PM_QOS_FLAGS_SOME,
0023 PM_QOS_FLAGS_ALL,
0024 };
0025
0026 #define PM_QOS_DEFAULT_VALUE (-1)
0027 #define PM_QOS_LATENCY_ANY S32_MAX
0028 #define PM_QOS_LATENCY_ANY_NS ((s64)PM_QOS_LATENCY_ANY * NSEC_PER_USEC)
0029
0030 #define PM_QOS_CPU_LATENCY_DEFAULT_VALUE (2000 * USEC_PER_SEC)
0031 #define PM_QOS_RESUME_LATENCY_DEFAULT_VALUE PM_QOS_LATENCY_ANY
0032 #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT PM_QOS_LATENCY_ANY
0033 #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS PM_QOS_LATENCY_ANY_NS
0034 #define PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE 0
0035 #define PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE 0
0036 #define PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE FREQ_QOS_MAX_DEFAULT_VALUE
0037 #define PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT (-1)
0038
0039 #define PM_QOS_FLAG_NO_POWER_OFF (1 << 0)
0040
0041 enum pm_qos_type {
0042 PM_QOS_UNITIALIZED,
0043 PM_QOS_MAX,
0044 PM_QOS_MIN,
0045 };
0046
0047
0048
0049
0050
0051
0052 struct pm_qos_constraints {
0053 struct plist_head list;
0054 s32 target_value;
0055 s32 default_value;
0056 s32 no_constraint_value;
0057 enum pm_qos_type type;
0058 struct blocking_notifier_head *notifiers;
0059 };
0060
0061 struct pm_qos_request {
0062 struct plist_node node;
0063 struct pm_qos_constraints *qos;
0064 };
0065
0066 struct pm_qos_flags_request {
0067 struct list_head node;
0068 s32 flags;
0069 };
0070
0071 struct pm_qos_flags {
0072 struct list_head list;
0073 s32 effective_flags;
0074 };
0075
0076
0077 #define FREQ_QOS_MIN_DEFAULT_VALUE 0
0078 #define FREQ_QOS_MAX_DEFAULT_VALUE S32_MAX
0079
0080 enum freq_qos_req_type {
0081 FREQ_QOS_MIN = 1,
0082 FREQ_QOS_MAX,
0083 };
0084
0085 struct freq_constraints {
0086 struct pm_qos_constraints min_freq;
0087 struct blocking_notifier_head min_freq_notifiers;
0088 struct pm_qos_constraints max_freq;
0089 struct blocking_notifier_head max_freq_notifiers;
0090 };
0091
0092 struct freq_qos_request {
0093 enum freq_qos_req_type type;
0094 struct plist_node pnode;
0095 struct freq_constraints *qos;
0096 };
0097
0098
0099 enum dev_pm_qos_req_type {
0100 DEV_PM_QOS_RESUME_LATENCY = 1,
0101 DEV_PM_QOS_LATENCY_TOLERANCE,
0102 DEV_PM_QOS_MIN_FREQUENCY,
0103 DEV_PM_QOS_MAX_FREQUENCY,
0104 DEV_PM_QOS_FLAGS,
0105 };
0106
0107 struct dev_pm_qos_request {
0108 enum dev_pm_qos_req_type type;
0109 union {
0110 struct plist_node pnode;
0111 struct pm_qos_flags_request flr;
0112 struct freq_qos_request freq;
0113 } data;
0114 struct device *dev;
0115 };
0116
0117 struct dev_pm_qos {
0118 struct pm_qos_constraints resume_latency;
0119 struct pm_qos_constraints latency_tolerance;
0120 struct freq_constraints freq;
0121 struct pm_qos_flags flags;
0122 struct dev_pm_qos_request *resume_latency_req;
0123 struct dev_pm_qos_request *latency_tolerance_req;
0124 struct dev_pm_qos_request *flags_req;
0125 };
0126
0127
0128 enum pm_qos_req_action {
0129 PM_QOS_ADD_REQ,
0130 PM_QOS_UPDATE_REQ,
0131 PM_QOS_REMOVE_REQ
0132 };
0133
0134 static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req)
0135 {
0136 return req->dev != NULL;
0137 }
0138
0139 s32 pm_qos_read_value(struct pm_qos_constraints *c);
0140 int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
0141 enum pm_qos_req_action action, int value);
0142 bool pm_qos_update_flags(struct pm_qos_flags *pqf,
0143 struct pm_qos_flags_request *req,
0144 enum pm_qos_req_action action, s32 val);
0145
0146 #ifdef CONFIG_CPU_IDLE
0147 s32 cpu_latency_qos_limit(void);
0148 bool cpu_latency_qos_request_active(struct pm_qos_request *req);
0149 void cpu_latency_qos_add_request(struct pm_qos_request *req, s32 value);
0150 void cpu_latency_qos_update_request(struct pm_qos_request *req, s32 new_value);
0151 void cpu_latency_qos_remove_request(struct pm_qos_request *req);
0152 #else
0153 static inline s32 cpu_latency_qos_limit(void) { return INT_MAX; }
0154 static inline bool cpu_latency_qos_request_active(struct pm_qos_request *req)
0155 {
0156 return false;
0157 }
0158 static inline void cpu_latency_qos_add_request(struct pm_qos_request *req,
0159 s32 value) {}
0160 static inline void cpu_latency_qos_update_request(struct pm_qos_request *req,
0161 s32 new_value) {}
0162 static inline void cpu_latency_qos_remove_request(struct pm_qos_request *req) {}
0163 #endif
0164
0165 #ifdef CONFIG_PM
0166 enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask);
0167 enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask);
0168 s32 __dev_pm_qos_resume_latency(struct device *dev);
0169 s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type);
0170 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
0171 enum dev_pm_qos_req_type type, s32 value);
0172 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
0173 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
0174 int dev_pm_qos_add_notifier(struct device *dev,
0175 struct notifier_block *notifier,
0176 enum dev_pm_qos_req_type type);
0177 int dev_pm_qos_remove_notifier(struct device *dev,
0178 struct notifier_block *notifier,
0179 enum dev_pm_qos_req_type type);
0180 void dev_pm_qos_constraints_init(struct device *dev);
0181 void dev_pm_qos_constraints_destroy(struct device *dev);
0182 int dev_pm_qos_add_ancestor_request(struct device *dev,
0183 struct dev_pm_qos_request *req,
0184 enum dev_pm_qos_req_type type, s32 value);
0185 int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value);
0186 void dev_pm_qos_hide_latency_limit(struct device *dev);
0187 int dev_pm_qos_expose_flags(struct device *dev, s32 value);
0188 void dev_pm_qos_hide_flags(struct device *dev);
0189 int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set);
0190 s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev);
0191 int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val);
0192 int dev_pm_qos_expose_latency_tolerance(struct device *dev);
0193 void dev_pm_qos_hide_latency_tolerance(struct device *dev);
0194
0195 static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
0196 {
0197 return dev->power.qos->resume_latency_req->data.pnode.prio;
0198 }
0199
0200 static inline s32 dev_pm_qos_requested_flags(struct device *dev)
0201 {
0202 return dev->power.qos->flags_req->data.flr.flags;
0203 }
0204
0205 static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
0206 {
0207 return IS_ERR_OR_NULL(dev->power.qos) ?
0208 PM_QOS_RESUME_LATENCY_NO_CONSTRAINT :
0209 pm_qos_read_value(&dev->power.qos->resume_latency);
0210 }
0211 #else
0212 static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev,
0213 s32 mask)
0214 { return PM_QOS_FLAGS_UNDEFINED; }
0215 static inline enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev,
0216 s32 mask)
0217 { return PM_QOS_FLAGS_UNDEFINED; }
0218 static inline s32 __dev_pm_qos_resume_latency(struct device *dev)
0219 { return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT; }
0220 static inline s32 dev_pm_qos_read_value(struct device *dev,
0221 enum dev_pm_qos_req_type type)
0222 {
0223 switch (type) {
0224 case DEV_PM_QOS_RESUME_LATENCY:
0225 return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0226 case DEV_PM_QOS_MIN_FREQUENCY:
0227 return PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
0228 case DEV_PM_QOS_MAX_FREQUENCY:
0229 return PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
0230 default:
0231 WARN_ON(1);
0232 return 0;
0233 }
0234 }
0235
0236 static inline int dev_pm_qos_add_request(struct device *dev,
0237 struct dev_pm_qos_request *req,
0238 enum dev_pm_qos_req_type type,
0239 s32 value)
0240 { return 0; }
0241 static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
0242 s32 new_value)
0243 { return 0; }
0244 static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
0245 { return 0; }
0246 static inline int dev_pm_qos_add_notifier(struct device *dev,
0247 struct notifier_block *notifier,
0248 enum dev_pm_qos_req_type type)
0249 { return 0; }
0250 static inline int dev_pm_qos_remove_notifier(struct device *dev,
0251 struct notifier_block *notifier,
0252 enum dev_pm_qos_req_type type)
0253 { return 0; }
0254 static inline void dev_pm_qos_constraints_init(struct device *dev)
0255 {
0256 dev->power.power_state = PMSG_ON;
0257 }
0258 static inline void dev_pm_qos_constraints_destroy(struct device *dev)
0259 {
0260 dev->power.power_state = PMSG_INVALID;
0261 }
0262 static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
0263 struct dev_pm_qos_request *req,
0264 enum dev_pm_qos_req_type type,
0265 s32 value)
0266 { return 0; }
0267 static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
0268 { return 0; }
0269 static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {}
0270 static inline int dev_pm_qos_expose_flags(struct device *dev, s32 value)
0271 { return 0; }
0272 static inline void dev_pm_qos_hide_flags(struct device *dev) {}
0273 static inline int dev_pm_qos_update_flags(struct device *dev, s32 m, bool set)
0274 { return 0; }
0275 static inline s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev)
0276 { return PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; }
0277 static inline int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val)
0278 { return 0; }
0279 static inline int dev_pm_qos_expose_latency_tolerance(struct device *dev)
0280 { return 0; }
0281 static inline void dev_pm_qos_hide_latency_tolerance(struct device *dev) {}
0282
0283 static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
0284 {
0285 return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0286 }
0287 static inline s32 dev_pm_qos_requested_flags(struct device *dev) { return 0; }
0288 static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
0289 {
0290 return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0291 }
0292 #endif
0293
0294 static inline int freq_qos_request_active(struct freq_qos_request *req)
0295 {
0296 return !IS_ERR_OR_NULL(req->qos);
0297 }
0298
0299 void freq_constraints_init(struct freq_constraints *qos);
0300
0301 s32 freq_qos_read_value(struct freq_constraints *qos,
0302 enum freq_qos_req_type type);
0303
0304 int freq_qos_add_request(struct freq_constraints *qos,
0305 struct freq_qos_request *req,
0306 enum freq_qos_req_type type, s32 value);
0307 int freq_qos_update_request(struct freq_qos_request *req, s32 new_value);
0308 int freq_qos_remove_request(struct freq_qos_request *req);
0309 int freq_qos_apply(struct freq_qos_request *req,
0310 enum pm_qos_req_action action, s32 value);
0311
0312 int freq_qos_add_notifier(struct freq_constraints *qos,
0313 enum freq_qos_req_type type,
0314 struct notifier_block *notifier);
0315 int freq_qos_remove_notifier(struct freq_constraints *qos,
0316 enum freq_qos_req_type type,
0317 struct notifier_block *notifier);
0318
0319 #endif