You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/12/23 02:48:17 UTC

[incubator-nuttx] 01/02: mpfs: cache: assign ways to L2 zero device

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 491ae6cc5348f95def3434fea8ea815b6be910d6
Author: Eero Nurkkala <ee...@offcode.fi>
AuthorDate: Mon Dec 20 14:08:52 2021 +0200

    mpfs: cache: assign ways to L2 zero device
    
    Assign ways to L2 zerodevice. L2 zero device is used for
    the scratchpad functionality. The area may be used for the
    harts communicating to each other.
    
    Signed-off-by: Eero Nurkkala <ee...@offcode.fi>
---
 arch/risc-v/src/mpfs/mpfs_cache.c                  | 50 +++++++++++++++++++---
 .../risc-v/mpfs/icicle/include/board_liberodefs.h  | 34 +++++++--------
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/arch/risc-v/src/mpfs/mpfs_cache.c b/arch/risc-v/src/mpfs/mpfs_cache.c
index b46859c..af8cf73 100755
--- a/arch/risc-v/src/mpfs/mpfs_cache.c
+++ b/arch/risc-v/src/mpfs/mpfs_cache.c
@@ -45,6 +45,23 @@
 
 #define MPFS_L2LIM_ADDR               0x08200000
 
+#define MPFS_ZERO_DEVICE_BOTTOM       0x0a000000
+#define MPFS_ZERO_DEVICE_TOP          0x0c000000
+#define MPFS_MAX_WAY_ENABLE           15
+#define MPFS_NB_SETS                  512
+#define MPFS_NB_BANKS                 4
+#define MPFS_CACHE_BLOCK_BYTE_LENGTH  64
+#define MPFS_WAY_BYTE_LENGTH          (MPFS_CACHE_BLOCK_BYTE_LENGTH * \
+                                       MPFS_NB_SETS * MPFS_NB_BANKS)
+
+#define INIT_MARKER                   0xc0ffeebec0010000
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const uint64_t g_init_marker = INIT_MARKER;
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -67,6 +84,12 @@
 
 void mpfs_enable_cache(void)
 {
+  uint64_t *p_scratchpad = (uint64_t *)MPFS_ZERO_DEVICE_BOTTOM;
+  uint32_t ways_inc;
+  uint32_t inc;
+  uint64_t current_way = 1 << (((LIBERO_SETTING_WAY_ENABLE + 1) -
+                                 LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS));
+
   /* Increasing the ways decreases the 2 MB l2lim area:
    *   - Way0:  0x081e0000 - 0x08200000
    *   - Way1:  0x081c0000 - 0x081e0000
@@ -121,11 +144,28 @@ void mpfs_enable_cache(void)
   putreg32(LIBERO_SETTING_WAY_MASK_U54_4_ICACHE,
            MPFS_CACHE_WAY_MASK_U54_4_ICACHE);
 
-  /* L2 scratchpad region needs to be configured right here.  Currently
-   * we have no OpenSBI or other modules using the region so it isn't
-   * configured.  This corresponds to LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS
-   * = 0.
-   */
+  /* Assign ways to Zero Device */
+
+  for (ways_inc = 0; ways_inc < LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS;
+       ++ways_inc)
+    {
+      /* Populate the scratchpad memory one way at a time */
+
+      putreg32(current_way, MPFS_CACHE_WAY_MASK_E51_DCACHE);
+      mb();
+
+      /* Write to the first 64-bit location of each cache block */
+
+      for (inc = 0; inc < (MPFS_WAY_BYTE_LENGTH /
+           MPFS_CACHE_BLOCK_BYTE_LENGTH); ++inc)
+        {
+          *p_scratchpad = g_init_marker + inc;
+          p_scratchpad += MPFS_CACHE_BLOCK_BYTE_LENGTH / sizeof(uint64_t);
+        }
+
+      current_way = current_way << 1U;
+      mb();
+    }
 
   putreg32(LIBERO_SETTING_WAY_MASK_E51_DCACHE,
            MPFS_CACHE_WAY_MASK_E51_DCACHE);
diff --git a/boards/risc-v/mpfs/icicle/include/board_liberodefs.h b/boards/risc-v/mpfs/icicle/include/board_liberodefs.h
index 49e8bfe..e579195 100644
--- a/boards/risc-v/mpfs/icicle/include/board_liberodefs.h
+++ b/boards/risc-v/mpfs/icicle/include/board_liberodefs.h
@@ -595,23 +595,23 @@
 
 /* Cache settings */
 
-#define LIBERO_SETTING_WAY_MASK_DMA          0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0  0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1  0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2  0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3  0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_E51_DCACHE   0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_E51_ICACHE   0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x0000ffff
-#define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x0000ffff
-#define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS  0x00000000
+#define LIBERO_SETTING_WAY_MASK_DMA          0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_0  0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_1  0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_2  0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_AXI4_PORT_3  0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_E51_DCACHE   0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_E51_ICACHE   0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_1_DCACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_1_ICACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_2_DCACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_2_ICACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_3_DCACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_3_ICACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_4_DCACHE 0x0000f0ff
+#define LIBERO_SETTING_WAY_MASK_U54_4_ICACHE 0x0000f0ff
+#define LIBERO_SETTING_NUM_SCRATCH_PAD_WAYS  0x00000004
 #define LIBERO_SETTING_L2_SHUTDOWN_CR        0x00000000
-#define LIBERO_SETTING_WAY_ENABLE            0x00000007
+#define LIBERO_SETTING_WAY_ENABLE            0x0000000b
 
 #endif /* __BOARDS_RISCV_MPFS_ICICLE_INCLUDE_BOARD_LIBERODEFS_H */