blob: 2e47ebc9fdeee1394e6f34da4af4636585fdf105 [file] [log] [blame]
J-Alves9f6f0142020-06-17 15:37:59 +01001/*
Max Shvetsov103e0562021-02-04 16:58:31 +00002 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
J-Alves9f6f0142020-06-17 15:37:59 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <assert.h>
J-Alves9f6f0142020-06-17 15:37:59 +01007#include <debug.h>
Max Shvetsov40eb6a22020-06-08 11:15:30 +01008#include <errno.h>
Max Shvetsov103e0562021-02-04 16:58:31 +00009
Max Shvetsovc32f4782020-06-23 09:41:15 +010010#include <cactus_def.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000011#include <cactus_platform_def.h>
J-Alves8f4a56f2020-10-28 10:29:05 +000012#include <ffa_endpoints.h>
J-Alves9f6f0142020-06-17 15:37:59 +010013#include <sp_helpers.h>
Olivier Deprez6967c242021-04-09 09:24:08 +020014#include <spm_helpers.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000015#include <spm_common.h>
J-Alves9f6f0142020-06-17 15:37:59 +010016
J-Alves63cdaa72020-10-08 17:22:45 +010017#include <lib/libc/string.h>
J-Alves63cdaa72020-10-08 17:22:45 +010018
J-Alves9f6f0142020-06-17 15:37:59 +010019/* FFA version test helpers */
20#define FFA_MAJOR 1U
21#define FFA_MINOR 0U
22
Daniel Boulby198deda2021-03-03 11:35:25 +000023static uint32_t spm_version;
24
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000025static const struct ffa_uuid sp_uuids[] = {
26 {PRIMARY_UUID}, {SECONDARY_UUID}, {TERTIARY_UUID}
27 };
28static const struct ffa_uuid null_uuid = { .uuid = {0} };
29
30static const struct ffa_partition_info ffa_expected_partition_info[] = {
31 /* Primary partition info */
32 {
33 .id = SP_ID(1),
34 .exec_context = PRIMARY_EXEC_CTX_COUNT,
J-Alves4d05dec2021-11-02 11:52:27 +000035 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
36 FFA_PARTITION_DIRECT_REQ_SEND |
37 FFA_PARTITION_NOTIFICATION)
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000038 },
39 /* Secondary partition info */
40 {
41 .id = SP_ID(2),
42 .exec_context = SECONDARY_EXEC_CTX_COUNT,
J-Alves4d05dec2021-11-02 11:52:27 +000043 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
44 FFA_PARTITION_DIRECT_REQ_SEND |
45 FFA_PARTITION_NOTIFICATION)
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000046 },
47 /* Tertiary partition info */
48 {
49 .id = SP_ID(3),
50 .exec_context = TERTIARY_EXEC_CTX_COUNT,
J-Alvesb69c8b42021-11-04 17:03:41 +000051 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
52 FFA_PARTITION_DIRECT_REQ_SEND |
53 FFA_PARTITION_NOTIFICATION)
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000054 },
55 /* Ivy partition info */
56 {
57 .id = SP_ID(4),
58 .exec_context = IVY_EXEC_CTX_COUNT,
59 .properties = (FFA_PARTITION_DIRECT_REQ_RECV | FFA_PARTITION_DIRECT_REQ_SEND)
60 }
61};
Max Shvetsovc32f4782020-06-23 09:41:15 +010062
Max Shvetsov40eb6a22020-06-08 11:15:30 +010063/*
64 * Test FFA_FEATURES interface.
65 */
66static void ffa_features_test(void)
67{
68 const char *test_features = "FFA Features interface";
69 smc_ret_values ffa_ret;
Daniel Boulby198deda2021-03-03 11:35:25 +000070 unsigned int expected_ret;
Max Shvetsov103e0562021-02-04 16:58:31 +000071 const struct ffa_features_test *ffa_feature_test_target;
Max Shvetsov40eb6a22020-06-08 11:15:30 +010072 unsigned int i, test_target_size =
Max Shvetsov103e0562021-02-04 16:58:31 +000073 get_ffa_feature_test_target(&ffa_feature_test_target);
Daniel Boulby198deda2021-03-03 11:35:25 +000074 struct ffa_features_test test_target;
Max Shvetsov103e0562021-02-04 16:58:31 +000075
Max Shvetsov40eb6a22020-06-08 11:15:30 +010076
77 announce_test_section_start(test_features);
78
79 for (i = 0U; i < test_target_size; i++) {
Daniel Boulby198deda2021-03-03 11:35:25 +000080 test_target = ffa_feature_test_target[i];
Max Shvetsov40eb6a22020-06-08 11:15:30 +010081
Daniel Boulby198deda2021-03-03 11:35:25 +000082 announce_test_start(test_target.test_name);
83
84 ffa_ret = ffa_features(test_target.feature);
85 expected_ret = FFA_VERSION_COMPILED
86 >= test_target.version_added ?
87 test_target.expected_ret : FFA_ERROR;
88
89 expect(ffa_func_id(ffa_ret), expected_ret);
90 if (expected_ret == FFA_ERROR) {
J-Alves6cb21d92021-01-07 15:18:12 +000091 expect(ffa_error_code(ffa_ret), FFA_ERROR_NOT_SUPPORTED);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010092 }
93
Daniel Boulby198deda2021-03-03 11:35:25 +000094 announce_test_end(test_target.test_name);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010095 }
96
97 announce_test_section_end(test_features);
98}
99
Max Shvetsovc32f4782020-06-23 09:41:15 +0100100static void ffa_partition_info_wrong_test(void)
101{
102 const char *test_wrong_uuid = "Request wrong UUID";
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000103 const struct ffa_uuid uuid = { .uuid = {1} };
Max Shvetsovc32f4782020-06-23 09:41:15 +0100104
105 announce_test_start(test_wrong_uuid);
106
107 smc_ret_values ret = ffa_partition_info_get(uuid);
J-Alves6cb21d92021-01-07 15:18:12 +0000108 expect(ffa_func_id(ret), FFA_ERROR);
109 expect(ffa_error_code(ret), FFA_ERROR_INVALID_PARAMETER);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100110
111 announce_test_end(test_wrong_uuid);
112}
113
114static void ffa_partition_info_get_test(struct mailbox_buffers *mb)
115{
116 const char *test_partition_info = "FFA Partition info interface";
Max Shvetsovc32f4782020-06-23 09:41:15 +0100117
118 announce_test_section_start(test_partition_info);
119
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000120 expect(ffa_partition_info_helper(mb, sp_uuids[2],
121 &ffa_expected_partition_info[2], 1), true);
Ruari Phippsd75596a2020-07-17 16:41:34 +0100122
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000123 expect(ffa_partition_info_helper(mb, sp_uuids[1],
124 &ffa_expected_partition_info[1], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100125
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000126 expect(ffa_partition_info_helper(mb, sp_uuids[0],
127 &ffa_expected_partition_info[0], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100128
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000129 expect(ffa_partition_info_helper(mb, null_uuid,
Varun Wadekar5c354822021-09-27 06:01:09 -0700130 ffa_expected_partition_info,
131 ARRAY_SIZE(ffa_expected_partition_info)), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100132
133 ffa_partition_info_wrong_test();
134
135 announce_test_section_end(test_partition_info);
136}
137
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100138void ffa_version_test(void)
J-Alves9f6f0142020-06-17 15:37:59 +0100139{
J-Alves9f6f0142020-06-17 15:37:59 +0100140 const char *test_ffa_version = "FFA Version interface";
141
J-Alves9f6f0142020-06-17 15:37:59 +0100142 announce_test_start(test_ffa_version);
143
144 smc_ret_values ret = ffa_version(MAKE_FFA_VERSION(FFA_MAJOR, FFA_MINOR));
Daniel Boulby198deda2021-03-03 11:35:25 +0000145 spm_version = (uint32_t)ret.ret0;
J-Alves9f6f0142020-06-17 15:37:59 +0100146
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100147 bool ffa_version_compatible =
148 ((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR &&
149 (spm_version & FFA_VERSION_MINOR_MASK) >= FFA_MINOR);
J-Alves9f6f0142020-06-17 15:37:59 +0100150
Olivier Deprez24bd1702021-10-05 14:35:17 +0200151 VERBOSE("FFA_VERSION returned %u.%u; Compatible: %i\n",
J-Alves9f6f0142020-06-17 15:37:59 +0100152 spm_version >> FFA_VERSION_MAJOR_SHIFT,
153 spm_version & FFA_VERSION_MINOR_MASK,
154 (int)ffa_version_compatible);
155
156 expect((int)ffa_version_compatible, (int)true);
157
158 announce_test_end(test_ffa_version);
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100159}
160
Daniel Boulby198deda2021-03-03 11:35:25 +0000161void ffa_spm_id_get_test(void)
162{
163 const char *test_spm_id_get = "FFA_SPM_ID_GET SMC Function";
164
165 announce_test_start(test_spm_id_get);
166
167 if (spm_version >= MAKE_FFA_VERSION(1, 1)) {
168 smc_ret_values ret = ffa_spm_id_get();
169
170 expect(ffa_func_id(ret), FFA_SUCCESS_SMC32);
171
172 ffa_id_t spm_id = ffa_endpoint_id(ret);
173
174 VERBOSE("SPM ID = 0x%x\n", spm_id);
175 /*
176 * Check the SPMC value given in the fvp_spmc_manifest
177 * is returned.
178 */
179 expect(spm_id, SPMC_ID);
180 } else {
181 NOTICE("FFA_SPM_ID_GET not supported in this version of FF-A."
182 " Test skipped.\n");
183 }
184 announce_test_end(test_spm_id_get);
185}
186
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100187void ffa_tests(struct mailbox_buffers *mb)
188{
189 const char *test_ffa = "FFA Interfaces";
190
191 announce_test_section_start(test_ffa);
J-Alves9f6f0142020-06-17 15:37:59 +0100192
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100193 ffa_features_test();
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100194 ffa_version_test();
Daniel Boulby198deda2021-03-03 11:35:25 +0000195 ffa_spm_id_get_test();
Max Shvetsovc32f4782020-06-23 09:41:15 +0100196 ffa_partition_info_get_test(mb);
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100197
J-Alves9f6f0142020-06-17 15:37:59 +0100198 announce_test_section_end(test_ffa);
199}