[PATCH] riscv: Add support for BeagleV-Fire

Jamie.Gibbons at microchip.com Jamie.Gibbons at microchip.com
Tue Jan 6 12:55:18 CET 2026


Hi Jan,

Apologies for the delayed response, I was off over the Christmas. Thank
you for your thorough review and for testing the patch on top of U-Boot
next.
On Tue, 2025-12-23 at 01:35 +0100, Jan Kiszka wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
> 
> On 20.12.25 15:56, Jan Kiszka wrote:
> > On 09.12.25 12:45, Jamie Gibbons wrote:
> > > Bring U-Boot support for the BeagleV-Fire by adding a defconfig
> > > and
> > > supporting board files etc.
> > > 
> > > Signed-off-by: Jamie Gibbons <jamie.gibbons at microchip.com>
> > > ---
> > >  arch/riscv/Kconfig                       |   4 +
> > >  board/beagle/beaglev_fire/Kconfig        |  39 ++++++++
> > >  board/beagle/beaglev_fire/MAINTAINERS    |   7 ++
> > >  board/beagle/beaglev_fire/Makefile       |   6 ++
> > >  board/beagle/beaglev_fire/beaglev_fire.c | 117
> > > +++++++++++++++++++++++
> > >  configs/beaglev_fire_defconfig           |  29 ++++++
> > >  include/configs/beaglev_fire.h           |  57 +++++++++++
> > >  7 files changed, 259 insertions(+)
> > >  create mode 100644 board/beagle/beaglev_fire/Kconfig
> > >  create mode 100644 board/beagle/beaglev_fire/MAINTAINERS
> > >  create mode 100644 board/beagle/beaglev_fire/Makefile
> > >  create mode 100644 board/beagle/beaglev_fire/beaglev_fire.c
> > >  create mode 100644 configs/beaglev_fire_defconfig
> > >  create mode 100644 include/configs/beaglev_fire.h
> > > 
> > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> > > index 265b5320777..dd98dee8eab 100644
> > > --- a/arch/riscv/Kconfig
> > > +++ b/arch/riscv/Kconfig
> > > @@ -17,6 +17,9 @@ config TARGET_ANDES_VOYAGER
> > >  config TARGET_BANANAPI_F3
> > >      bool "Support BananaPi F3 Board"
> > > 
> > > +config TARGET_BEAGLEBOARD_BEAGLEVFIRE
> > > +    bool "Support BeagleBoard BeagleV-Fire Board (based on
> > > Microchip MPFS)"
> > > +
> > >  config TARGET_K230_CANMV
> > >      bool "Support K230 CanMV Board"
> > > 
> > > @@ -106,6 +109,7 @@ config SPL_ZERO_MEM_BEFORE_USE
> > >  source "board/andestech/ae350/Kconfig"
> > >  source "board/andestech/voyager/Kconfig"
> > >  source "board/aspeed/ibex_ast2700/Kconfig"
> > > +source "board/beagle/beaglev_fire/Kconfig"
> > >  source "board/canaan/k230_canmv/Kconfig"
> > >  source "board/emulation/qemu-riscv/Kconfig"
> > >  source "board/microchip/mpfs_generic/Kconfig"
> > > diff --git a/board/beagle/beaglev_fire/Kconfig
> > > b/board/beagle/beaglev_fire/Kconfig
> > > new file mode 100644
> > > index 00000000000..279d38b3aa9
> > > --- /dev/null
> > > +++ b/board/beagle/beaglev_fire/Kconfig
> > > @@ -0,0 +1,39 @@
> > > +if TARGET_BEAGLEBOARD_BEAGLEVFIRE
> > > +
> > > +config SYS_BOARD
> > > +    default "beaglev_fire"
> > > +
> > > +config SYS_VENDOR
> > > +    default "beagle"
> > > +
> > > +config SYS_CPU
> > > +    default "mpfs"
> > > +
> > > +config SYS_CONFIG_NAME
> > > +    default "beaglev_fire"
> > > +
> > > +config TEXT_BASE
> > > +    default 0x80000000 if !RISCV_SMODE
> > > +    default 0x80200000 if RISCV_SMODE
> > > +
> > > +config BOARD_SPECIFIC_OPTIONS # dummy
> > > +    def_bool y
> > > +    select MICROCHIP_MPFS
> > > +    select BOARD_EARLY_INIT_F
> > > +    select BOARD_LATE_INIT
> > > +    imply SMP
> > > +    imply CMD_DHCP
> > > +    imply CMD_EXT2
> > > +    imply CMD_EXT4
> > > +    imply CMD_FAT
> > > +    imply CMD_FS_GENERIC
> > > +    imply CMD_NET
> > > +    imply CMD_PING
> > > +    imply CMD_MMC
> > > +    imply DOS_PARTITION
> > > +    imply EFI_PARTITION
> > > +    imply IP_DYN
> > > +    imply ISO_PARTITION
> > > +    imply PHY_LIB
> > > +    imply PHY_VITESSE
> > > +endif
> > > diff --git a/board/beagle/beaglev_fire/MAINTAINERS
> > > b/board/beagle/beaglev_fire/MAINTAINERS
> > > new file mode 100644
> > > index 00000000000..a5dad93ee99
> > > --- /dev/null
> > > +++ b/board/beagle/beaglev_fire/MAINTAINERS
> > > @@ -0,0 +1,7 @@
> > > +BeagleBoard MPFS BeagleV-Fire
> > > +M:  Cyril Jean <cyril.jean at microchip.com>
> > > +M:  Jamie Gibbons <jamie.gibbons at microchip.com>
> > > +S:  Maintained
> > > +F:  board/beagle/beaglev_fire/
> > > +F:  include/configs/beaglev_fire.h
> > > +F:  configs/beaglev_fire_defconfig
> > > \ No newline at end of file
> > > diff --git a/board/beagle/beaglev_fire/Makefile
> > > b/board/beagle/beaglev_fire/Makefile
> > > new file mode 100644
> > > index 00000000000..a4109a8aad4
> > > --- /dev/null
> > > +++ b/board/beagle/beaglev_fire/Makefile
> > > @@ -0,0 +1,6 @@
> > > +# SPDX-License-Identifier: GPL-2.0+
> > > +#
> > > +# Copyright (C) 2023 Microchip Technology Inc.
> > > +#
> > > +
> > > +obj-y       += beaglev_fire.o
> > > \ No newline at end of file
> > > diff --git a/board/beagle/beaglev_fire/beaglev_fire.c
> > > b/board/beagle/beaglev_fire/beaglev_fire.c
> > > new file mode 100644
> > > index 00000000000..b2f18c455b7
> > > --- /dev/null
> > > +++ b/board/beagle/beaglev_fire/beaglev_fire.c
> > > @@ -0,0 +1,117 @@
> > > +// SPDX-License-Identifier: GPL-2.0+
> > > +/*
> > > + * Copyright (C) 2019-2023 Microchip Technology Inc.
> > > + */
> > > +
> > > +#include <dm.h>
> > > +#include <dm/devres.h>
> > > +#include <env.h>
> > > +#include <asm/global_data.h>
> > > +#include <asm/io.h>
> > > +#include <linux/compat.h>
> > > +#include <mpfs-mailbox.h>
> > > +
> > > +DECLARE_GLOBAL_DATA_PTR;
> > > +
> > > +#define MPFS_SYSREG_SOFT_RESET      ((unsigned int *)0x20002088)
> > > +#define PERIPH_RESET_VALUE          0x800001e8u
> > > +
> > > +#if IS_ENABLED(CONFIG_MPFS_SYSCONTROLLER)
> > > +static unsigned char mac_addr[6];
> > > +#endif
> > > +
> > > +int board_init(void)
> > > +{
> > > +    /* For now nothing to do here. */
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +int board_early_init_f(void)
> > > +{
> > > +    unsigned int val;
> > > +
> > > +    /* Reset uart, mmc peripheral */
> > > +    val = readl(MPFS_SYSREG_SOFT_RESET);
> > > +    val = (val & ~(PERIPH_RESET_VALUE));
> > > +    writel(val, MPFS_SYSREG_SOFT_RESET);
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +int board_late_init(void)
> > > +{
> > > +#if IS_ENABLED(CONFIG_MPFS_SYSCONTROLLER)
> > > +    u32 ret;
> > > +    int node;
> > > +    u8 device_serial_number[16] = {0};
> > > +    void *blob = (void *)gd->fdt_blob;
> > > +    struct udevice *dev;
> > > +    struct mpfs_sys_serv *sys_serv_priv;
> > > +
> > > +    ret = uclass_get_device_by_name(UCLASS_MISC,
> > > "syscontroller", &dev);
> > > +    if (ret) {
> > > +            debug("%s: system controller setup failed\n",
> > > __func__);
> > > +            return ret;
> > > +    }
> > > +
> > > +    sys_serv_priv = devm_kzalloc(dev, sizeof(*sys_serv_priv),
> > > GFP_KERNEL);
> > > +    if (!sys_serv_priv)
> > > +            return -ENOMEM;
> > > +
> > > +    sys_serv_priv->dev = dev;
> > > +
> > > +    sys_serv_priv->sys_controller = mpfs_syscontroller_get(dev);
> > > +    ret = IS_ERR(sys_serv_priv->sys_controller);
> > > +    if (ret) {
> > > +            debug("%s:  Failed to register system controller sub
> > > device ret=%d\n", __func__, ret);
> > > +            return -ENODEV;
> > > +    }
> > > +
> > > +    ret = mpfs_syscontroller_read_sernum(sys_serv_priv,
> > > device_serial_number);
> > > +    if (ret) {
> > > +            printf("Cannot read device serial number\n");
> > > +            return -EINVAL;
> > > +    }
> > > +
> > > +    /* Update MAC address with device serial number */
> > > +    mac_addr[0] = 0x00;
> > > +    mac_addr[1] = 0x04;
> > > +    mac_addr[2] = 0xA3;
> > > +    mac_addr[3] = device_serial_number[2];
> > > +    mac_addr[4] = device_serial_number[1];
> > > +    mac_addr[5] = device_serial_number[0];
> > > +
> > > +    node = fdt_path_offset(blob, "/soc/ethernet at 20110000");
> > > +    if (node >= 0) {
> > > +            ret = fdt_setprop(blob, node, "local-mac-address",
> > > mac_addr, 6);
> > > +            if (ret) {
> > > +                    printf("Error setting local-mac-address
> > > property for ethernet at 20110000\n");
> > > +                    return -ENODEV;
> > > +            }
> > > +    }
> > > +
> > > +    mpfs_syscontroller_process_dtbo(sys_serv_priv);
> > > +#endif
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +int ft_board_setup(void *blob, struct bd_info *bd)
> > > +{
> > > +#if IS_ENABLED(CONFIG_MPFS_SYSCONTROLLER)
> > > +    u32 ret;
> > > +    int node;
> > > +
> > > +    node = fdt_path_offset(blob, "/soc/ethernet at 20110000");
> > > +    if (node >= 0) {
> > > +            ret = fdt_setprop(blob, node, "local-mac-address",
> > > mac_addr, 6);
> > > +            if (ret) {
> > > +                    printf("Error setting local-mac-address
> > > property for ethernet at 20110000\n");
> > > +                    return -ENODEV;
> > > +            }
> > > +    }
> > > +#endif
> > > +
> > > +    return 0;
> > > +}
> > > \ No newline at end of file
> > > diff --git a/configs/beaglev_fire_defconfig
> > > b/configs/beaglev_fire_defconfig
> > > new file mode 100644
> > > index 00000000000..c476fb103c5
> > > --- /dev/null
> > > +++ b/configs/beaglev_fire_defconfig
> > > @@ -0,0 +1,29 @@
> > > +CONFIG_RISCV=y
> > > +CONFIG_SYS_MALLOC_LEN=0x800000
> > > +CONFIG_SYS_MALLOC_F_LEN=0x2000
> > > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x80200000
> > > +CONFIG_ENV_SIZE=0x2000
> > > +CONFIG_DEFAULT_DEVICE_TREE="microchip/mpfs-beaglev-fire"
> > > +CONFIG_SYS_PROMPT="RISC-V # "
> > > +CONFIG_OF_LIBFDT_OVERLAY=y
> > > +CONFIG_SYS_LOAD_ADDR=0x80200000
> > > +CONFIG_TARGET_BEAGLEBOARD_BEAGLEVFIRE=y
> > > +CONFIG_ARCH_RV64I=y
> > > +CONFIG_RISCV_SMODE=y
> > > +CONFIG_FIT=y
> > > +CONFIG_OF_BOARD_SETUP=y
> > > +CONFIG_DISTRO_DEFAULTS=y
> > > +CONFIG_DISPLAY_CPUINFO=y
> > > +CONFIG_DISPLAY_BOARDINFO=y
> > > +CONFIG_SYS_CBSIZE=256
> > > +CONFIG_SYS_PBSIZE=282
> > > +CONFIG_SYS_BOOTM_LEN=0x4000000
> > > +CONFIG_OVERWRITE_ETHADDR_ONCE=y
> > > +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> > > +CONFIG_BOOTP_SEND_HOSTNAME=y
> > > +CONFIG_SYSRESET=y
> > > +CONFIG_MPFS_GPIO=y
> > > +CONFIG_CMD_GPIO=y
> > > +CONFIG_DM_GPIO=y
> > > +CONFIG_MMC_SPI=y
> > 
> > I think you are missing CONFIG_OF_UPSTREAM=y. I applied this on top
> > of
> > next and only got things compiling after turning it manually on.
> > 
> 
> And another issue: CONFIG_DEFAULT_FDT_FILE is missing, leaving
> fdtfile
> uninitialized which means that distro_boot is incomplete.
> 
You are correct, both of these configs are missing from the defconfig.
I am not quite sure how I managed to miss those in creation of this
patch, thanks for catching that.
> > > diff --git a/include/configs/beaglev_fire.h
> > > b/include/configs/beaglev_fire.h
> > > new file mode 100644
> > > index 00000000000..e3ee0f02f2d
> > > --- /dev/null
> > > +++ b/include/configs/beaglev_fire.h
> > > @@ -0,0 +1,57 @@
> > > +/* SPDX-License-Identifier: GPL-2.0+ */
> > > +/*
> > > + * Copyright (C) 2023 Microchip Technology Inc.
> > > + */
> > > +
> > > +#ifndef __CONFIG_H
> > > +#define __CONFIG_H
> > > +
> > > +#include <linux/sizes.h>
> > > +
> > > +#define CFG_SYS_SDRAM_BASE       0x80000000
> > > +
> > > +/* Environment options */
> > > +
> > > +#if defined(CONFIG_CMD_DHCP)
> > > +#define BOOT_TARGET_DEVICES_DHCP(func)      func(DHCP, dhcp, na)
> > > +#else
> > > +#define BOOT_TARGET_DEVICES_DHCP(func)
> > > +#endif
> > > +
> > > +#if defined(CONFIG_CMD_MMC)
> > > +#define BOOT_TARGET_DEVICES_MMC(func)       func(MMC, mmc, 0)
> > > +#else
> > > +#define BOOT_TARGET_DEVICES_MMC(func)
> > > +#endif
> > > +
> > > +#define BOOT_TARGET_DEVICES(func) \
> > > +    BOOT_TARGET_DEVICES_MMC(func)\
> > > +    BOOT_TARGET_DEVICES_DHCP(func)
> > > +
> > > +#define BOOTENV_DESIGN_OVERLAYS \
> > > +    "design_overlays=" \
> > > +    "if test -n ${no_of_overlays}; then " \
> > > +            "setenv inc 1; " \
> > > +            "setenv idx 0; " \
> > > +            "fdt resize ${dtbo_size}; " \
> > > +            "while test $idx -ne ${no_of_overlays}; do " \
> > > +                    "setenv dtbo_name dtbo_image${idx}; " \
> > > +                    "setenv fdt_cmd \"fdt apply $\"$dtbo_name; "
> > > \
> > > +                    "run fdt_cmd; " \
> > > +                    "setexpr idx $inc + $idx; " \
> > > +            "done; " \
> > > +    "fi;\0 " \
> > > +
> > > +#include <config_distro_bootcmd.h>
> > > +
> > > +#define CFG_EXTRA_ENV_SETTINGS \
> > > +    "bootm_size=0x10000000\0" \
> > > +    "kernel_addr_r=0x80200000\0" \
> > > +    "fdt_addr_r=0x8a000000\0" \
> > > +    "fdtoverlay_addr_r=0x8a080000\0" \
> > > +    "ramdisk_addr_r=0x8aa00000\0" \
> > > +    "scriptaddr=0x8e000000\0" \
> > > +    BOOTENV_DESIGN_OVERLAYS \
> > > +    BOOTENV \
> > > +
> > > +#endif /* __CONFIG_H */
> > 
> > No luck with booting next(29ab19c2bead)+this yet, though. No output
> > after
> > 
> > [9.356454] Boot image set name: "PolarFire-SoC-HSS::U-Boot"
> > 
> 
> This is probably some regression when using u-boot next.
> 
> > Am I missing dependencies?
> > 
> 
> I have now this queue on top of v2026.01-rc5:
> 
> riscv: Add support for BeagleV-Fire
> riscv: mpfs: move SoC level options to the CPU Kconfig
> riscv: create a custom CPU implementation for PolarFire SoC
> 
> With this (and the config fixes above), upstream U-Boot finally
> starts.
Apologies, I got ahead of myself. When I sent this patch the above two
patches I sent had not yet been merged. They are now both merged to
next & master.

Thanks again for your feedback and for sharing your working queue.
Should you need me to send a v2 to add the missing two configs or have
any other issues please let me know, however, with the addition of the
two configs, this should now be good to go.

Thanks again,
Jamie.
> Apologies, I got ahead of myself. When I sent this patch the above
> two additional patches I sent had not yet been merged. They are now
> both merged to next & master.

> Also UEFI is working while it is broken with downstream
> linux4microchip+fpga-2025.10 which caused a lot of confusion to me
> regarding the upstream kernel status of the PolarFire.
> 
> Jan
> 
> --
> Siemens AG, Foundational Technologies
> Linux Expert Center



More information about the U-Boot mailing list