mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-15 00:54:22 +00:00

This patch removes RAS_FFH_SUPPORT macro which is the combination of ENABLE_FEAT_RAS and HANDLE_EA_EL3_FIRST_NS. Instead introduce an internal macro FFH_SUPPORT which gets enabled when platforms wants to enable lower EL EA handling at EL3. The internal macro FFH_SUPPORT will be automatically enabled if HANDLE_EA_EL3_FIRST_NS is enabled. FFH_SUPPORT along with ENABLE_FEAT_RAS will be used in source files to provide equivalent check which was provided by RAS_FFH_SUPPORT earlier. In generic code we needed a macro which could abstract both HANDLE_EA_EL3_FIRST_NS and RAS_FFH_SUPPORT macros that had limitations. Former was tied up with NS world only while the latter was tied to RAS feature. This is to allow Secure/Realm world to have their own FFH macros in future. Signed-off-by: Manish Pandey <manish.pandey2@arm.com> Change-Id: Ie5692ccbf462f5dcc3f005a5beea5aa35124ac73
103 lines
2.7 KiB
C
103 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <arch.h>
|
|
#include <arch_helpers.h>
|
|
#include <assert.h>
|
|
#include <common/bl_common.h>
|
|
#include <lib/el3_runtime/context_mgmt.h>
|
|
#include <common/debug.h>
|
|
#include <errno.h>
|
|
#include <mce.h>
|
|
#include <mce_private.h>
|
|
#include <memctrl.h>
|
|
#include <common/runtime_svc.h>
|
|
#include <tegra_private.h>
|
|
#include <tegra_platform.h>
|
|
#include <smmu.h>
|
|
#include <stdbool.h>
|
|
|
|
/*******************************************************************************
|
|
* Tegra194 SiP SMCs
|
|
******************************************************************************/
|
|
#define TEGRA_SIP_GET_SMMU_PER 0xC200FF00U
|
|
#define TEGRA_SIP_CLEAR_RAS_CORRECTED_ERRORS 0xC200FF01U
|
|
|
|
/*******************************************************************************
|
|
* This function is responsible for handling all T194 SiP calls
|
|
******************************************************************************/
|
|
int32_t plat_sip_handler(uint32_t smc_fid,
|
|
uint64_t x1,
|
|
uint64_t x2,
|
|
uint64_t x3,
|
|
uint64_t x4,
|
|
const void *cookie,
|
|
void *handle,
|
|
uint64_t flags)
|
|
{
|
|
int32_t ret = 0;
|
|
uint32_t i, smmu_per[6] = {0};
|
|
uint32_t num_smmu_devices = plat_get_num_smmu_devices();
|
|
uint64_t per[3] = {0ULL};
|
|
|
|
(void)x1;
|
|
(void)x4;
|
|
(void)cookie;
|
|
(void)flags;
|
|
|
|
switch (smc_fid) {
|
|
case TEGRA_SIP_GET_SMMU_PER:
|
|
|
|
/* make sure we dont go past the array length */
|
|
assert(num_smmu_devices <= ARRAY_SIZE(smmu_per));
|
|
|
|
/* read all supported SMMU_PER records */
|
|
for (i = 0U; i < num_smmu_devices; i++) {
|
|
smmu_per[i] = tegra_smmu_read_32(i, SMMU_GSR0_PER);
|
|
}
|
|
|
|
/* pack results into 3 64bit variables. */
|
|
per[0] = smmu_per[0] | ((uint64_t)smmu_per[1] << 32U);
|
|
per[1] = smmu_per[2] | ((uint64_t)smmu_per[3] << 32U);
|
|
per[2] = smmu_per[4] | ((uint64_t)smmu_per[5] << 32U);
|
|
|
|
/* provide the results via X1-X3 CPU registers */
|
|
write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X1, per[0]);
|
|
write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X2, per[1]);
|
|
write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X3, per[2]);
|
|
|
|
break;
|
|
|
|
#if ENABLE_FEAT_RAS
|
|
case TEGRA_SIP_CLEAR_RAS_CORRECTED_ERRORS:
|
|
{
|
|
/*
|
|
* clear all RAS error records for corrected errors at first.
|
|
* x1 shall be 0 for first SMC call after FHI is asserted.
|
|
* */
|
|
uint64_t local_x1 = x1;
|
|
|
|
tegra194_ras_corrected_err_clear(&local_x1);
|
|
if (local_x1 == 0ULL) {
|
|
/* clear HSM corrected error status after all corrected
|
|
* RAS errors are cleared.
|
|
*/
|
|
mce_clear_hsm_corr_status();
|
|
}
|
|
|
|
write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X1, local_x1);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
default:
|
|
ret = -ENOTSUP;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|