pm_qos.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Definitions related to Power Management Quality of Service (PM QoS).
  4. *
  5. * Copyright (C) 2020 Intel Corporation
  6. *
  7. * Authors:
  8. * Mark Gross <[email protected]>
  9. * Rafael J. Wysocki <[email protected]>
  10. */
  11. #ifndef _LINUX_PM_QOS_H
  12. #define _LINUX_PM_QOS_H
  13. #include <linux/plist.h>
  14. #include <linux/notifier.h>
  15. #include <linux/device.h>
  16. enum pm_qos_flags_status {
  17. PM_QOS_FLAGS_UNDEFINED = -1,
  18. PM_QOS_FLAGS_NONE,
  19. PM_QOS_FLAGS_SOME,
  20. PM_QOS_FLAGS_ALL,
  21. };
  22. #define PM_QOS_DEFAULT_VALUE (-1)
  23. #define PM_QOS_LATENCY_ANY S32_MAX
  24. #define PM_QOS_LATENCY_ANY_NS ((s64)PM_QOS_LATENCY_ANY * NSEC_PER_USEC)
  25. #define PM_QOS_CPU_LATENCY_DEFAULT_VALUE (2000 * USEC_PER_SEC)
  26. #define PM_QOS_RESUME_LATENCY_DEFAULT_VALUE PM_QOS_LATENCY_ANY
  27. #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT PM_QOS_LATENCY_ANY
  28. #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS PM_QOS_LATENCY_ANY_NS
  29. #define PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE 0
  30. #define PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE 0
  31. #define PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE FREQ_QOS_MAX_DEFAULT_VALUE
  32. #define PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT (-1)
  33. #define PM_QOS_FLAG_NO_POWER_OFF (1 << 0)
  34. enum pm_qos_type {
  35. PM_QOS_UNITIALIZED,
  36. PM_QOS_MAX, /* return the largest value */
  37. PM_QOS_MIN, /* return the smallest value */
  38. };
  39. /*
  40. * Note: The lockless read path depends on the CPU accessing target_value
  41. * or effective_flags atomically. Atomic access is only guaranteed on all CPU
  42. * types linux supports for 32 bit quantites
  43. */
  44. struct pm_qos_constraints {
  45. struct plist_head list;
  46. s32 target_value; /* Do not change to 64 bit */
  47. s32 default_value;
  48. s32 no_constraint_value;
  49. enum pm_qos_type type;
  50. struct blocking_notifier_head *notifiers;
  51. };
  52. struct pm_qos_request {
  53. struct plist_node node;
  54. struct pm_qos_constraints *qos;
  55. };
  56. struct pm_qos_flags_request {
  57. struct list_head node;
  58. s32 flags; /* Do not change to 64 bit */
  59. };
  60. struct pm_qos_flags {
  61. struct list_head list;
  62. s32 effective_flags; /* Do not change to 64 bit */
  63. };
  64. #define FREQ_QOS_MIN_DEFAULT_VALUE 0
  65. #define FREQ_QOS_MAX_DEFAULT_VALUE S32_MAX
  66. enum freq_qos_req_type {
  67. FREQ_QOS_MIN = 1,
  68. FREQ_QOS_MAX,
  69. };
  70. struct freq_constraints {
  71. struct pm_qos_constraints min_freq;
  72. struct blocking_notifier_head min_freq_notifiers;
  73. struct pm_qos_constraints max_freq;
  74. struct blocking_notifier_head max_freq_notifiers;
  75. };
  76. struct freq_qos_request {
  77. enum freq_qos_req_type type;
  78. struct plist_node pnode;
  79. struct freq_constraints *qos;
  80. ANDROID_OEM_DATA(1);
  81. };
  82. enum dev_pm_qos_req_type {
  83. DEV_PM_QOS_RESUME_LATENCY = 1,
  84. DEV_PM_QOS_LATENCY_TOLERANCE,
  85. DEV_PM_QOS_MIN_FREQUENCY,
  86. DEV_PM_QOS_MAX_FREQUENCY,
  87. DEV_PM_QOS_FLAGS,
  88. };
  89. struct dev_pm_qos_request {
  90. enum dev_pm_qos_req_type type;
  91. union {
  92. struct plist_node pnode;
  93. struct pm_qos_flags_request flr;
  94. struct freq_qos_request freq;
  95. } data;
  96. struct device *dev;
  97. };
  98. struct dev_pm_qos {
  99. struct pm_qos_constraints resume_latency;
  100. struct pm_qos_constraints latency_tolerance;
  101. struct freq_constraints freq;
  102. struct pm_qos_flags flags;
  103. struct dev_pm_qos_request *resume_latency_req;
  104. struct dev_pm_qos_request *latency_tolerance_req;
  105. struct dev_pm_qos_request *flags_req;
  106. };
  107. /* Action requested to pm_qos_update_target */
  108. enum pm_qos_req_action {
  109. PM_QOS_ADD_REQ, /* Add a new request */
  110. PM_QOS_UPDATE_REQ, /* Update an existing request */
  111. PM_QOS_REMOVE_REQ /* Remove an existing request */
  112. };
  113. static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req)
  114. {
  115. return req->dev != NULL;
  116. }
  117. s32 pm_qos_read_value(struct pm_qos_constraints *c);
  118. int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
  119. enum pm_qos_req_action action, int value);
  120. bool pm_qos_update_flags(struct pm_qos_flags *pqf,
  121. struct pm_qos_flags_request *req,
  122. enum pm_qos_req_action action, s32 val);
  123. #ifdef CONFIG_CPU_IDLE
  124. s32 cpu_latency_qos_limit(void);
  125. bool cpu_latency_qos_request_active(struct pm_qos_request *req);
  126. void cpu_latency_qos_add_request(struct pm_qos_request *req, s32 value);
  127. void cpu_latency_qos_update_request(struct pm_qos_request *req, s32 new_value);
  128. void cpu_latency_qos_remove_request(struct pm_qos_request *req);
  129. #else
  130. static inline s32 cpu_latency_qos_limit(void) { return INT_MAX; }
  131. static inline bool cpu_latency_qos_request_active(struct pm_qos_request *req)
  132. {
  133. return false;
  134. }
  135. static inline void cpu_latency_qos_add_request(struct pm_qos_request *req,
  136. s32 value) {}
  137. static inline void cpu_latency_qos_update_request(struct pm_qos_request *req,
  138. s32 new_value) {}
  139. static inline void cpu_latency_qos_remove_request(struct pm_qos_request *req) {}
  140. #endif
  141. #ifdef CONFIG_PM
  142. enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask);
  143. enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask);
  144. s32 __dev_pm_qos_resume_latency(struct device *dev);
  145. s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type);
  146. int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
  147. enum dev_pm_qos_req_type type, s32 value);
  148. int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
  149. int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
  150. int dev_pm_qos_add_notifier(struct device *dev,
  151. struct notifier_block *notifier,
  152. enum dev_pm_qos_req_type type);
  153. int dev_pm_qos_remove_notifier(struct device *dev,
  154. struct notifier_block *notifier,
  155. enum dev_pm_qos_req_type type);
  156. void dev_pm_qos_constraints_init(struct device *dev);
  157. void dev_pm_qos_constraints_destroy(struct device *dev);
  158. int dev_pm_qos_add_ancestor_request(struct device *dev,
  159. struct dev_pm_qos_request *req,
  160. enum dev_pm_qos_req_type type, s32 value);
  161. int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value);
  162. void dev_pm_qos_hide_latency_limit(struct device *dev);
  163. int dev_pm_qos_expose_flags(struct device *dev, s32 value);
  164. void dev_pm_qos_hide_flags(struct device *dev);
  165. int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set);
  166. s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev);
  167. int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val);
  168. int dev_pm_qos_expose_latency_tolerance(struct device *dev);
  169. void dev_pm_qos_hide_latency_tolerance(struct device *dev);
  170. static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
  171. {
  172. return dev->power.qos->resume_latency_req->data.pnode.prio;
  173. }
  174. static inline s32 dev_pm_qos_requested_flags(struct device *dev)
  175. {
  176. return dev->power.qos->flags_req->data.flr.flags;
  177. }
  178. static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
  179. {
  180. return IS_ERR_OR_NULL(dev->power.qos) ?
  181. PM_QOS_RESUME_LATENCY_NO_CONSTRAINT :
  182. pm_qos_read_value(&dev->power.qos->resume_latency);
  183. }
  184. #else
  185. static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev,
  186. s32 mask)
  187. { return PM_QOS_FLAGS_UNDEFINED; }
  188. static inline enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev,
  189. s32 mask)
  190. { return PM_QOS_FLAGS_UNDEFINED; }
  191. static inline s32 __dev_pm_qos_resume_latency(struct device *dev)
  192. { return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT; }
  193. static inline s32 dev_pm_qos_read_value(struct device *dev,
  194. enum dev_pm_qos_req_type type)
  195. {
  196. switch (type) {
  197. case DEV_PM_QOS_RESUME_LATENCY:
  198. return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
  199. case DEV_PM_QOS_MIN_FREQUENCY:
  200. return PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
  201. case DEV_PM_QOS_MAX_FREQUENCY:
  202. return PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
  203. default:
  204. WARN_ON(1);
  205. return 0;
  206. }
  207. }
  208. static inline int dev_pm_qos_add_request(struct device *dev,
  209. struct dev_pm_qos_request *req,
  210. enum dev_pm_qos_req_type type,
  211. s32 value)
  212. { return 0; }
  213. static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
  214. s32 new_value)
  215. { return 0; }
  216. static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
  217. { return 0; }
  218. static inline int dev_pm_qos_add_notifier(struct device *dev,
  219. struct notifier_block *notifier,
  220. enum dev_pm_qos_req_type type)
  221. { return 0; }
  222. static inline int dev_pm_qos_remove_notifier(struct device *dev,
  223. struct notifier_block *notifier,
  224. enum dev_pm_qos_req_type type)
  225. { return 0; }
  226. static inline void dev_pm_qos_constraints_init(struct device *dev)
  227. {
  228. dev->power.power_state = PMSG_ON;
  229. }
  230. static inline void dev_pm_qos_constraints_destroy(struct device *dev)
  231. {
  232. dev->power.power_state = PMSG_INVALID;
  233. }
  234. static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
  235. struct dev_pm_qos_request *req,
  236. enum dev_pm_qos_req_type type,
  237. s32 value)
  238. { return 0; }
  239. static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
  240. { return 0; }
  241. static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {}
  242. static inline int dev_pm_qos_expose_flags(struct device *dev, s32 value)
  243. { return 0; }
  244. static inline void dev_pm_qos_hide_flags(struct device *dev) {}
  245. static inline int dev_pm_qos_update_flags(struct device *dev, s32 m, bool set)
  246. { return 0; }
  247. static inline s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev)
  248. { return PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; }
  249. static inline int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val)
  250. { return 0; }
  251. static inline int dev_pm_qos_expose_latency_tolerance(struct device *dev)
  252. { return 0; }
  253. static inline void dev_pm_qos_hide_latency_tolerance(struct device *dev) {}
  254. static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
  255. {
  256. return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
  257. }
  258. static inline s32 dev_pm_qos_requested_flags(struct device *dev) { return 0; }
  259. static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
  260. {
  261. return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
  262. }
  263. #endif
  264. static inline int freq_qos_request_active(struct freq_qos_request *req)
  265. {
  266. return !IS_ERR_OR_NULL(req->qos);
  267. }
  268. void freq_constraints_init(struct freq_constraints *qos);
  269. s32 freq_qos_read_value(struct freq_constraints *qos,
  270. enum freq_qos_req_type type);
  271. int freq_qos_add_request(struct freq_constraints *qos,
  272. struct freq_qos_request *req,
  273. enum freq_qos_req_type type, s32 value);
  274. int freq_qos_update_request(struct freq_qos_request *req, s32 new_value);
  275. int freq_qos_remove_request(struct freq_qos_request *req);
  276. int freq_qos_apply(struct freq_qos_request *req,
  277. enum pm_qos_req_action action, s32 value);
  278. int freq_qos_add_notifier(struct freq_constraints *qos,
  279. enum freq_qos_req_type type,
  280. struct notifier_block *notifier);
  281. int freq_qos_remove_notifier(struct freq_constraints *qos,
  282. enum freq_qos_req_type type,
  283. struct notifier_block *notifier);
  284. #endif