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