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