[PATCH 1/1] platform: Add xiangshan platform

Shaoqing Qin qinshaoqing at bosc.ac.cn
Thu Oct 17 01:04:28 PDT 2024


platform: Add xiangshan platform

Add  the basic configuration for xiangshan platform.

Signed-off-by: Shaoqing Qin <qinshaoqing at bosc.ac.cn>
---
 platform/xiangshan/kmh/Kconfig           |   9 ++
 platform/xiangshan/kmh/configs/defconfig |   0
 platform/xiangshan/kmh/objects.mk        |  28 ++++++
 platform/xiangshan/kmh/platform.c        | 118 +++++++++++++++++++++++
 platform/xiangshan/kmh/platform.h        |  37 +++++++
 5 files changed, 192 insertions(+)
 create mode 100644 platform/xiangshan/kmh/Kconfig
 create mode 100644 platform/xiangshan/kmh/configs/defconfig
 create mode 100644 platform/xiangshan/kmh/objects.mk
 create mode 100644 platform/xiangshan/kmh/platform.c
 create mode 100644 platform/xiangshan/kmh/platform.h

diff --git a/platform/xiangshan/kmh/Kconfig b/platform/xiangshan/kmh/Kconfig
new file mode 100644
index 0000000..b6776f3
--- /dev/null
+++ b/platform/xiangshan/kmh/Kconfig
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: BSD-2-Clause
+
+config PLATFORM_KMH
+	bool
+	select FDT
+	select IPI_MSWI
+	select SERIAL_UART8250
+	select TIMER_MTIMER
+	default y
diff --git a/platform/xiangshan/kmh/configs/defconfig b/platform/xiangshan/kmh/configs/defconfig
new file mode 100644
index 0000000..e69de29
diff --git a/platform/xiangshan/kmh/objects.mk b/platform/xiangshan/kmh/objects.mk
new file mode 100644
index 0000000..8f3e7e1
--- /dev/null
+++ b/platform/xiangshan/kmh/objects.mk
@@ -0,0 +1,28 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC).
+#
+# Authors:
+#   Shaoqing Qin <qinshaoqing at bosc.ac.cn>
+#
+
+# Compiler flags
+platform-cppflags-y =
+platform-cflags-y =
+platform-asflags-y =
+platform-ldflags-y =
+
+# Objects to build
+platform-objs-y += platform.o
+
+# Blobs to build
+FW_DYNAMIC=y
+FW_JUMP=y
+# This needs to be 2MB aligned for 64-bit system
+FW_JUMP_OFFSET=0x400000
+FW_JUMP_FDT_OFFSET=0x200000
+FW_PAYLOAD=y
+# This needs to be 2MB aligned for 64-bit system
+FW_PAYLOAD_OFFSET=0x400000
+FW_PAYLOAD_FDT_OFFSET=$(FW_JUMP_FDT_OFFSET)
diff --git a/platform/xiangshan/kmh/platform.c b/platform/xiangshan/kmh/platform.c
new file mode 100644
index 0000000..9ee037e
--- /dev/null
+++ b/platform/xiangshan/kmh/platform.c
@@ -0,0 +1,118 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC).
+ *
+ * Authors:
+ *   Shaoqing Qin <qinshaoqing at bosc.ac.cn>
+ */
+
+#include <sbi/riscv_asm.h>
+#include <sbi/riscv_encoding.h>
+#include <sbi/sbi_console.h>
+#include <sbi/sbi_const.h>
+#include <sbi/sbi_platform.h>
+#include <sbi/sbi_system.h>
+#include <sbi_utils/fdt/fdt_helper.h>
+#include <sbi_utils/fdt/fdt_fixup.h>
+#include <sbi_utils/ipi/aclint_mswi.h>
+#include <sbi_utils/irqchip/plic.h>
+#include <sbi_utils/timer/aclint_mtimer.h>
+#include <sbi_utils/serial/uart8250.h>
+#include "platform.h"
+
+static u32 generic_hart_index2id[SBI_HARTMASK_MAX_BITS] = {0};
+
+static struct aclint_mswi_data mswi = {
+	.addr = KMH_ACLINT_MSWI_ADDR,
+	.size = ACLINT_MSWI_SIZE,
+	.first_hartid = 0,
+	.hart_count = KMH_HART_COUNT,
+};
+
+static struct aclint_mtimer_data mtimer = {
+	.mtime_freq = KMH_ACLINT_MTIMER_FREQ,
+	.mtime_addr = KMH_ACLINT_MTIMER_ADDR +
+		      ACLINT_DEFAULT_MTIME_OFFSET,
+	.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
+	.mtimecmp_addr = KMH_ACLINT_MTIMER_ADDR +
+			 ACLINT_DEFAULT_MTIMECMP_OFFSET,
+	.mtimecmp_size = ACLINT_DEFAULT_MTIMECMP_SIZE,
+	.first_hartid = 0,
+	.hart_count = KMH_HART_COUNT,
+	.has_64bit_mmio = true,
+};
+
+static int kmh_early_init(bool cold_boot)
+{
+	if (!cold_boot)
+		return 0;
+
+	return uart8250_init(KMH_UART_ADDR,
+			     KMH_UART_FREQ,
+			     KMH_UART_BAUDRATE,
+			     KMH_UART_REG_SHIFT,
+			     KMH_UART_REG_WIDTH,
+			     KMH_UART_REG_OFFSET);
+}
+
+static int kmh_final_init(bool cold_boot)
+{
+	void *fdt;
+
+	if (!cold_boot)
+		return 0;
+
+	fdt = fdt_get_address_rw();
+
+	fdt_cpu_fixup(fdt);
+	fdt_fixups(fdt);
+
+	return 0;
+}
+
+
+static int kmh_ipi_init(bool cold_boot)
+{
+	int ret;
+
+	if (cold_boot) {
+		ret = aclint_mswi_cold_init(&mswi);
+		if (ret)
+			return ret;
+	}
+
+	return aclint_mswi_warm_init();
+}
+
+static int kmh_timer_init(bool cold_boot)
+{
+	int ret;
+
+	if (cold_boot) {
+		ret = aclint_mtimer_cold_init(&mtimer, NULL);
+		if (ret)
+			return ret;
+	}
+
+	return aclint_mtimer_warm_init();
+}
+
+const struct sbi_platform_operations platform_ops = {
+	.early_init	= kmh_early_init,
+	.final_init	= kmh_final_init,
+	.ipi_init  = kmh_ipi_init,
+	.timer_init	   = kmh_timer_init,
+};
+
+const struct sbi_platform platform = {
+	.opensbi_version	= OPENSBI_VERSION,
+	.platform_version   	= SBI_PLATFORM_VERSION(0x0, 0x01),
+	.name			= "kmh",
+	.features		= SBI_PLATFORM_DEFAULT_FEATURES,
+	.hart_count		= KMH_HART_COUNT,
+	.hart_index2id		= generic_hart_index2id,
+	.hart_stack_size	= SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
+	.heap_size		= SBI_PLATFORM_DEFAULT_HEAP_SIZE(KMH_HART_COUNT),
+	.platform_ops_addr	= (unsigned long)&platform_ops
+};
diff --git a/platform/xiangshan/kmh/platform.h b/platform/xiangshan/kmh/platform.h
new file mode 100644
index 0000000..86dee85
--- /dev/null
+++ b/platform/xiangshan/kmh/platform.h
@@ -0,0 +1,37 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
+ *
+ * Authors:
+ *   Shaoqing Qin <qinshaoqing at bosc.ac.cn>
+ */
+#ifndef _KMH_PLATFORM_H_
+#define _KMH_PLATFORM_H_
+
+#include <sbi/riscv_io.h>
+
+#define KMH_HART_COUNT		1
+
+#define KMH_UART_ADDR	  0x310b0000ULL
+#define KMH_UART_FREQ	  50000000
+#define KMH_UART_BAUDRATE  115200
+#define KMH_UART_REG_SHIFT			2
+#define KMH_UART_REG_WIDTH			4
+#define KMH_UART_REG_OFFSET			0
+
+#define KMH_ACLINT_MTIMER_FREQ	500000
+#define KMH_CLK0_FREQ		26000000UL
+#define KMH_PLIC_NUM_SOURCES	65
+
+/* Registers base address */
+#define KMH_SYSCTL_BASE_ADDR	0x50440000ULL
+#define KMH_CLINT_BASE_ADDR	0x38000000ULL
+#define KMH_ACLINT_MSWI_ADDR	\
+		(KMH_CLINT_BASE_ADDR + CLINT_MSWI_OFFSET)
+#define KMH_ACLINT_MTIMER_ADDR \
+		(KMH_CLINT_BASE_ADDR + CLINT_MTIMER_OFFSET)
+#define KMH_PLIC_BASE_ADDR	0x0C000000ULL
+#define KMH_PLIC_BASE_SIZE	(0x200000ULL + (KMH_HART_COUNT * 0x1000))
+
+#endif /* _KMH_PLATFORM_H_ */
-- 
2.43.0


More information about the opensbi mailing list