On 10.12.19 16:45, Schrempf Frieder wrote:
> From: Frieder Schrempf <frieder.schre...@kontron.de>
> 
> In order to auto-select an option from the pxe boot menu, that
> matches the detected board, we check the board model string in the
> devicetree and set the default menu selection, if it matches the
> label of the menu entry and there is no default selection already
> set.
> 
> This is useful in combination with SPL that loads a FIT image with
> U-Boot and multiple DTBs. SPL can detect the board and choose the
> matching configuration in the FIT by using
> board_fit_config_name_match().
> 
> Signed-off-by: Frieder Schrempf <frieder.schre...@kontron.de>

I forgot to fix some compiler warnings in this code, so this is probably 
more like a RFC until I send a fixed v2.

> ---
>   cmd/pxe_utils.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 62 insertions(+)
> 
> diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c
> index a636346bb5..510957e68f 100644
> --- a/cmd/pxe_utils.c
> +++ b/cmd/pxe_utils.c
> @@ -1219,6 +1219,61 @@ struct pxe_menu *parse_pxefile(cmd_tbl_t *cmdtp, 
> unsigned long menucfg)
>       return cfg;
>   }
>   
> +#ifdef CONFIG_OF_CONTROL
> +/*
> + * Check if an item's name matches a provided string, pointed to by extra.
> + *
> + * This is called via menu_items_iter, so it returns a pointer to the item if
> + * the name matches, and returns NULL otherwise.
> + */
> +static inline void *pxe_item_name_match(struct menu *m, struct menu_item 
> *item,
> +                                     void *extra)
> +{
> +     char *name = extra;
> +     struct pxe_label *label;
> +
> +     if (!name || !item->key)
> +             return NULL;
> +
> +     label = (struct pxe_label *)item->data;
> +
> +     if (strcmp(label->name, name) == 0)
> +             return item;
> +
> +     return NULL;
> +}
> +
> +/*
> + * Find the first item with a name matching the given name, if any exists.
> + */
> +inline struct menu_item *menu_item_by_pxe_name(struct menu *m, char *name)
> +{
> +     return menu_items_iter(m, pxe_item_name_match, name);
> +}
> +
> +int pxe_runtime_select_menu_default(struct menu *m)
> +{
> +     DECLARE_GLOBAL_DATA_PTR;
> +     struct menu_item *item = NULL;
> +     const char *model;
> +
> +     model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
> +
> +     if (!model)
> +             return 0;
> +
> +     item = menu_item_by_pxe_name(m, model);
> +
> +     if (item) {
> +             printf("Menu entry %s fits detected board. " \
> +                    "Use as default selection...\n", item->key);
> +             m->default_item = item;
> +     }
> +
> +     return 0;
> +}
> +#endif
> +
>   /*
>    * Converts a pxe_menu struct into a menu struct for use with U-Boot's 
> generic
>    * menu code.
> @@ -1257,6 +1312,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu 
> *cfg)
>       /*
>        * After we've created items for each label in the menu, set the
>        * menu's default label if one was specified.
> +      * If OF_CONTROL is enabled and we don't have a default specified,
> +      * we try to use an entry that matches the board/model name as default.
>        */
>       if (default_num) {
>               err = menu_default_set(m, default_num);
> @@ -1268,6 +1325,11 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu 
> *cfg)
>   
>                       printf("Missing default: %s\n", cfg->default_label);
>               }
> +#ifdef CONFIG_OF_CONTROL
> +     } else if (pxe_runtime_select_menu_default(m)) {
> +             menu_destroy(m);
> +             return NULL;
> +#endif
>       }
>   
>       return m;
> 

Reply via email to