1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2022, Linaro Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <arch_main.h>
9 #include <fwk_element.h>
10 #include <fwk_id.h>
11 #include <fwk_module.h>
12 #include <fwk_module_idx.h>
13 
14 #include <mod_optee_mbx.h>
15 #include <mod_optee_smt.h>
16 #include <scmi_agents.h>
17 
18 #include <stdint.h>
19 
20 #define OSPM0_SMT_MAILBOX_PA            0x2ffff000
21 #define OSPM0_SMT_MAILBOX_SIZE          SCMI_SHMEM_SIZE
22 
23 static const struct fwk_element mbx_element_table[] = {
24     [SCMI_CHANNEL_DEVICE_IDX_NS0] = {
25         .name = "SCMI non-secure to OP-TEE channel 0",
26         .data = &((struct mod_optee_mbx_channel_config){
27             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_OPTEE_SMT, 0),
28             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_OPTEE_SMT,
29                                              MOD_OPTEE_SMT_API_IDX_DRIVER_INPUT)
30         })
31     },
32     [SCMI_CHANNEL_DEVICE_IDX_COUNT] = { 0 },
33 };
34 
mbx_get_element_table(fwk_id_t module_id)35 static const struct fwk_element *mbx_get_element_table(fwk_id_t module_id)
36 {
37     return (const struct fwk_element *)mbx_element_table;
38 }
39 
40 struct fwk_module_config config_optee_mbx = {
41     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(mbx_get_element_table),
42 };
43 
44 static struct fwk_element smt_elt_table[] = {
45     [0] = {
46         .name = "OSPM0",
47         .data = &((struct mod_optee_smt_channel_config) {
48             .type = MOD_OPTEE_SMT_CHANNEL_TYPE_REQUESTER,
49             .mailbox_address = OSPM0_SMT_MAILBOX_PA,
50             .mailbox_size = OSPM0_SMT_MAILBOX_SIZE,
51             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_OPTEE_MBX,
52                                              SCMI_CHANNEL_DEVICE_IDX_NS0),
53             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_OPTEE_MBX, 0),
54         })
55     },
56     [1] = { 0 },
57 };
58 
smt_get_element_table(fwk_id_t module_id)59 static const struct fwk_element *smt_get_element_table(fwk_id_t module_id)
60 {
61     fwk_assert(fwk_id_get_module_idx(module_id) == FWK_MODULE_IDX_OPTEE_SMT);
62 
63     return (const struct fwk_element *)smt_elt_table;
64 }
65 
66 struct fwk_module_config config_optee_smt = {
67     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(smt_get_element_table),
68 };
69