xref: /rk3399_rockchip-uboot/include/efi_api.h (revision d7608aba38d760be4c40cb8f4591057e5e40c2d4)
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 
31867a6ac8SSimon Glass /* EFI Boot Services table */
32867a6ac8SSimon Glass struct efi_boot_services {
33867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
342bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *raise_tpl)(unsigned long new_tpl);
352bb9b79dSAlexander Graf 	void (EFIAPI *restore_tpl)(unsigned long old_tpl);
36867a6ac8SSimon Glass 
37867a6ac8SSimon Glass 	efi_status_t (EFIAPI *allocate_pages)(int, int, unsigned long,
38867a6ac8SSimon Glass 					      efi_physical_addr_t *);
39867a6ac8SSimon Glass 	efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, unsigned long);
40867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_memory_map)(unsigned long *memory_map_size,
41867a6ac8SSimon Glass 			struct efi_mem_desc *desc, unsigned long *key,
42867a6ac8SSimon Glass 			unsigned long *desc_size, u32 *desc_version);
43867a6ac8SSimon Glass 	efi_status_t (EFIAPI *allocate_pool)(int, unsigned long, void **);
44867a6ac8SSimon Glass 	efi_status_t (EFIAPI *free_pool)(void *);
45867a6ac8SSimon Glass 
462bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *create_event)(enum efi_event_type type,
472bb9b79dSAlexander Graf 			unsigned long notify_tpl,
482bb9b79dSAlexander Graf 			void (EFIAPI *notify_function) (void *event,
492bb9b79dSAlexander Graf 							void *context),
502bb9b79dSAlexander Graf 			void *notify_context, void **event);
512bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_timer)(void *event, int type,
522bb9b79dSAlexander Graf 			uint64_t trigger_time);
53867a6ac8SSimon Glass 	efi_status_t (EFIAPI *wait_for_event)(unsigned long number_of_events,
54867a6ac8SSimon Glass 			void *event, unsigned long *index);
552bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *signal_event)(void *event);
562bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *close_event)(void *event);
572bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *check_event)(void *event);
58867a6ac8SSimon Glass 
592bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_protocol_interface)(
602bb9b79dSAlexander Graf 			void **handle, efi_guid_t *protocol,
612bb9b79dSAlexander Graf 			int protocol_interface_type, void *protocol_interface);
622bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *reinstall_protocol_interface)(
632bb9b79dSAlexander Graf 			void *handle, efi_guid_t *protocol,
642bb9b79dSAlexander Graf 			void *old_interface, void *new_interface);
652bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *uninstall_protocol_interface)(void *handle,
662bb9b79dSAlexander Graf 			efi_guid_t *protocol, void *protocol_interface);
67867a6ac8SSimon Glass 	efi_status_t (EFIAPI *handle_protocol)(efi_handle_t, efi_guid_t *,
68867a6ac8SSimon Glass 					       void **);
69867a6ac8SSimon Glass 	void *reserved;
702bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *register_protocol_notify)(
712bb9b79dSAlexander Graf 			efi_guid_t *protocol, void *event,
722bb9b79dSAlexander Graf 			void **registration);
73867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_handle)(
74867a6ac8SSimon Glass 			enum efi_locate_search_type search_type,
75867a6ac8SSimon Glass 			efi_guid_t *protocol, void *search_key,
76867a6ac8SSimon Glass 			unsigned long *buffer_size, efi_handle_t *buffer);
77867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_device_path)(efi_guid_t *protocol,
78867a6ac8SSimon Glass 			struct efi_device_path **device_path,
79867a6ac8SSimon Glass 			efi_handle_t *device);
802bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_configuration_table)(
812bb9b79dSAlexander Graf 			efi_guid_t *guid, void *table);
82867a6ac8SSimon Glass 
83867a6ac8SSimon Glass 	efi_status_t (EFIAPI *load_image)(bool boot_policiy,
84867a6ac8SSimon Glass 			efi_handle_t parent_image,
85867a6ac8SSimon Glass 			struct efi_device_path *file_path, void *source_buffer,
86867a6ac8SSimon Glass 			unsigned long source_size, efi_handle_t *image);
87867a6ac8SSimon Glass 	efi_status_t (EFIAPI *start_image)(efi_handle_t handle,
88867a6ac8SSimon Glass 					   unsigned long *exitdata_size,
89867a6ac8SSimon Glass 					   s16 **exitdata);
90867a6ac8SSimon Glass 	efi_status_t (EFIAPI *exit)(efi_handle_t handle,
91867a6ac8SSimon Glass 				    efi_status_t exit_status,
92867a6ac8SSimon Glass 				    unsigned long exitdata_size, s16 *exitdata);
932bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *unload_image)(void *image_handle);
94867a6ac8SSimon Glass 	efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t, unsigned long);
95867a6ac8SSimon Glass 
96867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
97867a6ac8SSimon Glass 	efi_status_t (EFIAPI *stall)(unsigned long usecs);
982bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout,
992bb9b79dSAlexander Graf 			uint64_t watchdog_code, unsigned long data_size,
1002bb9b79dSAlexander Graf 			uint16_t *watchdog_data);
101867a6ac8SSimon Glass 	efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle,
102867a6ac8SSimon Glass 			efi_handle_t *driver_image_handle,
103867a6ac8SSimon Glass 			struct efi_device_path *remaining_device_path,
104867a6ac8SSimon Glass 			bool recursive);
1052bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *disconnect_controller)(void *controller_handle,
1062bb9b79dSAlexander Graf 			void *driver_image_handle, void *child_handle);
107867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
108867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
109867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
110867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
111867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
112867a6ac8SSimon Glass #define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
113867a6ac8SSimon Glass 	efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle,
114867a6ac8SSimon Glass 			efi_guid_t *protocol, void **interface,
115867a6ac8SSimon Glass 			efi_handle_t agent_handle,
116867a6ac8SSimon Glass 			efi_handle_t controller_handle, u32 attributes);
1172bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *close_protocol)(void *handle,
1182bb9b79dSAlexander Graf 			efi_guid_t *protocol, void *agent_handle,
1192bb9b79dSAlexander Graf 			void *controller_handle);
120867a6ac8SSimon Glass 	efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
121867a6ac8SSimon Glass 			efi_guid_t *protocol,
122867a6ac8SSimon Glass 			struct efi_open_protocol_info_entry **entry_buffer,
123867a6ac8SSimon Glass 			unsigned long *entry_count);
124867a6ac8SSimon Glass 	efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
125867a6ac8SSimon Glass 			efi_guid_t ***protocol_buffer,
126867a6ac8SSimon Glass 			unsigned long *protocols_buffer_count);
127867a6ac8SSimon Glass 	efi_status_t (EFIAPI *locate_handle_buffer) (
128867a6ac8SSimon Glass 			enum efi_locate_search_type search_type,
129867a6ac8SSimon Glass 			efi_guid_t *protocol, void *search_key,
130867a6ac8SSimon Glass 			unsigned long *no_handles, efi_handle_t **buffer);
1312bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *locate_protocol)(efi_guid_t *protocol,
1322bb9b79dSAlexander Graf 			void *registration, void **protocol_interface);
1332bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
1342bb9b79dSAlexander Graf 			void **handle, ...);
1352bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
1362bb9b79dSAlexander Graf 			void *handle, ...);
1372bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *calculate_crc32)(void *data,
1382bb9b79dSAlexander Graf 			unsigned long data_size, uint32_t *crc32);
1392bb9b79dSAlexander Graf 	void (EFIAPI *copy_mem)(void *destination, void *source,
1402bb9b79dSAlexander Graf 			unsigned long length);
1412bb9b79dSAlexander Graf 	void (EFIAPI *set_mem)(void *buffer, unsigned long size,
1422bb9b79dSAlexander Graf 			uint8_t value);
143867a6ac8SSimon Glass 	void *create_event_ex;
144867a6ac8SSimon Glass };
145867a6ac8SSimon Glass 
146867a6ac8SSimon Glass /* Types and defines for EFI ResetSystem */
147867a6ac8SSimon Glass enum efi_reset_type {
148867a6ac8SSimon Glass 	EFI_RESET_COLD = 0,
149867a6ac8SSimon Glass 	EFI_RESET_WARM = 1,
150867a6ac8SSimon Glass 	EFI_RESET_SHUTDOWN = 2
151867a6ac8SSimon Glass };
152867a6ac8SSimon Glass 
153867a6ac8SSimon Glass /* EFI Runtime Services table */
154867a6ac8SSimon Glass #define EFI_RUNTIME_SERVICES_SIGNATURE	0x5652453544e5552ULL
155867a6ac8SSimon Glass #define EFI_RUNTIME_SERVICES_REVISION	0x00010000
156867a6ac8SSimon Glass 
157867a6ac8SSimon Glass struct efi_runtime_services {
158867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
1592bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_time)(struct efi_time *time,
1602bb9b79dSAlexander Graf 			struct efi_time_cap *capabilities);
1612bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_time)(struct efi_time *time);
1622bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending,
1632bb9b79dSAlexander Graf 			struct efi_time *time);
1642bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_wakeup_time)(char enabled,
1652bb9b79dSAlexander Graf 			struct efi_time *time);
1662bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_virtual_address_map)(
1672bb9b79dSAlexander Graf 			unsigned long memory_map_size,
1682bb9b79dSAlexander Graf 			unsigned long descriptor_size,
1692bb9b79dSAlexander Graf 			uint32_t descriptor_version,
1702bb9b79dSAlexander Graf 			struct efi_mem_desc *virtmap);
1712bb9b79dSAlexander Graf 	efi_status_t (*convert_pointer)(unsigned long dbg, void **address);
172867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_variable)(s16 *variable_name,
173867a6ac8SSimon Glass 			efi_guid_t *vendor, u32 *attributes,
174867a6ac8SSimon Glass 			unsigned long *data_size, void *data);
175867a6ac8SSimon Glass 	efi_status_t (EFIAPI *get_next_variable)(
176867a6ac8SSimon Glass 			unsigned long *variable_name_size,
177867a6ac8SSimon Glass 			s16 *variable_name, efi_guid_t *vendor);
178867a6ac8SSimon Glass 	efi_status_t (EFIAPI *set_variable)(s16 *variable_name,
179867a6ac8SSimon Glass 			efi_guid_t *vendor, u32 attributes,
180867a6ac8SSimon Glass 			unsigned long data_size, void *data);
1812bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_next_high_mono_count)(
1822bb9b79dSAlexander Graf 			uint32_t *high_count);
183867a6ac8SSimon Glass 	void (EFIAPI *reset_system)(enum efi_reset_type reset_type,
184867a6ac8SSimon Glass 				    efi_status_t reset_status,
185867a6ac8SSimon Glass 				    unsigned long data_size, void *reset_data);
186867a6ac8SSimon Glass 	void *update_capsule;
187867a6ac8SSimon Glass 	void *query_capsule_caps;
188867a6ac8SSimon Glass 	void *query_variable_info;
189867a6ac8SSimon Glass };
190867a6ac8SSimon Glass 
191867a6ac8SSimon Glass /* EFI Configuration Table and GUID definitions */
192867a6ac8SSimon Glass #define NULL_GUID \
193867a6ac8SSimon Glass 	EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
194867a6ac8SSimon Glass 		 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
195867a6ac8SSimon Glass 
196867a6ac8SSimon Glass #define LOADED_IMAGE_PROTOCOL_GUID \
197867a6ac8SSimon Glass 	EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, \
198867a6ac8SSimon Glass 		 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
199867a6ac8SSimon Glass 
2002bb9b79dSAlexander Graf #define EFI_FDT_GUID \
2012bb9b79dSAlexander Graf 	EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
2022bb9b79dSAlexander Graf 		 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
2032bb9b79dSAlexander Graf 
204e663b350SAlexander Graf #define SMBIOS_TABLE_GUID \
205e663b350SAlexander Graf 	EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
206e663b350SAlexander Graf 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
207e663b350SAlexander Graf 
2082bb9b79dSAlexander Graf struct efi_configuration_table
2092bb9b79dSAlexander Graf {
2102bb9b79dSAlexander Graf 	efi_guid_t guid;
2112bb9b79dSAlexander Graf 	void *table;
2122bb9b79dSAlexander Graf };
2132bb9b79dSAlexander Graf 
2142bb9b79dSAlexander Graf #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
2152bb9b79dSAlexander Graf 
216867a6ac8SSimon Glass struct efi_system_table {
217867a6ac8SSimon Glass 	struct efi_table_hdr hdr;
218867a6ac8SSimon Glass 	unsigned long fw_vendor;   /* physical addr of wchar_t vendor string */
219867a6ac8SSimon Glass 	u32 fw_revision;
220867a6ac8SSimon Glass 	unsigned long con_in_handle;
221867a6ac8SSimon Glass 	struct efi_simple_input_interface *con_in;
222867a6ac8SSimon Glass 	unsigned long con_out_handle;
223867a6ac8SSimon Glass 	struct efi_simple_text_output_protocol *con_out;
224867a6ac8SSimon Glass 	unsigned long stderr_handle;
2252bb9b79dSAlexander Graf 	struct efi_simple_text_output_protocol *std_err;
226867a6ac8SSimon Glass 	struct efi_runtime_services *runtime;
227867a6ac8SSimon Glass 	struct efi_boot_services *boottime;
228867a6ac8SSimon Glass 	unsigned long nr_tables;
2292bb9b79dSAlexander Graf 	struct efi_configuration_table *tables;
230867a6ac8SSimon Glass };
231867a6ac8SSimon Glass 
2322bb9b79dSAlexander Graf #define LOADED_IMAGE_GUID \
2332bb9b79dSAlexander Graf 	EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
2342bb9b79dSAlexander Graf 		 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
2352bb9b79dSAlexander Graf 
236867a6ac8SSimon Glass struct efi_loaded_image {
237867a6ac8SSimon Glass 	u32 revision;
238867a6ac8SSimon Glass 	void *parent_handle;
239867a6ac8SSimon Glass 	struct efi_system_table *system_table;
240867a6ac8SSimon Glass 	void *device_handle;
241867a6ac8SSimon Glass 	void *file_path;
242867a6ac8SSimon Glass 	void *reserved;
243867a6ac8SSimon Glass 	u32 load_options_size;
244867a6ac8SSimon Glass 	void *load_options;
245867a6ac8SSimon Glass 	void *image_base;
246867a6ac8SSimon Glass 	aligned_u64 image_size;
247867a6ac8SSimon Glass 	unsigned int image_code_type;
248867a6ac8SSimon Glass 	unsigned int image_data_type;
249867a6ac8SSimon Glass 	unsigned long unload;
250a86aeaf2SAlexander Graf 
251a86aeaf2SAlexander Graf 	/* Below are efi loader private fields */
252a86aeaf2SAlexander Graf #ifdef CONFIG_EFI_LOADER
253a86aeaf2SAlexander Graf 	efi_status_t exit_status;
254a86aeaf2SAlexander Graf 	struct jmp_buf_data exit_jmp;
255a86aeaf2SAlexander Graf #endif
256867a6ac8SSimon Glass };
257867a6ac8SSimon Glass 
2582bb9b79dSAlexander Graf #define DEVICE_PATH_GUID \
2592bb9b79dSAlexander Graf 	EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
2602bb9b79dSAlexander Graf 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
2612bb9b79dSAlexander Graf 
2622bb9b79dSAlexander Graf #define DEVICE_PATH_TYPE_END			0x7f
2632bb9b79dSAlexander Graf #  define DEVICE_PATH_SUB_TYPE_END		0xff
2642bb9b79dSAlexander Graf 
265867a6ac8SSimon Glass struct efi_device_path {
266867a6ac8SSimon Glass 	u8 type;
267867a6ac8SSimon Glass 	u8 sub_type;
268867a6ac8SSimon Glass 	u16 length;
269867a6ac8SSimon Glass };
270867a6ac8SSimon Glass 
271*d7608abaSOleksandr Tymoshenko struct efi_mac_addr {
272*d7608abaSOleksandr Tymoshenko 	u8 addr[32];
273*d7608abaSOleksandr Tymoshenko };
274*d7608abaSOleksandr Tymoshenko 
275*d7608abaSOleksandr Tymoshenko #define DEVICE_PATH_TYPE_MESSAGING_DEVICE	0x03
276*d7608abaSOleksandr Tymoshenko #  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR	0x0b
277*d7608abaSOleksandr Tymoshenko 
278*d7608abaSOleksandr Tymoshenko struct efi_device_path_mac_addr {
279*d7608abaSOleksandr Tymoshenko 	struct efi_device_path dp;
280*d7608abaSOleksandr Tymoshenko 	struct efi_mac_addr mac;
281*d7608abaSOleksandr Tymoshenko 	u8 if_type;
282*d7608abaSOleksandr Tymoshenko };
283*d7608abaSOleksandr Tymoshenko 
2842bb9b79dSAlexander Graf #define DEVICE_PATH_TYPE_MEDIA_DEVICE		0x04
2852bb9b79dSAlexander Graf #  define DEVICE_PATH_SUB_TYPE_FILE_PATH	0x04
2862bb9b79dSAlexander Graf 
2872bb9b79dSAlexander Graf struct efi_device_path_file_path {
2882bb9b79dSAlexander Graf 	struct efi_device_path dp;
289ecbe1a07SAlexander Graf 	u16 str[32];
2902bb9b79dSAlexander Graf };
2912bb9b79dSAlexander Graf 
2922bb9b79dSAlexander Graf #define BLOCK_IO_GUID \
2932bb9b79dSAlexander Graf 	EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
2942bb9b79dSAlexander Graf 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
2952bb9b79dSAlexander Graf 
2962bb9b79dSAlexander Graf struct efi_block_io_media
2972bb9b79dSAlexander Graf {
2982bb9b79dSAlexander Graf 	u32 media_id;
2992bb9b79dSAlexander Graf 	char removable_media;
3002bb9b79dSAlexander Graf 	char media_present;
3012bb9b79dSAlexander Graf 	char logical_partition;
3022bb9b79dSAlexander Graf 	char read_only;
3032bb9b79dSAlexander Graf 	char write_caching;
3042bb9b79dSAlexander Graf 	u8 pad[3];
3052bb9b79dSAlexander Graf 	u32 block_size;
3062bb9b79dSAlexander Graf 	u32 io_align;
3072bb9b79dSAlexander Graf 	u8 pad2[4];
3082bb9b79dSAlexander Graf 	u64 last_block;
3092bb9b79dSAlexander Graf };
3102bb9b79dSAlexander Graf 
3112bb9b79dSAlexander Graf struct efi_block_io {
3122bb9b79dSAlexander Graf 	u64 revision;
3132bb9b79dSAlexander Graf 	struct efi_block_io_media *media;
3142bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
3152bb9b79dSAlexander Graf 			char extended_verification);
3162bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
3172bb9b79dSAlexander Graf 			u32 media_id, u64 lba, unsigned long buffer_size,
3182bb9b79dSAlexander Graf 			void *buffer);
3192bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
3202bb9b79dSAlexander Graf 			u32 media_id, u64 lba, unsigned long buffer_size,
3212bb9b79dSAlexander Graf 			void *buffer);
3222bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
3232bb9b79dSAlexander Graf };
3242bb9b79dSAlexander Graf 
325867a6ac8SSimon Glass struct simple_text_output_mode {
326867a6ac8SSimon Glass 	s32 max_mode;
327867a6ac8SSimon Glass 	s32 mode;
328867a6ac8SSimon Glass 	s32 attribute;
329867a6ac8SSimon Glass 	s32 cursor_column;
330867a6ac8SSimon Glass 	s32 cursor_row;
331867a6ac8SSimon Glass 	bool cursor_visible;
332867a6ac8SSimon Glass };
333867a6ac8SSimon Glass 
334867a6ac8SSimon Glass struct efi_simple_text_output_protocol {
335867a6ac8SSimon Glass 	void *reset;
336867a6ac8SSimon Glass 	efi_status_t (EFIAPI *output_string)(
337867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
338867a6ac8SSimon Glass 			const unsigned short *str);
3392bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *test_string)(
3402bb9b79dSAlexander Graf 			struct efi_simple_text_output_protocol *this,
3412bb9b79dSAlexander Graf 			const unsigned short *str);
342867a6ac8SSimon Glass 	efi_status_t(EFIAPI *query_mode)(
343867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
344867a6ac8SSimon Glass 			unsigned long mode_number, unsigned long *columns,
345867a6ac8SSimon Glass 			unsigned long *rows);
346867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_mode)(
347867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
348867a6ac8SSimon Glass 			unsigned long mode_number);
349867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_attribute)(
350867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
351867a6ac8SSimon Glass 			unsigned long attribute);
352867a6ac8SSimon Glass 	efi_status_t(EFIAPI *clear_screen) (
353867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this);
354867a6ac8SSimon Glass 	efi_status_t(EFIAPI *set_cursor_position) (
355867a6ac8SSimon Glass 			struct efi_simple_text_output_protocol *this,
356867a6ac8SSimon Glass 			unsigned long column, unsigned long row);
3572bb9b79dSAlexander Graf 	efi_status_t(EFIAPI *enable_cursor)(
3582bb9b79dSAlexander Graf 			struct efi_simple_text_output_protocol *this,
3592bb9b79dSAlexander Graf 			bool enable);
360867a6ac8SSimon Glass 	struct simple_text_output_mode *mode;
361867a6ac8SSimon Glass };
362867a6ac8SSimon Glass 
363867a6ac8SSimon Glass struct efi_input_key {
364867a6ac8SSimon Glass 	u16 scan_code;
365867a6ac8SSimon Glass 	s16 unicode_char;
366867a6ac8SSimon Glass };
367867a6ac8SSimon Glass 
368867a6ac8SSimon Glass struct efi_simple_input_interface {
369867a6ac8SSimon Glass 	efi_status_t(EFIAPI *reset)(struct efi_simple_input_interface *this,
370867a6ac8SSimon Glass 			bool ExtendedVerification);
371867a6ac8SSimon Glass 	efi_status_t(EFIAPI *read_key_stroke)(
372867a6ac8SSimon Glass 			struct efi_simple_input_interface *this,
373867a6ac8SSimon Glass 			struct efi_input_key *key);
374867a6ac8SSimon Glass 	void *wait_for_key;
375867a6ac8SSimon Glass };
376867a6ac8SSimon Glass 
3772bb9b79dSAlexander Graf #define CONSOLE_CONTROL_GUID \
3782bb9b79dSAlexander Graf 	EFI_GUID(0xf42f7782, 0x12e, 0x4c12, \
3792bb9b79dSAlexander Graf 		 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21)
3802bb9b79dSAlexander Graf #define EFI_CONSOLE_MODE_TEXT	0
3812bb9b79dSAlexander Graf #define EFI_CONSOLE_MODE_GFX	1
3822bb9b79dSAlexander Graf 
3832bb9b79dSAlexander Graf struct efi_console_control_protocol
3842bb9b79dSAlexander Graf {
3852bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *get_mode)(
3862bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this, int *mode,
3872bb9b79dSAlexander Graf 			char *uga_exists, char *std_in_locked);
3882bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *set_mode)(
3892bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this, int mode);
3902bb9b79dSAlexander Graf 	efi_status_t (EFIAPI *lock_std_in)(
3912bb9b79dSAlexander Graf 			struct efi_console_control_protocol *this,
3922bb9b79dSAlexander Graf 			uint16_t *password);
3932bb9b79dSAlexander Graf };
3942bb9b79dSAlexander Graf 
395be8d3241SAlexander Graf #define EFI_GOP_GUID \
396be8d3241SAlexander Graf 	EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
397be8d3241SAlexander Graf 		 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
398be8d3241SAlexander Graf 
399be8d3241SAlexander Graf #define EFI_GOT_RGBA8		0
400be8d3241SAlexander Graf #define EFI_GOT_BGRA8		1
401be8d3241SAlexander Graf #define EFI_GOT_BITMASK		2
402be8d3241SAlexander Graf 
403be8d3241SAlexander Graf struct efi_gop_mode_info
404be8d3241SAlexander Graf {
405be8d3241SAlexander Graf 	u32 version;
406be8d3241SAlexander Graf 	u32 width;
407be8d3241SAlexander Graf 	u32 height;
408be8d3241SAlexander Graf 	u32 pixel_format;
409be8d3241SAlexander Graf 	u32 pixel_bitmask[4];
410be8d3241SAlexander Graf 	u32 pixels_per_scanline;
411be8d3241SAlexander Graf };
412be8d3241SAlexander Graf 
413be8d3241SAlexander Graf struct efi_gop_mode
414be8d3241SAlexander Graf {
415be8d3241SAlexander Graf 	u32 max_mode;
416be8d3241SAlexander Graf 	u32 mode;
417be8d3241SAlexander Graf 	struct efi_gop_mode_info *info;
418be8d3241SAlexander Graf 	unsigned long info_size;
419be8d3241SAlexander Graf 	efi_physical_addr_t fb_base;
420be8d3241SAlexander Graf 	unsigned long fb_size;
421be8d3241SAlexander Graf };
422be8d3241SAlexander Graf 
423be8d3241SAlexander Graf #define EFI_BLT_VIDEO_FILL		0
424be8d3241SAlexander Graf #define EFI_BLT_VIDEO_TO_BLT_BUFFER	1
425be8d3241SAlexander Graf #define EFI_BLT_BUFFER_TO_VIDEO		2
426be8d3241SAlexander Graf #define EFI_BLT_VIDEO_TO_VIDEO		3
427be8d3241SAlexander Graf 
428be8d3241SAlexander Graf struct efi_gop
429be8d3241SAlexander Graf {
430be8d3241SAlexander Graf 	efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
431be8d3241SAlexander Graf 					  unsigned long *size_of_info,
432be8d3241SAlexander Graf 					  struct efi_gop_mode_info **info);
433be8d3241SAlexander Graf 	efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
434be8d3241SAlexander Graf 	efi_status_t (EFIAPI *blt)(struct efi_gop *this, void *buffer,
435be8d3241SAlexander Graf 				   unsigned long operation, unsigned long sx,
436be8d3241SAlexander Graf 				   unsigned long sy, unsigned long dx,
437be8d3241SAlexander Graf 				   unsigned long dy, unsigned long width,
438be8d3241SAlexander Graf 				   unsigned long height, unsigned long delta);
439be8d3241SAlexander Graf 	struct efi_gop_mode *mode;
440be8d3241SAlexander Graf };
441be8d3241SAlexander Graf 
4420efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_GUID \
4430efe1bcfSAlexander Graf 	EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
4440efe1bcfSAlexander Graf 		 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
4450efe1bcfSAlexander Graf 
4460efe1bcfSAlexander Graf struct efi_mac_address {
4470efe1bcfSAlexander Graf 	char mac_addr[32];
4480efe1bcfSAlexander Graf };
4490efe1bcfSAlexander Graf 
4500efe1bcfSAlexander Graf struct efi_ip_address {
4510efe1bcfSAlexander Graf 	u8 ip_addr[16];
4520efe1bcfSAlexander Graf };
4530efe1bcfSAlexander Graf 
4540efe1bcfSAlexander Graf enum efi_simple_network_state {
4550efe1bcfSAlexander Graf 	EFI_NETWORK_STOPPED,
4560efe1bcfSAlexander Graf 	EFI_NETWORK_STARTED,
4570efe1bcfSAlexander Graf 	EFI_NETWORK_INITIALIZED,
4580efe1bcfSAlexander Graf };
4590efe1bcfSAlexander Graf 
4600efe1bcfSAlexander Graf struct efi_simple_network_mode {
4610efe1bcfSAlexander Graf 	enum efi_simple_network_state state;
4620efe1bcfSAlexander Graf 	u32 hwaddr_size;
4630efe1bcfSAlexander Graf 	u32 media_header_size;
4640efe1bcfSAlexander Graf 	u32 max_packet_size;
4650efe1bcfSAlexander Graf 	u32 nvram_size;
4660efe1bcfSAlexander Graf 	u32 nvram_access_size;
4670efe1bcfSAlexander Graf 	u32 receive_filter_mask;
4680efe1bcfSAlexander Graf 	u32 receive_filter_setting;
4690efe1bcfSAlexander Graf 	u32 max_mcast_filter_count;
4700efe1bcfSAlexander Graf 	u32 mcast_filter_count;
4710efe1bcfSAlexander Graf 	struct efi_mac_address mcast_filter[16];
4720efe1bcfSAlexander Graf 	struct efi_mac_address current_address;
4730efe1bcfSAlexander Graf 	struct efi_mac_address broadcast_address;
4740efe1bcfSAlexander Graf 	struct efi_mac_address permanent_address;
4750efe1bcfSAlexander Graf 	u8 if_type;
4760efe1bcfSAlexander Graf 	u8 mac_changeable;
4770efe1bcfSAlexander Graf 	u8 multitx_supported;
4780efe1bcfSAlexander Graf 	u8 media_present_supported;
4790efe1bcfSAlexander Graf 	u8 media_present;
4800efe1bcfSAlexander Graf };
4810efe1bcfSAlexander Graf 
4820efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01,
4830efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02,
4840efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04,
4850efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08,
4860efe1bcfSAlexander Graf #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10,
4870efe1bcfSAlexander Graf 
4880efe1bcfSAlexander Graf struct efi_simple_network
4890efe1bcfSAlexander Graf {
4900efe1bcfSAlexander Graf 	u64 revision;
4910efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *start)(struct efi_simple_network *this);
4920efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *stop)(struct efi_simple_network *this);
4930efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this,
4940efe1bcfSAlexander Graf 			ulong extra_rx, ulong extra_tx);
4950efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *reset)(struct efi_simple_network *this,
4960efe1bcfSAlexander Graf 			int extended_verification);
4970efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this);
4980efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this,
4990efe1bcfSAlexander Graf 			u32 enable, u32 disable, int reset_mcast_filter,
5000efe1bcfSAlexander Graf 			ulong mcast_filter_count,
5010efe1bcfSAlexander Graf 			struct efi_mac_address *mcast_filter);
5020efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this,
5030efe1bcfSAlexander Graf 			int reset, struct efi_mac_address *new_mac);
5040efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this,
5050efe1bcfSAlexander Graf 			int reset, ulong *stat_size, void *stat_table);
5060efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this,
5070efe1bcfSAlexander Graf 			int ipv6, struct efi_ip_address *ip,
5080efe1bcfSAlexander Graf 			struct efi_mac_address *mac);
5090efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this,
5100efe1bcfSAlexander Graf 			int read_write, ulong offset, ulong buffer_size,
5110efe1bcfSAlexander Graf 			char *buffer);
5120efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this,
5130efe1bcfSAlexander Graf 			u32 *int_status, void **txbuf);
5140efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this,
5150efe1bcfSAlexander Graf 			ulong header_size, ulong buffer_size, void *buffer,
5160efe1bcfSAlexander Graf 			struct efi_mac_address *src_addr,
5170efe1bcfSAlexander Graf 			struct efi_mac_address *dest_addr, u16 *protocol);
5180efe1bcfSAlexander Graf 	efi_status_t (EFIAPI *receive)(struct efi_simple_network *this,
5190efe1bcfSAlexander Graf 			ulong *header_size, ulong *buffer_size, void *buffer,
5200efe1bcfSAlexander Graf 			struct efi_mac_address *src_addr,
5210efe1bcfSAlexander Graf 			struct efi_mac_address *dest_addr, u16 *protocol);
5220efe1bcfSAlexander Graf 	void (EFIAPI *waitforpacket)(void);
5230efe1bcfSAlexander Graf 	struct efi_simple_network_mode *mode;
5240efe1bcfSAlexander Graf };
5250efe1bcfSAlexander Graf 
5260efe1bcfSAlexander Graf #define EFI_PXE_GUID \
5270efe1bcfSAlexander Graf 	EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
5280efe1bcfSAlexander Graf 		 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5290efe1bcfSAlexander Graf 
5300efe1bcfSAlexander Graf struct efi_pxe_packet {
5310efe1bcfSAlexander Graf 	u8 packet[1472];
5320efe1bcfSAlexander Graf };
5330efe1bcfSAlexander Graf 
5340efe1bcfSAlexander Graf struct efi_pxe_mode
5350efe1bcfSAlexander Graf {
5360efe1bcfSAlexander Graf 	u8 unused[52];
5370efe1bcfSAlexander Graf 	struct efi_pxe_packet dhcp_discover;
5380efe1bcfSAlexander Graf 	struct efi_pxe_packet dhcp_ack;
5390efe1bcfSAlexander Graf 	struct efi_pxe_packet proxy_offer;
5400efe1bcfSAlexander Graf 	struct efi_pxe_packet pxe_discover;
5410efe1bcfSAlexander Graf 	struct efi_pxe_packet pxe_reply;
5420efe1bcfSAlexander Graf };
5430efe1bcfSAlexander Graf 
5440efe1bcfSAlexander Graf struct efi_pxe {
5450efe1bcfSAlexander Graf 	u64 rev;
5460efe1bcfSAlexander Graf 	void (EFIAPI *start)(void);
5470efe1bcfSAlexander Graf 	void (EFIAPI *stop)(void);
5480efe1bcfSAlexander Graf 	void (EFIAPI *dhcp)(void);
5490efe1bcfSAlexander Graf 	void (EFIAPI *discover)(void);
5500efe1bcfSAlexander Graf 	void (EFIAPI *mftp)(void);
5510efe1bcfSAlexander Graf 	void (EFIAPI *udpwrite)(void);
5520efe1bcfSAlexander Graf 	void (EFIAPI *udpread)(void);
5530efe1bcfSAlexander Graf 	void (EFIAPI *setipfilter)(void);
5540efe1bcfSAlexander Graf 	void (EFIAPI *arp)(void);
5550efe1bcfSAlexander Graf 	void (EFIAPI *setparams)(void);
5560efe1bcfSAlexander Graf 	void (EFIAPI *setstationip)(void);
5570efe1bcfSAlexander Graf 	void (EFIAPI *setpackets)(void);
5580efe1bcfSAlexander Graf 	struct efi_pxe_mode *mode;
5590efe1bcfSAlexander Graf };
5600efe1bcfSAlexander Graf 
561867a6ac8SSimon Glass #endif
562