blob: 88bfbae3d95d6bb69a0a40a34c7e5832204e6af1 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#include <arch_features.h>
7#include <assert.h>
8#include <feature.h>
9#include <smc-handler.h>
10#include <smc-rmi.h>
11#include <status.h>
12
Yousuf Aa297b9b2022-10-13 13:54:21 +010013#define RMM_FEATURE_MIN_IPA_SIZE PARANGE_0000_WIDTH
14
Soby Mathewb4c6df42022-11-09 11:13:29 +000015static unsigned long get_feature_register_0(void)
16{
17 /* Set S2SZ field */
18 unsigned long s2sz = arch_feat_get_pa_width();
19 unsigned long feat_reg0 = INPLACE(RMM_FEATURE_REGISTER_0_S2SZ, s2sz);
20
21 /* Set LPA2 field */
22 if (is_feat_lpa2_4k_present()) {
23 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_LPA2, RMI_LPA2);
24 }
25
26 /* Set support for SHA256 and SHA512 hash algorithms */
27 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_256, 1);
28 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_512, 1);
29
30 return feat_reg0;
31}
32
33void smc_read_feature_register(unsigned long index,
34 struct smc_result *ret_struct)
35{
36 switch (index) {
37 case RMM_FEATURE_REGISTER_0_INDEX:
38 ret_struct->x[0] = RMI_SUCCESS;
39 ret_struct->x[1] = get_feature_register_0();
40 break;
41 default:
42 ret_struct->x[0] = RMI_ERROR_INPUT;
43 }
44}
45
46static bool validate_feature_register_0(unsigned long value)
47{
48 unsigned long feat_reg0 = get_feature_register_0();
49 unsigned long s2sz = EXTRACT(RMM_FEATURE_REGISTER_0_S2SZ, value);
50
51 /* Validate S2SZ field */
52 if ((s2sz < RMM_FEATURE_MIN_IPA_SIZE) ||
53 (s2sz > EXTRACT(RMM_FEATURE_REGISTER_0_S2SZ, feat_reg0))) {
54 return false;
55 }
56
57 /* Validate LPA2 flag */
58 if ((EXTRACT(RMM_FEATURE_REGISTER_0_LPA2, value) == RMI_LPA2) &&
59 !is_feat_lpa2_4k_present()) {
60 return false;
61 }
62
63 return true;
64}
65
66bool validate_feature_register(unsigned long index, unsigned long value)
67{
68 switch (index) {
69 case RMM_FEATURE_REGISTER_0_INDEX:
70 return validate_feature_register_0(value);
71 default:
72 assert(false);
73 return false;
74 }
75}