summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h')
-rw-r--r--FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h
new file mode 100644
index 000000000..86b4a1cdf
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_clint.h
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright 2019-2021 Microchip FPGA Embedded Systems Solutions.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * MPFS HAL Embedded Software
+ *
+ */
+
+/*******************************************************************************
+ *
+ * @file mss_clint.h
+ * @author Microchip-FPGA Embedded Systems Solutions
+ * @brief CLINT access data structures and functions.
+ *
+ */
+#ifndef MSS_CLINT_H
+#define MSS_CLINT_H
+
+#include <stdint.h>
+#include "encoding.h"
+#include "atomic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RTC_PRESCALER 100U
+#define SUCCESS 0U
+#define ERROR 1U
+
+
+/*==============================================================================
+ * CLINT: Core Local Interrupter
+ */
+typedef struct CLINT_Type_t
+{
+ volatile uint32_t MSIP[5];
+ volatile uint32_t reserved1[(0x4000U - 0x14U)/4U];
+ volatile uint64_t MTIMECMP[5]; /* mtime compare value for each hart. When mtime equals this value, interrupt is generated for particular hart */
+ volatile uint32_t reserved2[((0xbff8U - 0x4028U)/4U)];
+ volatile uint64_t MTIME; /* contains the current mtime value */
+} CLINT_Type;
+
+#define CLINT ((CLINT_Type *)CLINT_BASE)
+
+
+/*==============================================================================
+ * The function raise_soft_interrupt() raises a synchronous software interrupt by
+ * writing into the MSIP register.
+ */
+static inline void raise_soft_interrupt(unsigned long hart_id)
+{
+ /*You need to make sure that the global interrupt is enabled*/
+ /*Note: set_csr(mie, MIP_MSIP) needs to be set on hart you are setting sw interrupt */
+ CLINT->MSIP[hart_id] = 0x01U; /*raise soft interrupt for hart(x) where x== hart ID*/
+ mb();
+}
+
+/*==============================================================================
+ * The function clear_soft_interrupt() clears a synchronous software interrupt by
+ * clearing the MSIP register.
+ */
+static inline void clear_soft_interrupt(void)
+{
+ volatile uint32_t reg;
+ uint64_t hart_id = read_csr(mhartid);
+ CLINT->MSIP[hart_id] = 0x00U; /*clear soft interrupt for hart0*/
+ reg = CLINT->MSIP[hart_id]; /* we read back to make sure it has been written before moving on */
+ /* todo: verify line above guaranteed and best way to achieve result */
+ (void)reg; /* use reg to avoid compiler warning */
+}
+
+/*
+ * return mtime
+ */
+uint64_t readmtime(void);
+
+/**
+ * call once at startup
+ * @return
+ */
+void reset_mtime(void);
+
+/**
+ * Configure system tick
+ * @return SUCCESS or FAIL
+ */
+uint32_t SysTick_Config(void);
+
+/**
+ * Disable system tick interrupt
+ */
+void disable_systick(void);
+
+/*------------------------------------------------------------------------------
+ * RISC-V interrupt handler for machine timer interrupts.
+ */
+void handle_m_timer_interrupt(void);
+
+/**
+ *
+ */
+void handle_m_soft_interrupt(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MSS_CLINT_H */