arch/risc-v/src/mpfs/mpfs_cache.c: Move l2zerodevice to use cache ways starting from 0

If scratchpad is being used, the cache way 0, which is automatically
enabled at boot, needs to be re-configured as part of scratchpad memory
Otherwise there is a possibility of random memory corruption in the
scratchpad
area due to cache eviction from way 0.

Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
Jukka Laitinen
2025-01-28 09:17:04 +02:00
committed by Xiang Xiao
parent eddc22c47f
commit f53afd174e
3 changed files with 55 additions and 32 deletions
+25 -2
View File
@@ -90,8 +90,7 @@ void mpfs_enable_cache(void)
uint64_t *p_scratchpad = (uint64_t *)MPFS_ZERO_DEVICE_BOTTOM; uint64_t *p_scratchpad = (uint64_t *)MPFS_ZERO_DEVICE_BOTTOM;
uint32_t ways_inc; uint32_t ways_inc;
uint32_t inc; uint32_t inc;
uint64_t current_way = 1 << (((LIBERO_SETTING_WAY_ENABLE + 1) - uint64_t current_way = 0x1;
LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS));
/* Increasing the ways decreases the 2 MB l2lim area: /* Increasing the ways decreases the 2 MB l2lim area:
* - Way0: 0x081e0000 - 0x08200000 * - Way0: 0x081e0000 - 0x08200000
@@ -147,6 +146,30 @@ void mpfs_enable_cache(void)
putreg32(LIBERO_SETTING_WAY_MASK_U54_4_ICACHE, putreg32(LIBERO_SETTING_WAY_MASK_U54_4_ICACHE,
MPFS_CACHE_WAY_MASK_U54_4_ICACHE); MPFS_CACHE_WAY_MASK_U54_4_ICACHE);
/* Sanity check: the scratchpad area is not configured in use as
* cache on any master
*/
#if LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS != 0
static_assert((
(LIBERO_SETTING_WAY_MASK_DMA |
LIBERO_SETTING_WAY_MASK_AXI4_PORT_0 |
LIBERO_SETTING_WAY_MASK_AXI4_PORT_1 |
LIBERO_SETTING_WAY_MASK_AXI4_PORT_2 |
LIBERO_SETTING_WAY_MASK_AXI4_PORT_3 |
LIBERO_SETTING_WAY_MASK_E51_DCACHE |
LIBERO_SETTING_WAY_MASK_E51_ICACHE |
LIBERO_SETTING_WAY_MASK_U54_1_DCACHE |
LIBERO_SETTING_WAY_MASK_U54_1_ICACHE |
LIBERO_SETTING_WAY_MASK_U54_2_DCACHE |
LIBERO_SETTING_WAY_MASK_U54_2_ICACHE |
LIBERO_SETTING_WAY_MASK_U54_3_DCACHE |
LIBERO_SETTING_WAY_MASK_U54_3_ICACHE |
LIBERO_SETTING_WAY_MASK_U54_4_DCACHE |
LIBERO_SETTING_WAY_MASK_U54_4_ICACHE) &
((1 << LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS) - 1)) == 0);
#endif
/* Assign ways to Zero Device */ /* Assign ways to Zero Device */
for (ways_inc = 0; ways_inc < LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS; for (ways_inc = 0; ways_inc < LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS;
@@ -598,21 +598,21 @@
/* Cache settings */ /* Cache settings */
#define LIBERO_SETTING_WAY_MASK_DMA 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_DMA 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_E51_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_E51_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_E51_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_E51_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x00000ff0
#define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS 0x00000004 #define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS 0x00000004
#define LIBERO_SETTING_L2_SHUTDOWN_CR 0x00000000 #define LIBERO_SETTING_L2_SHUTDOWN_CR 0x00000000
#define LIBERO_SETTING_WAY_ENABLE 0x0000000b #define LIBERO_SETTING_WAY_ENABLE 0x0000000b
@@ -594,21 +594,21 @@
/* Cache settings */ /* Cache settings */
#define LIBERO_SETTING_WAY_MASK_DMA 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_DMA 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_E51_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_E51_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_E51_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_E51_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x00000ff0
#define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x0000f0ff #define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x00000ff0
#define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS 0x00000004 #define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS 0x00000004
#define LIBERO_SETTING_L2_SHUTDOWN_CR 0x00000000 #define LIBERO_SETTING_L2_SHUTDOWN_CR 0x00000000
#define LIBERO_SETTING_WAY_ENABLE 0x0000000b #define LIBERO_SETTING_WAY_ENABLE 0x0000000b