All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Petazzoni via buildroot <buildroot@buildroot.org>
To: Jamie Gibbons via buildroot <buildroot@buildroot.org>
Cc: Valentina Fernandez <valentina.fernandezalanis@microchip.com>,
	Jamie Gibbons <jamie.gibbons@microchip.com>,
	Ludovic Desroches <ludovic.desroches@microchip.com>,
	Conor Dooley <Conor.Dooley@microchip.com>,
	Nicolas Ferre <nicolas.ferre@microchip.com>
Subject: Re: [Buildroot] [PATCH 1/1] configs/beaglev_fire: add support for BeagleV Fire
Date: Thu, 9 May 2024 22:03:34 +0200	[thread overview]
Message-ID: <20240509220334.1641f661@windsurf> (raw)
In-Reply-To: <20240507143409.230685-1-jamie.gibbons@microchip.com>

Hello Jamie,

On Tue, 7 May 2024 15:34:09 +0100
Jamie Gibbons via buildroot <buildroot@buildroot.org> wrote:

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

Thanks a lot for this patch! It mostly looks good, but there are a
number of small questions/comments below.


> +Flashing the image to your eMMC
> +===============================
> +
> +By default Buildroot builds a compatible 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. 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/sdb bs=1M'

I'm a bit confused: how can the board's eMMC be visible as /dev/sdb on
the development host? Does the SoC ROM code expose the eMMC as a USB
mass storage device? This probably needs a bit of explanation: /dev/sdb
on the host might very well be something entirely different.

> +Customize BeagleV-Fire Cape Gateware Using Verilog
> +==================================================
> +
> +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
> +==============================================================
> +
> +Unzip the downloaded artifacts.zip file. 

Downloaded from where? According to the instructions in the previous
section?

> +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/beaglev_fire/rootfs-overlay/etc/'

This will not do much if you don't regenerate the Buildroot image.


> diff --git a/board/beaglev_fire/rootfs-overlay/usr/share/beagleboard/gateware/change-gateware.sh b/board/beaglev_fire/rootfs-overlay/usr/share/beagleboard/gateware/change-gateware.sh
> new file mode 100644
> index 0000000000..0a35b6178b
> --- /dev/null
> +++ b/board/beaglev_fire/rootfs-overlay/usr/share/beagleboard/gateware/change-gateware.sh
> @@ -0,0 +1,25 @@
> +#!/bin/bash
> +
> +if [ -d "$1" ]
> +then
> +    echo "Changing gateware."
> +    if [ -e "$1"/mpfs_bitstream.spi ]
> +    then
> +        if [ -e "$1"/mpfs_dtbo.spi ]
> +        then
> +            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
> +            . /usr/share/microchip/update-gateware.sh
> +        else
> +            echo "No device tree overlay file found."
> +        fi
> +    else
> +        echo "No gateware file found."
> +    fi
> +else
> +    echo "No directory found for this requested gateware."
> +fi

Please do error handling the other way around rather than having a
script that indents like crazy:

if [ ! -d "$1" ] ; then
	echo "No directory found for this requested gateware."
	exit 1
fi

echo "Changing gateware."

if [ ! -e "$1"/mpfs_bitstream.spi ]; then
	echo "No gateware file found."
	exit 1
fi

(Note: those two tests are redundant, doing the second test is sufficient)

etc. with the rest of the logic.

Why is update-gateware.sh in a separate script? It seems like a fairly
gratuitous split.

> diff --git a/board/beaglev_fire/rootfs-overlay/usr/share/microchip/update-gateware.sh b/board/beaglev_fire/rootfs-overlay/usr/share/microchip/update-gateware.sh
> new file mode 100644
> index 0000000000..2e91c0f4f9
> --- /dev/null
> +++ b/board/beaglev_fire/rootfs-overlay/usr/share/microchip/update-gateware.sh
> @@ -0,0 +1,36 @@
> +#!/bin/bash
> +echo "================================================================================"
> +echo "|                            FPGA Gateware Update                              |"
> +echo "|                                                                              |"
> +echo "|   Please ensure that the mpfs_bitstream.spi file containing the gateware     |"
> +echo "|   update has been copied to directory /lib/firmware.                         |"
> +echo "|                                                                              |"
> +echo "|                 !!! This will take a couple of minutes. !!!                  |"
> +echo "|                                                                              |"
> +echo "|               Give the system a few minutes to reboot itself                 |"
> +echo "|                        after Linux has shutdown.                             |"
> +echo "|                                                                              |"
> +echo "================================================================================"

This whole message is silly as the previous script has already copied
whatever is needed in /lib/firmware/. But in fact, what does it copy it
in /lib/firmware/ in the first place?

> +
> +read -rsp $'Press any key to continue...\n' -n1 key
> +
> +mount -t debugfs none /sys/kernel/debug
> +
> +# Trash exisitng device tree overlay in case the rest of the process fails:
> +mtd_debug erase /dev/mtd0 0x0 0x10000
> +
> +# Write device tree overlay
> +dtbo_ls=$(ls -l /lib/firmware/mpfs_dtbo.spi)
> +dtbo_size=$(echo "$dtbo_ls" | cut -d " "  -f 5)

dtbo_size=$(stat -c %s /lib/firmware/mpfs_dtbo.spi)

will do that in one go

> +
> +mtd_debug write /dev/mtd0 0x400 "$dtbo_size" /lib/firmware/mpfs_dtbo.spi > /dev/zero

Why do you use mtd_debug in this script? It seems really debugging
oriented. Why not flash_erase and then writing to /dev/mtd0 directly?


> diff --git a/board/beaglev_fire/uboot-env.txt b/board/beaglev_fire/uboot-env.txt
> new file mode 100644
> index 0000000000..1b996ed76b
> --- /dev/null
> +++ b/board/beaglev_fire/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} 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@20112000 mac-address ${beaglevfire_mac_addr0};
> +fdt set /soc/ethernet@20110000 mac-address ${beaglevfire_mac_addr1};
> +bootm go;

Nowadays, we try to use distro bootcmd instead of custom uBoot
environment scripts. See
https://source.denx.de/u-boot/u-boot/-/blob/v2024.04/doc/develop/distro.rst
for some details.

> diff --git a/board/beaglev_fire/uboot-fragment.config b/board/beaglev_fire/uboot-fragment.config
> new file mode 100644
> index 0000000000..861593bd7e
> --- /dev/null
> +++ b/board/beaglev_fire/uboot-fragment.config
> @@ -0,0 +1 @@
> +CONFIG_MPFS_PRIORITISE_QSPI_BOOT=n
> diff --git a/configs/beaglev_fire_defconfig b/configs/beaglev_fire_defconfig
> new file mode 100644
> index 0000000000..3779658509
> --- /dev/null
> +++ b/configs/beaglev_fire_defconfig
> @@ -0,0 +1,40 @@
> +BR2_riscv=y
> +BR2_RISCV_ISA_RVC=y
> +BR2_KERNEL_HEADERS_VERSION=y
> +BR2_DEFAULT_KERNEL_VERSION="6.1.30"
> +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
> +BR2_SYSTEM_DHCP="eth0"
> +BR2_ROOTFS_OVERLAY="board/beaglev_fire/rootfs-overlay/"
> +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/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_BUSYBOX_SHOW_OTHERS=y
> +BR2_PACKAGE_MTD=y
> +BR2_PACKAGE_DTC=y
> +BR2_PACKAGE_DTC_PROGRAMS=y

dtc is needed on the targe?

> +BR2_PACKAGE_BASH=y

Why?

> +BR2_TARGET_ROOTFS_CPIO_GZIP=y
> +BR2_TARGET_ROOTFS_INITRAMFS=y

Your choice of root filesystem is weird. This option bundles the root
filesystem as an initramfs in the kernel image. But in addition, you
have put the root filesystem as a CPIO in a partition (which is
useless, as Linux cannot mount a CPIO image from a block device).

Could you clarify how you expect the root filesystem to be handled?

> +# BR2_TARGET_ROOTFS_TAR is not set
> +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/beaglev_fire/uboot-fragment.config"
> +BR2_TARGET_UBOOT_NEEDS_DTC=y
> +BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
> +BR2_PACKAGE_HOST_GENEXT2FS=y

You don't generate an ext2 filesystem, so this is not needed.

> +BR2_PACKAGE_HOST_GENIMAGE=y
> +BR2_PACKAGE_HOST_GPTFDISK=y

Not sure where this gets used.

> +BR2_PACKAGE_HOST_MICROCHIP_HSS_PAYLOAD_GENERATOR=y
> +BR2_PACKAGE_HOST_MTOOLS=y
> +BR2_PACKAGE_HOST_SQUASHFS=y

Where this gets used?

> +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/beaglev_fire/uboot-env.txt"

Could you have a look at those different comments, and submit a v2 that
takes into account this feedback?

Thanks a lot!

Thomas
-- 
Thomas Petazzoni, co-owner and CEO, Bootlin
Embedded Linux and Kernel engineering and training
https://bootlin.com
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

  reply	other threads:[~2024-05-09 20:03 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-07 14:34 [Buildroot] [PATCH 1/1] configs/beaglev_fire: add support for BeagleV Fire Jamie Gibbons via buildroot
2024-05-09 20:03 ` Thomas Petazzoni via buildroot [this message]
2024-05-22 16:06   ` Jamie.Gibbons--- via buildroot
2024-05-23 10:33     ` Thomas Petazzoni via buildroot
2024-05-22 17:27   ` Robert Nelson
     [not found]     ` <20240522-geometric-everglade-a978e7098495@spud>
2024-05-22 19:02       ` Robert Nelson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240509220334.1641f661@windsurf \
    --to=buildroot@buildroot.org \
    --cc=Conor.Dooley@microchip.com \
    --cc=jamie.gibbons@microchip.com \
    --cc=ludovic.desroches@microchip.com \
    --cc=nicolas.ferre@microchip.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=valentina.fernandezalanis@microchip.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.