blob: 3122c56362f02b522509c8d3a4be6643d75f6e23 [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,
51 .properties = (FFA_PARTITION_DIRECT_REQ_RECV | FFA_PARTITION_DIRECT_REQ_SEND)
52 },
53 /* Ivy partition info */
54 {
55 .id = SP_ID(4),
56 .exec_context = IVY_EXEC_CTX_COUNT,
57 .properties = (FFA_PARTITION_DIRECT_REQ_RECV | FFA_PARTITION_DIRECT_REQ_SEND)
58 }
59};
Max Shvetsovc32f4782020-06-23 09:41:15 +010060
Max Shvetsov40eb6a22020-06-08 11:15:30 +010061/*
62 * Test FFA_FEATURES interface.
63 */
64static void ffa_features_test(void)
65{
66 const char *test_features = "FFA Features interface";
67 smc_ret_values ffa_ret;
Daniel Boulby198deda2021-03-03 11:35:25 +000068 unsigned int expected_ret;
Max Shvetsov103e0562021-02-04 16:58:31 +000069 const struct ffa_features_test *ffa_feature_test_target;
Max Shvetsov40eb6a22020-06-08 11:15:30 +010070 unsigned int i, test_target_size =
Max Shvetsov103e0562021-02-04 16:58:31 +000071 get_ffa_feature_test_target(&ffa_feature_test_target);
Daniel Boulby198deda2021-03-03 11:35:25 +000072 struct ffa_features_test test_target;
Max Shvetsov103e0562021-02-04 16:58:31 +000073
Max Shvetsov40eb6a22020-06-08 11:15:30 +010074
75 announce_test_section_start(test_features);
76
77 for (i = 0U; i < test_target_size; i++) {
Daniel Boulby198deda2021-03-03 11:35:25 +000078 test_target = ffa_feature_test_target[i];
Max Shvetsov40eb6a22020-06-08 11:15:30 +010079
Daniel Boulby198deda2021-03-03 11:35:25 +000080 announce_test_start(test_target.test_name);
81
82 ffa_ret = ffa_features(test_target.feature);
83 expected_ret = FFA_VERSION_COMPILED
84 >= test_target.version_added ?
85 test_target.expected_ret : FFA_ERROR;
86
87 expect(ffa_func_id(ffa_ret), expected_ret);
88 if (expected_ret == FFA_ERROR) {
J-Alves6cb21d92021-01-07 15:18:12 +000089 expect(ffa_error_code(ffa_ret), FFA_ERROR_NOT_SUPPORTED);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010090 }
91
Daniel Boulby198deda2021-03-03 11:35:25 +000092 announce_test_end(test_target.test_name);
Max Shvetsov40eb6a22020-06-08 11:15:30 +010093 }
94
95 announce_test_section_end(test_features);
96}
97
Max Shvetsovc32f4782020-06-23 09:41:15 +010098static void ffa_partition_info_wrong_test(void)
99{
100 const char *test_wrong_uuid = "Request wrong UUID";
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000101 const struct ffa_uuid uuid = { .uuid = {1} };
Max Shvetsovc32f4782020-06-23 09:41:15 +0100102
103 announce_test_start(test_wrong_uuid);
104
105 smc_ret_values ret = ffa_partition_info_get(uuid);
J-Alves6cb21d92021-01-07 15:18:12 +0000106 expect(ffa_func_id(ret), FFA_ERROR);
107 expect(ffa_error_code(ret), FFA_ERROR_INVALID_PARAMETER);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100108
109 announce_test_end(test_wrong_uuid);
110}
111
112static void ffa_partition_info_get_test(struct mailbox_buffers *mb)
113{
114 const char *test_partition_info = "FFA Partition info interface";
Max Shvetsovc32f4782020-06-23 09:41:15 +0100115
116 announce_test_section_start(test_partition_info);
117
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000118 expect(ffa_partition_info_helper(mb, sp_uuids[2],
119 &ffa_expected_partition_info[2], 1), true);
Ruari Phippsd75596a2020-07-17 16:41:34 +0100120
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000121 expect(ffa_partition_info_helper(mb, sp_uuids[1],
122 &ffa_expected_partition_info[1], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100123
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000124 expect(ffa_partition_info_helper(mb, sp_uuids[0],
125 &ffa_expected_partition_info[0], 1), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100126
Max Shvetsov0b7d25f2021-03-05 13:46:42 +0000127 expect(ffa_partition_info_helper(mb, null_uuid,
Varun Wadekar5c354822021-09-27 06:01:09 -0700128 ffa_expected_partition_info,
129 ARRAY_SIZE(ffa_expected_partition_info)), true);
Max Shvetsovc32f4782020-06-23 09:41:15 +0100130
131 ffa_partition_info_wrong_test();
132
133 announce_test_section_end(test_partition_info);
134}
135
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100136void ffa_version_test(void)
J-Alves9f6f0142020-06-17 15:37:59 +0100137{
J-Alves9f6f0142020-06-17 15:37:59 +0100138 const char *test_ffa_version = "FFA Version interface";
139
J-Alves9f6f0142020-06-17 15:37:59 +0100140 announce_test_start(test_ffa_version);
141
142 smc_ret_values ret = ffa_version(MAKE_FFA_VERSION(FFA_MAJOR, FFA_MINOR));
Daniel Boulby198deda2021-03-03 11:35:25 +0000143 spm_version = (uint32_t)ret.ret0;
J-Alves9f6f0142020-06-17 15:37:59 +0100144
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100145 bool ffa_version_compatible =
146 ((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR &&
147 (spm_version & FFA_VERSION_MINOR_MASK) >= FFA_MINOR);
J-Alves9f6f0142020-06-17 15:37:59 +0100148
Olivier Deprez24bd1702021-10-05 14:35:17 +0200149 VERBOSE("FFA_VERSION returned %u.%u; Compatible: %i\n",
J-Alves9f6f0142020-06-17 15:37:59 +0100150 spm_version >> FFA_VERSION_MAJOR_SHIFT,
151 spm_version & FFA_VERSION_MINOR_MASK,
152 (int)ffa_version_compatible);
153
154 expect((int)ffa_version_compatible, (int)true);
155
156 announce_test_end(test_ffa_version);
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100157}
158
Daniel Boulby198deda2021-03-03 11:35:25 +0000159void ffa_spm_id_get_test(void)
160{
161 const char *test_spm_id_get = "FFA_SPM_ID_GET SMC Function";
162
163 announce_test_start(test_spm_id_get);
164
165 if (spm_version >= MAKE_FFA_VERSION(1, 1)) {
166 smc_ret_values ret = ffa_spm_id_get();
167
168 expect(ffa_func_id(ret), FFA_SUCCESS_SMC32);
169
170 ffa_id_t spm_id = ffa_endpoint_id(ret);
171
172 VERBOSE("SPM ID = 0x%x\n", spm_id);
173 /*
174 * Check the SPMC value given in the fvp_spmc_manifest
175 * is returned.
176 */
177 expect(spm_id, SPMC_ID);
178 } else {
179 NOTICE("FFA_SPM_ID_GET not supported in this version of FF-A."
180 " Test skipped.\n");
181 }
182 announce_test_end(test_spm_id_get);
183}
184
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100185void ffa_tests(struct mailbox_buffers *mb)
186{
187 const char *test_ffa = "FFA Interfaces";
188
189 announce_test_section_start(test_ffa);
J-Alves9f6f0142020-06-17 15:37:59 +0100190
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100191 ffa_features_test();
Max Shvetsov57c6ddb2020-07-01 14:09:48 +0100192 ffa_version_test();
Daniel Boulby198deda2021-03-03 11:35:25 +0000193 ffa_spm_id_get_test();
Max Shvetsovc32f4782020-06-23 09:41:15 +0100194 ffa_partition_info_get_test(mb);
Max Shvetsov40eb6a22020-06-08 11:15:30 +0100195
J-Alves9f6f0142020-06-17 15:37:59 +0100196 announce_test_section_end(test_ffa);
197}