mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
bootstd: Remove special-case code for boot_targets
Rather than implement this as its own case in build_order(), process the boot_targets environment variable in the bootstd_get_bootdev_order() function. This allows build_order() to be simplified. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
3e96ed44e8
commit
6a6638f093
3 changed files with 32 additions and 31 deletions
|
@ -12,7 +12,6 @@
|
||||||
#include <bootflow.h>
|
#include <bootflow.h>
|
||||||
#include <bootmeth.h>
|
#include <bootmeth.h>
|
||||||
#include <bootstd.h>
|
#include <bootstd.h>
|
||||||
#include <env.h>
|
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
@ -504,34 +503,13 @@ static int build_order(struct udevice *bootstd, struct udevice **order,
|
||||||
const char *overflow_target = NULL;
|
const char *overflow_target = NULL;
|
||||||
const char *const *labels;
|
const char *const *labels;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
const char *targets;
|
|
||||||
int i, ret, count;
|
int i, ret, count;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
targets = env_get("boot_targets");
|
labels = bootstd_get_bootdev_order(bootstd, &ok);
|
||||||
labels = IS_ENABLED(CONFIG_BOOTSTD_FULL) ?
|
if (!ok)
|
||||||
bootstd_get_bootdev_order(bootstd) : NULL;
|
return log_msg_ret("ord", -ENOMEM);
|
||||||
if (targets) {
|
if (labels) {
|
||||||
char str[BOOT_TARGETS_MAX_LEN];
|
|
||||||
char *target;
|
|
||||||
|
|
||||||
if (strlen(targets) >= BOOT_TARGETS_MAX_LEN)
|
|
||||||
return log_msg_ret("len", -E2BIG);
|
|
||||||
|
|
||||||
/* make a copy of the string, since strok() will change it */
|
|
||||||
strcpy(str, targets);
|
|
||||||
for (i = 0, target = strtok(str, " "); target;
|
|
||||||
target = strtok(NULL, " ")) {
|
|
||||||
ret = bootdev_find_by_label(target, &dev);
|
|
||||||
if (!ret) {
|
|
||||||
if (i == max_count) {
|
|
||||||
overflow_target = target;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
order[i++] = dev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
count = i;
|
|
||||||
} else if (labels) {
|
|
||||||
int upto;
|
int upto;
|
||||||
|
|
||||||
upto = 0;
|
upto = 0;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <bootflow.h>
|
#include <bootflow.h>
|
||||||
#include <bootstd.h>
|
#include <bootstd.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
|
#include <env.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <dm/device-internal.h>
|
#include <dm/device-internal.h>
|
||||||
|
@ -72,9 +73,23 @@ static int bootstd_remove(struct udevice *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *const *const bootstd_get_bootdev_order(struct udevice *dev)
|
const char *const *const bootstd_get_bootdev_order(struct udevice *dev,
|
||||||
|
bool *okp)
|
||||||
{
|
{
|
||||||
struct bootstd_priv *std = dev_get_priv(dev);
|
struct bootstd_priv *std = dev_get_priv(dev);
|
||||||
|
const char *targets = env_get("boot_targets");
|
||||||
|
|
||||||
|
*okp = true;
|
||||||
|
log_debug("- targets %s %p\n", targets, std->bootdev_order);
|
||||||
|
if (targets && *targets) {
|
||||||
|
str_free_list(std->env_order);
|
||||||
|
std->env_order = str_to_list(targets);
|
||||||
|
if (!std->env_order) {
|
||||||
|
*okp = false;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return std->env_order;
|
||||||
|
}
|
||||||
|
|
||||||
return std->bootdev_order;
|
return std->bootdev_order;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,10 @@ struct udevice;
|
||||||
* @prefixes: NULL-terminated list of prefixes to use for bootflow filenames,
|
* @prefixes: NULL-terminated list of prefixes to use for bootflow filenames,
|
||||||
* e.g. "/", "/boot/"; NULL if none
|
* e.g. "/", "/boot/"; NULL if none
|
||||||
* @bootdev_order: Order to use for bootdevs (or NULL if none), with each item
|
* @bootdev_order: Order to use for bootdevs (or NULL if none), with each item
|
||||||
* being a bootdev label, e.g. "mmc2", "mmc1";
|
* being a bootdev label, e.g. "mmc2", "mmc1" (NULL terminated)
|
||||||
|
* @env_order: Order as specified by the boot_targets env var (or NULL if none),
|
||||||
|
* with each item being a bootdev label, e.g. "mmc2", "mmc1" (NULL
|
||||||
|
* terminated)
|
||||||
* @cur_bootdev: Currently selected bootdev (for commands)
|
* @cur_bootdev: Currently selected bootdev (for commands)
|
||||||
* @cur_bootflow: Currently selected bootflow (for commands)
|
* @cur_bootflow: Currently selected bootflow (for commands)
|
||||||
* @glob_head: Head for the global list of all bootflows across all bootdevs
|
* @glob_head: Head for the global list of all bootflows across all bootdevs
|
||||||
|
@ -34,6 +37,7 @@ struct udevice;
|
||||||
struct bootstd_priv {
|
struct bootstd_priv {
|
||||||
const char **prefixes;
|
const char **prefixes;
|
||||||
const char **bootdev_order;
|
const char **bootdev_order;
|
||||||
|
const char **env_order;
|
||||||
struct udevice *cur_bootdev;
|
struct udevice *cur_bootdev;
|
||||||
struct bootflow *cur_bootflow;
|
struct bootflow *cur_bootflow;
|
||||||
struct list_head glob_head;
|
struct list_head glob_head;
|
||||||
|
@ -51,9 +55,13 @@ struct bootstd_priv {
|
||||||
* The list is alloced by the bootstd driver so should not be freed. That is the
|
* The list is alloced by the bootstd driver so should not be freed. That is the
|
||||||
* reason for all the const stuff in the function signature
|
* reason for all the const stuff in the function signature
|
||||||
*
|
*
|
||||||
* Return: list of string points, terminated by NULL; or NULL if no boot order
|
* @dev: bootstd device
|
||||||
|
* @okp: returns true if OK, false if out of memory
|
||||||
|
* Return: list of string pointers, terminated by NULL; or NULL if no boot
|
||||||
|
* order. Note that this returns NULL in the case of an empty list
|
||||||
*/
|
*/
|
||||||
const char *const *const bootstd_get_bootdev_order(struct udevice *dev);
|
const char *const *const bootstd_get_bootdev_order(struct udevice *dev,
|
||||||
|
bool *okp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bootstd_get_prefixes() - Get the filename-prefixes list
|
* bootstd_get_prefixes() - Get the filename-prefixes list
|
||||||
|
|
Loading…
Reference in a new issue