Files
u-boot/include/efi_stub.h
Simon Glass 5209eaf9e5 efi: Switch x86 and ARM to use the unified stub
Now that the stub code is unified, switch over to it, dropping the
individual efi_main() functions.

Series-to: concept
Cover-letter:
efi: Unify the scripts and start-up code
We have two scripts which run QEMU, one for EFI and one for bare metal.
They have similar options so it seems reasonable to try to unify them a
bit. This series creates a common file and adjusts arguments so they are
consistent across both scripts.

The EFI app for ARM and x86 have different start-up code but in fact
the code is quiet similar. This series creates a new common main
program, called efi_main_common() which is used for both architectures.
The small number of differences are handled in arch-specific code.
END
2025-06-30 14:28:08 -06:00

127 lines
3.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Helpers for U-Boot running as an EFI payload.
*
* Copyright (c) 2024 Linaro, Ltd
*/
#ifndef _EFI_STUB_H
#define _EFI_STUB_H
#include <efi.h>
#include <linux/types.h>
struct efi_priv;
enum efi_entry_t {
EFIET_END, /* Signals this is the last (empty) entry */
EFIET_MEMORY_MAP,
EFIET_GOP_MODE,
EFIET_SYS_TABLE,
/* Number of entries */
EFIET_MEMORY_COUNT,
};
/**
* efi_info_get() - get an entry from an EFI table
*
* This function is called from U-Boot proper to read information set up by the
* EFI stub. It can only be used when running from the EFI stub, not when U-Boot
* is running as an app.
*
* @type: Entry type to search for
* @datap: Returns pointer to entry data
* @sizep: Returns entry size
* Return: 0 if OK, -ENODATA if there is no table, -ENOENT if there is no entry
* of the requested type, -EPROTONOSUPPORT if the table has the wrong version
*/
int efi_info_get(enum efi_entry_t type, void **datap, int *sizep);
struct device_node;
/**
* of_populate_from_efi() - Populate the live tree from EFI tables
*
* @root: Root node of tree to populate
*
* This function populates the live tree with information from EFI tables
* it is only applicable when running U-Boot as an EFI payload with
* CONFIG_EFI_STUB enabled.
*/
int of_populate_from_efi(struct device_node *root);
/**
* dram_init_banksize_from_efi() - Initialize the memory banks from EFI tables
*
* This function initializes the memory banks from the EFI memory map table we
* stashed from the EFI stub. It is only applicable when running U-Boot as an
* EFI payload with CONFIG_EFI_STUB enabled.
*/
int dram_init_banksize_from_efi(void);
/**
* efi_add_known_memory_from_efi() - Add known memory pages from the memory map
* of the EFI bootloader that booted U-Boot. This is only applicable when running
* U-Boot as an EFI payload with CONFIG_EFI_STUB enabled.
*/
void efi_add_known_memory_from_efi(void);
/**
* setup_info_table() - sets up a table containing information from EFI
*
* We must call exit_boot_services() before jumping out of the stub into U-Boot
* proper, so that U-Boot has full control of peripherals, memory, etc.
*
* Once we do this, we cannot call any boot-services functions so we must find
* out everything we need to before doing that.
*
* Set up a struct efi_info_hdr table which can hold various records (e.g.
* struct efi_entry_memmap) with information obtained from EFI.
*
* @priv: Pointer to our private information which contains the list
* @size: Size of the table to allocate
* Return: 0 if OK, non-zero on error
*/
int setup_info_table(struct efi_priv *priv, int size);
/**
* add_entry_addr() - Add a new entry to the efi_info list
*
* This adds an entry, consisting of a tag and two lots of data. This avoids the
* caller having to coalesce the data first
*
* @priv: Pointer to our private information which contains the list
* @type: Type of the entry to add
* @ptr1: Pointer to first data block to add
* @size1: Size of first data block in bytes (can be 0)
* @ptr2: Pointer to second data block to add
* @size2: Size of second data block in bytes (can be 0)
*/
void add_entry_addr(struct efi_priv *priv, enum efi_entry_t type, void *ptr1,
int size1, void *ptr2, int size2);
/**
* arch_efi_main_init() - Set up the stub ready for use
*
* @priv: Pointer to private information
* @boot: Boot-services table
* Return: 0 if OK, or EFI error code
*/
efi_status_t arch_efi_main_init(struct efi_priv *priv,
struct efi_boot_services *boot);
/**
* arch_efi_jump_to_payload() - Jump to the U-Boot payload
*
* Jumps to U-Boot in an arch-specific way
*
* @priv: Pointer to private information
*/
void arch_efi_jump_to_payload(struct efi_priv *priv);
/* true if we must use the hardware UART directory (EFI not available) */
extern bool use_hw_uart;
#endif /* _EFI_STUB_H */