// SPDX-License-Identifier: GPL-2.0+ /* * Implementation of the logic to perform a boot * * Copyright 2025 Canonical Ltd * Written by Simon Glass */ #define LOG_CATEGORY UCLASS_BOOTCTL #include #include #include #include #include #include #include #include #include #include #include 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; }