xref: /kvm-unit-tests/lib/linux/efi.h (revision 611fe6dee79c5e9df560562163c085dbd4dfd387)
1c3770197SVarad Gautam /* SPDX-License-Identifier: GPL-2.0 */
2c3770197SVarad Gautam /* Relevant definitions from linux/efi.h. */
3c3770197SVarad Gautam 
4c3770197SVarad Gautam #ifndef __LINUX_UEFI_H
5c3770197SVarad Gautam #define __LINUX_UEFI_H
6c3770197SVarad Gautam 
7ad5fb883SZixuan Wang #include "libcflat.h"
8ad5fb883SZixuan Wang 
9ad5fb883SZixuan Wang #ifndef __packed
10ad5fb883SZixuan Wang # define __packed		__attribute__((__packed__))
11ad5fb883SZixuan Wang #endif
12ad5fb883SZixuan Wang 
13c3770197SVarad Gautam #define BITS_PER_LONG 64
14c3770197SVarad Gautam 
15529ab889SNikos Nikoleris #define EFI_ERROR(a)		(((int64_t) a) < 0)
16c3770197SVarad Gautam #define EFI_SUCCESS		0
17c3770197SVarad Gautam #define EFI_LOAD_ERROR		( 1 | (1UL << (BITS_PER_LONG-1)))
18c3770197SVarad Gautam #define EFI_INVALID_PARAMETER	( 2 | (1UL << (BITS_PER_LONG-1)))
19c3770197SVarad Gautam #define EFI_UNSUPPORTED		( 3 | (1UL << (BITS_PER_LONG-1)))
20c3770197SVarad Gautam #define EFI_BAD_BUFFER_SIZE	( 4 | (1UL << (BITS_PER_LONG-1)))
21c3770197SVarad Gautam #define EFI_BUFFER_TOO_SMALL	( 5 | (1UL << (BITS_PER_LONG-1)))
22c3770197SVarad Gautam #define EFI_NOT_READY		( 6 | (1UL << (BITS_PER_LONG-1)))
23c3770197SVarad Gautam #define EFI_DEVICE_ERROR	( 7 | (1UL << (BITS_PER_LONG-1)))
24c3770197SVarad Gautam #define EFI_WRITE_PROTECTED	( 8 | (1UL << (BITS_PER_LONG-1)))
25c3770197SVarad Gautam #define EFI_OUT_OF_RESOURCES	( 9 | (1UL << (BITS_PER_LONG-1)))
26c3770197SVarad Gautam #define EFI_NOT_FOUND		(14 | (1UL << (BITS_PER_LONG-1)))
27c3770197SVarad Gautam #define EFI_TIMEOUT		(18 | (1UL << (BITS_PER_LONG-1)))
28c3770197SVarad Gautam #define EFI_ABORTED		(21 | (1UL << (BITS_PER_LONG-1)))
29c3770197SVarad Gautam #define EFI_SECURITY_VIOLATION	(26 | (1UL << (BITS_PER_LONG-1)))
30c3770197SVarad Gautam 
31c3770197SVarad Gautam typedef unsigned long efi_status_t;
32c3770197SVarad Gautam typedef u8 efi_bool_t;
33c3770197SVarad Gautam typedef u16 efi_char16_t;		/* UNICODE character */
34c3770197SVarad Gautam typedef u64 efi_physical_addr_t;
35c3770197SVarad Gautam typedef void *efi_handle_t;
36c3770197SVarad Gautam 
37f49151beSNikos Nikoleris #ifdef __x86_64__
38c3770197SVarad Gautam #define __efiapi __attribute__((ms_abi))
39f49151beSNikos Nikoleris #else
40f49151beSNikos Nikoleris #define __efiapi
41f49151beSNikos Nikoleris #endif
42c3770197SVarad Gautam 
43c3770197SVarad Gautam /*
44c3770197SVarad Gautam  * The UEFI spec and EDK2 reference implementation both define EFI_GUID as
45c3770197SVarad Gautam  * struct { u32 a; u16; b; u16 c; u8 d[8]; }; and so the implied alignment
46c3770197SVarad Gautam  * is 32 bits not 8 bits like our guid_t. In some cases (i.e., on 32-bit ARM),
47c3770197SVarad Gautam  * this means that firmware services invoked by the kernel may assume that
48c3770197SVarad Gautam  * efi_guid_t* arguments are 32-bit aligned, and use memory accessors that
49c3770197SVarad Gautam  * do not tolerate misalignment. So let's set the minimum alignment to 32 bits.
50c3770197SVarad Gautam  *
51c3770197SVarad Gautam  * Note that the UEFI spec as well as some comments in the EDK2 code base
52c3770197SVarad Gautam  * suggest that EFI_GUID should be 64-bit aligned, but this appears to be
53c3770197SVarad Gautam  * a mistake, given that no code seems to exist that actually enforces that
54c3770197SVarad Gautam  * or relies on it.
55c3770197SVarad Gautam  */
56c3770197SVarad Gautam typedef struct {
57c3770197SVarad Gautam 	u8 b[16];
58c3770197SVarad Gautam } guid_t __attribute__((aligned(__alignof__(u32))));
59c3770197SVarad Gautam typedef guid_t efi_guid_t;
60c3770197SVarad Gautam 
61c3770197SVarad Gautam #define EFI_GUID(a, b, c, d...) (efi_guid_t){ {					\
62c3770197SVarad Gautam 	(a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff,	\
63c3770197SVarad Gautam 	(b) & 0xff, ((b) >> 8) & 0xff,						\
64c3770197SVarad Gautam 	(c) & 0xff, ((c) >> 8) & 0xff, d } }
65c3770197SVarad Gautam 
66f20589d6SZixuan Wang #define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
6723e17626SNikos Nikoleris #define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3,  0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
68f20589d6SZixuan Wang 
699632ce44SAndrew Jones #define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
709632ce44SAndrew Jones 
7185c3c524SNikos Nikoleris #define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
7285c3c524SNikos Nikoleris 
73*b9f8ff7cSAndrew Jones #define EFI_LOAD_FILE2_PROTOCOL_GUID EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
74*b9f8ff7cSAndrew Jones #define LINUX_EFI_INITRD_MEDIA_GUID EFI_GUID(0x5568e427, 0x68fc, 0x4f3d,  0xac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
75*b9f8ff7cSAndrew Jones 
76f20589d6SZixuan Wang typedef struct {
77f20589d6SZixuan Wang 	efi_guid_t guid;
78f20589d6SZixuan Wang 	void *table;
79f20589d6SZixuan Wang } efi_config_table_t;
80f20589d6SZixuan Wang 
81c3770197SVarad Gautam /*
82c3770197SVarad Gautam  * Generic EFI table header
83c3770197SVarad Gautam  */
84c3770197SVarad Gautam typedef	struct {
85c3770197SVarad Gautam 	u64 signature;
86c3770197SVarad Gautam 	u32 revision;
87c3770197SVarad Gautam 	u32 headersize;
88c3770197SVarad Gautam 	u32 crc32;
89c3770197SVarad Gautam 	u32 reserved;
90c3770197SVarad Gautam } efi_table_hdr_t;
91c3770197SVarad Gautam 
92c3770197SVarad Gautam /*
93c3770197SVarad Gautam  * Memory map descriptor:
94c3770197SVarad Gautam  */
95c3770197SVarad Gautam 
96c3770197SVarad Gautam /* Memory types: */
97c3770197SVarad Gautam #define EFI_RESERVED_TYPE		 0
98c3770197SVarad Gautam #define EFI_LOADER_CODE			 1
99c3770197SVarad Gautam #define EFI_LOADER_DATA			 2
100c3770197SVarad Gautam #define EFI_BOOT_SERVICES_CODE		 3
101c3770197SVarad Gautam #define EFI_BOOT_SERVICES_DATA		 4
102c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_CODE	 5
103c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_DATA	 6
104c3770197SVarad Gautam #define EFI_CONVENTIONAL_MEMORY		 7
105c3770197SVarad Gautam #define EFI_UNUSABLE_MEMORY		 8
106c3770197SVarad Gautam #define EFI_ACPI_RECLAIM_MEMORY		 9
107c3770197SVarad Gautam #define EFI_ACPI_MEMORY_NVS		10
108c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO		11
109c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO_PORT_SPACE	12
110c3770197SVarad Gautam #define EFI_PAL_CODE			13
111c3770197SVarad Gautam #define EFI_PERSISTENT_MEMORY		14
112c3770197SVarad Gautam #define EFI_MAX_MEMORY_TYPE		15
113c3770197SVarad Gautam 
114c3770197SVarad Gautam /* Attribute values: */
115c3770197SVarad Gautam #define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
116c3770197SVarad Gautam #define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
117c3770197SVarad Gautam #define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
118c3770197SVarad Gautam #define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
119c3770197SVarad Gautam #define EFI_MEMORY_UCE		((u64)0x0000000000000010ULL)	/* uncached, exported */
120c3770197SVarad Gautam #define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
121c3770197SVarad Gautam #define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
122c3770197SVarad Gautam #define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
123c3770197SVarad Gautam #define EFI_MEMORY_NV		((u64)0x0000000000008000ULL)	/* non-volatile */
124c3770197SVarad Gautam #define EFI_MEMORY_MORE_RELIABLE \
125c3770197SVarad Gautam 				((u64)0x0000000000010000ULL)	/* higher reliability */
126c3770197SVarad Gautam #define EFI_MEMORY_RO		((u64)0x0000000000020000ULL)	/* read-only */
127c3770197SVarad Gautam #define EFI_MEMORY_SP		((u64)0x0000000000040000ULL)	/* soft reserved */
128c3770197SVarad Gautam #define EFI_MEMORY_CPU_CRYPTO	((u64)0x0000000000080000ULL)	/* supports encryption */
129c3770197SVarad Gautam #define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
130c3770197SVarad Gautam #define EFI_MEMORY_DESCRIPTOR_VERSION	1
131c3770197SVarad Gautam 
132c3770197SVarad Gautam #define EFI_PAGE_SHIFT		12
133c3770197SVarad Gautam #define EFI_PAGE_SIZE		(1UL << EFI_PAGE_SHIFT)
134c3770197SVarad Gautam #define EFI_PAGES_MAX		(U64_MAX >> EFI_PAGE_SHIFT)
135c3770197SVarad Gautam 
136c3770197SVarad Gautam typedef struct {
137c3770197SVarad Gautam 	u32 type;
138c3770197SVarad Gautam 	u32 pad;
139c3770197SVarad Gautam 	u64 phys_addr;
140c3770197SVarad Gautam 	u64 virt_addr;
141c3770197SVarad Gautam 	u64 num_pages;
142c3770197SVarad Gautam 	u64 attribute;
143c3770197SVarad Gautam } efi_memory_desc_t;
144c3770197SVarad Gautam 
145c3770197SVarad Gautam typedef struct {
146c3770197SVarad Gautam 	efi_guid_t guid;
147c3770197SVarad Gautam 	u32 headersize;
148c3770197SVarad Gautam 	u32 flags;
149c3770197SVarad Gautam 	u32 imagesize;
150c3770197SVarad Gautam } efi_capsule_header_t;
151c3770197SVarad Gautam 
152c3770197SVarad Gautam /*
153c3770197SVarad Gautam  * EFI capsule flags
154c3770197SVarad Gautam  */
155c3770197SVarad Gautam #define EFI_CAPSULE_PERSIST_ACROSS_RESET	0x00010000
156c3770197SVarad Gautam #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE	0x00020000
157c3770197SVarad Gautam #define EFI_CAPSULE_INITIATE_RESET		0x00040000
158c3770197SVarad Gautam 
159c3770197SVarad Gautam struct capsule_info {
160c3770197SVarad Gautam 	efi_capsule_header_t	header;
161c3770197SVarad Gautam 	efi_capsule_header_t	*capsule;
162c3770197SVarad Gautam 	int			reset_type;
163c3770197SVarad Gautam 	long			index;
164c3770197SVarad Gautam 	size_t			count;
165c3770197SVarad Gautam 	size_t			total_size;
166c3770197SVarad Gautam 	struct page		**pages;
167c3770197SVarad Gautam 	phys_addr_t		*phys;
168c3770197SVarad Gautam 	size_t			page_bytes_remain;
169c3770197SVarad Gautam };
170c3770197SVarad Gautam 
171c3770197SVarad Gautam int __efi_capsule_setup_info(struct capsule_info *cap_info);
172c3770197SVarad Gautam 
173c3770197SVarad Gautam /*
174c3770197SVarad Gautam  * Types and defines for Time Services
175c3770197SVarad Gautam  */
176c3770197SVarad Gautam #define EFI_TIME_ADJUST_DAYLIGHT 0x1
177c3770197SVarad Gautam #define EFI_TIME_IN_DAYLIGHT     0x2
178c3770197SVarad Gautam #define EFI_UNSPECIFIED_TIMEZONE 0x07ff
179c3770197SVarad Gautam 
180c3770197SVarad Gautam typedef struct {
181c3770197SVarad Gautam 	u16 year;
182c3770197SVarad Gautam 	u8 month;
183c3770197SVarad Gautam 	u8 day;
184c3770197SVarad Gautam 	u8 hour;
185c3770197SVarad Gautam 	u8 minute;
186c3770197SVarad Gautam 	u8 second;
187c3770197SVarad Gautam 	u8 pad1;
188c3770197SVarad Gautam 	u32 nanosecond;
189c3770197SVarad Gautam 	s16 timezone;
190c3770197SVarad Gautam 	u8 daylight;
191c3770197SVarad Gautam 	u8 pad2;
192c3770197SVarad Gautam } efi_time_t;
193c3770197SVarad Gautam 
194c3770197SVarad Gautam typedef struct {
195c3770197SVarad Gautam 	u32 resolution;
196c3770197SVarad Gautam 	u32 accuracy;
197c3770197SVarad Gautam 	u8 sets_to_zero;
198c3770197SVarad Gautam } efi_time_cap_t;
199c3770197SVarad Gautam 
200c3770197SVarad Gautam typedef void *efi_event_t;
201c3770197SVarad Gautam /* Note that notifications won't work in mixed mode */
202c3770197SVarad Gautam typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
203c3770197SVarad Gautam 
204c3770197SVarad Gautam typedef enum {
205c3770197SVarad Gautam 	EfiTimerCancel,
206c3770197SVarad Gautam 	EfiTimerPeriodic,
207c3770197SVarad Gautam 	EfiTimerRelative
208c3770197SVarad Gautam } EFI_TIMER_DELAY;
209c3770197SVarad Gautam 
210c3770197SVarad Gautam /*
211c3770197SVarad Gautam  * EFI Device Path information
212c3770197SVarad Gautam  */
213c3770197SVarad Gautam #define EFI_DEV_HW			0x01
214c3770197SVarad Gautam #define  EFI_DEV_PCI				 1
215c3770197SVarad Gautam #define  EFI_DEV_PCCARD				 2
216c3770197SVarad Gautam #define  EFI_DEV_MEM_MAPPED			 3
217c3770197SVarad Gautam #define  EFI_DEV_VENDOR				 4
218c3770197SVarad Gautam #define  EFI_DEV_CONTROLLER			 5
219c3770197SVarad Gautam #define EFI_DEV_ACPI			0x02
220c3770197SVarad Gautam #define   EFI_DEV_BASIC_ACPI			 1
221c3770197SVarad Gautam #define   EFI_DEV_EXPANDED_ACPI			 2
222c3770197SVarad Gautam #define EFI_DEV_MSG			0x03
223c3770197SVarad Gautam #define   EFI_DEV_MSG_ATAPI			 1
224c3770197SVarad Gautam #define   EFI_DEV_MSG_SCSI			 2
225c3770197SVarad Gautam #define   EFI_DEV_MSG_FC			 3
226c3770197SVarad Gautam #define   EFI_DEV_MSG_1394			 4
227c3770197SVarad Gautam #define   EFI_DEV_MSG_USB			 5
228c3770197SVarad Gautam #define   EFI_DEV_MSG_USB_CLASS			15
229c3770197SVarad Gautam #define   EFI_DEV_MSG_I20			 6
230c3770197SVarad Gautam #define   EFI_DEV_MSG_MAC			11
231c3770197SVarad Gautam #define   EFI_DEV_MSG_IPV4			12
232c3770197SVarad Gautam #define   EFI_DEV_MSG_IPV6			13
233c3770197SVarad Gautam #define   EFI_DEV_MSG_INFINIBAND		 9
234c3770197SVarad Gautam #define   EFI_DEV_MSG_UART			14
235c3770197SVarad Gautam #define   EFI_DEV_MSG_VENDOR			10
236c3770197SVarad Gautam #define EFI_DEV_MEDIA			0x04
237c3770197SVarad Gautam #define   EFI_DEV_MEDIA_HARD_DRIVE		 1
238c3770197SVarad Gautam #define   EFI_DEV_MEDIA_CDROM			 2
239c3770197SVarad Gautam #define   EFI_DEV_MEDIA_VENDOR			 3
240c3770197SVarad Gautam #define   EFI_DEV_MEDIA_FILE			 4
241c3770197SVarad Gautam #define   EFI_DEV_MEDIA_PROTOCOL		 5
242c3770197SVarad Gautam #define EFI_DEV_BIOS_BOOT		0x05
243c3770197SVarad Gautam #define EFI_DEV_END_PATH		0x7F
244c3770197SVarad Gautam #define EFI_DEV_END_PATH2		0xFF
245c3770197SVarad Gautam #define   EFI_DEV_END_INSTANCE			0x01
246c3770197SVarad Gautam #define   EFI_DEV_END_ENTIRE			0xFF
247c3770197SVarad Gautam 
248c3770197SVarad Gautam struct efi_generic_dev_path {
249c3770197SVarad Gautam 	u8				type;
250c3770197SVarad Gautam 	u8				sub_type;
251c3770197SVarad Gautam 	u16				length;
252c3770197SVarad Gautam } __packed;
253c3770197SVarad Gautam 
254*b9f8ff7cSAndrew Jones struct efi_vendor_dev_path {
255*b9f8ff7cSAndrew Jones 	struct efi_generic_dev_path	header;
256*b9f8ff7cSAndrew Jones 	efi_guid_t			vendorguid;
257*b9f8ff7cSAndrew Jones 	u8				vendordata[];
258*b9f8ff7cSAndrew Jones } __packed;
259*b9f8ff7cSAndrew Jones 
260c3770197SVarad Gautam typedef struct efi_generic_dev_path efi_device_path_protocol_t;
261c3770197SVarad Gautam 
262c3770197SVarad Gautam /*
263c3770197SVarad Gautam  * EFI Boot Services table
264c3770197SVarad Gautam  */
265c3770197SVarad Gautam typedef struct {
266c3770197SVarad Gautam 	efi_table_hdr_t hdr;
267c3770197SVarad Gautam 	void *raise_tpl;
268c3770197SVarad Gautam 	void *restore_tpl;
269c3770197SVarad Gautam 	efi_status_t(__efiapi *allocate_pages)(int, int, unsigned long,
270c3770197SVarad Gautam 					       efi_physical_addr_t *);
271c3770197SVarad Gautam 	efi_status_t(__efiapi *free_pages)(efi_physical_addr_t,
272c3770197SVarad Gautam 					   unsigned long);
273c3770197SVarad Gautam 	efi_status_t(__efiapi *get_memory_map)(unsigned long *, void *,
274c3770197SVarad Gautam 					       unsigned long *,
275c3770197SVarad Gautam 					       unsigned long *, u32 *);
276c3770197SVarad Gautam 	efi_status_t(__efiapi *allocate_pool)(int, unsigned long,
277c3770197SVarad Gautam 					      void **);
278c3770197SVarad Gautam 	efi_status_t(__efiapi *free_pool)(void *);
279c3770197SVarad Gautam 	efi_status_t(__efiapi *create_event)(u32, unsigned long,
280c3770197SVarad Gautam 					     efi_event_notify_t, void *,
281c3770197SVarad Gautam 					     efi_event_t *);
282c3770197SVarad Gautam 	efi_status_t(__efiapi *set_timer)(efi_event_t,
283c3770197SVarad Gautam 					  EFI_TIMER_DELAY, u64);
284c3770197SVarad Gautam 	efi_status_t(__efiapi *wait_for_event)(unsigned long,
285c3770197SVarad Gautam 					       efi_event_t *,
286c3770197SVarad Gautam 					       unsigned long *);
287c3770197SVarad Gautam 	void *signal_event;
288c3770197SVarad Gautam 	efi_status_t(__efiapi *close_event)(efi_event_t);
289c3770197SVarad Gautam 	void *check_event;
290c3770197SVarad Gautam 	void *install_protocol_interface;
291c3770197SVarad Gautam 	void *reinstall_protocol_interface;
292c3770197SVarad Gautam 	void *uninstall_protocol_interface;
293c3770197SVarad Gautam 	efi_status_t(__efiapi *handle_protocol)(efi_handle_t,
294c3770197SVarad Gautam 						efi_guid_t *, void **);
295c3770197SVarad Gautam 	void *__reserved;
296c3770197SVarad Gautam 	void *register_protocol_notify;
297c3770197SVarad Gautam 	efi_status_t(__efiapi *locate_handle)(int, efi_guid_t *,
298c3770197SVarad Gautam 					      void *, unsigned long *,
299c3770197SVarad Gautam 					      efi_handle_t *);
300c3770197SVarad Gautam 	efi_status_t(__efiapi *locate_device_path)(efi_guid_t *,
301c3770197SVarad Gautam 						   efi_device_path_protocol_t **,
302c3770197SVarad Gautam 						   efi_handle_t *);
303c3770197SVarad Gautam 	efi_status_t(__efiapi *install_configuration_table)(efi_guid_t *,
304c3770197SVarad Gautam 							    void *);
305c3770197SVarad Gautam 	void *load_image;
306c3770197SVarad Gautam 	void *start_image;
307c3770197SVarad Gautam 	efi_status_t(__efiapi *exit)(efi_handle_t,
308c3770197SVarad Gautam 				     efi_status_t,
309c3770197SVarad Gautam 				     unsigned long,
310c3770197SVarad Gautam 				     efi_char16_t *);
311c3770197SVarad Gautam 	void *unload_image;
312c3770197SVarad Gautam 	efi_status_t(__efiapi *exit_boot_services)(efi_handle_t,
313c3770197SVarad Gautam 						   unsigned long);
314c3770197SVarad Gautam 	void *get_next_monotonic_count;
315c3770197SVarad Gautam 	efi_status_t(__efiapi *stall)(unsigned long);
316c3770197SVarad Gautam 	void *set_watchdog_timer;
317c3770197SVarad Gautam 	void *connect_controller;
318c3770197SVarad Gautam 	efi_status_t(__efiapi *disconnect_controller)(efi_handle_t,
319c3770197SVarad Gautam 						      efi_handle_t,
320c3770197SVarad Gautam 						      efi_handle_t);
321c3770197SVarad Gautam 	void *open_protocol;
322c3770197SVarad Gautam 	void *close_protocol;
323c3770197SVarad Gautam 	void *open_protocol_information;
324c3770197SVarad Gautam 	void *protocols_per_handle;
325c3770197SVarad Gautam 	void *locate_handle_buffer;
326c3770197SVarad Gautam 	efi_status_t(__efiapi *locate_protocol)(efi_guid_t *, void *,
327c3770197SVarad Gautam 						void **);
328c3770197SVarad Gautam 	void *install_multiple_protocol_interfaces;
329c3770197SVarad Gautam 	void *uninstall_multiple_protocol_interfaces;
330c3770197SVarad Gautam 	void *calculate_crc32;
331c3770197SVarad Gautam 	void *copy_mem;
332c3770197SVarad Gautam 	void *set_mem;
333c3770197SVarad Gautam 	void *create_event_ex;
334c3770197SVarad Gautam } efi_boot_services_t;
335c3770197SVarad Gautam 
336c3770197SVarad Gautam /*
337c3770197SVarad Gautam  * Types and defines for EFI ResetSystem
338c3770197SVarad Gautam  */
339c3770197SVarad Gautam #define EFI_RESET_COLD 0
340c3770197SVarad Gautam #define EFI_RESET_WARM 1
341c3770197SVarad Gautam #define EFI_RESET_SHUTDOWN 2
342c3770197SVarad Gautam 
343c3770197SVarad Gautam /*
344c3770197SVarad Gautam  * EFI Runtime Services table
345c3770197SVarad Gautam  */
346c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
347c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
348c3770197SVarad Gautam 
349c3770197SVarad Gautam typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
350c3770197SVarad Gautam typedef efi_status_t efi_set_time_t (efi_time_t *tm);
351c3770197SVarad Gautam typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
352c3770197SVarad Gautam 					    efi_time_t *tm);
353c3770197SVarad Gautam typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
354c3770197SVarad Gautam typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
355c3770197SVarad Gautam 					 unsigned long *data_size, void *data);
356c3770197SVarad Gautam typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
357c3770197SVarad Gautam 					      efi_guid_t *vendor);
358c3770197SVarad Gautam typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
359c3770197SVarad Gautam 					 u32 attr, unsigned long data_size,
360c3770197SVarad Gautam 					 void *data);
361c3770197SVarad Gautam typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
362c3770197SVarad Gautam typedef void efi_reset_system_t (int reset_type, efi_status_t status,
363c3770197SVarad Gautam 				 unsigned long data_size, efi_char16_t *data);
364c3770197SVarad Gautam typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
365c3770197SVarad Gautam 						unsigned long descriptor_size,
366c3770197SVarad Gautam 						u32 descriptor_version,
367c3770197SVarad Gautam 						efi_memory_desc_t *virtual_map);
368c3770197SVarad Gautam typedef efi_status_t efi_query_variable_info_t(u32 attr,
369c3770197SVarad Gautam 					       u64 *storage_space,
370c3770197SVarad Gautam 					       u64 *remaining_space,
371c3770197SVarad Gautam 					       u64 *max_variable_size);
372c3770197SVarad Gautam typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
373c3770197SVarad Gautam 					  unsigned long count,
374c3770197SVarad Gautam 					  unsigned long sg_list);
375c3770197SVarad Gautam typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
376c3770197SVarad Gautam 					      unsigned long count,
377c3770197SVarad Gautam 					      u64 *max_size,
378c3770197SVarad Gautam 					      int *reset_type);
379c3770197SVarad Gautam typedef efi_status_t efi_query_variable_store_t(u32 attributes,
380c3770197SVarad Gautam 						unsigned long size,
381c3770197SVarad Gautam 						bool nonblocking);
382c3770197SVarad Gautam 
383c3770197SVarad Gautam typedef struct {
384c3770197SVarad Gautam 	efi_table_hdr_t				hdr;
385c3770197SVarad Gautam 	efi_get_time_t __efiapi			*get_time;
386c3770197SVarad Gautam 	efi_set_time_t __efiapi			*set_time;
387c3770197SVarad Gautam 	efi_get_wakeup_time_t __efiapi		*get_wakeup_time;
388c3770197SVarad Gautam 	efi_set_wakeup_time_t __efiapi		*set_wakeup_time;
389c3770197SVarad Gautam 	efi_set_virtual_address_map_t __efiapi	*set_virtual_address_map;
390c3770197SVarad Gautam 	void					*convert_pointer;
391c3770197SVarad Gautam 	efi_get_variable_t __efiapi		*get_variable;
392c3770197SVarad Gautam 	efi_get_next_variable_t __efiapi	*get_next_variable;
393c3770197SVarad Gautam 	efi_set_variable_t __efiapi		*set_variable;
394c3770197SVarad Gautam 	efi_get_next_high_mono_count_t __efiapi	*get_next_high_mono_count;
395c3770197SVarad Gautam 	efi_reset_system_t __efiapi		*reset_system;
396c3770197SVarad Gautam 	efi_update_capsule_t __efiapi		*update_capsule;
397c3770197SVarad Gautam 	efi_query_capsule_caps_t __efiapi	*query_capsule_caps;
398c3770197SVarad Gautam 	efi_query_variable_info_t __efiapi	*query_variable_info;
399c3770197SVarad Gautam } efi_runtime_services_t;
400c3770197SVarad Gautam 
401c3770197SVarad Gautam #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
402c3770197SVarad Gautam 
403c3770197SVarad Gautam #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
404c3770197SVarad Gautam #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
405c3770197SVarad Gautam #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
406c3770197SVarad Gautam #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
407c3770197SVarad Gautam #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
408c3770197SVarad Gautam #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
409c3770197SVarad Gautam 
410c3770197SVarad Gautam typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t;
411c3770197SVarad Gautam typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t;
412c3770197SVarad Gautam 
413c3770197SVarad Gautam typedef struct {
414c3770197SVarad Gautam 	efi_table_hdr_t hdr;
415c3770197SVarad Gautam 	unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
416c3770197SVarad Gautam 	u32 fw_revision;
417c3770197SVarad Gautam 	unsigned long con_in_handle;
418c3770197SVarad Gautam 	efi_simple_text_input_protocol_t *con_in;
419c3770197SVarad Gautam 	unsigned long con_out_handle;
420c3770197SVarad Gautam 	efi_simple_text_output_protocol_t *con_out;
421c3770197SVarad Gautam 	unsigned long stderr_handle;
422c3770197SVarad Gautam 	unsigned long stderr;
423c3770197SVarad Gautam 	efi_runtime_services_t *runtime;
424c3770197SVarad Gautam 	efi_boot_services_t *boottime;
425c3770197SVarad Gautam 	unsigned long nr_tables;
426c3770197SVarad Gautam 	unsigned long tables;
427c3770197SVarad Gautam } efi_system_table_t;
428c3770197SVarad Gautam 
429c3770197SVarad Gautam struct efi_boot_memmap {
430c3770197SVarad Gautam 	efi_memory_desc_t       **map;
431c3770197SVarad Gautam 	unsigned long           *map_size;
432c3770197SVarad Gautam 	unsigned long           *desc_size;
433c3770197SVarad Gautam 	u32                     *desc_ver;
434c3770197SVarad Gautam 	unsigned long           *key_ptr;
435c3770197SVarad Gautam 	unsigned long           *buff_size;
436c3770197SVarad Gautam };
437c3770197SVarad Gautam 
43885c3c524SNikos Nikoleris #define __aligned_u64 u64 __attribute__((aligned(8)))
43985c3c524SNikos Nikoleris 
44085c3c524SNikos Nikoleris struct efi_loaded_image_64 {
44185c3c524SNikos Nikoleris 	u32			revision;
44285c3c524SNikos Nikoleris 	efi_handle_t		parent_handle;
44385c3c524SNikos Nikoleris 	efi_system_table_t	*system_table;
44485c3c524SNikos Nikoleris 	efi_handle_t		device_handle;
44585c3c524SNikos Nikoleris 	void			*file_path;
44685c3c524SNikos Nikoleris 	void			*reserved;
44785c3c524SNikos Nikoleris 	u32			load_options_size;
44885c3c524SNikos Nikoleris 	void			*load_options;
44985c3c524SNikos Nikoleris 	void			*image_base;
45085c3c524SNikos Nikoleris 	__aligned_u64		image_size;
45185c3c524SNikos Nikoleris 	unsigned int		image_code_type;
45285c3c524SNikos Nikoleris 	unsigned int		image_data_type;
45385c3c524SNikos Nikoleris 	efi_status_t		(__efiapi * unload)(efi_handle_t image_handle);
45485c3c524SNikos Nikoleris };
45585c3c524SNikos Nikoleris 
456529ab889SNikos Nikoleris 
457529ab889SNikos Nikoleris typedef struct _efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
458529ab889SNikos Nikoleris typedef struct _efi_file_protocol efi_file_protocol_t;
459529ab889SNikos Nikoleris typedef efi_simple_file_system_protocol_t efi_file_io_interface_t;
460529ab889SNikos Nikoleris typedef efi_file_protocol_t efi_file_t;
461*b9f8ff7cSAndrew Jones typedef union efi_load_file_protocol efi_load_file_protocol_t;
462*b9f8ff7cSAndrew Jones typedef union efi_load_file_protocol efi_load_file2_protocol_t;
463*b9f8ff7cSAndrew Jones 
464*b9f8ff7cSAndrew Jones union efi_load_file_protocol {
465*b9f8ff7cSAndrew Jones 	struct {
466*b9f8ff7cSAndrew Jones 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
467*b9f8ff7cSAndrew Jones 						   efi_device_path_protocol_t *,
468*b9f8ff7cSAndrew Jones 						   bool, unsigned long *, void *);
469*b9f8ff7cSAndrew Jones 	};
470*b9f8ff7cSAndrew Jones 	struct {
471*b9f8ff7cSAndrew Jones 		u32 load_file;
472*b9f8ff7cSAndrew Jones 	} mixed_mode;
473*b9f8ff7cSAndrew Jones };
474529ab889SNikos Nikoleris 
475529ab889SNikos Nikoleris typedef efi_status_t efi_simple_file_system_protocol_open_volume(
476529ab889SNikos Nikoleris 	efi_simple_file_system_protocol_t *this,
477529ab889SNikos Nikoleris 	efi_file_protocol_t **root);
478529ab889SNikos Nikoleris 
479529ab889SNikos Nikoleris #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
480529ab889SNikos Nikoleris 
481529ab889SNikos Nikoleris struct _efi_simple_file_system_protocol {
482529ab889SNikos Nikoleris 	uint64_t						revision;
483529ab889SNikos Nikoleris 	efi_simple_file_system_protocol_open_volume __efiapi	*open_volume;
484529ab889SNikos Nikoleris };
485529ab889SNikos Nikoleris 
486529ab889SNikos Nikoleris /* Open modes */
487529ab889SNikos Nikoleris #define EFI_FILE_MODE_READ    0x0000000000000001ULL
488529ab889SNikos Nikoleris #define EFI_FILE_MODE_WRITE   0x0000000000000002ULL
489529ab889SNikos Nikoleris #define EFI_FILE_MODE_CREATE  0x8000000000000000ULL
490529ab889SNikos Nikoleris 
491529ab889SNikos Nikoleris typedef efi_status_t efi_file_open(efi_file_protocol_t *this,
492529ab889SNikos Nikoleris 				   efi_file_protocol_t **new_handle,
493529ab889SNikos Nikoleris 				   efi_char16_t *file_name,
494529ab889SNikos Nikoleris 				   uint64_t open_mode,
495529ab889SNikos Nikoleris 				   uint64_t attributes);
496529ab889SNikos Nikoleris typedef efi_status_t efi_file_close(efi_file_protocol_t *this);
497529ab889SNikos Nikoleris typedef efi_status_t efi_file_delete(efi_file_protocol_t *this);
498529ab889SNikos Nikoleris typedef efi_status_t efi_file_read(efi_file_protocol_t *this,
499529ab889SNikos Nikoleris 				   uint64_t *buffer_size,
500529ab889SNikos Nikoleris 				   void *buffer);
501529ab889SNikos Nikoleris typedef efi_status_t efi_file_write(efi_file_protocol_t *this,
502529ab889SNikos Nikoleris 				    uint64_t *buffer_size,
503529ab889SNikos Nikoleris 				    void *buffer);
504529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_position(efi_file_protocol_t *this,
505529ab889SNikos Nikoleris 					   uint64_t position);
506529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_position(efi_file_protocol_t *this,
507529ab889SNikos Nikoleris 					   uint64_t *position);
508529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_info(efi_file_protocol_t *this,
509529ab889SNikos Nikoleris 				       efi_guid_t *information_type,
510529ab889SNikos Nikoleris 				       uint64_t *buffer_size,
511529ab889SNikos Nikoleris 				       void *buffer);
512529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_info(efi_file_protocol_t *this,
513529ab889SNikos Nikoleris 				       efi_guid_t *information_type,
514529ab889SNikos Nikoleris 				       uint64_t *buffer_size,
515529ab889SNikos Nikoleris 				       void *buffer);
516529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush(efi_file_protocol_t *this);
517529ab889SNikos Nikoleris 
518529ab889SNikos Nikoleris typedef struct {
519529ab889SNikos Nikoleris 	efi_event_t event;
520529ab889SNikos Nikoleris 	efi_status_t status;
521529ab889SNikos Nikoleris 	uint64_t buffer_size;
522529ab889SNikos Nikoleris 	void *buffer;
523529ab889SNikos Nikoleris } efi_file_io_open_t;
524529ab889SNikos Nikoleris 
525529ab889SNikos Nikoleris typedef efi_status_t efi_file_open_ex(efi_file_protocol_t *this,
526529ab889SNikos Nikoleris 				      efi_file_protocol_t **new_handle,
527529ab889SNikos Nikoleris 				      efi_char16_t *file_name,
528529ab889SNikos Nikoleris 				      uint64_t open_mode,
529529ab889SNikos Nikoleris 				      uint64_t attributes,
530529ab889SNikos Nikoleris 				      efi_file_io_open_t *token);
531529ab889SNikos Nikoleris typedef efi_status_t efi_file_read_ex(efi_file_protocol_t *this,
532529ab889SNikos Nikoleris 				      efi_file_io_open_t *token);
533529ab889SNikos Nikoleris typedef efi_status_t efi_file_write_ex(efi_file_protocol_t *this,
534529ab889SNikos Nikoleris 				       efi_file_io_open_t *token);
535529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush_ex(efi_file_protocol_t *this,
536529ab889SNikos Nikoleris 				       efi_file_io_open_t *token);
537529ab889SNikos Nikoleris 
538529ab889SNikos Nikoleris struct _efi_file_protocol {
539529ab889SNikos Nikoleris 	uint64_t			revision;
540529ab889SNikos Nikoleris 	efi_file_open __efiapi		*open;
541529ab889SNikos Nikoleris 	efi_file_close __efiapi		*close;
542529ab889SNikos Nikoleris 	efi_file_delete __efiapi	*delete;
543529ab889SNikos Nikoleris 	efi_file_read __efiapi		*read;
544529ab889SNikos Nikoleris 	efi_file_write __efiapi		*write;
545529ab889SNikos Nikoleris 	efi_file_get_position __efiapi	*get_position;
546529ab889SNikos Nikoleris 	efi_file_set_position __efiapi	*set_position;
547529ab889SNikos Nikoleris 	efi_file_get_info __efiapi	*get_info;
548529ab889SNikos Nikoleris 	efi_file_set_info __efiapi	*set_info;
549529ab889SNikos Nikoleris 	efi_file_flush __efiapi		*flush;
550529ab889SNikos Nikoleris 	efi_file_open_ex __efiapi	*open_ex;
551529ab889SNikos Nikoleris 	efi_file_read_ex __efiapi	*read_ex;
552529ab889SNikos Nikoleris 	efi_file_write_ex __efiapi	*write_ex;
553529ab889SNikos Nikoleris 	efi_file_flush_ex __efiapi	*flush_ex;
554529ab889SNikos Nikoleris };
555529ab889SNikos Nikoleris 
556529ab889SNikos Nikoleris #define EFI_FILE_INFO_ID EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
557529ab889SNikos Nikoleris 
558529ab889SNikos Nikoleris typedef struct {
559529ab889SNikos Nikoleris 	uint64_t	size;
560529ab889SNikos Nikoleris 	uint64_t	file_size;
561529ab889SNikos Nikoleris 	uint64_t	physical_size;
562529ab889SNikos Nikoleris 	efi_time_t	create_time;
563529ab889SNikos Nikoleris 	efi_time_t	last_access_time;
564529ab889SNikos Nikoleris 	efi_time_t	modification_time;
565529ab889SNikos Nikoleris 	uint64_t	attributes;
566529ab889SNikos Nikoleris 	efi_char16_t	file_name[1];
567529ab889SNikos Nikoleris } efi_file_info_t;
568529ab889SNikos Nikoleris 
569*b9f8ff7cSAndrew Jones #define efi_fn_call(inst, func, ...) (inst)->func(__VA_ARGS__)
570ad5fb883SZixuan Wang #define efi_bs_call(func, ...) efi_system_table->boottime->func(__VA_ARGS__)
571ad5fb883SZixuan Wang #define efi_rs_call(func, ...) efi_system_table->runtime->func(__VA_ARGS__)
572*b9f8ff7cSAndrew Jones #define efi_call_proto(inst, func, ...) ({				\
573*b9f8ff7cSAndrew Jones 		__typeof__(inst) __inst = (inst);			\
574*b9f8ff7cSAndrew Jones 		efi_fn_call(__inst, func, __inst, ##__VA_ARGS__);	\
575*b9f8ff7cSAndrew Jones })
576c3770197SVarad Gautam 
577c3770197SVarad Gautam #endif /* __LINUX_UEFI_H */
578