[PATCH] xilinx: board: Add support to pick bootscr address from DT

Michal Simek michal.simek at amd.com
Tue Jun 13 16:12:52 CEST 2023


From: Algapally Santosh Sagar <santoshsagar.algapally at amd.com>

The bootscript is expected at a default address specific to each
platform.
When high speed memory like Programmable Logic Double Data Rate RAM
(PL DDR RAM) or Higher Bandwidth Memory RAM (HBM) is used the boot.scr
may be loaded at a different offset. The offset needs to be set through
setenv. Due to the default values in some cases the boot.scr is falling
in between the kernel partition.

The bootscript address or the bootscript offset is fetched directly from
the DT and updated in the environment making it easier for automated
flows.

Signed-off-by: Algapally Santosh Sagar <santoshsagar.algapally at amd.com>
Signed-off-by: Michal Simek <michal.simek at amd.com>
---

 board/xilinx/common/board.c | 43 ++++++++++++++++++++++++++++++++++---
 1 file changed, 40 insertions(+), 3 deletions(-)

diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c
index d071ebfb9cc2..bdd4113b0916 100644
--- a/board/xilinx/common/board.c
+++ b/board/xilinx/common/board.c
@@ -405,6 +405,31 @@ static int env_set_by_index(const char *name, int index, char *data)
 	return env_set(var, data);
 }
 
+static int get_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset)
+{
+	int ret;
+	ofnode uboot;
+
+	*bootscr_address = 0;
+	*bootscr_offset = 0;
+
+	uboot = ofnode_path("/options/u-boot");
+	if (!ofnode_valid(uboot)) {
+		printf("%s: Missing /u-boot node\n", __func__);
+		return -EINVAL;
+	}
+
+	ret = ofnode_read_u64(uboot, "bootscr-address", bootscr_address);
+	if (ret) {
+		ret = ofnode_read_u64(uboot, "bootscr-offset-from-ram-start",
+				      bootscr_offset);
+		if (ret)
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
 int board_late_init_xilinx(void)
 {
 	u32 ret = 0;
@@ -414,9 +439,21 @@ int board_late_init_xilinx(void)
 
 	if (!IS_ENABLED(CONFIG_MICROBLAZE)) {
 		ulong scriptaddr;
-
-		scriptaddr = env_get_hex("scriptaddr", 0);
-		ret |= env_set_hex("scriptaddr", gd->ram_base + scriptaddr);
+		u64 bootscr_address;
+		u64 bootscr_offset;
+
+		/* Fetch bootscr_address/bootscr_offset from DT and update */
+		if (!get_bootscript_address(&bootscr_address, &bootscr_offset)) {
+			if (bootscr_offset)
+				ret |= env_set_hex("scriptaddr",
+						   gd->ram_base + bootscr_offset);
+			else
+				ret |= env_set_hex("scriptaddr", bootscr_address);
+		} else {
+			/* Update scriptaddr(bootscr offset) from env */
+			scriptaddr = env_get_hex("scriptaddr", 0);
+			ret |= env_set_hex("scriptaddr", gd->ram_base + scriptaddr);
+		}
 	}
 
 	if (IS_ENABLED(CONFIG_ARCH_ZYNQ) || IS_ENABLED(CONFIG_MICROBLAZE))
-- 
2.36.1



More information about the U-Boot mailing list