public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: "Marek Behún" <kabel@kernel.org>
To: "Simon Glass" <sjg@chromium.org>, "Stefan Roese" <sr@denx.de>,
	"Pali Rohár" <pali@kernel.org>
Cc: u-boot@lists.denx.de, "Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH 5/5] arm: mvebu: Espressobin: Use new API for setting default env at runtime
Date: Thu, 28 Oct 2021 05:28:10 +0200	[thread overview]
Message-ID: <20211028032810.18146-6-kabel@kernel.org> (raw)
In-Reply-To: <20211028032810.18146-1-kabel@kernel.org>

From: Marek Behún <marek.behun@nic.cz>

ESPRESSObin's board code uses an ad-hoc solution for ensuring that
ethaddrs are not overwritten by `env default -a` command and that the
`fdtfile` is set to correct value when `env default -a` is called.

This ad-hoc solution is overwriting the default_environment[] buffer in
board_late_init().

Since now we have a specific API for overwriting default environment,
convert this ad-hoc code to this new API.

Since the default_environment[] buffer is not overwritten anymore by any
board, remove support for read-write default_environment[].

Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
 board/Marvell/mvebu_armada-37xx/board.c     | 120 ++++++++++++--------
 configs/mvebu_espressobin-88f3720_defconfig |   1 -
 include/configs/mvebu_armada-37xx.h         |  17 +--
 include/env_default.h                       |   2 -
 include/env_internal.h                      |   4 -
 5 files changed, 75 insertions(+), 69 deletions(-)

diff --git a/board/Marvell/mvebu_armada-37xx/board.c b/board/Marvell/mvebu_armada-37xx/board.c
index d7b6ecafbf..5464482423 100644
--- a/board/Marvell/mvebu_armada-37xx/board.c
+++ b/board/Marvell/mvebu_armada-37xx/board.c
@@ -84,43 +84,16 @@ int board_init(void)
 	return 0;
 }
 
-#ifdef CONFIG_BOARD_LATE_INIT
-int board_late_init(void)
+static bool ram_is_ddr4(void)
 {
-	char *ptr = &default_environment[0];
-	struct udevice *dev;
-	struct mmc *mmc_dev;
-	bool ddr4, emmc;
-	const char *mac;
-	char eth[10];
-	int i;
-
-	if (!of_machine_is_compatible("globalscale,espressobin"))
-		return 0;
-
-	/* Find free buffer in default_environment[] for new variables */
-	while (*ptr != '\0' && *(ptr+1) != '\0') ptr++;
-	ptr += 2;
-
-	/*
-	 * Ensure that 'env default -a' does not erase permanent MAC addresses
-	 * stored in env variables: $ethaddr, $eth1addr, $eth2addr and $eth3addr
-	 */
-
-	mac = env_get("ethaddr");
-	if (mac && strlen(mac) <= 17)
-		ptr += sprintf(ptr, "ethaddr=%s", mac) + 1;
-
-	for (i = 1; i <= 3; i++) {
-		sprintf(eth, "eth%daddr", i);
-		mac = env_get(eth);
-		if (mac && strlen(mac) <= 17)
-			ptr += sprintf(ptr, "%s=%s", eth, mac) + 1;
-	}
-
-	/* If the memory controller has been configured for DDR4, we're running on v7 */
-	ddr4 = ((readl(A3700_CH0_MC_CTRL2_REG) >> A3700_MC_CTRL2_SDRAM_TYPE_OFFS)
+	return ((readl(A3700_CH0_MC_CTRL2_REG) >> A3700_MC_CTRL2_SDRAM_TYPE_OFFS)
 		& A3700_MC_CTRL2_SDRAM_TYPE_MASK) == A3700_MC_CTRL2_SDRAM_TYPE_DDR4;
+}
+
+static bool has_emmc(void)
+{
+	struct mmc *mmc_dev;
+	bool emmc;
 
 	/* eMMC is mmc dev num 1 */
 	mmc_dev = find_mmc_device(1);
@@ -128,24 +101,79 @@ int board_late_init(void)
 
 	/* if eMMC is not present then remove it from DM */
 	if (!emmc && mmc_dev) {
+		struct udevice *dev;
 		dev = mmc_dev->dev;
 		device_remove(dev, DM_REMOVE_NORMAL);
 		device_unbind(dev);
 	}
 
-	/* Ensure that 'env default -a' set correct value to $fdtfile */
-	if (ddr4 && emmc)
-		strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7-emmc.dtb");
-	else if (ddr4)
-		strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7.dtb");
-	else if (emmc)
-		strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-emmc.dtb");
-	else
-		strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin.dtb");
+	return emmc;
+}
 
-	return 0;
+const char *board_special_default_env(unsigned i, const char **name)
+{
+	static unsigned nvars;
+	static bool built;
+	static struct {
+		const char *name;
+		char *value;
+	} vars[5];
+
+	if (!of_machine_is_compatible("globalscale,espressobin"))
+		return NULL;
+
+	/*
+	 * We can access ethNaddr variables only when environment is valid.
+	 * We can access mmc only if relocated (initr_env() is called after
+	 * initr_mmc(), so at this point mmc device is present.
+	 */
+	if (gd->env_valid != ENV_VALID || !(gd->flags & GD_FLG_RELOC))
+		return NULL;
+
+	if (!built) {
+		const char *names[4] = { "ethaddr", "eth1addr", "eth2addr",
+					 "eth3addr" };
+		bool ddr4, emmc;
+
+		for (i = 0; i < 4; ++i) {
+			const char *mac;
+
+			mac = env_get(names[i]);
+			if (mac && strlen(mac) <= 17) {
+				vars[nvars].name = names[i];
+				vars[nvars].value = strdup(mac);
+				++nvars;
+			}
+		}
+
+		/*
+		 * If the memory controller has been configured for DDR4, we're
+		 * running on v7
+		 */
+		ddr4 = ram_is_ddr4();
+
+		emmc = has_emmc();
+
+		vars[nvars].name = "fdtfile";
+		if (ddr4 && emmc)
+			vars[nvars].value = "marvell/armada-3720-espressobin-v7-emmc.dtb";
+		else if (ddr4)
+			vars[nvars].value = "marvell/armada-3720-espressobin-v7.dtb";
+		else if (emmc)
+			vars[nvars].value = "marvell/armada-3720-espressobin-emmc.dtb";
+		else
+			vars[nvars].value = "marvell/armada-3720-espressobin.dtb";
+		++nvars;
+
+		built = true;
+	}
+
+	if (i >= nvars)
+		return NULL;
+
+	*name = vars[i].name;
+	return vars[i].value;
 }
-#endif
 
 /* Board specific AHCI / SATA enable code */
 int board_ahci_enable(void)
diff --git a/configs/mvebu_espressobin-88f3720_defconfig b/configs/mvebu_espressobin-88f3720_defconfig
index 3a69954fcd..3dc6da04f8 100644
--- a/configs/mvebu_espressobin-88f3720_defconfig
+++ b/configs/mvebu_espressobin-88f3720_defconfig
@@ -24,7 +24,6 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_DISPLAY_BOARDINFO_LATE=y
 CONFIG_ARCH_EARLY_INIT_R=y
 CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_LATE_INIT=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
diff --git a/include/configs/mvebu_armada-37xx.h b/include/configs/mvebu_armada-37xx.h
index e7f7e772fc..1669eaf715 100644
--- a/include/configs/mvebu_armada-37xx.h
+++ b/include/configs/mvebu_armada-37xx.h
@@ -35,11 +35,6 @@
 /* End of 16M scrubbed by training in bootrom */
 #define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_TEXT_BASE + 0xFF0000)
 
-/*
- * Environment
- */
-#define DEFAULT_ENV_IS_RW		/* required for configuring default fdtfile= */
-
 /*
  * Ethernet Driver configuration
  */
@@ -70,15 +65,6 @@
 
 #include <config_distro_bootcmd.h>
 
-/* filler for default values filled by board_early_init_f() */
-#define ENV_RW_FILLER \
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" /* for ethaddr= */ \
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" /* for eth1addr= */ \
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" /* for eth2addr= */ \
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" /* for eth3addr= */ \
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" /* for fdtfile= */ \
-	""
-
 /* fdt_addr and kernel_addr are needed for existing distribution boot scripts */
 #define CONFIG_EXTRA_ENV_SETTINGS	\
 	"scriptaddr=0x6d00000\0"	\
@@ -88,7 +74,6 @@
 	"kernel_addr=0x7000000\0"	\
 	"kernel_addr_r=0x7000000\0"	\
 	"ramdisk_addr_r=0xa000000\0"	\
-	BOOTENV \
-	ENV_RW_FILLER
+	BOOTENV
 
 #endif /* _CONFIG_MVEBU_ARMADA_37XX_H */
diff --git a/include/env_default.h b/include/env_default.h
index 23430dc70d..a1bdf97d38 100644
--- a/include/env_default.h
+++ b/include/env_default.h
@@ -19,8 +19,6 @@ env_t embedded_environment __UBOOT_ENV_SECTION__(environment) = {
 	{
 #elif defined(DEFAULT_ENV_INSTANCE_STATIC)
 static char default_environment[] = {
-#elif defined(DEFAULT_ENV_IS_RW)
-char default_environment[] = {
 #else
 const char default_environment[] = {
 #endif
diff --git a/include/env_internal.h b/include/env_internal.h
index f74927cd64..e0fc3e0070 100644
--- a/include/env_internal.h
+++ b/include/env_internal.h
@@ -111,11 +111,7 @@ typedef struct environment_s {
 extern env_t embedded_environment;
 #endif /* ENV_IS_EMBEDDED */
 
-#ifdef DEFAULT_ENV_IS_RW
-extern char default_environment[];
-#else
 extern const char default_environment[];
-#endif
 
 #ifndef DO_DEPS_ONLY
 
-- 
2.32.0


  parent reply	other threads:[~2021-10-28  3:29 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-28  3:28 [PATCH 0/5] Board specific runtime determined default env Marek Behún
2021-10-28  3:28 ` [PATCH 1/5] env: Don't set ready flag if import failed in env_set_default() Marek Behún
2021-10-29  3:17   ` Simon Glass
2021-10-28  3:28 ` [PATCH 2/5] env: Fix env_get() when returning empty string using env_get_f() Marek Behún
2021-10-29  3:17   ` Simon Glass
2021-10-29  8:51     ` Marek Behún
2021-10-29  9:03     ` Pali Rohár
2021-10-31 13:07       ` Simon Glass
2021-10-31 15:27         ` Marek Behún
2021-10-28  3:28 ` [PATCH 3/5] env: Simplify env_get_default() Marek Behún
2021-10-29  3:17   ` Simon Glass
2021-10-28  3:28 ` [PATCH 4/5] env: Add support for board specific special default environment Marek Behún
2021-10-29  3:17   ` Simon Glass
2021-10-29  8:57     ` Marek Behún
2021-10-31 13:07       ` Simon Glass
2021-10-28  3:28 ` Marek Behún [this message]
2021-10-29  3:17   ` [PATCH 5/5] arm: mvebu: Espressobin: Use new API for setting default env at runtime Simon Glass
2021-10-31 20:15   ` Pali Rohár
2021-11-02 14:57     ` Simon Glass
2021-11-03 10:48       ` Pali Rohár
2021-10-29  3:17 ` [PATCH 0/5] Board specific runtime determined default env Simon Glass

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=20211028032810.18146-6-kabel@kernel.org \
    --to=kabel@kernel.org \
    --cc=marek.behun@nic.cz \
    --cc=pali@kernel.org \
    --cc=sjg@chromium.org \
    --cc=sr@denx.de \
    --cc=u-boot@lists.denx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox