1 /******************************************************************************
2  *
3  * Name: acefiex.h - Extra OS specific defines, etc. for EFI
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #ifndef __ACEFIEX_H__
45 #define __ACEFIEX_H__
46 
47 
48 #ifndef ACPI_USE_SYSTEM_CLIBRARY
49 
50 typedef signed char                     int8_t;
51 typedef short int                       int16_t;
52 typedef int                             int32_t;
53 typedef unsigned char                   uint8_t;
54 typedef unsigned short int              uint16_t;
55 typedef unsigned int                    uint32_t;
56 typedef COMPILER_DEPENDENT_INT64        int64_t;
57 typedef COMPILER_DEPENDENT_UINT64       uint64_t;
58 
59 #endif /* ACPI_USE_SYSTEM_CLIBRARY */
60 
61 #define ACPI_EFI_ERROR(a)               (((INTN) a) < 0)
62 #define ACPI_EFI_SUCCESS                0
63 #define ACPI_EFI_LOAD_ERROR             ACPI_EFI_ERR(1)
64 #define ACPI_EFI_INVALID_PARAMETER      ACPI_EFI_ERR(2)
65 #define ACPI_EFI_UNSUPPORTED            ACPI_EFI_ERR(3)
66 #define ACPI_EFI_BAD_BUFFER_SIZE        ACPI_EFI_ERR(4)
67 #define ACPI_EFI_BUFFER_TOO_SMALL       ACPI_EFI_ERR(5)
68 #define ACPI_EFI_NOT_READY              ACPI_EFI_ERR(6)
69 #define ACPI_EFI_DEVICE_ERROR           ACPI_EFI_ERR(7)
70 #define ACPI_EFI_WRITE_PROTECTED        ACPI_EFI_ERR(8)
71 #define ACPI_EFI_OUT_OF_RESOURCES       ACPI_EFI_ERR(9)
72 #define ACPI_EFI_VOLUME_CORRUPTED       ACPI_EFI_ERR(10)
73 #define ACPI_EFI_VOLUME_FULL            ACPI_EFI_ERR(11)
74 #define ACPI_EFI_NO_MEDIA               ACPI_EFI_ERR(12)
75 #define ACPI_EFI_MEDIA_CHANGED          ACPI_EFI_ERR(13)
76 #define ACPI_EFI_NOT_FOUND              ACPI_EFI_ERR(14)
77 #define ACPI_EFI_ACCESS_DENIED          ACPI_EFI_ERR(15)
78 #define ACPI_EFI_NO_RESPONSE            ACPI_EFI_ERR(16)
79 #define ACPI_EFI_NO_MAPPING             ACPI_EFI_ERR(17)
80 #define ACPI_EFI_TIMEOUT                ACPI_EFI_ERR(18)
81 #define ACPI_EFI_NOT_STARTED            ACPI_EFI_ERR(19)
82 #define ACPI_EFI_ALREADY_STARTED        ACPI_EFI_ERR(20)
83 #define ACPI_EFI_ABORTED                ACPI_EFI_ERR(21)
84 #define ACPI_EFI_PROTOCOL_ERROR         ACPI_EFI_ERR(24)
85 
86 
87 typedef UINTN ACPI_EFI_STATUS;
88 typedef VOID *ACPI_EFI_HANDLE;
89 typedef VOID *ACPI_EFI_EVENT;
90 
91 typedef struct {
92     UINT32  Data1;
93     UINT16  Data2;
94     UINT16  Data3;
95     UINT8   Data4[8];
96 } ACPI_EFI_GUID;
97 
98 typedef struct {
99     UINT16 Year;       /* 1998 - 20XX */
100     UINT8  Month;      /* 1 - 12 */
101     UINT8  Day;        /* 1 - 31 */
102     UINT8  Hour;       /* 0 - 23 */
103     UINT8  Minute;     /* 0 - 59 */
104     UINT8  Second;     /* 0 - 59 */
105     UINT8  Pad1;
106     UINT32 Nanosecond; /* 0 - 999,999,999 */
107     INT16  TimeZone;   /* -1440 to 1440 or 2047 */
108     UINT8  Daylight;
109     UINT8  Pad2;
110 } ACPI_EFI_TIME;
111 
112 typedef struct _ACPI_EFI_DEVICE_PATH {
113         UINT8                           Type;
114         UINT8                           SubType;
115         UINT8                           Length[2];
116 } ACPI_EFI_DEVICE_PATH;
117 
118 typedef UINT64          ACPI_EFI_PHYSICAL_ADDRESS;
119 typedef UINT64          ACPI_EFI_VIRTUAL_ADDRESS;
120 
121 typedef enum {
122     AcpiEfiAllocateAnyPages,
123     AcpiEfiAllocateMaxAddress,
124     AcpiEfiAllocateAddress,
125     AcpiEfiMaxAllocateType
126 } ACPI_EFI_ALLOCATE_TYPE;
127 
128 typedef enum {
129     AcpiEfiReservedMemoryType,
130     AcpiEfiLoaderCode,
131     AcpiEfiLoaderData,
132     AcpiEfiBootServicesCode,
133     AcpiEfiBootServicesData,
134     AcpiEfiRuntimeServicesCode,
135     AcpiEfiRuntimeServicesData,
136     AcpiEfiConventionalMemory,
137     AcpiEfiUnusableMemory,
138     AcpiEfiACPIReclaimMemory,
139     AcpiEfiACPIMemoryNVS,
140     AcpiEfiMemoryMappedIO,
141     AcpiEfiMemoryMappedIOPortSpace,
142     AcpiEfiPalCode,
143     AcpiEfiMaxMemoryType
144 } ACPI_EFI_MEMORY_TYPE;
145 
146 /* possible caching types for the memory range */
147 #define ACPI_EFI_MEMORY_UC      0x0000000000000001
148 #define ACPI_EFI_MEMORY_WC      0x0000000000000002
149 #define ACPI_EFI_MEMORY_WT      0x0000000000000004
150 #define ACPI_EFI_MEMORY_WB      0x0000000000000008
151 #define ACPI_EFI_MEMORY_UCE     0x0000000000000010
152 
153 /* physical memory protection on range */
154 #define ACPI_EFI_MEMORY_WP      0x0000000000001000
155 #define ACPI_EFI_MEMORY_RP      0x0000000000002000
156 #define ACPI_EFI_MEMORY_XP      0x0000000000004000
157 
158 /* range requires a runtime mapping */
159 #define ACPI_EFI_MEMORY_RUNTIME 0x8000000000000000
160 
161 #define ACPI_EFI_MEMORY_DESCRIPTOR_VERSION  1
162 typedef struct {
163     UINT32                          Type;
164     UINT32                          Pad;
165     ACPI_EFI_PHYSICAL_ADDRESS       PhysicalStart;
166     ACPI_EFI_VIRTUAL_ADDRESS        VirtualStart;
167     UINT64                          NumberOfPages;
168     UINT64                          Attribute;
169 } ACPI_EFI_MEMORY_DESCRIPTOR;
170 
171 typedef struct _ACPI_EFI_TABLE_HEARDER {
172     UINT64                      Signature;
173     UINT32                      Revision;
174     UINT32                      HeaderSize;
175     UINT32                      CRC32;
176     UINT32                      Reserved;
177 } ACPI_EFI_TABLE_HEADER;
178 
179 typedef
180 ACPI_EFI_STATUS
181 (ACPI_EFI_API *ACPI_EFI_UNKNOWN_INTERFACE) (
182     void);
183 
184 
185 /*
186  * Text output protocol
187  */
188 #define ACPI_SIMPLE_TEXT_OUTPUT_PROTOCOL \
189     { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
190 
191 typedef
192 ACPI_EFI_STATUS
193 (ACPI_EFI_API *ACPI_EFI_TEXT_RESET) (
194     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
195     BOOLEAN                                     ExtendedVerification);
196 
197 typedef
198 ACPI_EFI_STATUS
199 (ACPI_EFI_API *ACPI_EFI_TEXT_OUTPUT_STRING) (
200     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
201     CHAR16                                      *String);
202 
203 typedef
204 ACPI_EFI_STATUS
205 (ACPI_EFI_API *ACPI_EFI_TEXT_TEST_STRING) (
206     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
207     CHAR16                                      *String);
208 
209 typedef
210 ACPI_EFI_STATUS
211 (ACPI_EFI_API *ACPI_EFI_TEXT_QUERY_MODE) (
212     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
213     UINTN                                       ModeNumber,
214     UINTN                                       *Columns,
215     UINTN                                       *Rows);
216 
217 typedef
218 ACPI_EFI_STATUS
219 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_MODE) (
220     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
221     UINTN                                       ModeNumber);
222 
223 typedef
224 ACPI_EFI_STATUS
225 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_ATTRIBUTE) (
226     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
227     UINTN                                       Attribute);
228 
229 typedef
230 ACPI_EFI_STATUS
231 (ACPI_EFI_API *ACPI_EFI_TEXT_CLEAR_SCREEN) (
232     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This);
233 
234 typedef
235 ACPI_EFI_STATUS
236 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_CURSOR_POSITION) (
237     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
238     UINTN                                       Column,
239     UINTN                                       Row);
240 
241 typedef
242 ACPI_EFI_STATUS
243 (ACPI_EFI_API *ACPI_EFI_TEXT_ENABLE_CURSOR) (
244     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
245     BOOLEAN                                     Enable);
246 
247 typedef struct {
248     INT32                           MaxMode;
249     INT32                           Mode;
250     INT32                           Attribute;
251     INT32                           CursorColumn;
252     INT32                           CursorRow;
253     BOOLEAN                         CursorVisible;
254 } ACPI_SIMPLE_TEXT_OUTPUT_MODE;
255 
256 typedef struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE {
257     ACPI_EFI_TEXT_RESET                 Reset;
258 
259     ACPI_EFI_TEXT_OUTPUT_STRING         OutputString;
260     ACPI_EFI_TEXT_TEST_STRING           TestString;
261 
262     ACPI_EFI_TEXT_QUERY_MODE            QueryMode;
263     ACPI_EFI_TEXT_SET_MODE              SetMode;
264     ACPI_EFI_TEXT_SET_ATTRIBUTE         SetAttribute;
265 
266     ACPI_EFI_TEXT_CLEAR_SCREEN          ClearScreen;
267     ACPI_EFI_TEXT_SET_CURSOR_POSITION   SetCursorPosition;
268     ACPI_EFI_TEXT_ENABLE_CURSOR         EnableCursor;
269 
270     ACPI_SIMPLE_TEXT_OUTPUT_MODE        *Mode;
271 } ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE;
272 
273 /*
274  * Text input protocol
275  */
276 #define ACPI_SIMPLE_TEXT_INPUT_PROTOCOL  \
277     { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
278 
279 typedef struct {
280     UINT16                              ScanCode;
281     CHAR16                              UnicodeChar;
282 } ACPI_EFI_INPUT_KEY;
283 
284 /*
285  * Baseline unicode control chars
286  */
287 #define CHAR_NULL                       0x0000
288 #define CHAR_BACKSPACE                  0x0008
289 #define CHAR_TAB                        0x0009
290 #define CHAR_LINEFEED                   0x000A
291 #define CHAR_CARRIAGE_RETURN            0x000D
292 
293 typedef
294 ACPI_EFI_STATUS
295 (ACPI_EFI_API *ACPI_EFI_INPUT_RESET) (
296     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
297     BOOLEAN                                     ExtendedVerification);
298 
299 typedef
300 ACPI_EFI_STATUS
301 (ACPI_EFI_API *ACPI_EFI_INPUT_READ_KEY) (
302     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
303     ACPI_EFI_INPUT_KEY                          *Key);
304 
305 typedef struct _ACPI_SIMPLE_INPUT_INTERFACE {
306     ACPI_EFI_INPUT_RESET                    Reset;
307     ACPI_EFI_INPUT_READ_KEY                 ReadKeyStroke;
308     ACPI_EFI_EVENT                          WaitForKey;
309 } ACPI_SIMPLE_INPUT_INTERFACE;
310 
311 
312 /*
313  * Simple file system protocol
314  */
315 #define ACPI_SIMPLE_FILE_SYSTEM_PROTOCOL \
316     { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
317 
318 typedef
319 ACPI_EFI_STATUS
320 (ACPI_EFI_API *ACPI_EFI_VOLUME_OPEN) (
321     struct _ACPI_EFI_FILE_IO_INTERFACE          *This,
322     struct _ACPI_EFI_FILE_HANDLE                **Root);
323 
324 #define ACPI_EFI_FILE_IO_INTERFACE_REVISION     0x00010000
325 
326 typedef struct _ACPI_EFI_FILE_IO_INTERFACE {
327     UINT64                  Revision;
328     ACPI_EFI_VOLUME_OPEN    OpenVolume;
329 } ACPI_EFI_FILE_IO_INTERFACE;
330 
331 typedef
332 ACPI_EFI_STATUS
333 (ACPI_EFI_API *ACPI_EFI_FILE_OPEN) (
334     struct _ACPI_EFI_FILE_HANDLE                *File,
335     struct _ACPI_EFI_FILE_HANDLE                **NewHandle,
336     CHAR16                                      *FileName,
337     UINT64                                      OpenMode,
338     UINT64                                      Attributes);
339 
340 /* Values for OpenMode used above */
341 
342 #define ACPI_EFI_FILE_MODE_READ     0x0000000000000001
343 #define ACPI_EFI_FILE_MODE_WRITE    0x0000000000000002
344 #define ACPI_EFI_FILE_MODE_CREATE   0x8000000000000000
345 
346 /* Values for Attribute used above */
347 
348 #define ACPI_EFI_FILE_READ_ONLY     0x0000000000000001
349 #define ACPI_EFI_FILE_HIDDEN        0x0000000000000002
350 #define ACPI_EFI_FILE_SYSTEM        0x0000000000000004
351 #define ACPI_EFI_FILE_RESERVIED     0x0000000000000008
352 #define ACPI_EFI_FILE_DIRECTORY     0x0000000000000010
353 #define ACPI_EFI_FILE_ARCHIVE       0x0000000000000020
354 #define ACPI_EFI_FILE_VALID_ATTR    0x0000000000000037
355 
356 typedef
357 ACPI_EFI_STATUS
358 (ACPI_EFI_API *ACPI_EFI_FILE_CLOSE) (
359     struct _ACPI_EFI_FILE_HANDLE                *File);
360 
361 typedef
362 ACPI_EFI_STATUS
363 (ACPI_EFI_API *ACPI_EFI_FILE_DELETE) (
364     struct _ACPI_EFI_FILE_HANDLE                *File);
365 
366 typedef
367 ACPI_EFI_STATUS
368 (ACPI_EFI_API *ACPI_EFI_FILE_READ) (
369     struct _ACPI_EFI_FILE_HANDLE                *File,
370     UINTN                                       *BufferSize,
371     VOID                                        *Buffer);
372 
373 typedef
374 ACPI_EFI_STATUS
375 (ACPI_EFI_API *ACPI_EFI_FILE_WRITE) (
376     struct _ACPI_EFI_FILE_HANDLE                *File,
377     UINTN                                       *BufferSize,
378     VOID                                        *Buffer);
379 
380 typedef
381 ACPI_EFI_STATUS
382 (ACPI_EFI_API *ACPI_EFI_FILE_SET_POSITION) (
383     struct _ACPI_EFI_FILE_HANDLE                *File,
384     UINT64                                      Position);
385 
386 typedef
387 ACPI_EFI_STATUS
388 (ACPI_EFI_API *ACPI_EFI_FILE_GET_POSITION) (
389     struct _ACPI_EFI_FILE_HANDLE                *File,
390     UINT64                                      *Position);
391 
392 #define ACPI_EFI_FILE_INFO_ID \
393     { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
394 
395 typedef struct {
396     UINT64 Size;
397     UINT64 FileSize;
398     UINT64 PhysicalSize;
399     ACPI_EFI_TIME CreateTime;
400     ACPI_EFI_TIME LastAccessTime;
401     ACPI_EFI_TIME ModificationTime;
402     UINT64 Attribute;
403     CHAR16 FileName[1];
404 } ACPI_EFI_FILE_INFO;
405 
406 #define SIZE_OF_ACPI_EFI_FILE_INFO  ACPI_OFFSET(ACPI_EFI_FILE_INFO, FileName)
407 
408 typedef
409 ACPI_EFI_STATUS
410 (ACPI_EFI_API *ACPI_EFI_FILE_GET_INFO) (
411     struct _ACPI_EFI_FILE_HANDLE                *File,
412     ACPI_EFI_GUID                               *InformationType,
413     UINTN                                       *BufferSize,
414     VOID                                        *Buffer);
415 
416 typedef
417 ACPI_EFI_STATUS
418 (ACPI_EFI_API *ACPI_EFI_FILE_SET_INFO) (
419     struct _ACPI_EFI_FILE_HANDLE                *File,
420     ACPI_EFI_GUID                               *InformationType,
421     UINTN                                       BufferSize,
422     VOID                                        *Buffer);
423 
424 typedef
425 ACPI_EFI_STATUS
426 (ACPI_EFI_API *ACPI_EFI_FILE_FLUSH) (
427     struct _ACPI_EFI_FILE_HANDLE                *File);
428 
429 
430 #define ACPI_EFI_FILE_HANDLE_REVISION           0x00010000
431 
432 typedef struct _ACPI_EFI_FILE_HANDLE {
433     UINT64                      Revision;
434     ACPI_EFI_FILE_OPEN          Open;
435     ACPI_EFI_FILE_CLOSE         Close;
436     ACPI_EFI_FILE_DELETE        Delete;
437     ACPI_EFI_FILE_READ          Read;
438     ACPI_EFI_FILE_WRITE         Write;
439     ACPI_EFI_FILE_GET_POSITION  GetPosition;
440     ACPI_EFI_FILE_SET_POSITION  SetPosition;
441     ACPI_EFI_FILE_GET_INFO      GetInfo;
442     ACPI_EFI_FILE_SET_INFO      SetInfo;
443     ACPI_EFI_FILE_FLUSH         Flush;
444 } ACPI_EFI_FILE_STRUCT, *ACPI_EFI_FILE_HANDLE;
445 
446 
447 /*
448  * Loaded image protocol
449  */
450 #define ACPI_EFI_LOADED_IMAGE_PROTOCOL \
451     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
452 
453 typedef
454 ACPI_EFI_STATUS
455 (ACPI_EFI_API *ACPI_EFI_IMAGE_ENTRY_POINT) (
456     ACPI_EFI_HANDLE                         ImageHandle,
457     struct _ACPI_EFI_SYSTEM_TABLE           *SystemTable);
458 
459 typedef
460 ACPI_EFI_STATUS
461 (ACPI_EFI_API *ACPI_EFI_IMAGE_LOAD) (
462     BOOLEAN                         BootPolicy,
463     ACPI_EFI_HANDLE                 ParentImageHandle,
464     ACPI_EFI_DEVICE_PATH            *FilePath,
465     VOID                            *SourceBuffer,
466     UINTN                           SourceSize,
467     ACPI_EFI_HANDLE                 *ImageHandle);
468 
469 typedef
470 ACPI_EFI_STATUS
471 (ACPI_EFI_API *ACPI_EFI_IMAGE_START) (
472     ACPI_EFI_HANDLE                 ImageHandle,
473     UINTN                           *ExitDataSize,
474     CHAR16                          **ExitData);
475 
476 typedef
477 ACPI_EFI_STATUS
478 (ACPI_EFI_API *ACPI_EFI_EXIT) (
479     ACPI_EFI_HANDLE                 ImageHandle,
480     ACPI_EFI_STATUS                 ExitStatus,
481     UINTN                           ExitDataSize,
482     CHAR16                          *ExitData);
483 
484 typedef
485 ACPI_EFI_STATUS
486 (ACPI_EFI_API *ACPI_EFI_IMAGE_UNLOAD) (
487     ACPI_EFI_HANDLE                 ImageHandle);
488 
489 
490 typedef
491 ACPI_EFI_STATUS
492 (ACPI_EFI_API *ACPI_EFI_SET_WATCHDOG_TIMER) (
493     UINTN                           Timeout,
494     UINT64                          WatchdogCode,
495     UINTN                           DataSize,
496     CHAR16                          *WatchdogData);
497 
498 
499 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
500 typedef struct {
501     UINT32                          Revision;
502     ACPI_EFI_HANDLE                 ParentHandle;
503     struct _ACPI_EFI_SYSTEM_TABLE   *SystemTable;
504     ACPI_EFI_HANDLE                 DeviceHandle;
505     ACPI_EFI_DEVICE_PATH            *FilePath;
506     VOID                            *Reserved;
507     UINT32                          LoadOptionsSize;
508     VOID                            *LoadOptions;
509     VOID                            *ImageBase;
510     UINT64                          ImageSize;
511     ACPI_EFI_MEMORY_TYPE            ImageCodeType;
512     ACPI_EFI_MEMORY_TYPE            ImageDataType;
513     ACPI_EFI_IMAGE_UNLOAD           Unload;
514 
515 } ACPI_EFI_LOADED_IMAGE;
516 
517 
518 /*
519  * EFI Memory
520  */
521 typedef
522 ACPI_EFI_STATUS
523 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_PAGES) (
524     ACPI_EFI_ALLOCATE_TYPE          Type,
525     ACPI_EFI_MEMORY_TYPE            MemoryType,
526     UINTN                           NoPages,
527     ACPI_EFI_PHYSICAL_ADDRESS       *Memory);
528 
529 typedef
530 ACPI_EFI_STATUS
531 (ACPI_EFI_API *ACPI_EFI_FREE_PAGES) (
532     ACPI_EFI_PHYSICAL_ADDRESS       Memory,
533     UINTN                           NoPages);
534 
535 typedef
536 ACPI_EFI_STATUS
537 (ACPI_EFI_API *ACPI_EFI_GET_MEMORY_MAP) (
538     UINTN                           *MemoryMapSize,
539     ACPI_EFI_MEMORY_DESCRIPTOR      *MemoryMap,
540     UINTN                           *MapKey,
541     UINTN                           *DescriptorSize,
542     UINT32                          *DescriptorVersion);
543 
544 #define NextMemoryDescriptor(Ptr,Size)  ((ACPI_EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
545 
546 typedef
547 ACPI_EFI_STATUS
548 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_POOL) (
549     ACPI_EFI_MEMORY_TYPE            PoolType,
550     UINTN                           Size,
551     VOID                            **Buffer);
552 
553 typedef
554 ACPI_EFI_STATUS
555 (ACPI_EFI_API *ACPI_EFI_FREE_POOL) (
556     VOID                            *Buffer);
557 
558 
559 /*
560  * Protocol handler functions
561  */
562 typedef enum {
563     ACPI_EFI_NATIVE_INTERFACE,
564     ACPI_EFI_PCODE_INTERFACE
565 } ACPI_EFI_INTERFACE_TYPE;
566 
567 typedef enum {
568     AcpiEfiAllHandles,
569     AcpiEfiByRegisterNotify,
570     AcpiEfiByProtocol
571 } ACPI_EFI_LOCATE_SEARCH_TYPE;
572 
573 typedef
574 ACPI_EFI_STATUS
575 (ACPI_EFI_API *ACPI_EFI_INSTALL_PROTOCOL_INTERFACE) (
576     ACPI_EFI_HANDLE                 *Handle,
577     ACPI_EFI_GUID                   *Protocol,
578     ACPI_EFI_INTERFACE_TYPE         InterfaceType,
579     VOID                            *Interface);
580 
581 typedef
582 ACPI_EFI_STATUS
583 (ACPI_EFI_API *ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE) (
584     ACPI_EFI_HANDLE                 Handle,
585     ACPI_EFI_GUID                   *Protocol,
586     VOID                            *OldInterface,
587     VOID                            *NewInterface);
588 
589 typedef
590 ACPI_EFI_STATUS
591 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE) (
592     ACPI_EFI_HANDLE                 Handle,
593     ACPI_EFI_GUID                   *Protocol,
594     VOID                            *Interface);
595 
596 typedef
597 ACPI_EFI_STATUS
598 (ACPI_EFI_API *ACPI_EFI_HANDLE_PROTOCOL) (
599     ACPI_EFI_HANDLE                 Handle,
600     ACPI_EFI_GUID                   *Protocol,
601     VOID                            **Interface);
602 
603 typedef
604 ACPI_EFI_STATUS
605 (ACPI_EFI_API *ACPI_EFI_REGISTER_PROTOCOL_NOTIFY) (
606     ACPI_EFI_GUID                   *Protocol,
607     ACPI_EFI_EVENT                  Event,
608     VOID                            **Registration);
609 
610 typedef
611 ACPI_EFI_STATUS
612 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE) (
613     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
614     ACPI_EFI_GUID                   *Protocol,
615     VOID                            *SearchKey,
616     UINTN                           *BufferSize,
617     ACPI_EFI_HANDLE                 *Buffer);
618 
619 typedef
620 ACPI_EFI_STATUS
621 (ACPI_EFI_API *ACPI_EFI_LOCATE_DEVICE_PATH) (
622     ACPI_EFI_GUID                   *Protocol,
623     ACPI_EFI_DEVICE_PATH            **DevicePath,
624     ACPI_EFI_HANDLE                 *Device);
625 
626 typedef
627 ACPI_EFI_STATUS
628 (ACPI_EFI_API *ACPI_EFI_INSTALL_CONFIGURATION_TABLE) (
629     ACPI_EFI_GUID                   *Guid,
630     VOID                            *Table);
631 
632 #define ACPI_EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
633 #define ACPI_EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
634 #define ACPI_EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
635 #define ACPI_EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
636 #define ACPI_EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
637 #define ACPI_EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
638 
639 typedef
640 ACPI_EFI_STATUS
641 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL) (
642     ACPI_EFI_HANDLE                 Handle,
643     ACPI_EFI_GUID                   *Protocol,
644     VOID                            **Interface,
645     ACPI_EFI_HANDLE                 AgentHandle,
646     ACPI_EFI_HANDLE                 ControllerHandle,
647     UINT32                          Attributes);
648 
649 typedef
650 ACPI_EFI_STATUS
651 (ACPI_EFI_API *ACPI_EFI_CLOSE_PROTOCOL) (
652     ACPI_EFI_HANDLE                 Handle,
653     ACPI_EFI_GUID                   *Protocol,
654     ACPI_EFI_HANDLE                 AgentHandle,
655     ACPI_EFI_HANDLE                 ControllerHandle);
656 
657 typedef struct {
658     ACPI_EFI_HANDLE                 AgentHandle;
659     ACPI_EFI_HANDLE                 ControllerHandle;
660     UINT32                          Attributes;
661     UINT32                          OpenCount;
662 } ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
663 
664 typedef
665 ACPI_EFI_STATUS
666 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL_INFORMATION) (
667     ACPI_EFI_HANDLE                 Handle,
668     ACPI_EFI_GUID                   *Protocol,
669     ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
670     UINTN                           *EntryCount);
671 
672 typedef
673 ACPI_EFI_STATUS
674 (ACPI_EFI_API *ACPI_EFI_PROTOCOLS_PER_HANDLE) (
675     ACPI_EFI_HANDLE                 Handle,
676     ACPI_EFI_GUID                   ***ProtocolBuffer,
677     UINTN                           *ProtocolBufferCount);
678 
679 typedef
680 ACPI_EFI_STATUS
681 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE_BUFFER) (
682     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
683     ACPI_EFI_GUID                   *Protocol,
684     VOID                            *SearchKey,
685     UINTN                           *NoHandles,
686     ACPI_EFI_HANDLE                 **Buffer);
687 
688 typedef
689 ACPI_EFI_STATUS
690 (ACPI_EFI_API *ACPI_EFI_LOCATE_PROTOCOL) (
691     ACPI_EFI_GUID                   *Protocol,
692     VOID                            *Registration,
693     VOID                            **Interface);
694 
695 typedef
696 ACPI_EFI_STATUS
697 (ACPI_EFI_API *ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
698     ACPI_EFI_HANDLE                 *Handle,
699     ...);
700 
701 typedef
702 ACPI_EFI_STATUS
703 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
704     ACPI_EFI_HANDLE                 Handle,
705     ...);
706 
707 typedef
708 ACPI_EFI_STATUS
709 (ACPI_EFI_API *ACPI_EFI_CALCULATE_CRC32) (
710     VOID                            *Data,
711     UINTN                           DataSize,
712     UINT32                          *Crc32);
713 
714 typedef
715 VOID
716 (ACPI_EFI_API *ACPI_EFI_COPY_MEM) (
717     VOID                            *Destination,
718     VOID                            *Source,
719     UINTN                           Length);
720 
721 typedef
722 VOID
723 (ACPI_EFI_API *ACPI_EFI_SET_MEM) (
724     VOID                            *Buffer,
725     UINTN                           Size,
726     UINT8                           Value);
727 
728 /*
729  * EFI Boot Services Table
730  */
731 #define ACPI_EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
732 #define ACPI_EFI_BOOT_SERVICES_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
733 
734 typedef struct _ACPI_EFI_BOOT_SERVICES {
735     ACPI_EFI_TABLE_HEADER               Hdr;
736 
737 #if 0
738     ACPI_EFI_RAISE_TPL                  RaiseTPL;
739     ACPI_EFI_RESTORE_TPL                RestoreTPL;
740 #else
741     ACPI_EFI_UNKNOWN_INTERFACE          RaiseTPL;
742     ACPI_EFI_UNKNOWN_INTERFACE          RestoreTPL;
743 #endif
744 
745     ACPI_EFI_ALLOCATE_PAGES             AllocatePages;
746     ACPI_EFI_FREE_PAGES                 FreePages;
747     ACPI_EFI_GET_MEMORY_MAP             GetMemoryMap;
748     ACPI_EFI_ALLOCATE_POOL              AllocatePool;
749     ACPI_EFI_FREE_POOL                  FreePool;
750 
751 #if 0
752     ACPI_EFI_CREATE_EVENT               CreateEvent;
753     ACPI_EFI_SET_TIMER                  SetTimer;
754     ACPI_EFI_WAIT_FOR_EVENT             WaitForEvent;
755     ACPI_EFI_SIGNAL_EVENT               SignalEvent;
756     ACPI_EFI_CLOSE_EVENT                CloseEvent;
757     ACPI_EFI_CHECK_EVENT                CheckEvent;
758 #else
759     ACPI_EFI_UNKNOWN_INTERFACE          CreateEvent;
760     ACPI_EFI_UNKNOWN_INTERFACE          SetTimer;
761     ACPI_EFI_UNKNOWN_INTERFACE          WaitForEvent;
762     ACPI_EFI_UNKNOWN_INTERFACE          SignalEvent;
763     ACPI_EFI_UNKNOWN_INTERFACE          CloseEvent;
764     ACPI_EFI_UNKNOWN_INTERFACE          CheckEvent;
765 #endif
766 
767     ACPI_EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
768     ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
769     ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
770     ACPI_EFI_HANDLE_PROTOCOL            HandleProtocol;
771     ACPI_EFI_HANDLE_PROTOCOL            PCHandleProtocol;
772     ACPI_EFI_REGISTER_PROTOCOL_NOTIFY   RegisterProtocolNotify;
773     ACPI_EFI_LOCATE_HANDLE              LocateHandle;
774     ACPI_EFI_LOCATE_DEVICE_PATH         LocateDevicePath;
775     ACPI_EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
776 
777     ACPI_EFI_IMAGE_LOAD                 LoadImage;
778     ACPI_EFI_IMAGE_START                StartImage;
779     ACPI_EFI_EXIT                       Exit;
780     ACPI_EFI_IMAGE_UNLOAD               UnloadImage;
781 
782 #if 0
783     ACPI_EFI_EXIT_BOOT_SERVICES         ExitBootServices;
784     ACPI_EFI_GET_NEXT_MONOTONIC_COUNT   GetNextMonotonicCount;
785     ACPI_EFI_STALL                      Stall;
786 #else
787     ACPI_EFI_UNKNOWN_INTERFACE          ExitBootServices;
788     ACPI_EFI_UNKNOWN_INTERFACE          GetNextMonotonicCount;
789     ACPI_EFI_UNKNOWN_INTERFACE          Stall;
790 #endif
791     ACPI_EFI_SET_WATCHDOG_TIMER         SetWatchdogTimer;
792 
793 #if 0
794     ACPI_EFI_CONNECT_CONTROLLER         ConnectController;
795     ACPI_EFI_DISCONNECT_CONTROLLER      DisconnectController;
796 #else
797     ACPI_EFI_UNKNOWN_INTERFACE          ConnectController;
798     ACPI_EFI_UNKNOWN_INTERFACE          DisconnectController;
799 #endif
800 
801     ACPI_EFI_OPEN_PROTOCOL              OpenProtocol;
802     ACPI_EFI_CLOSE_PROTOCOL             CloseProtocol;
803     ACPI_EFI_OPEN_PROTOCOL_INFORMATION  OpenProtocolInformation;
804     ACPI_EFI_PROTOCOLS_PER_HANDLE       ProtocolsPerHandle;
805     ACPI_EFI_LOCATE_HANDLE_BUFFER       LocateHandleBuffer;
806     ACPI_EFI_LOCATE_PROTOCOL            LocateProtocol;
807     ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
808     ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
809 
810     ACPI_EFI_CALCULATE_CRC32        CalculateCrc32;
811 
812     ACPI_EFI_COPY_MEM               CopyMem;
813     ACPI_EFI_SET_MEM                SetMem;
814 
815 #if 0
816     ACPI_EFI_CREATE_EVENT_EX        CreateEventEx;
817 #else
818     ACPI_EFI_UNKNOWN_INTERFACE      CreateEventEx;
819 #endif
820 } ACPI_EFI_BOOT_SERVICES;
821 
822 
823 /*
824  * EFI System Table
825  */
826 
827 /*
828  * EFI Configuration Table and GUID definitions
829  */
830 #define ACPI_TABLE_GUID \
831     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
832 #define ACPI_20_TABLE_GUID \
833     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
834 
835 typedef struct _ACPI_EFI_CONFIGURATION_TABLE {
836     ACPI_EFI_GUID           VendorGuid;
837     VOID                    *VendorTable;
838 } ACPI_EFI_CONFIGURATION_TABLE;
839 
840 
841 #define ACPI_EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
842 #define ACPI_EFI_SYSTEM_TABLE_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
843 
844 typedef struct _ACPI_EFI_SYSTEM_TABLE {
845     ACPI_EFI_TABLE_HEADER               Hdr;
846 
847     CHAR16                              *FirmwareVendor;
848     UINT32                              FirmwareRevision;
849 
850     ACPI_EFI_HANDLE                     ConsoleInHandle;
851     ACPI_SIMPLE_INPUT_INTERFACE         *ConIn;
852 
853     ACPI_EFI_HANDLE                     ConsoleOutHandle;
854     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *ConOut;
855 
856     ACPI_EFI_HANDLE                     StandardErrorHandle;
857     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *StdErr;
858 
859 #if 0
860     ACPI_EFI_RUNTIME_SERVICES           *RuntimeServices;
861 #else
862     ACPI_EFI_HANDLE                     *RuntimeServices;
863 #endif
864     ACPI_EFI_BOOT_SERVICES              *BootServices;
865 
866     UINTN                               NumberOfTableEntries;
867     ACPI_EFI_CONFIGURATION_TABLE        *ConfigurationTable;
868 
869 } ACPI_EFI_SYSTEM_TABLE;
870 
871 
872 /*
873  * EFI PCI I/O Protocol
874  */
875 #define ACPI_EFI_PCI_IO_PROTOCOL \
876     { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a} }
877 
878 typedef enum {
879     AcpiEfiPciIoWidthUint8 = 0,
880     AcpiEfiPciIoWidthUint16,
881     AcpiEfiPciIoWidthUint32,
882     AcpiEfiPciIoWidthUint64,
883     AcpiEfiPciIoWidthFifoUint8,
884     AcpiEfiPciIoWidthFifoUint16,
885     AcpiEfiPciIoWidthFifoUint32,
886     AcpiEfiPciIoWidthFifoUint64,
887     AcpiEfiPciIoWidthFillUint8,
888     AcpiEfiPciIoWidthFillUint16,
889     AcpiEfiPciIoWidthFillUint32,
890     AcpiEfiPciIoWidthFillUint64,
891     AcpiEfiPciIoWidthMaximum
892 } ACPI_EFI_PCI_IO_PROTOCOL_WIDTH;
893 
894 typedef
895 ACPI_EFI_STATUS
896 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_CONFIG)(
897     struct _ACPI_EFI_PCI_IO             *This,
898     ACPI_EFI_PCI_IO_PROTOCOL_WIDTH      Width,
899     UINT32                              Offset,
900     UINTN                               Count,
901     VOID                                *Buffer);
902 
903 typedef struct {
904     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Read;
905     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Write;
906 } ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
907 
908 typedef
909 ACPI_EFI_STATUS
910 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION)(
911     struct _ACPI_EFI_PCI_IO             *This,
912     UINTN                               *SegmentNumber,
913     UINTN                               *BusNumber,
914     UINTN                               *DeviceNumber,
915     UINTN                               *FunctionNumber);
916 
917 typedef struct _ACPI_EFI_PCI_IO {
918     ACPI_EFI_UNKNOWN_INTERFACE          PollMem;
919     ACPI_EFI_UNKNOWN_INTERFACE          PollIo;
920     ACPI_EFI_UNKNOWN_INTERFACE          Mem;
921     ACPI_EFI_UNKNOWN_INTERFACE          Io;
922     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci;
923     ACPI_EFI_UNKNOWN_INTERFACE          CopyMem;
924     ACPI_EFI_UNKNOWN_INTERFACE          Map;
925     ACPI_EFI_UNKNOWN_INTERFACE          Unmap;
926     ACPI_EFI_UNKNOWN_INTERFACE          AllocateBuffer;
927     ACPI_EFI_UNKNOWN_INTERFACE          FreeBuffer;
928     ACPI_EFI_UNKNOWN_INTERFACE          Flush;
929     ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation;
930     ACPI_EFI_UNKNOWN_INTERFACE          Attributes;
931     ACPI_EFI_UNKNOWN_INTERFACE          GetBarAttributes;
932     ACPI_EFI_UNKNOWN_INTERFACE          SetBarAttributes;
933     UINT64                              RomSize;
934     VOID                                *RomImage;
935 } ACPI_EFI_PCI_IO;
936 
937 /* FILE abstraction */
938 
939 union acpi_efi_file {
940     struct _ACPI_EFI_FILE_HANDLE File;
941     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE ConOut;
942     struct _ACPI_SIMPLE_INPUT_INTERFACE ConIn;
943 };
944 
945 
946 /* GNU EFI definitions */
947 
948 #if defined(_GNU_EFI)
949 
950 /*
951  * This is needed to hide platform specific code from ACPICA
952  */
953 UINT64
954 DivU64x32 (
955     UINT64                  Dividend,
956     UINTN                   Divisor,
957     UINTN                   *Remainder);
958 
959 /*
960  * EFI specific prototypes
961  */
962 ACPI_EFI_STATUS
963 efi_main (
964     ACPI_EFI_HANDLE         Image,
965     ACPI_EFI_SYSTEM_TABLE   *SystemTab);
966 
967 int
968 acpi_main (
969     int                     argc,
970     char                    *argv[]);
971 
972 
973 #endif
974 
975 extern ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol;
976 extern ACPI_EFI_GUID AcpiGbl_TextInProtocol;
977 extern ACPI_EFI_GUID AcpiGbl_TextOutProtocol;
978 extern ACPI_EFI_GUID AcpiGbl_FileSystemProtocol;
979 extern ACPI_EFI_GUID AcpiGbl_GenericFileInfo;
980 
981 #endif /* __ACEFIEX_H__ */
982