xref: /optee_os/core/arch/arm/plat-stm32mp1/scmi_server.c (revision 53ce77beab895a695e4850be44cd663cb95597c6)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2019, STMicroelectronics
4  */
5 #include <assert.h>
6 #include <compiler.h>
7 #include <drivers/scmi-msg.h>
8 #include <drivers/scmi.h>
9 #include <drivers/stm32mp1_pmic.h>
10 #include <drivers/stm32mp1_pwr.h>
11 #include <drivers/stpmic1.h>
12 #include <dt-bindings/clock/stm32mp1-clks.h>
13 #include <dt-bindings/regulator/st,stm32mp15-regulator.h>
14 #include <dt-bindings/reset/stm32mp1-resets.h>
15 #include <initcall.h>
16 #include <mm/core_memprot.h>
17 #include <mm/core_mmu.h>
18 #include <platform_config.h>
19 #include <stdint.h>
20 #include <speculation_barrier.h>
21 #include <stm32_util.h>
22 #include <string.h>
23 #include <tee_api_defines.h>
24 #include <util.h>
25 
26 #define TIMEOUT_US_1MS		1000
27 
28 #define SCMI_CLOCK_NAME_SIZE	16
29 #define SCMI_RD_NAME_SIZE	16
30 #define SCMI_VOLTD_NAME_SIZE	16
31 
32 /*
33  * struct stm32_scmi_clk - Data for the exposed clock
34  * @clock_id: Clock identifier in RCC clock driver
35  * @name: Clock string ID exposed to agent
36  * @enabled: State of the SCMI clock
37  */
38 struct stm32_scmi_clk {
39 	unsigned long clock_id;
40 	const char *name;
41 	bool enabled;
42 };
43 
44 /*
45  * struct stm32_scmi_rd - Data for the exposed reset controller
46  * @reset_id: Reset identifier in RCC reset driver
47  * @name: Reset string ID exposed to agent
48  */
49 struct stm32_scmi_rd {
50 	unsigned long reset_id;
51 	const char *name;
52 };
53 
54 enum voltd_device {
55 	VOLTD_PWR,
56 	VOLTD_PMIC,
57 };
58 
59 /*
60  * struct stm32_scmi_voltd - Data for the exposed voltage domains
61  * @name: Power regulator string ID exposed to agent
62  * @priv_id: Internal string ID for the regulator
63  * @priv_dev: Internal ID for the device implementing the regulator
64  */
65 struct stm32_scmi_voltd {
66 	const char *name;
67 	const char *priv_id;
68 	enum voltd_device priv_dev;
69 
70 };
71 
72 /* Locate all non-secure SMT message buffers in last page of SYSRAM */
73 #define SMT_BUFFER_BASE		CFG_STM32MP1_SCMI_SHM_BASE
74 #define SMT_BUFFER0_BASE	SMT_BUFFER_BASE
75 #define SMT_BUFFER1_BASE	(SMT_BUFFER_BASE + 0x200)
76 
77 #if (SMT_BUFFER1_BASE + SMT_BUF_SLOT_SIZE > \
78 	CFG_STM32MP1_SCMI_SHM_BASE + CFG_STM32MP1_SCMI_SHM_SIZE)
79 #error "SCMI shared memory mismatch"
80 #endif
81 
82 register_phys_mem(MEM_AREA_IO_NSEC, CFG_STM32MP1_SCMI_SHM_BASE,
83 		  CFG_STM32MP1_SCMI_SHM_SIZE);
84 
85 static struct scmi_msg_channel scmi_channel[] = {
86 	[0] = {
87 		.agent_name = "stm32mp1-agent-0",
88 		.shm_addr = { .pa = SMT_BUFFER0_BASE, },
89 		.shm_size = SMT_BUF_SLOT_SIZE,
90 	},
91 	[1] = {
92 		.agent_name = "stm32mp1-agent-1",
93 		.shm_addr = { .pa = SMT_BUFFER1_BASE, },
94 		.shm_size = SMT_BUF_SLOT_SIZE,
95 	},
96 };
97 
98 struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id)
99 {
100 	assert(agent_id < ARRAY_SIZE(scmi_channel));
101 
102 	return &scmi_channel[agent_id];
103 }
104 
105 #define CLOCK_CELL(_scmi_id, _id, _name, _init_enabled) \
106 	[_scmi_id] = { \
107 		.clock_id = _id, \
108 		.name = _name, \
109 		.enabled = _init_enabled, \
110 	}
111 
112 struct stm32_scmi_clk stm32_scmi0_clock[] = {
113 	CLOCK_CELL(CK_SCMI0_HSE, CK_HSE, "ck_hse", true),
114 	CLOCK_CELL(CK_SCMI0_HSI, CK_HSI, "ck_hsi", true),
115 	CLOCK_CELL(CK_SCMI0_CSI, CK_CSI, "ck_csi", true),
116 	CLOCK_CELL(CK_SCMI0_LSE, CK_LSE, "ck_lse", true),
117 	CLOCK_CELL(CK_SCMI0_LSI, CK_LSI, "ck_lsi", true),
118 	CLOCK_CELL(CK_SCMI0_PLL2_Q, PLL2_Q, "pll2_q", true),
119 	CLOCK_CELL(CK_SCMI0_PLL2_R, PLL2_R, "pll2_r", true),
120 	CLOCK_CELL(CK_SCMI0_MPU, CK_MPU, "ck_mpu", true),
121 	CLOCK_CELL(CK_SCMI0_AXI, CK_AXI, "ck_axi", true),
122 	CLOCK_CELL(CK_SCMI0_BSEC, BSEC, "bsec", true),
123 	CLOCK_CELL(CK_SCMI0_CRYP1, CRYP1, "cryp1", false),
124 	CLOCK_CELL(CK_SCMI0_GPIOZ, GPIOZ, "gpioz", false),
125 	CLOCK_CELL(CK_SCMI0_HASH1, HASH1, "hash1", false),
126 	CLOCK_CELL(CK_SCMI0_I2C4, I2C4_K, "i2c4_k", false),
127 	CLOCK_CELL(CK_SCMI0_I2C6, I2C6_K, "i2c6_k", false),
128 	CLOCK_CELL(CK_SCMI0_IWDG1, IWDG1, "iwdg1", false),
129 	CLOCK_CELL(CK_SCMI0_RNG1, RNG1_K, "rng1_k", true),
130 	CLOCK_CELL(CK_SCMI0_RTC, RTC, "ck_rtc", true),
131 	CLOCK_CELL(CK_SCMI0_RTCAPB, RTCAPB, "rtcapb", true),
132 	CLOCK_CELL(CK_SCMI0_SPI6, SPI6_K, "spi6_k", false),
133 	CLOCK_CELL(CK_SCMI0_USART1, USART1_K, "usart1_k", false),
134 };
135 
136 struct stm32_scmi_clk stm32_scmi1_clock[] = {
137 	CLOCK_CELL(CK_SCMI1_PLL3_Q, PLL3_Q, "pll3_q", true),
138 	CLOCK_CELL(CK_SCMI1_PLL3_R, PLL3_R, "pll3_r", true),
139 	CLOCK_CELL(CK_SCMI1_MCU, CK_MCU, "ck_mcu", false),
140 };
141 
142 #define RESET_CELL(_scmi_id, _id, _name) \
143 	[_scmi_id] = { \
144 		.reset_id = _id, \
145 		.name = _name, \
146 	}
147 
148 struct stm32_scmi_rd stm32_scmi0_reset_domain[] = {
149 	RESET_CELL(RST_SCMI0_SPI6, SPI6_R, "spi6"),
150 	RESET_CELL(RST_SCMI0_I2C4, I2C4_R, "i2c4"),
151 	RESET_CELL(RST_SCMI0_I2C6, I2C6_R, "i2c6"),
152 	RESET_CELL(RST_SCMI0_USART1, USART1_R, "usart1"),
153 	RESET_CELL(RST_SCMI0_STGEN, STGEN_R, "stgen"),
154 	RESET_CELL(RST_SCMI0_GPIOZ, GPIOZ_R, "gpioz"),
155 	RESET_CELL(RST_SCMI0_CRYP1, CRYP1_R, "cryp1"),
156 	RESET_CELL(RST_SCMI0_HASH1, HASH1_R, "hash1"),
157 	RESET_CELL(RST_SCMI0_RNG1, RNG1_R, "rng1"),
158 	RESET_CELL(RST_SCMI0_MDMA, MDMA_R, "mdma"),
159 	RESET_CELL(RST_SCMI0_MCU, MCU_R, "mcu"),
160 	RESET_CELL(RST_SCMI0_MCU_HOLD_BOOT, MCU_HOLD_BOOT_R, "mcu_hold_boot"),
161 };
162 
163 #define VOLTD_CELL(_scmi_id, _dev_id, _priv_id, _name) \
164 	[_scmi_id] = { \
165 		.priv_id = (_priv_id), \
166 		.priv_dev = (_dev_id), \
167 		.name = (_name), \
168 	}
169 
170 #define PWR_REG11_NAME_ID		"0"
171 #define PWR_REG18_NAME_ID		"1"
172 #define PWR_USB33_NAME_ID		"2"
173 
174 struct stm32_scmi_voltd scmi0_voltage_domain[] = {
175 	VOLTD_CELL(VOLTD_SCMI0_REG11, VOLTD_PWR, PWR_REG11_NAME_ID, "reg11"),
176 	VOLTD_CELL(VOLTD_SCMI0_REG18, VOLTD_PWR, PWR_REG18_NAME_ID, "reg18"),
177 	VOLTD_CELL(VOLTD_SCMI0_USB33, VOLTD_PWR, PWR_USB33_NAME_ID, "usb33"),
178 };
179 
180 struct scmi_agent_resources {
181 	struct stm32_scmi_clk *clock;
182 	size_t clock_count;
183 	struct stm32_scmi_rd *rd;
184 	size_t rd_count;
185 	struct stm32_scmi_pd *pd;
186 	size_t pd_count;
187 	struct stm32_scmi_perfs *perfs;
188 	size_t perfs_count;
189 	struct stm32_scmi_voltd *voltd;
190 	size_t voltd_count;
191 };
192 
193 const struct scmi_agent_resources agent_resources[] = {
194 	[0] = {
195 		.clock = stm32_scmi0_clock,
196 		.clock_count = ARRAY_SIZE(stm32_scmi0_clock),
197 		.rd = stm32_scmi0_reset_domain,
198 		.rd_count = ARRAY_SIZE(stm32_scmi0_reset_domain),
199 		.voltd = scmi0_voltage_domain,
200 		.voltd_count = ARRAY_SIZE(scmi0_voltage_domain),
201 	},
202 	[1] = {
203 		.clock = stm32_scmi1_clock,
204 		.clock_count = ARRAY_SIZE(stm32_scmi1_clock),
205 	},
206 };
207 
208 static const struct scmi_agent_resources *find_resource(unsigned int agent_id)
209 {
210 	assert(agent_id < ARRAY_SIZE(agent_resources));
211 
212 	return &agent_resources[agent_id];
213 }
214 
215 static size_t __maybe_unused plat_scmi_protocol_count_paranoid(void)
216 {
217 	unsigned int n = 0;
218 	unsigned int count = 0;
219 	const size_t agent_count = ARRAY_SIZE(agent_resources);
220 
221 	for (n = 0; n < agent_count; n++)
222 		if (agent_resources[n].clock_count)
223 			break;
224 	if (n < agent_count)
225 		count++;
226 
227 	for (n = 0; n < agent_count; n++)
228 		if (agent_resources[n].rd_count)
229 			break;
230 	if (n < agent_count)
231 		count++;
232 
233 	for (n = 0; n < agent_count; n++)
234 		if (agent_resources[n].pd_count)
235 			break;
236 	if (n < agent_count)
237 		count++;
238 
239 	for (n = 0; n < agent_count; n++)
240 		if (agent_resources[n].perfs_count)
241 			break;
242 	if (n < agent_count)
243 		count++;
244 
245 	for (n = 0; n < agent_count; n++)
246 		if (agent_resources[n].voltd_count)
247 			break;
248 	if (n < agent_count)
249 		count++;
250 
251 	return count;
252 }
253 
254 static const char vendor[] = "ST";
255 static const char sub_vendor[] = "";
256 
257 const char *plat_scmi_vendor_name(void)
258 {
259 	return vendor;
260 }
261 
262 const char *plat_scmi_sub_vendor_name(void)
263 {
264 	return sub_vendor;
265 }
266 
267 /* Currently supporting Clocks and Reset Domains */
268 static const uint8_t plat_protocol_list[] = {
269 	SCMI_PROTOCOL_ID_CLOCK,
270 	SCMI_PROTOCOL_ID_RESET_DOMAIN,
271 	SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN,
272 	0 /* Null termination */
273 };
274 
275 size_t plat_scmi_protocol_count(void)
276 {
277 	const size_t count = ARRAY_SIZE(plat_protocol_list) - 1;
278 
279 	assert(count == plat_scmi_protocol_count_paranoid());
280 
281 	return count;
282 }
283 
284 const uint8_t *plat_scmi_protocol_list(unsigned int agent_id __unused)
285 {
286 	assert(plat_scmi_protocol_count_paranoid() ==
287 	       (ARRAY_SIZE(plat_protocol_list) - 1));
288 
289 	return plat_protocol_list;
290 }
291 
292 /*
293  * Platform SCMI clocks
294  */
295 static struct stm32_scmi_clk *find_clock(unsigned int agent_id,
296 					 unsigned int scmi_id)
297 {
298 	const struct scmi_agent_resources *resource = find_resource(agent_id);
299 	size_t n = 0;
300 
301 	if (resource) {
302 		for (n = 0; n < resource->clock_count; n++)
303 			if (n == scmi_id)
304 				return &resource->clock[n];
305 	}
306 
307 	return NULL;
308 }
309 
310 size_t plat_scmi_clock_count(unsigned int agent_id)
311 {
312 	const struct scmi_agent_resources *resource = find_resource(agent_id);
313 
314 	if (!resource)
315 		return 0;
316 
317 	return resource->clock_count;
318 }
319 
320 const char *plat_scmi_clock_get_name(unsigned int agent_id,
321 				     unsigned int scmi_id)
322 {
323 	struct stm32_scmi_clk *clock = find_clock(agent_id, scmi_id);
324 
325 	if (!clock || !stm32mp_nsec_can_access_clock(clock->clock_id))
326 		return NULL;
327 
328 	return clock->name;
329 }
330 
331 int32_t plat_scmi_clock_rates_array(unsigned int agent_id, unsigned int scmi_id,
332 				    size_t start_index, unsigned long *array,
333 				    size_t *nb_elts)
334 {
335 	struct stm32_scmi_clk *clock = find_clock(agent_id, scmi_id);
336 
337 	if (!clock)
338 		return SCMI_NOT_FOUND;
339 
340 	if (!stm32mp_nsec_can_access_clock(clock->clock_id))
341 		return SCMI_DENIED;
342 
343 	/* Exposed clocks are currently fixed rate clocks */
344 	if (start_index)
345 		return SCMI_INVALID_PARAMETERS;
346 
347 	if (!array)
348 		*nb_elts = 1;
349 	else if (*nb_elts == 1)
350 		*array = stm32_clock_get_rate(clock->clock_id);
351 	else
352 		return SCMI_GENERIC_ERROR;
353 
354 	return SCMI_SUCCESS;
355 }
356 
357 unsigned long plat_scmi_clock_get_rate(unsigned int agent_id,
358 				       unsigned int scmi_id)
359 {
360 	struct stm32_scmi_clk *clock = find_clock(agent_id, scmi_id);
361 
362 	if (!clock || !stm32mp_nsec_can_access_clock(clock->clock_id))
363 		return 0;
364 
365 	return stm32_clock_get_rate(clock->clock_id);
366 }
367 
368 int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id)
369 {
370 	struct stm32_scmi_clk *clock = find_clock(agent_id, scmi_id);
371 
372 	if (!clock || !stm32mp_nsec_can_access_clock(clock->clock_id))
373 		return 0;
374 
375 	return (int32_t)clock->enabled;
376 }
377 
378 int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id,
379 				  bool enable_not_disable)
380 {
381 	struct stm32_scmi_clk *clock = find_clock(agent_id, scmi_id);
382 
383 	if (!clock)
384 		return SCMI_NOT_FOUND;
385 
386 	if (!stm32mp_nsec_can_access_clock(clock->clock_id))
387 		return SCMI_DENIED;
388 
389 	if (enable_not_disable) {
390 		if (!clock->enabled) {
391 			DMSG("SCMI clock %u enable", scmi_id);
392 			stm32_clock_enable(clock->clock_id);
393 			clock->enabled = true;
394 		}
395 	} else {
396 		if (clock->enabled) {
397 			DMSG("SCMI clock %u disable", scmi_id);
398 			stm32_clock_disable(clock->clock_id);
399 			clock->enabled = false;
400 		}
401 	}
402 
403 	return SCMI_SUCCESS;
404 }
405 
406 /*
407  * Platform SCMI reset domains
408  */
409 static struct stm32_scmi_rd *find_rd(unsigned int agent_id,
410 				     unsigned int scmi_id)
411 {
412 	const struct scmi_agent_resources *resource = find_resource(agent_id);
413 	size_t n = 0;
414 
415 	if (resource) {
416 		for (n = 0; n < resource->rd_count; n++)
417 			if (n == scmi_id)
418 				return &resource->rd[n];
419 	}
420 
421 	return NULL;
422 }
423 
424 const char *plat_scmi_rd_get_name(unsigned int agent_id, unsigned int scmi_id)
425 {
426 	const struct stm32_scmi_rd *rd = find_rd(agent_id, scmi_id);
427 
428 	if (!rd)
429 		return NULL;
430 
431 	return rd->name;
432 }
433 
434 size_t plat_scmi_rd_count(unsigned int agent_id)
435 {
436 	const struct scmi_agent_resources *resource = find_resource(agent_id);
437 
438 	if (!resource)
439 		return 0;
440 
441 	return resource->rd_count;
442 }
443 
444 int32_t plat_scmi_rd_autonomous(unsigned int agent_id, unsigned int scmi_id,
445 				uint32_t state)
446 {
447 	const struct stm32_scmi_rd *rd = find_rd(agent_id, scmi_id);
448 
449 	if (!rd)
450 		return SCMI_NOT_FOUND;
451 
452 	if (!stm32mp_nsec_can_access_reset(rd->reset_id))
453 		return SCMI_DENIED;
454 
455 	if (rd->reset_id == MCU_HOLD_BOOT_R)
456 		return SCMI_NOT_SUPPORTED;
457 
458 	/* Supports only reset with context loss */
459 	if (state)
460 		return SCMI_NOT_SUPPORTED;
461 
462 	DMSG("SCMI reset %u cycle", scmi_id);
463 
464 	if (stm32_reset_assert(rd->reset_id, TIMEOUT_US_1MS))
465 		return SCMI_HARDWARE_ERROR;
466 
467 	if (stm32_reset_deassert(rd->reset_id, TIMEOUT_US_1MS))
468 		return SCMI_HARDWARE_ERROR;
469 
470 	return SCMI_SUCCESS;
471 }
472 
473 int32_t plat_scmi_rd_set_state(unsigned int agent_id, unsigned int scmi_id,
474 			       bool assert_not_deassert)
475 {
476 	const struct stm32_scmi_rd *rd = find_rd(agent_id, scmi_id);
477 
478 	if (!rd)
479 		return SCMI_NOT_FOUND;
480 
481 	if (!stm32mp_nsec_can_access_reset(rd->reset_id))
482 		return SCMI_DENIED;
483 
484 	if (rd->reset_id == MCU_HOLD_BOOT_R) {
485 		DMSG("SCMI MCU hold boot %s",
486 		     assert_not_deassert ? "set" : "release");
487 		stm32_reset_assert_deassert_mcu(assert_not_deassert);
488 		return SCMI_SUCCESS;
489 	}
490 
491 	if (assert_not_deassert) {
492 		DMSG("SCMI reset %u set", scmi_id);
493 		stm32_reset_set(rd->reset_id);
494 	} else {
495 		DMSG("SCMI reset %u release", scmi_id);
496 		stm32_reset_release(rd->reset_id);
497 	}
498 
499 	return SCMI_SUCCESS;
500 }
501 
502 /*
503  * Platform SCMI voltage domains
504  */
505 static struct stm32_scmi_voltd *find_voltd(unsigned int agent_id,
506 					   unsigned int scmi_id)
507 {
508 	const struct scmi_agent_resources *resource = find_resource(agent_id);
509 	size_t n = 0;
510 
511 	if (resource) {
512 		for (n = 0; n < resource->voltd_count; n++)
513 			if (n == scmi_id)
514 				return &resource->voltd[n];
515 	}
516 
517 	return NULL;
518 }
519 
520 size_t plat_scmi_voltd_count(unsigned int agent_id)
521 {
522 	const struct scmi_agent_resources *resource = find_resource(agent_id);
523 
524 	if (!resource)
525 		return 0;
526 
527 	return resource->voltd_count;
528 }
529 
530 const char *plat_scmi_voltd_get_name(unsigned int agent_id,
531 				     unsigned int scmi_id)
532 {
533 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
534 
535 	/* Currently non-secure is allowed to access all PWR regulators */
536 	if (!voltd)
537 		return NULL;
538 
539 	return voltd->name;
540 }
541 
542 static enum pwr_regulator pwr_scmi_to_regu_id(struct stm32_scmi_voltd *voltd)
543 {
544 	if (!strcmp(voltd->priv_id, PWR_REG11_NAME_ID))
545 		return PWR_REG11;
546 	if (!strcmp(voltd->priv_id, PWR_REG18_NAME_ID))
547 		return PWR_REG18;
548 	if (!strcmp(voltd->priv_id, PWR_USB33_NAME_ID))
549 		return PWR_USB33;
550 
551 	panic();
552 }
553 
554 static long pwr_get_level(struct stm32_scmi_voltd *voltd)
555 {
556 	enum pwr_regulator regu_id = pwr_scmi_to_regu_id(voltd);
557 
558 	return (long)stm32mp1_pwr_regulator_mv(regu_id) * 1000;
559 }
560 
561 static int32_t pwr_set_level(struct stm32_scmi_voltd *voltd, long level_uv)
562 {
563 	if (level_uv != pwr_get_level(voltd))
564 		return SCMI_INVALID_PARAMETERS;
565 
566 	return SCMI_SUCCESS;
567 }
568 
569 static int32_t pwr_describe_levels(struct stm32_scmi_voltd *voltd,
570 				   size_t start_index, long *microvolt,
571 				   size_t *nb_elts)
572 {
573 	if (start_index)
574 		return SCMI_INVALID_PARAMETERS;
575 
576 	if (!microvolt) {
577 		*nb_elts = 1;
578 		return SCMI_SUCCESS;
579 	}
580 
581 	if (*nb_elts < 1)
582 		return SCMI_GENERIC_ERROR;
583 
584 	*nb_elts = 1;
585 	*microvolt = pwr_get_level(voltd);
586 
587 	return SCMI_SUCCESS;
588 }
589 
590 static uint32_t pwr_get_state(struct stm32_scmi_voltd *voltd)
591 {
592 	enum pwr_regulator regu_id = pwr_scmi_to_regu_id(voltd);
593 
594 	if (stm32mp1_pwr_regulator_is_enabled(regu_id))
595 		return SCMI_VOLTAGE_DOMAIN_CONFIG_ARCH_ON;
596 
597 	return SCMI_VOLTAGE_DOMAIN_CONFIG_ARCH_OFF;
598 }
599 
600 static void pwr_set_state(struct stm32_scmi_voltd *voltd, bool enable)
601 {
602 	enum pwr_regulator regu_id = pwr_scmi_to_regu_id(voltd);
603 
604 	DMSG("%sable PWR %s (was %s)", enable ? "En" : "Dis", voltd->name,
605 	     stm32mp1_pwr_regulator_is_enabled(regu_id) ? "on" : "off");
606 
607 	stm32mp1_pwr_regulator_set_state(regu_id, enable);
608 }
609 
610 static int32_t pmic_describe_levels(struct stm32_scmi_voltd *voltd,
611 				    size_t start_index, long *microvolt,
612 				    size_t *nb_elts)
613 {
614 	const uint16_t *levels = NULL;
615 	size_t full_count = 0;
616 	size_t out_count = 0;
617 	size_t i = 0;
618 
619 	if (!stm32mp_nsec_can_access_pmic_regu(voltd->priv_id))
620 		return SCMI_DENIED;
621 
622 	stpmic1_regulator_levels_mv(voltd->priv_id, &levels, &full_count);
623 
624 	if (!microvolt) {
625 		*nb_elts = full_count - start_index;
626 		return SCMI_SUCCESS;
627 	}
628 
629 	if (SUB_OVERFLOW(full_count, start_index, &out_count))
630 		return SCMI_GENERIC_ERROR;
631 
632 	out_count = MIN(out_count, *nb_elts);
633 
634 	FMSG("%zu levels: start %zu requested %zu output %zu",
635 	     full_count, start_index, *nb_elts, out_count);
636 
637 	for (i = 0; i < out_count; i++)
638 		microvolt[i] = levels[start_index + i] * 1000;
639 
640 	*nb_elts = out_count;
641 
642 	return SCMI_SUCCESS;
643 }
644 
645 static long pmic_get_level(struct stm32_scmi_voltd *voltd)
646 {
647 	unsigned long level_mv = 0;
648 
649 	if (!stm32mp_nsec_can_access_pmic_regu(voltd->priv_id))
650 		return 0;
651 
652 	stm32mp_get_pmic();
653 	level_mv = stpmic1_regulator_voltage_get(voltd->priv_id);
654 	stm32mp_put_pmic();
655 
656 	return (long)level_mv * 1000;
657 }
658 
659 static int32_t pmic_set_level(struct stm32_scmi_voltd *voltd, long level_uv)
660 {
661 	int rc = 0;
662 	unsigned int level_mv = 0;
663 
664 	if (!stm32mp_nsec_can_access_pmic_regu(voltd->priv_id))
665 		return SCMI_DENIED;
666 
667 	if (level_uv < 0 || level_uv > (UINT16_MAX * 1000))
668 		return SCMI_INVALID_PARAMETERS;
669 
670 	level_mv = (unsigned int)level_uv / 1000;
671 
672 	DMSG("Set STPMIC1 regulator %s level to %dmV", voltd->name, level_mv);
673 
674 	stm32mp_get_pmic();
675 	rc = stpmic1_regulator_voltage_set(voltd->priv_id, level_mv);
676 	stm32mp_put_pmic();
677 
678 	return rc ? SCMI_GENERIC_ERROR : SCMI_SUCCESS;
679 }
680 
681 static uint32_t pmic_get_state(struct stm32_scmi_voltd *voltd)
682 {
683 	bool enabled = false;
684 
685 	if (!stm32mp_nsec_can_access_pmic_regu(voltd->priv_id))
686 		return SCMI_VOLTAGE_DOMAIN_CONFIG_ARCH_OFF;
687 
688 	stm32mp_get_pmic();
689 	enabled = stpmic1_is_regulator_enabled(voltd->priv_id);
690 	stm32mp_put_pmic();
691 
692 	if (enabled)
693 		return SCMI_VOLTAGE_DOMAIN_CONFIG_ARCH_ON;
694 
695 	return SCMI_VOLTAGE_DOMAIN_CONFIG_ARCH_OFF;
696 }
697 
698 static int32_t pmic_set_state(struct stm32_scmi_voltd *voltd, bool enable)
699 {
700 	int rc = 0;
701 
702 	if (!stm32mp_nsec_can_access_pmic_regu(voltd->priv_id))
703 		return SCMI_DENIED;
704 
705 	stm32mp_get_pmic();
706 
707 	DMSG("%sable STPMIC1 %s (was %s)", enable ? "En" : "Dis", voltd->name,
708 	     stpmic1_is_regulator_enabled(voltd->priv_id) ? "on" : "off");
709 
710 	if (enable)
711 		rc = stpmic1_regulator_enable(voltd->priv_id);
712 	else
713 		rc = stpmic1_regulator_disable(voltd->priv_id);
714 
715 	stm32mp_put_pmic();
716 
717 	return rc ? SCMI_GENERIC_ERROR : SCMI_SUCCESS;
718 }
719 
720 int32_t plat_scmi_voltd_levels_array(unsigned int agent_id,
721 				     unsigned int scmi_id, size_t start_index,
722 				     long *levels, size_t *nb_elts)
723 
724 {
725 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
726 
727 	if (!voltd)
728 		return SCMI_NOT_FOUND;
729 
730 	switch (voltd->priv_dev) {
731 	case VOLTD_PWR:
732 		return pwr_describe_levels(voltd, start_index, levels, nb_elts);
733 	case VOLTD_PMIC:
734 		return pmic_describe_levels(voltd, start_index, levels,
735 					    nb_elts);
736 	default:
737 		return SCMI_GENERIC_ERROR;
738 	}
739 }
740 
741 long plat_scmi_voltd_get_level(unsigned int agent_id, unsigned int scmi_id)
742 {
743 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
744 
745 	if (!voltd)
746 		return 0;
747 
748 	switch (voltd->priv_dev) {
749 	case VOLTD_PWR:
750 		return pwr_get_level(voltd);
751 	case VOLTD_PMIC:
752 		return pmic_get_level(voltd);
753 	default:
754 		panic();
755 	}
756 }
757 
758 int32_t plat_scmi_voltd_set_level(unsigned int agent_id, unsigned int scmi_id,
759 				  long level)
760 {
761 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
762 
763 	if (!voltd)
764 		return SCMI_NOT_FOUND;
765 
766 	switch (voltd->priv_dev) {
767 	case VOLTD_PWR:
768 		return pwr_set_level(voltd, level);
769 	case VOLTD_PMIC:
770 		return pmic_set_level(voltd, level);
771 	default:
772 		return SCMI_GENERIC_ERROR;
773 	}
774 }
775 
776 int32_t plat_scmi_voltd_get_config(unsigned int agent_id, unsigned int scmi_id,
777 				   uint32_t *config)
778 {
779 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
780 
781 	if (!voltd)
782 		return SCMI_NOT_FOUND;
783 
784 	switch (voltd->priv_dev) {
785 	case VOLTD_PWR:
786 		*config = pwr_get_state(voltd);
787 		break;
788 	case VOLTD_PMIC:
789 		*config = pmic_get_state(voltd);
790 		break;
791 	default:
792 		return SCMI_GENERIC_ERROR;
793 	}
794 
795 	return SCMI_SUCCESS;
796 }
797 
798 int32_t plat_scmi_voltd_set_config(unsigned int agent_id, unsigned int scmi_id,
799 				   uint32_t config)
800 {
801 	struct stm32_scmi_voltd *voltd = find_voltd(agent_id, scmi_id);
802 	int32_t rc = SCMI_SUCCESS;
803 
804 	if (!voltd)
805 		return SCMI_NOT_FOUND;
806 
807 	switch (voltd->priv_dev) {
808 	case VOLTD_PWR:
809 		pwr_set_state(voltd, config);
810 		break;
811 	case VOLTD_PMIC:
812 		rc = pmic_set_state(voltd, config);
813 		break;
814 	default:
815 		return SCMI_GENERIC_ERROR;
816 	}
817 
818 	return rc;
819 }
820 
821 /*
822  * Initialize platform SCMI resources
823  */
824 static TEE_Result stm32mp1_init_scmi_server(void)
825 {
826 	size_t i = 0;
827 	size_t j = 0;
828 
829 	for (i = 0; i < ARRAY_SIZE(scmi_channel); i++) {
830 		struct scmi_msg_channel *chan = &scmi_channel[i];
831 
832 		/* Enforce non-secure shm mapped as device memory */
833 		chan->shm_addr.va = (vaddr_t)phys_to_virt(chan->shm_addr.pa,
834 							  MEM_AREA_IO_NSEC);
835 		assert(chan->shm_addr.va);
836 
837 		scmi_smt_init_agent_channel(chan);
838 	}
839 
840 	for (i = 0; i < ARRAY_SIZE(agent_resources); i++) {
841 		const struct scmi_agent_resources *res = &agent_resources[i];
842 
843 		for (j = 0; j < res->clock_count; j++) {
844 			struct stm32_scmi_clk *clk = &res->clock[j];
845 
846 			if (!clk->name ||
847 			    strlen(clk->name) >= SCMI_CLOCK_NAME_SIZE)
848 				panic("SCMI clock name invalid");
849 
850 			/* Sync SCMI clocks with their targeted initial state */
851 			if (clk->enabled &&
852 			    stm32mp_nsec_can_access_clock(clk->clock_id))
853 				stm32_clock_enable(clk->clock_id);
854 		}
855 
856 		for (j = 0; j < res->rd_count; j++) {
857 			struct stm32_scmi_rd *rd = &res->rd[j];
858 
859 			if (!rd->name ||
860 			    strlen(rd->name) >= SCMI_RD_NAME_SIZE)
861 				panic("SCMI reset domain name invalid");
862 		}
863 
864 		for (j = 0; j < res->voltd_count; j++) {
865 			struct stm32_scmi_voltd *voltd = &res->voltd[j];
866 
867 			if (!voltd->name ||
868 			    strlen(voltd->name) >= SCMI_VOLTD_NAME_SIZE)
869 				panic("SCMI voltage domain name invalid");
870 		}
871 	}
872 
873 	return TEE_SUCCESS;
874 }
875 
876 driver_init_late(stm32mp1_init_scmi_server);
877