]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/ArmScmiDxe/ScmiBaseProtocol.c
ArmPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / ArmPkg / Drivers / ArmScmiDxe / ScmiBaseProtocol.c
CommitLineData
4f2494cf
GP
1/** @file\r
2\r
3 Copyright (c) 2017-2018, Arm Limited. All rights reserved.\r
4\r
4059386c 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
4f2494cf
GP
6\r
7 System Control and Management Interface V1.0\r
8 http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/\r
9 DEN0056A_System_Control_and_Management_Interface.pdf\r
10**/\r
11\r
12#include <Library/BaseLib.h>\r
13#include <Library/DebugLib.h>\r
14#include <Library/UefiBootServicesTableLib.h>\r
15#include <Protocol/ArmScmiBaseProtocol.h>\r
16\r
17#include "ArmScmiBaseProtocolPrivate.h"\r
18#include "ScmiPrivate.h"\r
19\r
20/** Return version of the Base protocol supported by SCP firmware.\r
21\r
22 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
23\r
24 @param[out] Version Version of the supported SCMI Base protocol.\r
25\r
26 @retval EFI_SUCCESS The version of the protocol is returned.\r
27 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
28 @retval !(EFI_SUCCESS) Other errors.\r
29**/\r
30STATIC\r
31EFI_STATUS\r
32BaseGetVersion (\r
33 IN SCMI_BASE_PROTOCOL *This,\r
34 OUT UINT32 *Version\r
35 )\r
36{\r
37 return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_BASE, Version);\r
38}\r
39\r
40/** Return total number of SCMI protocols supported by the SCP firmware.\r
41\r
42 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
43\r
44 @param[out] TotalProtocols Total number of SCMI protocols supported.\r
45\r
46 @retval EFI_SUCCESS Total number of protocols supported are returned.\r
47 @retval EFI_DEVICE_ERROR SCP returns a SCMI error.\r
48 @retval !(EFI_SUCCESS) Other errors.\r
49**/\r
50STATIC\r
51EFI_STATUS\r
52BaseGetTotalProtocols (\r
53 IN SCMI_BASE_PROTOCOL *This,\r
54 OUT UINT32 *TotalProtocols\r
55 )\r
56{\r
57 EFI_STATUS Status;\r
58 UINT32 *ReturnValues;\r
59\r
60 Status = ScmiGetProtocolAttributes (SCMI_PROTOCOL_ID_BASE, &ReturnValues);\r
61 if (EFI_ERROR (Status)) {\r
62 return Status;\r
63 }\r
64\r
65 *TotalProtocols = SCMI_TOTAL_PROTOCOLS (ReturnValues[0]);\r
66\r
67 return EFI_SUCCESS;\r
68}\r
69\r
70/** Common function which returns vendor details.\r
71\r
72 @param[in] MessageId SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR\r
73 OR\r
74 SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR\r
75\r
76 @param[out] VendorIdentifier ASCII name of the vendor/subvendor.\r
77\r
78 @retval EFI_SUCCESS VendorIdentifier is returned.\r
79 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
80 @retval !(EFI_SUCCESS) Other errors.\r
81**/\r
82STATIC\r
83EFI_STATUS\r
84BaseDiscoverVendorDetails (\r
85 IN SCMI_MESSAGE_ID_BASE MessageId,\r
86 OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]\r
87 )\r
88{\r
89 EFI_STATUS Status;\r
90 UINT32 *ReturnValues;\r
91 SCMI_COMMAND Cmd;\r
92 UINT32 PayloadLength;\r
93\r
94 Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;\r
95 Cmd.MessageId = MessageId;\r
96\r
97 PayloadLength = 0;\r
98\r
99 Status = ScmiCommandExecute (\r
100 &Cmd,\r
101 &PayloadLength,\r
102 &ReturnValues\r
103 );\r
104 if (EFI_ERROR (Status)) {\r
105 return Status;\r
106 }\r
107\r
108 AsciiStrCpyS (\r
109 (CHAR8*)VendorIdentifier,\r
110 SCMI_MAX_STR_LEN,\r
111 (CONST CHAR8*)ReturnValues\r
112 );\r
113\r
114 return EFI_SUCCESS;\r
115}\r
116\r
117/** Return vendor name.\r
118\r
119 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
120\r
121 @param[out] VendorIdentifier Null terminated ASCII string of up to\r
122 16 bytes with a vendor name.\r
123\r
124 @retval EFI_SUCCESS VendorIdentifier is returned.\r
125 @retval EFI_DEVICE_ERROR SCP returns a SCMI error.\r
126 @retval !(EFI_SUCCESS) Other errors.\r
127**/\r
128STATIC\r
129EFI_STATUS\r
130BaseDiscoverVendor (\r
131 IN SCMI_BASE_PROTOCOL *This,\r
132 OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]\r
133 )\r
134{\r
135 return BaseDiscoverVendorDetails (\r
136 SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR,\r
137 VendorIdentifier\r
138 );\r
139}\r
140\r
141/** Return sub vendor name.\r
142\r
143 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
144\r
145 @param[out] VendorIdentifier Null terminated ASCII string of up to\r
146 16 bytes with a sub vendor name.\r
147\r
148 @retval EFI_SUCCESS VendorIdentifier is returned.\r
149 @retval EFI_DEVICE_ERROR SCP returns a SCMI error.\r
150 @retval !(EFI_SUCCESS) Other errors.\r
151**/\r
152EFI_STATUS\r
153BaseDiscoverSubVendor (\r
154 IN SCMI_BASE_PROTOCOL *This,\r
155 OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]\r
156 )\r
157{\r
158 return BaseDiscoverVendorDetails (\r
159 SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR,\r
160 VendorIdentifier\r
161 );\r
162}\r
163\r
164/** Return implementation version.\r
165\r
166 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
167\r
168 @param[out] ImplementationVersion Vendor specific implementation version.\r
169\r
170 @retval EFI_SUCCESS Implementation version is returned.\r
171 @retval EFI_DEVICE_ERROR SCP returns a SCMI error.\r
172 @retval !(EFI_SUCCESS) Other errors.\r
173**/\r
174STATIC\r
175EFI_STATUS\r
176BaseDiscoverImplVersion (\r
177 IN SCMI_BASE_PROTOCOL *This,\r
178 OUT UINT32 *ImplementationVersion\r
179 )\r
180{\r
181 EFI_STATUS Status;\r
182 UINT32 *ReturnValues;\r
183 SCMI_COMMAND Cmd;\r
184 UINT32 PayloadLength;\r
185\r
186 Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;\r
187 Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_IMPLEMENTATION_VERSION;\r
188\r
189 PayloadLength = 0;\r
190\r
191 Status = ScmiCommandExecute (\r
192 &Cmd,\r
193 &PayloadLength,\r
194 &ReturnValues\r
195 );\r
196 if (EFI_ERROR (Status)) {\r
197 return Status;\r
198 }\r
199\r
200 *ImplementationVersion = ReturnValues[0];\r
201\r
202 return EFI_SUCCESS;\r
203}\r
204\r
205/** Return list of protocols.\r
206\r
207 @param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.\r
208\r
209 @param[out] ProtocolListSize Size of the ProtocolList.\r
210\r
211 @param[out] ProtocolList Protocol list.\r
212\r
213 @retval EFI_SUCCESS List of protocols is returned.\r
214 @retval EFI_BUFFER_TOO_SMALL ProtocolListSize is too small for the result.\r
215 It has been updated to the size needed.\r
216 @retval EFI_DEVICE_ERROR SCP returns a SCMI error.\r
217 @retval !(EFI_SUCCESS) Other errors.\r
218**/\r
219STATIC\r
220EFI_STATUS\r
221BaseDiscoverListProtocols (\r
222 IN SCMI_BASE_PROTOCOL *This,\r
223 IN OUT UINT32 *ProtocolListSize,\r
224 OUT UINT8 *ProtocolList\r
225 )\r
226{\r
227 EFI_STATUS Status;\r
228 UINT32 TotalProtocols;\r
229 UINT32 *MessageParams;\r
230 BASE_DISCOVER_LIST *DiscoverList;\r
231 UINT32 Skip;\r
232 UINT32 Index;\r
233 SCMI_COMMAND Cmd;\r
234 UINT32 PayloadLength;\r
235 UINT32 RequiredSize;\r
236\r
237 Status = BaseGetTotalProtocols (This, &TotalProtocols);\r
238 if (EFI_ERROR (Status)) {\r
239 return Status;\r
240 }\r
241\r
242 Status = ScmiCommandGetPayload (&MessageParams);\r
243 if (EFI_ERROR (Status)) {\r
244 return Status;\r
245 }\r
246\r
247 RequiredSize = sizeof (UINT8) * TotalProtocols;\r
248 if (*ProtocolListSize < RequiredSize) {\r
249 *ProtocolListSize = RequiredSize;\r
250 return EFI_BUFFER_TOO_SMALL;\r
251 }\r
252\r
253 Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;\r
254 Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_LIST_PROTOCOLS;\r
255\r
256 Skip = 0;\r
257\r
258 while (Skip < TotalProtocols) {\r
259\r
260 *MessageParams = Skip;\r
261\r
262 // Note PayloadLength is a IN/OUT parameter.\r
263 PayloadLength = sizeof (Skip);\r
264\r
265 Status = ScmiCommandExecute (\r
266 &Cmd,\r
267 &PayloadLength,\r
268 (UINT32**)&DiscoverList\r
269 );\r
270 if (EFI_ERROR (Status)) {\r
271 return Status;\r
272 }\r
273\r
274 for (Index = 0; Index < DiscoverList->NumProtocols; Index++) {\r
275 ProtocolList[Skip++] = DiscoverList->Protocols[Index];\r
276 }\r
277 }\r
278\r
279 *ProtocolListSize = RequiredSize;\r
280\r
281 return EFI_SUCCESS;\r
282}\r
283\r
284// Instance of the SCMI Base protocol.\r
285STATIC CONST SCMI_BASE_PROTOCOL BaseProtocol = {\r
286 BaseGetVersion,\r
287 BaseGetTotalProtocols,\r
288 BaseDiscoverVendor,\r
289 BaseDiscoverSubVendor,\r
290 BaseDiscoverImplVersion,\r
291 BaseDiscoverListProtocols\r
292};\r
293\r
294/** Initialize Base protocol and install protocol on a given handle.\r
295\r
296 @param[in] Handle Handle to install Base protocol.\r
297\r
298 @retval EFI_SUCCESS Base protocol interface installed\r
299 successfully.\r
300**/\r
301EFI_STATUS\r
302ScmiBaseProtocolInit (\r
303 IN OUT EFI_HANDLE* Handle\r
304 )\r
305{\r
306 return gBS->InstallMultipleProtocolInterfaces (\r
307 Handle,\r
308 &gArmScmiBaseProtocolGuid,\r
309 &BaseProtocol,\r
310 NULL\r
311 );\r
312}\r