blob: 71606373f94a690807927ef7081d397c6b746631 [file] [log] [blame]
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +01001.. SPDX-License-Identifier: GPL-2.0+
2
3Arm FF-A Support
4================
5
6Summary
7-------
8
9FF-A stands for Firmware Framework for Arm A-profile processors.
10
11FF-A specifies interfaces that enable a pair of software execution environments aka partitions to
12communicate with each other. A partition could be a VM in the Normal or Secure world, an
13application in S-EL0, or a Trusted OS in S-EL1.
14
15The U-Boot FF-A support (the bus) implements the interfaces to communicate
16with partitions in the Secure world aka Secure partitions (SPs).
17
18The FF-A support specifically focuses on communicating with SPs that
19isolate portions of EFI runtime services that must run in a protected
20environment which is inaccessible by the Host OS or Hypervisor.
21Examples of such services are set/get variables.
22
23The FF-A support uses the SMC ABIs defined by the FF-A specification to:
24
25- Discover the presence of SPs of interest
26- Access an SP's service through communication protocols
27 e.g. EFI MM communication protocol
28
29At this stage of development only EFI boot-time services are supported.
30Runtime support will be added in future developments.
31
32The U-Boot FF-A support provides the following parts:
33
34- A Uclass driver providing generic FF-A methods.
35- An Arm FF-A device driver providing Arm-specific methods and reusing the Uclass methods.
Abdellatif El Khlifi4970d5b2023-08-04 14:33:41 +010036- A sandbox emulator for Arm FF-A, emulates the FF-A side of the Secure World and provides
37 FF-A ABIs inspection methods.
38- An FF-A sandbox device driver for FF-A communication with the emulated Secure World.
39 The driver leverages the FF-A Uclass to establish FF-A communication.
Abdellatif El Khlifi3d4fb572023-08-04 14:33:42 +010040- Sandbox FF-A test cases.
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +010041
42FF-A and SMC specifications
43-------------------------------------------
44
45The current implementation of the U-Boot FF-A support relies on
46`FF-A v1.0 specification`_ and uses SMC32 calling convention which
47means using the first 32-bit data of the Xn registers.
48
49At this stage we only need the FF-A v1.0 features.
50
51The FF-A support has been tested with OP-TEE which supports SMC32 calling
52convention.
53
54Hypervisors are supported if they are configured to trap SMC calls.
55
56The FF-A support uses 64-bit registers as per `SMC Calling Convention v1.2 specification`_.
57
58Supported hardware
59--------------------------------
60
61Aarch64 plaforms
62
63Configuration
64----------------------
65
66CONFIG_ARM_FFA_TRANSPORT
67 Enables the FF-A support. Turn this on if you want to use FF-A
68 communication.
69 When using an Arm 64-bit platform, the Arm FF-A driver will be used.
Abdellatif El Khlifi4970d5b2023-08-04 14:33:41 +010070 When using sandbox, the sandbox FF-A emulator and FF-A sandbox driver will be used.
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +010071
72FF-A ABIs under the hood
73---------------------------------------
74
75Invoking an FF-A ABI involves providing to the secure world/hypervisor the
76expected arguments from the ABI.
77
78On an Arm 64-bit platform, the ABI arguments are stored in x0 to x7 registers.
79Then, an SMC instruction is executed.
80
81At the secure side level or hypervisor the ABI is handled at a higher exception
82level and the arguments are read and processed.
83
84The response is put back through x0 to x7 registers and control is given back
85to the U-Boot Arm FF-A driver (non-secure world).
86
87The driver reads the response and processes it accordingly.
88
89This methodology applies to all the FF-A ABIs.
90
91FF-A bus discovery on Arm 64-bit platforms
92---------------------------------------------
93
94When CONFIG_ARM_FFA_TRANSPORT is enabled, the FF-A bus is considered as
95an architecture feature and discovered using ARM_SMCCC_FEATURES mechanism.
96This discovery mechanism is performed by the PSCI driver.
97
98The PSCI driver comes with a PSCI device tree node which is the root node for all
99architecture features including FF-A bus.
100
101::
102
103 => dm tree
104
105 Class Index Probed Driver Name
106 -----------------------------------------------------------
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +0100107 firmware 0 [ + ] psci |-- psci
108 ffa 0 [ ] arm_ffa | `-- arm_ffa
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +0100109
110The PSCI driver is bound to the PSCI device and when probed it tries to discover
111the architecture features by calling a callback the features drivers provide.
112
113In case of FF-A, the callback is arm_ffa_is_supported() which tries to discover the
114FF-A framework by querying the FF-A framework version from secure world using
115FFA_VERSION ABI. When discovery is successful, the ARM_SMCCC_FEATURES
116mechanism creates a U-Boot device for the FF-A bus and binds the Arm FF-A driver
117with the device using device_bind_driver().
118
119At this stage the FF-A bus is registered with the DM and can be interacted with using
120the DM APIs.
121
122Clients are able to probe then use the FF-A bus by calling uclass_first_device().
123
124When calling uclass_first_device(), the FF-A driver is probed and ends up calling
125ffa_do_probe() provided by the Uclass which does the following:
126
127 - saving the FF-A framework version in uc_priv
128 - querying from secure world the u-boot endpoint ID
129 - querying from secure world the supported features of FFA_RXTX_MAP
130 - mapping the RX/TX buffers
131 - querying from secure world all the partitions information
132
133When one of the above actions fails, probing fails and the driver stays not active
134and can be probed again if needed.
135
136Requirements for clients
137-------------------------------------
138
139When using the FF-A bus with EFI, clients must query the SPs they are looking for
140during EFI boot-time mode using the service UUID.
141
142The RX/TX buffers are only available at EFI boot-time. Querying partitions is
143done at boot time and data is cached for future use.
144
145RX/TX buffers should be unmapped before EFI runtime mode starts.
146The driver provides a bus operation for that called ffa_rxtx_unmap().
147
148The user should call ffa_rxtx_unmap() to unmap the RX/TX buffers when required
149(e.g: at efi_exit_boot_services()).
150
151The Linux kernel allocates its own RX/TX buffers. To be able to register these kernel buffers
152with secure world, the U-Boot's RX/TX buffers should be unmapped before EFI runtime starts.
153
154When invoking FF-A direct messaging, clients should specify which ABI protocol
155they want to use (32-bit vs 64-bit). Selecting the protocol means using
156the 32-bit or 64-bit version of FFA_MSG_SEND_DIRECT_{REQ, RESP}.
157The calling convention between U-Boot and the secure world stays the same: SMC32.
158
159Requirements for user drivers
160-------------------------------------
161
162Users who want to implement their custom FF-A device driver while reusing the FF-A Uclass can do so
163by implementing their own invoke_ffa_fn() in the user driver.
164
165The bus driver layer
166------------------------------
167
168FF-A support comes on top of the SMCCC layer and is implemented by the FF-A Uclass drivers/firmware/arm-ffa/arm-ffa-uclass.c
169
170The following features are provided:
171
172- Support for the 32-bit version of the following ABIs:
173
174 - FFA_VERSION
175 - FFA_ID_GET
176 - FFA_FEATURES
177 - FFA_PARTITION_INFO_GET
178 - FFA_RXTX_UNMAP
179 - FFA_RX_RELEASE
180 - FFA_RUN
181 - FFA_ERROR
182 - FFA_SUCCESS
183 - FFA_INTERRUPT
184 - FFA_MSG_SEND_DIRECT_REQ
185 - FFA_MSG_SEND_DIRECT_RESP
186
187- Support for the 64-bit version of the following ABIs:
188
189 - FFA_RXTX_MAP
190 - FFA_MSG_SEND_DIRECT_REQ
191 - FFA_MSG_SEND_DIRECT_RESP
192
193- Processing the received data from the secure world/hypervisor and caching it
194
195- Hiding from upper layers the FF-A protocol and registers details. Upper
196 layers focus on exchanged data, FF-A support takes care of how to transport
197 that to the secure world/hypervisor using FF-A
198
199- FF-A support provides driver operations to be used by upper layers:
200
201 - ffa_partition_info_get
202 - ffa_sync_send_receive
203 - ffa_rxtx_unmap
204
205- FF-A bus discovery makes sure FF-A framework is responsive and compatible
206 with the driver
207
208- FF-A bus can be compiled and used without EFI
209
Abdellatif El Khlifi4970d5b2023-08-04 14:33:41 +0100210Relationship between the sandbox emulator and the FF-A device
211---------------------------------------------------------------
212
213::
214
215 => dm tree
216
217 Class Index Probed Driver Name
218 -----------------------------------------------------------
219 ffa_emul 0 [ + ] sandbox_ffa_emul `-- arm-ffa-emul
220 ffa 0 [ ] sandbox_arm_ffa `-- sandbox-arm-ffa
221
Abdellatif El Khlifi2f403d12023-08-04 14:33:40 +0100222Example of boot logs with FF-A enabled
223--------------------------------------
224
225For example, when using FF-A with Corstone-1000 the logs are as follows:
226
227::
228
229 U-Boot 2023.01 (May 10 2023 - 11:08:07 +0000) corstone1000 aarch64
230
231 DRAM: 2 GiB
232 Arm FF-A framework discovery
233 FF-A driver 1.0
234 FF-A framework 1.0
235 FF-A versions are compatible
236 ...
237 FF-A driver 1.0
238 FF-A framework 1.0
239 FF-A versions are compatible
240 EFI: MM partition ID 0x8003
241 ...
242 EFI stub: Booting Linux Kernel...
243 ...
244 Linux version 6.1.9-yocto-standard (oe-user@oe-host) (aarch64-poky-linux-musl-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.40.202301193
245 Machine model: ARM Corstone1000 FPGA MPS3 board
246
247Contributors
248------------
249 * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
250
251.. _`FF-A v1.0 specification`: https://documentation-service.arm.com/static/5fb7e8a6ca04df4095c1d65e
252.. _`SMC Calling Convention v1.2 specification`: https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6