[PATCH 3/5] board: gateworks: venice: dynamically update the update_firmware script

Tim Harvey tharvey at gateworks.com
Wed May 3 02:05:55 CEST 2023


The update_firmware script is intended to update the boot firmware but
the details including the offset and hardware partition are dependent
on the boot device.

Specifically:
- IMX8MM/IMX8MP (BOOTROM v2) the offset is 32KiB for SD and eMMC user
  hardware partition and 0KiB for eMMC boot partitions.
- IMX8MM the offset is 33KiB for SD and eMMC regardless of hardware
  partition.

Dynamically set soc, dev, bootpart, and bootblk env vars at runtime
and use these in the update_firmware script. Remove the splblk env var
from config files as its no longer needed.

Signed-off-by: Tim Harvey <tharvey at gateworks.com>
---
 board/gateworks/venice/venice.c   | 71 +++++++++++++++++++++++++++++++
 board/gateworks/venice/venice.env |  6 +--
 include/configs/imx8mm_venice.h   |  1 -
 include/configs/imx8mn_venice.h   |  1 -
 include/configs/imx8mp_venice.h   |  1 -
 5 files changed, 74 insertions(+), 6 deletions(-)

diff --git a/board/gateworks/venice/venice.c b/board/gateworks/venice/venice.c
index 7aca75503846..803582c55b99 100644
--- a/board/gateworks/venice/venice.c
+++ b/board/gateworks/venice/venice.c
@@ -6,10 +6,12 @@
 #include <fdt_support.h>
 #include <init.h>
 #include <led.h>
+#include <mmc.h>
 #include <miiphy.h>
 #include <mmc.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/boot_mode.h>
 
 #include "eeprom.h"
 
@@ -94,10 +96,12 @@ int board_init(void)
 int board_late_init(void)
 {
 	const char *str;
+	struct mmc *mmc = NULL;
 	char env[32];
 	int ret, i;
 	u8 enetaddr[6];
 	char fdt[64];
+	int bootdev;
 
 	/* Set board serial/model */
 	if (!env_get("serial#"))
@@ -132,6 +136,73 @@ int board_late_init(void)
 		i++;
 	} while (!ret);
 
+	/*
+	 * set bootdev/bootblk/bootpart (used in firmware_update script)
+	 * dynamically depending on boot device and SoC
+	 */
+	bootdev = -1;
+	switch (get_boot_device()) {
+	case SD1_BOOT:
+	case MMC1_BOOT: /* SDHC1 */
+		bootdev = 0;
+		break;
+	case SD2_BOOT:
+	case MMC2_BOOT: /* SDHC2 */
+		bootdev = 1;
+		break;
+	case SD3_BOOT:
+	case MMC3_BOOT: /* SDHC3 */
+		bootdev = 2;
+		break;
+	default:
+		break;
+	}
+	if (bootdev != -1)
+		mmc = find_mmc_device(bootdev);
+	if (mmc) {
+		int bootblk;
+
+		if (IS_ENABLED(CONFIG_IMX8MN) || IS_ENABLED(CONFIG_IMX8MP))
+			bootblk = 32 * SZ_1K / 512;
+		else
+			bootblk = 33 * SZ_1K / 512;
+		mmc_init(mmc);
+		if (!IS_SD(mmc)) {
+			int bootpart;
+
+			switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {
+			case 1: /* boot0 */
+				bootpart = 1;
+				break;
+			case 2: /* boot1 */
+				bootpart = 2;
+				break;
+			case 7: /* user */
+			default:
+				bootpart = 0;
+				break;
+			}
+			/* IMX8MP/IMX8MN BOOTROM v2 uses offset=0 for boot parts */
+			if ((IS_ENABLED(CONFIG_IMX8MN) || IS_ENABLED(CONFIG_IMX8MP)) &&
+			    (bootpart == 1 || bootpart == 2))
+				bootblk = 0;
+			env_set_hex("bootpart", bootpart);
+			env_set_hex("bootblk", bootblk);
+		} else { /* SD */
+			env_set("bootpart", "");
+			env_set_hex("bootblk", bootblk);
+		}
+		env_set_hex("dev", bootdev);
+	}
+
+	/* override soc=imx8m to provide a more specific soc name */
+	if (IS_ENABLED(CONFIG_IMX8MN))
+		env_set("soc", "imx8mn");
+	else if (IS_ENABLED(CONFIG_IMX8MP))
+		env_set("soc", "imx8mp");
+	else if (IS_ENABLED(CONFIG_IMX8MM))
+		env_set("soc", "imx8mm");
+
 	return 0;
 }
 
diff --git a/board/gateworks/venice/venice.env b/board/gateworks/venice/venice.env
index 2054c029a3e9..a0d6c43325cf 100644
--- a/board/gateworks/venice/venice.env
+++ b/board/gateworks/venice/venice.env
@@ -8,11 +8,11 @@ bootm_size=0x10000000
 dev=2
 preboot=gsc wd-disable
 console=ttymxc1,115200
-update_firmware=tftpboot $loadaddr $image &&
+update_firmware=tftpboot $loadaddr $dir/venice-$soc-flash.bin &&
 	setexpr blkcnt $filesize + 0x1ff &&
 	setexpr blkcnt $blkcnt / 0x200 &&
-	mmc dev $dev &&
-	mmc write $loadaddr $splblk $blkcnt
+	mmc dev $dev $bootpart &&
+	mmc write $loadaddr $bootblk $blkcnt
 loadfdt=if $fsload $fdt_addr_r $dir/$fdt_file1;
 	then echo loaded $fdt_file1;
 	elif $fsload $fdt_addr_r $dir/$fdt_file2;
diff --git a/include/configs/imx8mm_venice.h b/include/configs/imx8mm_venice.h
index 5579a05d165f..b33b8283085f 100644
--- a/include/configs/imx8mm_venice.h
+++ b/include/configs/imx8mm_venice.h
@@ -26,7 +26,6 @@
 	func(DHCP, dhcp, na)
 #include <config_distro_bootcmd.h>
 #define CFG_EXTRA_ENV_SETTINGS \
-	"splblk=0x42\0" \
 	BOOTENV
 
 #define CFG_SYS_INIT_RAM_ADDR        0x40000000
diff --git a/include/configs/imx8mn_venice.h b/include/configs/imx8mn_venice.h
index 80c2df9f30ff..3db997e9e7f4 100644
--- a/include/configs/imx8mn_venice.h
+++ b/include/configs/imx8mn_venice.h
@@ -20,7 +20,6 @@
 	func(DHCP, dhcp, na)
 #include <config_distro_bootcmd.h>
 #define CFG_EXTRA_ENV_SETTINGS \
-	"splblk=0x40\0" \
 	BOOTENV
 
 #define CFG_SYS_INIT_RAM_ADDR        0x40000000
diff --git a/include/configs/imx8mp_venice.h b/include/configs/imx8mp_venice.h
index 4b32d5a77ef6..b5ee8c98fbbe 100644
--- a/include/configs/imx8mp_venice.h
+++ b/include/configs/imx8mp_venice.h
@@ -20,7 +20,6 @@
 	func(DHCP, dhcp, na)
 #include <config_distro_bootcmd.h>
 #define CFG_EXTRA_ENV_SETTINGS \
-	"splblk=0x40\0" \
 	BOOTENV
 
 #define CFG_SYS_INIT_RAM_ADDR        0x40000000
-- 
2.25.1



More information about the U-Boot mailing list