| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Copyright 2021 Google LLC | |
| * Written by Simon Glass <sjg@chromium.org> | |
| */ | |
| #define LOG_CATEGORY UCLASS_BOOTSTD | |
| #include <bootflow.h> | |
| #include <bootstd.h> | |
| #include <command.h> | |
| #include <dm.h> | |
| /* | |
| * show_bootmeths() - List available bootmeths | |
| * | |
| * We could refactor this to use do_bootmeth_list() if more detail (or ordering) | |
| * are needed | |
| */ | |
| static void show_bootmeths(void) | |
| { | |
| struct udevice *dev; | |
| struct uclass *uc; | |
| printf("Bootmeths: "); | |
| uclass_id_foreach_dev(UCLASS_BOOTMETH, dev, uc) | |
| printf(" %s", dev->name); | |
| printf("\n"); | |
| } | |
| int bootstd_prog_boot(void) | |
| { | |
| struct bootflow_iter iter; | |
| struct bootflow bflow; | |
| int ret, flags, i; | |
| printf("Programmatic boot starting\n"); | |
| show_bootmeths(); | |
| flags = BOOTFLOWIF_HUNT | BOOTFLOWIF_SHOW | BOOTFLOWIF_SKIP_GLOBAL; | |
| bootstd_clear_glob(); | |
| for (i = 0, ret = bootflow_scan_first(NULL, NULL, &iter, flags, &bflow); | |
| i < 1000 && ret != -ENODEV; | |
| i++, ret = bootflow_scan_next(&iter, &bflow)) { | |
| if (!bflow.err) | |
| bootflow_run_boot(&iter, &bflow); | |
| bootflow_free(&bflow); | |
| } | |
| return -EFAULT; | |
| } |