msm_mmrm.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef __MSM_MMRM_H__
  7. #define __MSM_MMRM_H__
  8. #include <linux/types.h>
  9. #define MMRM_CLK_CLIENT_NAME_SIZE 128
  10. /*
  11. * MMRM Client data flags
  12. * MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY : Clients can use this flag
  13. * to reserve the actual required resource to MMRM (as some clients
  14. * have a differnt path to validate the resource availability).
  15. * With this flag set for mmrm_set_value, MMRM will skip setting rate
  16. * to clk driver & only check if requested clk resource is available.
  17. * Client need to call mmrm_set_value again (without this flag) to complete
  18. * the rate setting to clk driver. If MMRM driver will not receive
  19. * set_value call from client within stipulated time eg: 100ms,
  20. * resource will be returned back to pool.
  21. */
  22. #define MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY 0x0001
  23. /**
  24. * mmrm_client_domain : MMRM client domain
  25. * Clients need to configure this in mmrm_clk_client_desc
  26. */
  27. enum mmrm_client_domain {
  28. MMRM_CLIENT_DOMAIN_CAMERA = 0x1,
  29. MMRM_CLIENT_DOMAIN_CVP = 0x2,
  30. MMRM_CLIENT_DOMAIN_DISPLAY = 0x3,
  31. MMRM_CLIENT_DOMAIN_VIDEO = 0x4,
  32. };
  33. /**
  34. * mmrm_client_type : MMRM Client type
  35. */
  36. enum mmrm_client_type {
  37. MMRM_CLIENT_CLOCK,
  38. };
  39. /**
  40. * mmrm_client_priority: Allowed mmrm client priorities configured by client.
  41. * These priorities are used by mmrm clients when regitering client.
  42. * Clients registered with low priority can be throttled to a lower
  43. * value (if needed to accommodate high priority client
  44. * or if current set value exceeds peak threshold).
  45. * High priority clients cannot be throttled & if set value cannot
  46. * be accommodated (even after throttling low priority clients),
  47. * mmrm driver will return error -EDQUOT.
  48. * Order of throttling registered low priority clients will be
  49. * dependent on chipset and will be decided by MMRM driver.
  50. */
  51. enum mmrm_client_priority {
  52. MMRM_CLIENT_PRIOR_HIGH = 0x1,
  53. MMRM_CLIENT_PRIOR_LOW = 0x2
  54. };
  55. /*
  56. * mmrm_cb_type: Callback type for the mmrm client notifier
  57. * MMRM_CLIENT_RESOURCE_VALUE_CHANGE: Indicate a change in resource value
  58. */
  59. enum mmrm_cb_type {
  60. MMRM_CLIENT_RESOURCE_VALUE_CHANGE = 0x1,
  61. };
  62. /*
  63. * mmrm_crm_drv_type: MMRM CESTA Client Type (HW or SW DRV)
  64. */
  65. enum mmrm_crm_drv_type {
  66. MMRM_CRM_SW_DRV,
  67. MMRM_CRM_HW_DRV,
  68. };
  69. /**
  70. * mmrm_res_val_chng: Change in resource value for mmrm cb type
  71. * MMRM_CLIENT_RESOURCE_VALUE_CHANGE
  72. * @old_val: Previously configured resource value by client
  73. * @new_val: New resource value for this client (throttled value) by mmrm
  74. */
  75. struct mmrm_res_val_chng {
  76. unsigned long old_val;
  77. unsigned long new_val;
  78. };
  79. /**
  80. * mmrm_client_notifier_data: Callback used to pass resource data to client
  81. * @cb_type: Type of notifier callback (eg: MMRM_CLIENT_RESOURCE_VALUE_CHANGE)
  82. * @cb_data: Data corresponding to notifier cb type
  83. * @pvt_data: Private data provided by client while registering
  84. */
  85. struct mmrm_client_notifier_data {
  86. enum mmrm_cb_type cb_type;
  87. union {
  88. struct mmrm_res_val_chng val_chng;
  89. } cb_data;
  90. void *pvt_data;
  91. };
  92. /**
  93. * mmrm_client_res_value - Resource values for MMRM client
  94. * For mmrm_client_set_value_in_range, client will configure min & cur
  95. * For mmrm_client_get_value, mmrm driver will return all 3 values.
  96. * @min: Min resource value of this client
  97. * @cur: Current resource value of this client
  98. * @max: Max possible resource value of this client
  99. * min and cur are previously set by client, while max is computed by mmrm
  100. */
  101. struct mmrm_client_res_value {
  102. unsigned long min;
  103. unsigned long cur;
  104. unsigned long max;
  105. };
  106. /**
  107. * mmrm_client : MMRM client structure allocated & returned to client
  108. * in register call. This will ensure that right client is configuring
  109. * set/get value for its resources.
  110. * @client_type: Type of client resource
  111. * @client_uid: Unique id of the resource created by MMRM
  112. */
  113. struct mmrm_client {
  114. enum mmrm_client_type client_type;
  115. u32 client_uid;
  116. };
  117. /**
  118. * mmrm_clk_client_desc : MMRM clock client descriptor used
  119. * for registering client
  120. * @client_domain: Client provides MMRM_CLIENT_DOMAIN_XXXX
  121. * @client_id: Client provides CLK_SRC_XXXX id
  122. * @name : Client name
  123. * @clk : Pointer to clock struct
  124. * @hw_drv_instances : Number of HW DRV instances, if managed by CESTA HW
  125. * 0, if not managed by CESTA HW
  126. * @num_pwr_states : Number of supported power states, if managed by CESTA HW
  127. * 0, if not managed by CESTA HW
  128. */
  129. struct mmrm_clk_client_desc {
  130. u32 client_domain;
  131. u32 client_id;
  132. const char name[MMRM_CLK_CLIENT_NAME_SIZE];
  133. struct clk *clk;
  134. /* CESTA data */
  135. u32 hw_drv_instances;
  136. u32 num_pwr_states;
  137. };
  138. /**
  139. * mmrm_client_desc : MMRM client descriptor used for registering client
  140. * @client_type : Type of client (eg: clock)
  141. * @client_info : Description of client (eg: clock)
  142. * @priority : Client priority
  143. * @pvt_data : Client data to be used by clients when mmrm driver
  144. * calls notifier function after throttling.
  145. * @notifier_callback_fn : Callback function used by mmrm to notify clients
  146. * asynchronously. These callbacks are allowed only
  147. * when client is actively registered.
  148. */
  149. struct mmrm_client_desc {
  150. enum mmrm_client_type client_type;
  151. union {
  152. struct mmrm_clk_client_desc desc;
  153. } client_info;
  154. enum mmrm_client_priority priority;
  155. void *pvt_data;
  156. int (*notifier_callback_fn)(
  157. struct mmrm_client_notifier_data *notifier_data);
  158. };
  159. /**
  160. * mmrm_client_data : Additional data MMRM client data needed to configure
  161. * set value.
  162. * @num_hw_blocks: Client hw blocks enabled for resource allocation estimation
  163. * Default 1 for each client
  164. * @flags: Client flags used to provide additional client info
  165. * Refer flags MMRM_CLIENT_DATA_FLAG_XXXX
  166. * @drv_type: CESTA DRV type, if managed by CESTA HW
  167. * one of CRM_HW_DRV or CRM_SW_DRV
  168. * @crm_drv_idx: DRV client index
  169. * Applicable for CESTA clients
  170. * @pwr_st: The pwr_state for HW/SW DRV
  171. * Applicable for CESTA clients
  172. */
  173. struct mmrm_client_data {
  174. u32 num_hw_blocks;
  175. u32 flags;
  176. /* CESTA data */
  177. enum mmrm_crm_drv_type drv_type;
  178. u32 crm_drv_idx;
  179. u32 pwr_st;
  180. };
  181. #if IS_ENABLED(CONFIG_MSM_MMRM)
  182. /**
  183. * mmrm_client_check_scaling_supported - check if mmrm client type (clk, bw)
  184. * scaling is supported for a client domain (camera, cvp, video, display)
  185. * @client_type: Type of mmrm client (clk, bw)
  186. * @client_domain: client domain (camera, cvp, display, video)
  187. *
  188. * Returns true : mmrm scaling is supported for a client type & domain
  189. * false: mmrm scaling is not supported for a client type & domain
  190. */
  191. bool mmrm_client_check_scaling_supported(enum mmrm_client_type client_type,
  192. u32 client_domain);
  193. /**
  194. * mmrm_client_register - register an mmrm client
  195. * This call not configure any rate, use set rate to configure desired rate.
  196. * @desc: Client description
  197. *
  198. * Returns pointer to mmrm_client for success or NULL during failure
  199. */
  200. struct mmrm_client *mmrm_client_register(struct mmrm_client_desc *desc);
  201. /**
  202. * mmrm_client_deregister - de-register a previously registered mmrm client
  203. * @client: Pointer to mmrm client, returned after client registration
  204. *
  205. * Returns 0 on success or negative errno (-EINVAL)
  206. */
  207. int mmrm_client_deregister(struct mmrm_client *client);
  208. /**
  209. * mmrm_client_set_value - set mmrm client resource value to the given value.
  210. * MMRM driver will check client priority & configure this value accordingly.
  211. * For high priority clients, mmrm driver will try to set the value & will
  212. * throttle low priority clients to accommodate the request. If set rate value
  213. * cannot be accommodated, then mmrm driver will return errno (-EDQUOT).
  214. * For low priority clients, mmrm driver will return error if value cannot
  215. * be accommodated.
  216. * For clock resource, this will replace clk_set_rate() in client driver.
  217. *
  218. * @client: Pointer to mmrm client returned after client registration
  219. * @client_data : Additional client data provided by mmrm client for set value
  220. * @val: Desired resource value
  221. *
  222. * Returns 0 on success or negative errno (-EDQUOT / -EINVAL)
  223. */
  224. int mmrm_client_set_value(struct mmrm_client *client,
  225. struct mmrm_client_data *client_data, unsigned long val);
  226. /**
  227. * mmrm_client_set_value_in_range - set mmrm client resource value to the
  228. * allowed value in the given range.
  229. * This api is primarily for low priority clients, if current value (cur)
  230. * cannot be configured then MMRM driver will identify a suitable lower value
  231. * using intermediate corners for the client upto minmum value (min).
  232. * In case set value cannot be accommodated mmrm driver will return -EDQUOT.
  233. * MMRM will store the min value if this client needs to be throttled.
  234. * @client: mmrm client returned after client registration
  235. * @client_data : additional client data provided by mmrm client for set value
  236. * @val : setting resource value triplet
  237. *
  238. * Returns 0 on success or negative errno (-EDQUOT/ -EINVAL)
  239. */
  240. int mmrm_client_set_value_in_range(struct mmrm_client *client,
  241. struct mmrm_client_data *client_data,
  242. struct mmrm_client_res_value *val);
  243. /**
  244. * mmrm_client_get_value - get mmrm client resource values {min, cur, max}
  245. * @client: mmrm client returned after client registration
  246. * @val: resource value triplet set by mmrm
  247. *
  248. * Returns 0 on success or negative errno (-ENOTSUPP)
  249. */
  250. int mmrm_client_get_value(struct mmrm_client *client,
  251. struct mmrm_client_res_value *val);
  252. #else
  253. static inline bool mmrm_client_check_scaling_supported(
  254. enum mmrm_client_type client_type, u32 client_domain)
  255. {
  256. return false;
  257. }
  258. static inline struct mmrm_client *mmrm_client_register(
  259. struct mmrm_client_desc *desc)
  260. {
  261. return NULL;
  262. }
  263. static inline int mmrm_client_deregister(struct mmrm_client *client)
  264. {
  265. return 0;
  266. }
  267. static inline int mmrm_client_set_value(struct mmrm_client *client,
  268. struct mmrm_client_data *client_data, unsigned long val)
  269. {
  270. return -EINVAL;
  271. }
  272. static inline int mmrm_client_set_value_in_range(struct mmrm_client *client,
  273. struct mmrm_client_data *client_data,
  274. struct mmrm_client_res_value *val)
  275. {
  276. return -EINVAL;
  277. }
  278. static inline int mmrm_client_get_value(struct mmrm_client *client,
  279. struct mmrm_client_res_value *val)
  280. {
  281. return 0;
  282. }
  283. #endif
  284. #endif