blob: dc086c8d61d71d0dc2ef7edb19dde11dd6e9ca4e [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#include <arch_features.h>
#include <assert.h>
#include <feature.h>
#include <simd.h>
#include <smc-handler.h>
#include <smc-rmi.h>
#include <status.h>
#include <table.h>
#include <utils_def.h>
unsigned long get_feature_register_0(void)
{
/* TODO: Announce FEAT_LPA2 through feat_reg0 when supported for S2TTE */
/* Set S2SZ field */
unsigned long s2sz = max_ipa_size();
unsigned long feat_reg0 = INPLACE(RMM_FEATURE_REGISTER_0_S2SZ, s2sz);
/* Set support for SHA256 and SHA512 hash algorithms */
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_256,
RMI_FEATURE_TRUE);
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_HASH_SHA_512,
RMI_FEATURE_TRUE);
/* RMM supports PMUv3p7+ */
assert(read_pmu_version() >= ID_AA64DFR0_EL1_PMUv3p7);
/* Set support for PMUv3 */
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_PMU_EN,
RMI_FEATURE_TRUE);
/* Set number of PMU counters available */
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_PMU_NUM_CTRS,
EXTRACT(PMCR_EL0_N, read_pmcr_el0()));
/* Set SVE fields */
if (is_feat_sve_present()) {
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_EN,
RMI_FEATURE_TRUE);
feat_reg0 |= INPLACE(RMM_FEATURE_REGISTER_0_SVE_VL,
simd_sve_get_max_vq());
}
return feat_reg0;
}
void smc_read_feature_register(unsigned long index,
struct smc_result *ret_struct)
{
switch (index) {
case RMM_FEATURE_REGISTER_0_INDEX:
ret_struct->x[0] = RMI_SUCCESS;
ret_struct->x[1] = get_feature_register_0();
break;
default:
ret_struct->x[0] = RMI_ERROR_INPUT;
ret_struct->x[1] = 0UL;
}
}