Hi Abdellatif

I still have some concerns on this

In the past [0] I asking why this needs to be a Kconfig option.  Since FF-A
is a mechanism we can use to discover SPs, in theory we dont need the
ifdefery.  We might need something if the code difference grows too much
but I think we are fine for now. 

On top of that I am nissing how was this tested?  did you test the current
SMC to optee and the stmm for the RPMB backend?

> +++ b/include/mm_communication.h
> @@ -6,6 +6,9 @@
>   *  Copyright (c) 2017, Intel Corporation. All rights reserved.
>   *  Copyright (C) 2020 Linaro Ltd. <sughosh.g...@linaro.org>
>   *  Copyright (C) 2020 Linaro Ltd. <ilias.apalodi...@linaro.org>
> + *  Copyright 2022-2023 Arm Limited and/or its affiliates 
> <open-source-off...@arm.com>
> + *    Authors:
> + *      Abdellatif El Khlifi <abdellatif.elkhl...@arm.com>
>   */
>  
>  #ifndef _MM_COMMUNICATION_H_
> @@ -13,6 +16,9 @@
>  
>  #include <part_efi.h>
>  
> +/* MM service UUID string (big-endian format). This UUID is  common across 
> all MM SPs */
> +#define MM_SP_UUID   "33d532ed-e699-0942-c09c-a798d9cd722d"
> +
>  /*
>   * Interface to the pseudo Trusted Application (TA), which provides a
>   * communication channel with the Standalone MM (Management Mode)
> @@ -248,4 +254,11 @@ struct smm_variable_var_check_property {
>       u16                       name[];
>  };
>  
> +/* supported MM transports */
> +enum mm_comms_select {
> +     MM_COMMS_UNDEFINED,
> +     MM_COMMS_FFA,
> +     MM_COMMS_OPTEE
> +};
> +
>  #endif /* _MM_COMMUNICATION_H_ */
> diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
> index c5835e6ef6..08a6b84101 100644
> --- a/lib/efi_loader/Kconfig
> +++ b/lib/efi_loader/Kconfig
> @@ -55,13 +55,23 @@ config EFI_VARIABLE_FILE_STORE
>         stored as file /ubootefi.var on the EFI system partition.
>  
>  config EFI_MM_COMM_TEE
> -     bool "UEFI variables storage service via OP-TEE"
> -     depends on OPTEE
> +     bool "UEFI variables storage service via the trusted world"
> +     depends on OPTEE || ARM_FFA_TRANSPORT
>       help
> +       Allowing access to the MM SP services (SPs such as  StandAlonneMM, 
> smm-gateway).
> +       When using the u-boot OP-TEE driver, StandAlonneMM is supported.
> +       When using the u-boot FF-A  driver any MM SP is supported.
> +
>         If OP-TEE is present and running StandAloneMM, dispatch all UEFI
>         variable related operations to that. The application will verify,
>         authenticate and store the variables on an RPMB.
>  
> +       When ARM_FFA_TRANSPORT is used, dispatch all UEFI variable related
> +       operations to the MM SP running in the secure world.
> +       A door bell mechanism is used to notify the SP when there is data in 
> the shared
> +       MM buffer. The data is copied by u-boot to the shared buffer before 
> issuing
> +       the door bell event.
> +
>  config EFI_VARIABLE_NO_STORE
>       bool "Don't persist non-volatile UEFI variables"
>       help
> diff --git a/lib/efi_loader/efi_variable_tee.c 
> b/lib/efi_loader/efi_variable_tee.c
> index dfef18435d..2effb705d7 100644
> --- a/lib/efi_loader/efi_variable_tee.c
> +++ b/lib/efi_loader/efi_variable_tee.c
> @@ -4,9 +4,14 @@
>   *
>   *  Copyright (C) 2019 Linaro Ltd. <sughosh.g...@linaro.org>
>   *  Copyright (C) 2019 Linaro Ltd. <ilias.apalodi...@linaro.org>
> + *  Copyright 2022-2023 Arm Limited and/or its affiliates 
> <open-source-off...@arm.com>
> + *
> + *  Authors:
> + *    Abdellatif El Khlifi <abdellatif.elkhl...@arm.com>
>   */
>  
>  #include <common.h>
> +#include <dm.h>
>  #include <efi.h>
>  #include <efi_api.h>
>  #include <efi_loader.h>
> @@ -15,6 +20,36 @@
>  #include <malloc.h>
>  #include <mm_communication.h>
>  
> +#if IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT)
> +
> +#include <arm_ffa.h>
> +#include <cpu_func.h>
> +#include <mapmem.h>
> +
> +#ifndef FFA_SHARED_MM_BUFFER_SIZE
> +#error "FFA_SHARED_MM_BUFFER_SIZE must be defined in 
> include/configs/<board>.h"
> +#define FFA_SHARED_MM_BUFFER_SIZE 0
> +#endif
> +
> +#ifndef FFA_SHARED_MM_BUFFER_OFFSET
> +#error "FFA_SHARED_MM_BUFFER_OFFSET must be defined in 
> include/configs/<board>.h"
> +#define FFA_SHARED_MM_BUFFER_OFFSET 0
> +#endif
> +
> +#ifndef FFA_SHARED_MM_BUFFER_ADDR
> +#error "FFA_SHARED_MM_BUFFER_ADDR must be defined in 
> include/configs/<board>.h"
> +#define FFA_SHARED_MM_BUFFER_ADDR 0
> +#endif
> +
> +/* MM return codes */
> +#define MM_SUCCESS (0)
> +
> +static const char *mm_sp_svc_uuid = MM_SP_UUID;
> +
> +static u16 mm_sp_id;
> +
> +#endif
> +
>  extern struct efi_var_file __efi_runtime_data *efi_var_buf;
>  static efi_uintn_t max_buffer_size;  /* comm + var + func + data */
>  static efi_uintn_t max_payload_size; /* func + data */
> @@ -24,6 +59,7 @@ struct mm_connection {
>       u32 session;
>  };
>  
> +#if (IS_ENABLED(CONFIG_OPTEE))

>  /**
>   * get_connection() - Retrieve OP-TEE session for a specific UUID.
>   *

[...]

Isn't this problematic?  At the moment there's not > 8.4 hardware out
there.  As a result the SPMC *is* implemented in OP-TEE.  So how do we
expect FF-A to work?

[...]

[0] https://lore.kernel.org/u-boot/Y3NV991bKRgas1zZ@hera/

Thanks
/Ilias

Reply via email to