uboot/include/efi_loader.h
<<
>>
Prefs
   1/*
   2 *  EFI application loader
   3 *
   4 *  Copyright (c) 2016 Alexander Graf
   5 *
   6 *  SPDX-License-Identifier:     GPL-2.0+
   7 */
   8
   9#include <common.h>
  10#include <part_efi.h>
  11#include <efi_api.h>
  12
  13/* No need for efi loader support in SPL */
  14#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD)
  15
  16#include <linux/list.h>
  17
  18#define EFI_ENTRY(format, ...) do { \
  19        efi_restore_gd(); \
  20        debug("EFI: Entry %s(" format ")\n", __func__, ##__VA_ARGS__); \
  21        } while(0)
  22
  23#define EFI_EXIT(ret) efi_exit_func(ret);
  24
  25extern struct efi_runtime_services efi_runtime_services;
  26extern struct efi_system_table systab;
  27
  28extern const struct efi_simple_text_output_protocol efi_con_out;
  29extern const struct efi_simple_input_interface efi_con_in;
  30extern const struct efi_console_control_protocol efi_console_control;
  31
  32extern const efi_guid_t efi_guid_console_control;
  33extern const efi_guid_t efi_guid_device_path;
  34extern const efi_guid_t efi_guid_loaded_image;
  35
  36extern unsigned int __efi_runtime_start, __efi_runtime_stop;
  37extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
  38
  39/*
  40 * While UEFI objects can have callbacks, you can also call functions on
  41 * protocols (classes) themselves. This struct maps a protocol GUID to its
  42 * interface (usually a struct with callback functions).
  43 */
  44struct efi_class_map {
  45        const efi_guid_t *guid;
  46        const void *interface;
  47};
  48
  49/*
  50 * When the UEFI payload wants to open a protocol on an object to get its
  51 * interface (usually a struct with callback functions), this struct maps the
  52 * protocol GUID to the respective protocol handler open function for that
  53 * object protocol combination.
  54 */
  55struct efi_handler {
  56        const efi_guid_t *guid;
  57        efi_status_t (EFIAPI *open)(void *handle,
  58                        efi_guid_t *protocol, void **protocol_interface,
  59                        void *agent_handle, void *controller_handle,
  60                        uint32_t attributes);
  61};
  62
  63/*
  64 * UEFI has a poor man's OO model where one "object" can be polymorphic and have
  65 * multiple different protocols (classes) attached to it.
  66 *
  67 * This struct is the parent struct for all of our actual implementation objects
  68 * that can include it to make themselves an EFI object
  69 */
  70struct efi_object {
  71        /* Every UEFI object is part of a global object list */
  72        struct list_head link;
  73        /* We support up to 4 "protocols" an object can be accessed through */
  74        struct efi_handler protocols[4];
  75        /* The object spawner can either use this for data or as identifier */
  76        void *handle;
  77};
  78
  79/* This list contains all UEFI objects we know of */
  80extern struct list_head efi_obj_list;
  81
  82/* Called by bootefi to make all disk storage accessible as EFI objects */
  83int efi_disk_register(void);
  84/* Called by bootefi to make GOP (graphical) interface available */
  85int efi_gop_register(void);
  86/* Called by bootefi to make the network interface available */
  87int efi_net_register(void **handle);
  88
  89/* Called by networking code to memorize the dhcp ack package */
  90void efi_net_set_dhcp_ack(void *pkt, int len);
  91
  92/*
  93 * Stub implementation for a protocol opener that just returns the handle as
  94 * interface
  95 */
  96efi_status_t efi_return_handle(void *handle,
  97                efi_guid_t *protocol, void **protocol_interface,
  98                void *agent_handle, void *controller_handle,
  99                uint32_t attributes);
 100/* Called from places to check whether a timer expired */
 101void efi_timer_check(void);
 102/* PE loader implementation */
 103void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info);
 104/* Called once to store the pristine gd pointer */
 105void efi_save_gd(void);
 106/* Called from EFI_ENTRY on callback entry to put gd into the gd register */
 107void efi_restore_gd(void);
 108/* Called from EFI_EXIT on callback exit to restore the gd register */
 109efi_status_t efi_exit_func(efi_status_t ret);
 110/* Call this to relocate the runtime section to an address space */
 111void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
 112/* Call this to set the current device name */
 113void efi_set_bootdev(const char *dev, const char *devnr, const char *path);
 114
 115/* Generic EFI memory allocator, call this to get memory */
 116void *efi_alloc(uint64_t len, int memory_type);
 117/* More specific EFI memory allocator, called by EFI payloads */
 118efi_status_t efi_allocate_pages(int type, int memory_type, unsigned long pages,
 119                                uint64_t *memory);
 120/* EFI memory free function. Not implemented today */
 121efi_status_t efi_free_pages(uint64_t memory, unsigned long pages);
 122/* Returns the EFI memory map */
 123efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
 124                                struct efi_mem_desc *memory_map,
 125                                unsigned long *map_key,
 126                                unsigned long *descriptor_size,
 127                                uint32_t *descriptor_version);
 128/* Adds a range into the EFI memory map */
 129uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
 130                            bool overlap_only_ram);
 131/* Called by board init to initialize the EFI memory map */
 132int efi_memory_init(void);
 133
 134#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
 135extern void *efi_bounce_buffer;
 136#define EFI_LOADER_BOUNCE_BUFFER_SIZE (64 * 1024 * 1024)
 137#endif
 138
 139/* Convert strings from normal C strings to uEFI strings */
 140static inline void ascii2unicode(u16 *unicode, const char *ascii)
 141{
 142        while (*ascii)
 143                *(unicode++) = *(ascii++);
 144}
 145
 146/*
 147 * Use these to indicate that your code / data should go into the EFI runtime
 148 * section and thus still be available when the OS is running
 149 */
 150#define EFI_RUNTIME_DATA __attribute__ ((section ("efi_runtime_data")))
 151#define EFI_RUNTIME_TEXT __attribute__ ((section ("efi_runtime_text")))
 152
 153#else /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */
 154
 155/* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */
 156#define EFI_RUNTIME_DATA
 157#define EFI_RUNTIME_TEXT
 158
 159/* No loader configured, stub out EFI_ENTRY */
 160static inline void efi_restore_gd(void) { }
 161static inline void efi_set_bootdev(const char *dev, const char *devnr,
 162                                   const char *path) { }
 163static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
 164
 165#endif
 166