[PATCH v19 0/9] introduce Arm FF-A support
Abdellatif El Khlifi
abdellatif.elkhlifi at arm.com
Fri Aug 4 15:33:36 CEST 2023
Adding support for Arm FF-A v1.0 (Arm Firmware Framework for Armv8-A) [A].
FF-A specifies interfaces that enable a pair of software execution environments aka partitions to
communicate with each other. A partition could be a VM in the Normal or Secure world, an
application in S-EL0, or a Trusted OS in S-EL1.
FF-A is a discoverable bus and similar to architecture features.
FF-A bus is discovered using ARM_SMCCC_FEATURES mechanism performed
by the PSCI driver.
=> dm tree
Class Index Probed Driver Name
-----------------------------------------------------------
...
firmware 0 [ + ] psci |-- psci
ffa 0 [ ] arm_ffa | `-- arm_ffa
...
Clients are able to probe then use the FF-A bus by calling the DM class
searching APIs (e.g: uclass_first_device).
This implementation of the specification provides support for Aarch64.
The FF-A driver uses the SMC ABIs defined by the FF-A specification to:
- Discover the presence of secure partitions (SPs) of interest
- Access an SP's service through communication protocols
(e.g: EFI MM communication protocol)
The FF-A support provides the following features:
- Being generic by design and can be used by any Arm 64-bit platform
- FF-A support can be compiled and used without EFI
- Support for SMCCCv1.2 x0-x17 registers
- Support for SMC32 calling convention
- Support for 32-bit and 64-bit FF-A direct messaging
- Support for FF-A MM communication (compatible with EFI boot time)
- Enabling FF-A and MM communication in Corstone1000 platform as a use case
- A Uclass driver providing generic FF-A methods.
- An Arm FF-A device driver providing Arm-specific methods and reusing the Uclass methods.
- A sandbox emulator for Arm FF-A, emulates the FF-A side of the Secure World and provides
FF-A ABIs inspection methods.
- An FF-A sandbox device driver for FF-A communication with the emulated Secure World.
The driver leverages the FF-A Uclass to establish FF-A communication.
- Sandbox FF-A test cases.
- A new command called armffa is provided as an example of how to access the
FF-A bus
For more details about the FF-A support please refer to [B] and refer to [C] for
how to use the armffa command.
Please find at [D] an example of the expected boot logs when enabling
FF-A support for a platform. In this example the platform is
Corstone1000. But it can be any Arm 64-bit platform.
Changelog of changes:
===========================
v19:
Tom:
* use CONFIG_FFA_SHARED_MM_BUF_* in place of macros
v18: [18]
Ilias, Tom:
* drop the use of configs for the shared MM buffer, put back #ifdefs instead
* add test information to the MM comms commit message
v17: [17]
Ilias:
* show a debug message rather than an error when FF-A is not detected
Tom:
* use savedefconfig to generate corstone1000_defconfig with FF-A MM comms enabled
v16: [16]
Tom:
* lib/efi_loader/Kconfig:
rather than automatically selecting OPTEE and ARM_FFA_TRANSPORT configs by
EFI_MM_COMM_TEE, set them as dependencies (Otherwise FF-A will be automatically
enabled for boards that don't need it).
* configs/corstone1000_defconfig:
enable MM communication by setting the configs: ARM_FFA_TRANSPORT, OPTEE, TEE
v15: [15]
Simon:
* drop commit "log: select physical address formatting in a generic way",
this will be sent as a follow-up commit independently from this patchset
* armffa.c : integrate PHYS_ADDR_LN
* replace FFA_SHARED_MM_BUFFER_* defines with configs
v14: [14]
Simon:
* add to log.h a generic physical address formatting
Ilias:
* armffa command: in do_ffa_ping() reject the SP ID if it's 0
* MM comms: drop truncating var_payload->size when using FF-A
* MM comms: map the MM SP return codes to errnos
* address nits
v13: [13]
Ilias:
* remove FF-A and Optee ifdefs in efi_variable_tee.c
* doc minor change: specify in the readme that the user
should call ffa_rxtx_unmap() driver operation to unmap
the RX/TX buffers on demand.
v12: [12]
* remove the global variable (dscvry_info), use uc_priv instead
* replace dscvry_info.invoke_ffa_fn() with a weak invoke_ffa_fn
(user drivers can override it)
* improve FFA_PARTITION_INFO_GET implementation
(clients no longer need to calloc a buffer)
* remove reparenting by making the sandbox emulator parent of the FF-A device in the DT
* improve argument checks for the armffa command
* address nits
v11: [11]
* move ffa_try_discovery() from the uclass to the Arm FF-A driver
* rename ffa_try_discovery() to arm_ffa_discover()
* add arm_ prefix to the Arm FF-A driver functions
* use U_BOOT_CMD_WITH_SUBCMDS for armffa command
* store the sandbox emulator pointer in the FF-A device uc_priv (struct ffa_priv)
* set the emulator as parent of the sandbox FF-A device
* rename select_ffa_mm_comms() to select_mm_comms()
* improve the logic of MM transport selection in mm_communicate()
* use ut_asserteq_mem() in uuid_str_to_le_bin test case
* address nits
v10: [10]
* provide the FF-A driver operations through the Uclass (arm-ffa-uclass.c)
* move the generic FF-A methods to the Uclass
* keep Arm specific methods in the Arm driver (arm-ffa.c renamed from core.c)
* split the FF-A sandbox support into an emulator (ffa-emul-uclass.c) and a driver (sandbox_ffa.c)
* use the FF-A driver Uclass operations by clients (armffa command, tests, MM comms)
* use uclass_first_device to search and probe the FF-A device (whether it is on Arm or on sandbox)
* address nits
v9: [9]
* integrate the FF-A bus discovery in the DM and use ARM_SMCCC_FEATURES for binding
* align FF-A sandbox driver with FF-A discovery through DM
* use DM class APIs to probe and interact with the FF-A bus (in FF-A MM comms, armffa command, sandbox tests)
* add documentation for the armffa command: doc/usage/cmd/armffa.rst
* introduce testcase for uuid_str_to_le_bin
v8: [8]
* pass the FF-A bus device to the bus operations
* isolate the compilation choices between FF-A and OP-TEE
* drop OP-TEE configs from Corstone-1000 defconfig
* make ffa_get_partitions_info() second argument to be an SP count in both
modes
v7: [7]
* add support for 32-bit direct messaging (now we have 32-bit and 64-bit support)
* set the MM door bell event to use 64-bit direct messaging
* issue a compile time error when one of these macros are not found :
FFA_SHARED_MM_BUFFER_SIZE, FFA_SHARED_MM_BUFFER_OFFSET, FFA_SHARED_MM_BUFFER_ADDR
* make uuid_str_to_le_bin() implementation similar to uuid_str_to_bin()
by using same APIs
v6: [6]
* remove clearing x0-x17 registers after SMC calls
* drop use of EFI runtime support for FF-A (We decided with Linaro to add this later)
* drop discovery from initcalls (discovery will be on demand by FF-A users)
* add FF-A runtime discovery at MM communication level
* update the documentation and move it to doc/arch/arm64.ffa.rst
v5: [5]
* move changelogs in each commit to the changes section
v4: [4]
* add FF-A support README (doc/README.ffa.drv)
* improving error handling by mapping the FF-A errors to standard errors
and logs
* replacing panics with an error log
* align sandbox driver and tests with the new FF-A driver interfaces
and new way of error handling
* use the new FF-A driver interfaces for MM communication
* discover MM partitions at runtime
* copy FF-A driver private data to EFI runtime section at
ExitBootServices()
* moving the FF-A driver work to drivers/firmware/arm-ffa
* improving features discovery in FFA_FEATURES
* add remove/unbind functions to the FF-A core device
* improve how the driver behaves when bus discovery is done more than
once
* move clearing x0-x17 registers code into a new macro like done in
the linux kernel
* enable EFI MM communication for the Corstone1000 platform
v3: [3]
* port x0-x17 registers support from linux kernel as defined by
SMCCCv1.2
* align the interfaces of the u-boot FF-A driver with those in the linux
FF-A driver
* remove the FF-A helper layer
* make the u-boot FF-A driver independent from EFI
* provide an optional config that enables copying the driver data to
EFI runtime section at ExitBootServices service
* use 64-bit version of FFA_RXTX_MAP, FFA_MSG_SEND_DIRECT_{REQ, RESP}
* update armffa command with the new driver interfaces
v2 [2]:
* make FF-A bus discoverable using device_{bind, probe} APIs
* remove device tree support
v1 [1]:
* introduce FF-A bus driver with device tree support
* introduce armffa command
* introduce FF-A Sandbox driver
* add FF-A Sandbox test cases
* introduce FF-A MM communication
Cheers,
Abdellatif
List of previous patches:
[1]: https://lore.kernel.org/all/20220329151659.16894-1-abdellatif.elkhlifi@arm.com/
[2]: https://lore.kernel.org/all/20220415122803.16666-1-abdellatif.elkhlifi@arm.com/
[3]: https://lore.kernel.org/all/20220801172053.20163-1-abdellatif.elkhlifi@arm.com/
[4]: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/
[5]: https://lore.kernel.org/all/20220926140827.15125-1-abdellatif.elkhlifi@arm.com/
[6]: https://lore.kernel.org/all/20221013103857.614-1-abdellatif.elkhlifi@arm.com/
[7]: https://lore.kernel.org/all/20221107192055.21669-1-abdellatif.elkhlifi@arm.com/
[8]: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/
[9]: https://lore.kernel.org/all/20230310141016.137986-1-abdellatif.elkhlifi@arm.com/
[10]: https://lore.kernel.org/all/20230328161157.219375-1-abdellatif.elkhlifi@arm.com/
[11]: https://lore.kernel.org/all/20230412094245.44674-1-abdellatif.elkhlifi@arm.com/
[12]: https://lore.kernel.org/all/20230512121044.111574-1-abdellatif.elkhlifi@arm.com/
[13]: https://lore.kernel.org/all/20230616152817.319869-1-abdellatif.elkhlifi@arm.com/
[14]: https://lore.kernel.org/all/20230707144410.228472-1-abdellatif.elkhlifi@arm.com/
[15]: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/
[16]: https://lore.kernel.org/all/20230726094503.100497-1-abdellatif.elkhlifi@arm.com/
[17]: https://lore.kernel.org/all/20230727160712.81477-1-abdellatif.elkhlifi@arm.com/
[18]: https://lore.kernel.org/all/20230803160350.477781-1-abdellatif.elkhlifi@arm.com/
More details:
[A]: https://developer.arm.com/documentation/den0077/latest/
[B]: doc/arch/arm64.ffa.rst
[C]: doc/usage/cmd/armffa.rst
[D]: example of boot logs when enabling FF-A
```
U-Boot 2023.01 (May 10 2023 - 11:08:07 +0000) corstone1000 aarch64
DRAM: 2 GiB
Arm FF-A framework discovery
FF-A driver 1.0
FF-A framework 1.0
FF-A versions are compatible
...
FF-A driver 1.0
FF-A framework 1.0
FF-A versions are compatible
EFI: MM partition ID 0x8003
...
EFI stub: Booting Linux Kernel...
...
Linux version 6.1.9-yocto-standard (oe-user at oe-host) (aarch64-poky-linux-musl-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.40.202301193
Machine model: ARM Corstone1000 FPGA MPS3 board
```
Cc: Tom Rini <trini at konsulko.com>
Cc: Simon Glass <sjg at chromium.org>
Cc: Rob Herring <robh at kernel.org>
Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Cc: Jens Wiklander <jens.wiklander at linaro.org>
Cc: Achin Gupta <achin.gupta at arm.com>
Cc: Drew Reed <Drew.Reed at arm.com>
Cc: Xueliang Zhong <Xueliang.Zhong at arm.com>
Abdellatif El Khlifi (9):
arm64: smccc: add support for SMCCCv1.2 x0-x17 registers
lib: uuid: introduce uuid_str_to_le_bin function
lib: uuid: introduce testcase for uuid_str_to_le_bin
arm_ffa: introduce Arm FF-A support
arm_ffa: introduce sandbox FF-A support
arm_ffa: introduce sandbox test cases for UCLASS_FFA
arm_ffa: introduce armffa command
arm_ffa: efi: introduce FF-A MM communication
arm_ffa: efi: corstone1000: enable MM communication
MAINTAINERS | 18 +
arch/arm/cpu/armv8/smccc-call.S | 57 +-
arch/arm/lib/asm-offsets.c | 16 +
arch/sandbox/dts/sandbox.dtsi | 9 +
arch/sandbox/dts/test.dts | 8 +
arch/sandbox/include/asm/sandbox_arm_ffa.h | 72 ++
.../include/asm/sandbox_arm_ffa_priv.h | 121 ++
cmd/Kconfig | 10 +
cmd/Makefile | 1 +
cmd/armffa.c | 202 ++++
configs/corstone1000_defconfig | 13 +-
configs/sandbox64_defconfig | 1 +
configs/sandbox_defconfig | 1 +
doc/arch/arm64.ffa.rst | 261 ++++
doc/arch/index.rst | 1 +
doc/arch/sandbox/sandbox.rst | 1 +
doc/usage/cmd/armffa.rst | 94 ++
doc/usage/index.rst | 1 +
drivers/Makefile | 1 +
drivers/firmware/Kconfig | 1 +
drivers/firmware/arm-ffa/Kconfig | 42 +
drivers/firmware/arm-ffa/Makefile | 16 +
drivers/firmware/arm-ffa/arm-ffa-uclass.c | 1065 +++++++++++++++++
drivers/firmware/arm-ffa/arm-ffa.c | 104 ++
drivers/firmware/arm-ffa/ffa-emul-uclass.c | 720 +++++++++++
drivers/firmware/arm-ffa/sandbox_ffa.c | 110 ++
include/arm_ffa.h | 213 ++++
include/arm_ffa_priv.h | 246 ++++
include/dm/uclass-id.h | 7 +
include/linux/arm-smccc.h | 45 +
include/mm_communication.h | 17 +
include/uuid.h | 15 +
lib/efi_loader/Kconfig | 39 +-
lib/efi_loader/efi_variable_tee.c | 270 ++++-
lib/uuid.c | 48 +
test/cmd/Makefile | 2 +
test/cmd/armffa.c | 33 +
test/dm/Makefile | 3 +-
test/dm/ffa.c | 261 ++++
test/lib/Makefile | 1 +
test/lib/uuid.c | 41 +
41 files changed, 4174 insertions(+), 13 deletions(-)
create mode 100644 arch/sandbox/include/asm/sandbox_arm_ffa.h
create mode 100644 arch/sandbox/include/asm/sandbox_arm_ffa_priv.h
create mode 100644 cmd/armffa.c
create mode 100644 doc/arch/arm64.ffa.rst
create mode 100644 doc/usage/cmd/armffa.rst
create mode 100644 drivers/firmware/arm-ffa/Kconfig
create mode 100644 drivers/firmware/arm-ffa/Makefile
create mode 100644 drivers/firmware/arm-ffa/arm-ffa-uclass.c
create mode 100644 drivers/firmware/arm-ffa/arm-ffa.c
create mode 100644 drivers/firmware/arm-ffa/ffa-emul-uclass.c
create mode 100644 drivers/firmware/arm-ffa/sandbox_ffa.c
create mode 100644 include/arm_ffa.h
create mode 100644 include/arm_ffa_priv.h
create mode 100644 test/cmd/armffa.c
create mode 100644 test/dm/ffa.c
create mode 100644 test/lib/uuid.c
--
2.25.1
More information about the U-Boot
mailing list