xref: /optee_os/core/lib/scmi-server/scmi_server.c (revision 273a583ea99627ff3b8ccbbaedbdacecd0909b2e)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2019-2022, Linaro Limited
4  * Copyright (c) 2025, STMicroelectronics
5  */
6 
7 #include <arch_main.h>
8 #include <config.h>
9 #include <initcall.h>
10 #include <kernel/panic.h>
11 #include <mm/core_memprot.h>
12 #include <optee_scmi.h>
13 #include <scmi_agent_configuration.h>
14 #include <scmi/scmi_server.h>
15 
16 /*
17  * OP-TEE helper function exported to SCP-firmware
18  */
19 uintptr_t smt_phys_to_virt(uintptr_t pa, size_t sz, bool shmem_is_secure)
20 {
21 	if (shmem_is_secure)
22 		return (uintptr_t)phys_to_virt(pa, MEM_AREA_IO_SEC, sz);
23 	else
24 		return (uintptr_t)phys_to_virt(pa, MEM_AREA_IO_NSEC, sz);
25 }
26 
27 /*
28  * SCMI server APIs exported to OP-TEE core
29  */
30 int scmi_server_get_channels_count(void)
31 {
32 	return scmi_get_devices_count();
33 }
34 
35 TEE_Result scmi_server_get_channel(unsigned int channel_id, int *handle)
36 {
37 	int fwk_id = 0;
38 
39 	fwk_id = scmi_get_device(channel_id);
40 	if (fwk_id < 0)
41 		return TEE_ERROR_BAD_PARAMETERS;
42 
43 	if (handle)
44 		*handle = fwk_id;
45 
46 	return TEE_SUCCESS;
47 }
48 
49 TEE_Result scmi_server_smt_process_thread(unsigned int channel_id)
50 {
51 	TEE_Result res = TEE_ERROR_GENERIC;
52 	int fwk_id = 0;
53 
54 	res = scmi_server_get_channel(channel_id, &fwk_id);
55 	if (!res)
56 		scmi_process_mbx_smt(fwk_id);
57 
58 	return res;
59 }
60 
61 TEE_Result scmi_server_msg_process_thread(unsigned int channel_id,
62 					  void *in_buf, size_t in_sz,
63 					  void *out_buf, size_t *out_sz)
64 {
65 	TEE_Result res = TEE_ERROR_GENERIC;
66 	int fwk_id = 0;
67 
68 	res = scmi_server_get_channel(channel_id, &fwk_id);
69 	if (!res)
70 		scmi_process_mbx_msg(fwk_id, in_buf, in_sz, out_buf, out_sz);
71 
72 	return res;
73 }
74 
75 static TEE_Result scmi_server_initialize(void)
76 {
77 	int rc = 0;
78 
79 	if (IS_ENABLED(CFG_SCMI_SCPFW_FROM_DT)) {
80 		struct scpfw_config *cfg = scmi_scpfw_get_configuration();
81 
82 		assert(cfg);
83 		rc = scmi_configure(cfg);
84 		if (rc < 0) {
85 			EMSG("SCMI server configuration failed: %d", rc);
86 			panic();
87 		}
88 		scmi_scpfw_release_configuration();
89 	}
90 
91 	rc = scmi_arch_init();
92 	if (rc < 0) {
93 		EMSG("SCMI server init failed: %d", rc);
94 		panic();
95 	}
96 
97 	return TEE_SUCCESS;
98 }
99 
100 boot_final(scmi_server_initialize);
101