Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | /* SPDX-License-Identifier: GPL-2.0+ */ /* * Verified Boot for Embedded (VBE) support * See doc/develop/vbe.rst * * Copyright 2022 Google LLC * Written by Simon Glass <sjg@chromium.org> */ #ifndef __VBE_H #define __VBE_H #include <linux/types.h> #include <spl.h> /** * enum vbe_phase_t - current phase of VBE * * VBE operates in two distinct phases. In VPL it has to choose which firmware * to run (SPL, U-Boot, OP-TEE, etc.). It then carries on running until it gets * to U-Boot, where it decides which OS to run * * @VBE_PHASE_FIRMWARE: Selecting the firmware to run * @VBE_PHASE_OS: Selecting the Operating System to run */ enum vbe_phase_t { VBE_PHASE_FIRMWARE, VBE_PHASE_OS, }; /** * enum vbe_pick_t - indicates which firmware is picked * * The names are in pick_names[] * * @VBEFT_A: Firmware A * @VBEFT_B: Firmware B * @VBEFT_RECOVERY: Recovery firmware */ enum vbe_pick_t { VBEP_A, VBEP_B, VBEP_RECOVERY, VBEP_COUNT, }; /** * struct vbe_handoff - information about VBE progress * * @offset: Offset of the FIT to use for SPL onwards * @size: Size of the area containing the FIT * @phases: Indicates which phases used the VBE bootmeth (1 << PHASE_...) * @pick: Indicates which firmware pick was used (enum vbe_pick_t) * @reloc_margin: Indicates the number of bytes of margin coming into this phase */ struct vbe_handoff { ulong offset; ulong size; u8 phases; u8 pick; int reloc_margin[PHASE_COUNT]; }; /** * vbe_phase() - get current VBE phase * * Returns: Current VBE phase */ static inline enum vbe_phase_t vbe_phase(void) { if (IS_ENABLED(CONFIG_XPL_BUILD)) return VBE_PHASE_FIRMWARE; return VBE_PHASE_OS; } /** * struct vbe_bflow_priv - Information attached to the VBE bootflow * * @pick: Boot path to pick for the current boot */ struct vbe_bflow_priv { enum vbe_pick_t pick_slot; }; /** * vbe_list() - List the VBE bootmeths * * This shows a list of the VBE bootmeth devices * * @return 0 (always) */ int vbe_list(void); /** * vbe_find_by_any() - Find a VBE bootmeth by name or sequence * * @name: name (e.g. "vbe-simple"), or sequence ("2") to find * @devp: returns the device found, on success * Return: 0 if OK, -ve on error */ int vbe_find_by_any(const char *name, struct udevice **devp); /** * vbe_find_first_device() - Find the first VBE bootmeth * * @devp: Returns first available VBE bootmeth, or NULL if none * Returns: 0 (always) */ int vbe_find_first_device(struct udevice **devp); /** * vbe_find_next_device() - Find the next available VBE bootmeth * * @devp: Previous device to start from. Returns next available VBE bootmeth, * or NULL if none * Returns: 0 (always) */ int vbe_find_next_device(struct udevice **devp); #endif |