mirror of
https://git.yoctoproject.org/meta-arm
synced 2026-05-07 16:59:30 +00:00
arm-bsp/u-boot: corstone1000: support 32bit ffa direct messaging
Signed-off-by: Mohamed Omar Asaker <mohamed.omarasaker@arm.com> Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
committed by
Jon Mason
parent
f83c5ad19e
commit
14c7e5b336
+182
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user