[PATCH] riscv: Add support for BeagleV-Fire
Jan Kiszka
jan.kiszka at siemens.com
Tue Jan 6 14:57:08 CET 2026
On 06.01.26 12:55, Jamie.Gibbons at microchip.com wrote:
> 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.
The 2 configs switches should go into the defconfig. So, if this patch
is not yet queued (which seems to be so), I would recommend sending v2
with those included.
BTW, our CIP Debian image with all bits glued together is staged at [1].
U-Boot build is described in [2].
Thanks,
Jan
[1]
https://gitlab.com/cip-project/cip-core/isar-cip-core/-/commits/wip/beaglev-fire?ref_type=heads
[2]
https://gitlab.com/cip-project/cip-core/isar-cip-core/-/commit/c2522a186e52da32551d71d32cf5d5bd1a5077c3
--
Siemens AG, Foundational Technologies
Linux Expert Center
More information about the U-Boot
mailing list