]> Git Repo - J-u-boot.git/blobdiff - boot/bootflow.c
Merge patch series "mtd: spi-nor: Add support for S25FS-S family"
[J-u-boot.git] / boot / bootflow.c
index 7f5b0e9420789eb59bf2fa376e11296516f0537d..59d77d2385f4e566911cab792a850319cf16864d 100644 (file)
@@ -6,7 +6,6 @@
 
 #define LOG_CATEGORY UCLASS_BOOTSTD
 
-#include <common.h>
 #include <bootdev.h>
 #include <bootflow.h>
 #include <bootmeth.h>
@@ -217,6 +216,9 @@ static int iter_incr(struct bootflow_iter *iter)
                }
        }
 
+       if (iter->flags & BOOTFLOWIF_SINGLE_PARTITION)
+               return BF_NO_MORE_DEVICES;
+
        /* No more bootmeths; start at the first one, and... */
        iter->cur_method = 0;
        iter->method = iter->method_order[iter->cur_method];
@@ -280,8 +282,26 @@ static int iter_incr(struct bootflow_iter *iter)
                } else {
                        log_debug("labels %p\n", iter->labels);
                        if (iter->labels) {
-                               ret = bootdev_next_label(iter, &dev,
-                                                        &method_flags);
+                               /*
+                                * when the label is "mmc" we want to scan all
+                                * mmc bootdevs, not just the first. See
+                                * bootdev_find_by_label() where this flag is
+                                * set up
+                                */
+                               if (iter->method_flags &
+                                   BOOTFLOW_METHF_SINGLE_UCLASS) {
+                                       scan_next_in_uclass(&dev);
+                                       log_debug("looking for next device %s: %s\n",
+                                                 iter->dev->name,
+                                                 dev ? dev->name : "<none>");
+                               } else {
+                                       dev = NULL;
+                               }
+                               if (!dev) {
+                                       log_debug("looking at next label\n");
+                                       ret = bootdev_next_label(iter, &dev,
+                                                                &method_flags);
+                               }
                        } else {
                                ret = bootdev_next_prio(iter, &dev);
                                method_flags = 0;
@@ -343,7 +363,7 @@ static int bootflow_check(struct bootflow_iter *iter, struct bootflow *bflow)
        }
 
        /* Unless there is nothing more to try, move to the next device */
-       else if (ret != BF_NO_MORE_PARTS && ret != -ENOSYS) {
+       if (ret != BF_NO_MORE_PARTS && ret != -ENOSYS) {
                log_debug("Bootdev '%s' part %d method '%s': Error %d\n",
                          dev->name, iter->part, iter->method->name, ret);
                /*
@@ -353,10 +373,8 @@ static int bootflow_check(struct bootflow_iter *iter, struct bootflow *bflow)
                if (iter->flags & BOOTFLOWIF_ALL)
                        return log_msg_ret("all", ret);
        }
-       if (ret)
-               return log_msg_ret("check", ret);
 
-       return 0;
+       return log_msg_ret("check", ret);
 }
 
 int bootflow_scan_first(struct udevice *dev, const char *label,
@@ -449,7 +467,8 @@ void bootflow_free(struct bootflow *bflow)
        free(bflow->name);
        free(bflow->subdir);
        free(bflow->fname);
-       free(bflow->buf);
+       if (!(bflow->flags & BOOTFLOWF_STATIC_BUF))
+               free(bflow->buf);
        free(bflow->os_name);
        free(bflow->fdt_fname);
        free(bflow->bootmeth_priv);
@@ -556,6 +575,18 @@ int bootflow_iter_check_blk(const struct bootflow_iter *iter)
        return -ENOTSUPP;
 }
 
+int bootflow_iter_check_mmc(const struct bootflow_iter *iter)
+{
+       const struct udevice *media = dev_get_parent(iter->dev);
+       enum uclass_id id = device_get_uclass_id(media);
+
+       log_debug("uclass %d: %s\n", id, uclass_get_name(id));
+       if (id == UCLASS_MMC)
+               return 0;
+
+       return -ENOTSUPP;
+}
+
 int bootflow_iter_check_sf(const struct bootflow_iter *iter)
 {
        const struct udevice *media = dev_get_parent(iter->dev);
@@ -734,7 +765,7 @@ int cmdline_set_arg(char *buf, int maxlen, const char *cmdline,
                                        in_quote = false;
                                continue;
                        }
-                       if (*p == '=') {
+                       if (*p == '=' && !arg_end) {
                                arg_end = p;
                                val = p + 1;
                        } else if (*p == '"') {
@@ -770,7 +801,8 @@ int cmdline_set_arg(char *buf, int maxlen, const char *cmdline,
                }
 
                /* if this is the target arg, update it */
-               if (!strncmp(from, set_arg, arg_end - from)) {
+               if (arg_end - from == set_arg_len &&
+                   !strncmp(from, set_arg, set_arg_len)) {
                        if (!buf) {
                                bool has_quote = val_end[-1] == '"';
 
This page took 0.027928 seconds and 4 git commands to generate.