1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
|
/** @file
Arm FF-A library Header file
Copyright (c) 2024, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Glossary:
- FF-A - Firmware Framework for Arm A-profile
- spmc - Secure Partition Manager Core
- spmd - Secure Partition Manager Dispatcher
@par Reference(s):
- Arm Firmware Framework for Arm A-Profile [https://developer.arm.com/documentation/den0077/latest]
**/
#pragma once
#include <IndustryStandard/ArmFfaSvc.h>
#include <IndustryStandard/ArmFfaBootInfo.h>
#include <IndustryStandard/ArmFfaPartInfo.h>
#include <Library/ArmSmcLib.h>
/**
* Arguments to call FF-A request via SMC/SVC.
*/
typedef struct ArmFfaArgs {
UINTN Arg0;
UINTN Arg1;
UINTN Arg2;
UINTN Arg3;
UINTN Arg4;
UINTN Arg5;
UINTN Arg6;
UINTN Arg7;
UINTN Arg8;
UINTN Arg9;
UINTN Arg10;
UINTN Arg11;
UINTN Arg12;
UINTN Arg13;
UINTN Arg14;
UINTN Arg15;
UINTN Arg16;
UINTN Arg17;
} ARM_FFA_ARGS;
#define FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT 0x00
/** Implementation define arguments used in
* FFA_SEND_MSG_DIRECT_REQ/FFA_SEND_MSG_DIRECT_RESP (i.e. v1) and
* FFA_SEND_MSG_DIRECT_REQ2/FFA_SEND_MSG_DIRECT_RESP2 (i.e. v2)
*/
typedef struct DirectMsgArgs {
/// Header containing the arguments for the header registers (x0-x2 (v1) or x0-x3 (v2))
struct {
UINTN x0;
UINTN x1;
UINTN x2;
UINTN x3;
} Header;
/// Implementation define argument 0, this will be set to/from x3(v1) or x4(v2)
UINTN Arg0;
/// Implementation define argument 1, this will be set to/from x4(v1) or x5(v2)
UINTN Arg1;
/// Implementation define argument 2, this will be set to/from x5(v1) or x6(v2)
UINTN Arg2;
/// Implementation define argument 3, this will be set to/from x6(v1) or x7(v2)
UINTN Arg3;
/// Implementation define argument 4, this will be set to/from x7(v1) or x8(v2)
UINTN Arg4;
/// Implementation define argument 5, this will be set to/from x9(v2)
UINTN Arg5;
/// Implementation define argument 6, this will be set to/from x10(v2)
UINTN Arg6;
/// Implementation define argument 7, this will be set to/from x11(v2)
UINTN Arg7;
/// Implementation define argument 8, this will be set to/from x12(v2)
UINTN Arg8;
/// Implementation define argument 9, this will be set to/from x13(v2)
UINTN Arg9;
/// Implementation define argument 10, this will be set to/from x14(v2)
UINTN Arg10;
/// Implementation define argument 11, this will be set to/from x15(v2)
UINTN Arg11;
/// Implementation define argument 12, this will be set to/from x16(v2)
UINTN Arg12;
/// Implementation define argument 13, this will be set to/from x17(v2)
UINTN Arg13;
} DIRECT_MSG_ARGS;
STATIC_ASSERT (sizeof (DIRECT_MSG_ARGS) == sizeof (ARM_FFA_ARGS), "DIRECT_MSG_ARGS and ARM_FFA_ARGS must be the same size");
/**
Trigger FF-A ABI call according to PcdFfaLibConduitSmc.
@param [in, out] FfaArgs Ffa arguments
**/
VOID
EFIAPI
ArmCallFfa (
IN OUT ARM_FFA_ARGS *FfaArgs
);
/**
Convert EFI_STATUS to FFA return code.
@param [in] Status edk2 status code.
@retval ARM_FFA_RET_* return value correspond to EFI_STATUS.
**/
UINTN
EFIAPI
EfiStatusToFfaStatus (
IN EFI_STATUS Status
);
/**
Convert FFA return code to EFI_STATUS.
@param [in] FfaStatus Ffa Status Code.
@retval EFI_STATUS return value correspond EFI_STATUS to FfaStatus
**/
EFI_STATUS
EFIAPI
FfaStatusToEfiStatus (
IN UINTN FfaStatus
);
/**
Check FF-A support or not.
@retval TRUE Supported
@retval FALSE Not supported
**/
BOOLEAN
EFIAPI
IsFfaSupported (
IN VOID
);
/**
Get mapped Rx/Tx buffers.
@param [out] TxBuffer Address of TxBuffer
@param [out] TxBufferSize Size of TxBuffer
@param [out] RxBuffer Address of RxBuffer
@param [out] RxBufferSize Size of RxBuffer
@retval EFI_SUCCESS
@retval Others Error.
**/
EFI_STATUS
EFIAPI
ArmFfaLibGetRxTxBuffers (
OUT VOID **TxBuffer OPTIONAL,
OUT UINT64 *TxBufferSize OPTIONAL,
OUT VOID **RxBuffer OPTIONAL,
OUT UINT64 *RxBufferSize OPTIONAL
);
/**
Get FF-A version
@param [in] RequestVersion Minimal request version
@param [out] CurrentVersion Current major version
**/
EFI_STATUS
EFIAPI
ArmFfaLibGetVersion (
IN UINT32 RequestVersion,
OUT UINT32 *CurrentVersion
);
/**
Get FF-A features.
@param [in] Id Feature id or function id
@param [in] InputProperties Input properties according to Id
@param [out] Property1 First Property value.
@param [out] Property2 Second Property value.
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibGetFeatures (
IN UINT32 Id,
IN UINT32 InputProperties,
OUT UINTN *Property1,
OUT UINTN *Property2
);
/**
Acquire ownership of the Rx buffer.
@param [in] PartId Partition Id.
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibRxAcquire (
IN UINT16 PartId
);
/**
Release ownership of the Rx buffer.
@param [in] PartId Partition Id.
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibRxRelease (
IN UINT16 PartId
);
/**
Get Partition info.
If This function is called to get partition descriptors
(Flags isn't set with FFA_PART_INFO_FL_TYPE_COUNT),
It should call ArmFfaLibRxRelease() to release Rx buffer.
@param [in] ServiceGuid Service guid.
@param [in] Flags If this function called to get partition desc
and get successfully,
Caller should release RX buffer by calling
ArmFfaLibRxRelease
@param [out] Count Number of partition or partition descriptor
@param [out] Size Size of Partition Info structure in Rx Buffer
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibPartitionInfoGet (
IN EFI_GUID *ServiceGuid,
IN UINT32 Flags,
OUT UINT32 *Count,
OUT UINT32 *Size OPTIONAL
);
/**
Get number of Partitions via registers.
This function is supported by aarch64 only.
@param [in] ServiceGuid Service guid.
@param [out] PartDescCount Return number of partition info related to
ServiceGuid.
@retval EFI_SUCCESS
@retval EFI_UNSUPPORTED
@retval EFI_INVALID_PARAMETER
@retval Other Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibPartitionCountGetRegs (
IN EFI_GUID *ServiceGuid,
OUT UINT32 *PartDescCount
);
/**
Get Partition info via registers.
This function is supported by aarch64 only.
@param [in] ServiceGuid Service guid.
@param [in, out] PartDescCount Return number of partition info related to
Service guid when PartDesc == NULL.
Otherwise return number of partition info
copied in ParcDesc
@param [out] PartDesc Partition information Buffer
@retval EFI_SUCCESS
@retval EFI_UNSUPPORTED
@retval EFI_INVALID_PARAMETER
@retval Other Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibPartitionInfoGetRegs (
IN EFI_GUID *ServiceGuid,
IN OUT UINT32 *PartDescCount,
OUT EFI_FFA_PART_INFO_DESC *PartDesc OPTIONAL
);
/**
Get partition or VM id.
This function is only called in ArmFfaLibConstructor.
@param [out] PartId Partition id.
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibPartitionIdGet (
OUT UINT16 *PartId
);
/**
Get spmc or spmd partition id.
@param [out] SpmPartId spmc/spmd partition id.
@retval EFI_SUCCESS
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibSpmIdGet (
OUT UINT16 *SpmPartId
);
/**
Invoked by an endpoint to yield control back to the component
that called it. This prevents long running transactions from
being caught up in the secure world. Endpoint will need to be
invoked with FFA_RUN after the specified timeout.
@param [in] TimeoutUs The timeout indicating the time in which
the endpoint is required to be run in
microseconds.
@return EFI_SUCCESS
@return Other Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibYield (
IN UINT64 TimeoutUs
);
/**
Restore context which interrupted with FFA_INTERRUPT (EFI_INTERRUPT_PENDING).
@param [in] PartId Partition id
@param [in] CpuNumber Cpu number in partition
@param [out] DirectMsgArg return arguments for direct msg resp/resp2
@retval EFI_SUCCESS
@retval Other Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibRun (
IN UINT16 PartId,
IN UINT16 CpuNumber,
OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL
);
/**
Send direct message request version 1.
@param [in] DestPartId Dest partition id
@param [in] Flags Message flags
@param [in, out] ImpDefArgs Implemented defined arguments and
Implemented defined return values
@retval EFI_SUCCESS Success
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibMsgSendDirectReq (
IN UINT16 DestPartId,
IN UINT32 Flags,
IN OUT DIRECT_MSG_ARGS *ImpDefArgs
);
/**
Send direct message request version 2.
@param [in] DestPartId Dest partition id
@param [in] ServiceGuid Service guid
@param [in, out] ImpDefArgs Implemented defined arguments and
Implemented defined return values
@retval EFI_SUCCESS Success
@retval Others Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibMsgSendDirectReq2 (
IN UINT16 DestPartId,
IN EFI_GUID *ServiceGuid,
IN OUT DIRECT_MSG_ARGS *ImpDefArgs
);
/**
Helper to retrieve the first partition information associated with
a service GUID via registers.
@param [in] ServiceGuid Service guid.
@param [in, out] PartDescCount Return number of partition info related to
Service guid when PartDesc == NULL.
Otherwise return number of partition info
copied in ParcDesc
@param [out] PartDesc Partition information Buffer
@retval EFI_SUCCESS
@retval EFI_UNSUPPORTED
@retval EFI_INVALID_PARAMETER
@retval Other Error
**/
EFI_STATUS
EFIAPI
ArmFfaLibGetPartitionInfo (
IN EFI_GUID *ServiceGuid,
OUT EFI_FFA_PART_INFO_DESC *PartDesc
);
|