[Buildroot] [PATCH v3 2/2] configs/microchip_mpfs_icicle: add support for Microchip's Icicle Kit

Giulio Benetti giulio.benetti at benettiengineering.com
Wed Jul 12 13:47:51 UTC 2023


On 12/07/23 14:51, Jamie Gibbons via buildroot wrote:
> Add support for the icicle kit, the main development board for
> Microchip's PolarFire SoC.
> 
> The configuration file is microchip_mpfs_icicle_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 or an SD card.
> 
> The yaml configuration file is used by the hss payload generator. It
> maps the ELF binaries or binary blobs to the individual application
> harts (U54s).
> 
> The image generator script sets the partitions of the image.
> 
> The kernel fragment file ses additional configurations for the icicle
> kit in buildroot that are not in the default configuration.
> 
> 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.
> 
> The U-Boot script and additional U-Boot configurations ensure that
> U-Boot behaves as expected for the icicle kit and boots the FIT image.
> 
> The readme.txt file documents how to build and boot the icicle kit with
> this configuration.
> 
> Signed-off-by: Jamie Gibbons <jamie.gibbons at microchip.com>

Reviewed-by: Giulio Benetti <giulio.benetti at micronovasrl.com>

Same here for V1->V2 changes.

Also, it's ok to drop the partition-type-uuid in genimage.cfg if it's
the default value.

Thank you
Best regards
-- 
CEO/CTO at Benetti Engineering sas

> ---
>   DEVELOPERS                                    |  2 +
>   board/microchip/mpfs_icicle/README.txt        | 62 +++++++++++++++++++
>   board/microchip/mpfs_icicle/config.yaml       | 28 +++++++++
>   board/microchip/mpfs_icicle/genimage.cfg      | 34 ++++++++++
>   board/microchip/mpfs_icicle/linux.fragment    |  1 +
>   board/microchip/mpfs_icicle/mpfs_icicle.its   | 53 ++++++++++++++++
>   board/microchip/mpfs_icicle/post-image.sh     | 13 ++++
>   board/microchip/mpfs_icicle/uboot-env.txt     | 16 +++++
>   .../mpfs_icicle/uboot-fragment-rootfs.config  |  3 +
>   configs/microchip_mpfs_icicle_defconfig       | 34 ++++++++++
>   10 files changed, 246 insertions(+)
>   create mode 100644 board/microchip/mpfs_icicle/README.txt
>   create mode 100644 board/microchip/mpfs_icicle/config.yaml
>   create mode 100644 board/microchip/mpfs_icicle/genimage.cfg
>   create mode 100644 board/microchip/mpfs_icicle/linux.fragment
>   create mode 100644 board/microchip/mpfs_icicle/mpfs_icicle.its
>   create mode 100755 board/microchip/mpfs_icicle/post-image.sh
>   create mode 100644 board/microchip/mpfs_icicle/uboot-env.txt
>   create mode 100644 board/microchip/mpfs_icicle/uboot-fragment-rootfs.config
>   create mode 100644 configs/microchip_mpfs_icicle_defconfig
> 
> diff --git a/DEVELOPERS b/DEVELOPERS
> index 2f039a2405..8df10aca21 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -1460,6 +1460,8 @@ F:	package/rpm/
>   F:	package/yad/
>   
>   N:	Jamie Gibbons <jamie.gibbons at microchip.com>
> +F:	board/microchip/mpfs_icicle
> +F:	configs/microchip_mpfs_icicle_defconfig
>   F:	package/microchip-hss-payload-generator
>   
>   N:	Jan Heylen <jan.heylen at nokia.com>
> diff --git a/board/microchip/mpfs_icicle/README.txt b/board/microchip/mpfs_icicle/README.txt
> new file mode 100644
> index 0000000000..de20ecc410
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/README.txt
> @@ -0,0 +1,62 @@
> +Microchip PolarFire SoC Icicle Kit
> +==================================
> +
> +This file describes how to use the pre-defined Buildroot
> +configuration for Microchip's PolarFire SoC Icicle Kit.
> +
> +Further information about the PolarFire SoC Icicle Kit can be found
> +at https://github.com/polarfire-soc/polarfire-soc-documentation
> +
> +Building
> +========
> +
> +Configure Buildroot using the default board configuration:
> +
> +  '$ make microchip_mpfs_icicle_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
> +    +-- mpfs_icicle.itb
> +    +-- mpfs_icicle.its
> +    +-- mpfs-icicle-kit.dtb
> +    +-- payload.bin
> +    +-- rootfs.ext2
> +    +-- rootfs.ext4
> +    +-- rootfs.tar
> +    +-- sdcard.img
> +    +-- u-boot.bin
> +
> +
> +Creating a bootable SD card with genimage
> +=========================================
> +
> +By default Buildroot builds a SD card image for you. 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 or an SD card. All you need to do is dd the
> +image to the eMMC or your SD card, which can be done with the following
> +command on your development host:
> +
> +  '$ sudo dd if=output/images/sdcard.img of=/dev/sdb bs=1M'
> +
> +For instructions on how to transfer the image to the eMMC/SD, please refer to
> +the "Programming the Linux image" section of our guide on updating
> +PolarFire SoC dev kits:
> +https://github.com/polarfire-soc/polarfire-soc-documentation/blob/master/reference-designs-fpga-and-development-kits/updating-mpfs-kit.md.
> diff --git a/board/microchip/mpfs_icicle/config.yaml b/board/microchip/mpfs_icicle/config.yaml
> new file mode 100644
> index 0000000000..5fccdfd34f
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/config.yaml
> @@ -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}
> diff --git a/board/microchip/mpfs_icicle/genimage.cfg b/board/microchip/mpfs_icicle/genimage.cfg
> new file mode 100644
> index 0000000000..6955d3365a
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/genimage.cfg
> @@ -0,0 +1,34 @@
> +# Image for eMMC or SDCard boot on the Microchip PolarFire SOC Icicle Board
> +#
> +image boot.vfat {
> +	vfat {
> +		files = {
> +			 "mpfs_icicle.itb",
> +		}
> +
> +		file boot.scr {
> +			image = "boot.scr"
> +		}
> +	}
> +	size = 60M
> +}
> +
> +image sdcard.img {
> +	hdimage {
> +		gpt = true
> +	}
> +
> +	partition uboot {
> +		partition-type-uuid = 21686148-6449-6E6F-744E-656564454649
> +		image = "payload.bin"
> +	}
> +
> +	partition kernel {
> +		bootable = "true"
> +		image = "boot.vfat"
> +	}
> +
> +	partition root {
> +		image = "rootfs.ext4"
> +	}
> +}
> diff --git a/board/microchip/mpfs_icicle/linux.fragment b/board/microchip/mpfs_icicle/linux.fragment
> new file mode 100644
> index 0000000000..0cecddb61b
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/linux.fragment
> @@ -0,0 +1 @@
> +CONFIG_POLARFIRE_SOC_DMA_NONCOHERENT=y
> diff --git a/board/microchip/mpfs_icicle/mpfs_icicle.its b/board/microchip/mpfs_icicle/mpfs_icicle.its
> new file mode 100644
> index 0000000000..a62b079fa1
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/mpfs_icicle.its
> @@ -0,0 +1,53 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Flattened Image Tree file for Icicle Kit
> + *
> + */
> +
> +/dts-v1/;
> +
> +/ {
> +	description = "U-Boot fitImage for the MPFS";
> +	address-cells = <1>;
> +
> +		images {
> +			kernel {
> +				description = "Linux kernel";
> +				data = /incbin/("./Image");
> +				type = "kernel";
> +				arch = "riscv";
> +				os = "linux";
> +				compression = "none";
> +				load = <0x80200000>;
> +				entry = <0x80200000>;
> +				hash-1 {
> +					algo = "sha256";
> +				};
> +			};
> +			base_fdt {
> +				description = "Flattened Device Tree blob";
> +				data = /incbin/("./mpfs-icicle-kit.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 MPFS Icicle board";
> +				fdt = "base_fdt";
> +			};
> +		};
> +};
> diff --git a/board/microchip/mpfs_icicle/post-image.sh b/board/microchip/mpfs_icicle/post-image.sh
> new file mode 100755
> index 0000000000..54cc6d71f8
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/post-image.sh
> @@ -0,0 +1,13 @@
> +#!/usr/bin/env bash
> +
> +BASE_DIR=$(pwd)
> +HSS_PAYLOAD_GENERATOR=$HOST_DIR/bin/hss-payload-generator
> +MKIMAGE=$HOST_DIR/bin/mkimage
> +GENIMAGE=${BASE_DIR}/support/scripts/genimage.sh
> +GENIMAGE_CFG=${BASE_DIR}/$2
> +
> +cd "${BINARIES_DIR}" || exit
> +${HSS_PAYLOAD_GENERATOR} -c "${BASE_DIR}"/board/microchip/mpfs_icicle/config.yaml payload.bin
> +cp "${BASE_DIR}"/board/microchip/mpfs_icicle/mpfs_icicle.its ./
> +${MKIMAGE} -f mpfs_icicle.its mpfs_icicle.itb
> +${GENIMAGE} -c "${GENIMAGE_CFG}"
> diff --git a/board/microchip/mpfs_icicle/uboot-env.txt b/board/microchip/mpfs_icicle/uboot-env.txt
> new file mode 100644
> index 0000000000..8a655085ed
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/uboot-env.txt
> @@ -0,0 +1,16 @@
> +# 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} mpfs_icicle.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 at 20112000 mac-address ${icicle_mac_addr0};
> +fdt set /soc/ethernet at 20110000 mac-address ${icicle_mac_addr1};
> +bootm go;
> diff --git a/board/microchip/mpfs_icicle/uboot-fragment-rootfs.config b/board/microchip/mpfs_icicle/uboot-fragment-rootfs.config
> new file mode 100644
> index 0000000000..e2a5eb9438
> --- /dev/null
> +++ b/board/microchip/mpfs_icicle/uboot-fragment-rootfs.config
> @@ -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
> diff --git a/configs/microchip_mpfs_icicle_defconfig b/configs/microchip_mpfs_icicle_defconfig
> new file mode 100644
> index 0000000000..9ad1bf66d8
> --- /dev/null
> +++ b/configs/microchip_mpfs_icicle_defconfig
> @@ -0,0 +1,34 @@
> +BR2_riscv=y
> +BR2_riscv_custom=y
> +BR2_RISCV_ISA_CUSTOM_RVM=y
> +BR2_RISCV_ISA_CUSTOM_RVF=y
> +BR2_RISCV_ISA_CUSTOM_RVD=y
> +BR2_RISCV_ISA_CUSTOM_RVC=y
> +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
> +BR2_TARGET_GENERIC_HOSTNAME="mpfs_icicle"
> +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/microchip/mpfs_icicle/post-image.sh"
> +BR2_ROOTFS_POST_SCRIPT_ARGS="board/microchip/mpfs_icicle/genimage.cfg"
> +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-2023.06.tar.gz"
> +BR2_LINUX_KERNEL_DEFCONFIG="mpfs"
> +BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="board/microchip/mpfs_icicle/linux.fragment"
> +BR2_LINUX_KERNEL_DTS_SUPPORT=y
> +BR2_LINUX_KERNEL_INTREE_DTS_NAME="microchip/mpfs-icicle-kit"
> +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-2023.06.tar.gz"
> +BR2_TARGET_UBOOT_BOARD_DEFCONFIG="microchip_mpfs_icicle"
> +BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="board/microchip/mpfs_icicle/uboot-fragment-rootfs.config"
> +BR2_TARGET_UBOOT_NEEDS_DTC=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/microchip/mpfs_icicle/uboot-env.txt"

-- 
CEO/CTO at Benetti Engineering sas



More information about the buildroot mailing list