mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00
fix(intel): flush L1/L2/L3/Sys cache before HPS cold reset
This fix is to flush and invalidate the caches before cold reset. Issue happen where Agilex5 hardware does not support the caches flush. Thus software workaround is needed. Change-Id: Ibfeecbc611d238a069ca72f8b833f319e794cd38 Signed-off-by: Jit Loon Lim <jit.loon.lim@intel.com> Signed-off-by: Sieu Mun Tang <sieu.mun.tang@intel.com>
This commit is contained in:
parent
2752c2a849
commit
7ac7dadb55
8 changed files with 124 additions and 3 deletions
|
@ -16,6 +16,11 @@
|
|||
/* Platform Setting */
|
||||
#define PLATFORM_MODEL PLAT_SOCFPGA_AGILEX
|
||||
#define BOOT_SOURCE BOOT_SOURCE_SDMMC
|
||||
/* 1 = Flush cache, 0 = No cache flush.
|
||||
* Default for Agilex is No cache flush.
|
||||
* For Agilex FP8, set to Flush cache.
|
||||
*/
|
||||
#define CACHE_FLUSH 0
|
||||
#define PLAT_PRIMARY_CPU 0
|
||||
#define PLAT_CLUSTER_ID_MPIDR_AFF_SHIFT MPIDR_AFF1_SHIFT
|
||||
#define PLAT_CPU_ID_MPIDR_AFF_SHIFT MPIDR_AFF0_SHIFT
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
/* Platform Setting */
|
||||
#define PLATFORM_MODEL PLAT_SOCFPGA_AGILEX5
|
||||
#define BOOT_SOURCE BOOT_SOURCE_SDMMC
|
||||
/* 1 = Flush cache, 0 = No cache flush.
|
||||
* Default for Agilex5 is Cache flush.
|
||||
*/
|
||||
#define CACHE_FLUSH 1
|
||||
#define MMC_DEVICE_TYPE 1 /* MMC = 0, SD = 1 */
|
||||
#define XLAT_TABLES_V2 U(1)
|
||||
#define PLAT_PRIMARY_CPU_A55 0x000
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2024, Altera Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -19,6 +21,7 @@
|
|||
.globl plat_crash_console_flush
|
||||
.globl platform_mem_init
|
||||
.globl plat_secondary_cpus_bl31_entry
|
||||
.globl invalidate_cache_low_el
|
||||
|
||||
.globl plat_get_my_entrypoint
|
||||
|
||||
|
@ -213,3 +216,18 @@ func plat_secondary_cpus_bl31_entry
|
|||
_exception_vectors=runtime_exceptions \
|
||||
_pie_fixup_size=BL31_LIMIT - BL31_BASE
|
||||
endfunc plat_secondary_cpus_bl31_entry
|
||||
|
||||
/* --------------------------------------------------------
|
||||
* Invalidate for NS EL2 and EL1
|
||||
* --------------------------------------------------------
|
||||
*/
|
||||
func invalidate_cache_low_el
|
||||
mrs x0,SCR_EL3
|
||||
orr x1,x0,#SCR_NS_BIT
|
||||
msr SCR_EL3, x1
|
||||
isb
|
||||
tlbi ALLE2
|
||||
dsb sy
|
||||
tlbi ALLE1
|
||||
dsb sy
|
||||
endfunc invalidate_cache_low_el
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2024, Altera Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <common/debug.h>
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <errno.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <platform_def.h>
|
||||
|
@ -16,7 +18,24 @@
|
|||
|
||||
uint32_t poll_active_bit(uint32_t dir);
|
||||
|
||||
#define SMMU_DMI 1
|
||||
#define SMMU_DMI 1
|
||||
#define CCU_DMI0_DMIUSMCMCR SOCFPGA_CCU_NOC_REG_BASE + 0x7340
|
||||
#define CCU_DMI0_DMIUSMCMAR SOCFPGA_CCU_NOC_REG_BASE + 0x7344
|
||||
#define CCU_DMI0_DMIUSMCMCR_MNTOP GENMASK(3, 0)
|
||||
#define MAX_DISTRIBUTED_MEM_INTERFACE 2
|
||||
#define FLUSH_ALL_ENTRIES 0x4
|
||||
#define CCU_DMI0_DMIUSMCMCR_ARRAY_ID GENMASK(21, 16)
|
||||
#define ARRAY_ID_TAG 0x0
|
||||
#define ARRAY_ID_DATA 0x1
|
||||
#define CACHE_OPERATION_DONE BIT(0)
|
||||
#define TIMEOUT_200MS 200
|
||||
|
||||
#define __bf_shf(x) (__builtin_ffsll(x) - 1)
|
||||
|
||||
#define FIELD_PREP(_mask, _val) \
|
||||
({ \
|
||||
((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \
|
||||
})
|
||||
|
||||
#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
|
||||
ncore_ccu_reg_t ncore_ccu_modules[] = {
|
||||
|
@ -632,3 +651,61 @@ void setup_smmu_stream_id(void)
|
|||
mmio_write_32(SOCFPGA_SYSMGR(TSN_TBU_STREAM_CTRL_REG_3_TSN1), ENABLE_STREAMID);
|
||||
mmio_write_32(SOCFPGA_SYSMGR(TSN_TBU_STREAM_CTRL_REG_3_TSN2), ENABLE_STREAMID);
|
||||
}
|
||||
|
||||
#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
|
||||
/* TODO: Temp added this here*/
|
||||
static int poll_idle_status(uint32_t addr, uint32_t mask, uint32_t match, uint32_t delay_ms)
|
||||
{
|
||||
int time_out = delay_ms;
|
||||
|
||||
while (time_out-- > 0) {
|
||||
|
||||
if ((mmio_read_32(addr) & mask) == match) {
|
||||
return 0;
|
||||
}
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
int flush_l3_dcache(void)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
/* Flushing all entries in CCU system memory cache */
|
||||
for (i = 0; i < MAX_DISTRIBUTED_MEM_INTERFACE; i++) {
|
||||
mmio_write_32(FIELD_PREP(CCU_DMI0_DMIUSMCMCR_MNTOP, FLUSH_ALL_ENTRIES) |
|
||||
FIELD_PREP(CCU_DMI0_DMIUSMCMCR_ARRAY_ID, ARRAY_ID_TAG),
|
||||
(uintptr_t)(CCU_DMI0_DMIUSMCMCR + (i * 0x1000)));
|
||||
|
||||
/* Wait for cache maintenance operation done */
|
||||
ret = poll_idle_status((CCU_DMI0_DMIUSMCMAR +
|
||||
(i * 0x1000)), CACHE_OPERATION_DONE,
|
||||
CACHE_OPERATION_DONE, TIMEOUT_200MS);
|
||||
|
||||
if (ret != 0) {
|
||||
VERBOSE("%s: Timeout while waiting for flushing tag in DMI%d done\n",
|
||||
__func__, i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
mmio_write_32(FIELD_PREP(CCU_DMI0_DMIUSMCMCR_MNTOP, FLUSH_ALL_ENTRIES) |
|
||||
FIELD_PREP(CCU_DMI0_DMIUSMCMCR_ARRAY_ID, ARRAY_ID_DATA),
|
||||
(uintptr_t)(CCU_DMI0_DMIUSMCMCR + (i * 0x1000)));
|
||||
|
||||
/* Wait for cache maintenance operation done */
|
||||
ret = poll_idle_status((CCU_DMI0_DMIUSMCMAR +
|
||||
(i * 0x1000)), CACHE_OPERATION_DONE,
|
||||
CACHE_OPERATION_DONE, TIMEOUT_200MS);
|
||||
|
||||
if (ret != 0) {
|
||||
VERBOSE("%s: Timeout while waiting for flushing data in DMI%d done\n",
|
||||
__func__, i);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2024, Altera Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -452,5 +453,6 @@ typedef struct coh_ss_id {
|
|||
uint32_t init_ncore_ccu(void);
|
||||
void ncore_enable_ocram_firewall(void);
|
||||
void setup_smmu_stream_id(void);
|
||||
int flush_l3_dcache(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2022, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2024, Altera Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -64,4 +65,6 @@ unsigned long socfpga_get_ns_image_entrypoint(void);
|
|||
|
||||
void plat_secondary_cpus_bl31_entry(void);
|
||||
|
||||
void invalidate_cache_low_el(void);
|
||||
|
||||
#endif /* SOCFPGA_PRIVATE_H */
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
#include <lib/mmio.h>
|
||||
#include <lib/psci/psci.h>
|
||||
#include <plat/common/platform.h>
|
||||
#include "ccu/ncore_ccu.h"
|
||||
#include "socfpga_mailbox.h"
|
||||
#include "socfpga_plat_def.h"
|
||||
#include "socfpga_private.h"
|
||||
#include "socfpga_reset_manager.h"
|
||||
#include "socfpga_sip_svc.h"
|
||||
#include "socfpga_system_manager.h"
|
||||
|
@ -190,6 +192,14 @@ static void __dead2 socfpga_system_reset(void)
|
|||
if (intel_rsu_update_address) {
|
||||
mailbox_rsu_update(addr_buf);
|
||||
} else {
|
||||
#if CACHE_FLUSH
|
||||
/* ATF Flush and Invalidate Cache */
|
||||
dcsw_op_all(DCCISW);
|
||||
invalidate_cache_low_el();
|
||||
#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
|
||||
flush_l3_dcache();
|
||||
#endif
|
||||
#endif
|
||||
mailbox_reset_cold();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#
|
||||
# Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
|
||||
# Copyright (c) 2019-2022, Intel Corporation. All rights reserved.
|
||||
# Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
|
||||
# Copyright (c) 2024, Altera Corporation. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
@ -26,6 +27,7 @@ PLAT_BL_COMMON_SOURCES := \
|
|||
lib/xlat_tables/xlat_tables_common.c \
|
||||
plat/intel/soc/common/aarch64/platform_common.c \
|
||||
plat/intel/soc/common/aarch64/plat_helpers.S \
|
||||
plat/intel/soc/common/drivers/ccu/ncore_ccu.c \
|
||||
plat/intel/soc/common/socfpga_delay_timer.c \
|
||||
plat/intel/soc/common/soc/socfpga_firewall.c
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue