efi_loader.h 27.1 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0+ */
A
Alexander Graf 已提交
2 3 4 5 6 7
/*
 *  EFI application loader
 *
 *  Copyright (c) 2016 Alexander Graf
 */

8 9 10
#ifndef _EFI_LOADER_H
#define _EFI_LOADER_H 1

11
#include <common.h>
A
Alexander Graf 已提交
12 13
#include <part_efi.h>
#include <efi_api.h>
14

15 16 17 18 19
static inline int guidcmp(const void *g1, const void *g2)
{
	return memcmp(g1, g2, sizeof(efi_guid_t));
}

S
Sughosh Ganu 已提交
20 21 22 23 24
static inline void *guidcpy(void *dst, const void *src)
{
	return memcpy(dst, src, sizeof(efi_guid_t));
}

25
/* No need for efi loader support in SPL */
S
Stephen Warren 已提交
26
#if CONFIG_IS_ENABLED(EFI_LOADER)
27

A
Alexander Graf 已提交
28
#include <linux/list.h>
29
#include <linux/oid_registry.h>
A
Alexander Graf 已提交
30

31 32 33
/* Maximum number of configuration tables */
#define EFI_MAX_CONFIGURATION_TABLES 16

34 35 36 37
/* GUID used by the root node */
#define U_BOOT_GUID \
	EFI_GUID(0xe61d73b9, 0xa384, 0x4acc, \
		 0xae, 0xab, 0x82, 0xe8, 0x28, 0xf3, 0x62, 0x8b)
38 39 40 41
/* GUID used as host device on sandbox */
#define U_BOOT_HOST_DEV_GUID \
	EFI_GUID(0xbbe4e671, 0x5773, 0x4ea1, \
		 0x9a, 0xab, 0x3a, 0x7d, 0xbf, 0x40, 0xc4, 0x82)
42

43
/* Use internal device tree when starting UEFI application */
44
#define EFI_FDT_USE_INTERNAL NULL
45

46 47 48
/* Root node */
extern efi_handle_t efi_root;

49 50
int __efi_entry_check(void);
int __efi_exit_check(void);
51
const char *__efi_nesting(void);
52 53
const char *__efi_nesting_inc(void);
const char *__efi_nesting_dec(void);
54

R
Rob Clark 已提交
55 56 57
/*
 * Enter the u-boot world from UEFI:
 */
58
#define EFI_ENTRY(format, ...) do { \
59
	assert(__efi_entry_check()); \
60 61
	debug("%sEFI: Entry %s(" format ")\n", __efi_nesting_inc(), \
		__func__, ##__VA_ARGS__); \
62 63
	} while(0)

R
Rob Clark 已提交
64 65 66
/*
 * Exit the u-boot world back to UEFI:
 */
67
#define EFI_EXIT(ret) ({ \
68
	typeof(ret) _r = ret; \
69
	debug("%sEFI: Exit: %s: %u\n", __efi_nesting_dec(), \
70
		__func__, (u32)((uintptr_t) _r & ~EFI_ERROR_MASK)); \
71 72
	assert(__efi_exit_check()); \
	_r; \
73
	})
74

R
Rob Clark 已提交
75
/*
76
 * Call non-void UEFI function from u-boot and retrieve return value:
R
Rob Clark 已提交
77
 */
78 79 80 81 82 83 84 85 86 87 88 89 90 91
#define EFI_CALL(exp) ({ \
	debug("%sEFI: Call: %s\n", __efi_nesting_inc(), #exp); \
	assert(__efi_exit_check()); \
	typeof(exp) _r = exp; \
	assert(__efi_entry_check()); \
	debug("%sEFI: %lu returned by %s\n", __efi_nesting_dec(), \
	      (unsigned long)((uintptr_t)_r & ~EFI_ERROR_MASK), #exp); \
	_r; \
})

/*
 * Call void UEFI function from u-boot:
 */
#define EFI_CALL_VOID(exp) do { \
92
	debug("%sEFI: Call: %s\n", __efi_nesting_inc(), #exp); \
93
	assert(__efi_exit_check()); \
R
Rob Clark 已提交
94
	exp; \
95
	assert(__efi_entry_check()); \
96
	debug("%sEFI: Return From: %s\n", __efi_nesting_dec(), #exp); \
R
Rob Clark 已提交
97 98
	} while(0)

99
/*
100
 * Write an indented message with EFI prefix
101
 */
102 103 104
#define EFI_PRINT(format, ...) ({ \
	debug("%sEFI: " format, __efi_nesting(), \
		##__VA_ARGS__); \
105 106
	})

107 108 109 110 111 112 113
#ifdef CONFIG_SYS_CACHELINE_SIZE
#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE
#else
/* Just use the greatest cache flush alignment requirement I'm aware of */
#define EFI_CACHELINE_SIZE 128
#endif

114 115 116
/* Key identifying current memory map */
extern efi_uintn_t efi_memory_map_key;

117
extern struct efi_runtime_services efi_runtime_services;
118 119
extern struct efi_system_table systab;

120
extern struct efi_simple_text_output_protocol efi_con_out;
121
extern struct efi_simple_text_input_protocol efi_con_in;
122
extern struct efi_console_control_protocol efi_console_control;
123
extern const struct efi_device_path_to_text_protocol efi_device_path_to_text;
124 125 126
/* implementation of the EFI_DEVICE_PATH_UTILITIES_PROTOCOL */
extern const struct efi_device_path_utilities_protocol
					efi_device_path_utilities;
127 128 129 130
/* deprecated version of the EFI_UNICODE_COLLATION_PROTOCOL */
extern const struct efi_unicode_collation_protocol
					efi_unicode_collation_protocol;
/* current version of the EFI_UNICODE_COLLATION_PROTOCOL */
131
extern const struct efi_unicode_collation_protocol
132
					efi_unicode_collation_protocol2;
133 134
extern const struct efi_hii_config_routing_protocol efi_hii_config_routing;
extern const struct efi_hii_config_access_protocol efi_hii_config_access;
135 136
extern const struct efi_hii_database_protocol efi_hii_database;
extern const struct efi_hii_string_protocol efi_hii_string;
137
extern const struct efi_rng_protocol efi_rng_protocol;
138

139 140
uint16_t *efi_dp_str(struct efi_device_path *dp);

141 142
/* GUID of the U-Boot root node */
extern const efi_guid_t efi_u_boot_guid;
143 144 145 146
#ifdef CONFIG_SANDBOX
/* GUID of U-Boot host device on sandbox */
extern const efi_guid_t efi_guid_host_dev;
#endif
147 148
/* GUID of the EFI_BLOCK_IO_PROTOCOL */
extern const efi_guid_t efi_block_io_guid;
R
Rob Clark 已提交
149
extern const efi_guid_t efi_global_variable_guid;
150
extern const efi_guid_t efi_guid_console_control;
A
Alexander Graf 已提交
151
extern const efi_guid_t efi_guid_device_path;
152 153
/* GUID of the EFI_DRIVER_BINDING_PROTOCOL */
extern const efi_guid_t efi_guid_driver_binding_protocol;
154 155 156 157 158 159 160 161 162 163
/* event group ExitBootServices() invoked */
extern const efi_guid_t efi_guid_event_group_exit_boot_services;
/* event group SetVirtualAddressMap() invoked */
extern const efi_guid_t efi_guid_event_group_virtual_address_change;
/* event group memory map changed */
extern const efi_guid_t efi_guid_event_group_memory_map_change;
/* event group boot manager about to boot */
extern const efi_guid_t efi_guid_event_group_ready_to_boot;
/* event group ResetSystem() invoked (before ExitBootServices) */
extern const efi_guid_t efi_guid_event_group_reset_system;
164 165
/* GUID of the device tree table */
extern const efi_guid_t efi_guid_fdt;
A
Alexander Graf 已提交
166
extern const efi_guid_t efi_guid_loaded_image;
167
extern const efi_guid_t efi_guid_loaded_image_device_path;
168
extern const efi_guid_t efi_guid_device_path_to_text_protocol;
R
Rob Clark 已提交
169 170
extern const efi_guid_t efi_simple_file_system_protocol_guid;
extern const efi_guid_t efi_file_info_guid;
171 172
/* GUID for file system information */
extern const efi_guid_t efi_file_system_info_guid;
173
extern const efi_guid_t efi_guid_device_path_utilities_protocol;
174 175
/* GUID of the deprecated Unicode collation protocol */
extern const efi_guid_t efi_guid_unicode_collation_protocol;
176
/* GUID of the Unicode collation protocol */
177
extern const efi_guid_t efi_guid_unicode_collation_protocol2;
178 179
extern const efi_guid_t efi_guid_hii_config_routing_protocol;
extern const efi_guid_t efi_guid_hii_config_access_protocol;
180 181
extern const efi_guid_t efi_guid_hii_database_protocol;
extern const efi_guid_t efi_guid_hii_string_protocol;
182 183 184 185 186
/* GUIDs for authentication */
extern const efi_guid_t efi_guid_image_security_database;
extern const efi_guid_t efi_guid_sha256;
extern const efi_guid_t efi_guid_cert_x509;
extern const efi_guid_t efi_guid_cert_x509_sha256;
187
extern const efi_guid_t efi_guid_cert_type_pkcs7;
A
Alexander Graf 已提交
188

189 190 191
/* GUID of RNG protocol */
extern const efi_guid_t efi_guid_rng_protocol;

192 193 194
extern unsigned int __efi_runtime_start, __efi_runtime_stop;
extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;

195 196 197
/**
 * struct efi_open_protocol_info_item - open protocol info item
 *
198 199
 * When a protocol is opened a open protocol info entry is created.
 * These are maintained in a list.
200 201 202
 *
 * @link:	link to the list of open protocol info entries of a protocol
 * @info:	information about the opening of a protocol
203 204 205 206 207 208
 */
struct efi_open_protocol_info_item {
	struct list_head link;
	struct efi_open_protocol_info_entry info;
};

209 210 211
/**
 * struct efi_handler - single protocol interface of a handle
 *
212 213
 * When the UEFI payload wants to open a protocol on an object to get its
 * interface (usually a struct with callback functions), this struct maps the
214
 * protocol GUID to the respective protocol interface
215 216 217 218 219
 *
 * @link:		link to the list of protocols of a handle
 * @guid:		GUID of the protocol
 * @protocol_interface:	protocol interface
 * @open_infos		link to the list of open protocol info items
220
 */
221
struct efi_handler {
222
	struct list_head link;
223
	const efi_guid_t *guid;
224
	void *protocol_interface;
225
	struct list_head open_infos;
226 227
};

228 229 230 231 232 233 234 235
/**
 * enum efi_object_type - type of EFI object
 *
 * In UnloadImage we must be able to identify if the handle relates to a
 * started image.
 */
enum efi_object_type {
	EFI_OBJECT_TYPE_UNDEFINED = 0,
236
	EFI_OBJECT_TYPE_U_BOOT_FIRMWARE,
237 238 239 240
	EFI_OBJECT_TYPE_LOADED_IMAGE,
	EFI_OBJECT_TYPE_STARTED_IMAGE,
};

241 242 243 244 245 246 247 248 249 250 251 252 253
/**
 * struct efi_object - dereferenced EFI handle
 *
 * @link:	pointers to put the handle into a linked list
 * @protocols:	linked list with the protocol interfaces installed on this
 *		handle
 *
 * UEFI offers a flexible and expandable object model. The objects in the UEFI
 * API are devices, drivers, and loaded images. struct efi_object is our storage
 * structure for these objects.
 *
 * When including this structure into a larger structure always put it first so
 * that when deleting a handle the whole encompassing structure can be freed.
254
 *
255 256
 * A pointer to this structure is referred to as a handle. Typedef efi_handle_t
 * has been created for such pointers.
257 258 259 260
 */
struct efi_object {
	/* Every UEFI object is part of a global object list */
	struct list_head link;
261 262
	/* The list of protocols */
	struct list_head protocols;
263
	enum efi_object_type type;
264 265
};

266 267
/**
 * struct efi_loaded_image_obj - handle of a loaded image
268 269
 *
 * @header:		EFI object header
270 271 272
 * @exit_status:	exit status passed to Exit()
 * @exit_data_size:	exit data size passed to Exit()
 * @exit_data:		exit data passed to Exit()
273 274
 * @exit_jmp:		long jump buffer for returning form started image
 * @entry:		entry address of the relocated image
275 276
 */
struct efi_loaded_image_obj {
277
	struct efi_object header;
278
	efi_status_t exit_status;
279 280
	efi_uintn_t *exit_data_size;
	u16 **exit_data;
281 282 283
	struct jmp_buf_data exit_jmp;
	EFIAPI efi_status_t (*entry)(efi_handle_t image_handle,
				     struct efi_system_table *st);
284
	u16 image_type;
285 286
};

287 288 289
/**
 * struct efi_event
 *
290
 * @link:		Link to list of all events
291
 * @queue_link:		Link to the list of queued events
292 293 294 295
 * @type:		Type of event, see efi_create_event
 * @notify_tpl:		Task priority level of notifications
 * @nofify_function:	Function to call when the event is triggered
 * @notify_context:	Data to be passed to the notify function
296
 * @group:		Event group
297 298
 * @trigger_time:	Period of the timer
 * @trigger_next:	Next time to trigger the timer
299
 * @trigger_type:	Type of timer, see efi_set_timer
300
 * @is_signaled:	The event occurred. The event is in the signaled state.
301 302
 */
struct efi_event {
303
	struct list_head link;
304
	struct list_head queue_link;
305
	uint32_t type;
306
	efi_uintn_t notify_tpl;
307 308
	void (EFIAPI *notify_function)(struct efi_event *event, void *context);
	void *notify_context;
309
	const efi_guid_t *group;
310 311
	u64 trigger_next;
	u64 trigger_time;
312
	enum efi_timer_delay trigger_type;
313
	bool is_signaled;
314 315
};

316 317
/* This list contains all UEFI objects we know of */
extern struct list_head efi_obj_list;
318 319
/* List of all events */
extern struct list_head efi_events;
320

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
/**
 * struct efi_protocol_notification - handle for notified protocol
 *
 * When a protocol interface is installed for which an event was registered with
 * the RegisterProtocolNotify() service this structure is used to hold the
 * handle on which the protocol interface was installed.
 *
 * @link:	link to list of all handles notified for this event
 * @handle:	handle on which the notified protocol interface was installed
 */
struct efi_protocol_notification {
	struct list_head link;
	efi_handle_t handle;
};

336 337 338 339 340
/**
 * efi_register_notify_event - event registered by RegisterProtocolNotify()
 *
 * The address of this structure serves as registration value.
 *
341 342 343 344 345 346
 * @link:	link to list of all registered events
 * @event:	registered event. The same event may registered for multiple
 *		GUIDs.
 * @protocol:	protocol for which the event is registered
 * @handles:	linked list of all handles on which the notified protocol was
 *		installed
347 348 349 350 351
 */
struct efi_register_notify_event {
	struct list_head link;
	struct efi_event *event;
	efi_guid_t protocol;
352
	struct list_head handles;
353 354 355 356 357
};

/* List of all events registered by RegisterProtocolNotify() */
extern struct list_head efi_register_notify_events;

358 359
/* Initialize efi execution environment */
efi_status_t efi_init_obj_list(void);
360 361
/* Install device tree */
efi_status_t efi_install_fdt(void *fdt);
362 363
/* Run loaded UEFI image */
efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size);
364 365
/* Initialize variable services */
efi_status_t efi_init_variables(void);
366 367
/* Notify ExitBootServices() is called */
void efi_variables_boot_exit_notify(void);
368 369
/* Called by bootefi to initialize root node */
efi_status_t efi_root_node_register(void);
370 371
/* Called by bootefi to initialize runtime */
efi_status_t efi_initialize_system_table(void);
372 373
/* efi_runtime_detach() - detach unimplemented runtime functions */
void efi_runtime_detach(void);
X
xypron.glpk@gmx.de 已提交
374
/* Called by bootefi to make console interface available */
375
efi_status_t efi_console_register(void);
A
Alexander Graf 已提交
376
/* Called by bootefi to make all disk storage accessible as EFI objects */
377
efi_status_t efi_disk_register(void);
378 379 380 381
/* Create handles and protocols for the partitions of a block device */
int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
			       const char *if_typename, int diskid,
			       const char *pdevname);
A
Alexander Graf 已提交
382
/* Called by bootefi to make GOP (graphical) interface available */
383
efi_status_t efi_gop_register(void);
384
/* Called by bootefi to make the network interface available */
385
efi_status_t efi_net_register(void);
386
/* Called by bootefi to make the watchdog available */
387
efi_status_t efi_watchdog_register(void);
388
efi_status_t efi_initrd_register(void);
389
/* Called by bootefi to make SMBIOS tables available */
390 391 392 393 394 395 396 397
/**
 * efi_acpi_register() - write out ACPI tables
 *
 * Called by bootefi to make ACPI tables available
 *
 * @return 0 if OK, -ENOMEM if no memory is available for the tables
 */
efi_status_t efi_acpi_register(void);
398 399 400 401 402 403 404
/**
 * efi_smbios_register() - write out SMBIOS tables
 *
 * Called by bootefi to make SMBIOS tables available
 *
 * @return 0 if OK, -ENOMEM if no memory is available for the tables
 */
405
efi_status_t efi_smbios_register(void);
406

R
Rob Clark 已提交
407 408 409
struct efi_simple_file_system_protocol *
efi_fs_from_path(struct efi_device_path *fp);

410 411
/* Called by networking code to memorize the dhcp ack package */
void efi_net_set_dhcp_ack(void *pkt, int len);
412 413
/* Called by efi_set_watchdog_timer to reset the timer */
efi_status_t efi_set_watchdog(unsigned long timeout);
414

415 416 417
/* Called from places to check whether a timer expired */
void efi_timer_check(void);
/* PE loader implementation */
418 419
efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle, void *efi,
			 struct efi_loaded_image *loaded_image_info);
420 421
/* Called once to store the pristine gd pointer */
void efi_save_gd(void);
422 423
/* Special case handler for error/abort that just tries to dtrt to get
 * back to u-boot world */
424
void efi_restore_gd(void);
425 426
/* Call this to relocate the runtime section to an address space */
void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
427
/* Call this to set the current device name */
428
void efi_set_bootdev(const char *dev, const char *devnr, const char *path);
429
/* Add a new object to the object list. */
430
void efi_add_handle(efi_handle_t obj);
431
/* Create handle */
432
efi_status_t efi_create_handle(efi_handle_t *handle);
433
/* Delete handle */
434
void efi_delete_handle(efi_handle_t obj);
435
/* Call this to validate a handle and find the EFI object for it */
436
struct efi_object *efi_search_obj(const efi_handle_t handle);
437 438 439 440 441 442 443
/* Load image */
efi_status_t EFIAPI efi_load_image(bool boot_policy,
				   efi_handle_t parent_image,
				   struct efi_device_path *file_path,
				   void *source_buffer,
				   efi_uintn_t source_size,
				   efi_handle_t *image_handle);
444 445 446 447
/* Start image */
efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
				    efi_uintn_t *exit_data_size,
				    u16 **exit_data);
448 449
/* Unload image */
efi_status_t EFIAPI efi_unload_image(efi_handle_t image_handle);
450
/* Find a protocol on a handle */
451
efi_status_t efi_search_protocol(const efi_handle_t handle,
452 453 454
				 const efi_guid_t *protocol_guid,
				 struct efi_handler **handler);
/* Install new protocol on a handle */
455 456
efi_status_t efi_add_protocol(const efi_handle_t handle,
			      const efi_guid_t *protocol,
457 458
			      void *protocol_interface);
/* Delete protocol from a handle */
459 460
efi_status_t efi_remove_protocol(const efi_handle_t handle,
				 const efi_guid_t *protocol,
461 462
				 void *protocol_interface);
/* Delete all protocols from a handle */
463
efi_status_t efi_remove_all_protocols(const efi_handle_t handle);
464 465 466
/* Install multiple protocol interfaces */
efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
				(efi_handle_t *handle, ...);
467 468 469 470 471 472 473 474 475 476 477 478 479 480
/* Get handles that support a given protocol */
efi_status_t EFIAPI efi_locate_handle_buffer(
			enum efi_locate_search_type search_type,
			const efi_guid_t *protocol, void *search_key,
			efi_uintn_t *no_handles, efi_handle_t **buffer);
/* Close an previously opened protocol interface */
efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
				       const efi_guid_t *protocol,
				       efi_handle_t agent_handle,
				       efi_handle_t controller_handle);
/* Open a protocol interface */
efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
					const efi_guid_t *protocol,
					void **protocol_interface);
481
/* Call this to create an event */
482
efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
483 484 485
			      void (EFIAPI *notify_function) (
					struct efi_event *event,
					void *context),
486 487
			      void *notify_context, efi_guid_t *group,
			      struct efi_event **event);
488
/* Call this to set a timer */
489
efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
490
			   uint64_t trigger_time);
X
xypron.glpk@gmx.de 已提交
491
/* Call this to signal an event */
492
void efi_signal_event(struct efi_event *event);
493

R
Rob Clark 已提交
494 495 496 497 498 499 500
/* open file system: */
struct efi_simple_file_system_protocol *efi_simple_file_system(
		struct blk_desc *desc, int part, struct efi_device_path *dp);

/* open file from device-path: */
struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp);

501 502 503 504 505 506 507 508 509 510
/**
 * efi_size_in_pages() - convert size in bytes to size in pages
 *
 * This macro returns the number of EFI memory pages required to hold 'size'
 * bytes.
 *
 * @size:	size in bytes
 * Return:	size in pages
 */
#define efi_size_in_pages(size) ((size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT)
511 512 513
/* Generic EFI memory allocator, call this to get memory */
void *efi_alloc(uint64_t len, int memory_type);
/* More specific EFI memory allocator, called by EFI payloads */
514
efi_status_t efi_allocate_pages(int type, int memory_type, efi_uintn_t pages,
515
				uint64_t *memory);
516
/* EFI memory free function. */
517
efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages);
518
/* EFI memory allocator for small allocations */
519
efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size,
520
			       void **buffer);
521 522
/* EFI pool memory free function. */
efi_status_t efi_free_pool(void *buffer);
523
/* Returns the EFI memory map */
524
efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
525
				struct efi_mem_desc *memory_map,
526 527
				efi_uintn_t *map_key,
				efi_uintn_t *descriptor_size,
528 529
				uint32_t *descriptor_version);
/* Adds a range into the EFI memory map */
530 531
efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
				bool overlap_only_ram);
532 533 534 535
/* Adds a conventional range into the EFI memory map */
efi_status_t efi_add_conventional_memory_map(u64 ram_start, u64 ram_end,
					     u64 ram_top);

536
/* Called by board init to initialize the EFI drivers */
537
efi_status_t efi_driver_init(void);
538 539
/* Called by board init to initialize the EFI memory map */
int efi_memory_init(void);
540 541
/* Adds new or overrides configuration table entry to the system table */
efi_status_t efi_install_configuration_table(const efi_guid_t *guid, void *table);
542
/* Sets up a loaded image */
543 544 545 546
efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
				    struct efi_device_path *file_path,
				    struct efi_loaded_image_obj **handle_ptr,
				    struct efi_loaded_image **info_ptr);
547 548
/* Print information about all loaded images */
void efi_print_image_infos(void *pc);
549

550 551 552 553 554
#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
extern void *efi_bounce_buffer;
#define EFI_LOADER_BOUNCE_BUFFER_SIZE (64 * 1024 * 1024)
#endif

R
Rob Clark 已提交
555 556

struct efi_device_path *efi_dp_next(const struct efi_device_path *dp);
557 558
int efi_dp_match(const struct efi_device_path *a,
		 const struct efi_device_path *b);
R
Rob Clark 已提交
559 560
struct efi_object *efi_dp_find_obj(struct efi_device_path *dp,
				   struct efi_device_path **rem);
561 562 563 564
/* get size of the first device path instance excluding end node */
efi_uintn_t efi_dp_instance_size(const struct efi_device_path *dp);
/* size of multi-instance device path excluding end node */
efi_uintn_t efi_dp_size(const struct efi_device_path *dp);
R
Rob Clark 已提交
565 566 567 568 569
struct efi_device_path *efi_dp_dup(const struct efi_device_path *dp);
struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
				      const struct efi_device_path *dp2);
struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
					   const struct efi_device_path *node);
570 571 572 573
/* Create a device path node of given type, sub-type, length */
struct efi_device_path *efi_dp_create_device_node(const u8 type,
						  const u8 sub_type,
						  const u16 length);
574 575 576 577 578 579 580 581 582
/* Append device path instance */
struct efi_device_path *efi_dp_append_instance(
		const struct efi_device_path *dp,
		const struct efi_device_path *dpi);
/* Get next device path instance */
struct efi_device_path *efi_dp_get_next_instance(struct efi_device_path **dp,
						 efi_uintn_t *size);
/* Check if a device path contains muliple instances */
bool efi_dp_is_multi_instance(const struct efi_device_path *dp);
R
Rob Clark 已提交
583 584

struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part);
585 586
/* Create a device node for a block device partition. */
struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part);
R
Rob Clark 已提交
587 588 589
struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
					 const char *path);
struct efi_device_path *efi_dp_from_eth(void);
590 591 592
struct efi_device_path *efi_dp_from_mem(uint32_t mem_type,
					uint64_t start_address,
					uint64_t end_address);
593 594 595
/* Determine the last device path node that is not the end node. */
const struct efi_device_path *efi_dp_last_node(
			const struct efi_device_path *dp);
596 597 598
efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
				    struct efi_device_path **device_path,
				    struct efi_device_path **file_path);
599 600 601 602
efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
			      const char *path,
			      struct efi_device_path **device,
			      struct efi_device_path **file);
R
Rob Clark 已提交
603 604 605 606 607

#define EFI_DP_TYPE(_dp, _type, _subtype) \
	(((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
	 ((_dp)->sub_type == DEVICE_PATH_SUB_TYPE_##_subtype))

608 609 610 611
/*
 * Use these to indicate that your code / data should go into the EFI runtime
 * section and thus still be available when the OS is running
 */
612 613
#define __efi_runtime_data __attribute__ ((section (".data.efi_runtime")))
#define __efi_runtime __attribute__ ((section (".text.efi_runtime")))
614

615 616 617
/* Indicate supported runtime services */
efi_status_t efi_init_runtime_supported(void);

618 619 620
/* Update CRC32 in table header */
void __efi_runtime efi_update_table_header_crc32(struct efi_table_hdr *table);

621 622
/* Call this with mmio_ptr as the _pointer_ to a pointer to an MMIO region
 * to make it available at runtime */
623
efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len);
624 625 626

/* Boards may provide the functions below to implement RTS functionality */

627
void __efi_runtime EFIAPI efi_reset_system(
628 629 630
			enum efi_reset_type reset_type,
			efi_status_t reset_status,
			unsigned long data_size, void *reset_data);
631 632 633

/* Architecture specific initialization of the EFI subsystem */
efi_status_t efi_reset_system_init(void);
634

635
efi_status_t __efi_runtime EFIAPI efi_get_time(
636 637 638
			struct efi_time *time,
			struct efi_time_cap *capabilities);

639 640
efi_status_t __efi_runtime EFIAPI efi_set_time(struct efi_time *time);

641 642 643 644 645 646 647 648 649
#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
/*
 * Entry point for the tests of the EFI API.
 * It is called by 'bootefi selftest'
 */
efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
				 struct efi_system_table *systab);
#endif

650 651 652
efi_status_t EFIAPI efi_get_variable(u16 *variable_name,
				     const efi_guid_t *vendor, u32 *attributes,
				     efi_uintn_t *data_size, void *data);
653 654
efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size,
					       u16 *variable_name,
655
					       efi_guid_t *vendor);
656 657
efi_status_t EFIAPI efi_set_variable(u16 *variable_name,
				     const efi_guid_t *vendor, u32 attributes,
658
				     efi_uintn_t data_size, const void *data);
R
Rob Clark 已提交
659

660 661 662 663 664
efi_status_t EFIAPI efi_query_variable_info(
			u32 attributes, u64 *maximum_variable_storage_size,
			u64 *remaining_variable_storage_size,
			u64 *maximum_variable_size);

665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
/*
 * See section 3.1.3 in the v2.7 UEFI spec for more details on
 * the layout of EFI_LOAD_OPTION.  In short it is:
 *
 *    typedef struct _EFI_LOAD_OPTION {
 *        UINT32 Attributes;
 *        UINT16 FilePathListLength;
 *        // CHAR16 Description[];   <-- variable length, NULL terminated
 *        // EFI_DEVICE_PATH_PROTOCOL FilePathList[];
 *						 <-- FilePathListLength bytes
 *        // UINT8 OptionalData[];
 *    } EFI_LOAD_OPTION;
 */
struct efi_load_option {
	u32 attributes;
	u16 file_path_length;
	u16 *label;
	struct efi_device_path *file_path;
683
	const u8 *optional_data;
684 685 686 687
};

void efi_deserialize_load_option(struct efi_load_option *lo, u8 *data);
unsigned long efi_serialize_load_option(struct efi_load_option *lo, u8 **data);
688
efi_status_t efi_bootmgr_load(efi_handle_t *handle);
R
Rob Clark 已提交
689

690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
#ifdef CONFIG_EFI_SECURE_BOOT
#include <image.h>

/**
 * efi_image_regions - A list of memory regions
 *
 * @max:	Maximum number of regions
 * @num:	Number of regions
 * @reg:	array of regions
 */
struct efi_image_regions {
	int			max;
	int			num;
	struct image_region	reg[];
};

/**
 * efi_sig_data - A decoded data of struct efi_signature_data
 *
 * This structure represents an internal form of signature in
 * signature database. A listed list may represent a signature list.
 *
 * @next:	Pointer to next entry
 * @onwer:	Signature owner
 * @data:	Pointer to signature data
 * @size:	Size of signature data
 */
struct efi_sig_data {
	struct efi_sig_data *next;
	efi_guid_t owner;
	void *data;
	size_t size;
};

/**
 * efi_signature_store - A decoded data of signature database
 *
 * This structure represents an internal form of signature database.
 *
 * @next:		Pointer to next entry
 * @sig_type:		Signature type
 * @sig_data_list:	Pointer to signature list
 */
struct efi_signature_store {
	struct efi_signature_store *next;
	efi_guid_t sig_type;
	struct efi_sig_data *sig_data_list;
};

struct x509_certificate;
struct pkcs7_message;

bool efi_signature_verify_cert(struct x509_certificate *cert,
			       struct efi_signature_store *dbx);
bool efi_signature_verify_signers(struct pkcs7_message *msg,
				  struct efi_signature_store *dbx);
bool efi_signature_verify_with_sigdb(struct efi_image_regions *regs,
				     struct pkcs7_message *msg,
				  struct efi_signature_store *db,
				  struct x509_certificate **cert);

efi_status_t efi_image_region_add(struct efi_image_regions *regs,
				  const void *start, const void *end,
				  int nocheck);
754 755 756

void efi_sigstore_free(struct efi_signature_store *sigstore);
struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name);
757 758

bool efi_secure_boot_enabled(void);
759 760
#endif /* CONFIG_EFI_SECURE_BOOT */

S
Stephen Warren 已提交
761
#else /* CONFIG_IS_ENABLED(EFI_LOADER) */
762

763
/* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */
764 765
#define __efi_runtime_data
#define __efi_runtime
766 767 768 769
static inline efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len)
{
	return EFI_SUCCESS;
}
770

771 772
/* No loader configured, stub out EFI_ENTRY */
static inline void efi_restore_gd(void) { }
773 774
static inline void efi_set_bootdev(const char *dev, const char *devnr,
				   const char *path) { }
775
static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
776
static inline void efi_print_image_infos(void *pc) { }
777

S
Stephen Warren 已提交
778
#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */
779 780

#endif /* _EFI_LOADER_H */