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 */
smt_phys_to_virt(uintptr_t pa,size_t sz,bool shmem_is_secure)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 */
scmi_server_get_channels_count(void)30 int scmi_server_get_channels_count(void)
31 {
32 return scmi_get_devices_count();
33 }
34
scmi_server_get_channel(unsigned int channel_id,int * handle)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
scmi_server_smt_process_thread(unsigned int channel_id)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
scmi_server_msg_process_thread(unsigned int channel_id,void * in_buf,size_t in_sz,void * out_buf,size_t * out_sz)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
scmi_server_initialize(void)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