[PATCH v9 00/10] introduce Arm FF-A support

Abdellatif El Khlifi abdellatif.elkhlifi at arm.com
Fri Mar 10 15:10:06 CET 2023

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
    - The FF-A core driver
    - The driver provides driver operations to be used by clients to access the FF-A bus
    - FF-A driver 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
    - An FF-A Sandbox driver is provided with test cases
    - Support for FF-A MM communication (compatible with EFI boot time)
    - Enabling FF-A and MM communication in Corstone1000 platform as a use case

For more details about the FF-A core driver 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:


* 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

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 :
* 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
* 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
* 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
* 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


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/

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 (Mar 07 2023 - 11:05:21 +0000) corstone1000 aarch64

   DRAM:  2 GiB
   [FFA] trying FF-A framework discovery
   [FFA] Conduit is SMC
   [FFA] FF-A driver 1.0
   FF-A framework 1.0
   [FFA] Versions are compatible
   Core:  18 devices, 12 uclasses, devicetree: separate
   Loading Environment from nowhere... OK
   Hit any key to stop autoboot:  0
   Loading kernel from 0x083EE000 to memory ...
   [FFA] endpoint ID is 0
   [FFA] Using 1 4KB page(s) for RX/TX buffers size
   [FFA] RX buffer at virtual address 00000000fdf4e000
   [FFA] TX buffer at virtual address 00000000fdf50000
   [FFA] RX/TX buffers mapped
   [FFA] Reading partitions data from the RX buffer
   [FFA] Partition ID 8001 : info cached
   [FFA] Partition ID 8002 : info cached
   [FFA] Partition ID 8003 : info cached
   [FFA] 3 partition(s) found and cached
   [FFA] Preparing for checking partitions count
   [FFA] Searching partitions using the provided UUID
   [FFA] No partition found. Querying framework ...
   [FFA] Reading partitions data from the RX buffer
   [FFA] Number of partition(s) matching the UUID: 1
   EFI: Pre-allocating 1 partition(s) info structures
   [FFA] Preparing for filling partitions info
   [FFA] Searching partitions using the provided UUID
   [FFA] 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...
   [FFA] removing the device
   [FFA] unmapping RX/TX buffers
   [FFA] Freeing RX/TX buffers
   Booting Linux on physical CPU 0x0000000000 [0x411fd040]
   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
   efi: EFI v2.100 by Das U-Boot

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 (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 low-level driver
  arm_ffa: introduce armffa command
  arm_ffa: introduce the FF-A Sandbox driver
  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                                   |   17 +
 arch/arm/cpu/armv8/smccc-call.S               |   57 +-
 arch/arm/lib/asm-offsets.c                    |   16 +
 arch/sandbox/dts/sandbox.dtsi                 |    4 +
 arch/sandbox/dts/test.dts                     |    4 +
 cmd/Kconfig                                   |   10 +
 cmd/Makefile                                  |    2 +
 cmd/armffa.c                                  |  264 ++++
 configs/corstone1000_defconfig                |    2 +
 configs/sandbox64_defconfig                   |    2 +
 configs/sandbox_defconfig                     |    2 +
 doc/arch/arm64.ffa.rst                        |  286 ++++
 doc/arch/index.rst                            |    1 +
 doc/arch/sandbox/sandbox.rst                  |    1 +
 doc/usage/cmd/armffa.rst                      |  118 ++
 doc/usage/index.rst                           |    1 +
 drivers/Makefile                              |    1 +
 drivers/firmware/Kconfig                      |    1 +
 drivers/firmware/arm-ffa/Kconfig              |   39 +
 drivers/firmware/arm-ffa/Makefile             |    9 +
 drivers/firmware/arm-ffa/arm-ffa-uclass.c     |   33 +
 drivers/firmware/arm-ffa/arm_ffa_priv.h       |  209 +++
 drivers/firmware/arm-ffa/core.c               | 1283 +++++++++++++++++
 drivers/firmware/arm-ffa/sandbox.c            |  610 ++++++++
 .../firmware/arm-ffa/sandbox_arm_ffa_priv.h   |  129 ++
 include/arm_ffa.h                             |   89 ++
 include/configs/corstone1000.h                |   15 +-
 include/dm/uclass-id.h                        |    6 +
 include/linux/arm-smccc.h                     |   45 +
 include/mm_communication.h                    |    6 +
 include/sandbox_arm_ffa.h                     |  124 ++
 include/uuid.h                                |   15 +
 lib/efi_loader/Kconfig                        |   14 +-
 lib/efi_loader/efi_variable_tee.c             |  317 +++-
 lib/uuid.c                                    |   48 +
 test/cmd/Makefile                             |    2 +
 test/cmd/armffa.c                             |   39 +
 test/dm/Makefile                              |    2 +
 test/dm/ffa.c                                 |  380 +++++
 test/lib/Makefile                             |    1 +
 test/lib/uuid.c                               |   44 +
 41 files changed, 4239 insertions(+), 9 deletions(-)
 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_priv.h
 create mode 100644 drivers/firmware/arm-ffa/core.c
 create mode 100644 drivers/firmware/arm-ffa/sandbox.c
 create mode 100644 drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h
 create mode 100644 include/arm_ffa.h
 create mode 100644 include/sandbox_arm_ffa.h
 create mode 100644 test/cmd/armffa.c
 create mode 100644 test/dm/ffa.c
 create mode 100644 test/lib/uuid.c


More information about the U-Boot mailing list