diff --git a/env/env.c b/env/env.c index e4dfb92e15..69848fb060 100644 --- a/env/env.c +++ b/env/env.c @@ -109,6 +109,33 @@ static void env_set_inited(enum env_location location) gd->env_has_init |= BIT(location); } +/** + * 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 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 + * 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 arch_env_get_location(enum env_operation op, int prio) +{ + if (prio >= ARRAY_SIZE(env_locations)) + return ENVL_UNKNOWN; + + return env_locations[prio]; +} + /** * env_get_location() - Returns the best env location for a board * @op: operations performed on the environment @@ -129,13 +156,9 @@ static void env_set_inited(enum env_location location) */ __weak enum env_location env_get_location(enum env_operation op, int prio) { - if (prio >= ARRAY_SIZE(env_locations)) - return ENVL_UNKNOWN; - - return env_locations[prio]; + return arch_env_get_location(op, prio); } - /** * env_driver_lookup() - Finds the most suited environment location * @op: operations performed on the environment diff --git a/include/env_internal.h b/include/env_internal.h index b704c03363..f30fd6159d 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