configs/beaglev_fire: add support for BeagleV Fire

Add support for the BeagleV Fire, the Beagleboard SBC powered by
Microchip's PolarFire SoC.

The configuration file is beaglev_fire_defconfig. It builds a
bootable kernel image with an embedded root file system. The image
built can be flashed to the board using the eMMC.

The yaml configuration file is used by the hss payload generator. It
maps the ELF binaries or binary blobs to the application hart.

The image generator script sets the partitions of the image.

The image tree souce file creates a FIT image.

The post image script creates the payload using the payload generator
host package and finally, creates the FIT image using the ITS after the
kernel build. It also creates the BMAP file for use with the BMAP
command line tool to transfer the image to the board.

The U-Boot script and additional U-Boot configurations ensure that
U-Boot behaves as expected for the BeagleV-Fire and boots the FIT image.

The rootfs-overlay contains script for updating the BeagleV-Fire
gateware.

The README.txt documents how to build and boot the Beagle-V Fire with
this configuration. It also explains how to program a custom bitstream.

Signed-off-by: Jamie Gibbons <jamie.gibbons@microchip.com>
Reviewed-by: Valentina Fernandez <valentina.fernandezalanis@microchip.com>
[Romain:
  - move board files to board/beagleboard directory
  - enable BR2_DOWNLOAD_FORCE_CHECK_HASHES and add hashes files
  - enable BR2_KERNEL_HEADERS_AS_KERNEL for linux-headers to avoid specify
    BR2_DEFAULT_KERNEL_VERSION
  - add BR2_PACKAGE_HOST_DOSFSTOOLS for mkdosfs (host variant)
]
Signed-off-by: Romain Naour <romain.naour@smile.fr>
This commit is contained in:
Jamie Gibbons
2024-06-18 09:05:04 +01:00
committed by Romain Naour
parent 9954315fc5
commit 92a8ad923e
13 changed files with 356 additions and 0 deletions

View File

@@ -1500,7 +1500,9 @@ F: package/swaybg/
F: package/yad/
N: Jamie Gibbons <jamie.gibbons@microchip.com>
F: board/beagleboard/beaglev_fire/
F: board/microchip/mpfs_icicle/
F: configs/beaglev_fire_defconfig
F: configs/microchip_mpfs_icicle_defconfig
F: package/microchip-hss-payload-generator/

View File

@@ -0,0 +1,134 @@
Beagle-V Fire
==============
BeagleV Fire is a low-cost RISC-V 64-bit based platform, powered by
Microchip's PolarFire SoC. This file describes how to use the
pre-defined Buildroot configuration for the Beagle-V Fire board.
Further information about the Beagle-V Fire can be found at
https://docs.beagleboard.org/latest/boards/beaglev/fire/index.html.
Building
========
Configure Buildroot using the default board configuration:
'$ make beaglev_fire_defconfig'
Customise the build as necessary:
'$ make menuconfig'
Start the build:
'$ make'
Result of the build
===================
Once the build has finished you will have the following files:
output/images/
+-- boot.scr
+-- boot.vfat
+-- Image
+-- Image.gz
+-- beaglev_fire.itb
+-- beaglev_fire.its
+-- mpfs-beaglev-fire.dtb
+-- payload.bin
+-- rootfs.ext2
+-- rootfs.ext4
+-- rootfs.tar
+-- sdcard.img
+-- u-boot.bin
Flashing the image to your eMMC
===============================
By default Buildroot builds an image suitable for the eMMC. The first partition
of this image contains a U-Boot binary, embedded in a Hart Software Services
(HSS) payload. The second partition contains a FAT filesystem with a U-Boot env
and an ITB file containing the kernel and the device tree. The third partition
contains the file system. This image can be written directly to the eMMC.
To do so, follow the below steps:
1. Connect to BeagleV-Fire UART debug port using a 3.3v USB to UART bridge.
2. Now you can run `tio <port>` in a terminal window to access the UART debug
port connection.
e.g `tio /dev/ttyUSB4`
3. Once you are connected properly, you can press the Reset button which will
show you a progress bar.
4. Press any key in the terminal application to stop the HSS from booting. This
will give you access to the HSS command line interface and a ">>" for input
will be displayed in the terminal.
5. Type `usbdmsc` in the HSS command line interface. The HSS `usbdmsc` command
exposes the eMMC as a USB mass storage device using the USB type C connector.
If successful, a message saying "USB Host connected" will be displayed.
6. The eMMC should now appear as mass storage device/drive on your host PC, as
it is mounted through your USB type C connector.
7. Now, all you need to do is dd the image to the eMMC, which can be done with
the following command on your development host:
'$ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M'
You will have to replace /dev/sdX by the actual device name of your eMMC.
Please, be especially cautious not to overwrite the wrong drive as this cannot
be undone.
8. Once the image transfer has completed you can type `CTRL+C` to disconnect
your device.
9. Finally, type `boot` or reset your board to boot your new Linux image.
Customize BeagleV-Fire Cape Gateware Using Verilog (Optional)
=============================================================
To customize your Beagle-V Fire gateware please follow the guide below to
create your custom bitstream (steps 1 - 6):
https://docs.beagleboard.org/latest/boards/beaglev/fire/demos-and-tutorials/gateware/customize-cape-gateware-verilog.html
Program BeagleV-Fire With Your Custom Bitstream with Buildroot
==============================================================
After following the steps 1-6 from the above tutorial, you should now have a
artifacts.zip file on your local host.
Unzip the downloaded artifacts.zip file.
Go to the custom FPGA design directory:
'cd artifacts/bitstreams/my_custom_fpga_design'
On your Linux host development computer, copy the bitstream to BeagleV-Fire
board, replacing </path/to/your/> with the path to your BeagleV-Fire root file
system.
'cp -r ./LinuxProgramming /path/to/your/buildroot/board/beagleboard/beaglev_fire/rootfs-overlay/etc/'
To apply these changes to your image, make sure to re-build it with:
`make`
Then, re-flash your image - to ensure you have the necessary firmware files - by
following the above section "Flashing the image to your eMMC".
On BeagleV-Fire,
1. Make your update gateware script executable
'chmod +x /usr/share/microchip/update-gateware.sh'
2. Create a firmware directory
'mkdir /lib/firmware'
3. Change to the directory of your gateware script
`cd /usr/share/microchip/`
3. initiate the reprogramming of the FPGA with your gateware bitstream:
'./update-gateware.sh /etc/LinuxProgramming/'
Wait for a couple of minutes for the BeagleV-Fire to reprogram itself.

View File

@@ -0,0 +1,55 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Flattened Image Tree file for BVF
*
* Copyright (C) 2024 Microchip Technology Inc. and its subsidiaries.
*
*/
/dts-v1/;
/ {
description = "U-Boot fitImage for the BeagleV-Fire";
#address-cells = <2>;
images {
kernel {
description = "Linux kernel";
data = /incbin/("./Image.gz");
type = "kernel";
arch = "riscv";
os = "linux";
compression = "gzip";
load = <0x80200000>;
entry = <0x80200000>;
hash-1 {
algo = "sha256";
};
};
base_fdt {
description = "Flattened Device Tree blob";
data = /incbin/("./mpfs-beaglev-fire.dtb");
type = "flat_dt";
arch = "riscv";
compression = "none";
load = <0x8a000000>;
hash-1 {
algo = "sha256";
};
};
};
configurations {
default = "kernel_dtb";
kernel_dtb {
description = "1 Linux kernel, FDT blob";
kernel = "kernel";
fdt = "base_fdt";
};
base_dtb {
description = "Base FDT blob for BeagleV-Fire board";
fdt = "base_fdt";
};
};
};

View File

@@ -0,0 +1,15 @@
# this assumes ${scriptaddr} is already set!!
# Try to boot a fitImage from eMMC/SD
setenv fdt_high 0xffffffffffffffff
setenv initrd_high 0xffffffffffffffff
load mmc 0:${distro_bootpart} ${scriptaddr} beaglev_fire.itb;
bootm start ${scriptaddr}#kernel_dtb;
bootm loados ${scriptaddr};
# Try to load a ramdisk if available inside fitImage
bootm ramdisk;
bootm prep;
fdt set /soc/ethernet@20110000 mac-address ${beaglevfire_mac_addr0};
bootm go;

View File

@@ -0,0 +1,28 @@
#
# HSS Payload Generator - buildroot configuration file
#
# First, we can optionally set a name for our image, otherwise one will be created dynamically
set-name: 'PolarFire-SoC-HSS::U-Boot'
#
# Next, we'll define the entry point addresses for each hart, as follows:
#
hart-entry-points: {u54_1: '0x80200000', u54_2: '0x80200000', u54_3: '0x80200000', u54_4: '0x80200000'}
#
# Finally, we'll define a payloads (source binary file) that will be placed at certain regions in memory
# The payload section is defined with the keyword payloads, and then a number of individual
# payload descriptors.
#
# Each payload has a name (path to its ELF/bin file), an owner-hart, and optionally 1-3 secondary-harts.
#
# Additionally, it has a privilege mode in which it will start execution.
# * Valid privilege modes are PRV_M, PRV_S and PRV_U.
#
#
# In this case, the only payload is the u-boot s-mode binary.
#
# Case only matters for the ELF path names, not the keywords.
#
payloads:
u-boot.bin: {exec-addr: '0x80200000', owner-hart: u54_1, secondary-hart: u54_2, secondary-hart: u54_3, secondary-hart: u54_4, priv-mode: prv_s}

View File

@@ -0,0 +1,35 @@
# Image for eMMC boot on the Microchip PolarFire SOC BeagleV-Fire Board
#
image boot.vfat {
vfat {
files = {
"beaglev_fire.itb",
}
file boot.scr {
image = "boot.scr"
}
}
size = 60M
}
image sdcard.img {
hdimage {
partition-table-type = "gpt"
}
partition uboot {
partition-type-uuid = 21686148-6449-6E6F-744E-656564454649
image = "payload.bin"
}
partition kernel {
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
bootable = "true"
image = "boot.vfat"
}
partition root {
image = "rootfs.ext4"
}
}

View File

@@ -0,0 +1 @@
../linux/linux.hash

View File

@@ -0,0 +1,2 @@
# Locally calculated
sha256 7d634bf425f2ad68c3a6aab0d67a5f0c9f59a4fae02f051054f428854913f58a linux4microchip+fpga-2024.02.tar.gz

View File

@@ -0,0 +1,2 @@
# Locally calculated
sha256 c21209347beac37540f1c7070760498493975052b536fc02677faa2110666bab linux4microchip+fpga-2024.02.tar.gz

View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
HSS_PAYLOAD_GENERATOR="${HOST_DIR}"/bin/hss-payload-generator
MKIMAGE="${HOST_DIR}"/bin/mkimage
BOARD_DIR="$(pwd)"/"${0%/*}"
pushd "${BINARIES_DIR}"
"${HSS_PAYLOAD_GENERATOR}" -c "${BOARD_DIR}"/config.yaml payload.bin
cp "${BOARD_DIR}"/beaglev_fire.its "${BINARIES_DIR}"/beaglev_fire.its
gzip -9 Image -c > Image.gz
"${MKIMAGE}" -f beaglev_fire.its beaglev_fire.itb
popd
support/scripts/genimage.sh -c "${BOARD_DIR}"/genimage.cfg

View File

@@ -0,0 +1,32 @@
#!/bin/sh
if [ ! -e "$1"/mpfs_bitstream.spi ]; then
echo "No gateware file found."
exit 1
fi
if [ ! -d /lib/firmware ]
then
mkdir /lib/firmware
fi
cp "$1"/mpfs_dtbo.spi /lib/firmware/mpfs_dtbo.spi
cp "$1"/mpfs_bitstream.spi /lib/firmware/mpfs_bitstream.spi
mount -t debugfs none /sys/kernel/debug
# Trash existing device tree overlay in case the rest of the process fails:
flash_erase /dev/mtd0 0 1024
# # Write device tree overlay
dd if=/lib/firmware/mpfs_dtbo.spi of=/dev/mtd0 seek=1024
# Fake the presence of a golden image for now.
dd if=/dev/zero of=/dev/mtd0 count=4 bs=1
# Initiate FPGA update.
echo 1 > /sys/kernel/debug/fpga/microchip_exec_update
# Reboot Linux for the gateware update to take effect.
# FPGA reprogramming takes places between Linux shut-down and HSS restarting the board.
reboot

View File

@@ -0,0 +1,3 @@
CONFIG_USE_BOOTARGS=y
CONFIG_BOOTARGS="root=/dev/mmcblk0p3 rootwait uio_pdrv_genirq.of_id=generic-uio"
CONFIG_MPFS_PRIORITISE_QSPI_BOOT=n

View File

@@ -0,0 +1,33 @@
BR2_riscv=y
BR2_RISCV_ISA_RVC=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
BR2_GLOBAL_PATCH_DIR="board/beagleboard/beaglev_fire/patches"
BR2_DOWNLOAD_FORCE_CHECK_HASHES=y
BR2_SYSTEM_DHCP="eth0"
BR2_ROOTFS_OVERLAY="board/beagleboard/beaglev_fire/rootfs-overlay/"
BR2_ROOTFS_POST_IMAGE_SCRIPT="board/beagleboard/beaglev_fire/post-image.sh"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,linux4microchip,linux,linux-6.1-mchp+fpga)/linux4microchip+fpga-2024.02.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="mpfs"
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="microchip/mpfs-beaglev-fire"
BR2_PACKAGE_MTD=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="$(call github,polarfire-soc,u-boot)linux4microchip+fpga-2024.02.tar.gz"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="beaglev_fire"
BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="board/beagleboard/beaglev_fire/uboot-fragment.config"
BR2_TARGET_UBOOT_NEEDS_DTC=y
BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MICROCHIP_HSS_PAYLOAD_GENERATOR=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE="board/beagleboard/beaglev_fire/boot.cmd"