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 "sgm775_scmi.h"
9
10 #include <mod_scmi.h>
11 #include <mod_transport.h>
12
13 #include <fwk_element.h>
14 #include <fwk_id.h>
15 #include <fwk_macros.h>
16 #include <fwk_module.h>
17 #include <fwk_module_idx.h>
18
19 static const struct fwk_element
20 service_table[SGM775_SCMI_SERVICE_IDX_COUNT+1] = {
21 [SGM775_SCMI_SERVICE_IDX_PSCI] = {
22 .name = "PSCI",
23 .data = &((struct mod_scmi_service_config) {
24 .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TRANSPORT,
25 SGM775_SCMI_SERVICE_IDX_PSCI),
26 .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_TRANSPORT,
27 MOD_TRANSPORT_API_IDX_SCMI_TO_TRANSPORT),
28 .transport_notification_init_id =
29 FWK_ID_NOTIFICATION_INIT(FWK_MODULE_IDX_TRANSPORT,
30 MOD_TRANSPORT_NOTIFICATION_IDX_INITIALIZED),
31 .scmi_agent_id = SCMI_AGENT_ID_PSCI,
32 .scmi_p2a_id = FWK_ID_NONE_INIT,
33 }),
34 },
35 [SGM775_SCMI_SERVICE_IDX_OSPM_0] = {
36 .name = "OSPM-0",
37 .data = &((struct mod_scmi_service_config) {
38 .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TRANSPORT,
39 SGM775_SCMI_SERVICE_IDX_OSPM_0),
40 .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_TRANSPORT,
41 MOD_TRANSPORT_API_IDX_SCMI_TO_TRANSPORT),
42 .transport_notification_init_id =
43 FWK_ID_NOTIFICATION_INIT(FWK_MODULE_IDX_TRANSPORT,
44 MOD_TRANSPORT_NOTIFICATION_IDX_INITIALIZED),
45 .scmi_agent_id = SCMI_AGENT_ID_OSPM,
46 #ifdef BUILD_HAS_SCMI_NOTIFICATIONS
47 .scmi_p2a_id = FWK_ID_ELEMENT_INIT(
48 FWK_MODULE_IDX_SCMI,
49 SGM775_SCMI_SERVICE_IDX_OSPM_0_P2A),
50 #else
51 .scmi_p2a_id = FWK_ID_NONE_INIT,
52 #endif
53 }),
54 },
55 [SGM775_SCMI_SERVICE_IDX_OSPM_1] = {
56 .name = "OSPM-1",
57 .data = &((struct mod_scmi_service_config) {
58 .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TRANSPORT,
59 SGM775_SCMI_SERVICE_IDX_OSPM_1),
60 .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_TRANSPORT,
61 MOD_TRANSPORT_API_IDX_SCMI_TO_TRANSPORT),
62 .transport_notification_init_id =
63 FWK_ID_NOTIFICATION_INIT(FWK_MODULE_IDX_TRANSPORT,
64 MOD_TRANSPORT_NOTIFICATION_IDX_INITIALIZED),
65 .scmi_agent_id = SCMI_AGENT_ID_OSPM,
66 #ifdef BUILD_HAS_SCMI_NOTIFICATIONS
67 .scmi_p2a_id = FWK_ID_ELEMENT_INIT(
68 FWK_MODULE_IDX_SCMI,
69 SGM775_SCMI_SERVICE_IDX_OSPM_1_P2A),
70 #else
71 .scmi_p2a_id = FWK_ID_NONE_INIT,
72 #endif
73 }),
74 },
75 #ifdef BUILD_HAS_SCMI_NOTIFICATIONS
76 [SGM775_SCMI_SERVICE_IDX_OSPM_0_P2A] = {
77 .name = "OSPM0-P2A",
78 .data = &(struct mod_scmi_service_config) {
79 .transport_id = FWK_ID_ELEMENT_INIT(
80 FWK_MODULE_IDX_TRANSPORT,
81 SGM775_SCMI_SERVICE_IDX_OSPM_0_P2A),
82 .transport_api_id = FWK_ID_API_INIT(
83 FWK_MODULE_IDX_TRANSPORT,
84 MOD_TRANSPORT_API_IDX_SCMI_TO_TRANSPORT),
85 .transport_notification_init_id =
86 FWK_ID_NOTIFICATION_INIT(FWK_MODULE_IDX_TRANSPORT,
87 MOD_TRANSPORT_NOTIFICATION_IDX_INITIALIZED),
88 .scmi_agent_id = (unsigned int) SCMI_AGENT_ID_OSPM,
89 .scmi_p2a_id = FWK_ID_NONE_INIT,
90 },
91 },
92 [SGM775_SCMI_SERVICE_IDX_OSPM_1_P2A] = {
93 .name = "OSPM1-P2A",
94 .data = &(struct mod_scmi_service_config) {
95 .transport_id = FWK_ID_ELEMENT_INIT(
96 FWK_MODULE_IDX_TRANSPORT,
97 SGM775_SCMI_SERVICE_IDX_OSPM_1_P2A),
98 .transport_api_id = FWK_ID_API_INIT(
99 FWK_MODULE_IDX_TRANSPORT,
100 MOD_TRANSPORT_API_IDX_SCMI_TO_TRANSPORT),
101 .transport_notification_init_id =
102 FWK_ID_NOTIFICATION_INIT(FWK_MODULE_IDX_TRANSPORT,
103 MOD_TRANSPORT_NOTIFICATION_IDX_INITIALIZED),
104 .scmi_agent_id = (unsigned int) SCMI_AGENT_ID_OSPM,
105 .scmi_p2a_id = FWK_ID_NONE_INIT,
106 },
107 },
108 #endif
109 [SGM775_SCMI_SERVICE_IDX_COUNT] = { 0 }
110 };
111
get_service_table(fwk_id_t module_id)112 static const struct fwk_element *get_service_table(fwk_id_t module_id)
113 {
114 return service_table;
115 }
116
117 #ifndef BUILD_HAS_MOD_RESOURCE_PERMS
118
119 /* PSCI agent has no access to clock, perf and sensor protocol */
120 static const uint32_t dis_protocol_list_psci[] = {
121 MOD_SCMI_PROTOCOL_ID_SENSOR,
122 MOD_SCMI_PROTOCOL_ID_CLOCK,
123 MOD_SCMI_PROTOCOL_ID_PERF,
124 };
125 #endif
126
127 static const struct mod_scmi_agent agent_table[] = {
128 [SCMI_AGENT_ID_OSPM] = {
129 .type = SCMI_AGENT_TYPE_OSPM,
130 .name = "OSPM",
131 },
132 [SCMI_AGENT_ID_PSCI] = {
133 .type = SCMI_AGENT_TYPE_PSCI,
134 .name = "PSCI",
135 },
136 };
137
138 struct fwk_module_config config_scmi = {
139 .data = &((struct mod_scmi_config){
140 .protocol_count_max = 9,
141 #ifndef BUILD_HAS_MOD_RESOURCE_PERMS
142 .dis_protocol_count_psci = FWK_ARRAY_SIZE(dis_protocol_list_psci),
143 .dis_protocol_list_psci = dis_protocol_list_psci,
144 #endif
145 .agent_count = FWK_ARRAY_SIZE(agent_table) - 1,
146 .agent_table = agent_table,
147 .vendor_identifier = "arm",
148 .sub_vendor_identifier = "arm",
149 }),
150
151 .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_service_table),
152 };
153