Files
u-boot/boot/bootctl/bootctl.c
Simon Glass 53ca497bef bootctl: Avoid hanging on failure
For now just drop to the cmdline so that the state can be examined. This
will aid debugging.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-10-18 09:38:25 +01:00

68 lines
1.3 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Implementation of the logic to perform a boot
*
* Copyright 2025 Canonical Ltd
* Written by Simon Glass <simon.glass@canonical.com>
*/
#define LOG_CATEGORY UCLASS_BOOTCTL
#include <bootctl.h>
#include <dm.h>
#include <hang.h>
#include <log.h>
#include <version.h>
#include <bootctl/logic.h>
#include <bootctl/oslist.h>
#include <bootctl/state.h>
#include <bootctl/ui.h>
#include <bootctl/util.h>
#include <dm/device-internal.h>
int bootctl_get_dev(enum uclass_id type, struct udevice **devp)
{
struct udevice *dev;
int ret;
ret = uclass_first_device_err(type, &dev);
if (ret)
return log_msg_ret("bfd", ret);
*devp = dev;
return 0;
}
int bootctl_run(void)
{
struct udevice *logic;
int ret;
printf("Boot Control (using U-Boot v%d.%02d)\n", U_BOOT_VERSION_NUM,
U_BOOT_VERSION_NUM_PATCH);
/* figure out the bootctl to use */
ret = bootctl_get_dev(UCLASS_BOOTCTL, &logic);
if (ret)
return log_msg_ret("bgl", ret);
ret = bc_logic_prepare(logic);
if (ret)
return log_msg_ret("bcl", ret);
ret = bc_logic_start(logic);
if (ret)
return log_msg_ret("bcL", ret);
do {
ret = bc_logic_poll(logic);
if (ret) {
printf("logic err %dE\n", ret);
/* could hang here */
return ret;
}
} while (ret != -ESHUTDOWN);
return 0;
}