Re: [PATCH v16 09/10] arm_ffa: efi: introduce FF-A MM communication

Ilias Apalodimas
2023-07-27T11:27:31Z

Hi Abdellatif,

[...]

> +}
> +
> +/**
> + * get_mm_comms() - detect the available MM transport
> + *
> + * Make sure the FF-A bus is probed successfully
> + * which means FF-A communication with secure world works and ready
> + * for use.
> + *
> + * If FF-A bus is not ready, use OPTEE comms.
> + *
> + * Return:
> + *
> + * MM_COMMS_FFA or MM_COMMS_OPTEE
> + */
> +static enum mm_comms_select get_mm_comms(void)
> +{
> + struct udevice *dev;
> + int ret;
> +
> + ret = uclass_first_device_err(UCLASS_FFA, &dev);
> + if (ret) {
> + log_err("EFI: Cannot find FF-A bus device, trying Optee comms\n");

This isn't an error. If you mark it as one it will pollute the console
every time you try to decide if it's an FFA or an SMC call to op-tee. So
either remote this or switch it to log_debug or something. While at it,
any reason why we need to keep probing the ffa bus? Can't we just run this
once during init?

> + return MM_COMMS_OPTEE;
> + }
> +
> + return MM_COMMS_FFA;
> +}
> +
> +/**
> + * mm_communicate() - Adjust the communication buffer to the MM SP and send
> * it to OP-TEE
> *
> - * @comm_buf: locally allocted communcation buffer
> + * @comm_buf: locally allocated communication buffer
> * @dsize: buffer size
> + *
> + * The SP (also called partition) can be any MM SP such as StandAlonneMM or smm-gateway.
> + * The comm_buf format is the same for both partitions.
> + * When using the u-boot OP-TEE driver, StandAlonneMM is supported.
> + * When using the u-boot FF-A driver, any MM SP is supported.
> + *
> * Return: status code
> */
> static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
> {
> efi_status_t ret;
> + enum mm_comms_select mm_comms;
> struct efi_mm_communicate_header *mm_hdr;
> struct smm_variable_communicate_header *var_hdr;
>
> @@ -162,7 +404,12 @@ static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
> mm_hdr = (struct efi_mm_communicate_header *)comm_buf;
> var_hdr = (struct smm_variable_communicate_header *)mm_hdr->data;
>
> - ret = optee_mm_communicate(comm_buf, dsize);
> + mm_comms = get_mm_comms();
> + if (mm_comms == MM_COMMS_FFA)
> + ret = ffa_mm_communicate(comm_buf, dsize);
> + else
> + ret = optee_mm_communicate(comm_buf, dsize);
> +
> if (ret != EFI_SUCCESS) {
> log_err("%s failed!\n", __func__);
> return ret;
> @@ -697,7 +944,7 @@ void efi_variables_boot_exit_notify(void)
> ret = EFI_NOT_FOUND;
>
> if (ret != EFI_SUCCESS)
> - log_err("Unable to notify StMM for ExitBootServices\n");
> + log_err("Unable to notify the MM partition for ExitBootServices\n");
> free(comm_buf);
>
> /*
> --
> 2.25.1
>

Thanks
/Ilias