scmi.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2020, Linaro Limited
  4. *
  5. * Tests scmi_agent uclass and the SCMI drivers implemented in other
  6. * uclass devices probe when a SCMI server exposes resources.
  7. *
  8. * Note in test.dts the protocol@10 node in scmi node. Protocol 0x10 is not
  9. * implemented in U-Boot SCMI components but the implementation is expected
  10. * to not complain on unknown protocol IDs, as long as it is not used. Note
  11. * in test.dts tests that SCMI drivers probing does not fail for such an
  12. * unknown SCMI protocol ID.
  13. */
  14. #include <common.h>
  15. #include <clk.h>
  16. #include <dm.h>
  17. #include <reset.h>
  18. #include <asm/scmi_test.h>
  19. #include <dm/device-internal.h>
  20. #include <dm/test.h>
  21. #include <linux/kconfig.h>
  22. #include <power/regulator.h>
  23. #include <test/ut.h>
  24. static int ut_assert_scmi_state_preprobe(struct unit_test_state *uts)
  25. {
  26. struct sandbox_scmi_service *scmi_ctx = sandbox_scmi_service_ctx();
  27. ut_assertnonnull(scmi_ctx);
  28. ut_assertnull(scmi_ctx->agent);
  29. return 0;
  30. }
  31. static int ut_assert_scmi_state_postprobe(struct unit_test_state *uts,
  32. struct udevice *dev)
  33. {
  34. struct sandbox_scmi_devices *scmi_devices;
  35. struct sandbox_scmi_service *scmi_ctx;
  36. struct sandbox_scmi_agent *agent;
  37. /* Device references to check context against test sequence */
  38. scmi_devices = sandbox_scmi_devices_ctx(dev);
  39. ut_assertnonnull(scmi_devices);
  40. ut_asserteq(2, scmi_devices->clk_count);
  41. ut_asserteq(1, scmi_devices->reset_count);
  42. ut_asserteq(2, scmi_devices->regul_count);
  43. /* State of the simulated SCMI server exposed */
  44. scmi_ctx = sandbox_scmi_service_ctx();
  45. ut_assertnonnull(scmi_ctx);
  46. agent = scmi_ctx->agent;
  47. ut_assertnonnull(agent);
  48. ut_asserteq(3, agent->clk_count);
  49. ut_assertnonnull(agent->clk);
  50. ut_asserteq(1, agent->reset_count);
  51. ut_assertnonnull(agent->reset);
  52. ut_asserteq(2, agent->voltd_count);
  53. ut_assertnonnull(agent->voltd);
  54. return 0;
  55. }
  56. static int load_sandbox_scmi_test_devices(struct unit_test_state *uts,
  57. struct udevice **dev)
  58. {
  59. int ret;
  60. ret = ut_assert_scmi_state_preprobe(uts);
  61. if (ret)
  62. return ret;
  63. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "sandbox_scmi",
  64. dev));
  65. ut_assertnonnull(*dev);
  66. return ut_assert_scmi_state_postprobe(uts, *dev);
  67. }
  68. static int release_sandbox_scmi_test_devices(struct unit_test_state *uts,
  69. struct udevice *dev)
  70. {
  71. ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
  72. /* Not sure test devices are fully removed, agent may not be visible */
  73. return 0;
  74. }
  75. /*
  76. * Test SCMI states when loading and releasing resources
  77. * related to SCMI drivers.
  78. */
  79. static int dm_test_scmi_sandbox_agent(struct unit_test_state *uts)
  80. {
  81. struct udevice *dev = NULL;
  82. int ret;
  83. ret = load_sandbox_scmi_test_devices(uts, &dev);
  84. if (!ret)
  85. ret = release_sandbox_scmi_test_devices(uts, dev);
  86. return ret;
  87. }
  88. DM_TEST(dm_test_scmi_sandbox_agent, UT_TESTF_SCAN_FDT);
  89. static int dm_test_scmi_clocks(struct unit_test_state *uts)
  90. {
  91. struct sandbox_scmi_devices *scmi_devices;
  92. struct sandbox_scmi_service *scmi_ctx;
  93. struct sandbox_scmi_agent *agent;
  94. struct udevice *dev;
  95. int ret_dev;
  96. int ret;
  97. ret = load_sandbox_scmi_test_devices(uts, &dev);
  98. if (ret)
  99. return ret;
  100. scmi_devices = sandbox_scmi_devices_ctx(dev);
  101. ut_assertnonnull(scmi_devices);
  102. scmi_ctx = sandbox_scmi_service_ctx();
  103. ut_assertnonnull(scmi_ctx);
  104. agent = scmi_ctx->agent;
  105. ut_assertnonnull(agent);
  106. /* Test SCMI clocks rate manipulation */
  107. ut_asserteq(333, agent->clk[0].rate);
  108. ut_asserteq(200, agent->clk[1].rate);
  109. ut_asserteq(1000, agent->clk[2].rate);
  110. ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
  111. ut_asserteq(333, clk_get_rate(&scmi_devices->clk[1]));
  112. ret_dev = clk_set_rate(&scmi_devices->clk[1], 1088);
  113. ut_assert(!ret_dev || ret_dev == 1088);
  114. ut_asserteq(1088, agent->clk[0].rate);
  115. ut_asserteq(200, agent->clk[1].rate);
  116. ut_asserteq(1000, agent->clk[2].rate);
  117. ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
  118. ut_asserteq(1088, clk_get_rate(&scmi_devices->clk[1]));
  119. /* restore original rate for further tests */
  120. ret_dev = clk_set_rate(&scmi_devices->clk[1], 333);
  121. ut_assert(!ret_dev || ret_dev == 333);
  122. /* Test SCMI clocks gating manipulation */
  123. ut_assert(!agent->clk[0].enabled);
  124. ut_assert(!agent->clk[1].enabled);
  125. ut_assert(!agent->clk[2].enabled);
  126. ut_asserteq(0, clk_enable(&scmi_devices->clk[1]));
  127. ut_assert(agent->clk[0].enabled);
  128. ut_assert(!agent->clk[1].enabled);
  129. ut_assert(!agent->clk[2].enabled);
  130. ut_assertok(clk_disable(&scmi_devices->clk[1]));
  131. ut_assert(!agent->clk[0].enabled);
  132. ut_assert(!agent->clk[1].enabled);
  133. ut_assert(!agent->clk[2].enabled);
  134. return release_sandbox_scmi_test_devices(uts, dev);
  135. }
  136. DM_TEST(dm_test_scmi_clocks, UT_TESTF_SCAN_FDT);
  137. static int dm_test_scmi_resets(struct unit_test_state *uts)
  138. {
  139. struct sandbox_scmi_devices *scmi_devices;
  140. struct sandbox_scmi_service *scmi_ctx;
  141. struct sandbox_scmi_agent *agent;
  142. struct udevice *dev = NULL;
  143. int ret;
  144. ret = load_sandbox_scmi_test_devices(uts, &dev);
  145. if (ret)
  146. return ret;
  147. scmi_devices = sandbox_scmi_devices_ctx(dev);
  148. ut_assertnonnull(scmi_devices);
  149. scmi_ctx = sandbox_scmi_service_ctx();
  150. ut_assertnonnull(scmi_ctx);
  151. agent = scmi_ctx->agent;
  152. ut_assertnonnull(agent);
  153. /* Test SCMI resect controller manipulation */
  154. ut_assert(!agent->reset[0].asserted);
  155. ut_assertok(reset_assert(&scmi_devices->reset[0]));
  156. ut_assert(agent->reset[0].asserted);
  157. ut_assertok(reset_deassert(&scmi_devices->reset[0]));
  158. ut_assert(!agent->reset[0].asserted);
  159. return release_sandbox_scmi_test_devices(uts, dev);
  160. }
  161. DM_TEST(dm_test_scmi_resets, UT_TESTF_SCAN_FDT);
  162. static int dm_test_scmi_voltage_domains(struct unit_test_state *uts)
  163. {
  164. struct sandbox_scmi_devices *scmi_devices;
  165. struct sandbox_scmi_service *scmi_ctx;
  166. struct sandbox_scmi_agent *agent;
  167. struct dm_regulator_uclass_plat *uc_pdata;
  168. struct udevice *dev;
  169. struct udevice *regul0_dev;
  170. ut_assertok(load_sandbox_scmi_test_devices(uts, &dev));
  171. scmi_devices = sandbox_scmi_devices_ctx(dev);
  172. ut_assertnonnull(scmi_devices);
  173. scmi_ctx = sandbox_scmi_service_ctx();
  174. ut_assertnonnull(scmi_ctx);
  175. agent = scmi_ctx->agent;
  176. ut_assertnonnull(agent);
  177. /* Set/Get an SCMI voltage domain level */
  178. regul0_dev = scmi_devices->regul[0];
  179. ut_assert(regul0_dev);
  180. uc_pdata = dev_get_uclass_plat(regul0_dev);
  181. ut_assert(uc_pdata);
  182. ut_assertok(regulator_set_value(regul0_dev, uc_pdata->min_uV));
  183. ut_asserteq(agent->voltd[0].voltage_uv, uc_pdata->min_uV);
  184. ut_assert(regulator_get_value(regul0_dev) == uc_pdata->min_uV);
  185. ut_assertok(regulator_set_value(regul0_dev, uc_pdata->max_uV));
  186. ut_asserteq(agent->voltd[0].voltage_uv, uc_pdata->max_uV);
  187. ut_assert(regulator_get_value(regul0_dev) == uc_pdata->max_uV);
  188. /* Enable/disable SCMI voltage domains */
  189. ut_assertok(regulator_set_enable(scmi_devices->regul[0], false));
  190. ut_assertok(regulator_set_enable(scmi_devices->regul[1], false));
  191. ut_assert(!agent->voltd[0].enabled);
  192. ut_assert(!agent->voltd[1].enabled);
  193. ut_assertok(regulator_set_enable(scmi_devices->regul[0], true));
  194. ut_assert(agent->voltd[0].enabled);
  195. ut_assert(!agent->voltd[1].enabled);
  196. ut_assertok(regulator_set_enable(scmi_devices->regul[1], true));
  197. ut_assert(agent->voltd[0].enabled);
  198. ut_assert(agent->voltd[1].enabled);
  199. ut_assertok(regulator_set_enable(scmi_devices->regul[0], false));
  200. ut_assert(!agent->voltd[0].enabled);
  201. ut_assert(agent->voltd[1].enabled);
  202. return release_sandbox_scmi_test_devices(uts, dev);
  203. }
  204. DM_TEST(dm_test_scmi_voltage_domains, UT_TESTF_SCAN_FDT);