blob: ac756e98d84a892de26eb27b50dba61c4c65488c [file] [log] [blame]
Simon Glassef5e3892022-04-24 23:31:06 -06001/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Standard U-Boot boot framework
4 *
5 * Copyright 2021 Google LLC
6 * Written by Simon Glass <sjg@chromium.org>
7 */
8
9#ifndef __bootstd_h
10#define __bootstd_h
11
Simon Glasse64c2952023-01-06 08:52:42 -060012#include <dm/ofnode_decl.h>
Tom Rini03de3052024-05-20 13:35:03 -060013#include <linux/list.h>
14#include <linux/types.h>
Simon Glasse64c2952023-01-06 08:52:42 -060015
Simon Glassef5e3892022-04-24 23:31:06 -060016struct udevice;
17
18/**
19 * struct bootstd_priv - priv data for the bootstd driver
20 *
21 * This is attached to the (only) bootstd device, so there is only one instance
22 * of this struct. It provides overall information about bootdevs and bootflows.
23 *
24 * @prefixes: NULL-terminated list of prefixes to use for bootflow filenames,
25 * e.g. "/", "/boot/"; NULL if none
26 * @bootdev_order: Order to use for bootdevs (or NULL if none), with each item
Simon Glass6a6638f2023-01-17 10:47:15 -070027 * being a bootdev label, e.g. "mmc2", "mmc1" (NULL terminated)
28 * @env_order: Order as specified by the boot_targets env var (or NULL if none),
29 * with each item being a bootdev label, e.g. "mmc2", "mmc1" (NULL
30 * terminated)
Simon Glassef5e3892022-04-24 23:31:06 -060031 * @cur_bootdev: Currently selected bootdev (for commands)
32 * @cur_bootflow: Currently selected bootflow (for commands)
33 * @glob_head: Head for the global list of all bootflows across all bootdevs
34 * @bootmeth_count: Number of bootmeth devices in @bootmeth_order
35 * @bootmeth_order: List of bootmeth devices to use, in order, NULL-terminated
Simon Glass4c7418f2022-07-30 15:52:32 -060036 * @vbe_bootmeth: Currently selected VBE bootmeth, NULL if none
Simon Glasse64c2952023-01-06 08:52:42 -060037 * @theme: Node containing the theme information
Simon Glassbd90b092023-01-17 10:47:33 -070038 * @hunters_used: Bitmask of used hunters, indexed by their position in the
39 * linker list. The bit is set if the hunter has been used already
Simon Glassef5e3892022-04-24 23:31:06 -060040 */
41struct bootstd_priv {
42 const char **prefixes;
43 const char **bootdev_order;
Simon Glass6a6638f2023-01-17 10:47:15 -070044 const char **env_order;
Simon Glassef5e3892022-04-24 23:31:06 -060045 struct udevice *cur_bootdev;
46 struct bootflow *cur_bootflow;
47 struct list_head glob_head;
48 int bootmeth_count;
49 struct udevice **bootmeth_order;
Simon Glass4c7418f2022-07-30 15:52:32 -060050 struct udevice *vbe_bootmeth;
Simon Glasse64c2952023-01-06 08:52:42 -060051 ofnode theme;
Simon Glassbd90b092023-01-17 10:47:33 -070052 uint hunters_used;
Simon Glassef5e3892022-04-24 23:31:06 -060053};
54
55/**
56 * bootstd_get_bootdev_order() - Get the boot-order list
57 *
58 * This reads the boot order, e.g. {"mmc0", "mmc2", NULL}
59 *
60 * The list is alloced by the bootstd driver so should not be freed. That is the
61 * reason for all the const stuff in the function signature
62 *
Simon Glass6a6638f2023-01-17 10:47:15 -070063 * @dev: bootstd device
64 * @okp: returns true if OK, false if out of memory
65 * Return: list of string pointers, terminated by NULL; or NULL if no boot
66 * order. Note that this returns NULL in the case of an empty list
Simon Glassef5e3892022-04-24 23:31:06 -060067 */
Simon Glass6a6638f2023-01-17 10:47:15 -070068const char *const *const bootstd_get_bootdev_order(struct udevice *dev,
69 bool *okp);
Simon Glassef5e3892022-04-24 23:31:06 -060070
71/**
72 * bootstd_get_prefixes() - Get the filename-prefixes list
73 *
Julien Delbergue2c120672023-07-13 11:53:09 +020074 * This reads the prefixes, e.g. {"/", "/boot", NULL}
Simon Glassef5e3892022-04-24 23:31:06 -060075 *
76 * The list is alloced by the bootstd driver so should not be freed. That is the
77 * reason for all the const stuff in the function signature
78 *
79 * Return: list of string points, terminated by NULL; or NULL if no boot order
80 */
81const char *const *const bootstd_get_prefixes(struct udevice *dev);
82
83/**
84 * bootstd_get_priv() - Get the (single) state for the bootstd system
85 *
86 * The state holds a global list of all bootflows that have been found.
87 *
88 * Return: 0 if OK, -ve if the uclass does not exist
89 */
90int bootstd_get_priv(struct bootstd_priv **stdp);
91
92/**
93 * bootstd_clear_glob() - Clear the global list of bootflows
94 *
95 * This removes all bootflows globally and across all bootdevs.
96 */
97void bootstd_clear_glob(void);
98
Simon Glass1047b532023-11-18 14:05:19 -070099/**
100 * bootstd_prog_boot() - Run standard boot in a fully programmatic mode
101 *
102 * Attempts to boot without making any use of U-Boot commands
103 *
104 * Returns: -ve error value (does not return except on failure to boot)
105 */
106int bootstd_prog_boot(void);
107
Simon Glassef5e3892022-04-24 23:31:06 -0600108#endif