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 "scp_mmap.h"
10 #include "scp_tc2_mhu.h"
11 #include "tc2_core.h"
12 #include "tc2_scmi.h"
13 
14 #include <mod_transport.h>
15 
16 #include <fwk_element.h>
17 #include <fwk_id.h>
18 #include <fwk_module.h>
19 #include <fwk_module_idx.h>
20 
21 #include <stdint.h>
22 
23 static const struct fwk_element transport_element_table[
24     SCP_TC2_SCMI_SERVICE_IDX_COUNT + 1] = {
25     [SCP_TC2_SCMI_SERVICE_IDX_PSCI] = {
26         .name = "PSCI",
27         .data = &((
28             struct mod_transport_channel_config){
29             .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
30             .policies =
31                 MOD_TRANSPORT_POLICY_INIT_MAILBOX |
32                 MOD_TRANSPORT_POLICY_SECURE,
33             .out_band_mailbox_address = (uintptr_t)
34                 SCP_SCMI_PAYLOAD_S_A2P_BASE,
35             .out_band_mailbox_size =
36                 SCP_SCMI_PAYLOAD_SIZE,
37             .driver_id = FWK_ID_SUB_ELEMENT_INIT(
38                 FWK_MODULE_IDX_MHU2,
39                 SCP_TC2_MHU_DEVICE_IDX_SCP_AP_S_CLUS0,
40                 0),
41             .driver_api_id = FWK_ID_API_INIT(
42                 FWK_MODULE_IDX_MHU2,
43                 0),
44         }),
45      },
46     [SCP_TC2_SCMI_SERVICE_IDX_OSPM_0] = {
47         .name = "OSPM0",
48         .data = &((
49             struct mod_transport_channel_config){
50             .channel_type =
51                 MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
52             .policies =
53                 MOD_TRANSPORT_POLICY_INIT_MAILBOX,
54             .out_band_mailbox_address = (uintptr_t)
55                 SCP_SCMI_PAYLOAD0_NS_A2P_BASE,
56             .out_band_mailbox_size =
57                 SCP_SCMI_PAYLOAD_SIZE,
58             .driver_id = FWK_ID_SUB_ELEMENT_INIT(
59                 FWK_MODULE_IDX_MHU2,
60                 SCP_TC2_MHU_DEVICE_IDX_SCP_AP_NS_HP_CLUS0,
61                 0),
62             .driver_api_id = FWK_ID_API_INIT(
63                 FWK_MODULE_IDX_MHU2,
64                 0),
65         }),
66     },
67     [SCP_TC2_SCMI_SERVICE_IDX_OSPM_1] = {
68         .name = "OSPM1",
69         .data = &((
70             struct mod_transport_channel_config){
71             .channel_type =
72                 MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
73             .policies =
74                 MOD_TRANSPORT_POLICY_INIT_MAILBOX,
75             .out_band_mailbox_address = (uintptr_t)
76                 SCP_SCMI_PAYLOAD1_NS_A2P_BASE,
77             .out_band_mailbox_size =
78                 SCP_SCMI_PAYLOAD_SIZE,
79             .driver_id = FWK_ID_SUB_ELEMENT_INIT(
80                 FWK_MODULE_IDX_MHU2,
81                 SCP_TC2_MHU_DEVICE_IDX_SCP_AP_NS_LP_CLUS0,
82                 0),
83             .driver_api_id = FWK_ID_API_INIT(
84                 FWK_MODULE_IDX_MHU2,
85                 0),
86         }),
87     },
88     [SCP_TC2_SCMI_SERVICE_IDX_COUNT] = { 0 },
89 };
90 
transport_get_element_table(fwk_id_t module_id)91 static const struct fwk_element *transport_get_element_table(fwk_id_t module_id)
92 {
93     unsigned int idx;
94     struct mod_transport_channel_config *config;
95 
96     for (idx = 0; idx < SCP_TC2_SCMI_SERVICE_IDX_COUNT; idx++) {
97         config =
98             (struct mod_transport_channel_config *)(transport_element_table[idx]
99                                                         .data);
100         config->pd_source_id = FWK_ID_ELEMENT(
101             FWK_MODULE_IDX_POWER_DOMAIN,
102             tc2_core_get_core_count() + tc2_core_get_cluster_count() +
103                 PD_STATIC_DEV_IDX_SYSTOP);
104     }
105 
106     return transport_element_table;
107 }
108 
109 const struct fwk_module_config config_transport = {
110     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(transport_get_element_table),
111 };
112