summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/sifive/fu540/Makefile.inc2
-rw-r--r--src/soc/sifive/fu540/clint.c32
-rw-r--r--src/soc/sifive/fu540/include/soc/addressmap.h1
-rw-r--r--src/soc/sifive/fu540/include/soc/clint.h (renamed from src/soc/sifive/fu540/mtime.c)14
4 files changed, 42 insertions, 7 deletions
diff --git a/src/soc/sifive/fu540/Makefile.inc b/src/soc/sifive/fu540/Makefile.inc
index abd3458b28..677731a8af 100644
--- a/src/soc/sifive/fu540/Makefile.inc
+++ b/src/soc/sifive/fu540/Makefile.inc
@@ -14,7 +14,7 @@
ifeq ($(CONFIG_SOC_SIFIVE_FU540),y)
bootblock-y += uart.c
-bootblock-y += mtime.c
+bootblock-y += clint.c
bootblock-y += media.c
bootblock-y += bootblock.c
diff --git a/src/soc/sifive/fu540/clint.c b/src/soc/sifive/fu540/clint.c
new file mode 100644
index 0000000000..00aec1ab37
--- /dev/null
+++ b/src/soc/sifive/fu540/clint.c
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2018 HardenedLinux
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <mcall.h>
+#include <arch/io.h>
+#include <soc/addressmap.h>
+#include <soc/clint.h>
+
+void mtime_init(void)
+{
+ long hart_id = read_csr(mhartid);
+ HLS()->time = (uint64_t *)(FU540_CLINT + 0xbff8);
+ HLS()->timecmp = (uint64_t *)(FU540_CLINT + 0x4000 + 8 * hart_id);
+}
+
+void set_msip(int hartid, int val)
+{
+ long hart_id = read_csr(mhartid);
+ write32((void *)(FU540_CLINT + 4 * hart_id), !!val);
+}
diff --git a/src/soc/sifive/fu540/include/soc/addressmap.h b/src/soc/sifive/fu540/include/soc/addressmap.h
index 904c8b6589..0de1423ae2 100644
--- a/src/soc/sifive/fu540/include/soc/addressmap.h
+++ b/src/soc/sifive/fu540/include/soc/addressmap.h
@@ -15,6 +15,7 @@
#define FU540_MSEL 0x00001000
#define FU540_DTIM 0x01000000
+#define FU540_CLINT 0x02000000
#define FU540_L2LIM 0x08000000
#define FU540_UART0 0x10010000
#define FU540_UART(x) (FU540_UART0 + 0x1000 * (x))
diff --git a/src/soc/sifive/fu540/mtime.c b/src/soc/sifive/fu540/include/soc/clint.h
index f8c2717563..d2399c220a 100644
--- a/src/soc/sifive/fu540/mtime.c
+++ b/src/soc/sifive/fu540/include/soc/clint.h
@@ -13,10 +13,12 @@
* GNU General Public License for more details.
*/
-#include <mcall.h>
+#ifndef __SOC_SIFIVE_FU540_CLINT_H
+#define __SOC_SIFIVE_FU540_CLINT_H
-/* FIXME: This is an empty implementation, please improve */
-/* This function is used to initialize HLS()->time/HLS()->timecmp */
-void mtime_init(void)
-{
-}
+/* This function is used to set MSIP.
+ * It can be used to send an IPI (inter-processor interrupt) to
+ * another hart*/
+void set_msip(int hartid, int val);
+
+#endif