mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-24 13:55:56 +00:00
Merge "fix(intel): flush L1/L2/L3/Sys cache before HPS cold reset" into integration
This commit is contained in:
commit
5dda797f55
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