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