1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2015-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 "sgm776_core.h"
10 #include "sgm776_mhu.h"
11 #include "sgm776_scmi.h"
12 #include "software_mmap.h"
13 
14 #include <mod_mhu2.h>
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 transport_element_table[] = {
25     /* SGM776_SCMI_SERVICE_IDX_PSCI */
26     { .name = "PSCI",
27       .data = &((struct mod_transport_channel_config){
28           .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
29           .policies =
30               MOD_TRANSPORT_POLICY_INIT_MAILBOX | MOD_TRANSPORT_POLICY_SECURE,
31           .out_band_mailbox_address = (uintptr_t)SCMI_PAYLOAD_S_A2P_BASE,
32           .out_band_mailbox_size = SCMI_PAYLOAD_SIZE,
33           .driver_id = FWK_ID_SUB_ELEMENT_INIT(
34               FWK_MODULE_IDX_MHU2,
35               SGM776_MHU_DEVICE_IDX_S,
36               0),
37           .driver_api_id = FWK_ID_API_INIT(
38               FWK_MODULE_IDX_MHU2,
39               MOD_MHU2_API_IDX_TRANSPORT_DRIVER),
40       }) },
41     /* SGM776_SCMI_SERVICE_IDX_OSPM_0 */
42     { .name = "OSPM0",
43       .data = &((struct mod_transport_channel_config){
44           .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
45           .policies = MOD_TRANSPORT_POLICY_INIT_MAILBOX,
46           .out_band_mailbox_address = (uintptr_t)SCMI_PAYLOAD0_NS_A2P_BASE,
47           .out_band_mailbox_size = SCMI_PAYLOAD_SIZE,
48           .driver_id = FWK_ID_SUB_ELEMENT_INIT(
49               FWK_MODULE_IDX_MHU2,
50               SGM776_MHU_DEVICE_IDX_NS_L,
51               0),
52           .driver_api_id = FWK_ID_API_INIT(
53               FWK_MODULE_IDX_MHU2,
54               MOD_MHU2_API_IDX_TRANSPORT_DRIVER),
55       }) },
56     /* SGM776_SCMI_SERVICE_IDX_OSPM_1 */
57     { .name = "OSPM1",
58       .data = &((struct mod_transport_channel_config){
59           .channel_type = MOD_TRANSPORT_CHANNEL_TYPE_COMPLETER,
60           .policies = MOD_TRANSPORT_POLICY_INIT_MAILBOX,
61           .out_band_mailbox_address = (uintptr_t)SCMI_PAYLOAD1_NS_A2P_BASE,
62           .out_band_mailbox_size = SCMI_PAYLOAD_SIZE,
63           .driver_id = FWK_ID_SUB_ELEMENT_INIT(
64               FWK_MODULE_IDX_MHU2,
65               SGM776_MHU_DEVICE_IDX_NS_H,
66               0),
67           .driver_api_id = FWK_ID_API_INIT(
68               FWK_MODULE_IDX_MHU2,
69               MOD_MHU2_API_IDX_TRANSPORT_DRIVER),
70       }) },
71     [SGM776_SCMI_SERVICE_IDX_COUNT] = { 0 },
72 };
73 
transport_get_element_table(fwk_id_t module_id)74 static const struct fwk_element *transport_get_element_table(fwk_id_t module_id)
75 {
76     unsigned int idx;
77     struct mod_transport_channel_config *config;
78 
79     for (idx = 0; idx < SGM776_SCMI_SERVICE_IDX_COUNT; idx++) {
80         config =
81             (struct mod_transport_channel_config *)(transport_element_table[idx]
82                                                         .data);
83 
84         config->pd_source_id = FWK_ID_ELEMENT(
85             FWK_MODULE_IDX_POWER_DOMAIN,
86             CONFIG_POWER_DOMAIN_SYSTOP_SYSTEM + sgm776_core_get_count() +
87                 sgm776_cluster_get_count());
88     }
89 
90     return transport_element_table;
91 }
92 
93 struct fwk_module_config config_transport = {
94     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(transport_get_element_table),
95 };
96