new file mode 100644
@@ -0,0 +1,182 @@
+From 6cb8e5f83d53357fbc6e58c2c5c5a3450654f9e6 Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Wed, 19 Oct 2022 17:51:10 +0100
+Subject: [PATCH] arm_ffa: add support for 32-bit direct messaging
+
+add 32-bit mode for FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP
+
+Tested-by: Mohamed Omar Asaker <mohamed.omarasaker@arm.com>
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Upstream-Status: Pending [Not submitted to upstream yet]
+---
+ cmd/armffa.c | 2 +-
+ drivers/firmware/arm-ffa/core.c | 17 ++++++++++++++---
+ drivers/firmware/arm-ffa/sandbox.c | 2 +-
+ include/arm_ffa.h | 2 +-
+ lib/efi_loader/efi_capsule.c | 2 +-
+ lib/efi_loader/efi_setup.c | 2 +-
+ lib/efi_loader/efi_variable_tee.c | 2 +-
+ test/dm/ffa.c | 6 +++---
+ 8 files changed, 23 insertions(+), 12 deletions(-)
+
+diff --git a/cmd/armffa.c b/cmd/armffa.c
+index 9b56e8a830..9842b99181 100644
+--- a/cmd/armffa.c
++++ b/cmd/armffa.c
+@@ -129,7 +129,7 @@ int do_ffa_msg_send_direct_req(struct cmd_tbl *cmdtp, int flag, int argc,
+ return -EINVAL;
+ }
+
+- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
+ if (ret == 0) {
+ u8 cnt;
+
+diff --git a/drivers/firmware/arm-ffa/core.c b/drivers/firmware/arm-ffa/core.c
+index caba10caae..ba1ba59937 100644
+--- a/drivers/firmware/arm-ffa/core.c
++++ b/drivers/firmware/arm-ffa/core.c
+@@ -1032,6 +1032,7 @@ static int ffa_cache_partitions_info(void)
+ * ffa_msg_send_direct_req - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function
+ * @dst_part_id: destination partition ID
+ * @msg: pointer to the message data preallocated by the client (in/out)
++ * @is_smc64: select 64-bit or 32-bit FF-A ABI
+ *
+ * This is the runtime function that implements FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ * FF-A functions.
+@@ -1048,10 +1049,12 @@ static int ffa_cache_partitions_info(void)
+ *
+ * 0 on success. Otherwise, failure
+ */
+-static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_send_direct_data *msg)
++static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_send_direct_data *msg,
++ u8 is_smc64)
+ {
+ ffa_value_t res = {0};
+ int ffa_errno;
++ u64 req_mode, resp_mode;
+
+ if (!ffa_priv_data || !ffa_priv_data->invoke_ffa_fn)
+ return -EINVAL;
+@@ -1060,8 +1063,16 @@ static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_sen
+ if (!ffa_priv_data->partitions.count || !ffa_priv_data->partitions.descs)
+ return -ENODEV;
+
++ if(is_smc64) {
++ req_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ);
++ resp_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP);
++ } else {
++ req_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_REQ);
++ resp_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_RESP);
++ }
++
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+- .a0 = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ),
++ .a0 = req_mode,
+ .a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data->id) |
+ PREP_PART_ENDPOINT_ID(dst_part_id),
+ .a2 = 0,
+@@ -1083,7 +1094,7 @@ static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_sen
+ return 0;
+ }
+
+- if (res.a0 == FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP)) {
++ if (res.a0 == resp_mode){
+ /*
+ * Message sent with response
+ * extract the return data
+diff --git a/drivers/firmware/arm-ffa/sandbox.c b/drivers/firmware/arm-ffa/sandbox.c
+index 16e1fdc809..8e8549441d 100644
+--- a/drivers/firmware/arm-ffa/sandbox.c
++++ b/drivers/firmware/arm-ffa/sandbox.c
+@@ -430,7 +430,7 @@ static int sandbox_ffa_sp_valid(u16 part_id)
+ * @{a0-a7} , res: The SMC call arguments and return structure.
+ *
+ * This is the function that emulates FFA_MSG_SEND_DIRECT_{REQ,RESP}
+- * FF-A functions.
++ * FF-A functions. Only SMC 64-bit is supported in Sandbox.
+ *
+ * Emulating interrupts is not supported. So, FFA_RUN and FFA_INTERRUPT are not supported.
+ * In case of success FFA_MSG_SEND_DIRECT_RESP is returned with default pattern data (0xff).
+diff --git a/include/arm_ffa.h b/include/arm_ffa.h
+index 665413a0c5..4a7c59ff28 100644
+--- a/include/arm_ffa.h
++++ b/include/arm_ffa.h
+@@ -97,7 +97,7 @@ struct __packed ffa_send_direct_data {
+ struct ffa_bus_ops {
+ int (*partition_info_get)(const char *uuid_str,
+ u32 *parts_size, struct ffa_partition_info *buffer);
+- int (*sync_send_receive)(u16 dst_part_id, struct ffa_send_direct_data *msg);
++ int (*sync_send_receive)(u16 dst_part_id, struct ffa_send_direct_data *msg, u8 is_smc64);
+ int (*rxtx_unmap)(void);
+ };
+
+diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
+index 65e2fc8296..c479c53d04 100644
+--- a/lib/efi_loader/efi_capsule.c
++++ b/lib/efi_loader/efi_capsule.c
+@@ -591,7 +591,7 @@ static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_s
+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+ PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w4 */
+
+- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
++ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
+ }
+ #endif
+
+diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
+index 6ccda175ff..416af8d663 100644
+--- a/lib/efi_loader/efi_setup.c
++++ b/lib/efi_loader/efi_setup.c
+@@ -153,7 +153,7 @@ static int efi_corstone1000_uboot_efi_started_event(void)
+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+ PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w4 */
+
+- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
++ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
+ }
+ #endif
+
+diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
+index 7d9d577281..05f3c02911 100644
+--- a/lib/efi_loader/efi_variable_tee.c
++++ b/lib/efi_loader/efi_variable_tee.c
+@@ -201,7 +201,7 @@ static int __efi_runtime ffa_notify_mm_sp(void)
+
+ msg.data0 = FFA_SHARED_MM_BUFFER_OFFSET; /* x3 */
+
+- ret = ffa_bus_ops_get()->sync_send_receive(mm_sp_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(mm_sp_id, &msg, 1);
+ if (ret != 0)
+ return ret;
+
+diff --git a/test/dm/ffa.c b/test/dm/ffa.c
+index 052d5fc3f4..14b19cf71e 100644
+--- a/test/dm/ffa.c
++++ b/test/dm/ffa.c
+@@ -170,7 +170,7 @@ static int test_ffa_msg_send_direct_req(u16 part_id, struct unit_test_state *ut
+ struct ffa_send_direct_data msg = {0};
+ u8 cnt;
+
+- ut_assertok(ffa_bus_ops_get()->sync_send_receive(part_id, &msg));
++ ut_assertok(ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1));
+
+ for (cnt = 0; cnt < sizeof(struct ffa_send_direct_data) / sizeof(u64); cnt++)
+ ut_assertok(((u64 *)&msg)[cnt] != 0xffffffffffffffff);
+@@ -380,12 +380,12 @@ static int dm_test_ffa_nack(struct unit_test_state *uts)
+ ut_assertok(count != SANDBOX_SP_COUNT_PER_VALID_SERVICE);
+
+ /* send data to an invalid partition */
+- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
+ ut_assertok(ret != -EINVAL);
+
+ /* send data to a valid partition */
+ part_id = prvdata->partitions.descs[0].info.id;
+- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
+ ut_assertok(ret != 0);
+
+ return CMD_RET_SUCCESS;
+--
+2.17.1
@@ -48,7 +48,8 @@ SRC_URI:append:corstone1000 = " \
file://0028-Introduce-external-sys-driver-to-device-tree.patch \
file://0029-Add-mhu-and-rpmsg-client-to-u-boot-device-tree.patch \
file://0030-arm-corstone1000-esrt-support.patch \
- "
+ file://0031-ffa-add-support-for-32-bit-direct-messaging.patch \
+ "
#
# FVP BASE