Add QSPI boot support to boot target devices list.
Platform can provide their own boot settings through
SOCFPGA_BOOT_SETTINGS macro if needed.
Add SOCFPGA_BOOT_SETTINGS for Cyclone 5.
Guard QSPI boot-target integration with a new Kconfig option,
SOCFPGA_DISTRO_BOOT_QSPI, so that only boards which actually define
qspiload/qspiboot get "qspi" appended to boot_targets. Without this,
any SoCFPGA board enabling CONFIG_CMD_SF (e.g. Arria V, DE10, SoCKit)
for an unrelated SPI flash use-case would also pick up bootcmd_qspi
and could fail during distro autoboot
Signed-off-by: Boon Khai Ng <[email protected]>
---
v2:
- Fix commit message typo: OCFPGA_BOOT_SETTINGS -> SOCFPGA_BOOT_SETTINGS.
- Add new Kconfig option SOCFPGA_DISTRO_BOOT_QSPI, depends on CMD_SF,
default y only for TARGET_SOCFPGA_CYCLONE5_SOCDK, so QSPI is only
added to boot_targets on boards that opt in and provide
qspiload/qspiboot. Per review comment from Tien Fong.
v1:
https://patchwork.ozlabs.org/project/uboot/patch/[email protected]/
- Added QSPI to BOOT_TARGET_DEVICES unconditionally whenever
CONFIG_CMD_SF is enabled, plus bootcmd_qspi/qspiload/qspiboot
helper commands.
- Added SOCFPGA_BOOT_SETTINGS definition for Cyclone 5 SoCDK (fdt_size,
kernel_size, qspi_fdt_addr, qspi_kernel_addr, qspiboot, qspiload) so
the board can boot kernel + FDT from QSPI flash.
---
arch/arm/mach-socfpga/Kconfig | 12 ++++++++++++
include/configs/socfpga_common.h | 18 ++++++++++++++++++
include/configs/socfpga_cyclone5_socdk.h | 18 ++++++++++++++++++
3 files changed, 48 insertions(+)
diff --git a/arch/arm/mach-socfpga/Kconfig b/arch/arm/mach-socfpga/Kconfig
index a9b639a5ed9..56aac117c1b 100644
--- a/arch/arm/mach-socfpga/Kconfig
+++ b/arch/arm/mach-socfpga/Kconfig
@@ -22,6 +22,18 @@ config SOCFPGA_SECURE_VAB_AUTH_ALLOW_NON_FIT_IMAGE
bool "Allow non-FIT VAB signed images"
depends on SOCFPGA_SECURE_VAB_AUTH
+config SOCFPGA_DISTRO_BOOT_QSPI
+ bool "Append QSPI to distro boot targets (boot_targets)"
+ depends on CMD_SF
+ default y if TARGET_SOCFPGA_CYCLONE5_SOCDK
+ help
+ When enabled, socfpga_common.h adds QSPI to the distro boot
+ device list and defines bootcmd_qspi (run qspiload; run
+ qspiboot). The board header must supply qspiload and qspiboot
+ in the default environment (for example via
+ SOCFPGA_BOOT_SETTINGS). Disable on boards that enable CMD_SF
+ for a small SPI flash or a layout incompatible with that flow.
+
config SPL_SIZE_LIMIT
default 0x10000 if ARCH_SOCFPGA_GEN5
diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
index 36d6bfb3d03..910cd2648f7 100644
--- a/include/configs/socfpga_common.h
+++ b/include/configs/socfpga_common.h
@@ -137,11 +137,28 @@
#define BOOT_TARGET_DEVICES_MMC(func)
#endif
+#if IS_ENABLED(CONFIG_CMD_SF) && IS_ENABLED(CONFIG_SOCFPGA_DISTRO_BOOT_QSPI)
+#define BOOT_TARGET_DEVICES_QSPI(func) func(QSPI, qspi, na)
+#else
+#define BOOT_TARGET_DEVICES_QSPI(func)
+#endif
+
+#define BOOTENV_DEV_QSPI(devtypeu, devtypel, instance) \
+ "bootcmd_qspi=run qspiload; run qspiboot\0"
+
+#define BOOTENV_DEV_NAME_QSPI(devtypeu, devtypel, instance) \
+ "qspi "
+
#define BOOT_TARGET_DEVICES(func) \
BOOT_TARGET_DEVICES_MMC(func) \
+ BOOT_TARGET_DEVICES_QSPI(func) \
BOOT_TARGET_DEVICES_PXE(func) \
BOOT_TARGET_DEVICES_DHCP(func)
+#ifndef SOCFPGA_BOOT_SETTINGS
+#define SOCFPGA_BOOT_SETTINGS
+#endif
+
#include <config_distro_bootcmd.h>
#ifndef CFG_EXTRA_ENV_SETTINGS
@@ -154,6 +171,7 @@
"pxefile_addr_r=0x02200000\0" \
"ramdisk_addr_r=0x02300000\0" \
"socfpga_legacy_reset_compat=1\0" \
+ SOCFPGA_BOOT_SETTINGS \
BOOTENV
#endif
diff --git a/include/configs/socfpga_cyclone5_socdk.h
b/include/configs/socfpga_cyclone5_socdk.h
index c23ba2325b8..3ebb7b18020 100644
--- a/include/configs/socfpga_cyclone5_socdk.h
+++ b/include/configs/socfpga_cyclone5_socdk.h
@@ -10,6 +10,24 @@
/* Memory configurations */
#define PHYS_SDRAM_1_SIZE 0x40000000 /* 1GiB on SoCDK */
+/* QSPI boot */
+#define FDT_SIZE __stringify(0x00010000)
+#define KERNEL_SIZE __stringify(0x005d0000)
+#define QSPI_FDT_ADDR __stringify(0x00220000)
+#define QSPI_KERNEL_ADDR __stringify(0x00230000)
+
+#define SOCFPGA_BOOT_SETTINGS \
+ "fdt_size=" FDT_SIZE "\0" \
+ "kernel_size=" KERNEL_SIZE "\0" \
+ "qspi_fdt_addr=" QSPI_FDT_ADDR "\0" \
+ "qspi_kernel_addr=" QSPI_KERNEL_ADDR "\0" \
+ "qspiboot=setenv bootargs earlycon " \
+ "root=/dev/mtdblock1 rw rootfstype=jffs2; " \
+ "bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+ "qspiload=sf probe; " \
+ "sf read ${kernel_addr_r} ${qspi_kernel_addr} ${kernel_size}; "
\
+ "sf read ${fdt_addr_r} ${qspi_fdt_addr} ${fdt_size}\0"
+
/* The rest of the configuration is shared */
#include <configs/socfpga_common.h>