]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
expo: Split bootflow_menu_new() into two pieces
authorSimon Glass <sjg@chromium.org>
Fri, 2 May 2025 14:46:28 +0000 (08:46 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 30 May 2025 08:49:32 +0000 (09:49 +0100)
Split the iteration piece of this function into bootflow_menu_add_all()
so that it is possible for the caller to be in control of adding items
to the menu.

Move the expo_destroy() call into the caller.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootflow_menu.c
include/bootflow.h
test/boot/bootflow.c

index ed7c0768c7b57a411ed1786d5f13b2f1d34cfaaf..f731d7858b2997701ec3ff022ba63937dd4ebd51 100644 (file)
@@ -32,14 +32,12 @@ struct menu_priv {
 
 int bootflow_menu_new(struct expo **expp)
 {
-       struct udevice *last_bootdev;
        struct scene_obj_menu *menu;
        struct menu_priv *priv;
-       struct bootflow *bflow;
        struct scene *scn;
        struct expo *exp;
        void *logo;
-       int ret, i;
+       int ret;
 
        priv = calloc(1, sizeof(*priv));
        if (!priv)
@@ -74,6 +72,26 @@ int bootflow_menu_new(struct expo **expp)
        if (ret < 0)
                return log_msg_ret("new", -EINVAL);
 
+       *expp = exp;
+
+       return 0;
+}
+
+int bootflow_menu_add_all(struct expo *exp)
+{
+       struct menu_priv *priv = exp->priv;
+       struct udevice *last_bootdev;
+       struct bootflow *bflow;
+       struct scene *scn;
+       uint scene_id;
+       int ret, i;
+
+       ret = expo_first_scene_id(exp);
+       if (ret < 0)
+               return log_msg_ret("scn", ret);
+       scene_id = ret;
+       scn = expo_lookup_scene_id(exp, scene_id);
+
        last_bootdev = NULL;
        for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
             ret = bootflow_next_glob(&bflow), i++) {
@@ -133,8 +151,6 @@ int bootflow_menu_new(struct expo **expp)
        if (ret)
                return log_msg_ret("arr", ret);
 
-       *expp = exp;
-
        return 0;
 }
 
@@ -184,7 +200,10 @@ int bootflow_menu_start(struct bootstd_priv *std, bool text_mode,
 
        ret = bootflow_menu_new(&exp);
        if (ret)
-               return log_msg_ret("exp", ret);
+               return log_msg_ret("bmn", ret);
+       ret = bootflow_menu_add_all(exp);
+       if (ret)
+               return log_msg_ret("bma", ret);
 
        if (ofnode_valid(std->theme)) {
                ret = bootflow_menu_apply_theme(exp, std->theme);
index 8244d4fca184351f6b715edc5f2f0a5530006e8a..994b38394e885309d17ad099a338dd2226b5c0b9 100644 (file)
@@ -488,11 +488,24 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter);
 /**
  * bootflow_menu_new() - Create a new bootflow menu
  *
+ * This is initially empty. Call bootflow_menu_add_all() to add all the
+ * bootflows to it.
+ *
  * @expp: Returns the expo created
  * Returns 0 on success, -ve on error
  */
 int bootflow_menu_new(struct expo **expp);
 
+/**
+ * bootflow_menu_add_all() - Add all bootflows to a menu
+ *
+ * Loops through all bootflows and adds them to the menu
+ *
+ * @exp: Menu to update
+ * Return 0 on success, -ve on error
+ */
+int bootflow_menu_add_all(struct expo *exp);
+
 /**
  * bootflow_menu_apply_theme() - Apply a theme to a bootmenu
  *
index a930d2cc309a21b9fb3855b30b22e3b68098b4f0..58885b5d8bfc65872a13ec711fca7282e171027e 100644 (file)
@@ -878,6 +878,7 @@ static int bootflow_menu_theme(struct unit_test_state *uts)
        ut_assertok(scan_mmc4_bootdev(uts));
 
        ut_assertok(bootflow_menu_new(&exp));
+       ut_assertok(bootflow_menu_add_all(exp));
        node = ofnode_path("/bootstd/theme");
        ut_assert(ofnode_valid(node));
        ut_assertok(bootflow_menu_apply_theme(exp, node));