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