Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 1 | /* |
| 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 Ganapathy | f649121 | 2023-02-23 16:04:34 +0000 | [diff] [blame] | 9 | #include <simd.h> |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 10 | #include <smc-handler.h> |
| 11 | #include <smc-rmi.h> |
| 12 | #include <status.h> |
Javier Almansa Sobrino | 765a316 | 2023-04-27 17:42:58 +0100 | [diff] [blame] | 13 | #include <table.h> |
AlexeiFedorov | eaec0c4 | 2023-02-01 18:13:32 +0000 | [diff] [blame] | 14 | #include <utils_def.h> |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 15 | |
AlexeiFedorov | 1800292 | 2023-04-06 10:19:51 +0100 | [diff] [blame^] | 16 | unsigned long get_feature_register_0(void) |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 17 | { |
Javier Almansa Sobrino | 765a316 | 2023-04-27 17:42:58 +0100 | [diff] [blame] | 18 | /* TODO: Announce FEAT_LPA2 through feat_reg0 when supported for S2TTE */ |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 19 | |
Javier Almansa Sobrino | 765a316 | 2023-04-27 17:42:58 +0100 | [diff] [blame] | 20 | /* Set S2SZ field */ |
| 21 | unsigned long s2sz = max_ipa_size(); |
| 22 | unsigned long feat_reg0 = INPLACE(RMM_FEATURE_REGISTER_0_S2SZ, s2sz); |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 23 | |
| 24 | /* Set support for SHA256 and SHA512 hash algorithms */ |
AlexeiFedorov | 7bb7a70 | 2023-01-17 17:04:14 +0000 | [diff] [blame] | 25 | feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_256, |
AlexeiFedorov | c09b165 | 2023-04-04 15:41:37 +0100 | [diff] [blame] | 26 | RMI_FEATURE_TRUE); |
AlexeiFedorov | 7bb7a70 | 2023-01-17 17:04:14 +0000 | [diff] [blame] | 27 | feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_512, |
AlexeiFedorov | c09b165 | 2023-04-04 15:41:37 +0100 | [diff] [blame] | 28 | RMI_FEATURE_TRUE); |
AlexeiFedorov | 7bb7a70 | 2023-01-17 17:04:14 +0000 | [diff] [blame] | 29 | |
AlexeiFedorov | eaec0c4 | 2023-02-01 18:13:32 +0000 | [diff] [blame] | 30 | /* RMM supports PMUv3p7+ */ |
| 31 | assert(read_pmu_version() >= ID_AA64DFR0_EL1_PMUv3p7); |
| 32 | |
| 33 | /* Set support for PMUv3 */ |
AlexeiFedorov | 7bb7a70 | 2023-01-17 17:04:14 +0000 | [diff] [blame] | 34 | feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_PMU_EN, |
AlexeiFedorov | c09b165 | 2023-04-04 15:41:37 +0100 | [diff] [blame] | 35 | RMI_FEATURE_TRUE); |
AlexeiFedorov | eaec0c4 | 2023-02-01 18:13:32 +0000 | [diff] [blame] | 36 | |
| 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 Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 40 | |
Arunachalam Ganapathy | f649121 | 2023-02-23 16:04:34 +0000 | [diff] [blame] | 41 | /* Set SVE fields */ |
| 42 | if (is_feat_sve_present()) { |
| 43 | feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_EN, |
AlexeiFedorov | c09b165 | 2023-04-04 15:41:37 +0100 | [diff] [blame] | 44 | RMI_FEATURE_TRUE); |
Arunachalam Ganapathy | f649121 | 2023-02-23 16:04:34 +0000 | [diff] [blame] | 45 | |
| 46 | feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_VL, |
| 47 | simd_sve_get_max_vq()); |
| 48 | } |
| 49 | |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 50 | return feat_reg0; |
| 51 | } |
| 52 | |
| 53 | void 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; |
shaxio01 | 1fcd62d | 2023-06-13 13:13:11 +0100 | [diff] [blame] | 63 | ret_struct->x[1] = 0UL; |
Soby Mathew | b4c6df4 | 2022-11-09 11:13:29 +0000 | [diff] [blame] | 64 | } |
| 65 | } |