Files
u-boot/boot/bootctl/extlinux.c
Simon Glass d9152ea75e bootctl: Initial experimentation
This provides a basic prototype for boot control.

Some documentation is in boot/bootctl/README.rst
2025-09-28 14:32:36 -06:00

71 lines
1.4 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Access to extlinux.conf files containing OS information
*
* Copyright 2025 Canonical Ltd
* Written by Simon Glass <simon.glass@canonical.com>
*/
#define LOG_CATEGORY UCLASS_BOOTCTL
#include <bootctl.h>
#include <bootmeth.h>
#include <bootstd.h>
#include <dm.h>
#include <log.h>
#include <bootctl/oslist.h>
static int extlinux_bind(struct udevice *dev)
{
struct bootctl_uc_plat *ucp = dev_get_uclass_plat(dev);
ucp->desc = "Provides OSes to boot";
return 0;
}
static int extlinux_next(struct udevice *dev, struct oslist_iter *iter,
struct osinfo *info)
{
int ret;
if (!iter->active) {
bootstd_clear_glob();
iter->active = true;
ret = bootmeth_set_order("extlinux");
if (ret)
return log_msg_ret("eso", ret);
ret = bootflow_scan_first(NULL, NULL, &iter->bf_iter,
BOOTFLOWIF_HUNT, &info->bflow);
if (ret)
return log_msg_ret("esf", ret);
} else {
ret = bootflow_scan_next(&iter->bf_iter, &info->bflow);
if (ret) {
iter->active = false;
if (ret)
return log_msg_ret("esn", ret);
}
}
return 0;
}
static struct bc_oslist_ops ops = {
.next = extlinux_next,
};
static const struct udevice_id extlinux_ids[] = {
{ .compatible = "bootctl,extlinux-oslist" },
{ .compatible = "bootctl,os-list" },
{ }
};
U_BOOT_DRIVER(extlinux) = {
.name = "extlinux",
.id = UCLASS_BOOTCTL_OSLIST,
.of_match = extlinux_ids,
.bind = extlinux_bind,
.ops = &ops,
};