1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*
* Copyright (c) 2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch_helpers.h>
#include <arm_arch_svc.h>
#include <debug.h>
#include <smccc.h>
#include <string.h>
#include <tftf_lib.h>
/*
* Return SOC ID parameters(SOC revision/SOC version) according
* to argument passed
*/
static smc_ret_values get_soc_id_param(u_register_t arg)
{
smc_args args;
smc_ret_values ret;
memset(&args, 0, sizeof(args));
args.fid = SMCCC_ARCH_SOC_ID;
args.arg1 = arg;
ret = tftf_smc(&args);
return ret;
}
/* Entry function to execute SMCCC_ARCH_SOC_ID test */
test_result_t test_smccc_arch_soc_id(void)
{
smc_args args;
smc_ret_values ret;
int32_t expected_ver;
int32_t skip_cnt = 0;
bool fail_soc_id_test = false;
/* Check if SMCCC version is at least v1.2 */
expected_ver = MAKE_SMCCC_VERSION(1, 2);
memset(&args, 0, sizeof(args));
args.fid = SMCCC_VERSION;
ret = tftf_smc(&args);
if ((int32_t)ret.ret0 < expected_ver) {
tftf_testcase_printf("Unexpected SMCCC version: 0x%x\n",
(int)ret.ret0);
return TEST_RESULT_SKIPPED;
}
/* Check if SMCCC_ARCH_SOC_ID is implemented or not */
memset(&args, 0, sizeof(args));
args.fid = SMCCC_ARCH_FEATURES;
args.arg1 = SMCCC_ARCH_SOC_ID;
ret = tftf_smc(&args);
if ((int)ret.ret0 == SMC_ARCH_CALL_NOT_SUPPORTED) {
tftf_testcase_printf("SMCCC_ARCH_SOC_ID is not implemented\n");
return TEST_RESULT_FAIL;
}
/* If the call returns SMC_OK then SMCCC_ARCH_SOC_ID is feature available */
if ((int)ret.ret0 == SMC_OK) {
ret = get_soc_id_param(SMC_GET_SOC_REVISION);
if ((int)ret.ret0 == SMC_ARCH_CALL_INVAL_PARAM) {
ERROR("Invalid param passed to SMCCC_ARCH_SOC_ID\n");
fail_soc_id_test = true;
} else if ((int)ret.ret0 == SMC_ARCH_CALL_NOT_SUPPORTED) {
tftf_testcase_printf("SOC Rev is not implemented\n");
skip_cnt++;
} else {
tftf_testcase_printf("SOC Rev = 0x%x\n", (int)ret.ret0);
}
ret = get_soc_id_param(SMC_GET_SOC_VERSION);
if ((int)ret.ret0 == SMC_ARCH_CALL_INVAL_PARAM) {
ERROR("Invalid param passed to SMCCC_ARCH_SOC_ID\n");
fail_soc_id_test = true;
} else if ((int)ret.ret0 == SMC_ARCH_CALL_NOT_SUPPORTED) {
tftf_testcase_printf("SOC Ver is not implemented\n");
skip_cnt++;
} else {
tftf_testcase_printf("SOC Ver = 0x%x\n", (int)ret.ret0);
}
if (skip_cnt == 2)
return TEST_RESULT_SKIPPED;
else if (fail_soc_id_test)
return TEST_RESULT_FAIL;
} else {
ERROR("Invalid error during SMCCC_ARCH_FEATURES call = 0x%x\n",
(int)ret.ret0);
return TEST_RESULT_FAIL;
}
return TEST_RESULT_SUCCESS;
}
|