ipa_power.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2018-2024 Linaro Ltd.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/device.h>
  7. #include <linux/interconnect.h>
  8. #include <linux/pm.h>
  9. #include <linux/pm_runtime.h>
  10. #include "linux/soc/qcom/qcom_aoss.h"
  11. #include "ipa.h"
  12. #include "ipa_data.h"
  13. #include "ipa_endpoint.h"
  14. #include "ipa_interrupt.h"
  15. #include "ipa_modem.h"
  16. #include "ipa_power.h"
  17. /**
  18. * DOC: IPA Power Management
  19. *
  20. * The IPA hardware is enabled when the IPA core clock and all the
  21. * interconnects (buses) it depends on are enabled. Runtime power
  22. * management is used to determine whether the core clock and
  23. * interconnects are enabled, and if not in use to be suspended
  24. * automatically.
  25. *
  26. * The core clock currently runs at a fixed clock rate when enabled,
  27. * an all interconnects use a fixed average and peak bandwidth.
  28. */
  29. #define IPA_AUTOSUSPEND_DELAY 500 /* milliseconds */
  30. /**
  31. * struct ipa_power - IPA power management information
  32. * @dev: IPA device pointer
  33. * @core: IPA core clock
  34. * @qmp: QMP handle for AOSS communication
  35. * @interconnect_count: Number of elements in interconnect[]
  36. * @interconnect: Interconnect array
  37. */
  38. struct ipa_power {
  39. struct device *dev;
  40. struct clk *core;
  41. struct qmp *qmp;
  42. u32 interconnect_count;
  43. struct icc_bulk_data interconnect[] __counted_by(interconnect_count);
  44. };
  45. /* Initialize interconnects required for IPA operation */
  46. static int ipa_interconnect_init(struct ipa_power *power,
  47. const struct ipa_interconnect_data *data)
  48. {
  49. struct icc_bulk_data *interconnect;
  50. int ret;
  51. u32 i;
  52. /* Initialize our interconnect data array for bulk operations */
  53. interconnect = &power->interconnect[0];
  54. for (i = 0; i < power->interconnect_count; i++) {
  55. /* interconnect->path is filled in by of_icc_bulk_get() */
  56. interconnect->name = data->name;
  57. interconnect->avg_bw = data->average_bandwidth;
  58. interconnect->peak_bw = data->peak_bandwidth;
  59. data++;
  60. interconnect++;
  61. }
  62. ret = of_icc_bulk_get(power->dev, power->interconnect_count,
  63. power->interconnect);
  64. if (ret)
  65. return ret;
  66. /* All interconnects are initially disabled */
  67. icc_bulk_disable(power->interconnect_count, power->interconnect);
  68. /* Set the bandwidth values to be used when enabled */
  69. ret = icc_bulk_set_bw(power->interconnect_count, power->interconnect);
  70. if (ret)
  71. icc_bulk_put(power->interconnect_count, power->interconnect);
  72. return ret;
  73. }
  74. /* Inverse of ipa_interconnect_init() */
  75. static void ipa_interconnect_exit(struct ipa_power *power)
  76. {
  77. icc_bulk_put(power->interconnect_count, power->interconnect);
  78. }
  79. /* Enable IPA power, enabling interconnects and the core clock */
  80. static int ipa_power_enable(struct ipa *ipa)
  81. {
  82. struct ipa_power *power = ipa->power;
  83. int ret;
  84. ret = icc_bulk_enable(power->interconnect_count, power->interconnect);
  85. if (ret)
  86. return ret;
  87. ret = clk_prepare_enable(power->core);
  88. if (ret) {
  89. dev_err(power->dev, "error %d enabling core clock\n", ret);
  90. icc_bulk_disable(power->interconnect_count,
  91. power->interconnect);
  92. }
  93. return ret;
  94. }
  95. /* Inverse of ipa_power_enable() */
  96. static void ipa_power_disable(struct ipa *ipa)
  97. {
  98. struct ipa_power *power = ipa->power;
  99. clk_disable_unprepare(power->core);
  100. icc_bulk_disable(power->interconnect_count, power->interconnect);
  101. }
  102. static int ipa_runtime_suspend(struct device *dev)
  103. {
  104. struct ipa *ipa = dev_get_drvdata(dev);
  105. /* Endpoints aren't usable until setup is complete */
  106. if (ipa->setup_complete) {
  107. ipa_endpoint_suspend(ipa);
  108. gsi_suspend(&ipa->gsi);
  109. }
  110. ipa_power_disable(ipa);
  111. return 0;
  112. }
  113. static int ipa_runtime_resume(struct device *dev)
  114. {
  115. struct ipa *ipa = dev_get_drvdata(dev);
  116. int ret;
  117. ret = ipa_power_enable(ipa);
  118. if (WARN_ON(ret < 0))
  119. return ret;
  120. /* Endpoints aren't usable until setup is complete */
  121. if (ipa->setup_complete) {
  122. gsi_resume(&ipa->gsi);
  123. ipa_endpoint_resume(ipa);
  124. }
  125. return 0;
  126. }
  127. static int ipa_suspend(struct device *dev)
  128. {
  129. struct ipa *ipa = dev_get_drvdata(dev);
  130. /* Increment the disable depth to ensure that the IRQ won't
  131. * be re-enabled until the matching _enable call in
  132. * ipa_resume(). We do this to ensure that the interrupt
  133. * handler won't run whilst PM runtime is disabled.
  134. *
  135. * Note that disabling the IRQ is NOT the same as disabling
  136. * irq wake. If wakeup is enabled for the IPA then the IRQ
  137. * will still cause the system to wake up, see irq_set_irq_wake().
  138. */
  139. ipa_interrupt_irq_disable(ipa);
  140. return pm_runtime_force_suspend(dev);
  141. }
  142. static int ipa_resume(struct device *dev)
  143. {
  144. struct ipa *ipa = dev_get_drvdata(dev);
  145. int ret;
  146. ret = pm_runtime_force_resume(dev);
  147. /* Now that PM runtime is enabled again it's safe
  148. * to turn the IRQ back on and process any data
  149. * that was received during suspend.
  150. */
  151. ipa_interrupt_irq_enable(ipa);
  152. return ret;
  153. }
  154. /* Return the current IPA core clock rate */
  155. u32 ipa_core_clock_rate(struct ipa *ipa)
  156. {
  157. return ipa->power ? (u32)clk_get_rate(ipa->power->core) : 0;
  158. }
  159. static int ipa_power_retention_init(struct ipa_power *power)
  160. {
  161. struct qmp *qmp = qmp_get(power->dev);
  162. if (IS_ERR(qmp)) {
  163. if (PTR_ERR(qmp) == -EPROBE_DEFER)
  164. return -EPROBE_DEFER;
  165. /* We assume any other error means it's not defined/needed */
  166. qmp = NULL;
  167. }
  168. power->qmp = qmp;
  169. return 0;
  170. }
  171. static void ipa_power_retention_exit(struct ipa_power *power)
  172. {
  173. qmp_put(power->qmp);
  174. power->qmp = NULL;
  175. }
  176. /* Control register retention on power collapse */
  177. void ipa_power_retention(struct ipa *ipa, bool enable)
  178. {
  179. static const char fmt[] = "{ class: bcm, res: ipa_pc, val: %c }";
  180. struct ipa_power *power = ipa->power;
  181. int ret;
  182. if (!power->qmp)
  183. return; /* Not needed on this platform */
  184. ret = qmp_send(power->qmp, fmt, enable ? '1' : '0');
  185. if (ret)
  186. dev_err(power->dev, "error %d sending QMP %sable request\n",
  187. ret, enable ? "en" : "dis");
  188. }
  189. /* Initialize IPA power management */
  190. struct ipa_power *
  191. ipa_power_init(struct device *dev, const struct ipa_power_data *data)
  192. {
  193. struct ipa_power *power;
  194. struct clk *clk;
  195. size_t size;
  196. int ret;
  197. clk = clk_get(dev, "core");
  198. if (IS_ERR(clk))
  199. return dev_err_cast_probe(dev, clk, "error getting core clock\n");
  200. ret = clk_set_rate(clk, data->core_clock_rate);
  201. if (ret) {
  202. dev_err(dev, "error %d setting core clock rate to %u\n",
  203. ret, data->core_clock_rate);
  204. goto err_clk_put;
  205. }
  206. size = struct_size(power, interconnect, data->interconnect_count);
  207. power = kzalloc(size, GFP_KERNEL);
  208. if (!power) {
  209. ret = -ENOMEM;
  210. goto err_clk_put;
  211. }
  212. power->dev = dev;
  213. power->core = clk;
  214. power->interconnect_count = data->interconnect_count;
  215. ret = ipa_interconnect_init(power, data->interconnect_data);
  216. if (ret)
  217. goto err_kfree;
  218. ret = ipa_power_retention_init(power);
  219. if (ret)
  220. goto err_interconnect_exit;
  221. pm_runtime_set_autosuspend_delay(dev, IPA_AUTOSUSPEND_DELAY);
  222. pm_runtime_use_autosuspend(dev);
  223. pm_runtime_enable(dev);
  224. return power;
  225. err_interconnect_exit:
  226. ipa_interconnect_exit(power);
  227. err_kfree:
  228. kfree(power);
  229. err_clk_put:
  230. clk_put(clk);
  231. return ERR_PTR(ret);
  232. }
  233. /* Inverse of ipa_power_init() */
  234. void ipa_power_exit(struct ipa_power *power)
  235. {
  236. struct device *dev = power->dev;
  237. struct clk *clk = power->core;
  238. pm_runtime_disable(dev);
  239. pm_runtime_dont_use_autosuspend(dev);
  240. ipa_power_retention_exit(power);
  241. ipa_interconnect_exit(power);
  242. kfree(power);
  243. clk_put(clk);
  244. }
  245. const struct dev_pm_ops ipa_pm_ops = {
  246. .suspend = ipa_suspend,
  247. .resume = ipa_resume,
  248. .runtime_suspend = ipa_runtime_suspend,
  249. .runtime_resume = ipa_runtime_resume,
  250. };