1#ifndef _LINUX_EFI_H
2#define _LINUX_EFI_H
3
4/*
5 * Extensible Firmware Interface
6 * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
7 *
8 * Copyright (C) 1999 VA Linux Systems
9 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
10 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
11 *	David Mosberger-Tang <davidm@hpl.hp.com>
12 *	Stephane Eranian <eranian@hpl.hp.com>
13 */
14#include <linux/init.h>
15#include <linux/string.h>
16#include <linux/time.h>
17#include <linux/types.h>
18#include <linux/proc_fs.h>
19#include <linux/rtc.h>
20#include <linux/ioport.h>
21#include <linux/pfn.h>
22#include <linux/pstore.h>
23#include <linux/reboot.h>
24
25#include <asm/page.h>
26
27#define EFI_SUCCESS		0
28#define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
29#define EFI_INVALID_PARAMETER	( 2 | (1UL << (BITS_PER_LONG-1)))
30#define EFI_UNSUPPORTED		( 3 | (1UL << (BITS_PER_LONG-1)))
31#define EFI_BAD_BUFFER_SIZE     ( 4 | (1UL << (BITS_PER_LONG-1)))
32#define EFI_BUFFER_TOO_SMALL	( 5 | (1UL << (BITS_PER_LONG-1)))
33#define EFI_NOT_READY		( 6 | (1UL << (BITS_PER_LONG-1)))
34#define EFI_DEVICE_ERROR	( 7 | (1UL << (BITS_PER_LONG-1)))
35#define EFI_WRITE_PROTECTED	( 8 | (1UL << (BITS_PER_LONG-1)))
36#define EFI_OUT_OF_RESOURCES	( 9 | (1UL << (BITS_PER_LONG-1)))
37#define EFI_NOT_FOUND		(14 | (1UL << (BITS_PER_LONG-1)))
38#define EFI_SECURITY_VIOLATION	(26 | (1UL << (BITS_PER_LONG-1)))
39
40typedef unsigned long efi_status_t;
41typedef u8 efi_bool_t;
42typedef u16 efi_char16_t;		/* UNICODE character */
43typedef u64 efi_physical_addr_t;
44typedef void *efi_handle_t;
45
46
47typedef struct {
48	u8 b[16];
49} efi_guid_t;
50
51#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
52((efi_guid_t) \
53{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
54  (b) & 0xff, ((b) >> 8) & 0xff, \
55  (c) & 0xff, ((c) >> 8) & 0xff, \
56  (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
57
58/*
59 * Generic EFI table header
60 */
61typedef	struct {
62	u64 signature;
63	u32 revision;
64	u32 headersize;
65	u32 crc32;
66	u32 reserved;
67} efi_table_hdr_t;
68
69/*
70 * Memory map descriptor:
71 */
72
73/* Memory types: */
74#define EFI_RESERVED_TYPE		 0
75#define EFI_LOADER_CODE			 1
76#define EFI_LOADER_DATA			 2
77#define EFI_BOOT_SERVICES_CODE		 3
78#define EFI_BOOT_SERVICES_DATA		 4
79#define EFI_RUNTIME_SERVICES_CODE	 5
80#define EFI_RUNTIME_SERVICES_DATA	 6
81#define EFI_CONVENTIONAL_MEMORY		 7
82#define EFI_UNUSABLE_MEMORY		 8
83#define EFI_ACPI_RECLAIM_MEMORY		 9
84#define EFI_ACPI_MEMORY_NVS		10
85#define EFI_MEMORY_MAPPED_IO		11
86#define EFI_MEMORY_MAPPED_IO_PORT_SPACE	12
87#define EFI_PAL_CODE			13
88#define EFI_MAX_MEMORY_TYPE		14
89
90/* Attribute values: */
91#define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
92#define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
93#define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
94#define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
95#define EFI_MEMORY_UCE		((u64)0x0000000000000010ULL)	/* uncached, exported */
96#define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
97#define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
98#define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
99#define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
100#define EFI_MEMORY_DESCRIPTOR_VERSION	1
101
102#define EFI_PAGE_SHIFT		12
103#define EFI_PAGE_SIZE		(1UL << EFI_PAGE_SHIFT)
104
105typedef struct {
106	u32 type;
107	u32 pad;
108	u64 phys_addr;
109	u64 virt_addr;
110	u64 num_pages;
111	u64 attribute;
112} efi_memory_desc_t;
113
114typedef struct {
115	efi_guid_t guid;
116	u32 headersize;
117	u32 flags;
118	u32 imagesize;
119} efi_capsule_header_t;
120
121/*
122 * Allocation types for calls to boottime->allocate_pages.
123 */
124#define EFI_ALLOCATE_ANY_PAGES		0
125#define EFI_ALLOCATE_MAX_ADDRESS	1
126#define EFI_ALLOCATE_ADDRESS		2
127#define EFI_MAX_ALLOCATE_TYPE		3
128
129typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
130
131/*
132 * Types and defines for Time Services
133 */
134#define EFI_TIME_ADJUST_DAYLIGHT 0x1
135#define EFI_TIME_IN_DAYLIGHT     0x2
136#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
137
138typedef struct {
139	u16 year;
140	u8 month;
141	u8 day;
142	u8 hour;
143	u8 minute;
144	u8 second;
145	u8 pad1;
146	u32 nanosecond;
147	s16 timezone;
148	u8 daylight;
149	u8 pad2;
150} efi_time_t;
151
152typedef struct {
153	u32 resolution;
154	u32 accuracy;
155	u8 sets_to_zero;
156} efi_time_cap_t;
157
158typedef struct {
159	efi_table_hdr_t hdr;
160	u32 raise_tpl;
161	u32 restore_tpl;
162	u32 allocate_pages;
163	u32 free_pages;
164	u32 get_memory_map;
165	u32 allocate_pool;
166	u32 free_pool;
167	u32 create_event;
168	u32 set_timer;
169	u32 wait_for_event;
170	u32 signal_event;
171	u32 close_event;
172	u32 check_event;
173	u32 install_protocol_interface;
174	u32 reinstall_protocol_interface;
175	u32 uninstall_protocol_interface;
176	u32 handle_protocol;
177	u32 __reserved;
178	u32 register_protocol_notify;
179	u32 locate_handle;
180	u32 locate_device_path;
181	u32 install_configuration_table;
182	u32 load_image;
183	u32 start_image;
184	u32 exit;
185	u32 unload_image;
186	u32 exit_boot_services;
187	u32 get_next_monotonic_count;
188	u32 stall;
189	u32 set_watchdog_timer;
190	u32 connect_controller;
191	u32 disconnect_controller;
192	u32 open_protocol;
193	u32 close_protocol;
194	u32 open_protocol_information;
195	u32 protocols_per_handle;
196	u32 locate_handle_buffer;
197	u32 locate_protocol;
198	u32 install_multiple_protocol_interfaces;
199	u32 uninstall_multiple_protocol_interfaces;
200	u32 calculate_crc32;
201	u32 copy_mem;
202	u32 set_mem;
203	u32 create_event_ex;
204} __packed efi_boot_services_32_t;
205
206typedef struct {
207	efi_table_hdr_t hdr;
208	u64 raise_tpl;
209	u64 restore_tpl;
210	u64 allocate_pages;
211	u64 free_pages;
212	u64 get_memory_map;
213	u64 allocate_pool;
214	u64 free_pool;
215	u64 create_event;
216	u64 set_timer;
217	u64 wait_for_event;
218	u64 signal_event;
219	u64 close_event;
220	u64 check_event;
221	u64 install_protocol_interface;
222	u64 reinstall_protocol_interface;
223	u64 uninstall_protocol_interface;
224	u64 handle_protocol;
225	u64 __reserved;
226	u64 register_protocol_notify;
227	u64 locate_handle;
228	u64 locate_device_path;
229	u64 install_configuration_table;
230	u64 load_image;
231	u64 start_image;
232	u64 exit;
233	u64 unload_image;
234	u64 exit_boot_services;
235	u64 get_next_monotonic_count;
236	u64 stall;
237	u64 set_watchdog_timer;
238	u64 connect_controller;
239	u64 disconnect_controller;
240	u64 open_protocol;
241	u64 close_protocol;
242	u64 open_protocol_information;
243	u64 protocols_per_handle;
244	u64 locate_handle_buffer;
245	u64 locate_protocol;
246	u64 install_multiple_protocol_interfaces;
247	u64 uninstall_multiple_protocol_interfaces;
248	u64 calculate_crc32;
249	u64 copy_mem;
250	u64 set_mem;
251	u64 create_event_ex;
252} __packed efi_boot_services_64_t;
253
254/*
255 * EFI Boot Services table
256 */
257typedef struct {
258	efi_table_hdr_t hdr;
259	void *raise_tpl;
260	void *restore_tpl;
261	efi_status_t (*allocate_pages)(int, int, unsigned long,
262				       efi_physical_addr_t *);
263	efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long);
264	efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *,
265				       unsigned long *, u32 *);
266	efi_status_t (*allocate_pool)(int, unsigned long, void **);
267	efi_status_t (*free_pool)(void *);
268	void *create_event;
269	void *set_timer;
270	void *wait_for_event;
271	void *signal_event;
272	void *close_event;
273	void *check_event;
274	void *install_protocol_interface;
275	void *reinstall_protocol_interface;
276	void *uninstall_protocol_interface;
277	efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
278	void *__reserved;
279	void *register_protocol_notify;
280	void *locate_handle;
281	void *locate_device_path;
282	void *install_configuration_table;
283	void *load_image;
284	void *start_image;
285	void *exit;
286	void *unload_image;
287	efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long);
288	void *get_next_monotonic_count;
289	void *stall;
290	void *set_watchdog_timer;
291	void *connect_controller;
292	void *disconnect_controller;
293	void *open_protocol;
294	void *close_protocol;
295	void *open_protocol_information;
296	void *protocols_per_handle;
297	void *locate_handle_buffer;
298	void *locate_protocol;
299	void *install_multiple_protocol_interfaces;
300	void *uninstall_multiple_protocol_interfaces;
301	void *calculate_crc32;
302	void *copy_mem;
303	void *set_mem;
304	void *create_event_ex;
305} efi_boot_services_t;
306
307typedef enum {
308	EfiPciIoWidthUint8,
309	EfiPciIoWidthUint16,
310	EfiPciIoWidthUint32,
311	EfiPciIoWidthUint64,
312	EfiPciIoWidthFifoUint8,
313	EfiPciIoWidthFifoUint16,
314	EfiPciIoWidthFifoUint32,
315	EfiPciIoWidthFifoUint64,
316	EfiPciIoWidthFillUint8,
317	EfiPciIoWidthFillUint16,
318	EfiPciIoWidthFillUint32,
319	EfiPciIoWidthFillUint64,
320	EfiPciIoWidthMaximum
321} EFI_PCI_IO_PROTOCOL_WIDTH;
322
323typedef enum {
324	EfiPciIoAttributeOperationGet,
325	EfiPciIoAttributeOperationSet,
326	EfiPciIoAttributeOperationEnable,
327	EfiPciIoAttributeOperationDisable,
328	EfiPciIoAttributeOperationSupported,
329    EfiPciIoAttributeOperationMaximum
330} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
331
332typedef struct {
333	u32 read;
334	u32 write;
335} efi_pci_io_protocol_access_32_t;
336
337typedef struct {
338	u64 read;
339	u64 write;
340} efi_pci_io_protocol_access_64_t;
341
342typedef struct {
343	void *read;
344	void *write;
345} efi_pci_io_protocol_access_t;
346
347typedef struct {
348	u32 poll_mem;
349	u32 poll_io;
350	efi_pci_io_protocol_access_32_t mem;
351	efi_pci_io_protocol_access_32_t io;
352	efi_pci_io_protocol_access_32_t pci;
353	u32 copy_mem;
354	u32 map;
355	u32 unmap;
356	u32 allocate_buffer;
357	u32 free_buffer;
358	u32 flush;
359	u32 get_location;
360	u32 attributes;
361	u32 get_bar_attributes;
362	u32 set_bar_attributes;
363	uint64_t romsize;
364	void *romimage;
365} efi_pci_io_protocol_32;
366
367typedef struct {
368	u64 poll_mem;
369	u64 poll_io;
370	efi_pci_io_protocol_access_64_t mem;
371	efi_pci_io_protocol_access_64_t io;
372	efi_pci_io_protocol_access_64_t pci;
373	u64 copy_mem;
374	u64 map;
375	u64 unmap;
376	u64 allocate_buffer;
377	u64 free_buffer;
378	u64 flush;
379	u64 get_location;
380	u64 attributes;
381	u64 get_bar_attributes;
382	u64 set_bar_attributes;
383	uint64_t romsize;
384	void *romimage;
385} efi_pci_io_protocol_64;
386
387typedef struct {
388	void *poll_mem;
389	void *poll_io;
390	efi_pci_io_protocol_access_t mem;
391	efi_pci_io_protocol_access_t io;
392	efi_pci_io_protocol_access_t pci;
393	void *copy_mem;
394	void *map;
395	void *unmap;
396	void *allocate_buffer;
397	void *free_buffer;
398	void *flush;
399	void *get_location;
400	void *attributes;
401	void *get_bar_attributes;
402	void *set_bar_attributes;
403	uint64_t romsize;
404	void *romimage;
405} efi_pci_io_protocol;
406
407#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
408#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
409#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
410#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
411#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
412#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
413#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
414#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
415#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
416#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
417#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
418#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
419#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
420#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
421#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
422#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
423#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
424#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
425#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
426
427/*
428 * Types and defines for EFI ResetSystem
429 */
430#define EFI_RESET_COLD 0
431#define EFI_RESET_WARM 1
432#define EFI_RESET_SHUTDOWN 2
433
434/*
435 * EFI Runtime Services table
436 */
437#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
438#define EFI_RUNTIME_SERVICES_REVISION  0x00010000
439
440typedef struct {
441	efi_table_hdr_t hdr;
442	u32 get_time;
443	u32 set_time;
444	u32 get_wakeup_time;
445	u32 set_wakeup_time;
446	u32 set_virtual_address_map;
447	u32 convert_pointer;
448	u32 get_variable;
449	u32 get_next_variable;
450	u32 set_variable;
451	u32 get_next_high_mono_count;
452	u32 reset_system;
453	u32 update_capsule;
454	u32 query_capsule_caps;
455	u32 query_variable_info;
456} efi_runtime_services_32_t;
457
458typedef struct {
459	efi_table_hdr_t hdr;
460	u64 get_time;
461	u64 set_time;
462	u64 get_wakeup_time;
463	u64 set_wakeup_time;
464	u64 set_virtual_address_map;
465	u64 convert_pointer;
466	u64 get_variable;
467	u64 get_next_variable;
468	u64 set_variable;
469	u64 get_next_high_mono_count;
470	u64 reset_system;
471	u64 update_capsule;
472	u64 query_capsule_caps;
473	u64 query_variable_info;
474} efi_runtime_services_64_t;
475
476typedef struct {
477	efi_table_hdr_t hdr;
478	void *get_time;
479	void *set_time;
480	void *get_wakeup_time;
481	void *set_wakeup_time;
482	void *set_virtual_address_map;
483	void *convert_pointer;
484	void *get_variable;
485	void *get_next_variable;
486	void *set_variable;
487	void *get_next_high_mono_count;
488	void *reset_system;
489	void *update_capsule;
490	void *query_capsule_caps;
491	void *query_variable_info;
492} efi_runtime_services_t;
493
494typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
495typedef efi_status_t efi_set_time_t (efi_time_t *tm);
496typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
497					    efi_time_t *tm);
498typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
499typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
500					 unsigned long *data_size, void *data);
501typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
502					      efi_guid_t *vendor);
503typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
504					 u32 attr, unsigned long data_size,
505					 void *data);
506typedef efi_status_t
507efi_set_variable_nonblocking_t(efi_char16_t *name, efi_guid_t *vendor,
508			       u32 attr, unsigned long data_size, void *data);
509
510typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
511typedef void efi_reset_system_t (int reset_type, efi_status_t status,
512				 unsigned long data_size, efi_char16_t *data);
513typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
514						unsigned long descriptor_size,
515						u32 descriptor_version,
516						efi_memory_desc_t *virtual_map);
517typedef efi_status_t efi_query_variable_info_t(u32 attr,
518					       u64 *storage_space,
519					       u64 *remaining_space,
520					       u64 *max_variable_size);
521typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
522					  unsigned long count,
523					  unsigned long sg_list);
524typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
525					      unsigned long count,
526					      u64 *max_size,
527					      int *reset_type);
528typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long size);
529
530void efi_native_runtime_setup(void);
531
532/*
533 *  EFI Configuration Table and GUID definitions
534 */
535#define NULL_GUID \
536    EFI_GUID(  0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 )
537
538#define MPS_TABLE_GUID    \
539    EFI_GUID(  0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
540
541#define ACPI_TABLE_GUID    \
542    EFI_GUID(  0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
543
544#define ACPI_20_TABLE_GUID    \
545    EFI_GUID(  0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 )
546
547#define SMBIOS_TABLE_GUID    \
548    EFI_GUID(  0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
549
550#define SMBIOS3_TABLE_GUID    \
551    EFI_GUID(  0xf2fd1544, 0x9794, 0x4a2c, 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 )
552
553#define SAL_SYSTEM_TABLE_GUID    \
554    EFI_GUID(  0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
555
556#define HCDP_TABLE_GUID	\
557    EFI_GUID(  0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 )
558
559#define UGA_IO_PROTOCOL_GUID \
560    EFI_GUID(  0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 )
561
562#define EFI_GLOBAL_VARIABLE_GUID \
563    EFI_GUID(  0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c )
564
565#define UV_SYSTEM_TABLE_GUID \
566    EFI_GUID(  0x3b13a7d4, 0x633e, 0x11dd, 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93 )
567
568#define LINUX_EFI_CRASH_GUID \
569    EFI_GUID(  0xcfc8fc79, 0xbe2e, 0x4ddc, 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0 )
570
571#define LOADED_IMAGE_PROTOCOL_GUID \
572    EFI_GUID(  0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
573
574#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
575    EFI_GUID(  0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a )
576
577#define EFI_UGA_PROTOCOL_GUID \
578    EFI_GUID(  0x982c298b, 0xf4fa, 0x41cb, 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 )
579
580#define EFI_PCI_IO_PROTOCOL_GUID \
581    EFI_GUID(  0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a )
582
583#define EFI_FILE_INFO_ID \
584    EFI_GUID(  0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
585
586#define EFI_FILE_SYSTEM_GUID \
587    EFI_GUID(  0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
588
589#define DEVICE_TREE_GUID \
590    EFI_GUID(  0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 )
591
592typedef struct {
593	efi_guid_t guid;
594	u64 table;
595} efi_config_table_64_t;
596
597typedef struct {
598	efi_guid_t guid;
599	u32 table;
600} efi_config_table_32_t;
601
602typedef struct {
603	efi_guid_t guid;
604	unsigned long table;
605} efi_config_table_t;
606
607typedef struct {
608	efi_guid_t guid;
609	const char *name;
610	unsigned long *ptr;
611} efi_config_table_type_t;
612
613#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
614
615#define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
616#define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
617#define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
618#define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
619#define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
620#define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
621
622typedef struct {
623	efi_table_hdr_t hdr;
624	u64 fw_vendor;	/* physical addr of CHAR16 vendor string */
625	u32 fw_revision;
626	u32 __pad1;
627	u64 con_in_handle;
628	u64 con_in;
629	u64 con_out_handle;
630	u64 con_out;
631	u64 stderr_handle;
632	u64 stderr;
633	u64 runtime;
634	u64 boottime;
635	u32 nr_tables;
636	u32 __pad2;
637	u64 tables;
638} efi_system_table_64_t;
639
640typedef struct {
641	efi_table_hdr_t hdr;
642	u32 fw_vendor;	/* physical addr of CHAR16 vendor string */
643	u32 fw_revision;
644	u32 con_in_handle;
645	u32 con_in;
646	u32 con_out_handle;
647	u32 con_out;
648	u32 stderr_handle;
649	u32 stderr;
650	u32 runtime;
651	u32 boottime;
652	u32 nr_tables;
653	u32 tables;
654} efi_system_table_32_t;
655
656typedef struct {
657	efi_table_hdr_t hdr;
658	unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
659	u32 fw_revision;
660	unsigned long con_in_handle;
661	unsigned long con_in;
662	unsigned long con_out_handle;
663	unsigned long con_out;
664	unsigned long stderr_handle;
665	unsigned long stderr;
666	efi_runtime_services_t *runtime;
667	efi_boot_services_t *boottime;
668	unsigned long nr_tables;
669	unsigned long tables;
670} efi_system_table_t;
671
672struct efi_memory_map {
673	void *phys_map;
674	void *map;
675	void *map_end;
676	int nr_map;
677	unsigned long desc_version;
678	unsigned long desc_size;
679};
680
681struct efi_fdt_params {
682	u64 system_table;
683	u64 mmap;
684	u32 mmap_size;
685	u32 desc_size;
686	u32 desc_ver;
687};
688
689typedef struct {
690	u32 revision;
691	u32 parent_handle;
692	u32 system_table;
693	u32 device_handle;
694	u32 file_path;
695	u32 reserved;
696	u32 load_options_size;
697	u32 load_options;
698	u32 image_base;
699	__aligned_u64 image_size;
700	unsigned int image_code_type;
701	unsigned int image_data_type;
702	unsigned long unload;
703} efi_loaded_image_32_t;
704
705typedef struct {
706	u32 revision;
707	u64 parent_handle;
708	u64 system_table;
709	u64 device_handle;
710	u64 file_path;
711	u64 reserved;
712	u32 load_options_size;
713	u64 load_options;
714	u64 image_base;
715	__aligned_u64 image_size;
716	unsigned int image_code_type;
717	unsigned int image_data_type;
718	unsigned long unload;
719} efi_loaded_image_64_t;
720
721typedef struct {
722	u32 revision;
723	void *parent_handle;
724	efi_system_table_t *system_table;
725	void *device_handle;
726	void *file_path;
727	void *reserved;
728	u32 load_options_size;
729	void *load_options;
730	void *image_base;
731	__aligned_u64 image_size;
732	unsigned int image_code_type;
733	unsigned int image_data_type;
734	unsigned long unload;
735} efi_loaded_image_t;
736
737
738typedef struct {
739	u64 size;
740	u64 file_size;
741	u64 phys_size;
742	efi_time_t create_time;
743	efi_time_t last_access_time;
744	efi_time_t modification_time;
745	__aligned_u64 attribute;
746	efi_char16_t filename[1];
747} efi_file_info_t;
748
749typedef struct {
750	u64 revision;
751	u32 open;
752	u32 close;
753	u32 delete;
754	u32 read;
755	u32 write;
756	u32 get_position;
757	u32 set_position;
758	u32 get_info;
759	u32 set_info;
760	u32 flush;
761} efi_file_handle_32_t;
762
763typedef struct {
764	u64 revision;
765	u64 open;
766	u64 close;
767	u64 delete;
768	u64 read;
769	u64 write;
770	u64 get_position;
771	u64 set_position;
772	u64 get_info;
773	u64 set_info;
774	u64 flush;
775} efi_file_handle_64_t;
776
777typedef struct _efi_file_handle {
778	u64 revision;
779	efi_status_t (*open)(struct _efi_file_handle *,
780			     struct _efi_file_handle **,
781			     efi_char16_t *, u64, u64);
782	efi_status_t (*close)(struct _efi_file_handle *);
783	void *delete;
784	efi_status_t (*read)(struct _efi_file_handle *, unsigned long *,
785			     void *);
786	void *write;
787	void *get_position;
788	void *set_position;
789	efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *,
790			unsigned long *, void *);
791	void *set_info;
792	void *flush;
793} efi_file_handle_t;
794
795typedef struct _efi_file_io_interface {
796	u64 revision;
797	int (*open_volume)(struct _efi_file_io_interface *,
798			   efi_file_handle_t **);
799} efi_file_io_interface_t;
800
801#define EFI_FILE_MODE_READ	0x0000000000000001
802#define EFI_FILE_MODE_WRITE	0x0000000000000002
803#define EFI_FILE_MODE_CREATE	0x8000000000000000
804
805#define EFI_INVALID_TABLE_ADDR		(~0UL)
806
807/*
808 * All runtime access to EFI goes through this structure:
809 */
810extern struct efi {
811	efi_system_table_t *systab;	/* EFI system table */
812	unsigned int runtime_version;	/* Runtime services version */
813	unsigned long mps;		/* MPS table */
814	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
815	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
816	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
817	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
818	unsigned long sal_systab;	/* SAL system table */
819	unsigned long boot_info;	/* boot info table */
820	unsigned long hcdp;		/* HCDP table */
821	unsigned long uga;		/* UGA table */
822	unsigned long uv_systab;	/* UV system table */
823	unsigned long fw_vendor;	/* fw_vendor */
824	unsigned long runtime;		/* runtime table */
825	unsigned long config_table;	/* config tables */
826	efi_get_time_t *get_time;
827	efi_set_time_t *set_time;
828	efi_get_wakeup_time_t *get_wakeup_time;
829	efi_set_wakeup_time_t *set_wakeup_time;
830	efi_get_variable_t *get_variable;
831	efi_get_next_variable_t *get_next_variable;
832	efi_set_variable_t *set_variable;
833	efi_set_variable_nonblocking_t *set_variable_nonblocking;
834	efi_query_variable_info_t *query_variable_info;
835	efi_update_capsule_t *update_capsule;
836	efi_query_capsule_caps_t *query_capsule_caps;
837	efi_get_next_high_mono_count_t *get_next_high_mono_count;
838	efi_reset_system_t *reset_system;
839	efi_set_virtual_address_map_t *set_virtual_address_map;
840	struct efi_memory_map *memmap;
841	unsigned long flags;
842} efi;
843
844static inline int
845efi_guidcmp (efi_guid_t left, efi_guid_t right)
846{
847	return memcmp(&left, &right, sizeof (efi_guid_t));
848}
849
850static inline char *
851efi_guid_to_str(efi_guid_t *guid, char *out)
852{
853	sprintf(out, "%pUl", guid->b);
854        return out;
855}
856
857extern void efi_init (void);
858extern void *efi_get_pal_addr (void);
859extern void efi_map_pal_code (void);
860extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
861extern void efi_gettimeofday (struct timespec *ts);
862extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
863#ifdef CONFIG_X86
864extern void efi_late_init(void);
865extern void efi_free_boot_services(void);
866extern efi_status_t efi_query_variable_store(u32 attributes, unsigned long size);
867#else
868static inline void efi_late_init(void) {}
869static inline void efi_free_boot_services(void) {}
870
871static inline efi_status_t efi_query_variable_store(u32 attributes, unsigned long size)
872{
873	return EFI_SUCCESS;
874}
875#endif
876extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
877extern int efi_config_init(efi_config_table_type_t *arch_tables);
878extern int efi_config_parse_tables(void *config_tables, int count, int sz,
879				   efi_config_table_type_t *arch_tables);
880extern u64 efi_get_iobase (void);
881extern u32 efi_mem_type (unsigned long phys_addr);
882extern u64 efi_mem_attributes (unsigned long phys_addr);
883extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
884extern int __init efi_uart_console_only (void);
885extern void efi_initialize_iomem_resources(struct resource *code_resource,
886		struct resource *data_resource, struct resource *bss_resource);
887extern void efi_get_time(struct timespec *now);
888extern void efi_reserve_boot_services(void);
889extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose);
890extern struct efi_memory_map memmap;
891
892extern int efi_reboot_quirk_mode;
893extern bool efi_poweroff_required(void);
894
895/* Iterate through an efi_memory_map */
896#define for_each_efi_memory_desc(m, md)					   \
897	for ((md) = (m)->map;						   \
898	     (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \
899	     (md) = (void *)(md) + (m)->desc_size)
900
901/*
902 * Format an EFI memory descriptor's type and attributes to a user-provided
903 * character buffer, as per snprintf(), and return the buffer.
904 */
905char * __init efi_md_typeattr_format(char *buf, size_t size,
906				     const efi_memory_desc_t *md);
907
908/**
909 * efi_range_is_wc - check the WC bit on an address range
910 * @start: starting kvirt address
911 * @len: length of range
912 *
913 * Consult the EFI memory map and make sure it's ok to set this range WC.
914 * Returns true or false.
915 */
916static inline int efi_range_is_wc(unsigned long start, unsigned long len)
917{
918	unsigned long i;
919
920	for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
921		unsigned long paddr = __pa(start + i);
922		if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
923			return 0;
924	}
925	/* The range checked out */
926	return 1;
927}
928
929#ifdef CONFIG_EFI_PCDP
930extern int __init efi_setup_pcdp_console(char *);
931#endif
932
933/*
934 * We play games with efi_enabled so that the compiler will, if
935 * possible, remove EFI-related code altogether.
936 */
937#define EFI_BOOT		0	/* Were we booted from EFI? */
938#define EFI_SYSTEM_TABLES	1	/* Can we use EFI system tables? */
939#define EFI_CONFIG_TABLES	2	/* Can we use EFI config tables? */
940#define EFI_RUNTIME_SERVICES	3	/* Can we use runtime services? */
941#define EFI_MEMMAP		4	/* Can we use EFI memory map? */
942#define EFI_64BIT		5	/* Is the firmware 64-bit? */
943#define EFI_PARAVIRT		6	/* Access is via a paravirt interface */
944#define EFI_ARCH_1		7	/* First arch-specific bit */
945#define EFI_DBG			8	/* Print additional debug info at runtime */
946
947#ifdef CONFIG_EFI
948/*
949 * Test whether the above EFI_* bits are enabled.
950 */
951static inline bool efi_enabled(int feature)
952{
953	return test_bit(feature, &efi.flags) != 0;
954}
955extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
956#else
957static inline bool efi_enabled(int feature)
958{
959	return false;
960}
961static inline void
962efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
963#endif
964
965/*
966 * Variable Attributes
967 */
968#define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
969#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
970#define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
971#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
972#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
973#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
974#define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040
975
976#define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \
977				EFI_VARIABLE_BOOTSERVICE_ACCESS | \
978				EFI_VARIABLE_RUNTIME_ACCESS | \
979				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
980				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
981				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
982				EFI_VARIABLE_APPEND_WRITE)
983/*
984 * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
985 * not including trailing NUL
986 */
987#define EFI_VARIABLE_GUID_LEN 36
988
989/*
990 * The type of search to perform when calling boottime->locate_handle
991 */
992#define EFI_LOCATE_ALL_HANDLES			0
993#define EFI_LOCATE_BY_REGISTER_NOTIFY		1
994#define EFI_LOCATE_BY_PROTOCOL			2
995
996/*
997 * EFI Device Path information
998 */
999#define EFI_DEV_HW			0x01
1000#define  EFI_DEV_PCI				 1
1001#define  EFI_DEV_PCCARD				 2
1002#define  EFI_DEV_MEM_MAPPED			 3
1003#define  EFI_DEV_VENDOR				 4
1004#define  EFI_DEV_CONTROLLER			 5
1005#define EFI_DEV_ACPI			0x02
1006#define   EFI_DEV_BASIC_ACPI			 1
1007#define   EFI_DEV_EXPANDED_ACPI			 2
1008#define EFI_DEV_MSG			0x03
1009#define   EFI_DEV_MSG_ATAPI			 1
1010#define   EFI_DEV_MSG_SCSI			 2
1011#define   EFI_DEV_MSG_FC			 3
1012#define   EFI_DEV_MSG_1394			 4
1013#define   EFI_DEV_MSG_USB			 5
1014#define   EFI_DEV_MSG_USB_CLASS			15
1015#define   EFI_DEV_MSG_I20			 6
1016#define   EFI_DEV_MSG_MAC			11
1017#define   EFI_DEV_MSG_IPV4			12
1018#define   EFI_DEV_MSG_IPV6			13
1019#define   EFI_DEV_MSG_INFINIBAND		 9
1020#define   EFI_DEV_MSG_UART			14
1021#define   EFI_DEV_MSG_VENDOR			10
1022#define EFI_DEV_MEDIA			0x04
1023#define   EFI_DEV_MEDIA_HARD_DRIVE		 1
1024#define   EFI_DEV_MEDIA_CDROM			 2
1025#define   EFI_DEV_MEDIA_VENDOR			 3
1026#define   EFI_DEV_MEDIA_FILE			 4
1027#define   EFI_DEV_MEDIA_PROTOCOL		 5
1028#define EFI_DEV_BIOS_BOOT		0x05
1029#define EFI_DEV_END_PATH		0x7F
1030#define EFI_DEV_END_PATH2		0xFF
1031#define   EFI_DEV_END_INSTANCE			0x01
1032#define   EFI_DEV_END_ENTIRE			0xFF
1033
1034struct efi_generic_dev_path {
1035	u8 type;
1036	u8 sub_type;
1037	u16 length;
1038} __attribute ((packed));
1039
1040static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
1041{
1042	*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
1043	*addr &= PAGE_MASK;
1044}
1045
1046/*
1047 * EFI Variable support.
1048 *
1049 * Different firmware drivers can expose their EFI-like variables using
1050 * the following.
1051 */
1052
1053struct efivar_operations {
1054	efi_get_variable_t *get_variable;
1055	efi_get_next_variable_t *get_next_variable;
1056	efi_set_variable_t *set_variable;
1057	efi_set_variable_nonblocking_t *set_variable_nonblocking;
1058	efi_query_variable_store_t *query_variable_store;
1059};
1060
1061struct efivars {
1062	/*
1063	 * ->lock protects two things:
1064	 * 1) efivarfs_list and efivars_sysfs_list
1065	 * 2) ->ops calls
1066	 */
1067	spinlock_t lock;
1068	struct kset *kset;
1069	struct kobject *kobject;
1070	const struct efivar_operations *ops;
1071};
1072
1073/*
1074 * The maximum size of VariableName + Data = 1024
1075 * Therefore, it's reasonable to save that much
1076 * space in each part of the structure,
1077 * and we use a page for reading/writing.
1078 */
1079
1080#define EFI_VAR_NAME_LEN	1024
1081
1082struct efi_variable {
1083	efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1084	efi_guid_t    VendorGuid;
1085	unsigned long DataSize;
1086	__u8          Data[1024];
1087	efi_status_t  Status;
1088	__u32         Attributes;
1089} __attribute__((packed));
1090
1091struct efivar_entry {
1092	struct efi_variable var;
1093	struct list_head list;
1094	struct kobject kobj;
1095	bool scanning;
1096	bool deleting;
1097};
1098
1099struct efi_simple_text_output_protocol_32 {
1100	u32 reset;
1101	u32 output_string;
1102	u32 test_string;
1103};
1104
1105struct efi_simple_text_output_protocol_64 {
1106	u64 reset;
1107	u64 output_string;
1108	u64 test_string;
1109};
1110
1111struct efi_simple_text_output_protocol {
1112	void *reset;
1113	efi_status_t (*output_string)(void *, void *);
1114	void *test_string;
1115};
1116
1117extern struct list_head efivar_sysfs_list;
1118
1119static inline void
1120efivar_unregister(struct efivar_entry *var)
1121{
1122	kobject_put(&var->kobj);
1123}
1124
1125int efivars_register(struct efivars *efivars,
1126		     const struct efivar_operations *ops,
1127		     struct kobject *kobject);
1128int efivars_unregister(struct efivars *efivars);
1129struct kobject *efivars_kobject(void);
1130
1131int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
1132		void *data, bool atomic, bool duplicates,
1133		struct list_head *head);
1134
1135void efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
1136void efivar_entry_remove(struct efivar_entry *entry);
1137
1138int __efivar_entry_delete(struct efivar_entry *entry);
1139int efivar_entry_delete(struct efivar_entry *entry);
1140
1141int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
1142int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1143		       unsigned long *size, void *data);
1144int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1145		     unsigned long *size, void *data);
1146int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1147		     unsigned long size, void *data, struct list_head *head);
1148int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1149			      unsigned long *size, void *data, bool *set);
1150int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1151			  bool block, unsigned long size, void *data);
1152
1153void efivar_entry_iter_begin(void);
1154void efivar_entry_iter_end(void);
1155
1156int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1157			struct list_head *head, void *data,
1158			struct efivar_entry **prev);
1159int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1160		      struct list_head *head, void *data);
1161
1162struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1163				       struct list_head *head, bool remove);
1164
1165bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
1166		     unsigned long data_size);
1167bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1168				  size_t len);
1169
1170extern struct work_struct efivar_work;
1171void efivar_run_worker(void);
1172
1173#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1174int efivars_sysfs_init(void);
1175
1176#define EFIVARS_DATA_SIZE_MAX 1024
1177
1178#endif /* CONFIG_EFI_VARS */
1179
1180#ifdef CONFIG_EFI_RUNTIME_MAP
1181int efi_runtime_map_init(struct kobject *);
1182void efi_runtime_map_setup(void *, int, u32);
1183int efi_get_runtime_map_size(void);
1184int efi_get_runtime_map_desc_size(void);
1185int efi_runtime_map_copy(void *buf, size_t bufsz);
1186#else
1187static inline int efi_runtime_map_init(struct kobject *kobj)
1188{
1189	return 0;
1190}
1191
1192static inline void
1193efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {}
1194
1195static inline int efi_get_runtime_map_size(void)
1196{
1197	return 0;
1198}
1199
1200static inline int efi_get_runtime_map_desc_size(void)
1201{
1202	return 0;
1203}
1204
1205static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
1206{
1207	return 0;
1208}
1209
1210#endif
1211
1212/* prototypes shared between arch specific and generic stub code */
1213
1214#define pr_efi(sys_table, msg)     efi_printk(sys_table, "EFI stub: "msg)
1215#define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg)
1216
1217void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1218
1219void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1220	      unsigned long addr);
1221
1222char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1223			  efi_loaded_image_t *image, int *cmd_line_len);
1224
1225efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1226				efi_memory_desc_t **map,
1227				unsigned long *map_size,
1228				unsigned long *desc_size,
1229				u32 *desc_ver,
1230				unsigned long *key_ptr);
1231
1232efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1233			   unsigned long size, unsigned long align,
1234			   unsigned long *addr);
1235
1236efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1237			    unsigned long size, unsigned long align,
1238			    unsigned long *addr, unsigned long max);
1239
1240efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1241				 unsigned long *image_addr,
1242				 unsigned long image_size,
1243				 unsigned long alloc_size,
1244				 unsigned long preferred_addr,
1245				 unsigned long alignment);
1246
1247efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1248				  efi_loaded_image_t *image,
1249				  char *cmd_line, char *option_string,
1250				  unsigned long max_addr,
1251				  unsigned long *load_addr,
1252				  unsigned long *load_size);
1253
1254efi_status_t efi_parse_options(char *cmdline);
1255
1256bool efi_runtime_disabled(void);
1257#endif /* _LINUX_EFI_H */
1258