1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2020-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 =
29                 &(struct mod_transport_channel_config){
30                     .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
31                     .policies =
32                         MOD_TRANSPORT_POLICY_INIT_MAILBOX | MOD_TRANSPORT_POLICY_SECURE,
33                     .out_band_mailbox_address = SCP_AP_SHARED_SECURE_RAM,
34                     .out_band_mailbox_size = SCP_SCMI_PAYLOAD_SIZE,
35                     .driver_id = FWK_ID_SUB_ELEMENT_INIT(
36                         FWK_MODULE_IDX_MHU,
37                         MORELLO_MHU_DEVICE_IDX_S_CLUS0,
38                         0),
39                     .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
40                 },
41         },
42         [SCP_MORELLO_SCMI_SERVICE_IDX_OSPM] = {
43             .name = "OSPM",
44             .data =
45                 &(struct mod_transport_channel_config){
46                     .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
47                     .policies = MOD_TRANSPORT_POLICY_INIT_MAILBOX,
48                     .out_band_mailbox_address = SCP_AP_BASE_NS_MAILBOX_SRAM,
49                     .out_band_mailbox_size = SCP_SCMI_PAYLOAD_SIZE,
50                     .driver_id = FWK_ID_SUB_ELEMENT_INIT(
51                         FWK_MODULE_IDX_MHU,
52                         MORELLO_MHU_DEVICE_IDX_NS_CLUS0,
53                         0),
54                     .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
55                 },
56         },
57         [SCP_MORELLO_SCMI_SERVICE_IDX_MCP] = {
58             .name = "MCP",
59             .data =
60                 &(struct mod_transport_channel_config){
61                     .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
62                     .policies =
63                         MOD_TRANSPORT_POLICY_INIT_MAILBOX | MOD_TRANSPORT_POLICY_SECURE,
64                     .out_band_mailbox_address = SCP_MCP_SHARED_SECURE_RAM,
65                     .out_band_mailbox_size = SCP_SCMI_PAYLOAD_SIZE,
66                     .driver_id = FWK_ID_SUB_ELEMENT_INIT(
67                         FWK_MODULE_IDX_MHU,
68                         MORELLO_MHU_DEVICE_IDX_S_MCP,
69                         0),
70                     .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
71                 },
72         },
73         [SCP_MORELLO_SCMI_SERVICE_IDX_COUNT] = { 0 },
74 };
75 
transport_get_element_table(fwk_id_t module_id)76 static const struct fwk_element *transport_get_element_table(fwk_id_t module_id)
77 {
78     unsigned int idx;
79     struct mod_transport_channel_config *config;
80 
81     for (idx = 0; idx < SCP_MORELLO_SCMI_SERVICE_IDX_COUNT; idx++) {
82         config =
83             (struct mod_transport_channel_config *)(transport_element_table[idx]
84                                                         .data);
85         config->pd_source_id = FWK_ID_ELEMENT(
86             FWK_MODULE_IDX_POWER_DOMAIN, PD_SINGLE_CHIP_IDX_SYSTOP0);
87     }
88 
89     return transport_element_table;
90 }
91 
92 const struct fwk_module_config config_transport = {
93     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(transport_get_element_table),
94 };
95