
Hi Simon,
Adding support for Arm FF-A v1.0 (Arm Firmware Framework for Armv8-A) [A].
FF-A describes interfaces (ABIs) that standardize communication between the Secure World and Normal World. These interfaces enable a pair of software sandboxes to communicate with each other. A sandbox aka 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_get_device_by_name).
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 - A Uclass driver providing generic FF-A methods and driver operations - An Arm FF-A device driver - 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 - A new command called armffa is provided as an example of how to access the FF-A bus - 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 sandbox emulator for Arm FF-A - An FF-A sandbox device driver - Sandbox FF-A test cases
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 the major changes:
v11:
- 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
A gentle reminder for reviewing the v11 changes please. I already put you in CC :)
Thank you in advance.
Cheers, Abdellatif
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:
More details:
[D]: example of boot logs when enabling FF-A
U-Boot 2023.01 (Mar 27 2023 - 13:48:33 +0000) corstone1000 aarch64 DRAM: 2 GiB Arm FF-A framework discovery Using Arm SMC for FF-A conduit FF-A driver 1.0 FF-A framework 1.0 FF-A versions are compatible ... Hit any key to stop autoboot: 0 Loading kernel from 0x083EE000 to memory ... ... FF-A endpoint ID is 0 Using 1 4KB page(s) for FF-A RX/TX buffers size FF-A RX buffer at virtual address 00000000fdf4f000 FF-A TX buffer at virtual address 00000000fdf51000 FF-A RX/TX buffers mapped Reading FF-A partitions data from the RX buffer FF-A partition ID 8001 : info cached FF-A partition ID 8002 : info cached FF-A partition ID 8003 : info cached 3 FF-A partition(s) found and cached Preparing for checking FF-A partitions count Searching FF-A partitions using the provided UUID No FF-A partition found. Querying framework ... Reading FF-A partitions data from the RX buffer Number of FF-A partition(s) matching the UUID: 1 EFI: Pre-allocating 1 partition(s) info structures Preparing for filling FF-A partitions info Searching FF-A partitions using the provided UUID FF-A partition ID 8003 matches the provided UUID EFI: MM partition ID 0x8003 EFI: Corstone1000: Capsule shared buffer at 0x80000000 , size 8192 pages Booting /MemoryMapped(0x0,0x88200000,0xf00000) EFI stub: Booting Linux Kernel... EFI stub: Using DTB from configuration table EFI stub: Exiting boot services... unmapping FF-A RX/TX buffers Freeing FF-A RX/TX buffers Booting Linux on physical CPU 0x0000000000 [0x411fd040] 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 Machine model: ARM Corstone1000 FPGA MPS3 board
Cc: Tom Rini trini@konsulko.com Cc: Simon Glass sjg@chromium.org Cc: Rob Herring robh@kernel.org Cc: Ilias Apalodimas ilias.apalodimas@linaro.org Cc: Jens Wiklander jens.wiklander@linaro.org Cc: Achin Gupta achin.gupta@arm.com Cc: Drew Reed Drew.Reed@arm.com Cc: Xueliang Zhong Xueliang.Zhong@arm.com
Abdellatif El Khlifi (10): 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 armffa command arm_ffa: introduce sandbox FF-A support arm_ffa: introduce sandbox test cases for UCLASS_FFA arm_ffa: introduce armffa command Sandbox test 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 | 8 + arch/sandbox/dts/test.dts | 8 + arch/sandbox/include/asm/sandbox_arm_ffa.h | 72 ++ .../include/asm/sandbox_arm_ffa_priv.h | 133 ++ cmd/Kconfig | 10 + cmd/Makefile | 2 + cmd/armffa.c | 212 +++ configs/corstone1000_defconfig | 2 + configs/sandbox64_defconfig | 1 + configs/sandbox_defconfig | 1 + doc/arch/arm64.ffa.rst | 294 +++++ doc/arch/index.rst | 1 + doc/arch/sandbox/sandbox.rst | 1 + doc/usage/cmd/armffa.rst | 105 ++ 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 | 1143 +++++++++++++++++ drivers/firmware/arm-ffa/arm-ffa.c | 127 ++ drivers/firmware/arm-ffa/ffa-emul-uclass.c | 738 +++++++++++ drivers/firmware/arm-ffa/sandbox_ffa.c | 119 ++ include/arm_ffa.h | 217 ++++ include/arm_ffa_priv.h | 271 ++++ include/configs/corstone1000.h | 15 +- include/dm/uclass-id.h | 7 + include/linux/arm-smccc.h | 45 + include/mm_communication.h | 13 + include/uuid.h | 15 + lib/efi_loader/Kconfig | 14 +- lib/efi_loader/efi_variable_tee.c | 312 ++++- lib/uuid.c | 48 + test/cmd/Makefile | 2 + test/cmd/armffa.c | 39 + test/dm/Makefile | 2 + test/dm/ffa.c | 258 ++++ test/lib/Makefile | 1 + test/lib/uuid.c | 41 + 42 files changed, 4420 insertions(+), 9 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