summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c')
-rw-r--r--FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c229
1 files changed, 229 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c
new file mode 100644
index 000000000..2e21f5bb2
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_pmp.c
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright 2019-2021 Microchip FPGA Embedded Systems Solutions.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * MPFS HAL Embedded Software
+ *
+ */
+/*******************************************************************************
+ * @file mss_pmp.c
+ * @author Microchip-FPGA Embedded Systems Solutions
+ * @brief PolarFire SoC MSS PMP configuration using MSS configurator values.
+ *
+ */
+/*=========================================================================*//**
+
+ *//*=========================================================================*/
+#include <stdio.h>
+#include <string.h>
+#include "mpfs_hal/mss_hal.h"
+
+/**
+ * \brief PMP configuration from Libero
+ *
+ */
+const uint64_t pmp_values[][18] = {
+ /* hart 0 */
+ {LIBERO_SETTING_HART0_CSR_PMPCFG0,
+ LIBERO_SETTING_HART0_CSR_PMPCFG2,
+ LIBERO_SETTING_HART0_CSR_PMPADDR0,
+ LIBERO_SETTING_HART0_CSR_PMPADDR1,
+ LIBERO_SETTING_HART0_CSR_PMPADDR2,
+ LIBERO_SETTING_HART0_CSR_PMPADDR3,
+ LIBERO_SETTING_HART0_CSR_PMPADDR4,
+ LIBERO_SETTING_HART0_CSR_PMPADDR5,
+ LIBERO_SETTING_HART0_CSR_PMPADDR6,
+ LIBERO_SETTING_HART0_CSR_PMPADDR7,
+ LIBERO_SETTING_HART0_CSR_PMPADDR8,
+ LIBERO_SETTING_HART0_CSR_PMPADDR9,
+ LIBERO_SETTING_HART0_CSR_PMPADDR10,
+ LIBERO_SETTING_HART0_CSR_PMPADDR11,
+ LIBERO_SETTING_HART0_CSR_PMPADDR12,
+ LIBERO_SETTING_HART0_CSR_PMPADDR13,
+ LIBERO_SETTING_HART0_CSR_PMPADDR14,
+ LIBERO_SETTING_HART0_CSR_PMPADDR15},
+ /* hart 1 */
+ {LIBERO_SETTING_HART1_CSR_PMPCFG0,
+ LIBERO_SETTING_HART1_CSR_PMPCFG2,
+ LIBERO_SETTING_HART1_CSR_PMPADDR0,
+ LIBERO_SETTING_HART1_CSR_PMPADDR1,
+ LIBERO_SETTING_HART1_CSR_PMPADDR2,
+ LIBERO_SETTING_HART1_CSR_PMPADDR3,
+ LIBERO_SETTING_HART1_CSR_PMPADDR4,
+ LIBERO_SETTING_HART1_CSR_PMPADDR5,
+ LIBERO_SETTING_HART1_CSR_PMPADDR6,
+ LIBERO_SETTING_HART1_CSR_PMPADDR7,
+ LIBERO_SETTING_HART1_CSR_PMPADDR8,
+ LIBERO_SETTING_HART1_CSR_PMPADDR9,
+ LIBERO_SETTING_HART1_CSR_PMPADDR10,
+ LIBERO_SETTING_HART1_CSR_PMPADDR11,
+ LIBERO_SETTING_HART1_CSR_PMPADDR12,
+ LIBERO_SETTING_HART1_CSR_PMPADDR13,
+ LIBERO_SETTING_HART1_CSR_PMPADDR14,
+ LIBERO_SETTING_HART1_CSR_PMPADDR15},
+ /* hart 2 */
+ {LIBERO_SETTING_HART2_CSR_PMPCFG0,
+ LIBERO_SETTING_HART2_CSR_PMPCFG2,
+ LIBERO_SETTING_HART2_CSR_PMPADDR0,
+ LIBERO_SETTING_HART2_CSR_PMPADDR1,
+ LIBERO_SETTING_HART2_CSR_PMPADDR2,
+ LIBERO_SETTING_HART2_CSR_PMPADDR3,
+ LIBERO_SETTING_HART2_CSR_PMPADDR4,
+ LIBERO_SETTING_HART2_CSR_PMPADDR5,
+ LIBERO_SETTING_HART2_CSR_PMPADDR6,
+ LIBERO_SETTING_HART2_CSR_PMPADDR7,
+ LIBERO_SETTING_HART2_CSR_PMPADDR8,
+ LIBERO_SETTING_HART2_CSR_PMPADDR9,
+ LIBERO_SETTING_HART2_CSR_PMPADDR10,
+ LIBERO_SETTING_HART2_CSR_PMPADDR11,
+ LIBERO_SETTING_HART2_CSR_PMPADDR12,
+ LIBERO_SETTING_HART2_CSR_PMPADDR13,
+ LIBERO_SETTING_HART2_CSR_PMPADDR14,
+ LIBERO_SETTING_HART2_CSR_PMPADDR15},
+ /* hart 3 */
+ {LIBERO_SETTING_HART3_CSR_PMPCFG0,
+ LIBERO_SETTING_HART3_CSR_PMPCFG2,
+ LIBERO_SETTING_HART3_CSR_PMPADDR0,
+ LIBERO_SETTING_HART3_CSR_PMPADDR1,
+ LIBERO_SETTING_HART3_CSR_PMPADDR2,
+ LIBERO_SETTING_HART3_CSR_PMPADDR3,
+ LIBERO_SETTING_HART3_CSR_PMPADDR4,
+ LIBERO_SETTING_HART3_CSR_PMPADDR5,
+ LIBERO_SETTING_HART3_CSR_PMPADDR6,
+ LIBERO_SETTING_HART3_CSR_PMPADDR7,
+ LIBERO_SETTING_HART3_CSR_PMPADDR8,
+ LIBERO_SETTING_HART3_CSR_PMPADDR9,
+ LIBERO_SETTING_HART3_CSR_PMPADDR10,
+ LIBERO_SETTING_HART3_CSR_PMPADDR11,
+ LIBERO_SETTING_HART3_CSR_PMPADDR12,
+ LIBERO_SETTING_HART3_CSR_PMPADDR13,
+ LIBERO_SETTING_HART3_CSR_PMPADDR14,
+ LIBERO_SETTING_HART3_CSR_PMPADDR15},
+ /* hart 4 */
+ {LIBERO_SETTING_HART4_CSR_PMPCFG0,
+ LIBERO_SETTING_HART4_CSR_PMPCFG2,
+ LIBERO_SETTING_HART4_CSR_PMPADDR0,
+ LIBERO_SETTING_HART4_CSR_PMPADDR1,
+ LIBERO_SETTING_HART4_CSR_PMPADDR2,
+ LIBERO_SETTING_HART4_CSR_PMPADDR3,
+ LIBERO_SETTING_HART4_CSR_PMPADDR4,
+ LIBERO_SETTING_HART4_CSR_PMPADDR5,
+ LIBERO_SETTING_HART4_CSR_PMPADDR6,
+ LIBERO_SETTING_HART4_CSR_PMPADDR7,
+ LIBERO_SETTING_HART4_CSR_PMPADDR8,
+ LIBERO_SETTING_HART4_CSR_PMPADDR9,
+ LIBERO_SETTING_HART4_CSR_PMPADDR10,
+ LIBERO_SETTING_HART4_CSR_PMPADDR11,
+ LIBERO_SETTING_HART4_CSR_PMPADDR12,
+ LIBERO_SETTING_HART4_CSR_PMPADDR13,
+ LIBERO_SETTING_HART4_CSR_PMPADDR14,
+ LIBERO_SETTING_HART4_CSR_PMPADDR15},
+};
+
+/**
+ * pmp_configure()
+ * Set PMP's up with configuration from Libero
+ * @param hart_id hart Id
+ * @return
+ */
+uint8_t pmp_configure(uint8_t hart_id) /* set-up with settings from Libero */
+{
+#if ((LIBERO_SETTING_MEM_CONFIGS_ENABLED & PMP_ENABLED_MASK) == PMP_ENABLED_MASK)
+ uint64_t pmp0cfg;
+#endif
+ /* make sure enables are off */
+ write_csr(pmpcfg0, 0);
+ write_csr(pmpcfg2, 0);
+ /* set required addressing */
+ write_csr(pmpaddr0, pmp_values[hart_id][2]);
+ write_csr(pmpaddr1, pmp_values[hart_id][3]);
+ write_csr(pmpaddr2, pmp_values[hart_id][4]);
+ write_csr(pmpaddr3, pmp_values[hart_id][5]);
+ write_csr(pmpaddr4, pmp_values[hart_id][6]);
+ write_csr(pmpaddr5, pmp_values[hart_id][7]);
+ write_csr(pmpaddr6, pmp_values[hart_id][8]);
+ write_csr(pmpaddr7, pmp_values[hart_id][9]);
+ write_csr(pmpaddr8, pmp_values[hart_id][10]);
+ write_csr(pmpaddr9, pmp_values[hart_id][11]);
+ write_csr(pmpaddr10, pmp_values[hart_id][12]);
+ write_csr(pmpaddr11, pmp_values[hart_id][13]);
+ write_csr(pmpaddr12, pmp_values[hart_id][14]);
+ write_csr(pmpaddr13, pmp_values[hart_id][15]);
+ write_csr(pmpaddr14, pmp_values[hart_id][16]);
+ write_csr(pmpaddr15, pmp_values[hart_id][17]);
+#if ((LIBERO_SETTING_MEM_CONFIGS_ENABLED & PMP_ENABLED_MASK) == PMP_ENABLED_MASK)
+ pmp0cfg = pmp_values[hart_id][0];
+ pmp_master_configs(hart_id, &pmp0cfg);
+ write_csr(pmpcfg0, pmp0cfg);
+ write_csr(pmpcfg2, pmp_values[hart_id][1]);
+#endif
+
+ return(0);
+}
+
+/*-------------------------------------------------------------------------*//**
+ Please note the first four PMP's are set to zero by MSS Configurator v2021.1
+ These will need to be set by the HSS. The first three relate to HSS footprint
+ The PMP4 is used to open a hole for debug region.
+
+ | PMP | cfg | L | XWR | Detail |
+ |-----|-----------|-----|----------------------------------------------------|
+ | 0 | 0x18 | N | | 256KB | Closes access for s and U mode |
+ | 1 | 0x98 | Y | X R | 256KB | Opens up area for m-mode only |
+ | 2 | 0x98 | Y | XRW | 64KB | OpenSBI scratch per scratch |
+ | 3 | 0x98 | Y | XRW | 4KB | Open window for debug |
+ | .. | .. | .. | .. | .. | .. |
+ | 15 | 0x18 | Y | | - | Close everything not opened |
+
+ @param pmp0cfg return with config for first four PMP's
+
+ */
+__attribute__((weak)) void pmp_master_configs(uint8_t hart_id, uint64_t * pmp0cfg)
+{
+ if ( hart_id == 0U )
+ {
+ *pmp0cfg = LIBERO_SETTING_HART0_CSR_PMPCFG0;
+ write_csr(pmpaddr0, pmp_values[hart_id][2]);
+ write_csr(pmpaddr1, pmp_values[hart_id][3]);
+ write_csr(pmpaddr2, pmp_values[hart_id][4]);
+ write_csr(pmpaddr3, pmp_values[hart_id][5]);
+ }
+ else
+ {
+ /*
+ * Example of closed memory map, must be created based on HSS footprint
+ */
+#define CLOSE_S_U_ACCESS_HSS_PMP0_LIM_EG0 0x2007FFFULL /* 256K LIM */
+#define CLOSE_S_U_ACCESS_HSS_PMP0_LIM_EG1 0x200FFFFULL /* 512K LIM */
+#define OPEN_M_ACCESS_HSS_PMP1_LIM_EG0 0x2007FFFULL /* 256K LIM */
+#define OPEN_M_ACCESS_HSS_PMP1_LIM_EG1 0x200FFFFULL /* 512K LIM */
+#define OPEN_M_ACCESS_HSS_PMP1_SCRATCH_EG 0x280FFFFULL /* 512K SCRATCHPAD */
+#define OPEN_CONTEXT_ACCESS_LIM_PMP2_H1 0x2011FFFULL /* 64K LIM */
+#define OPEN_CONTEXT_ACCESS_LIM_PMP2_H2 0x2015FFFULL /* 64K LIM */
+#define OPEN_DEBUG_ACCESS_PMP3 0x1FFULL
+#define HSS_CLOSED_CFG_MASK ~0xFFFFFFFFULL
+#define HSS_CLOSED_CFG 0x9F9F9D18ULL
+ /*
+ * We will open 512K LIM and scratchpad in weak pmp_master_configs()
+ * for all harts.
+ */
+#define LIM_512K_FROM_BASE 0x200FFFFULL /* 512K LIM */
+#define SCRATCH_512K_FROM_BASE 0x280FFFFULL /* 512K LIM */
+ *pmp0cfg &= HSS_CLOSED_CFG_MASK;
+ *pmp0cfg |= 0x9F009F9FULL; /* open 0,1 and 3 to allow open access */
+ write_csr(pmpaddr0, OPEN_M_ACCESS_HSS_PMP1_LIM_EG1);
+ write_csr(pmpaddr1, OPEN_M_ACCESS_HSS_PMP1_SCRATCH_EG);
+ write_csr(pmpaddr2, 0ULL);
+ write_csr(pmpaddr3, OPEN_DEBUG_ACCESS_PMP3);
+ }
+
+ /*
+ *
+ */
+#define LOCAL_PMP_SETTINGS
+#ifdef LOCAL_PMP_SETTINGS
+
+#endif
+ return;
+}