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