diff options
Diffstat (limited to 'include/linux/efi.h')
-rw-r--r-- | include/linux/efi.h | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/include/linux/efi.h b/include/linux/efi.h new file mode 100644 index 000000000000..047e7222df7a --- /dev/null +++ b/include/linux/efi.h | |||
@@ -0,0 +1,398 @@ | |||
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 | |||
22 | #include <asm/page.h> | ||
23 | #include <asm/system.h> | ||
24 | |||
25 | #define EFI_SUCCESS 0 | ||
26 | #define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1))) | ||
27 | #define EFI_INVALID_PARAMETER ( 2 | (1UL << (BITS_PER_LONG-1))) | ||
28 | #define EFI_UNSUPPORTED ( 3 | (1UL << (BITS_PER_LONG-1))) | ||
29 | #define EFI_BAD_BUFFER_SIZE ( 4 | (1UL << (BITS_PER_LONG-1))) | ||
30 | #define EFI_BUFFER_TOO_SMALL ( 5 | (1UL << (BITS_PER_LONG-1))) | ||
31 | #define EFI_NOT_FOUND (14 | (1UL << (BITS_PER_LONG-1))) | ||
32 | |||
33 | typedef unsigned long efi_status_t; | ||
34 | typedef u8 efi_bool_t; | ||
35 | typedef u16 efi_char16_t; /* UNICODE character */ | ||
36 | |||
37 | |||
38 | typedef struct { | ||
39 | u8 b[16]; | ||
40 | } efi_guid_t; | ||
41 | |||
42 | #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ | ||
43 | ((efi_guid_t) \ | ||
44 | {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ | ||
45 | (b) & 0xff, ((b) >> 8) & 0xff, \ | ||
46 | (c) & 0xff, ((c) >> 8) & 0xff, \ | ||
47 | (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) | ||
48 | |||
49 | /* | ||
50 | * Generic EFI table header | ||
51 | */ | ||
52 | typedef struct { | ||
53 | u64 signature; | ||
54 | u32 revision; | ||
55 | u32 headersize; | ||
56 | u32 crc32; | ||
57 | u32 reserved; | ||
58 | } efi_table_hdr_t; | ||
59 | |||
60 | /* | ||
61 | * Memory map descriptor: | ||
62 | */ | ||
63 | |||
64 | /* Memory types: */ | ||
65 | #define EFI_RESERVED_TYPE 0 | ||
66 | #define EFI_LOADER_CODE 1 | ||
67 | #define EFI_LOADER_DATA 2 | ||
68 | #define EFI_BOOT_SERVICES_CODE 3 | ||
69 | #define EFI_BOOT_SERVICES_DATA 4 | ||
70 | #define EFI_RUNTIME_SERVICES_CODE 5 | ||
71 | #define EFI_RUNTIME_SERVICES_DATA 6 | ||
72 | #define EFI_CONVENTIONAL_MEMORY 7 | ||
73 | #define EFI_UNUSABLE_MEMORY 8 | ||
74 | #define EFI_ACPI_RECLAIM_MEMORY 9 | ||
75 | #define EFI_ACPI_MEMORY_NVS 10 | ||
76 | #define EFI_MEMORY_MAPPED_IO 11 | ||
77 | #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 | ||
78 | #define EFI_PAL_CODE 13 | ||
79 | #define EFI_MAX_MEMORY_TYPE 14 | ||
80 | |||
81 | /* Attribute values: */ | ||
82 | #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ | ||
83 | #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ | ||
84 | #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ | ||
85 | #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ | ||
86 | #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ | ||
87 | #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ | ||
88 | #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ | ||
89 | #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ | ||
90 | #define EFI_MEMORY_DESCRIPTOR_VERSION 1 | ||
91 | |||
92 | #define EFI_PAGE_SHIFT 12 | ||
93 | |||
94 | /* | ||
95 | * For current x86 implementations of EFI, there is | ||
96 | * additional padding in the mem descriptors. This is not | ||
97 | * the case in ia64. Need to have this fixed in the f/w. | ||
98 | */ | ||
99 | typedef struct { | ||
100 | u32 type; | ||
101 | u32 pad; | ||
102 | u64 phys_addr; | ||
103 | u64 virt_addr; | ||
104 | u64 num_pages; | ||
105 | u64 attribute; | ||
106 | #if defined (__i386__) | ||
107 | u64 pad1; | ||
108 | #endif | ||
109 | } efi_memory_desc_t; | ||
110 | |||
111 | typedef int (*efi_freemem_callback_t) (unsigned long start, unsigned long end, void *arg); | ||
112 | |||
113 | /* | ||
114 | * Types and defines for Time Services | ||
115 | */ | ||
116 | #define EFI_TIME_ADJUST_DAYLIGHT 0x1 | ||
117 | #define EFI_TIME_IN_DAYLIGHT 0x2 | ||
118 | #define EFI_UNSPECIFIED_TIMEZONE 0x07ff | ||
119 | |||
120 | typedef struct { | ||
121 | u16 year; | ||
122 | u8 month; | ||
123 | u8 day; | ||
124 | u8 hour; | ||
125 | u8 minute; | ||
126 | u8 second; | ||
127 | u8 pad1; | ||
128 | u32 nanosecond; | ||
129 | s16 timezone; | ||
130 | u8 daylight; | ||
131 | u8 pad2; | ||
132 | } efi_time_t; | ||
133 | |||
134 | typedef struct { | ||
135 | u32 resolution; | ||
136 | u32 accuracy; | ||
137 | u8 sets_to_zero; | ||
138 | } efi_time_cap_t; | ||
139 | |||
140 | /* | ||
141 | * Types and defines for EFI ResetSystem | ||
142 | */ | ||
143 | #define EFI_RESET_COLD 0 | ||
144 | #define EFI_RESET_WARM 1 | ||
145 | #define EFI_RESET_SHUTDOWN 2 | ||
146 | |||
147 | /* | ||
148 | * EFI Runtime Services table | ||
149 | */ | ||
150 | #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) | ||
151 | #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 | ||
152 | |||
153 | typedef struct { | ||
154 | efi_table_hdr_t hdr; | ||
155 | unsigned long get_time; | ||
156 | unsigned long set_time; | ||
157 | unsigned long get_wakeup_time; | ||
158 | unsigned long set_wakeup_time; | ||
159 | unsigned long set_virtual_address_map; | ||
160 | unsigned long convert_pointer; | ||
161 | unsigned long get_variable; | ||
162 | unsigned long get_next_variable; | ||
163 | unsigned long set_variable; | ||
164 | unsigned long get_next_high_mono_count; | ||
165 | unsigned long reset_system; | ||
166 | } efi_runtime_services_t; | ||
167 | |||
168 | typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); | ||
169 | typedef efi_status_t efi_set_time_t (efi_time_t *tm); | ||
170 | typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, | ||
171 | efi_time_t *tm); | ||
172 | typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm); | ||
173 | typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, | ||
174 | unsigned long *data_size, void *data); | ||
175 | typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name, | ||
176 | efi_guid_t *vendor); | ||
177 | typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, | ||
178 | unsigned long attr, unsigned long data_size, | ||
179 | void *data); | ||
180 | typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); | ||
181 | typedef void efi_reset_system_t (int reset_type, efi_status_t status, | ||
182 | unsigned long data_size, efi_char16_t *data); | ||
183 | typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size, | ||
184 | unsigned long descriptor_size, | ||
185 | u32 descriptor_version, | ||
186 | efi_memory_desc_t *virtual_map); | ||
187 | |||
188 | /* | ||
189 | * EFI Configuration Table and GUID definitions | ||
190 | */ | ||
191 | #define NULL_GUID \ | ||
192 | EFI_GUID( 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ) | ||
193 | |||
194 | #define MPS_TABLE_GUID \ | ||
195 | EFI_GUID( 0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d ) | ||
196 | |||
197 | #define ACPI_TABLE_GUID \ | ||
198 | EFI_GUID( 0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d ) | ||
199 | |||
200 | #define ACPI_20_TABLE_GUID \ | ||
201 | EFI_GUID( 0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 ) | ||
202 | |||
203 | #define SMBIOS_TABLE_GUID \ | ||
204 | EFI_GUID( 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d ) | ||
205 | |||
206 | #define SAL_SYSTEM_TABLE_GUID \ | ||
207 | EFI_GUID( 0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d ) | ||
208 | |||
209 | #define HCDP_TABLE_GUID \ | ||
210 | EFI_GUID( 0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 ) | ||
211 | |||
212 | #define UGA_IO_PROTOCOL_GUID \ | ||
213 | EFI_GUID( 0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 ) | ||
214 | |||
215 | #define EFI_GLOBAL_VARIABLE_GUID \ | ||
216 | EFI_GUID( 0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c ) | ||
217 | |||
218 | typedef struct { | ||
219 | efi_guid_t guid; | ||
220 | unsigned long table; | ||
221 | } efi_config_table_t; | ||
222 | |||
223 | #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) | ||
224 | #define EFI_SYSTEM_TABLE_REVISION ((1 << 16) | 00) | ||
225 | |||
226 | typedef struct { | ||
227 | efi_table_hdr_t hdr; | ||
228 | unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ | ||
229 | u32 fw_revision; | ||
230 | unsigned long con_in_handle; | ||
231 | unsigned long con_in; | ||
232 | unsigned long con_out_handle; | ||
233 | unsigned long con_out; | ||
234 | unsigned long stderr_handle; | ||
235 | unsigned long stderr; | ||
236 | efi_runtime_services_t *runtime; | ||
237 | unsigned long boottime; | ||
238 | unsigned long nr_tables; | ||
239 | unsigned long tables; | ||
240 | } efi_system_table_t; | ||
241 | |||
242 | struct efi_memory_map { | ||
243 | efi_memory_desc_t *phys_map; | ||
244 | efi_memory_desc_t *map; | ||
245 | int nr_map; | ||
246 | unsigned long desc_version; | ||
247 | }; | ||
248 | |||
249 | /* | ||
250 | * All runtime access to EFI goes through this structure: | ||
251 | */ | ||
252 | extern struct efi { | ||
253 | efi_system_table_t *systab; /* EFI system table */ | ||
254 | void *mps; /* MPS table */ | ||
255 | void *acpi; /* ACPI table (IA64 ext 0.71) */ | ||
256 | void *acpi20; /* ACPI table (ACPI 2.0) */ | ||
257 | void *smbios; /* SM BIOS table */ | ||
258 | void *sal_systab; /* SAL system table */ | ||
259 | void *boot_info; /* boot info table */ | ||
260 | void *hcdp; /* HCDP table */ | ||
261 | void *uga; /* UGA table */ | ||
262 | efi_get_time_t *get_time; | ||
263 | efi_set_time_t *set_time; | ||
264 | efi_get_wakeup_time_t *get_wakeup_time; | ||
265 | efi_set_wakeup_time_t *set_wakeup_time; | ||
266 | efi_get_variable_t *get_variable; | ||
267 | efi_get_next_variable_t *get_next_variable; | ||
268 | efi_set_variable_t *set_variable; | ||
269 | efi_get_next_high_mono_count_t *get_next_high_mono_count; | ||
270 | efi_reset_system_t *reset_system; | ||
271 | efi_set_virtual_address_map_t *set_virtual_address_map; | ||
272 | } efi; | ||
273 | |||
274 | static inline int | ||
275 | efi_guidcmp (efi_guid_t left, efi_guid_t right) | ||
276 | { | ||
277 | return memcmp(&left, &right, sizeof (efi_guid_t)); | ||
278 | } | ||
279 | |||
280 | static inline char * | ||
281 | efi_guid_unparse(efi_guid_t *guid, char *out) | ||
282 | { | ||
283 | sprintf(out, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", | ||
284 | guid->b[3], guid->b[2], guid->b[1], guid->b[0], | ||
285 | guid->b[5], guid->b[4], guid->b[7], guid->b[6], | ||
286 | guid->b[8], guid->b[9], guid->b[10], guid->b[11], | ||
287 | guid->b[12], guid->b[13], guid->b[14], guid->b[15]); | ||
288 | return out; | ||
289 | } | ||
290 | |||
291 | extern void efi_init (void); | ||
292 | extern void *efi_get_pal_addr (void); | ||
293 | extern void efi_map_pal_code (void); | ||
294 | extern void efi_map_memmap(void); | ||
295 | extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg); | ||
296 | extern void efi_gettimeofday (struct timespec *ts); | ||
297 | extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */ | ||
298 | extern u64 efi_get_iobase (void); | ||
299 | extern u32 efi_mem_type (unsigned long phys_addr); | ||
300 | extern u64 efi_mem_attributes (unsigned long phys_addr); | ||
301 | extern int __init efi_uart_console_only (void); | ||
302 | extern void efi_initialize_iomem_resources(struct resource *code_resource, | ||
303 | struct resource *data_resource); | ||
304 | extern unsigned long __init efi_get_time(void); | ||
305 | extern int __init efi_set_rtc_mmss(unsigned long nowtime); | ||
306 | extern struct efi_memory_map memmap; | ||
307 | |||
308 | /** | ||
309 | * efi_range_is_wc - check the WC bit on an address range | ||
310 | * @start: starting kvirt address | ||
311 | * @len: length of range | ||
312 | * | ||
313 | * Consult the EFI memory map and make sure it's ok to set this range WC. | ||
314 | * Returns true or false. | ||
315 | */ | ||
316 | static inline int efi_range_is_wc(unsigned long start, unsigned long len) | ||
317 | { | ||
318 | int i; | ||
319 | |||
320 | for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { | ||
321 | unsigned long paddr = __pa(start + i); | ||
322 | if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) | ||
323 | return 0; | ||
324 | } | ||
325 | /* The range checked out */ | ||
326 | return 1; | ||
327 | } | ||
328 | |||
329 | #ifdef CONFIG_EFI_PCDP | ||
330 | extern int __init efi_setup_pcdp_console(char *); | ||
331 | #endif | ||
332 | |||
333 | /* | ||
334 | * We play games with efi_enabled so that the compiler will, if possible, remove | ||
335 | * EFI-related code altogether. | ||
336 | */ | ||
337 | #ifdef CONFIG_EFI | ||
338 | # ifdef CONFIG_X86 | ||
339 | extern int efi_enabled; | ||
340 | # else | ||
341 | # define efi_enabled 1 | ||
342 | # endif | ||
343 | #else | ||
344 | # define efi_enabled 0 | ||
345 | #endif | ||
346 | |||
347 | /* | ||
348 | * Variable Attributes | ||
349 | */ | ||
350 | #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 | ||
351 | #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 | ||
352 | #define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004 | ||
353 | |||
354 | /* | ||
355 | * EFI Device Path information | ||
356 | */ | ||
357 | #define EFI_DEV_HW 0x01 | ||
358 | #define EFI_DEV_PCI 1 | ||
359 | #define EFI_DEV_PCCARD 2 | ||
360 | #define EFI_DEV_MEM_MAPPED 3 | ||
361 | #define EFI_DEV_VENDOR 4 | ||
362 | #define EFI_DEV_CONTROLLER 5 | ||
363 | #define EFI_DEV_ACPI 0x02 | ||
364 | #define EFI_DEV_BASIC_ACPI 1 | ||
365 | #define EFI_DEV_EXPANDED_ACPI 2 | ||
366 | #define EFI_DEV_MSG 0x03 | ||
367 | #define EFI_DEV_MSG_ATAPI 1 | ||
368 | #define EFI_DEV_MSG_SCSI 2 | ||
369 | #define EFI_DEV_MSG_FC 3 | ||
370 | #define EFI_DEV_MSG_1394 4 | ||
371 | #define EFI_DEV_MSG_USB 5 | ||
372 | #define EFI_DEV_MSG_USB_CLASS 15 | ||
373 | #define EFI_DEV_MSG_I20 6 | ||
374 | #define EFI_DEV_MSG_MAC 11 | ||
375 | #define EFI_DEV_MSG_IPV4 12 | ||
376 | #define EFI_DEV_MSG_IPV6 13 | ||
377 | #define EFI_DEV_MSG_INFINIBAND 9 | ||
378 | #define EFI_DEV_MSG_UART 14 | ||
379 | #define EFI_DEV_MSG_VENDOR 10 | ||
380 | #define EFI_DEV_MEDIA 0x04 | ||
381 | #define EFI_DEV_MEDIA_HARD_DRIVE 1 | ||
382 | #define EFI_DEV_MEDIA_CDROM 2 | ||
383 | #define EFI_DEV_MEDIA_VENDOR 3 | ||
384 | #define EFI_DEV_MEDIA_FILE 4 | ||
385 | #define EFI_DEV_MEDIA_PROTOCOL 5 | ||
386 | #define EFI_DEV_BIOS_BOOT 0x05 | ||
387 | #define EFI_DEV_END_PATH 0x7F | ||
388 | #define EFI_DEV_END_PATH2 0xFF | ||
389 | #define EFI_DEV_END_INSTANCE 0x01 | ||
390 | #define EFI_DEV_END_ENTIRE 0xFF | ||
391 | |||
392 | struct efi_generic_dev_path { | ||
393 | u8 type; | ||
394 | u8 sub_type; | ||
395 | u16 length; | ||
396 | } __attribute ((packed)); | ||
397 | |||
398 | #endif /* _LINUX_EFI_H */ | ||