u-boot/include/bootstd.h
Simon Glass bd90b09288 bootstd: Add the concept of a bootdev hunter
Some bootdevs must be enumerated before they appear. For example, USB
bootdevs are not visible until USB is enumerated.

With standard boot this needs to happen automatically, since we only
want to enumerate a bus if it is needed.

Add a way to define bootdev 'hunters' which can be used to hunt for
bootdevs of a given type. Track which ones have been used and add a
command to list them.

Include a clang work-around which seems to be needed.

Signed-off-by: Simon Glass <sjg@chromium.org>
2023-01-23 18:11:40 -05:00

97 lines
3.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Standard U-Boot boot framework
*
* Copyright 2021 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#ifndef __bootstd_h
#define __bootstd_h
#include <dm/ofnode_decl.h>
struct udevice;
/**
* struct bootstd_priv - priv data for the bootstd driver
*
* This is attached to the (only) bootstd device, so there is only one instance
* of this struct. It provides overall information about bootdevs and bootflows.
*
* @prefixes: NULL-terminated list of prefixes to use for bootflow filenames,
* e.g. "/", "/boot/"; NULL if none
* @bootdev_order: Order to use for bootdevs (or NULL if none), with each item
* being a bootdev label, e.g. "mmc2", "mmc1" (NULL terminated)
* @env_order: Order as specified by the boot_targets env var (or NULL if none),
* with each item being a bootdev label, e.g. "mmc2", "mmc1" (NULL
* terminated)
* @cur_bootdev: Currently selected bootdev (for commands)
* @cur_bootflow: Currently selected bootflow (for commands)
* @glob_head: Head for the global list of all bootflows across all bootdevs
* @bootmeth_count: Number of bootmeth devices in @bootmeth_order
* @bootmeth_order: List of bootmeth devices to use, in order, NULL-terminated
* @vbe_bootmeth: Currently selected VBE bootmeth, NULL if none
* @theme: Node containing the theme information
* @hunters_used: Bitmask of used hunters, indexed by their position in the
* linker list. The bit is set if the hunter has been used already
*/
struct bootstd_priv {
const char **prefixes;
const char **bootdev_order;
const char **env_order;
struct udevice *cur_bootdev;
struct bootflow *cur_bootflow;
struct list_head glob_head;
int bootmeth_count;
struct udevice **bootmeth_order;
struct udevice *vbe_bootmeth;
ofnode theme;
uint hunters_used;
};
/**
* bootstd_get_bootdev_order() - Get the boot-order list
*
* This reads the boot order, e.g. {"mmc0", "mmc2", NULL}
*
* The list is alloced by the bootstd driver so should not be freed. That is the
* reason for all the const stuff in the function signature
*
* @dev: bootstd device
* @okp: returns true if OK, false if out of memory
* Return: list of string pointers, terminated by NULL; or NULL if no boot
* order. Note that this returns NULL in the case of an empty list
*/
const char *const *const bootstd_get_bootdev_order(struct udevice *dev,
bool *okp);
/**
* bootstd_get_prefixes() - Get the filename-prefixes list
*
* This reads the prefixes, e.g. {"/", "/bpot", NULL}
*
* The list is alloced by the bootstd driver so should not be freed. That is the
* reason for all the const stuff in the function signature
*
* Return: list of string points, terminated by NULL; or NULL if no boot order
*/
const char *const *const bootstd_get_prefixes(struct udevice *dev);
/**
* bootstd_get_priv() - Get the (single) state for the bootstd system
*
* The state holds a global list of all bootflows that have been found.
*
* Return: 0 if OK, -ve if the uclass does not exist
*/
int bootstd_get_priv(struct bootstd_priv **stdp);
/**
* bootstd_clear_glob() - Clear the global list of bootflows
*
* This removes all bootflows globally and across all bootdevs.
*/
void bootstd_clear_glob(void);
#endif