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 <[email protected]>
>> ---
>>  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 <[email protected]>
>> +M:  Jamie Gibbons <[email protected]>
>> +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@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@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@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@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.

>> 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.
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

Reply via email to