diff options
author | Olivier Deprez <olivier.deprez@arm.com> | 2021-06-18 17:28:42 +0200 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2021-06-18 17:28:42 +0200 |
commit | e3cfd6df27e46c17f514baab275f0a6209aecb44 (patch) | |
tree | 4254f7fd53218e903ed2e9755143ecda93167709 | |
parent | 5de3d67e9fcc8b03efd28f6ae5fd4e0e7a345209 (diff) | |
parent | 6833ea5159f6adc08bda18d5147aba1e6ca281b5 (diff) | |
download | tf-a-tests-e3cfd6df27e46c17f514baab275f0a6209aecb44.tar.gz |
Merge changes from topic "db/spm_id_get"
* changes:
Group FF-A Setup and Discovery interface tests
Add tests for FFA function FFA_SPM_ID_GET
Change the name of type ffa_vm_id_t
20 files changed, 422 insertions, 332 deletions
diff --git a/include/runtime_services/cactus_test_cmds.h b/include/runtime_services/cactus_test_cmds.h index 483a7f493..097096872 100644 --- a/include/runtime_services/cactus_test_cmds.h +++ b/include/runtime_services/cactus_test_cmds.h @@ -37,7 +37,7 @@ static inline uint64_t cactus_get_cmd(smc_ret_values ret) * messages interfaces. */ static inline smc_ret_values cactus_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint64_t cmd, uint64_t val0, + ffa_id_t source, ffa_id_t dest, uint64_t cmd, uint64_t val0, uint64_t val1, uint64_t val2, uint64_t val3) { return ffa_msg_send_direct_req64(source, dest, cmd, val0, val1, val2, @@ -50,7 +50,7 @@ static inline smc_ret_values cactus_send_cmd( * a need to propagate more than one value in the response of a command. */ static inline smc_ret_values cactus_send_response( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t resp, uint32_t val0, + ffa_id_t source, ffa_id_t dest, uint32_t resp, uint32_t val0, uint64_t val1, uint64_t val2, uint64_t val3) { return ffa_msg_send_direct_resp64(source, dest, resp, val0, val1, @@ -61,7 +61,7 @@ static inline smc_ret_values cactus_send_response( * For responses of one value only. */ static inline smc_ret_values cactus_response( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t response) + ffa_id_t source, ffa_id_t dest, uint32_t response) { return ffa_msg_send_direct_resp64(source, dest, response, 0, 0, 0, 0); } @@ -78,7 +78,7 @@ static inline uint32_t cactus_get_response(smc_ret_values ret) * specific test. */ static inline smc_ret_values cactus_success_resp( - ffa_vm_id_t source, ffa_vm_id_t dest, uint64_t value) + ffa_id_t source, ffa_id_t dest, uint64_t value) { return cactus_send_response(source, dest, CACTUS_SUCCESS, value, 0, 0, 0); @@ -90,7 +90,7 @@ static inline smc_ret_values cactus_success_resp( * in the error code list. */ static inline smc_ret_values cactus_error_resp( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t error_code) + ffa_id_t source, ffa_id_t dest, uint32_t error_code) { return cactus_send_response(source, dest, CACTUS_ERROR, error_code, 0, 0, 0); @@ -110,7 +110,7 @@ static inline uint32_t cactus_error_code(smc_ret_values ret) #define CACTUS_ECHO_CMD U(0x6563686f) static inline smc_ret_values cactus_echo_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint64_t echo_val) + ffa_id_t source, ffa_id_t dest, uint64_t echo_val) { return cactus_send_cmd(source, dest, CACTUS_ECHO_CMD, echo_val, 0, 0, 0); @@ -131,16 +131,16 @@ static inline uint64_t cactus_echo_get_val(smc_ret_values ret) #define CACTUS_REQ_ECHO_CMD (CACTUS_ECHO_CMD + 1) static inline smc_ret_values cactus_req_echo_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, ffa_vm_id_t echo_dest, + ffa_id_t source, ffa_id_t dest, ffa_id_t echo_dest, uint64_t echo_val) { return cactus_send_cmd(source, dest, CACTUS_REQ_ECHO_CMD, echo_val, echo_dest, 0, 0); } -static inline ffa_vm_id_t cactus_req_echo_get_echo_dest(smc_ret_values ret) +static inline ffa_id_t cactus_req_echo_get_echo_dest(smc_ret_values ret) { - return (ffa_vm_id_t)ret.ret5; + return (ffa_id_t)ret.ret5; } /** @@ -155,15 +155,15 @@ static inline ffa_vm_id_t cactus_req_echo_get_echo_dest(smc_ret_values ret) #define CACTUS_DEADLOCK_CMD U(0x64656164) static inline smc_ret_values cactus_deadlock_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, ffa_vm_id_t next_dest) + ffa_id_t source, ffa_id_t dest, ffa_id_t next_dest) { return cactus_send_cmd(source, dest, CACTUS_DEADLOCK_CMD, next_dest, 0, 0, 0); } -static inline ffa_vm_id_t cactus_deadlock_get_next_dest(smc_ret_values ret) +static inline ffa_id_t cactus_deadlock_get_next_dest(smc_ret_values ret) { - return (ffa_vm_id_t)ret.ret4; + return (ffa_id_t)ret.ret4; } /** @@ -173,17 +173,17 @@ static inline ffa_vm_id_t cactus_deadlock_get_next_dest(smc_ret_values ret) #define CACTUS_REQ_DEADLOCK_CMD (CACTUS_DEADLOCK_CMD + 1) static inline smc_ret_values cactus_req_deadlock_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, ffa_vm_id_t next_dest1, - ffa_vm_id_t next_dest2) + ffa_id_t source, ffa_id_t dest, ffa_id_t next_dest1, + ffa_id_t next_dest2) { return cactus_send_cmd(source, dest, CACTUS_REQ_DEADLOCK_CMD, next_dest1, next_dest2, 0, 0); } /* To get next_dest1 use CACTUS_DEADLOCK_GET_NEXT_DEST */ -static inline ffa_vm_id_t cactus_deadlock_get_next_dest2(smc_ret_values ret) +static inline ffa_id_t cactus_deadlock_get_next_dest2(smc_ret_values ret) { - return (ffa_vm_id_t)ret.ret5; + return (ffa_id_t)ret.ret5; } /** @@ -195,7 +195,7 @@ static inline ffa_vm_id_t cactus_deadlock_get_next_dest2(smc_ret_values ret) #define CACTUS_MEM_SEND_CMD U(0x6d656d) static inline smc_ret_values cactus_mem_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t mem_func, + ffa_id_t source, ffa_id_t dest, uint32_t mem_func, ffa_memory_handle_t handle) { return cactus_send_cmd(source, dest, CACTUS_MEM_SEND_CMD, mem_func, @@ -217,8 +217,8 @@ static inline ffa_memory_handle_t cactus_mem_send_get_handle(smc_ret_values ret) #define CACTUS_REQ_MEM_SEND_CMD U(0x6d656d6f7279) static inline smc_ret_values cactus_req_mem_send_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t mem_func, - ffa_vm_id_t receiver) + ffa_id_t source, ffa_id_t dest, uint32_t mem_func, + ffa_id_t receiver) { return cactus_send_cmd(source, dest, CACTUS_REQ_MEM_SEND_CMD, mem_func, receiver, 0, 0); @@ -229,9 +229,9 @@ static inline uint32_t cactus_req_mem_send_get_mem_func(smc_ret_values ret) return (uint32_t)ret.ret4; } -static inline ffa_vm_id_t cactus_req_mem_send_get_receiver(smc_ret_values ret) +static inline ffa_id_t cactus_req_mem_send_get_receiver(smc_ret_values ret) { - return (ffa_vm_id_t)ret.ret5; + return (ffa_id_t)ret.ret5; } /** @@ -244,7 +244,7 @@ static inline ffa_vm_id_t cactus_req_mem_send_get_receiver(smc_ret_values ret) #define CACTUS_REQ_SIMD_FILL_CMD U(0x53494d44) static inline smc_ret_values cactus_req_simd_fill_send_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest) + ffa_id_t source, ffa_id_t dest) { return cactus_send_cmd(source, dest, CACTUS_REQ_SIMD_FILL_CMD, 0, 0, 0, 0); @@ -258,7 +258,7 @@ static inline smc_ret_values cactus_req_simd_fill_send_cmd( #define CACTUS_SLEEP_CMD U(0x736c656570) static inline smc_ret_values cactus_sleep_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t sleep_time) + ffa_id_t source, ffa_id_t dest, uint32_t sleep_time) { return cactus_send_cmd(source, dest, CACTUS_SLEEP_CMD, sleep_time, 0, 0, 0); @@ -277,7 +277,7 @@ static inline uint32_t cactus_get_sleep_time(smc_ret_values ret) #define CACTUS_INTERRUPT_CMD U(0x696e7472) static inline smc_ret_values cactus_interrupt_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest, uint32_t interrupt_id, + ffa_id_t source, ffa_id_t dest, uint32_t interrupt_id, bool enable, uint32_t pin) { return cactus_send_cmd(source, dest, CACTUS_INTERRUPT_CMD, interrupt_id, @@ -307,7 +307,7 @@ static inline enum interrupt_pin cactus_get_interrupt_pin(smc_ret_values ret) #define CACTUS_DMA_SMMUv3_CMD (0x534d4d55) static inline smc_ret_values cactus_send_dma_cmd( - ffa_vm_id_t source, ffa_vm_id_t dest) + ffa_id_t source, ffa_id_t dest) { return cactus_send_cmd(source, dest, CACTUS_DMA_SMMUv3_CMD, 0, 0, 0, 0); diff --git a/include/runtime_services/ffa_helpers.h b/include/runtime_services/ffa_helpers.h index 592327af7..3ca9c821e 100644 --- a/include/runtime_services/ffa_helpers.h +++ b/include/runtime_services/ffa_helpers.h @@ -14,7 +14,7 @@ /* This error code must be different to the ones used by FFA */ #define FFA_TFTF_ERROR -42 -typedef unsigned short ffa_vm_id_t; +typedef unsigned short ffa_id_t; typedef unsigned short ffa_vm_count_t; typedef unsigned short ffa_vcpu_count_t; typedef uint64_t ffa_memory_handle_t; @@ -31,7 +31,7 @@ struct ffa_uuid { struct ffa_partition_info { /** The ID of the VM the information is about */ - ffa_vm_id_t id; + ffa_id_t id; /** The number of execution contexts implemented by the partition */ uint16_t exec_context; /** The Partition's properties, e.g. supported messaging methods */ @@ -46,6 +46,10 @@ static inline int32_t ffa_error_code(smc_ret_values val) { return (int32_t) val.ret2; } +static inline ffa_id_t ffa_endpoint_id(smc_ret_values val) { + return (ffa_id_t) val.ret2 & 0xffff; +} + enum ffa_data_access { FFA_DATA_ACCESS_NOT_SPECIFIED, FFA_DATA_ACCESS_RO, @@ -196,7 +200,7 @@ struct ffa_composite_memory_region { */ struct ffa_memory_region_attributes { /** The ID of the VM to which the memory is being given or shared. */ - ffa_vm_id_t receiver; + ffa_id_t receiver; /** * The permissions with which the memory region should be mapped in the * receiver's page table. @@ -264,7 +268,7 @@ struct ffa_memory_region { * The ID of the VM which originally sent the memory region, i.e. the * owner. */ - ffa_vm_id_t sender; + ffa_id_t sender; ffa_memory_attributes_t attributes; /** Reserved field, must be 0. */ uint8_t reserved_0; @@ -300,7 +304,7 @@ struct ffa_mem_relinquish { ffa_memory_handle_t handle; ffa_memory_region_flags_t flags; uint32_t endpoint_count; - ffa_vm_id_t endpoints[]; + ffa_id_t endpoints[]; }; static inline ffa_memory_handle_t ffa_assemble_handle(uint32_t h1, uint32_t h2) @@ -335,18 +339,18 @@ ffa_memory_region_get_composite(struct ffa_memory_region *memory_region, static inline uint32_t ffa_mem_relinquish_init( struct ffa_mem_relinquish *relinquish_request, ffa_memory_handle_t handle, ffa_memory_region_flags_t flags, - ffa_vm_id_t sender) + ffa_id_t sender) { relinquish_request->handle = handle; relinquish_request->flags = flags; relinquish_request->endpoint_count = 1; relinquish_request->endpoints[0] = sender; - return sizeof(struct ffa_mem_relinquish) + sizeof(ffa_vm_id_t); + return sizeof(struct ffa_mem_relinquish) + sizeof(ffa_id_t); } uint32_t ffa_memory_retrieve_request_init( struct ffa_memory_region *memory_region, ffa_memory_handle_t handle, - ffa_vm_id_t sender, ffa_vm_id_t receiver, uint32_t tag, + ffa_id_t sender, ffa_id_t receiver, uint32_t tag, ffa_memory_region_flags_t flags, enum ffa_data_access data_access, enum ffa_instruction_access instruction_access, enum ffa_memory_type type, enum ffa_memory_cacheability cacheability, @@ -354,7 +358,7 @@ uint32_t ffa_memory_retrieve_request_init( uint32_t ffa_memory_region_init( struct ffa_memory_region *memory_region, size_t memory_region_max_size, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, const struct ffa_memory_region_constituent constituents[], uint32_t constituent_count, uint32_t tag, ffa_memory_region_flags_t flags, enum ffa_data_access data_access, @@ -363,37 +367,38 @@ uint32_t ffa_memory_region_init( enum ffa_memory_shareability shareability, uint32_t *total_length, uint32_t *fragment_length); -static inline ffa_vm_id_t ffa_dir_msg_dest(smc_ret_values val) { - return (ffa_vm_id_t)val.ret1 & U(0xFFFF); +static inline ffa_id_t ffa_dir_msg_dest(smc_ret_values val) { + return (ffa_id_t)val.ret1 & U(0xFFFF); } -static inline ffa_vm_id_t ffa_dir_msg_source(smc_ret_values val) { - return (ffa_vm_id_t)(val.ret1 >> 16U); +static inline ffa_id_t ffa_dir_msg_source(smc_ret_values val) { + return (ffa_id_t)(val.ret1 >> 16U); } -smc_ret_values ffa_msg_send_direct_req64(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint64_t arg0, +smc_ret_values ffa_msg_send_direct_req64(ffa_id_t source_id, + ffa_id_t dest_id, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); -smc_ret_values ffa_msg_send_direct_req32(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint32_t arg0, +smc_ret_values ffa_msg_send_direct_req32(ffa_id_t source_id, + ffa_id_t dest_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4); -smc_ret_values ffa_msg_send_direct_resp64(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint64_t arg0, +smc_ret_values ffa_msg_send_direct_resp64(ffa_id_t source_id, + ffa_id_t dest_id, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); -smc_ret_values ffa_msg_send_direct_resp32(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint32_t arg0, +smc_ret_values ffa_msg_send_direct_resp32(ffa_id_t source_id, + ffa_id_t dest_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4); smc_ret_values ffa_run(uint32_t dest_id, uint32_t vcpu_id); smc_ret_values ffa_version(uint32_t input_version); smc_ret_values ffa_id_get(void); +smc_ret_values ffa_spm_id_get(void); smc_ret_values ffa_msg_wait(void); smc_ret_values ffa_error(int32_t error_code); smc_ret_values ffa_features(uint32_t feature); diff --git a/include/runtime_services/ffa_svc.h b/include/runtime_services/ffa_svc.h index c97026583..3a474e701 100644 --- a/include/runtime_services/ffa_svc.h +++ b/include/runtime_services/ffa_svc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * Copyright (c) 2018-2021, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -22,7 +22,7 @@ /* The macros below are used to identify FFA calls from the SMC function ID */ #define FFA_FNUM_MIN_VALUE U(0x60) -#define FFA_FNUM_MAX_VALUE U(0x84) +#define FFA_FNUM_MAX_VALUE U(0x85) #define is_ffa_fid(fid) __extension__ ({ \ __typeof__(fid) _fid = (fid); \ ((GET_SMC_NUM(_fid) >= FFA_FNUM_MIN_VALUE) && \ @@ -85,6 +85,7 @@ #define FFA_FNUM_MEM_RELINQUISH U(0x76) #define FFA_FNUM_MEM_RECLAIM U(0x77) #define FFA_FNUM_SECONDARY_EP_REGISTER U(0x84) +#define FFA_FNUM_SPM_ID_GET U(0x85) /* FFA SMC32 FIDs */ #define FFA_ERROR FFA_FID(SMC_32, FFA_FNUM_ERROR) @@ -114,6 +115,7 @@ #define FFA_MEM_RETRIEVE_RESP FFA_FID(SMC_32, FFA_FNUM_MEM_RETRIEVE_RESP) #define FFA_MEM_RELINQUISH FFA_FID(SMC_32, FFA_FNUM_MEM_RELINQUISH) #define FFA_MEM_RECLAIM FFA_FID(SMC_32, FFA_FNUM_MEM_RECLAIM) +#define FFA_SPM_ID_GET FFA_FID(SMC_32, FFA_FNUM_SPM_ID_GET) /* FFA SMC64 FIDs */ #define FFA_SUCCESS_SMC64 FFA_FID(SMC_64, FFA_FNUM_SUCCESS) diff --git a/include/runtime_services/spm_common.h b/include/runtime_services/spm_common.h index 50159ecb8..685e73202 100644 --- a/include/runtime_services/spm_common.h +++ b/include/runtime_services/spm_common.h @@ -13,6 +13,8 @@ /* Hypervisor ID at physical FFA instance */ #define HYP_ID (0) +/* SPMC ID */ +#define SPMC_ID U(0x8000) /* ID for the first Secure Partition. */ #define SPM_VM_ID_FIRST SP_ID(1) @@ -42,6 +44,7 @@ struct ffa_features_test { const char *test_name; unsigned int feature; unsigned int expected_ret; + unsigned int version_added; }; struct mailbox_buffers { @@ -107,7 +110,7 @@ unsigned int get_ffa_feature_test_target(const struct ffa_features_test **test_t */ bool memory_retrieve(struct mailbox_buffers *mb, struct ffa_memory_region **retrieved, uint64_t handle, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, uint32_t mem_func); /** @@ -115,7 +118,7 @@ bool memory_retrieve(struct mailbox_buffers *mb, * after it being done with the memory shared, identified by the 'handle'. */ bool memory_relinquish(struct ffa_mem_relinquish *m, uint64_t handle, - ffa_vm_id_t id); + ffa_id_t id); ffa_memory_handle_t memory_send( struct ffa_memory_region *memory_region, uint32_t mem_func, @@ -123,7 +126,7 @@ ffa_memory_handle_t memory_send( ffa_memory_handle_t memory_init_and_send( struct ffa_memory_region *memory_region, size_t memory_region_max_size, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, const struct ffa_memory_region_constituent* constituents, uint32_t constituents_count, uint32_t mem_func); diff --git a/spm/cactus/cactus_interrupt.c b/spm/cactus/cactus_interrupt.c index 7de36cf0c..f61df94e6 100644 --- a/spm/cactus/cactus_interrupt.c +++ b/spm/cactus/cactus_interrupt.c @@ -13,7 +13,7 @@ #include "cactus_test_cmds.h" #include "spm_common.h" -extern ffa_vm_id_t g_ffa_id; +extern ffa_id_t g_ffa_id; static void managed_exit_handler(void) { diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c index ff3f61871..73606bd2a 100644 --- a/spm/cactus/cactus_main.c +++ b/spm/cactus/cactus_main.c @@ -34,7 +34,7 @@ extern const char version_string[]; extern void secondary_cold_entry(void); /* Global ffa_id */ -ffa_vm_id_t g_ffa_id; +ffa_id_t g_ffa_id; /* * @@ -45,10 +45,10 @@ ffa_vm_id_t g_ffa_id; * */ -static void __dead2 message_loop(ffa_vm_id_t vm_id, struct mailbox_buffers *mb) +static void __dead2 message_loop(ffa_id_t vm_id, struct mailbox_buffers *mb) { smc_ret_values ffa_ret; - ffa_vm_id_t destination; + ffa_id_t destination; /* * This initial wait call is necessary to inform SPMD that @@ -182,7 +182,7 @@ void __dead2 cactus_main(bool primary_cold_boot) /* Get current FFA id */ smc_ret_values ffa_id_ret = ffa_id_get(); - ffa_vm_id_t ffa_id = (ffa_vm_id_t)(ffa_id_ret.ret2 & 0xffff); + ffa_id_t ffa_id = ffa_endpoint_id(ffa_id_ret); if (ffa_func_id(ffa_id_ret) != FFA_SUCCESS_SMC32) { ERROR("FFA_ID_GET failed.\n"); panic(); diff --git a/spm/cactus/cactus_tests/cactus_test_direct_messaging.c b/spm/cactus/cactus_tests/cactus_test_direct_messaging.c index a59cfa24a..9b9d1aa14 100644 --- a/spm/cactus/cactus_tests/cactus_test_direct_messaging.c +++ b/spm/cactus/cactus_tests/cactus_test_direct_messaging.c @@ -24,8 +24,8 @@ CACTUS_CMD_HANDLER(echo_cmd, CACTUS_ECHO_CMD) CACTUS_CMD_HANDLER(req_echo_cmd, CACTUS_REQ_ECHO_CMD) { smc_ret_values ffa_ret; - ffa_vm_id_t vm_id = ffa_dir_msg_dest(*args); - ffa_vm_id_t echo_dest = cactus_req_echo_get_echo_dest(*args); + ffa_id_t vm_id = ffa_dir_msg_dest(*args); + ffa_id_t echo_dest = cactus_req_echo_get_echo_dest(*args); uint64_t echo_val = cactus_echo_get_val(*args); VERBOSE("%x requested to send echo to %x, value %llx\n", @@ -48,10 +48,10 @@ CACTUS_CMD_HANDLER(req_echo_cmd, CACTUS_REQ_ECHO_CMD) return cactus_success_resp(vm_id, ffa_dir_msg_source(*args), 0); } -static smc_ret_values base_deadlock_handler(ffa_vm_id_t vm_id, - ffa_vm_id_t source, - ffa_vm_id_t deadlock_dest, - ffa_vm_id_t deadlock_next_dest) +static smc_ret_values base_deadlock_handler(ffa_id_t vm_id, + ffa_id_t source, + ffa_id_t deadlock_dest, + ffa_id_t deadlock_next_dest) { smc_ret_values ffa_ret; @@ -92,9 +92,9 @@ static smc_ret_values base_deadlock_handler(ffa_vm_id_t vm_id, CACTUS_CMD_HANDLER(deadlock_cmd, CACTUS_DEADLOCK_CMD) { - ffa_vm_id_t source = ffa_dir_msg_source(*args); - ffa_vm_id_t deadlock_dest = cactus_deadlock_get_next_dest(*args); - ffa_vm_id_t deadlock_next_dest = source; + ffa_id_t source = ffa_dir_msg_source(*args); + ffa_id_t deadlock_dest = cactus_deadlock_get_next_dest(*args); + ffa_id_t deadlock_next_dest = source; VERBOSE("%x is creating deadlock. next: %x\n", source, deadlock_dest); @@ -104,10 +104,10 @@ CACTUS_CMD_HANDLER(deadlock_cmd, CACTUS_DEADLOCK_CMD) CACTUS_CMD_HANDLER(req_deadlock_cmd, CACTUS_REQ_DEADLOCK_CMD) { - ffa_vm_id_t vm_id = ffa_dir_msg_dest(*args); - ffa_vm_id_t source = ffa_dir_msg_source(*args); - ffa_vm_id_t deadlock_dest = cactus_deadlock_get_next_dest(*args); - ffa_vm_id_t deadlock_next_dest = cactus_deadlock_get_next_dest2(*args); + ffa_id_t vm_id = ffa_dir_msg_dest(*args); + ffa_id_t source = ffa_dir_msg_source(*args); + ffa_id_t deadlock_dest = cactus_deadlock_get_next_dest(*args); + ffa_id_t deadlock_next_dest = cactus_deadlock_get_next_dest2(*args); VERBOSE("%x requested deadlock with %x and %x\n", ffa_dir_msg_source(*args), deadlock_dest, deadlock_next_dest); diff --git a/spm/cactus/cactus_tests/cactus_test_ffa.c b/spm/cactus/cactus_tests/cactus_test_ffa.c index 2ade7bd98..93f04033d 100644 --- a/spm/cactus/cactus_tests/cactus_test_ffa.c +++ b/spm/cactus/cactus_tests/cactus_test_ffa.c @@ -20,6 +20,8 @@ #define FFA_MAJOR 1U #define FFA_MINOR 0U +static uint32_t spm_version; + static const uint32_t primary_uuid[4] = PRIMARY_UUID; static const uint32_t secondary_uuid[4] = SECONDARY_UUID; static const uint32_t tertiary_uuid[4] = TERTIARY_UUID; @@ -32,23 +34,31 @@ static void ffa_features_test(void) { const char *test_features = "FFA Features interface"; smc_ret_values ffa_ret; + unsigned int expected_ret; const struct ffa_features_test *ffa_feature_test_target; unsigned int i, test_target_size = get_ffa_feature_test_target(&ffa_feature_test_target); + struct ffa_features_test test_target; announce_test_section_start(test_features); for (i = 0U; i < test_target_size; i++) { - announce_test_start(ffa_feature_test_target[i].test_name); + test_target = ffa_feature_test_target[i]; + + announce_test_start(test_target.test_name); + + ffa_ret = ffa_features(test_target.feature); + expected_ret = FFA_VERSION_COMPILED + >= test_target.version_added ? + test_target.expected_ret : FFA_ERROR; - ffa_ret = ffa_features(ffa_feature_test_target[i].feature); - expect(ffa_func_id(ffa_ret), ffa_feature_test_target[i].expected_ret); - if (ffa_feature_test_target[i].expected_ret == FFA_ERROR) { + expect(ffa_func_id(ffa_ret), expected_ret); + if (expected_ret == FFA_ERROR) { expect(ffa_error_code(ffa_ret), FFA_ERROR_NOT_SUPPORTED); } - announce_test_end(ffa_feature_test_target[i].test_name); + announce_test_end(test_target.test_name); } announce_test_section_end(test_features); @@ -147,7 +157,7 @@ void ffa_version_test(void) announce_test_start(test_ffa_version); smc_ret_values ret = ffa_version(MAKE_FFA_VERSION(FFA_MAJOR, FFA_MINOR)); - uint32_t spm_version = (uint32_t)ret.ret0; + spm_version = (uint32_t)ret.ret0; bool ffa_version_compatible = ((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR && @@ -163,6 +173,32 @@ void ffa_version_test(void) announce_test_end(test_ffa_version); } +void ffa_spm_id_get_test(void) +{ + const char *test_spm_id_get = "FFA_SPM_ID_GET SMC Function"; + + announce_test_start(test_spm_id_get); + + if (spm_version >= MAKE_FFA_VERSION(1, 1)) { + smc_ret_values ret = ffa_spm_id_get(); + + expect(ffa_func_id(ret), FFA_SUCCESS_SMC32); + + ffa_id_t spm_id = ffa_endpoint_id(ret); + + VERBOSE("SPM ID = 0x%x\n", spm_id); + /* + * Check the SPMC value given in the fvp_spmc_manifest + * is returned. + */ + expect(spm_id, SPMC_ID); + } else { + NOTICE("FFA_SPM_ID_GET not supported in this version of FF-A." + " Test skipped.\n"); + } + announce_test_end(test_spm_id_get); +} + void ffa_tests(struct mailbox_buffers *mb) { const char *test_ffa = "FFA Interfaces"; @@ -171,6 +207,7 @@ void ffa_tests(struct mailbox_buffers *mb) ffa_features_test(); ffa_version_test(); + ffa_spm_id_get_test(); ffa_partition_info_get_test(mb); announce_test_section_end(test_ffa); diff --git a/spm/cactus/cactus_tests/cactus_test_memory_sharing.c b/spm/cactus/cactus_tests/cactus_test_memory_sharing.c index e7bce50f4..604058aed 100644 --- a/spm/cactus/cactus_tests/cactus_test_memory_sharing.c +++ b/spm/cactus/cactus_tests/cactus_test_memory_sharing.c @@ -24,8 +24,8 @@ CACTUS_CMD_HANDLER(mem_send_cmd, CACTUS_MEM_SEND_CMD) int ret; unsigned int mem_attrs; uint32_t *ptr; - ffa_vm_id_t source = ffa_dir_msg_source(*args); - ffa_vm_id_t vm_id = ffa_dir_msg_dest(*args); + ffa_id_t source = ffa_dir_msg_source(*args); + ffa_id_t vm_id = ffa_dir_msg_dest(*args); uint32_t mem_func = cactus_req_mem_send_get_mem_func(*args); uint64_t handle = cactus_mem_send_get_handle(*args); @@ -107,10 +107,10 @@ CACTUS_CMD_HANDLER(req_mem_send_cmd, CACTUS_REQ_MEM_SEND_CMD) { smc_ret_values ffa_ret; uint32_t mem_func = cactus_req_mem_send_get_mem_func(*args); - ffa_vm_id_t receiver = cactus_req_mem_send_get_receiver(*args); + ffa_id_t receiver = cactus_req_mem_send_get_receiver(*args); ffa_memory_handle_t handle; - ffa_vm_id_t vm_id = ffa_dir_msg_dest(*args); - ffa_vm_id_t source = ffa_dir_msg_source(*args); + ffa_id_t vm_id = ffa_dir_msg_dest(*args); + ffa_id_t source = ffa_dir_msg_source(*args); VERBOSE("%x requested to send memory to %x (func: %x)\n", source, receiver, mem_func); diff --git a/spm/cactus/cactus_tests/cactus_tests_smmuv3.c b/spm/cactus/cactus_tests/cactus_tests_smmuv3.c index ce53dc64a..fbf46c806 100644 --- a/spm/cactus/cactus_tests/cactus_tests_smmuv3.c +++ b/spm/cactus/cactus_tests/cactus_tests_smmuv3.c @@ -151,8 +151,8 @@ static bool run_smmuv3_test(void) CACTUS_CMD_HANDLER(smmuv3_cmd, CACTUS_DMA_SMMUv3_CMD) { smc_ret_values ffa_ret; - ffa_vm_id_t vm_id = ffa_dir_msg_dest(*args); - ffa_vm_id_t source = ffa_dir_msg_source(*args); + ffa_id_t vm_id = ffa_dir_msg_dest(*args); + ffa_id_t source = ffa_dir_msg_source(*args); VERBOSE("Received request through direct message for DMA service\n"); diff --git a/tftf/tests/runtime_services/secure_service/ffa_helpers.c b/tftf/tests/runtime_services/secure_service/ffa_helpers.c index 8e7b58c6f..4c69eb172 100644 --- a/tftf/tests/runtime_services/secure_service/ffa_helpers.c +++ b/tftf/tests/runtime_services/secure_service/ffa_helpers.c @@ -55,8 +55,8 @@ smc_ret_values ffa_run(uint32_t dest_id, uint32_t vcpu_id) * -BUSY: Message target is busy * -ABORTED: Message target ran into an unexpected error and has aborted */ -smc_ret_values ffa_msg_send_direct_req64(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint64_t arg0, +smc_ret_values ffa_msg_send_direct_req64(ffa_id_t source_id, + ffa_id_t dest_id, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) { @@ -74,8 +74,8 @@ smc_ret_values ffa_msg_send_direct_req64(ffa_vm_id_t source_id, return tftf_smc(&args); } -smc_ret_values ffa_msg_send_direct_req32(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint32_t arg0, +smc_ret_values ffa_msg_send_direct_req32(ffa_id_t source_id, + ffa_id_t dest_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4) { @@ -93,8 +93,8 @@ smc_ret_values ffa_msg_send_direct_req32(ffa_vm_id_t source_id, return tftf_smc(&args); } -smc_ret_values ffa_msg_send_direct_resp64(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint64_t arg0, +smc_ret_values ffa_msg_send_direct_resp64(ffa_id_t source_id, + ffa_id_t dest_id, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) { @@ -112,8 +112,8 @@ smc_ret_values ffa_msg_send_direct_resp64(ffa_vm_id_t source_id, return tftf_smc(&args); } -smc_ret_values ffa_msg_send_direct_resp32(ffa_vm_id_t source_id, - ffa_vm_id_t dest_id, uint32_t arg0, +smc_ret_values ffa_msg_send_direct_resp32(ffa_id_t source_id, + ffa_id_t dest_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4) { @@ -137,9 +137,9 @@ smc_ret_values ffa_msg_send_direct_resp32(ffa_vm_id_t source_id, * composite memory region offset. */ static void ffa_memory_region_init_header( - struct ffa_memory_region *memory_region, ffa_vm_id_t sender, + struct ffa_memory_region *memory_region, ffa_id_t sender, ffa_memory_attributes_t attributes, ffa_memory_region_flags_t flags, - ffa_memory_handle_t handle, uint32_t tag, ffa_vm_id_t receiver, + ffa_memory_handle_t handle, uint32_t tag, ffa_id_t receiver, ffa_memory_access_permissions_t permissions) { memory_region->sender = sender; @@ -168,7 +168,7 @@ static void ffa_memory_region_init_header( */ uint32_t ffa_memory_region_init( struct ffa_memory_region *memory_region, size_t memory_region_max_size, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, const struct ffa_memory_region_constituent constituents[], uint32_t constituent_count, uint32_t tag, ffa_memory_region_flags_t flags, enum ffa_data_access data_access, @@ -259,7 +259,7 @@ uint32_t ffa_memory_region_init( */ uint32_t ffa_memory_retrieve_request_init( struct ffa_memory_region *memory_region, ffa_memory_handle_t handle, - ffa_vm_id_t sender, ffa_vm_id_t receiver, uint32_t tag, + ffa_id_t sender, ffa_id_t receiver, uint32_t tag, ffa_memory_region_flags_t flags, enum ffa_data_access data_access, enum ffa_instruction_access instruction_access, enum ffa_memory_type type, enum ffa_memory_cacheability cacheability, @@ -291,7 +291,6 @@ uint32_t ffa_memory_retrieve_request_init( memory_region->receiver_count * sizeof(struct ffa_memory_access); } - /* * FFA Version ABI helper. * Version fields: @@ -317,6 +316,15 @@ smc_ret_values ffa_id_get(void) return tftf_smc(&args); } +smc_ret_values ffa_spm_id_get(void) +{ + smc_args args = { + .fid = FFA_SPM_ID_GET + }; + + return tftf_smc(&args); +} + smc_ret_values ffa_msg_wait(void) { smc_args args = { diff --git a/tftf/tests/runtime_services/secure_service/spm_common.c b/tftf/tests/runtime_services/secure_service/spm_common.c index 179ef1cb9..e2d3392c1 100644 --- a/tftf/tests/runtime_services/secure_service/spm_common.c +++ b/tftf/tests/runtime_services/secure_service/spm_common.c @@ -6,6 +6,7 @@ #include <debug.h> #include <ffa_endpoints.h> +#include <ffa_svc.h> #include <spm_common.h> #include <xlat_tables_v2.h> @@ -166,6 +167,8 @@ static const struct ffa_features_test ffa_feature_test_target[] = { {"FFA_RXTX_UNMAP_32 check", FFA_RXTX_UNMAP, FFA_ERROR}, {"FFA_PARTITION_INFO_GET_32 check", FFA_PARTITION_INFO_GET, FFA_SUCCESS_SMC32}, {"FFA_ID_GET_32 check", FFA_ID_GET, FFA_SUCCESS_SMC32}, + {"FFA_SPM_ID_GET_32 check", FFA_SPM_ID_GET, FFA_SUCCESS_SMC32, + MAKE_FFA_VERSION(1, 1)}, {"FFA_MSG_POLL_32 check", FFA_MSG_POLL, FFA_SUCCESS_SMC32}, {"FFA_MSG_WAIT_32 check", FFA_MSG_WAIT, FFA_SUCCESS_SMC32}, {"FFA_YIELD_32 check", FFA_MSG_YIELD, FFA_SUCCESS_SMC32}, @@ -199,7 +202,7 @@ unsigned int get_ffa_feature_test_target( bool memory_retrieve(struct mailbox_buffers *mb, struct ffa_memory_region **retrieved, uint64_t handle, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, uint32_t mem_func) { smc_ret_values ret; @@ -269,7 +272,7 @@ bool memory_retrieve(struct mailbox_buffers *mb, } bool memory_relinquish(struct ffa_mem_relinquish *m, uint64_t handle, - ffa_vm_id_t id) + ffa_id_t id) { smc_ret_values ret; @@ -297,7 +300,7 @@ ffa_memory_handle_t memory_send( uint32_t fragment_length, uint32_t total_length) { smc_ret_values ret; - ffa_vm_id_t receiver = + ffa_id_t receiver = memory_region->receivers[0].receiver_permissions.receiver; if (fragment_length != total_length) { @@ -336,7 +339,7 @@ ffa_memory_handle_t memory_send( */ ffa_memory_handle_t memory_init_and_send( struct ffa_memory_region *memory_region, size_t memory_region_max_size, - ffa_vm_id_t sender, ffa_vm_id_t receiver, + ffa_id_t sender, ffa_id_t receiver, const struct ffa_memory_region_constituent *constituents, uint32_t constituents_count, uint32_t mem_func) { diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_direct_messaging.c b/tftf/tests/runtime_services/secure_service/test_ffa_direct_messaging.c index 0a722e497..1b9abe95b 100644 --- a/tftf/tests/runtime_services/secure_service/test_ffa_direct_messaging.c +++ b/tftf/tests/runtime_services/secure_service/test_ffa_direct_messaging.c @@ -27,8 +27,8 @@ static const struct ffa_uuid expected_sp_uuids[] = { static event_t cpu_booted[PLATFORM_CORE_COUNT]; -static test_result_t send_cactus_echo_cmd(ffa_vm_id_t sender, - ffa_vm_id_t dest, +static test_result_t send_cactus_echo_cmd(ffa_id_t sender, + ffa_id_t dest, uint64_t value) { smc_ret_values ret; @@ -92,9 +92,9 @@ test_result_t test_ffa_direct_messaging(void) * otherwise. * For the CACTUS_SUCCESS response, the test returns TEST_RESULT_SUCCESS. */ -static test_result_t send_cactus_req_echo_cmd(ffa_vm_id_t sender, - ffa_vm_id_t dest, - ffa_vm_id_t echo_dest, +static test_result_t send_cactus_req_echo_cmd(ffa_id_t sender, + ffa_id_t dest, + ffa_id_t echo_dest, uint64_t value) { smc_ret_values ret; diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_features.c b/tftf/tests/runtime_services/secure_service/test_ffa_features.c deleted file mode 100644 index e4cd845fd..000000000 --- a/tftf/tests/runtime_services/secure_service/test_ffa_features.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020-2021, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <spm_common.h> -#include <test_helpers.h> -#include <tftf_lib.h> - -test_result_t test_ffa_features(void) -{ - SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 0); - - /* Check if SPMC is OP-TEE at S-EL1 */ - if (check_spmc_execution_level()) { - /* FFA_FEATURES is not yet supported in OP-TEE */ - return TEST_RESULT_SUCCESS; - } - - smc_ret_values ffa_ret; - const struct ffa_features_test *ffa_feature_test_target; - unsigned int i, test_target_size = - get_ffa_feature_test_target(&ffa_feature_test_target); - - for (i = 0U; i < test_target_size; i++) { - ffa_ret = ffa_features(ffa_feature_test_target[i].feature); - if (ffa_func_id(ffa_ret) != ffa_feature_test_target[i].expected_ret) { - tftf_testcase_printf("%s returned %x, expected %x\n", - ffa_feature_test_target[i].test_name, - ffa_func_id(ffa_ret), - ffa_feature_test_target[i].expected_ret); - return TEST_RESULT_FAIL; - } - if ((ffa_feature_test_target[i].expected_ret == FFA_ERROR) && - (ffa_error_code(ffa_ret) != FFA_ERROR_NOT_SUPPORTED)) { - tftf_testcase_printf("%s failed for the wrong reason: " - "returned %x, expected %x\n", - ffa_feature_test_target[i].test_name, - ffa_error_code(ffa_ret), - FFA_ERROR_NOT_SUPPORTED); - return TEST_RESULT_FAIL; - } - } - - return TEST_RESULT_SUCCESS; -} diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c b/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c index f126c57d6..46a7349bf 100644 --- a/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c +++ b/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c @@ -130,8 +130,8 @@ test_result_t test_mem_donate_sp(void) * Cactus SP should reply to TFTF on whether the test succeeded or not. */ static test_result_t test_req_mem_send_sp_to_sp(uint32_t mem_func, - ffa_vm_id_t sender_sp, - ffa_vm_id_t receiver_sp) + ffa_id_t sender_sp, + ffa_id_t receiver_sp) { smc_ret_values ret; diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_rxtx_map.c b/tftf/tests/runtime_services/secure_service/test_ffa_rxtx_map.c deleted file mode 100644 index 1b47c5f99..000000000 --- a/tftf/tests/runtime_services/secure_service/test_ffa_rxtx_map.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2020-2021, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <debug.h> - -#include <test_helpers.h> -#include <xlat_tables_defs.h> - -static struct mailbox_buffers mb; - -static test_result_t test_ffa_rxtx_map(uint32_t expected_return) -{ - smc_ret_values ret; - - /********************************************************************** - * Verify that FFA is there and that it has the correct version. - **********************************************************************/ - SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 0); - - /********************************************************************** - * If OP-TEE is SPMC skip this test. - **********************************************************************/ - if (check_spmc_execution_level()) { - VERBOSE("OP-TEE as SPMC at S-EL1. Skipping test!\n"); - return TEST_RESULT_SKIPPED; - } - - /* - * Declare RXTX buffers, assign them to the mailbox and call - * FFA_RXTX_MAP. - */ - CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret); - if (ffa_func_id(ret) != expected_return) { - ERROR("Failed to map RXTX buffers %x!\n", ffa_error_code(ret)); - return TEST_RESULT_FAIL; - } - - return TEST_RESULT_SUCCESS; -} - -/** - * Test mapping RXTX buffers from NWd. - * This test also sets the Mailbox for other SPM related tests that need to use - * RXTX buffers. - */ -test_result_t test_ffa_rxtx_map_success(void) -{ - test_result_t ret = test_ffa_rxtx_map(FFA_SUCCESS_SMC32); - - if (ret == TEST_RESULT_SUCCESS) { - INFO("Set RXTX Mailbox for remaining spm tests!\n"); - set_tftf_mailbox(&mb); - } - return ret; -} - -/** - * Test to verify that 2nd call to FFA_RXTX_MAP should fail. - */ -test_result_t test_ffa_rxtx_map_fail(void) -{ - INFO("This test expects error log.\n"); - return test_ffa_rxtx_map(FFA_ERROR); -} diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c new file mode 100644 index 000000000..f8a5ace57 --- /dev/null +++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2020-2021, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <debug.h> + +#include <ffa_svc.h> +#include <ffa_helpers.h> +#include <spm_common.h> +#include <test_helpers.h> +#include <tftf_lib.h> +#include <xlat_tables_defs.h> + +static bool should_skip_version_test; + +static struct mailbox_buffers mb; + +/* + * Using FFA version expected for SPM. + */ +#define SPM_VERSION MAKE_FFA_VERSION(FFA_VERSION_MAJOR, FFA_VERSION_MINOR) + +/****************************************************************************** + * FF-A Features ABI Tests + ******************************************************************************/ + +test_result_t test_ffa_features(void) +{ + SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 0); + + /* Check if SPMC is OP-TEE at S-EL1 */ + if (check_spmc_execution_level()) { + /* FFA_FEATURES is not yet supported in OP-TEE */ + return TEST_RESULT_SUCCESS; + } + + smc_ret_values ffa_ret; + unsigned int expected_ret; + const struct ffa_features_test *ffa_feature_test_target; + unsigned int i, test_target_size = + get_ffa_feature_test_target(&ffa_feature_test_target); + struct ffa_features_test test_target; + + for (i = 0U; i < test_target_size; i++) { + test_target = ffa_feature_test_target[i]; + ffa_ret = ffa_features(test_target.feature); + expected_ret = FFA_VERSION_COMPILED + >= test_target.version_added ? + test_target.expected_ret : FFA_ERROR; + if (ffa_func_id(ffa_ret) != expected_ret) { + tftf_testcase_printf("%s returned %x, expected %x\n", + test_target.test_name, + ffa_func_id(ffa_ret), + expected_ret); + return TEST_RESULT_FAIL; + } + if ((expected_ret == FFA_ERROR) && + (ffa_error_code(ffa_ret) != FFA_ERROR_NOT_SUPPORTED)) { + tftf_testcase_printf("%s failed for the wrong reason: " + "returned %x, expected %x\n", + test_target.test_name, + ffa_error_code(ffa_ret), + FFA_ERROR_NOT_SUPPORTED); + return TEST_RESULT_FAIL; + } + } + + return TEST_RESULT_SUCCESS; +} + +/****************************************************************************** + * FF-A Version ABI Tests + ******************************************************************************/ + +/* + * Calls FFA Version ABI, and checks if the result as expected. + */ +static test_result_t test_ffa_version(uint32_t input_version, + uint32_t expected_return) +{ + if (should_skip_version_test) { + return TEST_RESULT_SKIPPED; + } + + smc_ret_values ret_values = ffa_version(input_version); + + uint32_t spm_version = (uint32_t)(0xFFFFFFFF & ret_values.ret0); + + if (spm_version == expected_return) { + return TEST_RESULT_SUCCESS; + } + + tftf_testcase_printf("Input Version: 0x%x\n" + "Return: 0x%x\nExpected: 0x%x\n", + input_version, spm_version, expected_return); + + return TEST_RESULT_FAIL; +} + +/* + * @Test_Aim@ Validate what happens when using same version as SPM. + */ +test_result_t test_ffa_version_equal(void) +{ + /* + * FFA_VERSION interface is used to check that SPM functionality is + * supported. On FFA_VERSION invocation from TFTF, the SPMD returns + * either NOT_SUPPORTED or the SPMC version value provided in the SPMC + * manifest. The variable "should_skip_test" is set to true when the + * SPMD returns NOT_SUPPORTED or a mismatched version, which means that + * a TFTF physical FF-A endpoint version (SPM_VERSION) does not match + * the SPMC's physical FF-A endpoint version. This prevents running the + * subsequent FF-A version tests (and break the test flow), as they're + * not relevant when the SPMD is not present within BL31 + * (FFA_VERSION returns NOT_SUPPORTED). + */ + test_result_t ret = test_ffa_version(SPM_VERSION, SPM_VERSION); + + if (ret != TEST_RESULT_SUCCESS) { + should_skip_version_test = true; + ret = TEST_RESULT_SKIPPED; + } + return ret; +} + +/* + * @Test_Aim@ Validate what happens when setting bit 31 in + * 'input_version'. As per spec, FFA version is 31 bits long. + * Bit 31 set is an invalid input. + */ +test_result_t test_ffa_version_bit31(void) +{ + return test_ffa_version(FFA_VERSION_BIT31_MASK | SPM_VERSION, + FFA_ERROR_NOT_SUPPORTED); +} + +/* + * @Test_Aim@ Validate what happens for bigger version than SPM's. + */ +test_result_t test_ffa_version_bigger(void) +{ + return test_ffa_version(MAKE_FFA_VERSION(FFA_VERSION_MAJOR + 1, 0), + SPM_VERSION); +} + +/* + * @Test_Aim@ Validate what happens for smaller version than SPM's. + */ +test_result_t test_ffa_version_smaller(void) +{ + return test_ffa_version(MAKE_FFA_VERSION(0, 9), SPM_VERSION); +} + +/****************************************************************************** + * FF-A RXTX ABI Tests + ******************************************************************************/ + +static test_result_t test_ffa_rxtx_map(uint32_t expected_return) +{ + smc_ret_values ret; + + /********************************************************************** + * Verify that FFA is there and that it has the correct version. + **********************************************************************/ + SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 0); + + /********************************************************************** + * If OP-TEE is SPMC skip this test. + **********************************************************************/ + if (check_spmc_execution_level()) { + VERBOSE("OP-TEE as SPMC at S-EL1. Skipping test!\n"); + return TEST_RESULT_SKIPPED; + } + + /* + * Declare RXTX buffers, assign them to the mailbox and call + * FFA_RXTX_MAP. + */ + CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret); + if (ffa_func_id(ret) != expected_return) { + ERROR("Failed to map RXTX buffers %x!\n", ffa_error_code(ret)); + return TEST_RESULT_FAIL; + } + + return TEST_RESULT_SUCCESS; +} + +/** + * Test mapping RXTX buffers from NWd. + * This test also sets the Mailbox for other SPM related tests that need to use + * RXTX buffers. + */ +test_result_t test_ffa_rxtx_map_success(void) +{ + test_result_t ret = test_ffa_rxtx_map(FFA_SUCCESS_SMC32); + + if (ret == TEST_RESULT_SUCCESS) { + INFO("Set RXTX Mailbox for remaining spm tests!\n"); + set_tftf_mailbox(&mb); + } + return ret; +} + +/** + * Test to verify that 2nd call to FFA_RXTX_MAP should fail. + */ +test_result_t test_ffa_rxtx_map_fail(void) +{ + INFO("This test expects error log.\n"); + return test_ffa_rxtx_map(FFA_ERROR); +} + +/****************************************************************************** + * FF-A SPM_ID_GET ABI Tests + ******************************************************************************/ + +test_result_t test_ffa_spm_id_get(void) +{ + SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 1); + + smc_ret_values ffa_ret = ffa_spm_id_get(); + + if (is_ffa_call_error(ffa_ret)) { + ERROR("FFA_SPM_ID_GET call failed! Error code: 0x%x\n", + ffa_error_code(ffa_ret)); + return TEST_RESULT_FAIL; + } + + /* Check the SPMC value given in the fvp_spmc_manifest is returned */ + ffa_id_t spm_id = ffa_endpoint_id(ffa_ret); + + if (spm_id != SPMC_ID) { + ERROR("Expected SPMC_ID of 0x%x\n received: 0x%x\n", + SPMC_ID, spm_id); + return TEST_RESULT_FAIL; + } + + return TEST_RESULT_SUCCESS; +} diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_version.c b/tftf/tests/runtime_services/secure_service/test_ffa_version.c deleted file mode 100644 index 41eca5adc..000000000 --- a/tftf/tests/runtime_services/secure_service/test_ffa_version.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2020-2021, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <ffa_svc.h> -#include <test_helpers.h> -#include <tftf_lib.h> - -/* - * Using FFA version expected for SPM. - */ -#define SPM_VERSION MAKE_FFA_VERSION(FFA_VERSION_MAJOR, FFA_VERSION_MINOR) - -static bool should_skip_test; - -/* - * Calls FFA Version ABI, and checks if the result as expected. - */ -static test_result_t test_ffa_version(uint32_t input_version, uint32_t expected_return) -{ - if (should_skip_test) { - return TEST_RESULT_SKIPPED; - } - - smc_ret_values ret_values = ffa_version(input_version); - - uint32_t spm_version = (uint32_t)(0xFFFFFFFF & ret_values.ret0); - - if (spm_version == expected_return) { - return TEST_RESULT_SUCCESS; - } - - tftf_testcase_printf("Input Version: 0x%x\nReturn: 0x%x\nExpected: 0x%x\n", - input_version, spm_version, expected_return); - - return TEST_RESULT_FAIL; -} - -/* - * @Test_Aim@ Validate what happens when using same version as SPM. - */ -test_result_t test_ffa_version_equal(void) -{ - /* - * FFA_VERSION interface is used to check that SPM functionality is supported. - * On FFA_VERSION invocation from TFTF, the SPMD returns either NOT_SUPPORTED or - * the SPMC version value provided in the SPMC manifest. The variable "should_skip_test" - * is set to true when the SPMD returns NOT_SUPPORTED or a mismatched version, which - * means that a TFTF physical FF-A endpoint version (SPM_VERSION) does not match the - * SPMC's physical FF-A endpoint version. This prevents running the subsequent FF-A - * version tests (and break the test flow), as they're not relevant when the SPMD is - * not present within BL31 (FFA_VERSION returns NOT_SUPPORTED). - */ - test_result_t ret = test_ffa_version(SPM_VERSION, SPM_VERSION); - if (ret != TEST_RESULT_SUCCESS) { - should_skip_test = true; - ret = TEST_RESULT_SKIPPED; - } - return ret; -} - -/* - * @Test_Aim@ Validate what happens when setting bit 31 in - * 'input_version'. As per spec, FFA version is 31 bits long. - * Bit 31 set is an invalid input. - */ -test_result_t test_ffa_version_bit31(void) -{ - return test_ffa_version(FFA_VERSION_BIT31_MASK | SPM_VERSION, FFA_ERROR_NOT_SUPPORTED); -} - -/* - * @Test_Aim@ Validate what happens for bigger version than SPM's. - */ -test_result_t test_ffa_version_bigger(void) -{ - return test_ffa_version(MAKE_FFA_VERSION(FFA_VERSION_MAJOR + 1, 0), SPM_VERSION); -} - -/* - * @Test_Aim@ Validate what happens for smaller version than SPM's. - */ -test_result_t test_ffa_version_smaller(void) -{ - return test_ffa_version(MAKE_FFA_VERSION(0, 9), SPM_VERSION); -} diff --git a/tftf/tests/tests-spm.mk b/tftf/tests/tests-spm.mk index e62e03d94..dc99337b1 100644 --- a/tftf/tests/tests-spm.mk +++ b/tftf/tests/tests-spm.mk @@ -9,11 +9,9 @@ TESTS_SOURCES += \ ffa_helpers.c \ spm_common.c \ test_ffa_direct_messaging.c \ - test_ffa_features.c \ test_ffa_interrupts.c \ test_ffa_memory_sharing.c \ - test_ffa_rxtx_map.c \ - test_ffa_version.c \ + test_ffa_setup_and_discovery.c \ test_spm_cpu_features.c \ test_spm_smmu.c \ ) diff --git a/tftf/tests/tests-spm.xml b/tftf/tests/tests-spm.xml index 32efc161b..cafbc4629 100644 --- a/tftf/tests/tests-spm.xml +++ b/tftf/tests/tests-spm.xml @@ -7,27 +7,27 @@ --> <testsuites> + <testsuite name="FF-A Setup and Discovery" + description="Test FF-A Setup and Discovery interfaces" > + <testcase name="Test FFA_FEATURES" + function="test_ffa_features" /> - <testsuite name="FF-A Version" - description="Test FF-A Version ABI" > - - <testcase name="Same FFA version as SPM" - function="test_ffa_version_equal" /> - <testcase name="Setting bit 31 in input version" - function="test_ffa_version_bit31"/> - <testcase name="Bigger FFA version than SPM" - function="test_ffa_version_bigger" /> - <testcase name="Smaller FFA version than SPM" - function="test_ffa_version_smaller" /> - - </testsuite> + <testcase name="Same FFA version as SPM" + function="test_ffa_version_equal" /> + <testcase name="Setting bit 31 in input version" + function="test_ffa_version_bit31"/> + <testcase name="Bigger FFA version than SPM" + function="test_ffa_version_bigger" /> + <testcase name="Smaller FFA version than SPM" + function="test_ffa_version_smaller" /> - <testsuite name="FF-A RXTX Mapping" - description="Test to FF-A RXTX mapping ABI" > <testcase name="FF-A RXTX Map API success" function="test_ffa_rxtx_map_success" /> <testcase name="FF-A RXTX Map API consecutive" function="test_ffa_rxtx_map_fail" /> + + <testcase name="Test FFA_SPM_ID_GET" + function="test_ffa_spm_id_get" /> </testsuite> <testsuite name="FF-A Direct messaging" @@ -66,12 +66,6 @@ function="test_req_mem_donate_sp_to_sp" /> </testsuite> - <testsuite name="FF-A features" - description="Test FFA_FEATURES ABI" > - <testcase name="Test FFA_FEATURES" - function="test_ffa_features" /> - </testsuite> - <testsuite name="SIMD,SVE Registers context" description="Validate context switch between NWd and SWd" > <testcase name="Check that SIMD registers context is preserved" @@ -89,4 +83,5 @@ <testcase name="Check DMA command by SMMUv3TestEngine completes" function="test_smmu_spm" /> </testsuite> + </testsuites> |