[PATCH] xilinx: Add option to load environment from outside of boot media
Michal Simek
michal.simek at amd.com
Mon May 27 09:34:45 CEST 2024
On 5/22/24 19:47, Vasileios Amoiridis wrote:
> From: Vasileios Amoiridis <vasileios.amoiridis at cern.ch>
>
> Currently, if the environment is not in the current boot media, the
> env_get_location() is returning ENVL_UNKNOWN or ENVL_NOWHERE which
> is not true (i.e booting from FLASH with environment in eMMC). This
> commit adds an extra check to find the environment in the other
> supported boot media, keeping the same priority as of now.
>
> Signed-off-by: Vasileios Amoiridis <vasileios.amoiridis at cern.ch>
> ---
> board/xilinx/versal-net/board.c | 21 +++++++++++++++++++--
> board/xilinx/versal/board.c | 23 ++++++++++++++++++++---
> board/xilinx/zynq/board.c | 31 +++++++++++++++++++++++++++----
> board/xilinx/zynqmp/zynqmp.c | 31 +++++++++++++++++++++++++++----
> 4 files changed, 93 insertions(+), 13 deletions(-)
>
> diff --git a/board/xilinx/versal-net/board.c b/board/xilinx/versal-net/board.c
> index da03024e16..5648d6685e 100644
> --- a/board/xilinx/versal-net/board.c
> +++ b/board/xilinx/versal-net/board.c
> @@ -372,6 +372,21 @@ void reset_cpu(void)
> {
> }
>
> +static enum env_location env_locations[] = {
> +#ifdef CONFIG_ENV_IS_IN_FAT
> + ENVL_FAT,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_EXT4
> + ENVL_EXT4,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
> + ENVL_SPI_FLASH,
> +#endif
> +#ifdef CONFIG_ENV_IS_NOWHERE
> + ENVL_NOWHERE,
> +#endif
> +};
> +
> #if defined(CONFIG_ENV_IS_NOWHERE)
> enum env_location env_get_location(enum env_operation op, int prio)
> {
> @@ -389,17 +404,19 @@ enum env_location env_get_location(enum env_operation op, int prio)
> return ENVL_FAT;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_EXT4))
> return ENVL_EXT4;
> - return ENVL_NOWHERE;
> + break;
> case OSPI_MODE:
> case QSPI_MODE_24BIT:
> case QSPI_MODE_32BIT:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
> return ENVL_SPI_FLASH;
> - return ENVL_NOWHERE;
> + break;
> case JTAG_MODE:
> case SELECTMAP_MODE:
> default:
> return ENVL_NOWHERE;
> }
> +
> + return env_locations[prio];
> }
> #endif
> diff --git a/board/xilinx/versal/board.c b/board/xilinx/versal/board.c
> index 4f6d56119d..8aed2e97df 100644
> --- a/board/xilinx/versal/board.c
> +++ b/board/xilinx/versal/board.c
> @@ -291,12 +291,27 @@ void reset_cpu(void)
> {
> }
>
> +static enum env_location env_locations[] = {
> +#ifdef CONFIG_ENV_IS_IN_FAT
> + ENVL_FAT,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_EXT4
> + ENVL_EXT4,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
> + ENVL_SPI_FLASH,
> +#endif
> +#ifdef CONFIG_ENV_IS_NOWHERE
> + ENVL_NOWHERE,
> +#endif
> +};
> +
> #if defined(CONFIG_ENV_IS_NOWHERE)
> enum env_location env_get_location(enum env_operation op, int prio)
> {
> u32 bootmode = versal_get_bootmode();
>
> - if (prio)
> + if (prio >= ARRAY_SIZE(env_locations))
> return ENVL_UNKNOWN;
>
> switch (bootmode) {
> @@ -308,17 +323,19 @@ enum env_location env_get_location(enum env_operation op, int prio)
> return ENVL_FAT;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_EXT4))
> return ENVL_EXT4;
> - return ENVL_NOWHERE;
> + break;
> case OSPI_MODE:
> case QSPI_MODE_24BIT:
> case QSPI_MODE_32BIT:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
> return ENVL_SPI_FLASH;
> - return ENVL_NOWHERE;
> + break;
> case JTAG_MODE:
> case SELECTMAP_MODE:
> default:
> return ENVL_NOWHERE;
> }
> +
> + return env_locations[prio];
> }
> #endif
> diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> index 6c36591001..6fa5016cdd 100644
> --- a/board/xilinx/zynq/board.c
> +++ b/board/xilinx/zynq/board.c
> @@ -134,11 +134,32 @@ int dram_init(void)
> }
> #endif
>
> +static enum env_location env_locations[] = {
> +#ifdef CONFIG_ENV_IS_IN_FAT
> + ENVL_FAT,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_EXT4
> + ENVL_EXT4,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_NAND
> + ENVL_NAND,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_UBI
> + ENVL_UBI,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
> + ENVL_SPI_FLASH,
> +#endif
> +#ifdef CONFIG_ENV_IS_NOWHERE
> + ENVL_NOWHERE,
> +#endif
> +};
> +
> enum env_location env_get_location(enum env_operation op, int prio)
> {
> u32 bootmode = zynq_slcr_get_boot_mode() & ZYNQ_BM_MASK;
>
> - if (prio)
> + if (prio >= ARRAY_SIZE(env_locations))
> return ENVL_UNKNOWN;
>
> switch (bootmode) {
> @@ -147,22 +168,24 @@ enum env_location env_get_location(enum env_operation op, int prio)
> return ENVL_FAT;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_EXT4))
> return ENVL_EXT4;
> - return ENVL_NOWHERE;
> + break;
> case ZYNQ_BM_NAND:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_NAND))
> return ENVL_NAND;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_UBI))
> return ENVL_UBI;
> - return ENVL_NOWHERE;
> + break;
> case ZYNQ_BM_NOR:
> case ZYNQ_BM_QSPI:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
> return ENVL_SPI_FLASH;
> - return ENVL_NOWHERE;
> + break;
> case ZYNQ_BM_JTAG:
> default:
> return ENVL_NOWHERE;
> }
> +
> + return env_locations[prio];
> }
>
> #if defined(CONFIG_SET_DFU_ALT_INFO)
> diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> index f370fb7347..7e646d342b 100644
> --- a/board/xilinx/zynqmp/zynqmp.c
> +++ b/board/xilinx/zynqmp/zynqmp.c
> @@ -588,12 +588,33 @@ int mmc_get_env_dev(void)
> return bootseq;
> }
>
> +static enum env_location env_locations[] = {
> +#ifdef CONFIG_ENV_IS_IN_FAT
> + ENVL_FAT,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_EXT4
> + ENVL_EXT4,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_NAND
> + ENVL_NAND,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_UBI
> + ENVL_UBI,
> +#endif
> +#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
> + ENVL_SPI_FLASH,
> +#endif
> +#ifdef CONFIG_ENV_IS_NOWHERE
> + ENVL_NOWHERE,
> +#endif
> +};
> +
> #if defined(CONFIG_ENV_IS_NOWHERE)
> enum env_location env_get_location(enum env_operation op, int prio)
> {
> u32 bootmode = zynqmp_get_bootmode();
>
> - if (prio)
> + if (prio >= ARRAY_SIZE(env_locations))
> return ENVL_UNKNOWN;
>
if (!prio) {
switch ...
}
please look below.
(NOTE: Above you are not fixing all handling around prio > 0)
> switch (bootmode) {
> @@ -605,22 +626,24 @@ enum env_location env_get_location(enum env_operation op, int prio)
> return ENVL_FAT;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_EXT4))
> return ENVL_EXT4;
> - return ENVL_NOWHERE;
> + break;
> case NAND_MODE:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_NAND))
> return ENVL_NAND;
> if (IS_ENABLED(CONFIG_ENV_IS_IN_UBI))
> return ENVL_UBI;
> - return ENVL_NOWHERE;
> + break;
> case QSPI_MODE_24BIT:
> case QSPI_MODE_32BIT:
> if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
> return ENVL_SPI_FLASH;
> - return ENVL_NOWHERE;
> + break;
> case JTAG_MODE:
> default:
> return ENVL_NOWHERE;
> }
> +
> + return env_locations[prio];
And here call
return arch_env_get_location(op, prio);
This can avoid duplication of these env_locations[] across all our SOCs.
And pretty much fallback to standard implementation which is IMHO good solution.
What do you think?
Thanks,
Michal
More information about the U-Boot
mailing list