Re: New RISCV board (cartesi-machine)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 15, 2021 at 6:58 PM Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> wrote:
>
> Hello Marcelo,
>
> On 15.09.21 23:43, Marcelo Politzer wrote:
> > On Wed, Sep 15, 2021 at 6:17 PM Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> wrote:
> >>
> >> Hello Marcelo,
> >>
> >> On 15.09.21 22:30, Marcelo Politzer wrote:
> >>> Hi, I'm new to barebox
> >>>
> >>> I'm currently porting barebox to a riscv board (cartesi-machine).
> >>
> >> Oh, looks interesting! What SoC does it use?
> >
> > It uses SOC_VIRT. It is an emulator to be precise, we use it for
> > verifiable computations.
> > It is pretty easy to try it out (there is a docker image for it):
> > https://www.cartesi.io/en/docs/machine/host/overview/
>
> Thanks, will check it out.
>
> >>> I got it mostly working:
> >>> - new serial: serial_sbi.c and
> >>
> >> Keep in mind that newer SBI versions deprecate
> >> sbi_console_getchar() and sbi_console_putchar() with no replacement.
> >>
> >> But if your board's firmware provides it, there is no issue with
> >> adding a driver for it.
> >
> > That is what the emulator implements for now.
> > I have to admit that a virtio system would be cool, maybe in the future.
>
> Like this? :-)
>
> https://www.barebox.org/jsbarebox/

That is cool!

>
> >>> - ext4 filesystem with mtdram
> >>>
> >>> 1) What I am still trying to figure out is how to customize `env` correctly.
> >>> I got it to build and appear based on the docs [1], [2],
> >>
> >> Those look ok. I assume you have
> >>
> >> defaultenv_append_directory(defaultenv_cartesi); in your board code?
> >
> > yes
> >
> >>
> >>> however the only way I found around [3] was to replace `bin/init` with
> >>> this[4] layout.
> >>
> >> After drivers probe, barebox invokes init to source init scripts and
> >> do the countdown and such. This is written in C, but you can override
> >> it with an /env/bin/init shell script, which is what you did here.
> >>
> >> I would not recommend this. Drop /env/bin/init and use the same C init
> >> nearly everyone else does. You can still customize it via the
> >> /env/init/ scripts
> >>
> >>> Is there a recommended way to go about this?
> >>
> >> You need to set boot.default, e.g.
> >>
> >> echo 'cartesi net' > defaultenv-cartesi/nv/boot.default
> >>
> >> Which would try cartesi first and then net if the first one failed.
> >
> > That worked great.
> > Looks a lot cleaner now.
> >
> >>
> >>> 2) I also would like clarification on the upstreaming process, is it
> >>> PR based, patches on this list?
> >>
> >> Patches to the mailing list are the usual way of contributing.
> >
> > OK, I'll clean this up and send it as two patches:
> > - serial_sbi
> > - cartesi (board)
>
> Sounds good.

Patches attached, please review at your convenience.

>
> Cheers,
> Ahmad
>
> >
> >>
> >> Cheers,
> >> Ahmad
> >>
> >>>
> >>> best,
> >>> Marcelo
> >>>
> >>>
> >>> [1] Makefile:
> >>> ```
> >>> bbenv-$(CONFIG_BOARD_CARTESI) += defaultenv-cartesi
> >>> ```
> >>>
> >>> [2] arch/riscv/boards/cartesi:
> >>> ```
> >>> defaultenv-cartesi
> >>> ├── boot
> >>> │   └── cartesi
> >>> ├── init
> >>> │   ├── automount
> >>> │   └── ps1
> >>> └── nv
> >>>     ├── allow_color
> >>>     ├── autoboot_timeout
> >>>     └── user
> >>> ```
> >>>
> >>> [3]
> >>> ```
> >>> Hit m for menu or any to stop autoboot:    0
> >>> Booting entry 'net'
> >>> ```
> >>>
> >>> [4]
> >>> ```
> >>> defaultenv-cartesi
> >>> ├── bin
> >>> │   └── init
> >>> └── boot
> >>>     └── cartesi
> >>> ```
> >>>
> >>> _______________________________________________
> >>> barebox mailing list
> >>> barebox@xxxxxxxxxxxxxxxxxxx
> >>> http://lists.infradead.org/mailman/listinfo/barebox
> >>>
> >>
> >>
> >> --
> >> Pengutronix e.K.                           |                             |
> >> Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
> >> 31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
> >> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
> >
>
>
> --
> Pengutronix e.K.                           |                             |
> Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
> 31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
From f4a3cf20582dec08fd2b02b62ce864fcae7bb038 Mon Sep 17 00:00:00 2001
From: Marcelo Politzer <marcelo.politzer@xxxxxxxxxx>
Date: Thu, 16 Sep 2021 14:33:17 -0300
Subject: [PATCH 2/2] RISC-V: cartesi: Initial port

---
 arch/riscv/Kconfig.socs                       |  7 +++++
 arch/riscv/boards/Makefile                    |  1 +
 arch/riscv/boards/cartesi/Makefile            |  2 ++
 arch/riscv/boards/cartesi/board.c             | 28 +++++++++++++++++++
 .../cartesi/defaultenv-cartesi/boot/cartesi   |  3 ++
 .../cartesi/defaultenv-cartesi/init/automount |  6 ++++
 .../defaultenv-cartesi/nv/autoboot_timeout    |  1 +
 .../defaultenv-cartesi/nv/boot.default        |  1 +
 arch/riscv/configs/cartesi_defconfig          | 15 ++++++++++
 9 files changed, 64 insertions(+)
 create mode 100644 arch/riscv/boards/cartesi/Makefile
 create mode 100644 arch/riscv/boards/cartesi/board.c
 create mode 100755 arch/riscv/boards/cartesi/defaultenv-cartesi/boot/cartesi
 create mode 100644 arch/riscv/boards/cartesi/defaultenv-cartesi/init/automount
 create mode 100644 arch/riscv/boards/cartesi/defaultenv-cartesi/nv/autoboot_timeout
 create mode 100644 arch/riscv/boards/cartesi/defaultenv-cartesi/nv/boot.default
 create mode 100644 arch/riscv/configs/cartesi_defconfig

diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs
index 221ea133d..12e8e04fc 100644
--- a/arch/riscv/Kconfig.socs
+++ b/arch/riscv/Kconfig.socs
@@ -22,6 +22,13 @@ config SOC_VIRT
 	  Generates an image tht can be be booted by QEMU. The image is called
 	  barebox-dt-2nd.img
 
+config BOARD_CARTESI
+	bool "Cartesi Machine"
+	select SOC_VIRT
+	help
+	  Generates an image tht can be be booted by a cartesi-machine. The
+	  image is called barebox-dt-2nd.img
+
 config CPU_SIFIVE
 	bool
 	select HAS_CACHE
diff --git a/arch/riscv/boards/Makefile b/arch/riscv/boards/Makefile
index cb28a25d8..cee3d2e27 100644
--- a/arch/riscv/boards/Makefile
+++ b/arch/riscv/boards/Makefile
@@ -2,3 +2,4 @@
 obj-$(CONFIG_BOARD_ERIZO_GENERIC)	+= erizo/
 obj-$(CONFIG_BOARD_HIFIVE)		+= hifive/
 obj-$(CONFIG_BOARD_BEAGLEV)		+= beaglev/
+obj-$(CONFIG_BOARD_CARTESI)		+= cartesi/
diff --git a/arch/riscv/boards/cartesi/Makefile b/arch/riscv/boards/cartesi/Makefile
new file mode 100644
index 000000000..0e3453178
--- /dev/null
+++ b/arch/riscv/boards/cartesi/Makefile
@@ -0,0 +1,2 @@
+obj-$(CONFIG_BOARD_CARTESI) += board.o
+bbenv-$(CONFIG_BOARD_CARTESI) += defaultenv-cartesi
diff --git a/arch/riscv/boards/cartesi/board.c b/arch/riscv/boards/cartesi/board.c
new file mode 100644
index 000000000..a1a33c8d8
--- /dev/null
+++ b/arch/riscv/boards/cartesi/board.c
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2021 Marcelo Politzer, Cartesi
+ */
+
+#include <common.h>
+#include <driver.h>
+#include <bbu.h>
+#include <envfs.h>
+
+static int cartesi_probe(struct device_d *dev)
+{
+	barebox_set_hostname("cartesi");
+	defaultenv_append_directory(defaultenv_cartesi);
+	return 0;
+}
+
+static const struct of_device_id cartesi_of_match[] = {
+	{ .compatible = "ucbbar,riscvemu-bar_dev" },
+	{ /* sentinel */ },
+};
+
+static struct driver_d cartesi_board_driver = {
+	.name = "board-cartesi",
+	.probe = cartesi_probe,
+	.of_compatible = cartesi_of_match,
+};
+device_platform_driver(cartesi_board_driver);
diff --git a/arch/riscv/boards/cartesi/defaultenv-cartesi/boot/cartesi b/arch/riscv/boards/cartesi/defaultenv-cartesi/boot/cartesi
new file mode 100755
index 000000000..b175ff556
--- /dev/null
+++ b/arch/riscv/boards/cartesi/defaultenv-cartesi/boot/cartesi
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+global.bootm.image=/mnt/rootfs/boot/Image
diff --git a/arch/riscv/boards/cartesi/defaultenv-cartesi/init/automount b/arch/riscv/boards/cartesi/defaultenv-cartesi/init/automount
new file mode 100644
index 000000000..362ec68ed
--- /dev/null
+++ b/arch/riscv/boards/cartesi/defaultenv-cartesi/init/automount
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# mtdram0
+mkdir -p /mnt/rootfs
+automount -d /mnt/rootfs 'mount -t ext4 /dev/mtdram0 /mnt/rootfs'
+
diff --git a/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/autoboot_timeout b/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/autoboot_timeout
new file mode 100644
index 000000000..573541ac9
--- /dev/null
+++ b/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/autoboot_timeout
@@ -0,0 +1 @@
+0
diff --git a/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/boot.default b/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/boot.default
new file mode 100644
index 000000000..98698769f
--- /dev/null
+++ b/arch/riscv/boards/cartesi/defaultenv-cartesi/nv/boot.default
@@ -0,0 +1 @@
+cartesi net
diff --git a/arch/riscv/configs/cartesi_defconfig b/arch/riscv/configs/cartesi_defconfig
new file mode 100644
index 000000000..79a7a9b42
--- /dev/null
+++ b/arch/riscv/configs/cartesi_defconfig
@@ -0,0 +1,15 @@
+# minimal
+CONFIG_ARCH_RV64I=y
+CONFIG_BOARD_CARTESI=y
+CONFIG_BOOTM_ELF=y
+CONFIG_CMD_AUTOMOUNT=y
+CONFIG_CMD_BOOT=y
+CONFIG_FS_EXT4=y
+CONFIG_MTD=y
+CONFIG_MTD_MTDRAM=y
+CONFIG_SERIAL_SBI=y
+CONFIG_SOC_VIRT=y
+
+# convenience
+CONFIG_CMD_READLINE=y
+CONFIG_HUSH_FANCY_PROMPT=y
-- 
2.32.0

From 5953062ce13c4b07190d455d2aae228cd3756d42 Mon Sep 17 00:00:00 2001
From: Marcelo Politzer <marcelo.politzer@xxxxxxxxxx>
Date: Thu, 16 Sep 2021 14:29:51 -0300
Subject: [PATCH 1/2] serial: implement SBI UART support

---
 arch/riscv/lib/sbi.c        | 11 ++++++
 drivers/serial/Kconfig      |  7 ++++
 drivers/serial/Makefile     |  1 +
 drivers/serial/serial_sbi.c | 77 +++++++++++++++++++++++++++++++++++++
 4 files changed, 96 insertions(+)
 create mode 100644 drivers/serial/serial_sbi.c

diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c
index 45a04fb82..209069c98 100644
--- a/arch/riscv/lib/sbi.c
+++ b/arch/riscv/lib/sbi.c
@@ -64,3 +64,14 @@ static int sbi_init(void)
 
 }
 core_initcall(sbi_init);
+
+
+void sbi_console_putchar(int ch)
+{
+	sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch, 0, 0, 0, 0, 0);
+}
+
+int sbi_console_getchar(void)
+{
+	return sbi_ecall(SBI_EXT_0_1_CONSOLE_GETCHAR, 0, 0, 0, 0, 0, 0, 0).error;
+}
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index b9750d177..002871445 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -173,4 +173,11 @@ config SERIAL_SIFIVE
 	  contains a SiFive UART IP block.  This type of UART is present on
 	  SiFive FU540 SoCs, among others.
 
+config SERIAL_SBI
+	tristate "RISCV SBI UART support"
+	depends on OFDEVICE
+	help
+	  Select this option if you are building barebox for a RISCV with SBI
+	  version 0.1.0 (legacy mode) implemented
+
 endmenu
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 5120b1737..b1de436ed 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -24,3 +24,4 @@ obj-$(CONFIG_DRIVER_SERIAL_DIGIC)		+= serial_digic.o
 obj-$(CONFIG_DRIVER_SERIAL_LPUART)		+= serial_lpuart.o
 obj-$(CONFIG_VIRTIO_CONSOLE)			+= virtio_console.o
 obj-$(CONFIG_SERIAL_SIFIVE)			+= serial_sifive.o
+obj-$(CONFIG_SERIAL_SBI)			+= serial_sbi.o
diff --git a/drivers/serial/serial_sbi.c b/drivers/serial/serial_sbi.c
new file mode 100644
index 000000000..a7e57885f
--- /dev/null
+++ b/drivers/serial/serial_sbi.c
@@ -0,0 +1,77 @@
+#define DEBUG
+#define DBG() printf("%s:%s:%d\n", __FILE__, __func__, __LINE__)
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Anup Patel <anup@xxxxxxxxxxxxxx>
+ */
+
+#include <common.h>
+#include <driver.h>
+#include <malloc.h>
+#include <io.h>
+#include <of.h>
+#include <asm/sbi.h>
+
+struct sbi_serial_priv {
+	struct console_device cdev;
+	uint8_t b[16], head, tail;
+};
+
+#define to_priv(cdev) container_of(cdev, struct sbi_serial_priv, cdev)
+
+static int sbi_serial_getc(struct console_device *cdev)
+{
+	struct sbi_serial_priv *priv = cdev->dev->priv;
+	if (priv->head == priv->tail)
+		return 0;
+	return priv->b[priv->head++ & 0xf];
+}
+
+static void sbi_serial_putc(struct console_device *cdev, const char ch)
+{
+	sbi_console_putchar(ch);
+}
+
+static int sbi_serial_tstc(struct console_device *cdev)
+{
+	struct sbi_serial_priv *priv = cdev->dev->priv;
+	int c = sbi_console_getchar();
+
+	if (c != -1)
+		priv->b[priv->tail++ & 0xf] = c;
+	return priv->head != priv->tail;
+}
+static void sbi_serial_flush(struct console_device *cdev)
+{
+}
+static int sbi_serial_setbrg(struct console_device *cdev, int _)
+{
+	return 0;
+}
+
+static int sbi_serial_probe(struct device_d *dev)
+{
+	struct sbi_serial_priv *priv;
+
+	dev->priv = priv = xzalloc(sizeof(*priv));
+	priv->cdev.dev = dev;
+	priv->cdev.putc   = sbi_serial_putc;
+	priv->cdev.getc   = sbi_serial_getc;
+	priv->cdev.tstc   = sbi_serial_tstc;
+	priv->cdev.flush  = sbi_serial_flush;
+	priv->cdev.setbrg = sbi_serial_setbrg;
+
+	return console_register(&priv->cdev);
+}
+
+static __maybe_unused struct of_device_id sbi_serial_dt_ids[] = {
+	{ .compatible = "ucb,htif0" },
+	{ /* sentinel */ }
+};
+
+static struct driver_d serial_sbi_driver = {
+	.name   = "serial_sbi",
+	.probe  = sbi_serial_probe,
+	.of_compatible = sbi_serial_dt_ids,
+};
+console_platform_driver(serial_sbi_driver);
-- 
2.32.0

_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox

[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux