xref: /rk3399_rockchip-uboot/include/efi_api.h (revision 2fd945fe7287a15a29051242c9d021647a6f52dc)
1867a6ac8SSimon Glass /*
2867a6ac8SSimon Glass  * Extensible Firmware Interface
3867a6ac8SSimon Glass  * Based on 'Extensible Firmware Interface Specification' version 0.9,
4867a6ac8SSimon Glass  * April 30, 1999
5867a6ac8SSimon Glass  *
6867a6ac8SSimon Glass  * Copyright (C) 1999 VA Linux Systems
7867a6ac8SSimon Glass  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
8867a6ac8SSimon Glass  * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
9867a6ac8SSimon Glass  *	David Mosberger-Tang <davidm@hpl.hp.com>
10867a6ac8SSimon Glass  *	Stephane Eranian <eranian@hpl.hp.com>
11867a6ac8SSimon Glass  *
12867a6ac8SSimon Glass  * From include/linux/efi.h in kernel 4.1 with some additions/subtractions
13867a6ac8SSimon Glass  */
14867a6ac8SSimon Glass 
15867a6ac8SSimon Glass #ifndef _EFI_API_H
16867a6ac8SSimon Glass #define _EFI_API_H
17867a6ac8SSimon Glass 
18867a6ac8SSimon Glass #include <efi.h>
19867a6ac8SSimon Glass 
20a86aeaf2SAlexander Graf #ifdef CONFIG_EFI_LOADER
21a86aeaf2SAlexander Graf #include <asm/setjmp.h>
22a86aeaf2SAlexander Graf #endif
23a86aeaf2SAlexander Graf 
242bb9b79dSAlexander Graf /* Types and defines for EFI CreateEvent */
252bb9b79dSAlexander Graf enum efi_event_type {
262bb9b79dSAlexander Graf 	EFI_TIMER_STOP = 0,
272bb9b79dSAlexander Graf 	EFI_TIMER_PERIODIC = 1,
282bb9b79dSAlexander Graf 	EFI_TIMER_RELATIVE = 2
292bb9b79dSAlexander Graf };
302bb9b79dSAlexander Graf 
3137a980b3SJonathan Gray #define EVT_NOTIFY_WAIT		0x00000100
3237a980b3SJonathan Gray #define EVT_NOTIFY_SIGNAL	0x00000200
3337a980b3SJonathan Gray 
34*2fd945feSxypron.glpk@gmx.de struct efi_event;
35*2fd945feSxypron.glpk@gmx.de 
36867a6ac8SSimon Glass /* EFI Boot Services table */
37867a6ac8SSimon Glass struct efi_boot_services {
38867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
392bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *raise_tpl)(unsigned long new_tpl);
402bb9b79dSAlexander Graf 	void (EFIAPI *restore_tpl)(unsigned long old_tpl);
41867a6ac8SSimon Glass 
42867a6ac8SSimon Glass 	efi_status_t (EFIAPI *allocate_pages)(int, int, unsigned long,
43867a6ac8SSimon Glass 					      efi_physical_addr_t *);
44867a6ac8SSimon Glass 	efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, unsigned long);
45867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_memory_map)(unsigned long *memory_map_size,
46867a6ac8SSimon Glass 			struct efi_mem_desc *desc, unsigned long *key,
47867a6ac8SSimon Glass 			unsigned long *desc_size, u32 *desc_version);
48867a6ac8SSimon Glass 	efi_status_t (EFIAPI *allocate_pool)(int, unsigned long, void **);
49867a6ac8SSimon Glass 	efi_status_t (EFIAPI *free_pool)(void *);
50867a6ac8SSimon Glass 
512bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *create_event)(enum efi_event_type type,
522bb9b79dSAlexander Graf 			unsigned long notify_tpl,
53*2fd945feSxypron.glpk@gmx.de 			void (EFIAPI *notify_function) (
54*2fd945feSxypron.glpk@gmx.de 					struct efi_event *event,
552bb9b79dSAlexander Graf 					void *context),
56*2fd945feSxypron.glpk@gmx.de 			void *notify_context, struct efi_event **event);
57*2fd945feSxypron.glpk@gmx.de 	efi_status_t (EFIAPI *set_timer)(struct efi_event *event, int type,
582bb9b79dSAlexander Graf 			uint64_t trigger_time);
59867a6ac8SSimon Glass 	efi_status_t (EFIAPI *wait_for_event)(unsigned long number_of_events,
60*2fd945feSxypron.glpk@gmx.de 			struct efi_event **event, unsigned long *index);
61*2fd945feSxypron.glpk@gmx.de 	efi_status_t (EFIAPI *signal_event)(struct efi_event *event);
62*2fd945feSxypron.glpk@gmx.de 	efi_status_t (EFIAPI *close_event)(struct efi_event *event);
63*2fd945feSxypron.glpk@gmx.de 	efi_status_t (EFIAPI *check_event)(struct efi_event *event);
64e0549f8aSxypron.glpk@gmx.de #define EFI_NATIVE_INTERFACE	0x00000000
652bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_protocol_interface)(
662bb9b79dSAlexander Graf 			void **handle, efi_guid_t *protocol,
672bb9b79dSAlexander Graf 			int protocol_interface_type, void *protocol_interface);
682bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *reinstall_protocol_interface)(
692bb9b79dSAlexander Graf 			void *handle, efi_guid_t *protocol,
702bb9b79dSAlexander Graf 			void *old_interface, void *new_interface);
712bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *uninstall_protocol_interface)(void *handle,
722bb9b79dSAlexander Graf 			efi_guid_t *protocol, void *protocol_interface);
73867a6ac8SSimon Glass 	efi_status_t (EFIAPI *handle_protocol)(efi_handle_t, efi_guid_t *,
74867a6ac8SSimon Glass 					       void **);
75867a6ac8SSimon Glass 	void *reserved;
762bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *register_protocol_notify)(
77*2fd945feSxypron.glpk@gmx.de 			efi_guid_t *protocol, struct efi_event *event,
782bb9b79dSAlexander Graf 			void **registration);
79867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_handle)(
80867a6ac8SSimon Glass 			enum efi_locate_search_type search_type,
81867a6ac8SSimon Glass 			efi_guid_t *protocol, void *search_key,
82867a6ac8SSimon Glass 			unsigned long *buffer_size, efi_handle_t *buffer);
83867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_device_path)(efi_guid_t *protocol,
84867a6ac8SSimon Glass 			struct efi_device_path **device_path,
85867a6ac8SSimon Glass 			efi_handle_t *device);
862bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_configuration_table)(
872bb9b79dSAlexander Graf 			efi_guid_t *guid, void *table);
88867a6ac8SSimon Glass 
89867a6ac8SSimon Glass 	efi_status_t (EFIAPI *load_image)(bool boot_policiy,
90867a6ac8SSimon Glass 			efi_handle_t parent_image,
91867a6ac8SSimon Glass 			struct efi_device_path *file_path, void *source_buffer,
92867a6ac8SSimon Glass 			unsigned long source_size, efi_handle_t *image);
93867a6ac8SSimon Glass 	efi_status_t (EFIAPI *start_image)(efi_handle_t handle,
94867a6ac8SSimon Glass 					   unsigned long *exitdata_size,
95867a6ac8SSimon Glass 					   s16 **exitdata);
96867a6ac8SSimon Glass 	efi_status_t (EFIAPI *exit)(efi_handle_t handle,
97867a6ac8SSimon Glass 				    efi_status_t exit_status,
98867a6ac8SSimon Glass 				    unsigned long exitdata_size, s16 *exitdata);
992bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *unload_image)(void *image_handle);
100867a6ac8SSimon Glass 	efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t, unsigned long);
101867a6ac8SSimon Glass 
102867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
103867a6ac8SSimon Glass 	efi_status_t (EFIAPI *stall)(unsigned long usecs);
1042bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout,
1052bb9b79dSAlexander Graf 			uint64_t watchdog_code, unsigned long data_size,
1062bb9b79dSAlexander Graf 			uint16_t *watchdog_data);
107867a6ac8SSimon Glass 	efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle,
108867a6ac8SSimon Glass 			efi_handle_t *driver_image_handle,
109867a6ac8SSimon Glass 			struct efi_device_path *remaining_device_path,
110867a6ac8SSimon Glass 			bool recursive);
1112bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *disconnect_controller)(void *controller_handle,
1122bb9b79dSAlexander Graf 			void *driver_image_handle, void *child_handle);
113867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
114867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
115867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
116867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
117867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
118867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
119867a6ac8SSimon Glass 	efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle,
120867a6ac8SSimon Glass 			efi_guid_t *protocol, void **interface,
121867a6ac8SSimon Glass 			efi_handle_t agent_handle,
122867a6ac8SSimon Glass 			efi_handle_t controller_handle, u32 attributes);
1232bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *close_protocol)(void *handle,
1242bb9b79dSAlexander Graf 			efi_guid_t *protocol, void *agent_handle,
1252bb9b79dSAlexander Graf 			void *controller_handle);
126867a6ac8SSimon Glass 	efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
127867a6ac8SSimon Glass 			efi_guid_t *protocol,
128867a6ac8SSimon Glass 			struct efi_open_protocol_info_entry **entry_buffer,
129867a6ac8SSimon Glass 			unsigned long *entry_count);
130867a6ac8SSimon Glass 	efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
131867a6ac8SSimon Glass 			efi_guid_t ***protocol_buffer,
132867a6ac8SSimon Glass 			unsigned long *protocols_buffer_count);
133867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_handle_buffer) (
134867a6ac8SSimon Glass 			enum efi_locate_search_type search_type,
135867a6ac8SSimon Glass 			efi_guid_t *protocol, void *search_key,
136867a6ac8SSimon Glass 			unsigned long *no_handles, efi_handle_t **buffer);
1372bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *locate_protocol)(efi_guid_t *protocol,
1382bb9b79dSAlexander Graf 			void *registration, void **protocol_interface);
1392bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
1402bb9b79dSAlexander Graf 			void **handle, ...);
1412bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
1422bb9b79dSAlexander Graf 			void *handle, ...);
1432bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *calculate_crc32)(void *data,
1442bb9b79dSAlexander Graf 			unsigned long data_size, uint32_t *crc32);
1452bb9b79dSAlexander Graf 	void (EFIAPI *copy_mem)(void *destination, void *source,
1462bb9b79dSAlexander Graf 			unsigned long length);
1472bb9b79dSAlexander Graf 	void (EFIAPI *set_mem)(void *buffer, unsigned long size,
1482bb9b79dSAlexander Graf 			uint8_t value);
149867a6ac8SSimon Glass 	void *create_event_ex;
150867a6ac8SSimon Glass };
151867a6ac8SSimon Glass 
152867a6ac8SSimon Glass /* Types and defines for EFI ResetSystem */
153867a6ac8SSimon Glass enum efi_reset_type {
154867a6ac8SSimon Glass 	EFI_RESET_COLD = 0,
155867a6ac8SSimon Glass 	EFI_RESET_WARM = 1,
156867a6ac8SSimon Glass 	EFI_RESET_SHUTDOWN = 2
157867a6ac8SSimon Glass };
158867a6ac8SSimon Glass 
159867a6ac8SSimon Glass /* EFI Runtime Services table */
160867a6ac8SSimon Glass #define EFI_RUNTIME_SERVICES_SIGNATURE	0x5652453544e5552ULL
161867a6ac8SSimon Glass #define EFI_RUNTIME_SERVICES_REVISION	0x00010000
162867a6ac8SSimon Glass 
163867a6ac8SSimon Glass struct efi_runtime_services {
164867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
1652bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_time)(struct efi_time *time,
1662bb9b79dSAlexander Graf 			struct efi_time_cap *capabilities);
1672bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_time)(struct efi_time *time);
1682bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending,
1692bb9b79dSAlexander Graf 			struct efi_time *time);
1702bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_wakeup_time)(char enabled,
1712bb9b79dSAlexander Graf 			struct efi_time *time);
1722bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_virtual_address_map)(
1732bb9b79dSAlexander Graf 			unsigned long memory_map_size,
1742bb9b79dSAlexander Graf 			unsigned long descriptor_size,
1752bb9b79dSAlexander Graf 			uint32_t descriptor_version,
1762bb9b79dSAlexander Graf 			struct efi_mem_desc *virtmap);
1772bb9b79dSAlexander Graf 	efi_status_t (*convert_pointer)(unsigned long dbg, void **address);
178867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_variable)(s16 *variable_name,
179867a6ac8SSimon Glass 			efi_guid_t *vendor, u32 *attributes,
180867a6ac8SSimon Glass 			unsigned long *data_size, void *data);
181867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_next_variable)(
182867a6ac8SSimon Glass 			unsigned long *variable_name_size,
183867a6ac8SSimon Glass 			s16 *variable_name, efi_guid_t *vendor);
184867a6ac8SSimon Glass 	efi_status_t (EFIAPI *set_variable)(s16 *variable_name,
185867a6ac8SSimon Glass 			efi_guid_t *vendor, u32 attributes,
186867a6ac8SSimon Glass 			unsigned long data_size, void *data);
1872bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_next_high_mono_count)(
1882bb9b79dSAlexander Graf 			uint32_t *high_count);
189867a6ac8SSimon Glass 	void (EFIAPI *reset_system)(enum efi_reset_type reset_type,
190867a6ac8SSimon Glass 				    efi_status_t reset_status,
191867a6ac8SSimon Glass 				    unsigned long data_size, void *reset_data);
192867a6ac8SSimon Glass 	void *update_capsule;
193867a6ac8SSimon Glass 	void *query_capsule_caps;
194867a6ac8SSimon Glass 	void *query_variable_info;
195867a6ac8SSimon Glass };
196867a6ac8SSimon Glass 
197867a6ac8SSimon Glass /* EFI Configuration Table and GUID definitions */
198867a6ac8SSimon Glass #define NULL_GUID \
199867a6ac8SSimon Glass 	EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
200867a6ac8SSimon Glass 		 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
201867a6ac8SSimon Glass 
202867a6ac8SSimon Glass #define LOADED_IMAGE_PROTOCOL_GUID \
203867a6ac8SSimon Glass 	EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, \
204867a6ac8SSimon Glass 		 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
205867a6ac8SSimon Glass 
2062bb9b79dSAlexander Graf #define EFI_FDT_GUID \
2072bb9b79dSAlexander Graf 	EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
2082bb9b79dSAlexander Graf 		 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
2092bb9b79dSAlexander Graf 
210e663b350SAlexander Graf #define SMBIOS_TABLE_GUID \
211e663b350SAlexander Graf 	EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
212e663b350SAlexander Graf 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
213e663b350SAlexander Graf 
2142bb9b79dSAlexander Graf struct efi_configuration_table
2152bb9b79dSAlexander Graf {
2162bb9b79dSAlexander Graf 	efi_guid_t guid;
2172bb9b79dSAlexander Graf 	void *table;
2182bb9b79dSAlexander Graf };
2192bb9b79dSAlexander Graf 
2202bb9b79dSAlexander Graf #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
2212bb9b79dSAlexander Graf 
222867a6ac8SSimon Glass struct efi_system_table {
223867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
224867a6ac8SSimon Glass 	unsigned long fw_vendor;   /* physical addr of wchar_t vendor string */
225867a6ac8SSimon Glass 	u32 fw_revision;
226867a6ac8SSimon Glass 	unsigned long con_in_handle;
227867a6ac8SSimon Glass 	struct efi_simple_input_interface *con_in;
228867a6ac8SSimon Glass 	unsigned long con_out_handle;
229867a6ac8SSimon Glass 	struct efi_simple_text_output_protocol *con_out;
230867a6ac8SSimon Glass 	unsigned long stderr_handle;
2312bb9b79dSAlexander Graf 	struct efi_simple_text_output_protocol *std_err;
232867a6ac8SSimon Glass 	struct efi_runtime_services *runtime;
233867a6ac8SSimon Glass 	struct efi_boot_services *boottime;
234867a6ac8SSimon Glass 	unsigned long nr_tables;
2352bb9b79dSAlexander Graf 	struct efi_configuration_table *tables;
236867a6ac8SSimon Glass };
237867a6ac8SSimon Glass 
2382bb9b79dSAlexander Graf #define LOADED_IMAGE_GUID \
2392bb9b79dSAlexander Graf 	EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
2402bb9b79dSAlexander Graf 		 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
2412bb9b79dSAlexander Graf 
242867a6ac8SSimon Glass struct efi_loaded_image {
243867a6ac8SSimon Glass 	u32 revision;
244867a6ac8SSimon Glass 	void *parent_handle;
245867a6ac8SSimon Glass 	struct efi_system_table *system_table;
246867a6ac8SSimon Glass 	void *device_handle;
247867a6ac8SSimon Glass 	void *file_path;
248867a6ac8SSimon Glass 	void *reserved;
249867a6ac8SSimon Glass 	u32 load_options_size;
250867a6ac8SSimon Glass 	void *load_options;
251867a6ac8SSimon Glass 	void *image_base;
252867a6ac8SSimon Glass 	aligned_u64 image_size;
253867a6ac8SSimon Glass 	unsigned int image_code_type;
254867a6ac8SSimon Glass 	unsigned int image_data_type;
255867a6ac8SSimon Glass 	unsigned long unload;
256a86aeaf2SAlexander Graf 
257a86aeaf2SAlexander Graf 	/* Below are efi loader private fields */
258a86aeaf2SAlexander Graf #ifdef CONFIG_EFI_LOADER
259a86aeaf2SAlexander Graf 	efi_status_t exit_status;
260a86aeaf2SAlexander Graf 	struct jmp_buf_data exit_jmp;
261a86aeaf2SAlexander Graf #endif
262867a6ac8SSimon Glass };
263867a6ac8SSimon Glass 
2642bb9b79dSAlexander Graf #define DEVICE_PATH_GUID \
2652bb9b79dSAlexander Graf 	EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
2662bb9b79dSAlexander Graf 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
2672bb9b79dSAlexander Graf 
2682bb9b79dSAlexander Graf #define DEVICE_PATH_TYPE_END			0x7f
2692bb9b79dSAlexander Graf #  define DEVICE_PATH_SUB_TYPE_END		0xff
2702bb9b79dSAlexander Graf 
271867a6ac8SSimon Glass struct efi_device_path {
272867a6ac8SSimon Glass 	u8 type;
273867a6ac8SSimon Glass 	u8 sub_type;
274867a6ac8SSimon Glass 	u16 length;
275867a6ac8SSimon Glass };
276867a6ac8SSimon Glass 
277d7608abaSOleksandr Tymoshenko struct efi_mac_addr {
278d7608abaSOleksandr Tymoshenko 	u8 addr[32];
279d7608abaSOleksandr Tymoshenko };
280d7608abaSOleksandr Tymoshenko 
281d7608abaSOleksandr Tymoshenko #define DEVICE_PATH_TYPE_MESSAGING_DEVICE	0x03
282d7608abaSOleksandr Tymoshenko #  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR	0x0b
283d7608abaSOleksandr Tymoshenko 
284d7608abaSOleksandr Tymoshenko struct efi_device_path_mac_addr {
285d7608abaSOleksandr Tymoshenko 	struct efi_device_path dp;
286d7608abaSOleksandr Tymoshenko 	struct efi_mac_addr mac;
287d7608abaSOleksandr Tymoshenko 	u8 if_type;
288d7608abaSOleksandr Tymoshenko };
289d7608abaSOleksandr Tymoshenko 
2902bb9b79dSAlexander Graf #define DEVICE_PATH_TYPE_MEDIA_DEVICE		0x04
2912bb9b79dSAlexander Graf #  define DEVICE_PATH_SUB_TYPE_FILE_PATH	0x04
2922bb9b79dSAlexander Graf 
2932bb9b79dSAlexander Graf struct efi_device_path_file_path {
2942bb9b79dSAlexander Graf 	struct efi_device_path dp;
295ecbe1a07SAlexander Graf 	u16 str[32];
2962bb9b79dSAlexander Graf };
2972bb9b79dSAlexander Graf 
2982bb9b79dSAlexander Graf #define BLOCK_IO_GUID \
2992bb9b79dSAlexander Graf 	EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
3002bb9b79dSAlexander Graf 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
3012bb9b79dSAlexander Graf 
3022bb9b79dSAlexander Graf struct efi_block_io_media
3032bb9b79dSAlexander Graf {
3042bb9b79dSAlexander Graf 	u32 media_id;
3052bb9b79dSAlexander Graf 	char removable_media;
3062bb9b79dSAlexander Graf 	char media_present;
3072bb9b79dSAlexander Graf 	char logical_partition;
3082bb9b79dSAlexander Graf 	char read_only;
3092bb9b79dSAlexander Graf 	char write_caching;
3102bb9b79dSAlexander Graf 	u8 pad[3];
3112bb9b79dSAlexander Graf 	u32 block_size;
3122bb9b79dSAlexander Graf 	u32 io_align;
3132bb9b79dSAlexander Graf 	u8 pad2[4];
3142bb9b79dSAlexander Graf 	u64 last_block;
3152bb9b79dSAlexander Graf };
3162bb9b79dSAlexander Graf 
3172bb9b79dSAlexander Graf struct efi_block_io {
3182bb9b79dSAlexander Graf 	u64 revision;
3192bb9b79dSAlexander Graf 	struct efi_block_io_media *media;
3202bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
3212bb9b79dSAlexander Graf 			char extended_verification);
3222bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
3232bb9b79dSAlexander Graf 			u32 media_id, u64 lba, unsigned long buffer_size,
3242bb9b79dSAlexander Graf 			void *buffer);
3252bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
3262bb9b79dSAlexander Graf 			u32 media_id, u64 lba, unsigned long buffer_size,
3272bb9b79dSAlexander Graf 			void *buffer);
3282bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
3292bb9b79dSAlexander Graf };
3302bb9b79dSAlexander Graf 
331867a6ac8SSimon Glass struct simple_text_output_mode {
332867a6ac8SSimon Glass 	s32 max_mode;
333867a6ac8SSimon Glass 	s32 mode;
334867a6ac8SSimon Glass 	s32 attribute;
335867a6ac8SSimon Glass 	s32 cursor_column;
336867a6ac8SSimon Glass 	s32 cursor_row;
337867a6ac8SSimon Glass 	bool cursor_visible;
338867a6ac8SSimon Glass };
339867a6ac8SSimon Glass 
340867a6ac8SSimon Glass struct efi_simple_text_output_protocol {
341867a6ac8SSimon Glass 	void *reset;
342867a6ac8SSimon Glass 	efi_status_t (EFIAPI *output_string)(
343867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
344867a6ac8SSimon Glass 			const unsigned short *str);
3452bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *test_string)(
3462bb9b79dSAlexander Graf 			struct efi_simple_text_output_protocol *this,
3472bb9b79dSAlexander Graf 			const unsigned short *str);
348867a6ac8SSimon Glass 	efi_status_t(EFIAPI *query_mode)(
349867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
350867a6ac8SSimon Glass 			unsigned long mode_number, unsigned long *columns,
351867a6ac8SSimon Glass 			unsigned long *rows);
352867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_mode)(
353867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
354867a6ac8SSimon Glass 			unsigned long mode_number);
355867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_attribute)(
356867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
357867a6ac8SSimon Glass 			unsigned long attribute);
358867a6ac8SSimon Glass 	efi_status_t(EFIAPI *clear_screen) (
359867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this);
360867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_cursor_position) (
361867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
362867a6ac8SSimon Glass 			unsigned long column, unsigned long row);
3632bb9b79dSAlexander Graf 	efi_status_t(EFIAPI *enable_cursor)(
3642bb9b79dSAlexander Graf 			struct efi_simple_text_output_protocol *this,
3652bb9b79dSAlexander Graf 			bool enable);
366867a6ac8SSimon Glass 	struct simple_text_output_mode *mode;
367867a6ac8SSimon Glass };
368867a6ac8SSimon Glass 
369867a6ac8SSimon Glass struct efi_input_key {
370867a6ac8SSimon Glass 	u16 scan_code;
371867a6ac8SSimon Glass 	s16 unicode_char;
372867a6ac8SSimon Glass };
373867a6ac8SSimon Glass 
374867a6ac8SSimon Glass struct efi_simple_input_interface {
375867a6ac8SSimon Glass 	efi_status_t(EFIAPI *reset)(struct efi_simple_input_interface *this,
376867a6ac8SSimon Glass 			bool ExtendedVerification);
377867a6ac8SSimon Glass 	efi_status_t(EFIAPI *read_key_stroke)(
378867a6ac8SSimon Glass 			struct efi_simple_input_interface *this,
379867a6ac8SSimon Glass 			struct efi_input_key *key);
380*2fd945feSxypron.glpk@gmx.de 	struct efi_event *wait_for_key;
381867a6ac8SSimon Glass };
382867a6ac8SSimon Glass 
3832bb9b79dSAlexander Graf #define CONSOLE_CONTROL_GUID \
3842bb9b79dSAlexander Graf 	EFI_GUID(0xf42f7782, 0x12e, 0x4c12, \
3852bb9b79dSAlexander Graf 		 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21)
3862bb9b79dSAlexander Graf #define EFI_CONSOLE_MODE_TEXT	0
3872bb9b79dSAlexander Graf #define EFI_CONSOLE_MODE_GFX	1
3882bb9b79dSAlexander Graf 
3892bb9b79dSAlexander Graf struct efi_console_control_protocol
3902bb9b79dSAlexander Graf {
3912bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_mode)(
3922bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this, int *mode,
3932bb9b79dSAlexander Graf 			char *uga_exists, char *std_in_locked);
3942bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_mode)(
3952bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this, int mode);
3962bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *lock_std_in)(
3972bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this,
3982bb9b79dSAlexander Graf 			uint16_t *password);
3992bb9b79dSAlexander Graf };
4002bb9b79dSAlexander Graf 
401cc5b7081Sxypron.glpk@gmx.de #define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
402cc5b7081Sxypron.glpk@gmx.de 	EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
403cc5b7081Sxypron.glpk@gmx.de 		 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
404cc5b7081Sxypron.glpk@gmx.de 
405cc5b7081Sxypron.glpk@gmx.de struct efi_device_path_protocol
406cc5b7081Sxypron.glpk@gmx.de {
407cc5b7081Sxypron.glpk@gmx.de 	uint8_t type;
408cc5b7081Sxypron.glpk@gmx.de 	uint8_t sub_type;
409cc5b7081Sxypron.glpk@gmx.de 	uint16_t length;
410cc5b7081Sxypron.glpk@gmx.de 	uint8_t data[];
411cc5b7081Sxypron.glpk@gmx.de };
412cc5b7081Sxypron.glpk@gmx.de 
413cc5b7081Sxypron.glpk@gmx.de struct efi_device_path_to_text_protocol
414cc5b7081Sxypron.glpk@gmx.de {
415cc5b7081Sxypron.glpk@gmx.de 	uint16_t *(EFIAPI *convert_device_node_to_text)(
416cc5b7081Sxypron.glpk@gmx.de 			struct efi_device_path_protocol *device_node,
417cc5b7081Sxypron.glpk@gmx.de 			bool display_only,
418cc5b7081Sxypron.glpk@gmx.de 			bool allow_shortcuts);
419cc5b7081Sxypron.glpk@gmx.de 	uint16_t *(EFIAPI *convert_device_path_to_text)(
420cc5b7081Sxypron.glpk@gmx.de 			struct efi_device_path_protocol *device_path,
421cc5b7081Sxypron.glpk@gmx.de 			bool display_only,
422cc5b7081Sxypron.glpk@gmx.de 			bool allow_shortcuts);
423cc5b7081Sxypron.glpk@gmx.de };
424cc5b7081Sxypron.glpk@gmx.de 
425be8d3241SAlexander Graf #define EFI_GOP_GUID \
426be8d3241SAlexander Graf 	EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
427be8d3241SAlexander Graf 		 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
428be8d3241SAlexander Graf 
429be8d3241SAlexander Graf #define EFI_GOT_RGBA8		0
430be8d3241SAlexander Graf #define EFI_GOT_BGRA8		1
431be8d3241SAlexander Graf #define EFI_GOT_BITMASK		2
432be8d3241SAlexander Graf 
433be8d3241SAlexander Graf struct efi_gop_mode_info
434be8d3241SAlexander Graf {
435be8d3241SAlexander Graf 	u32 version;
436be8d3241SAlexander Graf 	u32 width;
437be8d3241SAlexander Graf 	u32 height;
438be8d3241SAlexander Graf 	u32 pixel_format;
439be8d3241SAlexander Graf 	u32 pixel_bitmask[4];
440be8d3241SAlexander Graf 	u32 pixels_per_scanline;
441be8d3241SAlexander Graf };
442be8d3241SAlexander Graf 
443be8d3241SAlexander Graf struct efi_gop_mode
444be8d3241SAlexander Graf {
445be8d3241SAlexander Graf 	u32 max_mode;
446be8d3241SAlexander Graf 	u32 mode;
447be8d3241SAlexander Graf 	struct efi_gop_mode_info *info;
448be8d3241SAlexander Graf 	unsigned long info_size;
449be8d3241SAlexander Graf 	efi_physical_addr_t fb_base;
450be8d3241SAlexander Graf 	unsigned long fb_size;
451be8d3241SAlexander Graf };
452be8d3241SAlexander Graf 
453be8d3241SAlexander Graf #define EFI_BLT_VIDEO_FILL		0
454be8d3241SAlexander Graf #define EFI_BLT_VIDEO_TO_BLT_BUFFER	1
455be8d3241SAlexander Graf #define EFI_BLT_BUFFER_TO_VIDEO		2
456be8d3241SAlexander Graf #define EFI_BLT_VIDEO_TO_VIDEO		3
457be8d3241SAlexander Graf 
458be8d3241SAlexander Graf struct efi_gop
459be8d3241SAlexander Graf {
460be8d3241SAlexander Graf 	efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
461be8d3241SAlexander Graf 					  unsigned long *size_of_info,
462be8d3241SAlexander Graf 					  struct efi_gop_mode_info **info);
463be8d3241SAlexander Graf 	efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
464be8d3241SAlexander Graf 	efi_status_t (EFIAPI *blt)(struct efi_gop *this, void *buffer,
465be8d3241SAlexander Graf 				   unsigned long operation, unsigned long sx,
466be8d3241SAlexander Graf 				   unsigned long sy, unsigned long dx,
467be8d3241SAlexander Graf 				   unsigned long dy, unsigned long width,
468be8d3241SAlexander Graf 				   unsigned long height, unsigned long delta);
469be8d3241SAlexander Graf 	struct efi_gop_mode *mode;
470be8d3241SAlexander Graf };
471be8d3241SAlexander Graf 
4720efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_GUID \
4730efe1bcfSAlexander Graf 	EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
4740efe1bcfSAlexander Graf 		 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
4750efe1bcfSAlexander Graf 
4760efe1bcfSAlexander Graf struct efi_mac_address {
4770efe1bcfSAlexander Graf 	char mac_addr[32];
4780efe1bcfSAlexander Graf };
4790efe1bcfSAlexander Graf 
4800efe1bcfSAlexander Graf struct efi_ip_address {
4810efe1bcfSAlexander Graf 	u8 ip_addr[16];
4820efe1bcfSAlexander Graf };
4830efe1bcfSAlexander Graf 
4840efe1bcfSAlexander Graf enum efi_simple_network_state {
4850efe1bcfSAlexander Graf 	EFI_NETWORK_STOPPED,
4860efe1bcfSAlexander Graf 	EFI_NETWORK_STARTED,
4870efe1bcfSAlexander Graf 	EFI_NETWORK_INITIALIZED,
4880efe1bcfSAlexander Graf };
4890efe1bcfSAlexander Graf 
4900efe1bcfSAlexander Graf struct efi_simple_network_mode {
4910efe1bcfSAlexander Graf 	enum efi_simple_network_state state;
4920efe1bcfSAlexander Graf 	u32 hwaddr_size;
4930efe1bcfSAlexander Graf 	u32 media_header_size;
4940efe1bcfSAlexander Graf 	u32 max_packet_size;
4950efe1bcfSAlexander Graf 	u32 nvram_size;
4960efe1bcfSAlexander Graf 	u32 nvram_access_size;
4970efe1bcfSAlexander Graf 	u32 receive_filter_mask;
4980efe1bcfSAlexander Graf 	u32 receive_filter_setting;
4990efe1bcfSAlexander Graf 	u32 max_mcast_filter_count;
5000efe1bcfSAlexander Graf 	u32 mcast_filter_count;
5010efe1bcfSAlexander Graf 	struct efi_mac_address mcast_filter[16];
5020efe1bcfSAlexander Graf 	struct efi_mac_address current_address;
5030efe1bcfSAlexander Graf 	struct efi_mac_address broadcast_address;
5040efe1bcfSAlexander Graf 	struct efi_mac_address permanent_address;
5050efe1bcfSAlexander Graf 	u8 if_type;
5060efe1bcfSAlexander Graf 	u8 mac_changeable;
5070efe1bcfSAlexander Graf 	u8 multitx_supported;
5080efe1bcfSAlexander Graf 	u8 media_present_supported;
5090efe1bcfSAlexander Graf 	u8 media_present;
5100efe1bcfSAlexander Graf };
5110efe1bcfSAlexander Graf 
5120efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01,
5130efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02,
5140efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04,
5150efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08,
5160efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10,
5170efe1bcfSAlexander Graf 
5180efe1bcfSAlexander Graf struct efi_simple_network
5190efe1bcfSAlexander Graf {
5200efe1bcfSAlexander Graf 	u64 revision;
5210efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *start)(struct efi_simple_network *this);
5220efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *stop)(struct efi_simple_network *this);
5230efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this,
5240efe1bcfSAlexander Graf 			ulong extra_rx, ulong extra_tx);
5250efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *reset)(struct efi_simple_network *this,
5260efe1bcfSAlexander Graf 			int extended_verification);
5270efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this);
5280efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this,
5290efe1bcfSAlexander Graf 			u32 enable, u32 disable, int reset_mcast_filter,
5300efe1bcfSAlexander Graf 			ulong mcast_filter_count,
5310efe1bcfSAlexander Graf 			struct efi_mac_address *mcast_filter);
5320efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this,
5330efe1bcfSAlexander Graf 			int reset, struct efi_mac_address *new_mac);
5340efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this,
5350efe1bcfSAlexander Graf 			int reset, ulong *stat_size, void *stat_table);
5360efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this,
5370efe1bcfSAlexander Graf 			int ipv6, struct efi_ip_address *ip,
5380efe1bcfSAlexander Graf 			struct efi_mac_address *mac);
5390efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this,
5400efe1bcfSAlexander Graf 			int read_write, ulong offset, ulong buffer_size,
5410efe1bcfSAlexander Graf 			char *buffer);
5420efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this,
5430efe1bcfSAlexander Graf 			u32 *int_status, void **txbuf);
5440efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this,
5450efe1bcfSAlexander Graf 			ulong header_size, ulong buffer_size, void *buffer,
5460efe1bcfSAlexander Graf 			struct efi_mac_address *src_addr,
5470efe1bcfSAlexander Graf 			struct efi_mac_address *dest_addr, u16 *protocol);
5480efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *receive)(struct efi_simple_network *this,
5490efe1bcfSAlexander Graf 			ulong *header_size, ulong *buffer_size, void *buffer,
5500efe1bcfSAlexander Graf 			struct efi_mac_address *src_addr,
5510efe1bcfSAlexander Graf 			struct efi_mac_address *dest_addr, u16 *protocol);
5520efe1bcfSAlexander Graf 	void (EFIAPI *waitforpacket)(void);
5530efe1bcfSAlexander Graf 	struct efi_simple_network_mode *mode;
5540efe1bcfSAlexander Graf };
5550efe1bcfSAlexander Graf 
5560efe1bcfSAlexander Graf #define EFI_PXE_GUID \
5570efe1bcfSAlexander Graf 	EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
5580efe1bcfSAlexander Graf 		 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5590efe1bcfSAlexander Graf 
5600efe1bcfSAlexander Graf struct efi_pxe_packet {
5610efe1bcfSAlexander Graf 	u8 packet[1472];
5620efe1bcfSAlexander Graf };
5630efe1bcfSAlexander Graf 
5640efe1bcfSAlexander Graf struct efi_pxe_mode
5650efe1bcfSAlexander Graf {
5660efe1bcfSAlexander Graf 	u8 unused[52];
5670efe1bcfSAlexander Graf 	struct efi_pxe_packet dhcp_discover;
5680efe1bcfSAlexander Graf 	struct efi_pxe_packet dhcp_ack;
5690efe1bcfSAlexander Graf 	struct efi_pxe_packet proxy_offer;
5700efe1bcfSAlexander Graf 	struct efi_pxe_packet pxe_discover;
5710efe1bcfSAlexander Graf 	struct efi_pxe_packet pxe_reply;
5720efe1bcfSAlexander Graf };
5730efe1bcfSAlexander Graf 
5740efe1bcfSAlexander Graf struct efi_pxe {
5750efe1bcfSAlexander Graf 	u64 rev;
5760efe1bcfSAlexander Graf 	void (EFIAPI *start)(void);
5770efe1bcfSAlexander Graf 	void (EFIAPI *stop)(void);
5780efe1bcfSAlexander Graf 	void (EFIAPI *dhcp)(void);
5790efe1bcfSAlexander Graf 	void (EFIAPI *discover)(void);
5800efe1bcfSAlexander Graf 	void (EFIAPI *mftp)(void);
5810efe1bcfSAlexander Graf 	void (EFIAPI *udpwrite)(void);
5820efe1bcfSAlexander Graf 	void (EFIAPI *udpread)(void);
5830efe1bcfSAlexander Graf 	void (EFIAPI *setipfilter)(void);
5840efe1bcfSAlexander Graf 	void (EFIAPI *arp)(void);
5850efe1bcfSAlexander Graf 	void (EFIAPI *setparams)(void);
5860efe1bcfSAlexander Graf 	void (EFIAPI *setstationip)(void);
5870efe1bcfSAlexander Graf 	void (EFIAPI *setpackets)(void);
5880efe1bcfSAlexander Graf 	struct efi_pxe_mode *mode;
5890efe1bcfSAlexander Graf };
5900efe1bcfSAlexander Graf 
591867a6ac8SSimon Glass #endif
592