[PATCH 1/3] env: Implement lower priority arch_env_get_location()

Currently there is only one way to override desired environment location, by implementing env_get_location(). This is increasingly being conflated both on board level and architecture level, which leads to a problem on boards where this function is already implemented on architecture level, since those boards have no way to override this environment location on board level anymore.
Implement arch_env_get_location() function which is architecture specific and should only ever be implemented in architecture code. This function has lower priority than env_get_location(), which should only ever be implemented in board code, and which overrides the arch_env_get_location() architecture environment selection.
This way, architecture can define its default environment chooser, while board can now override it as needed at all times.
There is no functional change, since env_get_location() simply returns arch_env_get_location(), and arch_env_get_location() implements the current env_get_location() default content.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com --- env/env.c | 29 ++++++++++++++++++++++++++--- include/env_internal.h | 16 ++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/env/env.c b/env/env.c index e4dfb92e154..69848fb0608 100644 --- a/env/env.c +++ b/env/env.c @@ -110,13 +110,14 @@ static void env_set_inited(enum env_location location) }
/** - * env_get_location() - Returns the best env location for a board + * arch_env_get_location() - Returns the best env location for an arch * @op: operations performed on the environment * @prio: priority between the multiple environments, 0 being the * highest priority * * This will return the preferred environment for the given priority. - * This is overridable by boards if they need to. + * This is overridable by architectures if they need to and has lower + * priority than board side env_get_location() override. * * All implementations are free to use the operation, the priority and * any other data relevant to their choice, but must take into account @@ -127,7 +128,7 @@ static void env_set_inited(enum env_location location) * Returns: * an enum env_location value on success, a negative error code otherwise */ -__weak enum env_location env_get_location(enum env_operation op, int prio) +__weak enum env_location arch_env_get_location(enum env_operation op, int prio) { if (prio >= ARRAY_SIZE(env_locations)) return ENVL_UNKNOWN; @@ -135,6 +136,28 @@ __weak enum env_location env_get_location(enum env_operation op, int prio) return env_locations[prio]; }
+/** + * env_get_location() - Returns the best env location for a board + * @op: operations performed on the environment + * @prio: priority between the multiple environments, 0 being the + * highest priority + * + * This will return the preferred environment for the given priority. + * This is overridable by boards if they need to. + * + * All implementations are free to use the operation, the priority and + * any other data relevant to their choice, but must take into account + * the fact that the lowest prority (0) is the most important location + * in the system. The following locations should be returned by order + * of descending priorities, from the highest to the lowest priority. + * + * Returns: + * an enum env_location value on success, a negative error code otherwise + */ +__weak enum env_location env_get_location(enum env_operation op, int prio) +{ + return arch_env_get_location(op, prio); +}
/** * env_driver_lookup() - Finds the most suited environment location diff --git a/include/env_internal.h b/include/env_internal.h index 07c227ecc03..14f4c696785 100644 --- a/include/env_internal.h +++ b/include/env_internal.h @@ -234,10 +234,26 @@ const char *env_ext4_get_intf(void); */ const char *env_ext4_get_dev_part(void);
+/** + * arch_env_get_location()- Provide the best location for the U-Boot environment + * + * It is a weak function allowing board to overidde the environment location + * on architecture level. This has lower priority than env_get_location(), + * which can be defined on board level. + * + * @op: operations performed on the environment + * @prio: priority between the multiple environments, 0 being the + * highest priority + * Return: an enum env_location value on success, or -ve error code. + */ +enum env_location arch_env_get_location(enum env_operation op, int prio); + /** * env_get_location()- Provide the best location for the U-Boot environment * * It is a weak function allowing board to overidde the environment location + * on board level. This has higher priority than arch_env_get_location(), + * which can be defined on architecture level. * * @op: operations performed on the environment * @prio: priority between the multiple environments, 0 being the

Implement arch_env_get_location() instead of env_get_location(), so that the env_get_location() can be implemented on board level and override the arch_env_get_location() architecture defaults.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com --- arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c index 177f568f26e..8eed389cc3e 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c @@ -818,7 +818,7 @@ int mmc_get_env_dev(void) } #endif
-enum env_location env_get_location(enum env_operation op, int prio) +enum env_location arch_env_get_location(enum env_operation op, int prio) { enum boot_src src = get_boot_src(); enum env_location env_loc = ENVL_NOWHERE;

On Wed, Apr 06, 2022 at 02:21:33AM +0200, Marek Vasut wrote:
Implement arch_env_get_location() instead of env_get_location(), so that the env_get_location() can be implemented on board level and override the arch_env_get_location() architecture defaults.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com
Applied to u-boot/master, thanks!

Implement arch_env_get_location() instead of env_get_location(), so that the env_get_location() can be implemented on board level and override the arch_env_get_location() architecture defaults.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com --- arch/arm/mach-imx/imx8m/soc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index fc29208af29..ea6cbf2c3f0 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -1314,7 +1314,7 @@ void do_error(struct pt_regs *pt_regs) #endif
#if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP) -enum env_location env_get_location(enum env_operation op, int prio) +enum env_location arch_env_get_location(enum env_operation op, int prio) { enum boot_device dev = get_boot_device();

On Wed, Apr 06, 2022 at 02:21:34AM +0200, Marek Vasut wrote:
Implement arch_env_get_location() instead of env_get_location(), so that the env_get_location() can be implemented on board level and override the arch_env_get_location() architecture defaults.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com
Applied to u-boot/master, thanks!

On Wed, Apr 06, 2022 at 02:21:32AM +0200, Marek Vasut wrote:
Currently there is only one way to override desired environment location, by implementing env_get_location(). This is increasingly being conflated both on board level and architecture level, which leads to a problem on boards where this function is already implemented on architecture level, since those boards have no way to override this environment location on board level anymore.
Implement arch_env_get_location() function which is architecture specific and should only ever be implemented in architecture code. This function has lower priority than env_get_location(), which should only ever be implemented in board code, and which overrides the arch_env_get_location() architecture environment selection.
This way, architecture can define its default environment chooser, while board can now override it as needed at all times.
There is no functional change, since env_get_location() simply returns arch_env_get_location(), and arch_env_get_location() implements the current env_get_location() default content.
Signed-off-by: Marek Vasut marex@denx.de Cc: Adam Ford aford173@gmail.com Cc: Fabio Estevam festevam@denx.de Cc: Marek Behún marek.behun@nic.cz Cc: Peng Fan peng.fan@nxp.com Cc: Simon Glass sjg@chromium.org Cc: Stefano Babic sbabic@denx.de Cc: Tim Harvey tharvey@gateworks.com Cc: Tom Rini trini@konsulko.com Cc: Tommaso Merciai tomm.merciai@gmail.com Cc: Vladimir Oltean vladimir.oltean@nxp.com
Applied to u-boot/master, thanks!
participants (2)
-
Marek Vasut
-
Tom Rini