1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <config_power_domain.h>
9 #include <morello_core.h>
10 #include <morello_scp_mhu.h>
11 #include <morello_scp_mmap.h>
12 #include <morello_scp_scmi.h>
13 #include <morello_scp_software_mmap.h>
14 
15 #include <mod_transport.h>
16 
17 #include <fwk_element.h>
18 #include <fwk_id.h>
19 #include <fwk_module.h>
20 #include <fwk_module_idx.h>
21 
22 #include <stdint.h>
23 
24 static const struct fwk_element
25     transport_element_table[SCP_MORELLO_SCMI_SERVICE_IDX_COUNT + 1] = {
26             [SCP_MORELLO_SCMI_SERVICE_IDX_PSCI] = {
27                     .name = "PSCI",
28                     .data = &((struct mod_transport_channel_config){
29                         .channel_type =
30                             MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
31                         .policies =
32                             MOD_TRANSPORT_POLICY_INIT_MAILBOX |
33                             MOD_TRANSPORT_POLICY_SECURE,
34                         .out_band_mailbox_address =
35                             SCP_AP_SHARED_SECURE_RAM,
36                         .out_band_mailbox_size =
37                             SCP_SCMI_PAYLOAD_SIZE,
38                         .driver_id =
39                             FWK_ID_SUB_ELEMENT_INIT(
40                                 FWK_MODULE_IDX_MHU,
41                                 MORELLO_MHU_DEVICE_IDX_S_CLUS0,
42                                 0),
43                         .driver_api_id =
44                             FWK_ID_API_INIT(
45                                 FWK_MODULE_IDX_MHU,
46                                 0),
47                     }),
48             },
49             [SCP_MORELLO_SCMI_SERVICE_IDX_OSPM] = {
50                     .name = "OSPM",
51                     .data = &((struct mod_transport_channel_config){
52                         .channel_type =
53                             MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
54                         .policies =
55                             MOD_TRANSPORT_POLICY_INIT_MAILBOX,
56                         .out_band_mailbox_address =
57                             SCP_AP_BASE_NS_MAILBOX_SRAM,
58                         .out_band_mailbox_size =
59                             SCP_SCMI_PAYLOAD_SIZE,
60                         .driver_id =
61                             FWK_ID_SUB_ELEMENT_INIT(
62                                 FWK_MODULE_IDX_MHU,
63                                 MORELLO_MHU_DEVICE_IDX_NS_CLUS0,
64                                 0),
65                         .driver_api_id =
66                             FWK_ID_API_INIT(
67                                 FWK_MODULE_IDX_MHU,
68                                 0),
69                     }),
70             },
71             [SCP_MORELLO_SCMI_SERVICE_IDX_MCP] = {
72                     .name = "MCP",
73                     .data = &((struct mod_transport_channel_config){
74                         .channel_type =
75                            MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
76                         .policies =
77                            MOD_TRANSPORT_POLICY_INIT_MAILBOX |
78                            MOD_TRANSPORT_POLICY_SECURE,
79                         .out_band_mailbox_address =
80                            SCP_MCP_SHARED_SECURE_RAM,
81                         .out_band_mailbox_size =
82                            SCP_SCMI_PAYLOAD_SIZE,
83                         .driver_id = FWK_ID_SUB_ELEMENT_INIT(
84                            FWK_MODULE_IDX_MHU,
85                            MORELLO_MHU_DEVICE_IDX_S_MCP,
86                            0),
87                         .driver_api_id = FWK_ID_API_INIT(
88                            FWK_MODULE_IDX_MHU,
89                            0),
90                         }),
91             },
92             [SCP_MORELLO_SCMI_SERVICE_IDX_COUNT] = { 0 },
93 };
94 
transport_get_element_table(fwk_id_t module_id)95 static const struct fwk_element *transport_get_element_table(fwk_id_t module_id)
96 {
97     unsigned int idx;
98     struct mod_transport_channel_config *config;
99 
100     for (idx = 0; idx < SCP_MORELLO_SCMI_SERVICE_IDX_COUNT; idx++) {
101         config =
102             (struct mod_transport_channel_config *)(transport_element_table[idx]
103                                                         .data);
104         config->pd_source_id = FWK_ID_ELEMENT(
105             FWK_MODULE_IDX_POWER_DOMAIN, PD_SINGLE_CHIP_IDX_SYSTOP0);
106     }
107 
108     return transport_element_table;
109 }
110 
111 const struct fwk_module_config config_transport = {
112     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(transport_get_element_table),
113 };
114