| 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 |