vexpress64: fvp: add distro_boot support
authorAndre Przywara <andre.przywara@arm.com>
Fri, 4 Mar 2022 16:30:14 +0000 (16:30 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 1 Apr 2022 18:58:16 +0000 (14:58 -0400)
So far the FVP model just supports booting through semihosting, so by
loading files from the host the model is running on. This allows for
quick booting of new kernels (or replacing DTBs), but prevents more
featureful boots like using UEFI.

Enable the distro_boot feature, and provide a list of possible boot
sources that U-Boot should check:
- For backwards compatibility we start with semihosting, which gets its
  commands migrated from CONFIG_BOOTCOMMAND into the distro_boot
  infrastructure. This is also slightly tweaked to fail graceful in case
  the required files could not be found.
- Next we try to use a user provided script, that could be easily
  placed into memory using the model command line.
- Since we gained virtio support with the enablement of OF_CONTROL,
  let's check virtio block devices next. This is where UEFI boot can
  be easily used, for instance by providing a distro installer .iso
  file through virtio-blk.
- Networking is now provided by virtio as well, so enable the default
  PXE and DHCP boot flows, mostly because we can.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/Kconfig
configs/vexpress_aemv8a_juno_defconfig
configs/vexpress_aemv8a_semi_defconfig
include/configs/vexpress_aemv8.h

index 7e613c7ed78df2a4c5f97799db6fbd31ca0d6c75..1f2b849a1245f3b42a6e51404ba116921c875183 100644 (file)
@@ -1262,6 +1262,7 @@ config ARCH_VEXPRESS64
        select MTD_NOR_FLASH if MTD
        select FLASH_CFI_DRIVER if MTD
        select ENV_IS_IN_FLASH if MTD
+       imply DISTRO_DEFAULTS
 
 config TARGET_TOTAL_COMPUTE
        bool "Support Total Compute Platform"
index a5d7247467307b0fbc45225979e85520a785d397..6afeac2762a505dbf0f2fa1a4d252abd908bf8bb 100644 (file)
@@ -6,7 +6,6 @@ CONFIG_IDENT_STRING=" vexpress_aemv8a"
 CONFIG_TARGET_VEXPRESS64_JUNO=y
 CONFIG_SYS_MEMTEST_START=0x80000000
 CONFIG_SYS_MEMTEST_END=0xff000000
-CONFIG_DISTRO_DEFAULTS=y
 CONFIG_REMAKE_ELF=y
 CONFIG_BOOTDELAY=1
 CONFIG_USE_BOOTARGS=y
index b47aba2bc35423d9b2b3e3920b8011ea098b3b98..0834c6f368d1bbfa70ec7459dfd3136615ab285f 100644 (file)
@@ -6,13 +6,11 @@ CONFIG_DEFAULT_DEVICE_TREE="fvp-base-revc"
 CONFIG_IDENT_STRING=" vexpress_aemv8a"
 CONFIG_SYS_MEMTEST_START=0x80000000
 CONFIG_SYS_MEMTEST_END=0xff000000
-CONFIG_DISTRO_DEFAULTS=y
 CONFIG_REMAKE_ELF=y
 CONFIG_ANDROID_BOOT_IMAGE=y
 CONFIG_BOOTDELAY=1
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyAMA0 earlycon=pl011,0x1c090000 debug user_debug=31 loglevel=9"
-CONFIG_BOOTCOMMAND="if smhload ${boot_name} ${boot_addr_r}; then   setenv bootargs;   abootimg addr ${boot_addr_r};   abootimg get dtb --index=0 fdt_addr_r;   bootm ${boot_addr_r} ${boot_addr_r}   ${fdt_addr_r}; else;   setenv fdt_high 0xffffffffffffffff;   setenv initrd_high 0xffffffffffffffff;   smhload ${kernel_name} ${kernel_addr_r};   smhload ${fdtfile} ${fdt_addr_r};   smhload ${ramdisk_name} ${ramdisk_addr_r}   ramdisk_end;   fdt addr ${fdt_addr_r}; fdt resize;   fdt chosen ${ramdisk_addr_r} ${ramdisk_end};   booti $kernel_addr_r - $fdt_addr_r; fi"
 # CONFIG_DISPLAY_CPUINFO is not set
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_SYS_PROMPT="VExpress64# "
@@ -30,10 +28,9 @@ CONFIG_BOOTP_BOOTFILESIZE=y
 CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_CMD_UBI=y
-# CONFIG_ISO_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_VIRTIO_MMIO=y
index f8731aad97dc50b3b658e4ac69dc041a84828226..74060c634901d93925f48cf52ade982ee7ff9cd9 100644 (file)
                "booti ${kernel_addr_r} ${ramdisk_param} ${fdt_addr_r}\0"
 #define BOOTENV_DEV_NAME_AFS(devtypeu, devtypel, instance) "afs "
 
+/* Boot by executing a U-Boot script pre-loaded into DRAM. */
+#define BOOTENV_DEV_MEM(devtypeu, devtypel, instance) \
+       "bootcmd_mem= " \
+               "source ${scriptaddr}; " \
+               "if test $? -eq 1; then " \
+               "  env import -t ${scriptaddr}; " \
+               "  if test -n $uenvcmd; then " \
+               "    echo Running uenvcmd ...; " \
+               "    run uenvcmd; " \
+               "  fi; " \
+               "fi\0"
+#define BOOTENV_DEV_NAME_MEM(devtypeu, devtypel, instance) "mem "
+
+#ifdef CONFIG_CMD_VIRTIO
+#define FUNC_VIRTIO(func)      func(VIRTIO, virtio, 0)
+#else
+#define FUNC_VIRTIO(func)
+#endif
+
+/*
+ * Boot by loading an Android image, or kernel, initrd and FDT through
+ * semihosting into DRAM.
+ */
+#define BOOTENV_DEV_SMH(devtypeu, devtypel, instance) \
+       "bootcmd_smh= "                                                 \
+               "if smhload ${boot_name} ${boot_addr_r}; then"          \
+               "  setenv bootargs;"                                    \
+               "  abootimg addr ${boot_addr_r};"                       \
+               "  abootimg get dtb --index=0 fdt_addr_r;"              \
+               "  bootm ${boot_addr_r} ${boot_addr_r} ${fdt_addr_r};"  \
+               "else"                                                  \
+               "  if smhload ${kernel_name} ${kernel_addr_r}; then"    \
+               "    setenv fdt_high 0xffffffffffffffff;"               \
+               "    setenv initrd_high 0xffffffffffffffff;"            \
+               "    smhload ${fdtfile} ${fdt_addr_r};"                 \
+               "    smhload ${ramdisk_name} ${ramdisk_addr_r} ramdisk_end;" \
+               "    fdt addr ${fdt_addr_r};"                           \
+               "    fdt resize;"                                       \
+               "    fdt chosen ${ramdisk_addr_r} ${ramdisk_end};"      \
+               "    booti $kernel_addr_r - $fdt_addr_r;"               \
+               "  fi;"                                                 \
+               "fi\0"
+#define BOOTENV_DEV_NAME_SMH(devtypeu, devtypel, instance) "smh "
+
 /* Boot sources for distro boot and load addresses, per board */
 
 #ifdef CONFIG_TARGET_VEXPRESS64_JUNO                   /* Arm Juno board */
        func(DHCP, dhcp, na)            \
        func(AFS, afs, na)
 
-#include <config_distro_bootcmd.h>
-
 #define VEXPRESS_KERNEL_ADDR           0x80080000
 #define VEXPRESS_PXEFILE_ADDR          0x8fb00000
 #define VEXPRESS_FDT_ADDR              0x8fc00000
 
 #elif CONFIG_TARGET_VEXPRESS64_BASE_FVP                        /* ARMv8-A base model */
 
+#define BOOT_TARGET_DEVICES(func)      \
+       func(SMH, smh, na)              \
+       func(MEM, mem, na)              \
+       FUNC_VIRTIO(func)               \
+       func(PXE, pxe, na)              \
+       func(DHCP, dhcp, na)
+
 #define VEXPRESS_KERNEL_ADDR           0x80080000
 #define VEXPRESS_PXEFILE_ADDR          0x8fa00000
 #define VEXPRESS_SCRIPT_ADDR           0x8fb00000
                "boot_name=boot.img\0"                                  \
                "boot_addr_r=" __stringify(VEXPRESS_BOOT_ADDR) "\0"
 
-#define BOOTENV
-
 #endif
 
+#include <config_distro_bootcmd.h>
+
 /* Default load addresses and names for the different payloads. */
 #define CONFIG_EXTRA_ENV_SETTINGS      \
                "kernel_addr_r=" __stringify(VEXPRESS_KERNEL_ADDR) "\0"        \