From c2f23cc6edd7ee2dc6a07991312d44233080ae6b Mon Sep 17 00:00:00 2001
From: James Clarke <jrtc27@jrtc27.com>
Date: Sat, 1 Feb 2020 01:07:51 +0000
Subject: platform: Add Spike initial support

This patch adds initial platform support Spike emulator.

Signed-off-by: James Clarke <jrtc27@jrtc27.com>
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
---
 platform/spike/config.mk  |  36 +++++++++++++++
 platform/spike/objects.mk |   7 +++
 platform/spike/platform.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 158 insertions(+)
 create mode 100644 platform/spike/config.mk
 create mode 100644 platform/spike/objects.mk
 create mode 100644 platform/spike/platform.c

(limited to 'platform')

diff --git a/platform/spike/config.mk b/platform/spike/config.mk
new file mode 100644
index 0000000..4bde3fd
--- /dev/null
+++ b/platform/spike/config.mk
@@ -0,0 +1,36 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2020 Western Digital Corporation or its affiliates.
+#
+
+# Compiler flags
+platform-cppflags-y =
+platform-cflags-y =
+platform-asflags-y =
+platform-ldflags-y =
+
+# Command for platform specific "make run"
+platform-runcmd = spike \
+  $(build_dir)/platform/spike/firmware/fw_payload.elf
+
+# Blobs to build
+FW_TEXT_START=0x80000000
+FW_JUMP=y
+ifeq ($(PLATFORM_RISCV_XLEN), 32)
+  # This needs to be 4MB aligned for 32-bit system
+  FW_JUMP_ADDR=0x80400000
+else
+  # This needs to be 2MB aligned for 64-bit system
+  FW_JUMP_ADDR=0x80200000
+endif
+FW_JUMP_FDT_ADDR=0x82200000
+FW_PAYLOAD=y
+ifeq ($(PLATFORM_RISCV_XLEN), 32)
+  # This needs to be 4MB aligned for 32-bit system
+  FW_PAYLOAD_OFFSET=0x400000
+else
+  # This needs to be 2MB aligned for 64-bit system
+  FW_PAYLOAD_OFFSET=0x200000
+endif
+FW_PAYLOAD_FDT_ADDR=0x82200000
diff --git a/platform/spike/objects.mk b/platform/spike/objects.mk
new file mode 100644
index 0000000..30a3c4f
--- /dev/null
+++ b/platform/spike/objects.mk
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2020 Western Digital Corporation or its affiliates.
+#
+
+platform-objs-y += platform.o
diff --git a/platform/spike/platform.c b/platform/spike/platform.c
new file mode 100644
index 0000000..c0f93e2
--- /dev/null
+++ b/platform/spike/platform.c
@@ -0,0 +1,115 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2020 Western Digital Corporation or its affiliates.
+ */
+
+#include <sbi/sbi_platform.h>
+#include <sbi_utils/sys/htif.h>
+#include <sbi_utils/sys/clint.h>
+
+/* clang-format off */
+
+#define SPIKE_HART_COUNT			8
+#define SPIKE_HART_STACK_SIZE			8192
+
+#define SPIKE_CLINT_ADDR			0x2000000
+
+/* clang-format on */
+
+static int spike_final_init(bool cold_boot)
+{
+	return 0;
+}
+
+static u32 spike_pmp_region_count(u32 hartid)
+{
+	return 1;
+}
+
+static int spike_pmp_region_info(u32 hartid, u32 index, ulong *prot, ulong *addr,
+				ulong *log2size)
+{
+	int ret = 0;
+
+	switch (index) {
+	case 0:
+		*prot	  = PMP_R | PMP_W | PMP_X;
+		*addr	  = 0;
+		*log2size = __riscv_xlen;
+		break;
+	default:
+		ret = -1;
+		break;
+	};
+
+	return ret;
+}
+
+static int spike_console_init(void)
+{
+	return 0;
+}
+
+static int spike_irqchip_init(bool cold_boot)
+{
+	return 0;
+}
+
+static int spike_ipi_init(bool cold_boot)
+{
+	int ret;
+
+	if (cold_boot) {
+		ret = clint_cold_ipi_init(SPIKE_CLINT_ADDR,
+					  SPIKE_HART_COUNT);
+		if (ret)
+			return ret;
+	}
+
+	return clint_warm_ipi_init();
+}
+
+static int spike_timer_init(bool cold_boot)
+{
+	int rc;
+
+	if (cold_boot) {
+		rc = clint_cold_timer_init(SPIKE_CLINT_ADDR,
+					   SPIKE_HART_COUNT, TRUE);
+		if (rc)
+			return rc;
+	}
+
+	return clint_warm_timer_init();
+}
+
+const struct sbi_platform_operations platform_ops = {
+	.pmp_region_count	= spike_pmp_region_count,
+	.pmp_region_info	= spike_pmp_region_info,
+	.final_init		= spike_final_init,
+	.console_putc		= htif_putc,
+	.console_getc		= htif_getc,
+	.console_init		= spike_console_init,
+	.irqchip_init		= spike_irqchip_init,
+	.ipi_send		= clint_ipi_send,
+	.ipi_clear		= clint_ipi_clear,
+	.ipi_init		= spike_ipi_init,
+	.timer_value		= clint_timer_value,
+	.timer_event_stop	= clint_timer_event_stop,
+	.timer_event_start	= clint_timer_event_start,
+	.timer_init		= spike_timer_init,
+	.system_reboot		= htif_system_down,
+	.system_shutdown	= htif_system_down
+};
+
+const struct sbi_platform platform = {
+	.opensbi_version	= OPENSBI_VERSION,
+	.platform_version	= SBI_PLATFORM_VERSION(0x0, 0x01),
+	.name			= "Spike",
+	.features		= SBI_PLATFORM_DEFAULT_FEATURES,
+	.hart_count		= SPIKE_HART_COUNT,
+	.hart_stack_size	= SPIKE_HART_STACK_SIZE,
+	.disabled_hart_mask	= 0,
+	.platform_ops_addr	= (unsigned long)&platform_ops
+};
-- 
cgit v1.2.3