]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/ArmScmiDxe/ScmiBaseProtocol.c
ArmPkg: Apply uncrustify changes
[mirror_edk2.git] / ArmPkg / Drivers / ArmScmiDxe / ScmiBaseProtocol.c
CommitLineData
4f2494cf
GP
1/** @file\r
2\r
462f95ec 3 Copyright (c) 2017-2021, Arm Limited. All rights reserved.<BR>\r
4f2494cf 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
462f95ec 37 return ScmiGetProtocolVersion (ScmiProtocolIdBase, Version);\r
4f2494cf
GP
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
462f95ec 60 Status = ScmiGetProtocolAttributes (ScmiProtocolIdBase, &ReturnValues);\r
4f2494cf
GP
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
1f93d0c5 72 @param[in] MessageId ScmiMessageIdBaseDiscoverVendor\r
4f2494cf 73 OR\r
1f93d0c5 74 ScmiMessageIdBaseDiscoverSubVendor\r
4f2494cf
GP
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
462f95ec 94 Cmd.ProtocolId = ScmiProtocolIdBase;\r
4f2494cf
GP
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
429309e0 109 (CHAR8 *)VendorIdentifier,\r
4f2494cf 110 SCMI_MAX_STR_LEN,\r
429309e0 111 (CONST CHAR8 *)ReturnValues\r
4f2494cf
GP
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
1f93d0c5 136 ScmiMessageIdBaseDiscoverVendor,\r
4f2494cf
GP
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
1f93d0c5 159 ScmiMessageIdBaseDiscoverSubVendor,\r
4f2494cf
GP
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
462f95ec 186 Cmd.ProtocolId = ScmiProtocolIdBase;\r
1f93d0c5 187 Cmd.MessageId = ScmiMessageIdBaseDiscoverImplementationVersion;\r
4f2494cf
GP
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
462f95ec 253 Cmd.ProtocolId = ScmiProtocolIdBase;\r
1f93d0c5 254 Cmd.MessageId = ScmiMessageIdBaseDiscoverListProtocols;\r
4f2494cf
GP
255\r
256 Skip = 0;\r
257\r
258 while (Skip < TotalProtocols) {\r
4f2494cf
GP
259 *MessageParams = Skip;\r
260\r
261 // Note PayloadLength is a IN/OUT parameter.\r
262 PayloadLength = sizeof (Skip);\r
263\r
264 Status = ScmiCommandExecute (\r
265 &Cmd,\r
266 &PayloadLength,\r
429309e0 267 (UINT32 **)&DiscoverList\r
4f2494cf
GP
268 );\r
269 if (EFI_ERROR (Status)) {\r
270 return Status;\r
271 }\r
272\r
273 for (Index = 0; Index < DiscoverList->NumProtocols; Index++) {\r
274 ProtocolList[Skip++] = DiscoverList->Protocols[Index];\r
275 }\r
276 }\r
277\r
278 *ProtocolListSize = RequiredSize;\r
279\r
280 return EFI_SUCCESS;\r
281}\r
282\r
283// Instance of the SCMI Base protocol.\r
429309e0 284STATIC CONST SCMI_BASE_PROTOCOL BaseProtocol = {\r
4f2494cf
GP
285 BaseGetVersion,\r
286 BaseGetTotalProtocols,\r
287 BaseDiscoverVendor,\r
288 BaseDiscoverSubVendor,\r
289 BaseDiscoverImplVersion,\r
290 BaseDiscoverListProtocols\r
291};\r
292\r
293/** Initialize Base protocol and install protocol on a given handle.\r
294\r
295 @param[in] Handle Handle to install Base protocol.\r
296\r
297 @retval EFI_SUCCESS Base protocol interface installed\r
298 successfully.\r
299**/\r
300EFI_STATUS\r
301ScmiBaseProtocolInit (\r
429309e0 302 IN OUT EFI_HANDLE *Handle\r
4f2494cf
GP
303 )\r
304{\r
305 return gBS->InstallMultipleProtocolInterfaces (\r
306 Handle,\r
307 &gArmScmiBaseProtocolGuid,\r
308 &BaseProtocol,\r
309 NULL\r
310 );\r
311}\r