1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Extensible Firmware Interface
4 * Based on 'Extensible Firmware Interface Specification' version 0.9,
7 * Copyright (C) 1999 VA Linux Systems
8 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
9 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
10 * David Mosberger-Tang <davidm@hpl.hp.com>
11 * Stephane Eranian <eranian@hpl.hp.com>
13 * From include/linux/efi.h in kernel 4.1 with some additions/subtractions
21 #ifdef CONFIG_EFI_LOADER
22 #include <asm/setjmp.h>
25 /* UEFI spec version 2.7 */
26 #define EFI_SPECIFICATION_VERSION (2 << 16 | 70)
28 /* Types and defines for EFI CreateEvent */
29 enum efi_timer_delay
{
31 EFI_TIMER_PERIODIC
= 1,
32 EFI_TIMER_RELATIVE
= 2
35 #define efi_intn_t ssize_t
36 #define efi_uintn_t size_t
37 typedef uint16_t *efi_string_t
;
39 #define EVT_TIMER 0x80000000
40 #define EVT_RUNTIME 0x40000000
41 #define EVT_NOTIFY_WAIT 0x00000100
42 #define EVT_NOTIFY_SIGNAL 0x00000200
43 #define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
44 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
46 #define TPL_APPLICATION 0x04
47 #define TPL_CALLBACK 0x08
48 #define TPL_NOTIFY 0x10
49 #define TPL_HIGH_LEVEL 0x1F
53 /* EFI Boot Services table */
54 #define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
55 struct efi_boot_services
{
56 struct efi_table_hdr hdr
;
57 efi_status_t (EFIAPI
*raise_tpl
)(efi_uintn_t new_tpl
);
58 void (EFIAPI
*restore_tpl
)(efi_uintn_t old_tpl
);
60 efi_status_t (EFIAPI
*allocate_pages
)(int, int, efi_uintn_t
,
61 efi_physical_addr_t
*);
62 efi_status_t (EFIAPI
*free_pages
)(efi_physical_addr_t
, efi_uintn_t
);
63 efi_status_t (EFIAPI
*get_memory_map
)(efi_uintn_t
*memory_map_size
,
64 struct efi_mem_desc
*desc
,
66 efi_uintn_t
*desc_size
,
68 efi_status_t (EFIAPI
*allocate_pool
)(int, efi_uintn_t
, void **);
69 efi_status_t (EFIAPI
*free_pool
)(void *);
71 efi_status_t (EFIAPI
*create_event
)(uint32_t type
,
72 efi_uintn_t notify_tpl
,
73 void (EFIAPI
*notify_function
) (
74 struct efi_event
*event
,
76 void *notify_context
, struct efi_event
**event
);
77 efi_status_t (EFIAPI
*set_timer
)(struct efi_event
*event
,
78 enum efi_timer_delay type
,
79 uint64_t trigger_time
);
80 efi_status_t (EFIAPI
*wait_for_event
)(efi_uintn_t number_of_events
,
81 struct efi_event
**event
,
83 efi_status_t (EFIAPI
*signal_event
)(struct efi_event
*event
);
84 efi_status_t (EFIAPI
*close_event
)(struct efi_event
*event
);
85 efi_status_t (EFIAPI
*check_event
)(struct efi_event
*event
);
86 #define EFI_NATIVE_INTERFACE 0x00000000
87 efi_status_t (EFIAPI
*install_protocol_interface
)(
88 efi_handle_t
*handle
, const efi_guid_t
*protocol
,
89 int protocol_interface_type
, void *protocol_interface
);
90 efi_status_t (EFIAPI
*reinstall_protocol_interface
)(
91 efi_handle_t handle
, const efi_guid_t
*protocol
,
92 void *old_interface
, void *new_interface
);
93 efi_status_t (EFIAPI
*uninstall_protocol_interface
)(
94 efi_handle_t handle
, const efi_guid_t
*protocol
,
95 void *protocol_interface
);
96 efi_status_t (EFIAPI
*handle_protocol
)(
97 efi_handle_t handle
, const efi_guid_t
*protocol
,
98 void **protocol_interface
);
100 efi_status_t (EFIAPI
*register_protocol_notify
)(
101 const efi_guid_t
*protocol
, struct efi_event
*event
,
102 void **registration
);
103 efi_status_t (EFIAPI
*locate_handle
)(
104 enum efi_locate_search_type search_type
,
105 const efi_guid_t
*protocol
, void *search_key
,
106 efi_uintn_t
*buffer_size
, efi_handle_t
*buffer
);
107 efi_status_t (EFIAPI
*locate_device_path
)(const efi_guid_t
*protocol
,
108 struct efi_device_path
**device_path
,
109 efi_handle_t
*device
);
110 efi_status_t (EFIAPI
*install_configuration_table
)(
111 efi_guid_t
*guid
, void *table
);
113 efi_status_t (EFIAPI
*load_image
)(bool boot_policiy
,
114 efi_handle_t parent_image
,
115 struct efi_device_path
*file_path
, void *source_buffer
,
116 efi_uintn_t source_size
, efi_handle_t
*image
);
117 efi_status_t (EFIAPI
*start_image
)(efi_handle_t handle
,
118 unsigned long *exitdata_size
,
120 efi_status_t (EFIAPI
*exit
)(efi_handle_t handle
,
121 efi_status_t exit_status
,
122 unsigned long exitdata_size
, s16
*exitdata
);
123 efi_status_t (EFIAPI
*unload_image
)(efi_handle_t image_handle
);
124 efi_status_t (EFIAPI
*exit_boot_services
)(efi_handle_t
, unsigned long);
126 efi_status_t (EFIAPI
*get_next_monotonic_count
)(u64
*count
);
127 efi_status_t (EFIAPI
*stall
)(unsigned long usecs
);
128 efi_status_t (EFIAPI
*set_watchdog_timer
)(unsigned long timeout
,
129 uint64_t watchdog_code
, unsigned long data_size
,
130 uint16_t *watchdog_data
);
131 efi_status_t(EFIAPI
*connect_controller
)(efi_handle_t controller_handle
,
132 efi_handle_t
*driver_image_handle
,
133 struct efi_device_path
*remaining_device_path
,
135 efi_status_t (EFIAPI
*disconnect_controller
)(
136 efi_handle_t controller_handle
,
137 efi_handle_t driver_image_handle
,
138 efi_handle_t child_handle
);
139 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
140 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
141 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
142 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
143 #define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
144 #define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
145 efi_status_t (EFIAPI
*open_protocol
)(efi_handle_t handle
,
146 const efi_guid_t
*protocol
, void **interface
,
147 efi_handle_t agent_handle
,
148 efi_handle_t controller_handle
, u32 attributes
);
149 efi_status_t (EFIAPI
*close_protocol
)(
150 efi_handle_t handle
, const efi_guid_t
*protocol
,
151 efi_handle_t agent_handle
,
152 efi_handle_t controller_handle
);
153 efi_status_t(EFIAPI
*open_protocol_information
)(efi_handle_t handle
,
154 const efi_guid_t
*protocol
,
155 struct efi_open_protocol_info_entry
**entry_buffer
,
156 efi_uintn_t
*entry_count
);
157 efi_status_t (EFIAPI
*protocols_per_handle
)(efi_handle_t handle
,
158 efi_guid_t
***protocol_buffer
,
159 efi_uintn_t
*protocols_buffer_count
);
160 efi_status_t (EFIAPI
*locate_handle_buffer
) (
161 enum efi_locate_search_type search_type
,
162 const efi_guid_t
*protocol
, void *search_key
,
163 efi_uintn_t
*no_handles
, efi_handle_t
**buffer
);
164 efi_status_t (EFIAPI
*locate_protocol
)(const efi_guid_t
*protocol
,
165 void *registration
, void **protocol_interface
);
166 efi_status_t (EFIAPI
*install_multiple_protocol_interfaces
)(
167 efi_handle_t
*handle
, ...);
168 efi_status_t (EFIAPI
*uninstall_multiple_protocol_interfaces
)(
169 efi_handle_t handle
, ...);
170 efi_status_t (EFIAPI
*calculate_crc32
)(const void *data
,
171 efi_uintn_t data_size
,
173 void (EFIAPI
*copy_mem
)(void *destination
, const void *source
,
175 void (EFIAPI
*set_mem
)(void *buffer
, size_t size
, uint8_t value
);
176 efi_status_t (EFIAPI
*create_event_ex
)(
177 uint32_t type
, efi_uintn_t notify_tpl
,
178 void (EFIAPI
*notify_function
) (
179 struct efi_event
*event
,
181 void *notify_context
,
182 efi_guid_t
*event_group
,
183 struct efi_event
**event
);
186 /* Types and defines for EFI ResetSystem */
187 enum efi_reset_type
{
190 EFI_RESET_SHUTDOWN
= 2,
191 EFI_RESET_PLATFORM_SPECIFIC
= 3,
194 /* EFI Runtime Services table */
195 #define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552ULL
197 #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000
198 #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
199 #define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
201 struct efi_capsule_header
{
202 efi_guid_t
*capsule_guid
;
205 u32 capsule_image_size
;
208 struct efi_runtime_services
{
209 struct efi_table_hdr hdr
;
210 efi_status_t (EFIAPI
*get_time
)(struct efi_time
*time
,
211 struct efi_time_cap
*capabilities
);
212 efi_status_t (EFIAPI
*set_time
)(struct efi_time
*time
);
213 efi_status_t (EFIAPI
*get_wakeup_time
)(char *enabled
, char *pending
,
214 struct efi_time
*time
);
215 efi_status_t (EFIAPI
*set_wakeup_time
)(char enabled
,
216 struct efi_time
*time
);
217 efi_status_t (EFIAPI
*set_virtual_address_map
)(
218 unsigned long memory_map_size
,
219 unsigned long descriptor_size
,
220 uint32_t descriptor_version
,
221 struct efi_mem_desc
*virtmap
);
222 efi_status_t (*convert_pointer
)(unsigned long dbg
, void **address
);
223 efi_status_t (EFIAPI
*get_variable
)(u16
*variable_name
,
224 efi_guid_t
*vendor
, u32
*attributes
,
225 efi_uintn_t
*data_size
, void *data
);
226 efi_status_t (EFIAPI
*get_next_variable_name
)(
227 efi_uintn_t
*variable_name_size
,
228 u16
*variable_name
, efi_guid_t
*vendor
);
229 efi_status_t (EFIAPI
*set_variable
)(u16
*variable_name
,
230 efi_guid_t
*vendor
, u32 attributes
,
231 efi_uintn_t data_size
, void *data
);
232 efi_status_t (EFIAPI
*get_next_high_mono_count
)(
233 uint32_t *high_count
);
234 void (EFIAPI
*reset_system
)(enum efi_reset_type reset_type
,
235 efi_status_t reset_status
,
236 unsigned long data_size
, void *reset_data
);
237 efi_status_t (EFIAPI
*update_capsule
)(
238 struct efi_capsule_header
**capsule_header_array
,
239 efi_uintn_t capsule_count
,
240 u64 scatter_gather_list
);
241 efi_status_t (EFIAPI
*query_capsule_caps
)(
242 struct efi_capsule_header
**capsule_header_array
,
243 efi_uintn_t capsule_count
,
244 u64
*maximum_capsule_size
,
246 efi_status_t (EFIAPI
*query_variable_info
)(
248 u64
*maximum_variable_storage_size
,
249 u64
*remaining_variable_storage_size
,
250 u64
*maximum_variable_size
);
253 /* EFI event group GUID definitions */
254 #define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \
255 EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \
256 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf)
258 #define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \
259 EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \
260 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96)
262 #define EFI_EVENT_GROUP_MEMORY_MAP_CHANGE \
263 EFI_GUID(0x78bee926, 0x692f, 0x48fd, 0x9e, 0xdb, \
264 0x01, 0x42, 0x2e, 0xf0, 0xd7, 0xab)
266 #define EFI_EVENT_GROUP_READY_TO_BOOT \
267 EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \
268 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b)
270 #define EFI_EVENT_GROUP_RESET_SYSTEM \
271 EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
272 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
274 /* EFI Configuration Table and GUID definitions */
276 EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
279 #define EFI_GLOBAL_VARIABLE_GUID \
280 EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, \
281 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
283 #define LOADED_IMAGE_PROTOCOL_GUID \
284 EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, \
285 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
287 #define EFI_FDT_GUID \
288 EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
289 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
291 #define EFI_ACPI_TABLE_GUID \
292 EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \
293 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
295 #define SMBIOS_TABLE_GUID \
296 EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, \
297 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
299 struct efi_configuration_table
{
304 #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
306 struct efi_system_table
{
307 struct efi_table_hdr hdr
;
308 u16
*fw_vendor
; /* physical addr of wchar_t vendor string */
310 efi_handle_t con_in_handle
;
311 struct efi_simple_text_input_protocol
*con_in
;
312 efi_handle_t con_out_handle
;
313 struct efi_simple_text_output_protocol
*con_out
;
314 efi_handle_t stderr_handle
;
315 struct efi_simple_text_output_protocol
*std_err
;
316 struct efi_runtime_services
*runtime
;
317 struct efi_boot_services
*boottime
;
318 efi_uintn_t nr_tables
;
319 struct efi_configuration_table
*tables
;
322 #define LOADED_IMAGE_GUID \
323 EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
324 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
326 #define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000
328 struct efi_loaded_image
{
331 struct efi_system_table
*system_table
;
332 efi_handle_t device_handle
;
333 struct efi_device_path
*file_path
;
335 u32 load_options_size
;
338 aligned_u64 image_size
;
339 unsigned int image_code_type
;
340 unsigned int image_data_type
;
341 unsigned long unload
;
344 #define DEVICE_PATH_GUID \
345 EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
346 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
348 #define DEVICE_PATH_TYPE_END 0x7f
349 # define DEVICE_PATH_SUB_TYPE_INSTANCE_END 0x01
350 # define DEVICE_PATH_SUB_TYPE_END 0xff
352 struct efi_device_path
{
358 struct efi_mac_addr
{
362 #define DEVICE_PATH_TYPE_HARDWARE_DEVICE 0x01
363 # define DEVICE_PATH_SUB_TYPE_MEMORY 0x03
364 # define DEVICE_PATH_SUB_TYPE_VENDOR 0x04
366 struct efi_device_path_memory
{
367 struct efi_device_path dp
;
373 struct efi_device_path_vendor
{
374 struct efi_device_path dp
;
379 #define DEVICE_PATH_TYPE_ACPI_DEVICE 0x02
380 # define DEVICE_PATH_SUB_TYPE_ACPI_DEVICE 0x01
382 #define EFI_PNP_ID(ID) (u32)(((ID) << 16) | 0x41D0)
383 #define EISA_PNP_ID(ID) EFI_PNP_ID(ID)
384 #define EISA_PNP_NUM(ID) ((ID) >> 16)
386 struct efi_device_path_acpi_path
{
387 struct efi_device_path dp
;
392 #define DEVICE_PATH_TYPE_MESSAGING_DEVICE 0x03
393 # define DEVICE_PATH_SUB_TYPE_MSG_ATAPI 0x01
394 # define DEVICE_PATH_SUB_TYPE_MSG_SCSI 0x02
395 # define DEVICE_PATH_SUB_TYPE_MSG_USB 0x05
396 # define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR 0x0b
397 # define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS 0x0f
398 # define DEVICE_PATH_SUB_TYPE_MSG_SD 0x1a
399 # define DEVICE_PATH_SUB_TYPE_MSG_MMC 0x1d
401 struct efi_device_path_atapi
{
402 struct efi_device_path dp
;
403 u8 primary_secondary
;
405 u16 logical_unit_number
;
408 struct efi_device_path_scsi
{
409 struct efi_device_path dp
;
411 u16 logical_unit_number
;
414 struct efi_device_path_usb
{
415 struct efi_device_path dp
;
416 u8 parent_port_number
;
420 struct efi_device_path_mac_addr
{
421 struct efi_device_path dp
;
422 struct efi_mac_addr mac
;
426 struct efi_device_path_usb_class
{
427 struct efi_device_path dp
;
435 struct efi_device_path_sd_mmc_path
{
436 struct efi_device_path dp
;
440 #define DEVICE_PATH_TYPE_MEDIA_DEVICE 0x04
441 # define DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH 0x01
442 # define DEVICE_PATH_SUB_TYPE_CDROM_PATH 0x02
443 # define DEVICE_PATH_SUB_TYPE_FILE_PATH 0x04
445 struct efi_device_path_hard_drive_path
{
446 struct efi_device_path dp
;
447 u32 partition_number
;
450 u8 partition_signature
[16];
455 struct efi_device_path_cdrom_path
{
456 struct efi_device_path dp
;
462 struct efi_device_path_file_path
{
463 struct efi_device_path dp
;
467 #define BLOCK_IO_GUID \
468 EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
469 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
471 struct efi_block_io_media
{
473 char removable_media
;
475 char logical_partition
;
483 /* Added in revision 2 of the protocol */
484 u64 lowest_aligned_lba
;
485 u32 logical_blocks_per_physical_block
;
486 /* Added in revision 3 of the protocol */
487 u32 optimal_transfer_length_granualarity
;
490 #define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001
491 #define EFI_BLOCK_IO_PROTOCOL_REVISION3 0x0002001f
493 struct efi_block_io
{
495 struct efi_block_io_media
*media
;
496 efi_status_t (EFIAPI
*reset
)(struct efi_block_io
*this,
497 char extended_verification
);
498 efi_status_t (EFIAPI
*read_blocks
)(struct efi_block_io
*this,
499 u32 media_id
, u64 lba
, efi_uintn_t buffer_size
,
501 efi_status_t (EFIAPI
*write_blocks
)(struct efi_block_io
*this,
502 u32 media_id
, u64 lba
, efi_uintn_t buffer_size
,
504 efi_status_t (EFIAPI
*flush_blocks
)(struct efi_block_io
*this);
507 struct simple_text_output_mode
{
516 #define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
517 EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \
518 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
520 #define EFI_BLACK 0x00
521 #define EFI_BLUE 0x01
522 #define EFI_GREEN 0x02
523 #define EFI_CYAN 0x03
525 #define EFI_MAGENTA 0x05
526 #define EFI_BROWN 0x06
527 #define EFI_LIGHTGRAY 0x07
528 #define EFI_BRIGHT 0x08
529 #define EFI_DARKGRAY 0x08
530 #define EFI_LIGHTBLUE 0x09
531 #define EFI_LIGHTGREEN 0x0a
532 #define EFI_LIGHTCYAN 0x0b
533 #define EFI_LIGHTRED 0x0c
534 #define EFI_LIGHTMAGENTA 0x0d
535 #define EFI_YELLOW 0x0e
536 #define EFI_WHITE 0x0f
537 #define EFI_BACKGROUND_BLACK 0x00
538 #define EFI_BACKGROUND_BLUE 0x10
539 #define EFI_BACKGROUND_GREEN 0x20
540 #define EFI_BACKGROUND_CYAN 0x30
541 #define EFI_BACKGROUND_RED 0x40
542 #define EFI_BACKGROUND_MAGENTA 0x50
543 #define EFI_BACKGROUND_BROWN 0x60
544 #define EFI_BACKGROUND_LIGHTGRAY 0x70
546 /* extract foreground color from EFI attribute */
547 #define EFI_ATTR_FG(attr) ((attr) & 0x07)
548 /* treat high bit of FG as bright/bold (similar to edk2) */
549 #define EFI_ATTR_BOLD(attr) (((attr) >> 3) & 0x01)
550 /* extract background color from EFI attribute */
551 #define EFI_ATTR_BG(attr) (((attr) >> 4) & 0x7)
553 struct efi_simple_text_output_protocol
{
555 efi_status_t (EFIAPI
*output_string
)(
556 struct efi_simple_text_output_protocol
*this,
557 const efi_string_t str
);
558 efi_status_t (EFIAPI
*test_string
)(
559 struct efi_simple_text_output_protocol
*this,
560 const efi_string_t str
);
561 efi_status_t(EFIAPI
*query_mode
)(
562 struct efi_simple_text_output_protocol
*this,
563 unsigned long mode_number
, unsigned long *columns
,
564 unsigned long *rows
);
565 efi_status_t(EFIAPI
*set_mode
)(
566 struct efi_simple_text_output_protocol
*this,
567 unsigned long mode_number
);
568 efi_status_t(EFIAPI
*set_attribute
)(
569 struct efi_simple_text_output_protocol
*this,
570 unsigned long attribute
);
571 efi_status_t(EFIAPI
*clear_screen
) (
572 struct efi_simple_text_output_protocol
*this);
573 efi_status_t(EFIAPI
*set_cursor_position
) (
574 struct efi_simple_text_output_protocol
*this,
575 unsigned long column
, unsigned long row
);
576 efi_status_t(EFIAPI
*enable_cursor
)(
577 struct efi_simple_text_output_protocol
*this,
579 struct simple_text_output_mode
*mode
;
582 #define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
583 EFI_GUID(0xdd9e7534, 0x7762, 0x4698, \
584 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa)
586 struct efi_input_key
{
591 #define EFI_SHIFT_STATE_INVALID 0x00000000
592 #define EFI_RIGHT_SHIFT_PRESSED 0x00000001
593 #define EFI_LEFT_SHIFT_PRESSED 0x00000002
594 #define EFI_RIGHT_CONTROL_PRESSED 0x00000004
595 #define EFI_LEFT_CONTROL_PRESSED 0x00000008
596 #define EFI_RIGHT_ALT_PRESSED 0x00000010
597 #define EFI_LEFT_ALT_PRESSED 0x00000020
598 #define EFI_RIGHT_LOGO_PRESSED 0x00000040
599 #define EFI_LEFT_LOGO_PRESSED 0x00000080
600 #define EFI_MENU_KEY_PRESSED 0x00000100
601 #define EFI_SYS_REQ_PRESSED 0x00000200
602 #define EFI_SHIFT_STATE_VALID 0x80000000
604 #define EFI_TOGGLE_STATE_INVALID 0x00
605 #define EFI_SCROLL_LOCK_ACTIVE 0x01
606 #define EFI_NUM_LOCK_ACTIVE 0x02
607 #define EFI_CAPS_LOCK_ACTIVE 0x04
608 #define EFI_KEY_STATE_EXPOSED 0x40
609 #define EFI_TOGGLE_STATE_VALID 0x80
611 struct efi_key_state
{
616 struct efi_key_data
{
617 struct efi_input_key key
;
618 struct efi_key_state key_state
;
621 struct efi_simple_text_input_ex_protocol
{
622 efi_status_t (EFIAPI
*reset
) (
623 struct efi_simple_text_input_ex_protocol
*this,
624 bool extended_verification
);
625 efi_status_t (EFIAPI
*read_key_stroke_ex
) (
626 struct efi_simple_text_input_ex_protocol
*this,
627 struct efi_key_data
*key_data
);
628 struct efi_event
*wait_for_key_ex
;
629 efi_status_t (EFIAPI
*set_state
) (
630 struct efi_simple_text_input_ex_protocol
*this,
631 u8 key_toggle_state
);
632 efi_status_t (EFIAPI
*register_key_notify
) (
633 struct efi_simple_text_input_ex_protocol
*this,
634 struct efi_key_data
*key_data
,
635 efi_status_t (EFIAPI
*key_notify_function
)(
636 struct efi_key_data
*key_data
),
637 void **notify_handle
);
638 efi_status_t (EFIAPI
*unregister_key_notify
) (
639 struct efi_simple_text_input_ex_protocol
*this,
640 void *notification_handle
);
643 #define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
644 EFI_GUID(0x387477c1, 0x69c7, 0x11d2, \
645 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
647 struct efi_simple_text_input_protocol
{
648 efi_status_t(EFIAPI
*reset
)(struct efi_simple_text_input_protocol
*this,
649 bool extended_verification
);
650 efi_status_t(EFIAPI
*read_key_stroke
)(
651 struct efi_simple_text_input_protocol
*this,
652 struct efi_input_key
*key
);
653 struct efi_event
*wait_for_key
;
656 #define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
657 EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
658 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
660 struct efi_device_path_to_text_protocol
{
661 uint16_t *(EFIAPI
*convert_device_node_to_text
)(
662 struct efi_device_path
*device_node
,
664 bool allow_shortcuts
);
665 uint16_t *(EFIAPI
*convert_device_path_to_text
)(
666 struct efi_device_path
*device_path
,
668 bool allow_shortcuts
);
671 #define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
672 EFI_GUID(0x0379be4e, 0xd706, 0x437d, \
673 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4)
675 struct efi_device_path_utilities_protocol
{
676 efi_uintn_t (EFIAPI
*get_device_path_size
)(
677 const struct efi_device_path
*device_path
);
678 struct efi_device_path
*(EFIAPI
*duplicate_device_path
)(
679 const struct efi_device_path
*device_path
);
680 struct efi_device_path
*(EFIAPI
*append_device_path
)(
681 const struct efi_device_path
*src1
,
682 const struct efi_device_path
*src2
);
683 struct efi_device_path
*(EFIAPI
*append_device_node
)(
684 const struct efi_device_path
*device_path
,
685 const struct efi_device_path
*device_node
);
686 struct efi_device_path
*(EFIAPI
*append_device_path_instance
)(
687 const struct efi_device_path
*device_path
,
688 const struct efi_device_path
*device_path_instance
);
689 struct efi_device_path
*(EFIAPI
*get_next_device_path_instance
)(
690 struct efi_device_path
**device_path_instance
,
691 efi_uintn_t
*device_path_instance_size
);
692 bool (EFIAPI
*is_device_path_multi_instance
)(
693 const struct efi_device_path
*device_path
);
694 struct efi_device_path
*(EFIAPI
*create_device_node
)(
696 uint8_t node_sub_type
,
697 uint16_t node_length
);
700 #define EFI_GOP_GUID \
701 EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
702 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
704 #define EFI_GOT_RGBA8 0
705 #define EFI_GOT_BGRA8 1
706 #define EFI_GOT_BITMASK 2
708 struct efi_gop_mode_info
{
713 u32 pixel_bitmask
[4];
714 u32 pixels_per_scanline
;
717 struct efi_gop_mode
{
720 struct efi_gop_mode_info
*info
;
721 unsigned long info_size
;
722 efi_physical_addr_t fb_base
;
723 unsigned long fb_size
;
726 struct efi_gop_pixel
{
733 #define EFI_BLT_VIDEO_FILL 0
734 #define EFI_BLT_VIDEO_TO_BLT_BUFFER 1
735 #define EFI_BLT_BUFFER_TO_VIDEO 2
736 #define EFI_BLT_VIDEO_TO_VIDEO 3
739 efi_status_t (EFIAPI
*query_mode
)(struct efi_gop
*this, u32 mode_number
,
740 efi_uintn_t
*size_of_info
,
741 struct efi_gop_mode_info
**info
);
742 efi_status_t (EFIAPI
*set_mode
)(struct efi_gop
*this, u32 mode_number
);
743 efi_status_t (EFIAPI
*blt
)(struct efi_gop
*this,
744 struct efi_gop_pixel
*buffer
,
745 u32 operation
, efi_uintn_t sx
,
746 efi_uintn_t sy
, efi_uintn_t dx
,
747 efi_uintn_t dy
, efi_uintn_t width
,
748 efi_uintn_t height
, efi_uintn_t delta
);
749 struct efi_gop_mode
*mode
;
752 #define EFI_SIMPLE_NETWORK_GUID \
753 EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
754 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
756 struct efi_mac_address
{
760 struct efi_ip_address
{
762 } __attribute__((aligned(4)));
764 enum efi_simple_network_state
{
767 EFI_NETWORK_INITIALIZED
,
770 struct efi_simple_network_mode
{
771 enum efi_simple_network_state state
;
773 u32 media_header_size
;
776 u32 nvram_access_size
;
777 u32 receive_filter_mask
;
778 u32 receive_filter_setting
;
779 u32 max_mcast_filter_count
;
780 u32 mcast_filter_count
;
781 struct efi_mac_address mcast_filter
[16];
782 struct efi_mac_address current_address
;
783 struct efi_mac_address broadcast_address
;
784 struct efi_mac_address permanent_address
;
787 u8 multitx_supported
;
788 u8 media_present_supported
;
792 /* receive_filters bit mask */
793 #define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01
794 #define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02
795 #define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04
796 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08
797 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
799 /* interrupt status bit mask */
800 #define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT 0x01
801 #define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02
802 #define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT 0x04
803 #define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08
805 /* revision of the simple network protocol */
806 #define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000
808 struct efi_simple_network
{
810 efi_status_t (EFIAPI
*start
)(struct efi_simple_network
*this);
811 efi_status_t (EFIAPI
*stop
)(struct efi_simple_network
*this);
812 efi_status_t (EFIAPI
*initialize
)(struct efi_simple_network
*this,
813 ulong extra_rx
, ulong extra_tx
);
814 efi_status_t (EFIAPI
*reset
)(struct efi_simple_network
*this,
815 int extended_verification
);
816 efi_status_t (EFIAPI
*shutdown
)(struct efi_simple_network
*this);
817 efi_status_t (EFIAPI
*receive_filters
)(struct efi_simple_network
*this,
818 u32 enable
, u32 disable
, int reset_mcast_filter
,
819 ulong mcast_filter_count
,
820 struct efi_mac_address
*mcast_filter
);
821 efi_status_t (EFIAPI
*station_address
)(struct efi_simple_network
*this,
822 int reset
, struct efi_mac_address
*new_mac
);
823 efi_status_t (EFIAPI
*statistics
)(struct efi_simple_network
*this,
824 int reset
, ulong
*stat_size
, void *stat_table
);
825 efi_status_t (EFIAPI
*mcastiptomac
)(struct efi_simple_network
*this,
826 int ipv6
, struct efi_ip_address
*ip
,
827 struct efi_mac_address
*mac
);
828 efi_status_t (EFIAPI
*nvdata
)(struct efi_simple_network
*this,
829 int read_write
, ulong offset
, ulong buffer_size
,
831 efi_status_t (EFIAPI
*get_status
)(struct efi_simple_network
*this,
832 u32
*int_status
, void **txbuf
);
833 efi_status_t (EFIAPI
*transmit
)(struct efi_simple_network
*this,
834 size_t header_size
, size_t buffer_size
, void *buffer
,
835 struct efi_mac_address
*src_addr
,
836 struct efi_mac_address
*dest_addr
, u16
*protocol
);
837 efi_status_t (EFIAPI
*receive
)(struct efi_simple_network
*this,
838 size_t *header_size
, size_t *buffer_size
, void *buffer
,
839 struct efi_mac_address
*src_addr
,
840 struct efi_mac_address
*dest_addr
, u16
*protocol
);
841 struct efi_event
*wait_for_packet
;
842 struct efi_simple_network_mode
*mode
;
845 #define EFI_PXE_GUID \
846 EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
847 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
849 struct efi_pxe_packet
{
853 struct efi_pxe_mode
{
862 u8 dhcp_discover_valid
;
863 u8 dhcp_ack_received
;
864 u8 proxy_offer_received
;
865 u8 pxe_discover_valid
;
866 u8 pxe_reply_received
;
867 u8 pxe_bis_reply_received
;
868 u8 icmp_error_received
;
869 u8 tftp_error_received
;
874 struct efi_ip_address station_ip
;
875 struct efi_ip_address subnet_mask
;
876 struct efi_pxe_packet dhcp_discover
;
877 struct efi_pxe_packet dhcp_ack
;
878 struct efi_pxe_packet proxy_offer
;
879 struct efi_pxe_packet pxe_discover
;
880 struct efi_pxe_packet pxe_reply
;
885 void (EFIAPI
*start
)(void);
886 void (EFIAPI
*stop
)(void);
887 void (EFIAPI
*dhcp
)(void);
888 void (EFIAPI
*discover
)(void);
889 void (EFIAPI
*mftp
)(void);
890 void (EFIAPI
*udpwrite
)(void);
891 void (EFIAPI
*udpread
)(void);
892 void (EFIAPI
*setipfilter
)(void);
893 void (EFIAPI
*arp
)(void);
894 void (EFIAPI
*setparams
)(void);
895 void (EFIAPI
*setstationip
)(void);
896 void (EFIAPI
*setpackets
)(void);
897 struct efi_pxe_mode
*mode
;
900 #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
901 EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
902 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
903 #define EFI_FILE_PROTOCOL_REVISION 0x00010000
905 struct efi_file_handle
{
907 efi_status_t (EFIAPI
*open
)(struct efi_file_handle
*file
,
908 struct efi_file_handle
**new_handle
,
909 s16
*file_name
, u64 open_mode
, u64 attributes
);
910 efi_status_t (EFIAPI
*close
)(struct efi_file_handle
*file
);
911 efi_status_t (EFIAPI
*delete)(struct efi_file_handle
*file
);
912 efi_status_t (EFIAPI
*read
)(struct efi_file_handle
*file
,
913 efi_uintn_t
*buffer_size
, void *buffer
);
914 efi_status_t (EFIAPI
*write
)(struct efi_file_handle
*file
,
915 efi_uintn_t
*buffer_size
, void *buffer
);
916 efi_status_t (EFIAPI
*getpos
)(struct efi_file_handle
*file
,
918 efi_status_t (EFIAPI
*setpos
)(struct efi_file_handle
*file
,
920 efi_status_t (EFIAPI
*getinfo
)(struct efi_file_handle
*file
,
921 const efi_guid_t
*info_type
, efi_uintn_t
*buffer_size
,
923 efi_status_t (EFIAPI
*setinfo
)(struct efi_file_handle
*file
,
924 const efi_guid_t
*info_type
, efi_uintn_t buffer_size
,
926 efi_status_t (EFIAPI
*flush
)(struct efi_file_handle
*file
);
929 #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
930 EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
931 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
932 #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000
934 struct efi_simple_file_system_protocol
{
936 efi_status_t (EFIAPI
*open_volume
)(struct efi_simple_file_system_protocol
*this,
937 struct efi_file_handle
**root
);
940 #define EFI_FILE_INFO_GUID \
941 EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \
942 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
944 #define EFI_FILE_SYSTEM_INFO_GUID \
945 EFI_GUID(0x09576e93, 0x6d3f, 0x11d2, \
946 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
948 #define EFI_FILE_MODE_READ 0x0000000000000001
949 #define EFI_FILE_MODE_WRITE 0x0000000000000002
950 #define EFI_FILE_MODE_CREATE 0x8000000000000000
952 #define EFI_FILE_READ_ONLY 0x0000000000000001
953 #define EFI_FILE_HIDDEN 0x0000000000000002
954 #define EFI_FILE_SYSTEM 0x0000000000000004
955 #define EFI_FILE_RESERVED 0x0000000000000008
956 #define EFI_FILE_DIRECTORY 0x0000000000000010
957 #define EFI_FILE_ARCHIVE 0x0000000000000020
958 #define EFI_FILE_VALID_ATTR 0x0000000000000037
960 struct efi_file_info
{
964 struct efi_time create_time
;
965 struct efi_time last_access_time
;
966 struct efi_time modification_time
;
971 struct efi_file_system_info
{
980 #define EFI_DRIVER_BINDING_PROTOCOL_GUID \
981 EFI_GUID(0x18a031ab, 0xb443, 0x4d1a,\
982 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71)
983 struct efi_driver_binding_protocol
{
984 efi_status_t (EFIAPI
* supported
)(
985 struct efi_driver_binding_protocol
*this,
986 efi_handle_t controller_handle
,
987 struct efi_device_path
*remaining_device_path
);
988 efi_status_t (EFIAPI
* start
)(
989 struct efi_driver_binding_protocol
*this,
990 efi_handle_t controller_handle
,
991 struct efi_device_path
*remaining_device_path
);
992 efi_status_t (EFIAPI
* stop
)(
993 struct efi_driver_binding_protocol
*this,
994 efi_handle_t controller_handle
,
995 efi_uintn_t number_of_children
,
996 efi_handle_t
*child_handle_buffer
);
998 efi_handle_t image_handle
;
999 efi_handle_t driver_binding_handle
;
1002 #define EFI_UNICODE_COLLATION_PROTOCOL2_GUID \
1003 EFI_GUID(0xa4c751fc, 0x23ae, 0x4c3e, \
1004 0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49)
1005 struct efi_unicode_collation_protocol
{
1006 efi_intn_t (EFIAPI
*stri_coll
)(
1007 struct efi_unicode_collation_protocol
*this, u16
*s1
, u16
*s2
);
1008 bool (EFIAPI
*metai_match
)(struct efi_unicode_collation_protocol
*this,
1009 const u16
*string
, const u16
*patter
);
1010 void (EFIAPI
*str_lwr
)(struct efi_unicode_collation_protocol
1011 *this, u16
*string
);
1012 void (EFIAPI
*str_upr
)(struct efi_unicode_collation_protocol
*this,
1014 void (EFIAPI
*fat_to_str
)(struct efi_unicode_collation_protocol
*this,
1015 efi_uintn_t fat_size
, char *fat
, u16
*string
);
1016 bool (EFIAPI
*str_to_fat
)(struct efi_unicode_collation_protocol
*this,
1017 const u16
*string
, efi_uintn_t fat_size
,
1019 char *supported_languages
;