blob: 252eba069f96601ddc6581b75fe0de9cdf585a9f [file] [log] [blame]
J-Alves9f6f0142020-06-17 15:37:59 +01001/*
Daniel Boulby8aa994c2022-01-05 19:44:30 +00002 * Copyright (c) 2018-2022, 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
Daniel Boulbyf3da5912022-04-01 12:31:52 +010010#include <sp_def.h>
J-Alves8f4a56f2020-10-28 10:29:05 +000011#include <ffa_endpoints.h>
J-Alves9f6f0142020-06-17 15:37:59 +010012#include <sp_helpers.h>
Olivier Deprez6967c242021-04-09 09:24:08 +020013#include <spm_helpers.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000014#include <spm_common.h>
J-Alves9f6f0142020-06-17 15:37:59 +010015
J-Alves63cdaa72020-10-08 17:22:45 +010016#include <lib/libc/string.h>
J-Alves63cdaa72020-10-08 17:22:45 +010017
J-Alves9f6f0142020-06-17 15:37:59 +010018/* FFA version test helpers */
19#define FFA_MAJOR 1U
Daniel Boulby8aa994c2022-01-05 19:44:30 +000020#define FFA_MINOR 1U
J-Alves9f6f0142020-06-17 15:37:59 +010021
Daniel Boulby198deda2021-03-03 11:35:25 +000022static uint32_t spm_version;
23
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000024static const struct ffa_uuid sp_uuids[] = {
Daniel Boulby8aa994c2022-01-05 19:44:30 +000025 {PRIMARY_UUID}, {SECONDARY_UUID}, {TERTIARY_UUID}, {IVY_UUID}
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000026 };
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000027
28static const struct ffa_partition_info ffa_expected_partition_info[] = {
29 /* Primary partition info */
30 {
31 .id = SP_ID(1),
32 .exec_context = PRIMARY_EXEC_CTX_COUNT,
J-Alves4d05dec2021-11-02 11:52:27 +000033 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
34 FFA_PARTITION_DIRECT_REQ_SEND |
Daniel Boulby8aa994c2022-01-05 19:44:30 +000035 FFA_PARTITION_NOTIFICATION),
36 .uuid = sp_uuids[0]
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000037 },
38 /* Secondary partition info */
39 {
40 .id = SP_ID(2),
41 .exec_context = SECONDARY_EXEC_CTX_COUNT,
J-Alves4d05dec2021-11-02 11:52:27 +000042 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
43 FFA_PARTITION_DIRECT_REQ_SEND |
Daniel Boulby8aa994c2022-01-05 19:44:30 +000044 FFA_PARTITION_NOTIFICATION),
45 .uuid = sp_uuids[1]
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 |
Daniel Boulby8aa994c2022-01-05 19:44:30 +000053 FFA_PARTITION_NOTIFICATION),
54 .uuid = sp_uuids[2]
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000055 },
56 /* Ivy partition info */
57 {
58 .id = SP_ID(4),
59 .exec_context = IVY_EXEC_CTX_COUNT,
Daniel Boulby8aa994c2022-01-05 19:44:30 +000060 .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
61 FFA_PARTITION_DIRECT_REQ_SEND),
62 .uuid = sp_uuids[3]
Max Shvetsov0b7d25f2021-03-05 13:46:42 +000063 }
64};
Max Shvetsovc32f4782020-06-23 09:41:15 +010065
Max Shvetsov40eb6a22020-06-08 11:15:30 +010066/*
67 * Test FFA_FEATURES interface.
68 */
69static void ffa_features_test(void)
70{
71 const char *test_features = "FFA Features interface";
Daniel Boulbyce386b12022-03-29 18:36:36 +010072 struct ffa_value ffa_ret;
Daniel Boulby198deda2021-03-03 11:35:25 +000073 unsigned int expected_ret;
Max Shvetsov103e0562021-02-04 16:58:31 +000074 const struct ffa_features_test *ffa_feature_test_target;
Max Shvetsov40eb6a22020-06-08 11:15:30 +010075 unsigned int i, test_target_size =
Max Shvetsov103e0562021-02-04 16:58:31 +000076 get_ffa_feature_test_target(&ffa_feature_test_target);
Daniel Boulby198deda2021-03-03 11:35:25 +000077 struct ffa_features_test test_target;
Max Shvetsov103e0562021-02-04 16:58:31 +000078
Max Shvetsov40eb6a22020-06-08 11:15:30 +010079
80 announce_test_section_start(test_features);
81
82 for (i = 0U; i < test_target_size; i++) {
Daniel Boulby198deda2021-03-03 11:35:25 +000083 test_target = ffa_feature_test_target[i];
Max Shvetsov40eb6a22020-06-08 11:15:30 +010084
Daniel Boulby198deda2021-03-03 11:35:25 +000085 announce_test_start(test_target.test_name);
86
87 ffa_ret = ffa_features(test_target.feature);
88 expected_ret = FFA_VERSION_COMPILED
89 >= test_target.version_added ?
90 test_target.expected_ret : FFA_ERROR;
91
92 expect(ffa_func_id(ffa_ret), expected_ret);
93 if (expected_ret == FFA_ERROR) {
J-Alves6cb21d92021-01-07 15:18:12 +000094 expect(ffa_error_code(ffa_ret), FFA_ERROR_NOT_SUPPORTED);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010095 }
96
Daniel Boulby198deda2021-03-03 11:35:25 +000097 announce_test_end(test_target.test_name);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010098 }
99
100 announce_test_section_end(test_features);
101}
102
Max Shvetsovc32f4782020-06-23 09:41:15 +0100103static void ffa_partition_info_wrong_test(void)
104{
105 const char *test_wrong_uuid = "Request wrong UUID";
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000106 const struct ffa_uuid uuid = { .uuid = {1} };
Max Shvetsovc32f4782020-06-23 09:41:15 +0100107
108 announce_test_start(test_wrong_uuid);
109
Daniel Boulbyce386b12022-03-29 18:36:36 +0100110 struct ffa_value ret = ffa_partition_info_get(uuid);
J-Alves6cb21d92021-01-07 15:18:12 +0000111 expect(ffa_func_id(ret), FFA_ERROR);
112 expect(ffa_error_code(ret), FFA_ERROR_INVALID_PARAMETER);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100113
114 announce_test_end(test_wrong_uuid);
115}
116
117static void ffa_partition_info_get_test(struct mailbox_buffers *mb)
118{
119 const char *test_partition_info = "FFA Partition info interface";
Max Shvetsovc32f4782020-06-23 09:41:15 +0100120
121 announce_test_section_start(test_partition_info);
122
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000123 expect(ffa_partition_info_helper(mb, sp_uuids[2],
124 &ffa_expected_partition_info[2], 1), true);
Ruari Phippsd75596a2020-07-17 16:41:34 +0100125
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000126 expect(ffa_partition_info_helper(mb, sp_uuids[1],
127 &ffa_expected_partition_info[1], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100128
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000129 expect(ffa_partition_info_helper(mb, sp_uuids[0],
130 &ffa_expected_partition_info[0], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100131
Daniel Boulby4a2888a2022-05-31 16:07:36 +0100132 expect(ffa_partition_info_helper(mb, NULL_UUID,
Varun Wadekar5c354822021-09-27 06:01:09 -0700133 ffa_expected_partition_info,
134 ARRAY_SIZE(ffa_expected_partition_info)), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100135
136 ffa_partition_info_wrong_test();
137
138 announce_test_section_end(test_partition_info);
139}
140
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100141void ffa_version_test(void)
J-Alves9f6f0142020-06-17 15:37:59 +0100142{
J-Alves9f6f0142020-06-17 15:37:59 +0100143 const char *test_ffa_version = "FFA Version interface";
144
J-Alves9f6f0142020-06-17 15:37:59 +0100145 announce_test_start(test_ffa_version);
146
Daniel Boulbyce386b12022-03-29 18:36:36 +0100147 struct ffa_value ret = ffa_version(MAKE_FFA_VERSION(FFA_MAJOR,
148 FFA_MINOR));
149
150 spm_version = (uint32_t)ret.fid;
J-Alves9f6f0142020-06-17 15:37:59 +0100151
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100152 bool ffa_version_compatible =
153 ((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR &&
154 (spm_version & FFA_VERSION_MINOR_MASK) >= FFA_MINOR);
J-Alves9f6f0142020-06-17 15:37:59 +0100155
Olivier Deprez24bd1702021-10-05 14:35:17 +0200156 VERBOSE("FFA_VERSION returned %u.%u; Compatible: %i\n",
J-Alves9f6f0142020-06-17 15:37:59 +0100157 spm_version >> FFA_VERSION_MAJOR_SHIFT,
158 spm_version & FFA_VERSION_MINOR_MASK,
159 (int)ffa_version_compatible);
160
161 expect((int)ffa_version_compatible, (int)true);
162
163 announce_test_end(test_ffa_version);
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100164}
165
Daniel Boulby198deda2021-03-03 11:35:25 +0000166void ffa_spm_id_get_test(void)
167{
168 const char *test_spm_id_get = "FFA_SPM_ID_GET SMC Function";
169
170 announce_test_start(test_spm_id_get);
171
172 if (spm_version >= MAKE_FFA_VERSION(1, 1)) {
Daniel Boulbyce386b12022-03-29 18:36:36 +0100173 struct ffa_value ret = ffa_spm_id_get();
Daniel Boulby198deda2021-03-03 11:35:25 +0000174
175 expect(ffa_func_id(ret), FFA_SUCCESS_SMC32);
176
177 ffa_id_t spm_id = ffa_endpoint_id(ret);
178
179 VERBOSE("SPM ID = 0x%x\n", spm_id);
180 /*
181 * Check the SPMC value given in the fvp_spmc_manifest
182 * is returned.
183 */
184 expect(spm_id, SPMC_ID);
185 } else {
186 NOTICE("FFA_SPM_ID_GET not supported in this version of FF-A."
187 " Test skipped.\n");
188 }
189 announce_test_end(test_spm_id_get);
190}
191
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100192void ffa_tests(struct mailbox_buffers *mb)
193{
194 const char *test_ffa = "FFA Interfaces";
195
196 announce_test_section_start(test_ffa);
J-Alves9f6f0142020-06-17 15:37:59 +0100197
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100198 ffa_features_test();
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100199 ffa_version_test();
Daniel Boulby198deda2021-03-03 11:35:25 +0000200 ffa_spm_id_get_test();
Max Shvetsovc32f4782020-06-23 09:41:15 +0100201 ffa_partition_info_get_test(mb);
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100202
J-Alves9f6f0142020-06-17 15:37:59 +0100203 announce_test_section_end(test_ffa);
204}