blob: dc086c8d61d71d0dc2ef7edb19dde11dd6e9ca4e [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>
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +00009#include <simd.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000010#include <smc-handler.h>
11#include <smc-rmi.h>
12#include <status.h>
Javier Almansa Sobrino765a3162023-04-27 17:42:58 +010013#include <table.h>
AlexeiFedoroveaec0c42023-02-01 18:13:32 +000014#include <utils_def.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000015
AlexeiFedorov18002922023-04-06 10:19:51 +010016unsigned long get_feature_register_0(void)
Soby Mathewb4c6df42022-11-09 11:13:29 +000017{
Javier Almansa Sobrino765a3162023-04-27 17:42:58 +010018 /* TODO: Announce FEAT_LPA2 through feat_reg0 when supported for S2TTE */
Soby Mathewb4c6df42022-11-09 11:13:29 +000019
Javier Almansa Sobrino765a3162023-04-27 17:42:58 +010020 /* Set S2SZ field */
21 unsigned long s2sz = max_ipa_size();
22 unsigned long feat_reg0 = INPLACE(RMM_FEATURE_REGISTER_0_S2SZ, s2sz);
Soby Mathewb4c6df42022-11-09 11:13:29 +000023
24 /* Set support for SHA256 and SHA512 hash algorithms */
AlexeiFedorov7bb7a702023-01-17 17:04:14 +000025 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_256,
AlexeiFedorovc09b1652023-04-04 15:41:37 +010026 RMI_FEATURE_TRUE);
AlexeiFedorov7bb7a702023-01-17 17:04:14 +000027 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_512,
AlexeiFedorovc09b1652023-04-04 15:41:37 +010028 RMI_FEATURE_TRUE);
AlexeiFedorov7bb7a702023-01-17 17:04:14 +000029
AlexeiFedoroveaec0c42023-02-01 18:13:32 +000030 /* RMM supports PMUv3p7+ */
31 assert(read_pmu_version() >= ID_AA64DFR0_EL1_PMUv3p7);
32
33 /* Set support for PMUv3 */
AlexeiFedorov7bb7a702023-01-17 17:04:14 +000034 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_PMU_EN,
AlexeiFedorovc09b1652023-04-04 15:41:37 +010035 RMI_FEATURE_TRUE);
AlexeiFedoroveaec0c42023-02-01 18:13:32 +000036
37 /* Set number of PMU counters available */
38 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_PMU_NUM_CTRS,
39 EXTRACT(PMCR_EL0_N, read_pmcr_el0()));
Soby Mathewb4c6df42022-11-09 11:13:29 +000040
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +000041 /* Set SVE fields */
42 if (is_feat_sve_present()) {
43 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_EN,
AlexeiFedorovc09b1652023-04-04 15:41:37 +010044 RMI_FEATURE_TRUE);
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +000045
46 feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_VL,
47 simd_sve_get_max_vq());
48 }
49
Soby Mathewb4c6df42022-11-09 11:13:29 +000050 return feat_reg0;
51}
52
53void smc_read_feature_register(unsigned long index,
54 struct smc_result *ret_struct)
55{
56 switch (index) {
57 case RMM_FEATURE_REGISTER_0_INDEX:
58 ret_struct->x[0] = RMI_SUCCESS;
59 ret_struct->x[1] = get_feature_register_0();
60 break;
61 default:
62 ret_struct->x[0] = RMI_ERROR_INPUT;
shaxio011fcd62d2023-06-13 13:13:11 +010063 ret_struct->x[1] = 0UL;
Soby Mathewb4c6df42022-11-09 11:13:29 +000064 }
65}