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