Message ID | 20200206090856.28200-2-frieder.schrempf@kontron.de |
---|---|
State | New |
Headers | show |
Series | [v3,1/2] menu: Add a function to set the default by matching the item data | expand |
Hi Schrempf, On Thu, 6 Feb 2020 at 02:09, Schrempf Frieder <frieder.schrempf at kontron.de> wrote: > > From: Frieder Schrempf <frieder.schrempf at 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.schrempf at kontron.de> > --- > Changes in v3: > * Get rid of #ifdef by using IS_ENABLED() in else branch. > > Changes in v2: > * Don't use internal structs of menu, but instead call > menu_set_default_by_item_data_match() that does the iteration work. > --- > cmd/pxe_utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c > index 53af04d7dc..253df468af 100644 > --- a/cmd/pxe_utils.c > +++ b/cmd/pxe_utils.c > @@ -1220,6 +1220,46 @@ struct pxe_menu *parse_pxefile(cmd_tbl_t *cmdtp, unsigned long menucfg) > return cfg; > } > > +#ifdef CONFIG_OF_CONTROL I think you need to remove this #ifdef, otherwise you'll get a build error on boards without OF_CONTROL enabled. > +int pxe_match_menu_label_with_str(void *data, void *str) > +{ > + struct pxe_label *label; > + > + if (!data || !str) > + return 0; > + > + label = (struct pxe_label *)data; > + > + if (strcmp(label->name, str) == 0) > + return 1; > + > + return 0; > +} > + > +int pxe_runtime_select_menu_default(struct menu *m) > +{ > + DECLARE_GLOBAL_DATA_PTR; > + const char *model; > + char *key; > + int ret; > + > + model = fdt_getprop(gd->fdt_blob, 0, "model", NULL); > + > + if (!model) > + return 0; > + > + ret = menu_set_default_by_item_data_match(m, > + pxe_match_menu_label_with_str, (void *)model, &key); > + if (ret) > + return ret; > + > + printf("Menu entry %s fits detected board. " \ > + "Use as default selection...\n", key); > + > + return 0; > +} > +#endif > + > /* > * Converts a pxe_menu struct into a menu struct for use with U-Boot's generic > * menu code. > @@ -1258,6 +1298,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); > @@ -1269,6 +1311,10 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) > > printf("Missing default: %s\n", cfg->default_label); > } > + } else if (IS_ENABLED(CONFIG_OF_CONTROL) && > + pxe_runtime_select_menu_default(m)) { > + menu_destroy(m); > + return NULL; > } > > return m; > -- > 2.17.1 Regards, Simon
On 06.02.20 18:46, Simon Glass wrote: > Hi Schrempf, > > On Thu, 6 Feb 2020 at 02:09, Schrempf Frieder > <frieder.schrempf at kontron.de> wrote: >> >> From: Frieder Schrempf <frieder.schrempf at 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.schrempf at kontron.de> >> --- >> Changes in v3: >> * Get rid of #ifdef by using IS_ENABLED() in else branch. >> >> Changes in v2: >> * Don't use internal structs of menu, but instead call >> menu_set_default_by_item_data_match() that does the iteration work. >> --- >> cmd/pxe_utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 46 insertions(+) >> >> diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c >> index 53af04d7dc..253df468af 100644 >> --- a/cmd/pxe_utils.c >> +++ b/cmd/pxe_utils.c >> @@ -1220,6 +1220,46 @@ struct pxe_menu *parse_pxefile(cmd_tbl_t *cmdtp, unsigned long menucfg) >> return cfg; >> } >> >> +#ifdef CONFIG_OF_CONTROL > > I think you need to remove this #ifdef, otherwise you'll get a build > error on boards without OF_CONTROL enabled. Right, I forgot about this. > >> +int pxe_match_menu_label_with_str(void *data, void *str) >> +{ >> + struct pxe_label *label; >> + >> + if (!data || !str) >> + return 0; >> + >> + label = (struct pxe_label *)data; >> + >> + if (strcmp(label->name, str) == 0) >> + return 1; >> + >> + return 0; >> +} >> + >> +int pxe_runtime_select_menu_default(struct menu *m) >> +{ >> + DECLARE_GLOBAL_DATA_PTR; >> + const char *model; >> + char *key; >> + int ret; >> + >> + model = fdt_getprop(gd->fdt_blob, 0, "model", NULL); >> + >> + if (!model) >> + return 0; >> + >> + ret = menu_set_default_by_item_data_match(m, >> + pxe_match_menu_label_with_str, (void *)model, &key); >> + if (ret) >> + return ret; >> + >> + printf("Menu entry %s fits detected board. " \ >> + "Use as default selection...\n", key); >> + >> + return 0; >> +} >> +#endif >> + >> /* >> * Converts a pxe_menu struct into a menu struct for use with U-Boot's generic >> * menu code. >> @@ -1258,6 +1298,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); >> @@ -1269,6 +1311,10 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) >> >> printf("Missing default: %s\n", cfg->default_label); >> } >> + } else if (IS_ENABLED(CONFIG_OF_CONTROL) && >> + pxe_runtime_select_menu_default(m)) { >> + menu_destroy(m); >> + return NULL; >> } >> >> return m; >> -- >> 2.17.1 > > Regards, > Simon >
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 53af04d7dc..253df468af 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1220,6 +1220,46 @@ struct pxe_menu *parse_pxefile(cmd_tbl_t *cmdtp, unsigned long menucfg) return cfg; } +#ifdef CONFIG_OF_CONTROL +int pxe_match_menu_label_with_str(void *data, void *str) +{ + struct pxe_label *label; + + if (!data || !str) + return 0; + + label = (struct pxe_label *)data; + + if (strcmp(label->name, str) == 0) + return 1; + + return 0; +} + +int pxe_runtime_select_menu_default(struct menu *m) +{ + DECLARE_GLOBAL_DATA_PTR; + const char *model; + char *key; + int ret; + + model = fdt_getprop(gd->fdt_blob, 0, "model", NULL); + + if (!model) + return 0; + + ret = menu_set_default_by_item_data_match(m, + pxe_match_menu_label_with_str, (void *)model, &key); + if (ret) + return ret; + + printf("Menu entry %s fits detected board. " \ + "Use as default selection...\n", key); + + return 0; +} +#endif + /* * Converts a pxe_menu struct into a menu struct for use with U-Boot's generic * menu code. @@ -1258,6 +1298,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); @@ -1269,6 +1311,10 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) printf("Missing default: %s\n", cfg->default_label); } + } else if (IS_ENABLED(CONFIG_OF_CONTROL) && + pxe_runtime_select_menu_default(m)) { + menu_destroy(m); + return NULL; } return m;