blob: ac0638e02a651b988d7f8be9d41c580bcd0d5278 [file] [log] [blame]
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