[PATCH] xilinx: board: Add support to pick bootscr address from DT
Simon Glass
sjg at chromium.org
Thu Jun 15 11:14:36 CEST 2023
Hi Michal,
On Tue, 13 Jun 2023 at 15:13, Michal Simek <michal.simek at amd.com> wrote:
>
> From: Algapally Santosh Sagar <santoshsagar.algapally at amd.com>
>
> The bootscript is expected at a default address specific to each
> platform.
Who puts it there?
> 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);
Normally we would have the size under the control of a #address-cells
property. Do you think we should do that here?
> + 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
>
Regards,
Simon
More information about the U-Boot
mailing list