blob: a7d05f66b753370e70eac1c4da4137d232d60e98 [file] [log] [blame]
Etienne Carriere02fd1262020-09-09 18:44:00 +02001// 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 *
Etienne Carriere09665cb2022-02-21 09:22:39 +01008 * Note in test.dts the protocol@10 node in scmi node. Protocol 0x10 is not
Yuepeng Xing71cc0212022-12-02 14:23:07 +08009 * implemented in U-Boot SCMI components but the implementation is expected
Etienne Carriere02fd1262020-09-09 18:44:00 +020010 * 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
15#include <common.h>
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020016#include <clk.h>
Etienne Carriere02fd1262020-09-09 18:44:00 +020017#include <dm.h>
Etienne Carriere8b9b6892020-09-09 18:44:07 +020018#include <reset.h>
AKASHI Takahirocc4ecda2023-10-11 19:06:59 +090019#include <scmi_agent.h>
20#include <scmi_protocols.h>
Etienne Carriere02fd1262020-09-09 18:44:00 +020021#include <asm/scmi_test.h>
22#include <dm/device-internal.h>
23#include <dm/test.h>
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020024#include <linux/kconfig.h>
Etienne Carriereb8f15cd2021-03-08 22:38:07 +010025#include <power/regulator.h>
Etienne Carriere02fd1262020-09-09 18:44:00 +020026#include <test/ut.h>
27
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020028static int ut_assert_scmi_state_postprobe(struct unit_test_state *uts,
AKASHI Takahirodae00462023-10-11 19:07:03 +090029 struct sandbox_scmi_agent *agent,
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020030 struct udevice *dev)
31{
32 struct sandbox_scmi_devices *scmi_devices;
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020033
34 /* Device references to check context against test sequence */
35 scmi_devices = sandbox_scmi_devices_ctx(dev);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020036 ut_assertnonnull(scmi_devices);
Etienne Carriere09665cb2022-02-21 09:22:39 +010037 ut_asserteq(2, scmi_devices->clk_count);
Etienne Carrierec83a8432021-03-08 22:38:08 +010038 ut_asserteq(1, scmi_devices->reset_count);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +010039 ut_asserteq(2, scmi_devices->regul_count);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020040
41 /* State of the simulated SCMI server exposed */
Etienne Carrierebf1f1322022-02-21 09:22:41 +010042 ut_asserteq(3, agent->clk_count);
Etienne Carriere09665cb2022-02-21 09:22:39 +010043 ut_assertnonnull(agent->clk);
44 ut_asserteq(1, agent->reset_count);
45 ut_assertnonnull(agent->reset);
46 ut_asserteq(2, agent->voltd_count);
47 ut_assertnonnull(agent->voltd);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020048
49 return 0;
50}
51
52static int load_sandbox_scmi_test_devices(struct unit_test_state *uts,
AKASHI Takahirodae00462023-10-11 19:07:03 +090053 struct sandbox_scmi_agent **ctx,
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020054 struct udevice **dev)
55{
AKASHI Takahirodae00462023-10-11 19:07:03 +090056 struct udevice *agent_dev;
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020057
AKASHI Takahirodae00462023-10-11 19:07:03 +090058 ut_assertok(uclass_get_device_by_name(UCLASS_SCMI_AGENT, "scmi",
59 &agent_dev));
60 ut_assertnonnull(agent_dev);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020061
AKASHI Takahirodae00462023-10-11 19:07:03 +090062 *ctx = sandbox_scmi_agent_ctx(agent_dev);
63 ut_assertnonnull(*ctx);
64
65 /* probe */
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020066 ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "sandbox_scmi",
67 dev));
68 ut_assertnonnull(*dev);
69
AKASHI Takahirodae00462023-10-11 19:07:03 +090070 return ut_assert_scmi_state_postprobe(uts, *ctx, *dev);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020071}
72
73static int release_sandbox_scmi_test_devices(struct unit_test_state *uts,
74 struct udevice *dev)
75{
AKASHI Takahirodae00462023-10-11 19:07:03 +090076 /* un-probe */
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020077 ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
78
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020079 return 0;
80}
81
Etienne Carriere02fd1262020-09-09 18:44:00 +020082/*
83 * Test SCMI states when loading and releasing resources
84 * related to SCMI drivers.
85 */
86static int dm_test_scmi_sandbox_agent(struct unit_test_state *uts)
87{
AKASHI Takahirodae00462023-10-11 19:07:03 +090088 struct sandbox_scmi_agent *ctx;
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020089 struct udevice *dev = NULL;
90 int ret;
Etienne Carriere02fd1262020-09-09 18:44:00 +020091
AKASHI Takahirodae00462023-10-11 19:07:03 +090092 ret = load_sandbox_scmi_test_devices(uts, &ctx, &dev);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020093 if (!ret)
94 ret = release_sandbox_scmi_test_devices(uts, dev);
Etienne Carriere02fd1262020-09-09 18:44:00 +020095
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020096 return ret;
Etienne Carriere02fd1262020-09-09 18:44:00 +020097}
Etienne Carriere02fd1262020-09-09 18:44:00 +020098DM_TEST(dm_test_scmi_sandbox_agent, UT_TESTF_SCAN_FDT);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +020099
100static int dm_test_scmi_clocks(struct unit_test_state *uts)
101{
Etienne Carriere09665cb2022-02-21 09:22:39 +0100102 struct sandbox_scmi_agent *agent;
AKASHI Takahirodae00462023-10-11 19:07:03 +0900103 struct sandbox_scmi_devices *scmi_devices;
AKASHI Takahirocc4ecda2023-10-11 19:06:59 +0900104 struct udevice *agent_dev, *clock_dev, *dev;
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200105 int ret_dev;
106 int ret;
107
AKASHI Takahirodae00462023-10-11 19:07:03 +0900108 ret = load_sandbox_scmi_test_devices(uts, &agent, &dev);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200109 if (ret)
110 return ret;
111
112 scmi_devices = sandbox_scmi_devices_ctx(dev);
Etienne Carriere09665cb2022-02-21 09:22:39 +0100113 ut_assertnonnull(scmi_devices);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200114
AKASHI Takahirocc4ecda2023-10-11 19:06:59 +0900115 /* Sandbox SCMI clock protocol has its own channel */
116 ut_assertok(uclass_get_device_by_name(UCLASS_SCMI_AGENT, "scmi",
117 &agent_dev));
118 ut_assertnonnull(agent_dev);
119 clock_dev = scmi_get_protocol(agent_dev, SCMI_PROTOCOL_ID_CLOCK);
120 ut_assertnonnull(clock_dev);
121 ut_asserteq(0x14, sandbox_scmi_channel_id(clock_dev));
122
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200123 /* Test SCMI clocks rate manipulation */
Etienne Carrierebf1f1322022-02-21 09:22:41 +0100124 ut_asserteq(333, agent->clk[0].rate);
125 ut_asserteq(200, agent->clk[1].rate);
126 ut_asserteq(1000, agent->clk[2].rate);
127
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200128 ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
129 ut_asserteq(333, clk_get_rate(&scmi_devices->clk[1]));
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200130
131 ret_dev = clk_set_rate(&scmi_devices->clk[1], 1088);
132 ut_assert(!ret_dev || ret_dev == 1088);
133
Etienne Carrierebf1f1322022-02-21 09:22:41 +0100134 ut_asserteq(1088, agent->clk[0].rate);
135 ut_asserteq(200, agent->clk[1].rate);
136 ut_asserteq(1000, agent->clk[2].rate);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200137
138 ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
139 ut_asserteq(1088, clk_get_rate(&scmi_devices->clk[1]));
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200140
141 /* restore original rate for further tests */
142 ret_dev = clk_set_rate(&scmi_devices->clk[1], 333);
143 ut_assert(!ret_dev || ret_dev == 333);
144
145 /* Test SCMI clocks gating manipulation */
Etienne Carriere09665cb2022-02-21 09:22:39 +0100146 ut_assert(!agent->clk[0].enabled);
147 ut_assert(!agent->clk[1].enabled);
148 ut_assert(!agent->clk[2].enabled);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200149
150 ut_asserteq(0, clk_enable(&scmi_devices->clk[1]));
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200151
Etienne Carrierebf1f1322022-02-21 09:22:41 +0100152 ut_assert(agent->clk[0].enabled);
153 ut_assert(!agent->clk[1].enabled);
Etienne Carriere09665cb2022-02-21 09:22:39 +0100154 ut_assert(!agent->clk[2].enabled);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200155
156 ut_assertok(clk_disable(&scmi_devices->clk[1]));
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200157
Etienne Carriere09665cb2022-02-21 09:22:39 +0100158 ut_assert(!agent->clk[0].enabled);
159 ut_assert(!agent->clk[1].enabled);
160 ut_assert(!agent->clk[2].enabled);
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200161
162 return release_sandbox_scmi_test_devices(uts, dev);
163}
Etienne Carriere2d94c08fa2020-09-09 18:44:05 +0200164DM_TEST(dm_test_scmi_clocks, UT_TESTF_SCAN_FDT);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200165
166static int dm_test_scmi_resets(struct unit_test_state *uts)
167{
Etienne Carriere09665cb2022-02-21 09:22:39 +0100168 struct sandbox_scmi_agent *agent;
AKASHI Takahirodae00462023-10-11 19:07:03 +0900169 struct sandbox_scmi_devices *scmi_devices;
AKASHI Takahirocc4ecda2023-10-11 19:06:59 +0900170 struct udevice *agent_dev, *reset_dev, *dev = NULL;
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200171 int ret;
172
AKASHI Takahirodae00462023-10-11 19:07:03 +0900173 ret = load_sandbox_scmi_test_devices(uts, &agent, &dev);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200174 if (ret)
175 return ret;
176
177 scmi_devices = sandbox_scmi_devices_ctx(dev);
Etienne Carriere09665cb2022-02-21 09:22:39 +0100178 ut_assertnonnull(scmi_devices);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200179
AKASHI Takahirocc4ecda2023-10-11 19:06:59 +0900180 /* Sandbox SCMI reset protocol doesn't have its own channel */
181 ut_assertok(uclass_get_device_by_name(UCLASS_SCMI_AGENT, "scmi",
182 &agent_dev));
183 ut_assertnonnull(agent_dev);
184 reset_dev = scmi_get_protocol(agent_dev, SCMI_PROTOCOL_ID_RESET_DOMAIN);
185 ut_assertnonnull(reset_dev);
186 ut_asserteq(0x0, sandbox_scmi_channel_id(reset_dev));
187
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200188 /* Test SCMI resect controller manipulation */
Marek Vasut1531c4e2023-03-10 04:33:13 +0100189 ut_assert(!agent->reset[0].asserted);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200190
191 ut_assertok(reset_assert(&scmi_devices->reset[0]));
Marek Vasut1531c4e2023-03-10 04:33:13 +0100192 ut_assert(agent->reset[0].asserted);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200193
194 ut_assertok(reset_deassert(&scmi_devices->reset[0]));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100195 ut_assert(!agent->reset[0].asserted);
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200196
197 return release_sandbox_scmi_test_devices(uts, dev);
198}
Etienne Carriere8b9b6892020-09-09 18:44:07 +0200199DM_TEST(dm_test_scmi_resets, UT_TESTF_SCAN_FDT);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100200
201static int dm_test_scmi_voltage_domains(struct unit_test_state *uts)
202{
Etienne Carriere09665cb2022-02-21 09:22:39 +0100203 struct sandbox_scmi_agent *agent;
AKASHI Takahirodae00462023-10-11 19:07:03 +0900204 struct sandbox_scmi_devices *scmi_devices;
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100205 struct dm_regulator_uclass_plat *uc_pdata;
206 struct udevice *dev;
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100207 struct udevice *regul0_dev;
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100208
AKASHI Takahirodae00462023-10-11 19:07:03 +0900209 ut_assertok(load_sandbox_scmi_test_devices(uts, &agent, &dev));
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100210
211 scmi_devices = sandbox_scmi_devices_ctx(dev);
Etienne Carriere09665cb2022-02-21 09:22:39 +0100212 ut_assertnonnull(scmi_devices);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100213
214 /* Set/Get an SCMI voltage domain level */
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100215 regul0_dev = scmi_devices->regul[0];
216 ut_assert(regul0_dev);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100217
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100218 uc_pdata = dev_get_uclass_plat(regul0_dev);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100219 ut_assert(uc_pdata);
220
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100221 ut_assertok(regulator_set_value(regul0_dev, uc_pdata->min_uV));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100222 ut_asserteq(agent->voltd[0].voltage_uv, uc_pdata->min_uV);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100223
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100224 ut_assert(regulator_get_value(regul0_dev) == uc_pdata->min_uV);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100225
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100226 ut_assertok(regulator_set_value(regul0_dev, uc_pdata->max_uV));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100227 ut_asserteq(agent->voltd[0].voltage_uv, uc_pdata->max_uV);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100228
Etienne Carriereeeaf2822021-03-08 22:38:09 +0100229 ut_assert(regulator_get_value(regul0_dev) == uc_pdata->max_uV);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100230
231 /* Enable/disable SCMI voltage domains */
232 ut_assertok(regulator_set_enable(scmi_devices->regul[0], false));
233 ut_assertok(regulator_set_enable(scmi_devices->regul[1], false));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100234 ut_assert(!agent->voltd[0].enabled);
235 ut_assert(!agent->voltd[1].enabled);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100236
237 ut_assertok(regulator_set_enable(scmi_devices->regul[0], true));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100238 ut_assert(agent->voltd[0].enabled);
239 ut_assert(!agent->voltd[1].enabled);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100240
241 ut_assertok(regulator_set_enable(scmi_devices->regul[1], true));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100242 ut_assert(agent->voltd[0].enabled);
243 ut_assert(agent->voltd[1].enabled);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100244
245 ut_assertok(regulator_set_enable(scmi_devices->regul[0], false));
Etienne Carriere09665cb2022-02-21 09:22:39 +0100246 ut_assert(!agent->voltd[0].enabled);
247 ut_assert(agent->voltd[1].enabled);
Etienne Carriereb8f15cd2021-03-08 22:38:07 +0100248
249 return release_sandbox_scmi_test_devices(uts, dev);
250}
251DM_TEST(dm_test_scmi_voltage_domains, UT_TESTF_SCAN_FDT);