From 968c86e8a6ed3e9e6621f0ae44977b5b13d90bfd Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Date: Tue, 16 Nov 2021 12:34:52 +0000
Subject: [PATCH 06/24] arm_ffa: introducing Arm FF-A low-level driver

This driver implements Arm Firmware Framework for Armv8-A on u-boot

The Firmware Framework for Arm A-profile processors (FF-A)
describes interfaces (ABIs) that standardize communication
between the Secure World and Normal World leveraging TrustZone
technology.

This driver is based on FF-A specification v1.0 and uses SMC32
calling convention.

FF-A specification:

https://developer.arm.com/documentation/den0077/a/?lang=en

The driver provides helper FF-A interfaces for user layers.
These helper functions allow clients to pass data and select the
FF-A function to use for the communication with secure world.

Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
---
 MAINTAINERS                      |    8 +
 arch/arm/cpu/armv8/smccc-call.S  |   27 +
 arch/arm/lib/asm-offsets.c       |    6 +
 common/board_r.c                 |    6 +
 drivers/Kconfig                  |    2 +
 drivers/Makefile                 |    1 +
 drivers/arm-ffa/Kconfig          |   26 +
 drivers/arm-ffa/Makefile         |    3 +
 drivers/arm-ffa/arm-ffa-uclass.c |   67 ++
 drivers/arm-ffa/arm_ffa_prv.h    |  199 ++++
 drivers/arm-ffa/core.c           | 1484 ++++++++++++++++++++++++++++++
 include/arm_ffa.h                |  191 ++++
 include/arm_ffa_helper.h         |   45 +
 include/dm/uclass-id.h           |    1 +
 include/linux/arm-smccc.h        |   28 +-
 lib/Kconfig                      |    1 +
 lib/Makefile                     |    1 +
 lib/arm-ffa/Kconfig              |    6 +
 lib/arm-ffa/Makefile             |    8 +
 lib/arm-ffa/arm_ffa_helper.c     |  188 ++++
 lib/efi_loader/efi_boottime.c    |   17 +
 21 files changed, 2314 insertions(+), 1 deletion(-)
 create mode 100644 drivers/arm-ffa/Kconfig
 create mode 100644 drivers/arm-ffa/Makefile
 create mode 100644 drivers/arm-ffa/arm-ffa-uclass.c
 create mode 100644 drivers/arm-ffa/arm_ffa_prv.h
 create mode 100644 drivers/arm-ffa/core.c
 create mode 100644 include/arm_ffa.h
 create mode 100644 include/arm_ffa_helper.h
 create mode 100644 lib/arm-ffa/Kconfig
 create mode 100644 lib/arm-ffa/Makefile
 create mode 100644 lib/arm-ffa/arm_ffa_helper.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 7f27ff4c20fc..d29d7e040764 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -244,6 +244,14 @@ F:	board/CZ.NIC/
 F:	configs/turris_*_defconfig
 F:	include/configs/turris_*.h
 
+ARM FF-A
+M:	Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+S:	Maintained
+F:	drivers/arm-ffa/
+F:	include/arm_ffa.h
+F:	include/arm_ffa_helper.h
+F:	lib/arm-ffa/
+
 ARM FREESCALE IMX
 M:	Stefano Babic <sbabic@denx.de>
 M:	Fabio Estevam <festevam@gmail.com>
diff --git a/arch/arm/cpu/armv8/smccc-call.S b/arch/arm/cpu/armv8/smccc-call.S
index dc92b28777c3..ffc39c9fefa2 100644
--- a/arch/arm/cpu/armv8/smccc-call.S
+++ b/arch/arm/cpu/armv8/smccc-call.S
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2015, Linaro Limited
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
  */
 #include <linux/linkage.h>
 #include <linux/arm-smccc.h>
@@ -45,3 +47,28 @@ ENDPROC(__arm_smccc_smc)
 ENTRY(__arm_smccc_hvc)
 	SMCCC	hvc
 ENDPROC(__arm_smccc_hvc)
+
+#if (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
+
+	.macro FFASMCCC instr
+	.cfi_startproc
+	\instr	#0
+	ldr	x9, [sp]
+	stp	x0, x1, [x9, #ARM_SMCCC_RES_X0_OFFS]
+	stp	x2, x3, [x9, #ARM_SMCCC_RES_X2_OFFS]
+	stp	x4, x5, [x9, #ARM_SMCCC_RES_X4_OFFS]
+	stp	x6, x7, [x9, #ARM_SMCCC_RES_X6_OFFS]
+	ret
+	.cfi_endproc
+	.endm
+
+/*
+ * void arm_ffa_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
+ *		  unsigned long a3, unsigned long a4, unsigned long a5,
+ *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
+ */
+ENTRY(__arm_ffa_smccc_smc)
+	FFASMCCC	smc
+ENDPROC(__arm_ffa_smccc_smc)
+
+#endif
diff --git a/arch/arm/lib/asm-offsets.c b/arch/arm/lib/asm-offsets.c
index 22fd541f9a28..45eca83a473c 100644
--- a/arch/arm/lib/asm-offsets.c
+++ b/arch/arm/lib/asm-offsets.c
@@ -9,6 +9,8 @@
  * generate asm statements containing #defines,
  * compile this file to assembler, and then extract the
  * #defines from the assembly-language output.
+ *
+ * (C) Copyright 2021 ARM Limited
  */
 
 #include <common.h>
@@ -115,6 +117,10 @@ int main(void)
 #ifdef CONFIG_ARM_SMCCC
 	DEFINE(ARM_SMCCC_RES_X0_OFFS, offsetof(struct arm_smccc_res, a0));
 	DEFINE(ARM_SMCCC_RES_X2_OFFS, offsetof(struct arm_smccc_res, a2));
+#if (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
+	DEFINE(ARM_SMCCC_RES_X4_OFFS, offsetof(struct arm_smccc_res, a4));
+	DEFINE(ARM_SMCCC_RES_X6_OFFS, offsetof(struct arm_smccc_res, a6));
+#endif
 	DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id));
 	DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state));
 #endif
diff --git a/common/board_r.c b/common/board_r.c
index 6f4aca2077d6..412a0ea9fac3 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -62,6 +62,9 @@
 #include <asm-generic/gpio.h>
 #include <efi_loader.h>
 #include <relocate.h>
+#ifdef CONFIG_ARM_FFA_TRANSPORT
+#include <arm_ffa_helper.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -779,6 +782,9 @@ static init_fnc_t init_sequence_r[] = {
 	INIT_FUNC_WATCHDOG_RESET
 	initr_net,
 #endif
+#ifdef CONFIG_ARM_FFA_TRANSPORT
+	ffa_helper_init_device,
+#endif
 #ifdef CONFIG_POST
 	initr_post,
 #endif
diff --git a/drivers/Kconfig b/drivers/Kconfig
index b26ca8cf70c9..e83c23789d1b 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -6,6 +6,8 @@ source "drivers/core/Kconfig"
 
 source "drivers/adc/Kconfig"
 
+source "drivers/arm-ffa/Kconfig"
+
 source "drivers/ata/Kconfig"
 
 source "drivers/axi/Kconfig"
diff --git a/drivers/Makefile b/drivers/Makefile
index 67c8af74424e..1be687b55d13 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -109,6 +109,7 @@ obj-y += iommu/
 obj-y += smem/
 obj-y += thermal/
 obj-$(CONFIG_TEE) += tee/
+obj-$(CONFIG_ARM_FFA_TRANSPORT) += arm-ffa/
 obj-y += axi/
 obj-y += ufs/
 obj-$(CONFIG_W1) += w1/
diff --git a/drivers/arm-ffa/Kconfig b/drivers/arm-ffa/Kconfig
new file mode 100644
index 000000000000..d71444c1fa90
--- /dev/null
+++ b/drivers/arm-ffa/Kconfig
@@ -0,0 +1,26 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config ARM_FFA_TRANSPORT
+	bool "Enable Arm Firmware Framework for Armv8-A driver"
+	depends on DM && ARM64
+	select ARM_SMCCC
+	select LIB_UUID
+	select ARM_FFA_TRANSPORT_HELPERS
+	select CMD_ARMFFA
+	help
+	  The Firmware Framework for Arm A-profile processors (FF-A)
+	  describes interfaces (ABIs) that standardize communication
+	  between the Secure World and Normal World leveraging TrustZone
+	  technology.
+
+	  This driver is based on FF-A specification v1.0 and uses SMC32
+	  calling convention.
+
+	  FF-A specification:
+
+	  https://developer.arm.com/documentation/den0077/a/?lang=en
+
+	  In u-boot FF-A design, the Secure World is considered as one
+	  entity to communicate with. FF-A communication is handled by
+	  one device and one instance. This device takes care of
+	  all the interactions between Normal world and Secure World.
diff --git a/drivers/arm-ffa/Makefile b/drivers/arm-ffa/Makefile
new file mode 100644
index 000000000000..9fb5bea52299
--- /dev/null
+++ b/drivers/arm-ffa/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += arm-ffa-uclass.o core.o
diff --git a/drivers/arm-ffa/arm-ffa-uclass.c b/drivers/arm-ffa/arm-ffa-uclass.c
new file mode 100644
index 000000000000..43f6066281fe
--- /dev/null
+++ b/drivers/arm-ffa/arm-ffa-uclass.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <arm_ffa.h>
+#include <errno.h>
+#include <log.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+UCLASS_DRIVER(ffa) = {
+	.name		= "ffa",
+	.id		= UCLASS_FFA,
+};
+
+/**
+ * ffa_get_invoke_func - performs a call to the FF-A driver dispatcher
+ * @func_id:	The FF-A function to be used
+ * @func_data:  Pointer to the FF-A function arguments
+ *				container structure. This also includes
+ *				pointers to the returned data needed by
+ *				clients.
+ *
+ * This runtime function passes the FF-A function ID and its arguments to
+ * the FF-A driver dispatcher.
+ * This function is called by the FF-A helper functions.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int __ffa_runtime ffa_get_invoke_func(u32 func_id, struct ffa_interface_data *func_data)
+{
+	if (!ffa_device_get_ops()->invoke_func)
+		return -EINVAL;
+
+	return ffa_device_get_ops()->invoke_func(func_id, func_data);
+}
+
+/**
+ * ffa_init_device - probes the arm_ffa device
+ *
+ * This boot time function makes sure the arm_ffa device is probed
+ * and ready for use.
+ * This function is called automatically at initcalls
+ * level (after u-boot relocation).
+ *
+ * Arm FF-A transport is implemented through a single u-boot
+ * device (arm_ffa). So, there is only one device belonging to UCLASS_FFA.
+ * All FF-A clients should use the arm_ffa device to use the FF-A
+ * transport.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int ffa_init_device(void)
+{
+	ffa_dbg("[%s]", __func__);
+
+	return ffa_get_device();
+}
diff --git a/drivers/arm-ffa/arm_ffa_prv.h b/drivers/arm-ffa/arm_ffa_prv.h
new file mode 100644
index 000000000000..38ea4ba83efc
--- /dev/null
+++ b/drivers/arm-ffa/arm_ffa_prv.h
@@ -0,0 +1,199 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#ifndef __ARM_FFA_PRV_H
+#define __ARM_FFA_PRV_H
+
+#include <arm_ffa.h>
+#include <linux/bitfield.h>
+#include <linux/bitops.h>
+
+/*
+ * This header is private. It is exclusively used by the FF-A driver
+ */
+
+/* FF-A driver version definitions */
+
+#define MAJOR_VERSION_MASK		GENMASK(30, 16)
+#define MINOR_VERSION_MASK		GENMASK(15, 0)
+#define GET_FFA_MAJOR_VERSION(x)		\
+				((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x))))
+#define GET_FFA_MINOR_VERSION(x)		\
+				((u16)(FIELD_GET(MINOR_VERSION_MASK, (x))))
+#define PACK_VERSION_INFO(major, minor)			\
+	(FIELD_PREP(MAJOR_VERSION_MASK, (major)) |	\
+	 FIELD_PREP(MINOR_VERSION_MASK, (minor)))
+
+#define FFA_MAJOR_VERSION		(1)
+#define FFA_MINOR_VERSION		(0)
+#define FFA_VERSION_1_0		\
+			PACK_VERSION_INFO(FFA_MAJOR_VERSION, FFA_MINOR_VERSION)
+
+/* Endpoint ID mask (u-boot endpoint ID) */
+
+#define GET_SELF_ENDPOINT_ID_MASK		GENMASK(15, 0)
+#define GET_SELF_ENDPOINT_ID(x)		\
+			((u16)(FIELD_GET(GET_SELF_ENDPOINT_ID_MASK, (x))))
+
+#define PREP_SELF_ENDPOINT_ID_MASK		GENMASK(31, 16)
+#define PREP_SELF_ENDPOINT_ID(x)		\
+			((u16)(FIELD_PREP(PREP_SELF_ENDPOINT_ID_MASK, (x))))
+
+/* Partition endpoint ID mask  (partition with which u-boot communicates with) */
+
+#define PREP_PART_ENDPOINT_ID_MASK		GENMASK(15, 0)
+#define PREP_PART_ENDPOINT_ID(x)		\
+			((u16)(FIELD_PREP(PREP_PART_ENDPOINT_ID_MASK, (x))))
+
+/* The FF-A SMC function prototype definition */
+
+typedef void (*invoke_ffa_fn_t)(unsigned long a0, unsigned long a1,
+			unsigned long a2, unsigned long a3, unsigned long a4,
+			unsigned long a5, unsigned long a6, unsigned long a7,
+			struct arm_smccc_res *res);
+
+/**
+ * enum ffa_conduit - Arm FF-A conduits supported by the Arm FF-A driver
+ * Currently only SMC32 is supported.
+ */
+enum ffa_conduit {
+	FFA_CONDUIT_SMC = 0,
+};
+
+/**
+ * FFA_DECLARE_ARGS - FF-A functions local variables
+ * @a0-a7:	local variables used to set registers x0-x7
+ * @res:	the structure hosting the FF-A function return data
+ *
+ * A helper macro for declaring local variables for the FF-A functions  arguments.
+ * The x0-x7 registers are used to exchange data with the secure world.
+ * But, only the bottom 32-bit of thes registers contains the data.
+ */
+#define FFA_DECLARE_ARGS \
+	unsigned long a0 = 0; \
+	unsigned long a1 = 0; \
+	unsigned long a2 = 0; \
+	unsigned long a3 = 0; \
+	unsigned long a4 = 0; \
+	unsigned long a5 = 0; \
+	unsigned long a6 = 0; \
+	unsigned long a7 = 0; \
+	struct arm_smccc_res res = {0}
+
+/* FF-A error codes */
+#define FFA_ERR_STAT_NOT_SUPPORTED				(-1)
+#define FFA_ERR_STAT_INVALID_PARAMETERS				(-2)
+#define FFA_ERR_STAT_NO_MEMORY				(-3)
+#define FFA_ERR_STAT_BUSY				(-4)
+#define FFA_ERR_STAT_INTERRUPTED				(-5)
+#define FFA_ERR_STAT_DENIED				(-6)
+#define FFA_ERR_STAT_RETRY				(-7)
+#define FFA_ERR_STAT_ABORTED				(-8)
+
+/**
+ * struct ffa_features_desc - FF-A functions features
+ * @func_id:	FF-A function
+ * @field1:	features read from register w2
+ * @field2:	features read from register w3
+ *
+ * Data structure describing the features of the  FF-A functions queried by
+ * FFA_FEATURES
+ */
+struct ffa_features_desc {
+	u32 func_id;
+	u32 field1;
+	u32 field2;
+};
+
+/**
+ * enum ffa_rxtx_buf_sizes - minimum sizes supported
+ * for the RX/TX buffers
+ */
+enum ffa_rxtx_buf_sizes {
+	RXTX_4K,
+	RXTX_64K,
+	RXTX_16K
+};
+
+/*
+ * Number of the FF-A interfaces features descriptors
+ * currently only FFA_RXTX_MAP descriptor is supported
+ */
+#define FFA_FEATURE_DESC_CNT (1)
+
+/**
+ * struct ffa_pdata - platform data for the arm_ffa device
+ * @conduit: The FF-A conduit used
+ *
+ * Platform data structure read from the device tree
+ */
+struct ffa_pdata {
+	enum ffa_conduit conduit;
+};
+
+/**
+ * struct ffa_rxtxpair - structure hosting the RX/TX buffers physical addresses
+ * @rxbuf:	physical address of the RX buffer
+ * @txbuf:	physical address of the TX buffer
+ *
+ * Data structure hosting the physical addresses of the mapped RX/TX buffers
+ * These physical address are used by the FF-A functions that use the RX/TX buffers
+ */
+struct ffa_rxtxpair {
+	u64 rxbuf; /* physical address */
+	u64 txbuf; /* physical address */
+};
+
+/**
+ * struct ffa_partition_desc - the secure partition descriptor
+ * @info:	partition information
+ * @UUID:	UUID
+ *
+ * Each partition has its descriptor containing the partitions information and the UUID
+ */
+struct ffa_partition_desc {
+	struct ffa_partition_info info;
+	union ffa_partition_uuid UUID;
+};
+
+/**
+ * struct ffa_partitions - descriptors for all secure partitions
+ * @count:	The number of partitions descriptors
+ * @descs	The partitions descriptors table
+ *
+ * This data structure contains the partitions descriptors table
+ */
+struct ffa_partitions {
+	u32 count;
+	struct ffa_partition_desc *descs; /* virtual address */
+};
+
+/**
+ * struct ffa_prvdata - the driver private data structure
+ *
+ * @dev:	The arm_ffa device under u-boot driver model
+ * @fwk_version:	FF-A framework version
+ * @id:	u-boot endpoint ID
+ * @partitions:	The partitions descriptors structure
+ * @pair:	The RX/TX buffers pair
+ * @conduit:	The selected conduit
+ * @invoke_ffa_fn:	The function executing the FF-A function
+ * @features:	Table of the FF-A functions having features
+ *
+ * The driver data structure hosting all resident data.
+ */
+struct ffa_prvdata {
+	struct udevice *dev;
+	u32 fwk_version;
+	u16 id;
+	struct ffa_partitions partitions;
+	struct ffa_rxtxpair pair;
+	enum ffa_conduit conduit;
+	invoke_ffa_fn_t invoke_ffa_fn;
+	struct ffa_features_desc features[FFA_FEATURE_DESC_CNT];
+};
+
+#endif
diff --git a/drivers/arm-ffa/core.c b/drivers/arm-ffa/core.c
new file mode 100644
index 000000000000..98e2d2fa1767
--- /dev/null
+++ b/drivers/arm-ffa/core.c
@@ -0,0 +1,1484 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#include "arm_ffa_prv.h"
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <common.h>
+#include <dm.h>
+#include <fdtdec.h>
+#include <linux/errno.h>
+#include <linux/sizes.h>
+#include <log.h>
+#include <malloc.h>
+#include <mapmem.h>
+#include <string.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * The device private data structure containing all the resident
+ * data read from secure world
+ */
+struct ffa_prvdata __ffa_runtime_data ffa_priv_data = {0};
+
+/*
+ * Driver functions
+ */
+
+/**
+ * ffa_get_device - probes the arm_ffa device
+ *
+ * This boot time function makes sure the arm_ffa device is probed
+ * and ready for use. This is done using uclass_get_device.
+ * The arm_ffa driver belongs to UCLASS_FFA.
+ * This function should be called before using the driver.
+ *
+ * Arm FF-A transport is implemented through a single u-boot
+ * device (arm_ffa). So, there is only one device belonging to UCLASS_FFA.
+ * All FF-A clients should use the arm_ffa device to use the FF-A
+ * transport.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int ffa_get_device(void)
+{
+	int ret;
+	int devnum = 0;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (ffa_priv_data.dev)
+		return FFA_ERR_STAT_SUCCESS;
+
+	/*
+	 * searching and probing the device
+	 */
+	ret = uclass_get_device(UCLASS_FFA, devnum, &ffa_priv_data.dev);
+	if (ret) {
+		ffa_err("can not find the device");
+		ffa_priv_data.dev = NULL;
+		return -ENODEV;
+	}
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_get_version - FFA_VERSION handler function
+ *
+ * This is the boot time function that implements FFA_VERSION FF-A function
+ * to get from the secure world the FF-A framework version
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_get_version(void)
+{
+	u16 major, minor;
+
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_VERSION;
+	a1 = FFA_VERSION_1_0;
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	if (res.a0 == FFA_ERR_STAT_NOT_SUPPORTED) {
+		ffa_err("A Firmware Framework implementation does not exist");
+		return -EOPNOTSUPP;
+	}
+
+	major = GET_FFA_MAJOR_VERSION(res.a0);
+	minor = GET_FFA_MINOR_VERSION(res.a0);
+
+	ffa_info("FF-A driver %d.%d\nFF-A framework %d.%d",
+		 FFA_MAJOR_VERSION, FFA_MINOR_VERSION, major, minor);
+
+	if ((major == FFA_MAJOR_VERSION && minor >= FFA_MINOR_VERSION)) {
+		ffa_info("Versions are compatible ");
+
+		ffa_priv_data.fwk_version = res.a0;
+
+		return FFA_ERR_STAT_SUCCESS;
+	}
+
+	ffa_info("Versions are incompatible ");
+	return -EPROTONOSUPPORT;
+}
+
+/**
+ * ffa_get_endpoint_id - FFA_ID_GET handler function
+ *
+ * This is the boot time function that implements FFA_ID_GET FF-A function
+ * to get from the secure world u-boot endpoint ID
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_get_endpoint_id(void)
+{
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_ID_GET;
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		if (((int)res.a2) == FFA_ERR_STAT_NOT_SUPPORTED) {
+			ffa_err("This function is not implemented at this FF-A instance");
+			return -EOPNOTSUPP;
+		}
+
+		ffa_err("Undefined error code (%d)", ((int)res.a2));
+		return -EINVAL;
+	}
+	case FFA_SUCCESS:
+	{
+		ffa_priv_data.id = GET_SELF_ENDPOINT_ID(res.a2);
+		ffa_info("endpoint ID is %u", ffa_priv_data.id);
+
+		return FFA_ERR_STAT_SUCCESS;
+	}
+	default:
+	{
+		ffa_err("Undefined response function (0x%lx)", res.a0);
+		return -EINVAL;
+	}
+	}
+}
+
+/**
+ * ffa_get_features_desc - returns the features descriptor of the specified
+ *						FF-A function
+ * @func_id:	the FF-A function which the features are to be retrieved
+ *
+ * This is a boot time function that searches the features descriptor of the
+ * specified FF-A function
+ *
+ * Return:
+ *
+ * When found, the address of the features descriptor is returned. Otherwise, NULL.
+ */
+static struct ffa_features_desc *ffa_get_features_desc(u32 func_id)
+{
+	u32 desc_idx;
+
+	/*
+	 * search for the descriptor of the selected FF-A interface
+	 */
+	for (desc_idx = 0; desc_idx < FFA_FEATURE_DESC_CNT ; desc_idx++)
+		if (ffa_priv_data.features[desc_idx].func_id == func_id)
+			return &ffa_priv_data.features[desc_idx];
+
+	return NULL;
+}
+
+/**
+ * ffa_get_rxtx_map_features - FFA_FEATURES handler function with FFA_RXTX_MAP
+ *							argument
+ *
+ * This is the boot time function that implements FFA_FEATURES FF-A function
+ * to retrieve the FFA_RXTX_MAP features
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_get_rxtx_map_features(void)
+{
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_FEATURES;
+	a1 = FFA_RXTX_MAP;
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		if (((int)res.a2) == FFA_ERR_STAT_NOT_SUPPORTED) {
+			ffa_err("FFA_RXTX_MAP is not implemented at this FF-A instance");
+			return -EOPNOTSUPP;
+		}
+
+		ffa_err("Undefined error code (%d)", ((int)res.a2));
+		return -EINVAL;
+	}
+	case FFA_SUCCESS:
+	{
+		u32 desc_idx;
+
+		/*
+		 * search for an empty descriptor
+		 */
+		for (desc_idx = 0; desc_idx < FFA_FEATURE_DESC_CNT ; desc_idx++)
+			if (!ffa_priv_data.features[desc_idx].func_id) {
+				/*
+				 * populate the descriptor with
+				 * the interface features data
+				 */
+				ffa_priv_data.features[desc_idx].func_id =
+					FFA_RXTX_MAP;
+				ffa_priv_data.features[desc_idx].field1 =
+					res.a2;
+
+				ffa_info("FFA_RXTX_MAP features data 0x%lx",
+					 res.a2);
+
+				return FFA_ERR_STAT_SUCCESS;
+			}
+
+		ffa_err("Cannot save FFA_RXTX_MAP features data. Descriptors table full");
+		return -ENOBUFS;
+	}
+	default:
+	{
+		ffa_err("Undefined response function (0x%lx)",
+			res.a0);
+		return -EINVAL;
+	}
+	}
+}
+
+/**
+ * ffa_get_rxtx_buffers_pages_cnt - reads from the features data descriptors
+ *						the minimum number of pages in each of the RX/TX
+ *						buffers
+ * @buf_4k_pages: Pointer to the minimum number of pages
+ *
+ * This is the boot time function that  returns the minimum number of pages
+ *  in each of the RX/TX buffers
+ *
+ * Return:
+ *
+ * buf_4k_pages points to the returned number of pages
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_get_rxtx_buffers_pages_cnt(size_t *buf_4k_pages)
+{
+	struct ffa_features_desc *desc = NULL;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!buf_4k_pages)
+		return -EINVAL;
+
+	desc = ffa_get_features_desc(FFA_RXTX_MAP);
+	if (!desc)
+		return -EINVAL;
+
+	ffa_dbg("FFA_RXTX_MAP descriptor found");
+
+	switch (desc->field1) {
+	case RXTX_4K:
+		*buf_4k_pages = 1;
+		break;
+	case RXTX_16K:
+		*buf_4k_pages = 4;
+		break;
+	case RXTX_64K:
+		*buf_4k_pages = 16;
+		break;
+	default:
+		ffa_err("RX/TX buffer size not supported");
+		return -EINVAL;
+	}
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_free_rxtx_buffers - frees the RX/TX buffers
+ * @buf_4k_pages: the minimum number of pages in each of the RX/TX
+ *			  buffers
+ *
+ * This is the boot time function used to free the RX/TX buffers
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_free_rxtx_buffers(size_t buf_4k_pages)
+{
+	efi_status_t free_rxbuf_ret, free_txbuf_ret;
+
+	ffa_info("Freeing RX/TX buffers");
+
+	free_rxbuf_ret = efi_free_pages(ffa_priv_data.pair.rxbuf, buf_4k_pages);
+	free_txbuf_ret = efi_free_pages(ffa_priv_data.pair.txbuf, buf_4k_pages);
+
+	if (free_rxbuf_ret != EFI_SUCCESS || free_txbuf_ret != EFI_SUCCESS) {
+		ffa_err("Failed to free RX/TX buffers (rx: %lu , tx: %lu)",
+			free_rxbuf_ret,
+			free_txbuf_ret);
+		return -EINVAL;
+	}
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_alloc_rxtx_buffers - allocates the RX/TX buffers
+ * @buf_4k_pages: the minimum number of pages in each of the RX/TX
+ *			  buffers
+ *
+ * This is the boot time function used by ffa_map_rxtx_buffers to allocate
+ * the RX/TX buffers before mapping them
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_alloc_rxtx_buffers(size_t buf_4k_pages)
+{
+	ffa_dbg("[%s]", __func__);
+
+#if CONFIG_IS_ENABLED(EFI_LOADER)
+
+	efi_status_t efi_ret;
+	void *virt_txbuf;
+	void *virt_rxbuf;
+
+	ffa_info("Using %lu 4KB page(s) for RX/TX buffers size",
+		 buf_4k_pages);
+
+	efi_ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
+				     EFI_BOOT_SERVICES_DATA,
+				     buf_4k_pages,
+				     &ffa_priv_data.pair.rxbuf);
+
+	if (efi_ret != EFI_SUCCESS) {
+		ffa_priv_data.pair.rxbuf = 0;
+		ffa_err("Failure to allocate RX buffer (EFI error: 0x%lx)",
+			efi_ret);
+
+		return -ENOBUFS;
+	}
+
+	ffa_info("RX buffer at phys 0x%llx",
+		 ffa_priv_data.pair.rxbuf);
+
+	/*
+	 * convert the RX buffer physical address to virtual address
+	 */
+	virt_rxbuf = (void *)map_sysmem((phys_addr_t)ffa_priv_data.pair.rxbuf, 0);
+
+	/*
+	 * make sure the buffer is clean before use
+	 */
+	memset(virt_rxbuf, 0, buf_4k_pages * SZ_4K);
+
+	unmap_sysmem(virt_rxbuf);
+
+	efi_ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
+				     EFI_RUNTIME_SERVICES_DATA,
+				     buf_4k_pages,
+				     &ffa_priv_data.pair.txbuf);
+
+	if (efi_ret != EFI_SUCCESS) {
+		ffa_dbg("FFA_RXTX_MAP: freeing RX buffer");
+		efi_free_pages(ffa_priv_data.pair.rxbuf, buf_4k_pages);
+		ffa_priv_data.pair.rxbuf = 0;
+		ffa_priv_data.pair.txbuf = 0;
+		ffa_err("Failure to allocate the TX buffer (EFI error: 0x%lx)"
+			, efi_ret);
+
+		return -ENOBUFS;
+	}
+
+	ffa_info("TX buffer at phys 0x%llx",
+		 ffa_priv_data.pair.txbuf);
+
+	/*
+	 * convert the TX buffer physical address to virtual address
+	 */
+	virt_txbuf = (void *)map_sysmem((phys_addr_t)ffa_priv_data.pair.txbuf, 0);
+
+	/*
+	 * make sure the buffer is clean before use
+	 */
+	memset(virt_txbuf, 0, buf_4k_pages * SZ_4K);
+
+	unmap_sysmem(virt_txbuf);
+
+	return FFA_ERR_STAT_SUCCESS;
+
+#else
+	return -ENOBUFS;
+#endif
+}
+
+/**
+ * ffa_map_rxtx_buffers - FFA_RXTX_MAP handler function
+ * @buf_4k_pages: the minimum number of pages in each of the RX/TX
+ *			  buffers
+ *
+ * This is the boot time function that implements FFA_RXTX_MAP FF-A function
+ * to map the RX/TX buffers
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_map_rxtx_buffers(size_t buf_4k_pages)
+{
+	int ret;
+
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	ret = ffa_alloc_rxtx_buffers(buf_4k_pages);
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	a0 = FFA_RXTX_MAP;
+	a1 = ffa_priv_data.pair.txbuf;
+	a2 = ffa_priv_data.pair.rxbuf;
+	a3 = buf_4k_pages;
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		switch (((int)res.a2)) {
+		case FFA_ERR_STAT_INVALID_PARAMETERS:
+			ffa_err("One or more fields in input parameters is incorrectly encoded");
+			ret = -EPERM;
+			break;
+		case FFA_ERR_STAT_NO_MEMORY:
+			ffa_err("Not enough memory");
+			ret = -ENOMEM;
+			break;
+		case FFA_ERR_STAT_DENIED:
+			ffa_err("Buffer pair already registered");
+			ret = -EACCES;
+			break;
+		case FFA_ERR_STAT_NOT_SUPPORTED:
+			ffa_err("This function is not implemented at this FF-A instance");
+			ret = -EOPNOTSUPP;
+			break;
+		default:
+			ffa_err("Undefined error (%d)",
+				((int)res.a2));
+			ret = -EINVAL;
+		}
+		break;
+	}
+	case FFA_SUCCESS:
+		ffa_info("RX/TX buffers mapped");
+		return FFA_ERR_STAT_SUCCESS;
+	default:
+		ffa_err("Undefined response function (0x%lx)",
+			res.a0);
+		ret = -EINVAL;
+	}
+
+	ffa_free_rxtx_buffers(buf_4k_pages);
+
+	return ret;
+}
+
+/**
+ * ffa_unmap_rxtx_buffers - FFA_RXTX_UNMAP handler function
+ *
+ * This is the boot time function that implements FFA_RXTX_UNMAP FF-A function
+ * to unmap the RX/TX buffers
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_unmap_rxtx_buffers(void)
+{
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_RXTX_UNMAP;
+	a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data.id);
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		if (((int)res.a2) == FFA_ERR_STAT_NOT_SUPPORTED)
+			panic("[FFA] FFA_RXTX_UNMAP is not implemented at this FF-A instance\n");
+		else if (((int)res.a2) == FFA_ERR_STAT_INVALID_PARAMETERS)
+			panic("[FFA] There is no buffer pair registered on behalf of the caller\n");
+		else
+			panic("[FFA] Undefined error (%d)\n", ((int)res.a2));
+	}
+	case FFA_SUCCESS:
+	{
+		size_t buf_4k_pages = 0;
+		int ret;
+
+		ret = ffa_get_rxtx_buffers_pages_cnt(&buf_4k_pages);
+		if (ret != FFA_ERR_STAT_SUCCESS)
+			panic("[FFA] RX/TX buffers unmapped but failure in getting pages count\n");
+
+		ret = ffa_free_rxtx_buffers(buf_4k_pages);
+		if (ret != FFA_ERR_STAT_SUCCESS)
+			panic("[FFA] RX/TX buffers unmapped but failure in freeing the memory\n");
+
+		ffa_info("RX/TX buffers unmapped and memory freed");
+
+		return FFA_ERR_STAT_SUCCESS;
+	}
+	default:
+		panic("[FFA] Undefined response function (0x%lx)", res.a0);
+	}
+}
+
+/**
+ * ffa_release_rx_buffer - FFA_RX_RELEASE handler function
+ *
+ * This is the boot time function that invokes FFA_RX_RELEASE FF-A function
+ * to release the ownership of the RX buffer
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_release_rx_buffer(void)
+{
+	FFA_DECLARE_ARGS;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_RX_RELEASE;
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		if (((int)res.a2) == FFA_ERR_STAT_NOT_SUPPORTED)
+			panic("[FFA] FFA_RX_RELEASE is not implemented at this FF-A instance\n");
+		else if (((int)res.a2) == FFA_ERR_STAT_DENIED)
+			panic("[FFA] Caller did not have ownership of the RX buffer\n");
+		else
+			panic("[FFA] Undefined error (%d)\n", ((int)res.a2));
+	}
+	case FFA_SUCCESS:
+		ffa_info("RX buffer released");
+		return FFA_ERR_STAT_SUCCESS;
+
+	default:
+		panic("[FFA] Undefined response function (0x%lx)\n", res.a0);
+	}
+}
+
+/**
+ * ffa_uuid_are_identical - checks whether two given UUIDs are identical
+ * @uuid1: first UUID
+ * @uuid2: second UUID
+ *
+ * This is a boot time function used by ffa_read_partitions_info to search
+ * for a UUID in the partitions descriptors table
+ *
+ * Return:
+ *
+ * 1 when UUIDs match. Otherwise, 0
+ */
+int ffa_uuid_are_identical(const union ffa_partition_uuid *uuid1,
+			   const union ffa_partition_uuid *uuid2)
+{
+	if (!uuid1 || !uuid2)
+		return 0;
+
+	return (!memcmp(uuid1, uuid2, sizeof(union ffa_partition_uuid)));
+}
+
+/**
+ * ffa_read_partitions_info - reads the data queried by FFA_PARTITION_INFO_GET
+ *							and saves it in the private structure
+ * @count: The number of partitions queried
+ * @part_uuid: Pointer to the partition(s) UUID
+ *
+ * This is the boot time function that reads the partitions information
+ * returned by the FFA_PARTITION_INFO_GET and saves it in the private
+ * data structure.
+ *
+ * Return:
+ *
+ * The private data structure is updated with the partition(s) information
+ * FFA_ERR_STAT_SUCCESS is returned on success. Otherwise, failure
+ */
+static int ffa_read_partitions_info(u32 count, union ffa_partition_uuid *part_uuid)
+{
+	ffa_dbg("[%s]", __func__);
+
+	if (!count) {
+		ffa_err("No partition detected");
+		return -ENODATA;
+	}
+
+	ffa_info("Reading partitions data from the RX buffer");
+
+#if CONFIG_IS_ENABLED(EFI_LOADER)
+
+	if (!part_uuid) {
+		/*
+		 * querying information of all partitions
+		 */
+		u64 data_pages;
+		u64 data_bytes;
+		efi_status_t efi_ret;
+		size_t buf_4k_pages = 0;
+		u32 desc_idx;
+		struct ffa_partition_info *parts_info;
+		int ret;
+
+		data_bytes = count * sizeof(struct ffa_partition_desc);
+		data_pages = efi_size_in_pages(data_bytes);
+
+		/*
+		 * get the RX buffer size in pages
+		 */
+		ret = ffa_get_rxtx_buffers_pages_cnt(&buf_4k_pages);
+		if (ret != FFA_ERR_STAT_SUCCESS) {
+			ffa_err("Can not get the RX buffer size (error %d)", ret);
+			return ret;
+		}
+
+		if (data_pages > buf_4k_pages) {
+			ffa_err("Partitions data size exceeds the RX buffer size:");
+			ffa_err("    Sizes in pages: data %llu , RX buffer %lu ",
+				data_pages,
+				buf_4k_pages);
+
+			return -ENOMEM;
+		}
+
+		efi_ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
+					     EFI_RUNTIME_SERVICES_DATA,
+					     data_pages,
+					     (u64 *)&ffa_priv_data.partitions.descs);
+
+		if (efi_ret != EFI_SUCCESS) {
+			ffa_priv_data.partitions.descs = NULL;
+
+			ffa_err("Cannot  allocate partitions data buffer (EFI error 0x%lx)",
+				efi_ret);
+
+			return -ENOBUFS;
+		}
+
+		/*
+		 * convert the descs buffer physical address
+		 * to virtual address
+		 * This virtual address should not be unmapped
+		 * descs is expected to be a virtual address
+		 */
+		ffa_priv_data.partitions.descs =
+			(struct ffa_partition_desc *)
+			map_sysmem((phys_addr_t)
+				   ffa_priv_data.partitions.descs, 0);
+
+		/*
+		 * make sure the buffer is clean before use
+		 */
+		memset(ffa_priv_data.partitions.descs, 0,
+		       data_pages * SZ_4K);
+
+		ffa_info("Copying %lld page(s) of partitions data from RX buffer",
+			 data_pages);
+
+		/*
+		 * convert the RX buffer physical address to
+		 * virtual address
+		 */
+		parts_info = (struct ffa_partition_info *)
+			map_sysmem((phys_addr_t)
+				   ffa_priv_data.pair.rxbuf, 0);
+
+		for (desc_idx = 0 ; desc_idx < count ; desc_idx++) {
+			ffa_priv_data.partitions.descs[desc_idx].info =
+				parts_info[desc_idx];
+
+			ffa_info("Partition ID %x : info cached",
+				 ffa_priv_data.partitions.descs[desc_idx].info.id);
+		}
+		unmap_sysmem(parts_info);
+
+		ffa_priv_data.partitions.count = count;
+
+		ffa_info("%d partition(s) found and cached", count);
+
+	} else {
+		u32 rx_desc_idx, cached_desc_idx;
+		struct ffa_partition_info *parts_info;
+		u8 desc_found;
+
+		/*
+		 * convert the RX buffer physical address to virtual address
+		 */
+		parts_info = (struct ffa_partition_info *)
+			map_sysmem((phys_addr_t)ffa_priv_data.pair.rxbuf, 0);
+
+		/*
+		 * search for the SP IDs read from the RX buffer
+		 * in the already cached SPs.
+		 * Update the UUID when ID found.
+		 */
+		for (rx_desc_idx = 0; rx_desc_idx < count ; rx_desc_idx++) {
+			desc_found = 0;
+
+			/*
+			 * search the current ID in the cached partitions
+			 */
+			for (cached_desc_idx = 0;
+			     cached_desc_idx < ffa_priv_data.partitions.count;
+			     cached_desc_idx++) {
+				/*
+				 * save the UUID
+				 */
+				if (ffa_priv_data.partitions.descs[cached_desc_idx].info.id ==
+				    parts_info[rx_desc_idx].id) {
+					ffa_priv_data.partitions.descs[cached_desc_idx].UUID =
+						*part_uuid;
+
+					desc_found = 1;
+					break;
+				}
+			}
+
+			if (!desc_found) {
+				unmap_sysmem(parts_info);
+				return -ENODATA;
+			}
+		}
+		unmap_sysmem(parts_info);
+	}
+#else
+#warning "arm_ffa: reading FFA_PARTITION_INFO_GET data not implemented"
+#endif
+
+	return  FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_query_partitions_info - invokes FFA_PARTITION_INFO_GET
+ *							and saves partitions data
+ * @part_uuid: Pointer to the partition(s) UUID
+ * @pcount: Pointer to the number of partitions variable filled when querying
+ *
+ * This is the boot time function that executes the FFA_PARTITION_INFO_GET
+ * to query the partitions data. Then, it calls ffa_read_partitions_info
+ * to save the data in the private data structure.
+ *
+ * After reading the data the RX buffer is released using ffa_release_rx_buffer
+ *
+ * Return:
+ *
+ * When part_uuid is NULL, all partitions data are retrieved from secure world
+ * When part_uuid is non NULL, data for partitions matching the given UUID are
+ * retrieved and the number of partitions is returned
+ * FFA_ERR_STAT_SUCCESS is returned on success. Otherwise, failure
+ */
+static int ffa_query_partitions_info(union ffa_partition_uuid *part_uuid,
+				     u32 *pcount)
+{
+	unsigned long a0 = 0;
+	union ffa_partition_uuid query_uuid = {0};
+	unsigned long a5 = 0;
+	unsigned long a6 = 0;
+	unsigned long a7 = 0;
+	struct arm_smccc_res res = {0};
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	a0 = FFA_PARTITION_INFO_GET;
+
+	/*
+	 * If a UUID is specified. Information for one or more
+	 * partitions in the system is queried. Otherwise, information
+	 * for all installed partitions is queried
+	 */
+
+	if (part_uuid) {
+		if (!pcount)
+			return -EINVAL;
+
+		query_uuid = *part_uuid;
+	}
+
+	ffa_priv_data.invoke_ffa_fn(a0, query_uuid.words.a1, query_uuid.words.a2,
+				    query_uuid.words.a3, query_uuid.words.a4,
+				    a5, a6, a7, &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		switch (((int)res.a2)) {
+		case FFA_ERR_STAT_INVALID_PARAMETERS:
+			ffa_err("Unrecognized UUID");
+			return -EPERM;
+		case FFA_ERR_STAT_NO_MEMORY:
+			ffa_err("Results cannot fit in RX buffer of the caller");
+			return -ENOMEM;
+		case FFA_ERR_STAT_DENIED:
+			ffa_err("Callee is not in a state to handle this request");
+			return -EACCES;
+		case FFA_ERR_STAT_NOT_SUPPORTED:
+			ffa_err("This function is not implemented at this FF-A instance");
+			return -EOPNOTSUPP;
+		case FFA_ERR_STAT_BUSY:
+			ffa_err("RX buffer of the caller is not free");
+			return -EBUSY;
+		default:
+			ffa_err("Undefined error (%d)", ((int)res.a2));
+			return -EINVAL;
+		}
+	}
+	case FFA_SUCCESS:
+	{
+		int ret;
+
+		/*
+		 * res.a2 contains the count of partition information descriptors
+		 * populated in the RX buffer
+		 */
+		if (res.a2) {
+			ret = ffa_read_partitions_info(res.a2, part_uuid);
+			if (ret)
+				ffa_err("Failed to read partition(s) data , error (%d)", ret);
+		}
+
+		/*
+		 * return the SP count
+		 */
+		if (part_uuid) {
+			if (!ret)
+				*pcount = res.a2;
+			else
+				*pcount = 0;
+		}
+		/*
+		 * After calling FFA_PARTITION_INFO_GET the buffer ownership
+		 * is assigned to the consumer (u-boot). So, we need to give
+		 * the ownership back to the secure world
+		 */
+		ret = ffa_release_rx_buffer();
+
+		if (!part_uuid && !res.a2) {
+			ffa_err("[FFA] no partition installed in the system");
+			return -ENODEV;
+		}
+
+		return ret;
+	}
+	default:
+		ffa_err("Undefined response function (0x%lx)", res.a0);
+		return  -EINVAL;
+	}
+}
+
+/**
+ * ffa_get_partitions_info - FFA_PARTITION_INFO_GET handler function
+ * @func_data: Pointer to the FF-A function arguments container structure.
+ * The passed arguments:
+ * Mode 1: When getting from the driver the number of
+ *	secure partitions:
+ *	@data0_size: UUID size
+ *	@data0: pointer to the UUID (little endian)
+ *	@data1_size: size of the number of partitions
+ *				variable
+ *	@data1: pointer to the number of partitions
+ *			 variable. The variable will be set
+ *			 by the driver
+ * Mode 2: When requesting the driver to return the
+ *	partitions information:
+ *	@data0_size: UUID size
+ *	@data0: pointer to the UUID (little endian)
+ *	@data1_size: size of the SPs information buffer
+ *	@data1: pointer to SPs information buffer
+ *		(allocated by the client).
+ *		The buffer will be filled by the driver
+ *
+ * This is the boot time function that queries the secure partition data from
+ * the private data structure. If not found, it invokes FFA_PARTITION_INFO_GET
+ * FF-A function to query the partition information from secure world.
+ *
+ * A client of the FF-A driver should know the UUID of the service it wants to
+ * access. It should use the UUID to request the FF-A driver to provide the
+ * partition(s) information of the service. The FF-A driver uses
+ * PARTITION_INFO_GET to obtain this information. This is implemented through
+ * ffa_get_partitions_info function.
+ * A new FFA_PARTITION_INFO_GET call is issued (first one performed through
+ * ffa_cache_partitions_info) allowing to retrieve the partition(s) information.
+ * They are not saved (already done). We only update the UUID in the cached area.
+ * This assumes that partitions data does not change in the secure world.
+ * Otherwise u-boot will have an outdated partition data. The benefit of caching
+ * the information in the FF-A driver is to accommodate discovery after
+ * ExitBootServices().
+ *
+ * When invoked through a client request, ffa_get_partitions_info should be
+ * called twice. First call is to get from the driver the number of secure
+ * partitions (SPs) associated to a particular UUID.
+ * Then, the caller (client) allocates the buffer to host the SPs data and
+ * issues a 2nd call. Then, the driver fills the SPs data in the pre-allocated
+ * buffer.
+ *
+ * To achieve the mechanism described above, ffa_get_partitions_info uses the
+ * following functions:
+ *		ffa_read_partitions_info
+ *		ffa_query_partitions_info
+ *
+ * Return:
+ *
+ * @data1: When pointing to the number of partitions variable, the number is
+ * set by the driver.
+ * When pointing to the partitions information buffer, the buffer will be
+ * filled by the driver.
+ *
+ * On success FFA_ERR_STAT_SUCCESS is returned. Otherwise, failure
+ */
+static int ffa_get_partitions_info(struct ffa_interface_data *func_data)
+{
+	/*
+	 * fill_data:
+	 * 0: return the SP count
+	 * 1: fill SP data and return it to the caller
+	 * -1: undefined mode
+	 */
+	int fill_data = -1;
+	u32 desc_idx, client_desc_idx;
+	union ffa_partition_uuid *part_uuid;
+	u32 client_desc_max_cnt;
+	u32 parts_found = 0;
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!func_data) {
+		ffa_err("No function data provided");
+		return -EINVAL;
+	}
+
+	if (!ffa_priv_data.partitions.count || !ffa_priv_data.partitions.descs)
+		panic("[FFA] No partition installed\n");
+
+	if (func_data->data0_size == sizeof(union ffa_partition_uuid) &&
+	    func_data->data0 &&
+	    func_data->data1_size == sizeof(u32) &&
+	    func_data->data1) {
+		/*
+		 * data0 (in): pointer to UUID
+		 * data1 (in): pointer to SP count
+		 * Out: SP count returned in the count variable pointed by data1
+		 */
+
+		fill_data = 0;
+
+		ffa_info("Preparing for checking partitions count");
+
+	} else if ((func_data->data0_size == sizeof(union ffa_partition_uuid)) &&
+		   func_data->data0 &&
+		   (func_data->data1_size >= sizeof(struct ffa_partition_info)) &&
+		   !(func_data->data1_size % sizeof(struct ffa_partition_info)) &&
+		   func_data->data1) {
+		/*
+		 * data0 (in): pointer to UUID
+		 * data1 (in): pointer to SPs descriptors buffer
+		 *             (created by the client)
+		 * Out: SPs descriptors returned in the buffer
+		 *      pointed by data1
+		 */
+
+		fill_data = 1;
+
+		client_desc_idx = 0;
+
+		/*
+		 * number of empty descriptors preallocated by the caller
+		 */
+		client_desc_max_cnt =
+			func_data->data1_size / sizeof(struct ffa_partition_info);
+
+		ffa_info("Preparing for filling partitions info");
+
+	} else {
+		ffa_err("Invalid function arguments provided");
+		return -EINVAL;
+	}
+
+	part_uuid = (union ffa_partition_uuid *)func_data->data0;
+
+	ffa_info("Searching partitions using the provided UUID");
+
+#ifdef DEBUG
+	{
+		u32 dbg_uuid_cnt;
+
+		ffa_dbg("UUID: [LSB]");
+
+		for (dbg_uuid_cnt = 0 ; dbg_uuid_cnt < UUID_SIZE ; dbg_uuid_cnt++)
+			ffa_dbg(" %02x", part_uuid->bytes[dbg_uuid_cnt]);
+	}
+#endif
+
+	/*
+	 * search in the cached partitions
+	 */
+	for (desc_idx = 0;
+	     desc_idx < ffa_priv_data.partitions.count;
+	     desc_idx++) {
+		if (ffa_uuid_are_identical(&ffa_priv_data.partitions.descs[desc_idx].UUID,
+					   part_uuid)) {
+			ffa_info("Partition ID %x matches the provided UUID",
+				 ffa_priv_data.partitions.descs[desc_idx].info.id);
+
+			parts_found++;
+
+			if (fill_data) {
+				/*
+				 * trying to fill the partition info in data1
+				 */
+
+				if (client_desc_idx < client_desc_max_cnt) {
+					((struct ffa_partition_info *)
+					 func_data->data1)[client_desc_idx++] =
+						ffa_priv_data.partitions.descs[desc_idx].info;
+					continue;
+				}
+
+				ffa_err("Failed to fill the current descriptor client buffer full");
+				return -ENOBUFS;
+			}
+		}
+	}
+
+	if (!parts_found) {
+		int ret;
+
+		ffa_info("No partition found. Querying framework ...");
+
+		ret = ffa_query_partitions_info(part_uuid, &parts_found);
+
+		if (ret == FFA_ERR_STAT_SUCCESS) {
+			if (!fill_data) {
+				*((u32 *)func_data->data1) = parts_found;
+
+				ffa_info("Number of partition(s) found matching the UUID: %d",
+					 parts_found);
+			} else {
+				/*
+				 * we want to read SPs info
+				 */
+
+				/*
+				 * If SPs data filled, retry searching SP info again
+				 */
+				if (parts_found)
+					ret = ffa_get_partitions_info(func_data);
+				else
+					ret = -ENODATA;
+			}
+		}
+
+		return ret;
+	}
+
+	/* partition(s) found */
+	if (!fill_data)
+		*((u32 *)func_data->data1) = parts_found;
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_cache_partitions_info - Queries and saves all secure partitions data
+ *
+ * This is a boot time function that invokes FFA_PARTITION_INFO_GET FF-A
+ * function to query from secure world all partitions information.
+ *
+ * The FFA_PARTITION_INFO_GET call is issued with nil UUID as an argument.
+ * All installed partitions information are returned. We cache them in the
+ * resident private data structure and we keep the UUID field empty
+ * (in FF-A 1.0 UUID is not provided by the partition descriptor)
+ *
+ * This function is called at the device probing level.
+ * ffa_cache_partitions_info uses ffa_query_partitions_info to get the data
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_cache_partitions_info(void)
+{
+	ffa_dbg("[%s]", __func__);
+	return ffa_query_partitions_info(NULL, NULL);
+}
+
+/**
+ * ffa_msg_send_direct_req - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function
+ * @func_data: Pointer to the FF-A function arguments container structure.
+ *					The passed arguments:
+ *						@data0_size: partition ID size
+ *						@data0: pointer to the partition ID
+ *						@data1_size: exchanged data size
+ *						@data1: pointer to the data buffer preallocated by
+ *								the client (in/out)
+ *
+ * This is the runtime function that implements FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ * FF-A functions.
+ *
+ * FFA_MSG_SEND_DIRECT_REQ is used to send the data to the secure partition.
+ * The response from the secure partition is handled by reading the
+ * FFA_MSG_SEND_DIRECT_RESP arguments.
+ *
+ * The maximum size of the data that can be exchanged is 20 bytes which is
+ * sizeof(struct ffa_send_direct_data) as defined by the FF-A specification 1.0
+ * in the section relevant to FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int __ffa_runtime ffa_msg_send_direct_req(struct ffa_interface_data
+						 *func_data)
+{
+	u16 dst_part_id;
+	unsigned long a0 = 0;
+	unsigned long a1 = 0;
+	unsigned long a2 = 0;
+	struct ffa_send_direct_data *msg;
+	struct arm_smccc_res res = {0};
+
+	ffa_dbg("[%s]", __func__);
+
+	if (!ffa_priv_data.invoke_ffa_fn)
+		panic("[FFA] no private data found\n");
+
+	if (!func_data)
+		return -EINVAL;
+
+	if (!ffa_priv_data.partitions.count || !ffa_priv_data.partitions.descs)
+		panic("[FFA] no partition installed\n");
+
+	if (func_data->data0_size != sizeof(u16) ||
+	    !func_data->data0 ||
+	    func_data->data1_size != FFA_MSG_SEND_DIRECT_MAX_SIZE ||
+	    !func_data->data1) {
+		ffa_err("Undefined interface parameters");
+		return -EINVAL;
+	}
+
+	dst_part_id = *((u16 *)func_data->data0);
+	msg = func_data->data1;
+
+	ffa_dbg("Sending data to partition ID 0x%x", dst_part_id);
+
+	a0 = FFA_MSG_SEND_DIRECT_REQ;
+
+	a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data.id) |
+		PREP_PART_ENDPOINT_ID(dst_part_id);
+
+	ffa_priv_data.invoke_ffa_fn(a0, a1, a2,
+				    msg->a3,
+				    msg->a4,
+				    msg->a5,
+				    msg->a6,
+				    msg->a7,
+				    &res);
+
+	while (res.a0 == FFA_INTERRUPT)
+		ffa_priv_data.invoke_ffa_fn(FFA_RUN, res.a1,
+					    0, 0, 0, 0, 0, 0,
+					    &res);
+
+	switch (res.a0) {
+	case FFA_ERROR:
+	{
+		switch (((int)res.a2)) {
+		case FFA_ERR_STAT_INVALID_PARAMETERS:
+			ffa_err("Invalid endpoint ID or non-zero reserved register");
+			return -EPERM;
+		case FFA_ERR_STAT_ABORTED:
+			panic("[FFA] Message target ran into unexpected error and has aborted\n");
+		case FFA_ERR_STAT_DENIED:
+			panic("[FFA] Callee is not in a state to handle this request\n");
+		case FFA_ERR_STAT_NOT_SUPPORTED:
+			panic("[FFA] This function is not implemented at this FF-A instance\n");
+		case FFA_ERR_STAT_BUSY:
+			panic("[FFA] Message target is busy\n");
+		default:
+			panic("[FFA] Undefined error (%d)\n", ((int)res.a2));
+		}
+	}
+	case FFA_SUCCESS:
+
+		ffa_dbg("Message sent with no response");
+		return FFA_ERR_STAT_SUCCESS;
+
+	case FFA_MSG_SEND_DIRECT_RESP:
+
+		ffa_dbg("Message sent with response");
+
+		/*
+		 * extract the 32-bit wide return data
+		 */
+		msg->a3 = (u32)res.a3;
+		msg->a4 = (u32)res.a4;
+		msg->a5 = (u32)res.a5;
+		msg->a6 = (u32)res.a6;
+		msg->a7 = (u32)res.a7;
+
+		return FFA_ERR_STAT_SUCCESS;
+
+	default:
+		panic("[FFA] Undefined response function (0x%lx)\n", res.a0);
+	}
+}
+
+/**
+ * invoke_ffa_drv_api - The driver dispatcher function
+ * @func_id:	The FF-A function to be used
+ * @func_data:  Pointer to the FF-A function arguments container
+ *					structure. This also includes pointers to the
+ *					returned data needed by clients.
+ * The dispatcher is a runtime function that selects the FF-A function handler
+ * based on the input FF-A function ID.
+ * The input arguments are passed to the handler function.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int __ffa_runtime invoke_ffa_drv_api(u32 func_id,
+				     struct ffa_interface_data *func_data)
+{
+	if (!ffa_priv_data.dev)
+		panic("[FFA] no device found\n");
+
+	switch (func_id) {
+	case FFA_PARTITION_INFO_GET:
+		return ffa_get_partitions_info(func_data);
+	case FFA_RXTX_UNMAP:
+		return ffa_unmap_rxtx_buffers();
+	case FFA_MSG_SEND_DIRECT_REQ:
+		return ffa_msg_send_direct_req(func_data);
+	default:
+
+		ffa_err("Undefined FF-A interface (%d)", func_id);
+
+		return -EINVAL;
+	}
+}
+
+/**
+ * ffa_init_private_data - Initialization of the private data
+ * @dev:	the arm_ffa device
+ *
+ * This boot time function reads data from the platform data structure
+ * and populates the private data structure
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_init_private_data(struct udevice *dev)
+{
+	struct ffa_pdata *pdata = dev_get_plat(dev);
+
+	ffa_priv_data.conduit = pdata->conduit;
+
+	if (ffa_priv_data.conduit == FFA_CONDUIT_SMC) {
+		ffa_priv_data.invoke_ffa_fn = arm_ffa_smccc_smc;
+	} else {
+		ffa_err("Undefined FF-A conduit (%d)", ffa_priv_data.conduit);
+		return -EINVAL;
+	}
+
+	ffa_info("Conduit is %s",
+		 ((ffa_priv_data.conduit == FFA_CONDUIT_SMC) ?
+		   "SMC" : "NOT SUPPORTED"));
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_probe - The driver probe function
+ * @dev:	the arm_ffa device
+ *
+ * Probing is done at boot time and triggered by the uclass device discovery.
+ * At probe level the following actions are done:
+ *	- initialization of the driver private data structure
+ *	- querying from secure world the FF-A framework version
+ *	- querying from secure world the u-boot endpoint ID
+ *	- querying from secure world the supported features of the specified FF-A calls
+ *	- mapping the RX/TX buffers
+ *	- querying from secure world all the partitions information
+ *
+ * All data queried from secure world is saved in the resident private data structure.
+ *
+ * The probe will fail if either FF-A framework is not detected or the
+ * FF-A requests are not behaving correctly. This ensures that the
+ * driver is not installed and its operations are not exported to the clients.
+ * However, once the driver is successfully probed and an FF-A anomaly is
+ * detected when clients invoke the driver operations, the driver cause
+ * u-boot to panic because the client would not know what to do in such conditions.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_probe(struct udevice *dev)
+{
+	int ret;
+	size_t buf_4k_pages = 0;
+
+	ffa_dbg("[%s]: initializing the FF-A driver", __func__);
+
+	ret = ffa_init_private_data(dev);
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_get_version();
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_get_endpoint_id();
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_get_rxtx_map_features();
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_get_rxtx_buffers_pages_cnt(&buf_4k_pages);
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_map_rxtx_buffers(buf_4k_pages);
+
+	if (ret != FFA_ERR_STAT_SUCCESS)
+		return ret;
+
+	ret = ffa_cache_partitions_info();
+
+	if (ret != FFA_ERR_STAT_SUCCESS) {
+		ffa_free_rxtx_buffers(buf_4k_pages);
+		return ret;
+	}
+
+	ffa_dbg("[%s]: initialization done", __func__);
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_of_to_plat - Reads the device tree node
+ * @dev:	the arm_ffa device
+ *
+ * This boot time function reads data from the device tree node and populates
+ * the platform data structure
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+static int ffa_of_to_plat(struct udevice *dev)
+{
+	struct ffa_pdata *pdata = dev_get_plat(dev);
+	const char *conduit;
+
+	ffa_dbg("[%s]", __func__);
+
+	conduit = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "method", NULL);
+
+	if (strcmp("smc", conduit)) {
+		ffa_err("Unsupported conduit");
+		return -EINVAL;
+	}
+
+	pdata->conduit = FFA_CONDUIT_SMC;
+
+	return FFA_ERR_STAT_SUCCESS;
+}
+
+/**
+ * ffa_drv_ops - The driver operations runtime structure
+ * @invoke_func:	The driver dispatcher
+ */
+struct ffa_ops __ffa_runtime_data ffa_drv_ops = {
+	.invoke_func = invoke_ffa_drv_api
+};
+
+/**
+ * ffa_device_get_ops - driver operations getter
+ *
+ * Return:
+ * This runtime function returns a pointer to the driver operations structure
+ */
+const struct ffa_ops * __ffa_runtime ffa_device_get_ops(void)
+{
+	return &ffa_drv_ops;
+}
+
+/**
+ * Defining the device tree compatible string
+ */
+
+static const struct udevice_id ffa_match_id[] = {
+	{"arm,ffa", 0},
+	{},
+};
+
+/**
+ * Declaring the arm_ffa driver under UCLASS_FFA
+ */
+
+U_BOOT_DRIVER(arm_ffa) = {
+	.name		= "arm_ffa",
+	.of_match	= ffa_match_id,
+	.id		= UCLASS_FFA,
+	.of_to_plat	= ffa_of_to_plat,
+	.probe		= ffa_probe,
+	.plat_auto	= sizeof(struct ffa_pdata),
+};
diff --git a/include/arm_ffa.h b/include/arm_ffa.h
new file mode 100644
index 000000000000..313f46f74764
--- /dev/null
+++ b/include/arm_ffa.h
@@ -0,0 +1,191 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#ifndef __ARM_FFA_H
+#define __ARM_FFA_H
+
+#include <linux/arm-smccc.h>
+#include <linux/printk.h>
+
+/*
+ * This header is public. It can be used by clients to access
+ * data structures and definitions they need
+ */
+
+/*
+ * Macros for displaying logs
+ */
+
+#define ffa_dbg(fmt, ...)  pr_debug("[FFA] " fmt "\n", ##__VA_ARGS__)
+#define ffa_info(fmt, ...)  pr_info("[FFA] " fmt "\n", ##__VA_ARGS__)
+#define ffa_err(fmt, ...)  pr_err("[FFA] " fmt "\n", ##__VA_ARGS__)
+
+/*
+ * The driver operations success error code
+ */
+#define FFA_ERR_STAT_SUCCESS				(0)
+
+#if CONFIG_IS_ENABLED(EFI_LOADER)
+
+#include <efi_loader.h>
+
+/*
+ * __ffa_runtime_data and __ffa_runtime - controls whether data/code are
+ * available after calling the EFI ExitBootServices service.
+ * Data/code tagged with these keywords are resident (available at boot time and
+ * at runtime)
+ */
+
+#define __ffa_runtime_data __efi_runtime_data
+#define __ffa_runtime __efi_runtime
+
+#else
+
+#define __ffa_runtime_data
+#define __ffa_runtime
+
+#endif
+
+/*
+ * Definitions of the Arm FF-A interfaces supported by the Arm FF-A driver
+ */
+
+#define FFA_SMC(calling_convention, func_num)				\
+	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, (calling_convention),	\
+			   ARM_SMCCC_OWNER_STANDARD, (func_num))
+
+#define FFA_SMC_32(func_num)	FFA_SMC(ARM_SMCCC_SMC_32, (func_num))
+
+#define FFA_VERSION				FFA_SMC_32(0x63)
+#define FFA_ID_GET				FFA_SMC_32(0x69)
+#define FFA_FEATURES				FFA_SMC_32(0x64)
+#define FFA_PARTITION_INFO_GET				FFA_SMC_32(0x68)
+#define FFA_RXTX_MAP				FFA_SMC_32(0x66)
+#define FFA_RXTX_UNMAP				FFA_SMC_32(0x67)
+#define FFA_RX_RELEASE				FFA_SMC_32(0x65)
+#define FFA_MSG_SEND_DIRECT_REQ				FFA_SMC_32(0x6F)
+#define FFA_MSG_SEND_DIRECT_RESP				FFA_SMC_32(0x70)
+#define FFA_RUN				FFA_SMC_32(0x6D)
+#define FFA_ERROR				FFA_SMC_32(0x60)
+#define FFA_SUCCESS				FFA_SMC_32(0x61)
+#define FFA_INTERRUPT				FFA_SMC_32(0x62)
+
+/*
+ * struct ffa_partition_info - Partition information descriptor
+ * @id:	Partition ID
+ * @exec_ctxt:	Execution context count
+ * @properties:	Partition properties
+ *
+ * Data structure containing information about partitions instantiated in the system
+ * This structure is filled with the data queried by FFA_PARTITION_INFO_GET
+ */
+struct  __packed ffa_partition_info {
+	u16 id;
+	u16 exec_ctxt;
+/* partition supports receipt of direct requests */
+#define FFA_PARTITION_DIRECT_RECV	BIT(0)
+/* partition can send direct requests. */
+#define FFA_PARTITION_DIRECT_SEND	BIT(1)
+/* partition can send and receive indirect messages. */
+#define FFA_PARTITION_INDIRECT_MSG	BIT(2)
+	u32 properties;
+};
+
+/*
+ * struct ffa_send_direct_data - Data structure hosting the data
+ *                                       used by FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ * @a3-a7:	Data read/written from/to w3-w7 registers
+ *
+ * Data structure containing the data to be sent by FFA_MSG_SEND_DIRECT_REQ
+ * or read from FFA_MSG_SEND_DIRECT_RESP
+ */
+struct __packed ffa_send_direct_data {
+	u32 a3; /* w3 */
+	u32 a4; /* w4 */
+	u32 a5; /* w5 */
+	u32 a6; /* w6 */
+	u32 a7; /* w7 */
+};
+
+#define FFA_MSG_SEND_DIRECT_MAX_SIZE (sizeof(struct ffa_send_direct_data))
+
+/* UUID data size */
+#define UUID_SIZE (16)
+
+/*
+ * union ffa_partition_uuid - Data union hosting the UUID
+ *							transmitted by FFA_PARTITION_INFO_GET
+ * @words:	data structure giving 32-bit words access to the UUID data
+ * @bytes:	data structure giving byte access to the UUID data
+ *
+ * The structure holds little-endian UUID data.
+ */
+union ffa_partition_uuid {
+	struct __packed words {
+	u32 a1; /* w1 */
+	u32 a2; /* w2 */
+	u32 a3; /* w3 */
+	u32 a4; /* w4 */
+	} words;
+	u8 bytes[UUID_SIZE];
+};
+
+/**
+ * struct ffa_interface_data - generic FF-A interface data structure used to exchange
+ *							data between user layers and the driver
+ * @data0_size:	size of the first argument
+ * @data0:	pointer to the first argument
+ * @data1_size>:	size of the second argument
+ * @data1:	pointer to the second argument
+ *
+ * Using this structure user layers can pass various types of data with different sizes.
+ * The driver internal functions can detect the nature of this data, verfy compliance
+ * then execute the request when appropriate.
+ */
+struct ffa_interface_data {
+	u32 data0_size; /* size of the first argument */
+	void *data0; /* pointer to the first argument */
+	u32 data1_size; /* size of the second argument */
+	void *data1; /* pointer to the second argument */
+};
+
+/**
+ * struct ffa_ops - The driver operations structure
+ * @invoke_func:	function pointer to the invoke function
+ *
+ * The data structure providing all the operations supported by the driver.
+ * This structure is resident.
+ */
+struct ffa_ops {
+	/* the driver dispatcher */
+	int (*invoke_func)(u32 func_id, struct ffa_interface_data *func_data);
+};
+
+/**
+ * The device driver and the Uclass driver public functions
+ */
+
+/**
+ * ffa_get_invoke_func - performs a call to the FF-A driver dispatcher
+ */
+int __ffa_runtime ffa_get_invoke_func(u32 func_id,
+				      struct ffa_interface_data *func_data);
+
+/**
+ * ffa_device_get_ops - driver operations getter
+ */
+const struct ffa_ops * __ffa_runtime ffa_device_get_ops(void);
+
+/**
+ * ffa_get_device - probes the arm_ffa device
+ */
+int ffa_get_device(void);
+
+/**
+ * ffa_init_device - probes the arm_ffa device
+ */
+int ffa_init_device(void);
+#endif
diff --git a/include/arm_ffa_helper.h b/include/arm_ffa_helper.h
new file mode 100644
index 000000000000..0e143e54511e
--- /dev/null
+++ b/include/arm_ffa_helper.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#ifndef __ARM_FFA_HELPER_H
+#define __ARM_FFA_HELPER_H
+
+#include <arm_ffa.h>
+
+/*
+ * This header is public. Including this header provides all data structures
+ * and definitions needed by clients to use the FF-A transport driver
+ *
+ * It also provides helper functions allowing to pass data and invoke  FF-A functions
+ */
+
+/**
+ * ffa_helper_get_partitions_info - Wrapper function for FFA_PARTITION_INFO_GET
+ */
+int ffa_helper_get_partitions_info(struct ffa_interface_data *func_data);
+
+/**
+ * ffa_helper_unmap_rxtx_buffers - Wrapper function for FFA_RXTX_UNMAP
+ */
+int ffa_helper_unmap_rxtx_buffers(void);
+
+/**
+ * ffa_helper_msg_send_direct_req - Wrapper function for
+ *								FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ */
+int __ffa_runtime ffa_helper_msg_send_direct_req(struct ffa_interface_data
+						 *func_data);
+
+/**
+ * ffa_helper_init_device - Wrapper function for probing the arm_ffa device
+ */
+int ffa_helper_init_device(void);
+
+/**
+ * ffa_uuid_str_to_bin - Converts a big endian UUID string to a little endian buffer
+ */
+int ffa_uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin);
+#endif
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index 3ba69ad9a084..732441824557 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -55,6 +55,7 @@ enum uclass_id {
 	UCLASS_EFI_MEDIA,	/* Devices provided by UEFI firmware */
 	UCLASS_ETH,		/* Ethernet device */
 	UCLASS_ETH_PHY,		/* Ethernet PHY device */
+	UCLASS_FFA,		/* Arm Firmware Framework for Armv8-A */
 	UCLASS_FIRMWARE,	/* Firmware */
 	UCLASS_FS_FIRMWARE_LOADER,		/* Generic loader */
 	UCLASS_GPIO,		/* Bank of general-purpose I/O pins */
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
index 7f2be2339475..54980a130fdb 100644
--- a/include/linux/arm-smccc.h
+++ b/include/linux/arm-smccc.h
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2015, Linaro Limited
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
  */
 #ifndef __LINUX_ARM_SMCCC_H
 #define __LINUX_ARM_SMCCC_H
@@ -57,13 +59,17 @@
 #include <linux/types.h>
 /**
  * struct arm_smccc_res - Result from SMC/HVC call
- * @a0-a3 result values from registers 0 to 3
+ * @a0-a7 result values from registers 0 to 7
  */
 struct arm_smccc_res {
 	unsigned long a0;
 	unsigned long a1;
 	unsigned long a2;
 	unsigned long a3;
+	unsigned long a4;
+	unsigned long a5;
+	unsigned long a6;
+	unsigned long a7;
 };
 
 /**
@@ -113,6 +119,26 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
 			unsigned long a5, unsigned long a6, unsigned long a7,
 			struct arm_smccc_res *res, struct arm_smccc_quirk *quirk);
 
+#if (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
+/**
+ * __arm_ffa_smccc_smc() - make SMC calls used for FF-A transport
+ * @a0-a7: arguments passed in 64-bit registers x0 to x7
+ * @res: result values from 64-bit registers x0 to x7
+ *
+ * This function is used to make SMC calls following SMC32 Calling Convention.
+ * The content of the supplied parameters is copied to registers x0 to x7 prior
+ * to the SMC instruction. The SMC call return data is 32-bit data read from
+ * registers x0 tp x7.
+ */
+asmlinkage void __arm_ffa_smccc_smc(unsigned long a0, unsigned long a1,
+				    unsigned long a2, unsigned long a3, unsigned long a4,
+				    unsigned long a5, unsigned long a6, unsigned long a7,
+				    struct arm_smccc_res *res);
+
+#define arm_ffa_smccc_smc __arm_ffa_smccc_smc
+
+#endif
+
 #define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)
 
 #define arm_smccc_smc_quirk(...) __arm_smccc_smc(__VA_ARGS__)
diff --git a/lib/Kconfig b/lib/Kconfig
index acc0ac081a44..65db65c3c4cd 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -902,6 +902,7 @@ config SMBIOS_PARSER
 source lib/efi/Kconfig
 source lib/efi_loader/Kconfig
 source lib/optee/Kconfig
+source lib/arm-ffa/Kconfig
 
 config TEST_FDTDEC
 	bool "enable fdtdec test"
diff --git a/lib/Makefile b/lib/Makefile
index d9b1811f7506..4aa3e2ed2a7e 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_EFI) += efi/
 obj-$(CONFIG_EFI_LOADER) += efi_driver/
 obj-$(CONFIG_EFI_LOADER) += efi_loader/
 obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest/
+obj-$(CONFIG_ARM_FFA_TRANSPORT_HELPERS) += arm-ffa/
 obj-$(CONFIG_LZMA) += lzma/
 obj-$(CONFIG_BZIP2) += bzip2/
 obj-$(CONFIG_TIZEN) += tizen/
diff --git a/lib/arm-ffa/Kconfig b/lib/arm-ffa/Kconfig
new file mode 100644
index 000000000000..79acbc5a8fe3
--- /dev/null
+++ b/lib/arm-ffa/Kconfig
@@ -0,0 +1,6 @@
+config ARM_FFA_TRANSPORT_HELPERS
+	bool "Enable interface helpers for Arm Firmware Framework for Armv8-A"
+	depends on ARM_FFA_TRANSPORT
+	help
+	  User layers call FF-A interfaces using helper functions which
+	  pass the data and the FF-A function ID to the low level driver
diff --git a/lib/arm-ffa/Makefile b/lib/arm-ffa/Makefile
new file mode 100644
index 000000000000..c30c0f398126
--- /dev/null
+++ b/lib/arm-ffa/Makefile
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2021 Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+#
+
+# This file only gets included when CONFIG_ARM_FFA_TRANSPORT_HELPERS is set
+
+obj-y += arm_ffa_helper.o
diff --git a/lib/arm-ffa/arm_ffa_helper.c b/lib/arm-ffa/arm_ffa_helper.c
new file mode 100644
index 000000000000..623899d38044
--- /dev/null
+++ b/lib/arm-ffa/arm_ffa_helper.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2021 ARM Limited
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+#include <common.h>
+#include <arm_ffa_helper.h>
+#include <uuid.h>
+
+/**
+ * ffa_helper_get_partitions_info - Wrapper function for FFA_PARTITION_INFO_GET
+ *
+ * @func_data: Pointer to the FF-A function arguments container
+ *				structure.
+ *				The passed arguments:
+ *					Mode 1: When getting from the driver the number of
+ *						secure partitions:
+ *						@data0_size: UUID size
+ *						@data0: pointer to the UUID (little endian)
+ *						@data1_size: size of the number of partitions
+ *									variable
+ *						@data1: pointer to the number of partitions
+ *								 variable. The variable will be set
+ *								 by the driver
+ *					Mode 2: When requesting the driver to return the
+ *						partitions information:
+ *						@data0_size: UUID size
+ *						@data0: pointer to the UUID (little endian)
+ *						@data1_size: size of the SPs information buffer
+ *						@data1: pointer to SPs information buffer
+ *								(allocated by the client).
+ *							The buffer will be filled by the driver
+ *
+ * This is the boot time function used by clients who wants to get from secure
+ * world the partition(s) information.
+ *
+ * A client of the FF-A driver should know the UUID of the service it wants to
+ * access. It should use the UUID to request the FF-A driver to provide the
+ * partition(s) information of the service. The client should use
+ * ffa_helper_get_partitions_info to pass the UUID information to the driver
+ * which uses PARTITION_INFO_GET to obtain the partition(s) information.
+ *
+ * ffa_helper_get_partitions_info should be called twice. First call is to get
+ * from the driver the number of secure partitions (SPs) associated to a
+ * particular UUID. Then, the caller (client) allocates the buffer to host the
+ * SPs data and issues a 2nd call. Then, the driver fills the SPs data in the
+ * pre-allocated buffer.
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int ffa_helper_get_partitions_info(struct ffa_interface_data *func_data)
+{
+	return ffa_get_invoke_func(FFA_PARTITION_INFO_GET, func_data);
+}
+
+/**
+ * ffa_helper_unmap_rxtx_buffers - Wrapper function for FFA_RXTX_UNMAP
+ *
+ * This is the boot time function that allows clients to unmap the RX/TX
+ * buffers
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int ffa_helper_unmap_rxtx_buffers(void)
+{
+	return ffa_get_invoke_func(FFA_RXTX_UNMAP, NULL);
+}
+
+/**
+ * ffa_helper_msg_send_direct_req - Wrapper function for
+ *								FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ * @func_data: Pointer to the FF-A function arguments container structure.
+ * The passed arguments:
+ *	@data0_size: partition ID size
+ *	@data0: pointer to the partition ID
+ *	@data1_size: exchanged data size
+ *	@data1: pointer to the data buffer preallocated by the client (in/out)
+ *
+ * This is the runtime function that allows clients to send data to the secure
+ * world partitions. The arm_ffa driver uses FFA_MSG_SEND_DIRECT_REQ to send the
+ * data to the secure partition. The response from the secure partition is
+ * handled internally by the driver using FFA_MSG_SEND_DIRECT_RESP and returned
+ * to ffa_helper_msg_send_direct_req through @func_data
+ *
+ * The maximum size of the data that can be exchanged is 20 bytes which is
+ * sizeof(struct ffa_send_direct_data) as defined by the FF-A specification 1.0
+ * in the section relevant to FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ *
+ * The client should pre-allocate a buffer pointed by @data1 which the size
+ * is sizeof(struct ffa_send_direct_data)
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int __ffa_runtime ffa_helper_msg_send_direct_req(struct ffa_interface_data
+											 *func_data)
+{
+	return ffa_get_invoke_func(FFA_MSG_SEND_DIRECT_REQ, func_data);
+}
+
+/**
+ * ffa_helper_init_device - Wrapper function for probing the arm_ffa device
+ *
+ * This boot time function should be called to probe the arm_ffa device so
+ * it becomes ready for use.
+ * To achieve that, this function is called automatically at initcalls
+ * level (after u-boot relocation).
+ *
+ * Return:
+ *
+ * FFA_ERR_STAT_SUCCESS on success. Otherwise, failure
+ */
+int ffa_helper_init_device(void)
+{
+	return ffa_init_device();
+}
+
+/**
+ * ffa_uuid_str_to_bin - Converts a big endian UUID string to a little endian buffer
+ * @uuid_str:	UUID string in big endian format (36 bytes wide + '/0')
+ * @uuid_bin:	preallocated 16 bytes UUID buffer in little endian format
+ *
+ * UUID binary format used by the FF-A framework (16 bytes):
+ *
+ * [LSB] 4B-2B-2B-2B-6B (little endian data fields)
+ *
+ * UUID string is 36 length of characters (36 bytes):
+ *
+ * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+ * be                be      be       be      be
+ *
+ * where x is a hexadecimal character. Fields are separated by '-'s.
+ * When converting to a binary UUID, these endianness rules apply:
+ *     be: means the field in the string is considered a big endian hex number
+ *         and should be converted to little endian binary format
+ *
+ * Return:
+ *
+ *    uuid_bin filled with little endian UUID data
+ *    On success 0 is returned. Otherwise, failure code.
+ */
+int ffa_uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin)
+{
+	u16 tmp16 = 0;
+	u32 tmp32 = 0;
+	u64 tmp64 = 0;
+
+	if (!uuid_str_valid(uuid_str) || !uuid_bin)
+		return -EINVAL;
+
+	/*
+	 * reverse bytes from big to little endian
+	 */
+	tmp32 = simple_strtoul(uuid_str, NULL, 16);
+	memcpy(uuid_bin, &tmp32, 4);
+
+	/*
+	 * reverse bytes from big to little endian
+	 */
+	tmp16 = simple_strtoul(uuid_str + 9, NULL, 16);
+	memcpy(uuid_bin + 4, &tmp16, 2);
+
+	/*
+	 * reverse bytes from big to little endian
+	 */
+	tmp16 = simple_strtoul(uuid_str + 14, NULL, 16);
+	memcpy(uuid_bin + 6, &tmp16, 2);
+
+	/*
+	 * reverse bytes from big to little endian
+	 */
+	tmp16 = simple_strtoul(uuid_str + 19, NULL, 16);
+	memcpy(uuid_bin + 8, &tmp16, 2);
+
+	/*
+	 * reverse bytes from big to little endian
+	 */
+	tmp64 = simple_strtoull(uuid_str + 24, NULL, 16);
+	memcpy(uuid_bin + 10, (char *)&tmp64, 6);
+
+	return 0;
+}
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 4da64b5d2962..c68d9ed4f0bd 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -23,6 +23,10 @@
 #include <asm/setjmp.h>
 #include <linux/libfdt_env.h>
 
+#if defined(CONFIG_ARM_FFA_TRANSPORT)
+#include <arm_ffa_helper.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 /* Task priority level */
@@ -2113,6 +2117,10 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
 	struct efi_event *evt, *next_event;
 	efi_status_t ret = EFI_SUCCESS;
 
+#if defined(CONFIG_ARM_FFA_TRANSPORT)
+	int ffa_ret;
+#endif
+
 	EFI_ENTRY("%p, %zx", image_handle, map_key);
 
 	/* Check that the caller has read the current memory map */
@@ -2173,6 +2181,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
 		dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
 	}
 
+#if defined(CONFIG_ARM_FFA_TRANSPORT)
+	/* unmap FF-A RX/TX buffers */
+	ffa_ret = ffa_helper_unmap_rxtx_buffers();
+	if (ffa_ret)
+		debug("[efi_boottime][ERROR]: can not unmap FF-A RX/TX buffers\n");
+	else
+		debug("[efi_boottime][INFO]: FF-A RX/TX buffers unmapped\n");
+#endif
+
 	/* Patch out unsupported runtime function */
 	efi_runtime_detach();
 
-- 
2.37.1

