| // SPDX-License-Identifier: GPL-2.0+ |
| /* |
| * (C) Copyright 2000 |
| * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
| */ |
| |
| /* #define DEBUG */ |
| |
| #include <autoboot.h> |
| #include <button.h> |
| #include <bootstage.h> |
| #include <bootstd.h> |
| #include <cli.h> |
| #include <command.h> |
| #include <console.h> |
| #include <env.h> |
| #include <fdtdec.h> |
| #include <init.h> |
| #include <net.h> |
| #include <version_string.h> |
| #include <efi_loader.h> |
| |
| static void run_preboot_environment_command(void) |
| { |
| char *p; |
| |
| p = env_get("preboot"); |
| if (p != NULL) { |
| int prev = 0; |
| |
| if (IS_ENABLED(CONFIG_AUTOBOOT_KEYED)) |
| prev = disable_ctrlc(1); /* disable Ctrl-C checking */ |
| |
| run_command_list(p, -1, 0); |
| |
| if (IS_ENABLED(CONFIG_AUTOBOOT_KEYED)) |
| disable_ctrlc(prev); /* restore Ctrl-C checking */ |
| } |
| } |
| |
| /* We come here after U-Boot is initialised and ready to process commands */ |
| void main_loop(void) |
| { |
| const char *s; |
| |
| bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop"); |
| |
| if (IS_ENABLED(CONFIG_VERSION_VARIABLE)) |
| env_set("ver", version_string); /* set version variable */ |
| |
| cli_init(); |
| |
| if (IS_ENABLED(CONFIG_USE_PREBOOT)) |
| run_preboot_environment_command(); |
| |
| if (IS_ENABLED(CONFIG_UPDATE_TFTP)) |
| update_tftp(0UL, NULL, NULL); |
| |
| if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) { |
| /* efi_init_early() already called */ |
| if (efi_init_obj_list() == EFI_SUCCESS) |
| efi_launch_capsules(); |
| } |
| |
| process_button_cmds(); |
| |
| s = bootdelay_process(); |
| if (cli_process_fdt(&s)) |
| cli_secure_boot_cmd(s); |
| |
| autoboot_command(s); |
| |
| /* if standard boot if enabled, assume that it will be able to boot */ |
| if (IS_ENABLED(CONFIG_BOOTSTD_PROG)) { |
| int ret; |
| |
| ret = bootstd_prog_boot(); |
| printf("Standard boot failed (err=%dE)\n", ret); |
| panic("Failed to boot"); |
| } |
| |
| cli_loop(); |
| |
| panic("No CLI available"); |
| } |