1 /******************************************************************************
2  *
3  * Name: acefiex.h - Extra OS specific defines, etc. for EFI
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************
115  *
116  * Alternatively, you may choose to be licensed under the terms of the
117  * following license:
118  *
119  * Redistribution and use in source and binary forms, with or without
120  * modification, are permitted provided that the following conditions
121  * are met:
122  * 1. Redistributions of source code must retain the above copyright
123  *    notice, this list of conditions, and the following disclaimer,
124  *    without modification.
125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126  *    substantially similar to the "NO WARRANTY" disclaimer below
127  *    ("Disclaimer") and any redistribution must be conditioned upon
128  *    including a substantially similar Disclaimer requirement for further
129  *    binary redistribution.
130  * 3. Neither the names of the above-listed copyright holders nor the names
131  *    of any contributors may be used to endorse or promote products derived
132  *    from this software without specific prior written permission.
133  *
134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145  *
146  * Alternatively, you may choose to be licensed under the terms of the
147  * GNU General Public License ("GPL") version 2 as published by the Free
148  * Software Foundation.
149  *
150  *****************************************************************************/
151 
152 #ifndef __ACEFIEX_H__
153 #define __ACEFIEX_H__
154 
155 
156 #ifndef ACPI_USE_SYSTEM_CLIBRARY
157 
158 typedef signed char                     int8_t;
159 typedef short int                       int16_t;
160 typedef int                             int32_t;
161 typedef unsigned char                   uint8_t;
162 typedef unsigned short int              uint16_t;
163 typedef unsigned int                    uint32_t;
164 typedef COMPILER_DEPENDENT_INT64        int64_t;
165 typedef COMPILER_DEPENDENT_UINT64       uint64_t;
166 
167 #endif /* ACPI_USE_SYSTEM_CLIBRARY */
168 
169 #define ACPI_EFI_ERROR(a)               (((INTN) a) < 0)
170 #define ACPI_EFI_SUCCESS                0
171 #define ACPI_EFI_LOAD_ERROR             ACPI_EFI_ERR(1)
172 #define ACPI_EFI_INVALID_PARAMETER      ACPI_EFI_ERR(2)
173 #define ACPI_EFI_UNSUPPORTED            ACPI_EFI_ERR(3)
174 #define ACPI_EFI_BAD_BUFFER_SIZE        ACPI_EFI_ERR(4)
175 #define ACPI_EFI_BUFFER_TOO_SMALL       ACPI_EFI_ERR(5)
176 #define ACPI_EFI_NOT_READY              ACPI_EFI_ERR(6)
177 #define ACPI_EFI_DEVICE_ERROR           ACPI_EFI_ERR(7)
178 #define ACPI_EFI_WRITE_PROTECTED        ACPI_EFI_ERR(8)
179 #define ACPI_EFI_OUT_OF_RESOURCES       ACPI_EFI_ERR(9)
180 #define ACPI_EFI_VOLUME_CORRUPTED       ACPI_EFI_ERR(10)
181 #define ACPI_EFI_VOLUME_FULL            ACPI_EFI_ERR(11)
182 #define ACPI_EFI_NO_MEDIA               ACPI_EFI_ERR(12)
183 #define ACPI_EFI_MEDIA_CHANGED          ACPI_EFI_ERR(13)
184 #define ACPI_EFI_NOT_FOUND              ACPI_EFI_ERR(14)
185 #define ACPI_EFI_ACCESS_DENIED          ACPI_EFI_ERR(15)
186 #define ACPI_EFI_NO_RESPONSE            ACPI_EFI_ERR(16)
187 #define ACPI_EFI_NO_MAPPING             ACPI_EFI_ERR(17)
188 #define ACPI_EFI_TIMEOUT                ACPI_EFI_ERR(18)
189 #define ACPI_EFI_NOT_STARTED            ACPI_EFI_ERR(19)
190 #define ACPI_EFI_ALREADY_STARTED        ACPI_EFI_ERR(20)
191 #define ACPI_EFI_ABORTED                ACPI_EFI_ERR(21)
192 #define ACPI_EFI_PROTOCOL_ERROR         ACPI_EFI_ERR(24)
193 
194 
195 typedef UINTN ACPI_EFI_STATUS;
196 typedef VOID *ACPI_EFI_HANDLE;
197 typedef VOID *ACPI_EFI_EVENT;
198 
199 typedef struct {
200     UINT32  Data1;
201     UINT16  Data2;
202     UINT16  Data3;
203     UINT8   Data4[8];
204 } ACPI_EFI_GUID;
205 
206 typedef struct {
207     UINT16 Year;       /* 1998 - 20XX */
208     UINT8  Month;      /* 1 - 12 */
209     UINT8  Day;        /* 1 - 31 */
210     UINT8  Hour;       /* 0 - 23 */
211     UINT8  Minute;     /* 0 - 59 */
212     UINT8  Second;     /* 0 - 59 */
213     UINT8  Pad1;
214     UINT32 Nanosecond; /* 0 - 999,999,999 */
215     INT16  TimeZone;   /* -1440 to 1440 or 2047 */
216     UINT8  Daylight;
217     UINT8  Pad2;
218 } ACPI_EFI_TIME;
219 
220 typedef struct _ACPI_EFI_DEVICE_PATH {
221         UINT8                           Type;
222         UINT8                           SubType;
223         UINT8                           Length[2];
224 } ACPI_EFI_DEVICE_PATH;
225 
226 typedef UINT64          ACPI_EFI_PHYSICAL_ADDRESS;
227 typedef UINT64          ACPI_EFI_VIRTUAL_ADDRESS;
228 
229 typedef enum {
230     AcpiEfiAllocateAnyPages,
231     AcpiEfiAllocateMaxAddress,
232     AcpiEfiAllocateAddress,
233     AcpiEfiMaxAllocateType
234 } ACPI_EFI_ALLOCATE_TYPE;
235 
236 typedef enum {
237     AcpiEfiReservedMemoryType,
238     AcpiEfiLoaderCode,
239     AcpiEfiLoaderData,
240     AcpiEfiBootServicesCode,
241     AcpiEfiBootServicesData,
242     AcpiEfiRuntimeServicesCode,
243     AcpiEfiRuntimeServicesData,
244     AcpiEfiConventionalMemory,
245     AcpiEfiUnusableMemory,
246     AcpiEfiACPIReclaimMemory,
247     AcpiEfiACPIMemoryNVS,
248     AcpiEfiMemoryMappedIO,
249     AcpiEfiMemoryMappedIOPortSpace,
250     AcpiEfiPalCode,
251     AcpiEfiMaxMemoryType
252 } ACPI_EFI_MEMORY_TYPE;
253 
254 /* possible caching types for the memory range */
255 #define ACPI_EFI_MEMORY_UC      0x0000000000000001
256 #define ACPI_EFI_MEMORY_WC      0x0000000000000002
257 #define ACPI_EFI_MEMORY_WT      0x0000000000000004
258 #define ACPI_EFI_MEMORY_WB      0x0000000000000008
259 #define ACPI_EFI_MEMORY_UCE     0x0000000000000010
260 
261 /* physical memory protection on range */
262 #define ACPI_EFI_MEMORY_WP      0x0000000000001000
263 #define ACPI_EFI_MEMORY_RP      0x0000000000002000
264 #define ACPI_EFI_MEMORY_XP      0x0000000000004000
265 
266 /* range requires a runtime mapping */
267 #define ACPI_EFI_MEMORY_RUNTIME 0x8000000000000000
268 
269 #define ACPI_EFI_MEMORY_DESCRIPTOR_VERSION  1
270 typedef struct {
271     UINT32                          Type;
272     UINT32                          Pad;
273     ACPI_EFI_PHYSICAL_ADDRESS       PhysicalStart;
274     ACPI_EFI_VIRTUAL_ADDRESS        VirtualStart;
275     UINT64                          NumberOfPages;
276     UINT64                          Attribute;
277 } ACPI_EFI_MEMORY_DESCRIPTOR;
278 
279 typedef struct _ACPI_EFI_TABLE_HEARDER {
280     UINT64                      Signature;
281     UINT32                      Revision;
282     UINT32                      HeaderSize;
283     UINT32                      CRC32;
284     UINT32                      Reserved;
285 } ACPI_EFI_TABLE_HEADER;
286 
287 typedef
288 ACPI_EFI_STATUS
289 (ACPI_EFI_API *ACPI_EFI_UNKNOWN_INTERFACE) (
290     void);
291 
292 
293 /*
294  * Text output protocol
295  */
296 #define ACPI_SIMPLE_TEXT_OUTPUT_PROTOCOL \
297     { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
298 
299 typedef
300 ACPI_EFI_STATUS
301 (ACPI_EFI_API *ACPI_EFI_TEXT_RESET) (
302     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
303     BOOLEAN                                     ExtendedVerification);
304 
305 typedef
306 ACPI_EFI_STATUS
307 (ACPI_EFI_API *ACPI_EFI_TEXT_OUTPUT_STRING) (
308     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
309     CHAR16                                      *String);
310 
311 typedef
312 ACPI_EFI_STATUS
313 (ACPI_EFI_API *ACPI_EFI_TEXT_TEST_STRING) (
314     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
315     CHAR16                                      *String);
316 
317 typedef
318 ACPI_EFI_STATUS
319 (ACPI_EFI_API *ACPI_EFI_TEXT_QUERY_MODE) (
320     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
321     UINTN                                       ModeNumber,
322     UINTN                                       *Columns,
323     UINTN                                       *Rows);
324 
325 typedef
326 ACPI_EFI_STATUS
327 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_MODE) (
328     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
329     UINTN                                       ModeNumber);
330 
331 typedef
332 ACPI_EFI_STATUS
333 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_ATTRIBUTE) (
334     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
335     UINTN                                       Attribute);
336 
337 typedef
338 ACPI_EFI_STATUS
339 (ACPI_EFI_API *ACPI_EFI_TEXT_CLEAR_SCREEN) (
340     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This);
341 
342 typedef
343 ACPI_EFI_STATUS
344 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_CURSOR_POSITION) (
345     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
346     UINTN                                       Column,
347     UINTN                                       Row);
348 
349 typedef
350 ACPI_EFI_STATUS
351 (ACPI_EFI_API *ACPI_EFI_TEXT_ENABLE_CURSOR) (
352     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
353     BOOLEAN                                     Enable);
354 
355 typedef struct {
356     INT32                           MaxMode;
357     INT32                           Mode;
358     INT32                           Attribute;
359     INT32                           CursorColumn;
360     INT32                           CursorRow;
361     BOOLEAN                         CursorVisible;
362 } ACPI_SIMPLE_TEXT_OUTPUT_MODE;
363 
364 typedef struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE {
365     ACPI_EFI_TEXT_RESET                 Reset;
366 
367     ACPI_EFI_TEXT_OUTPUT_STRING         OutputString;
368     ACPI_EFI_TEXT_TEST_STRING           TestString;
369 
370     ACPI_EFI_TEXT_QUERY_MODE            QueryMode;
371     ACPI_EFI_TEXT_SET_MODE              SetMode;
372     ACPI_EFI_TEXT_SET_ATTRIBUTE         SetAttribute;
373 
374     ACPI_EFI_TEXT_CLEAR_SCREEN          ClearScreen;
375     ACPI_EFI_TEXT_SET_CURSOR_POSITION   SetCursorPosition;
376     ACPI_EFI_TEXT_ENABLE_CURSOR         EnableCursor;
377 
378     ACPI_SIMPLE_TEXT_OUTPUT_MODE        *Mode;
379 } ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE;
380 
381 /*
382  * Text input protocol
383  */
384 #define ACPI_SIMPLE_TEXT_INPUT_PROTOCOL  \
385     { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
386 
387 typedef struct {
388     UINT16                              ScanCode;
389     CHAR16                              UnicodeChar;
390 } ACPI_EFI_INPUT_KEY;
391 
392 /*
393  * Baseline unicode control chars
394  */
395 #define CHAR_NULL                       0x0000
396 #define CHAR_BACKSPACE                  0x0008
397 #define CHAR_TAB                        0x0009
398 #define CHAR_LINEFEED                   0x000A
399 #define CHAR_CARRIAGE_RETURN            0x000D
400 
401 typedef
402 ACPI_EFI_STATUS
403 (ACPI_EFI_API *ACPI_EFI_INPUT_RESET) (
404     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
405     BOOLEAN                                     ExtendedVerification);
406 
407 typedef
408 ACPI_EFI_STATUS
409 (ACPI_EFI_API *ACPI_EFI_INPUT_READ_KEY) (
410     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
411     ACPI_EFI_INPUT_KEY                          *Key);
412 
413 typedef struct _ACPI_SIMPLE_INPUT_INTERFACE {
414     ACPI_EFI_INPUT_RESET                    Reset;
415     ACPI_EFI_INPUT_READ_KEY                 ReadKeyStroke;
416     ACPI_EFI_EVENT                          WaitForKey;
417 } ACPI_SIMPLE_INPUT_INTERFACE;
418 
419 
420 /*
421  * Simple file system protocol
422  */
423 #define ACPI_SIMPLE_FILE_SYSTEM_PROTOCOL \
424     { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
425 
426 typedef
427 ACPI_EFI_STATUS
428 (ACPI_EFI_API *ACPI_EFI_VOLUME_OPEN) (
429     struct _ACPI_EFI_FILE_IO_INTERFACE          *This,
430     struct _ACPI_EFI_FILE_HANDLE                **Root);
431 
432 #define ACPI_EFI_FILE_IO_INTERFACE_REVISION     0x00010000
433 
434 typedef struct _ACPI_EFI_FILE_IO_INTERFACE {
435     UINT64                  Revision;
436     ACPI_EFI_VOLUME_OPEN    OpenVolume;
437 } ACPI_EFI_FILE_IO_INTERFACE;
438 
439 typedef
440 ACPI_EFI_STATUS
441 (ACPI_EFI_API *ACPI_EFI_FILE_OPEN) (
442     struct _ACPI_EFI_FILE_HANDLE                *File,
443     struct _ACPI_EFI_FILE_HANDLE                **NewHandle,
444     CHAR16                                      *FileName,
445     UINT64                                      OpenMode,
446     UINT64                                      Attributes);
447 
448 /* Values for OpenMode used above */
449 
450 #define ACPI_EFI_FILE_MODE_READ     0x0000000000000001
451 #define ACPI_EFI_FILE_MODE_WRITE    0x0000000000000002
452 #define ACPI_EFI_FILE_MODE_CREATE   0x8000000000000000
453 
454 /* Values for Attribute used above */
455 
456 #define ACPI_EFI_FILE_READ_ONLY     0x0000000000000001
457 #define ACPI_EFI_FILE_HIDDEN        0x0000000000000002
458 #define ACPI_EFI_FILE_SYSTEM        0x0000000000000004
459 #define ACPI_EFI_FILE_RESERVIED     0x0000000000000008
460 #define ACPI_EFI_FILE_DIRECTORY     0x0000000000000010
461 #define ACPI_EFI_FILE_ARCHIVE       0x0000000000000020
462 #define ACPI_EFI_FILE_VALID_ATTR    0x0000000000000037
463 
464 typedef
465 ACPI_EFI_STATUS
466 (ACPI_EFI_API *ACPI_EFI_FILE_CLOSE) (
467     struct _ACPI_EFI_FILE_HANDLE                *File);
468 
469 typedef
470 ACPI_EFI_STATUS
471 (ACPI_EFI_API *ACPI_EFI_FILE_DELETE) (
472     struct _ACPI_EFI_FILE_HANDLE                *File);
473 
474 typedef
475 ACPI_EFI_STATUS
476 (ACPI_EFI_API *ACPI_EFI_FILE_READ) (
477     struct _ACPI_EFI_FILE_HANDLE                *File,
478     UINTN                                       *BufferSize,
479     VOID                                        *Buffer);
480 
481 typedef
482 ACPI_EFI_STATUS
483 (ACPI_EFI_API *ACPI_EFI_FILE_WRITE) (
484     struct _ACPI_EFI_FILE_HANDLE                *File,
485     UINTN                                       *BufferSize,
486     VOID                                        *Buffer);
487 
488 typedef
489 ACPI_EFI_STATUS
490 (ACPI_EFI_API *ACPI_EFI_FILE_SET_POSITION) (
491     struct _ACPI_EFI_FILE_HANDLE                *File,
492     UINT64                                      Position);
493 
494 typedef
495 ACPI_EFI_STATUS
496 (ACPI_EFI_API *ACPI_EFI_FILE_GET_POSITION) (
497     struct _ACPI_EFI_FILE_HANDLE                *File,
498     UINT64                                      *Position);
499 
500 #define ACPI_EFI_FILE_INFO_ID \
501     { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
502 
503 typedef struct {
504     UINT64 Size;
505     UINT64 FileSize;
506     UINT64 PhysicalSize;
507     ACPI_EFI_TIME CreateTime;
508     ACPI_EFI_TIME LastAccessTime;
509     ACPI_EFI_TIME ModificationTime;
510     UINT64 Attribute;
511     CHAR16 FileName[1];
512 } ACPI_EFI_FILE_INFO;
513 
514 #define SIZE_OF_ACPI_EFI_FILE_INFO  ACPI_OFFSET(ACPI_EFI_FILE_INFO, FileName)
515 
516 typedef
517 ACPI_EFI_STATUS
518 (ACPI_EFI_API *ACPI_EFI_FILE_GET_INFO) (
519     struct _ACPI_EFI_FILE_HANDLE                *File,
520     ACPI_EFI_GUID                               *InformationType,
521     UINTN                                       *BufferSize,
522     VOID                                        *Buffer);
523 
524 typedef
525 ACPI_EFI_STATUS
526 (ACPI_EFI_API *ACPI_EFI_FILE_SET_INFO) (
527     struct _ACPI_EFI_FILE_HANDLE                *File,
528     ACPI_EFI_GUID                               *InformationType,
529     UINTN                                       BufferSize,
530     VOID                                        *Buffer);
531 
532 typedef
533 ACPI_EFI_STATUS
534 (ACPI_EFI_API *ACPI_EFI_FILE_FLUSH) (
535     struct _ACPI_EFI_FILE_HANDLE                *File);
536 
537 
538 #define ACPI_EFI_FILE_HANDLE_REVISION           0x00010000
539 
540 typedef struct _ACPI_EFI_FILE_HANDLE {
541     UINT64                      Revision;
542     ACPI_EFI_FILE_OPEN          Open;
543     ACPI_EFI_FILE_CLOSE         Close;
544     ACPI_EFI_FILE_DELETE        Delete;
545     ACPI_EFI_FILE_READ          Read;
546     ACPI_EFI_FILE_WRITE         Write;
547     ACPI_EFI_FILE_GET_POSITION  GetPosition;
548     ACPI_EFI_FILE_SET_POSITION  SetPosition;
549     ACPI_EFI_FILE_GET_INFO      GetInfo;
550     ACPI_EFI_FILE_SET_INFO      SetInfo;
551     ACPI_EFI_FILE_FLUSH         Flush;
552 } ACPI_EFI_FILE_STRUCT, *ACPI_EFI_FILE_HANDLE;
553 
554 
555 /*
556  * Loaded image protocol
557  */
558 #define ACPI_EFI_LOADED_IMAGE_PROTOCOL \
559     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
560 
561 typedef
562 ACPI_EFI_STATUS
563 (ACPI_EFI_API *ACPI_EFI_IMAGE_ENTRY_POINT) (
564     ACPI_EFI_HANDLE                         ImageHandle,
565     struct _ACPI_EFI_SYSTEM_TABLE           *SystemTable);
566 
567 typedef
568 ACPI_EFI_STATUS
569 (ACPI_EFI_API *ACPI_EFI_IMAGE_LOAD) (
570     BOOLEAN                         BootPolicy,
571     ACPI_EFI_HANDLE                 ParentImageHandle,
572     ACPI_EFI_DEVICE_PATH            *FilePath,
573     VOID                            *SourceBuffer,
574     UINTN                           SourceSize,
575     ACPI_EFI_HANDLE                 *ImageHandle);
576 
577 typedef
578 ACPI_EFI_STATUS
579 (ACPI_EFI_API *ACPI_EFI_IMAGE_START) (
580     ACPI_EFI_HANDLE                 ImageHandle,
581     UINTN                           *ExitDataSize,
582     CHAR16                          **ExitData);
583 
584 typedef
585 ACPI_EFI_STATUS
586 (ACPI_EFI_API *ACPI_EFI_EXIT) (
587     ACPI_EFI_HANDLE                 ImageHandle,
588     ACPI_EFI_STATUS                 ExitStatus,
589     UINTN                           ExitDataSize,
590     CHAR16                          *ExitData);
591 
592 typedef
593 ACPI_EFI_STATUS
594 (ACPI_EFI_API *ACPI_EFI_IMAGE_UNLOAD) (
595     ACPI_EFI_HANDLE                 ImageHandle);
596 
597 
598 typedef
599 ACPI_EFI_STATUS
600 (ACPI_EFI_API *ACPI_EFI_STALL) (
601     UINTN                           Microseconds);
602 
603 typedef
604 ACPI_EFI_STATUS
605 (ACPI_EFI_API *ACPI_EFI_SET_WATCHDOG_TIMER) (
606     UINTN                           Timeout,
607     UINT64                          WatchdogCode,
608     UINTN                           DataSize,
609     CHAR16                          *WatchdogData);
610 
611 
612 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
613 typedef struct {
614     UINT32                          Revision;
615     ACPI_EFI_HANDLE                 ParentHandle;
616     struct _ACPI_EFI_SYSTEM_TABLE   *SystemTable;
617     ACPI_EFI_HANDLE                 DeviceHandle;
618     ACPI_EFI_DEVICE_PATH            *FilePath;
619     VOID                            *Reserved;
620     UINT32                          LoadOptionsSize;
621     VOID                            *LoadOptions;
622     VOID                            *ImageBase;
623     UINT64                          ImageSize;
624     ACPI_EFI_MEMORY_TYPE            ImageCodeType;
625     ACPI_EFI_MEMORY_TYPE            ImageDataType;
626     ACPI_EFI_IMAGE_UNLOAD           Unload;
627 
628 } ACPI_EFI_LOADED_IMAGE;
629 
630 
631 /*
632  * EFI Memory
633  */
634 typedef
635 ACPI_EFI_STATUS
636 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_PAGES) (
637     ACPI_EFI_ALLOCATE_TYPE          Type,
638     ACPI_EFI_MEMORY_TYPE            MemoryType,
639     UINTN                           NoPages,
640     ACPI_EFI_PHYSICAL_ADDRESS       *Memory);
641 
642 typedef
643 ACPI_EFI_STATUS
644 (ACPI_EFI_API *ACPI_EFI_FREE_PAGES) (
645     ACPI_EFI_PHYSICAL_ADDRESS       Memory,
646     UINTN                           NoPages);
647 
648 typedef
649 ACPI_EFI_STATUS
650 (ACPI_EFI_API *ACPI_EFI_GET_MEMORY_MAP) (
651     UINTN                           *MemoryMapSize,
652     ACPI_EFI_MEMORY_DESCRIPTOR      *MemoryMap,
653     UINTN                           *MapKey,
654     UINTN                           *DescriptorSize,
655     UINT32                          *DescriptorVersion);
656 
657 #define NextMemoryDescriptor(Ptr,Size)  ((ACPI_EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
658 
659 typedef
660 ACPI_EFI_STATUS
661 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_POOL) (
662     ACPI_EFI_MEMORY_TYPE            PoolType,
663     UINTN                           Size,
664     VOID                            **Buffer);
665 
666 typedef
667 ACPI_EFI_STATUS
668 (ACPI_EFI_API *ACPI_EFI_FREE_POOL) (
669     VOID                            *Buffer);
670 
671 
672 /*
673  * EFI Time
674  */
675 typedef struct {
676     UINT32 Resolution;
677     UINT32 Accuracy;
678     BOOLEAN SetsToZero;
679 } ACPI_EFI_TIME_CAPABILITIES;
680 
681 typedef
682 ACPI_EFI_STATUS
683 (ACPI_EFI_API *ACPI_EFI_GET_TIME) (
684     ACPI_EFI_TIME                   *Time,
685     ACPI_EFI_TIME_CAPABILITIES      *Capabilities);
686 
687 typedef
688 ACPI_EFI_STATUS
689 (ACPI_EFI_API *ACPI_EFI_SET_TIME) (
690     ACPI_EFI_TIME                   *Time);
691 
692 
693 /*
694  * Protocol handler functions
695  */
696 typedef enum {
697     ACPI_EFI_NATIVE_INTERFACE,
698     ACPI_EFI_PCODE_INTERFACE
699 } ACPI_EFI_INTERFACE_TYPE;
700 
701 typedef enum {
702     AcpiEfiAllHandles,
703     AcpiEfiByRegisterNotify,
704     AcpiEfiByProtocol
705 } ACPI_EFI_LOCATE_SEARCH_TYPE;
706 
707 typedef
708 ACPI_EFI_STATUS
709 (ACPI_EFI_API *ACPI_EFI_INSTALL_PROTOCOL_INTERFACE) (
710     ACPI_EFI_HANDLE                 *Handle,
711     ACPI_EFI_GUID                   *Protocol,
712     ACPI_EFI_INTERFACE_TYPE         InterfaceType,
713     VOID                            *Interface);
714 
715 typedef
716 ACPI_EFI_STATUS
717 (ACPI_EFI_API *ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE) (
718     ACPI_EFI_HANDLE                 Handle,
719     ACPI_EFI_GUID                   *Protocol,
720     VOID                            *OldInterface,
721     VOID                            *NewInterface);
722 
723 typedef
724 ACPI_EFI_STATUS
725 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE) (
726     ACPI_EFI_HANDLE                 Handle,
727     ACPI_EFI_GUID                   *Protocol,
728     VOID                            *Interface);
729 
730 typedef
731 ACPI_EFI_STATUS
732 (ACPI_EFI_API *ACPI_EFI_HANDLE_PROTOCOL) (
733     ACPI_EFI_HANDLE                 Handle,
734     ACPI_EFI_GUID                   *Protocol,
735     VOID                            **Interface);
736 
737 typedef
738 ACPI_EFI_STATUS
739 (ACPI_EFI_API *ACPI_EFI_REGISTER_PROTOCOL_NOTIFY) (
740     ACPI_EFI_GUID                   *Protocol,
741     ACPI_EFI_EVENT                  Event,
742     VOID                            **Registration);
743 
744 typedef
745 ACPI_EFI_STATUS
746 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE) (
747     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
748     ACPI_EFI_GUID                   *Protocol,
749     VOID                            *SearchKey,
750     UINTN                           *BufferSize,
751     ACPI_EFI_HANDLE                 *Buffer);
752 
753 typedef
754 ACPI_EFI_STATUS
755 (ACPI_EFI_API *ACPI_EFI_LOCATE_DEVICE_PATH) (
756     ACPI_EFI_GUID                   *Protocol,
757     ACPI_EFI_DEVICE_PATH            **DevicePath,
758     ACPI_EFI_HANDLE                 *Device);
759 
760 typedef
761 ACPI_EFI_STATUS
762 (ACPI_EFI_API *ACPI_EFI_INSTALL_CONFIGURATION_TABLE) (
763     ACPI_EFI_GUID                   *Guid,
764     VOID                            *Table);
765 
766 #define ACPI_EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
767 #define ACPI_EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
768 #define ACPI_EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
769 #define ACPI_EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
770 #define ACPI_EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
771 #define ACPI_EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
772 
773 typedef
774 ACPI_EFI_STATUS
775 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL) (
776     ACPI_EFI_HANDLE                 Handle,
777     ACPI_EFI_GUID                   *Protocol,
778     VOID                            **Interface,
779     ACPI_EFI_HANDLE                 AgentHandle,
780     ACPI_EFI_HANDLE                 ControllerHandle,
781     UINT32                          Attributes);
782 
783 typedef
784 ACPI_EFI_STATUS
785 (ACPI_EFI_API *ACPI_EFI_CLOSE_PROTOCOL) (
786     ACPI_EFI_HANDLE                 Handle,
787     ACPI_EFI_GUID                   *Protocol,
788     ACPI_EFI_HANDLE                 AgentHandle,
789     ACPI_EFI_HANDLE                 ControllerHandle);
790 
791 typedef struct {
792     ACPI_EFI_HANDLE                 AgentHandle;
793     ACPI_EFI_HANDLE                 ControllerHandle;
794     UINT32                          Attributes;
795     UINT32                          OpenCount;
796 } ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
797 
798 typedef
799 ACPI_EFI_STATUS
800 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL_INFORMATION) (
801     ACPI_EFI_HANDLE                 Handle,
802     ACPI_EFI_GUID                   *Protocol,
803     ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
804     UINTN                           *EntryCount);
805 
806 typedef
807 ACPI_EFI_STATUS
808 (ACPI_EFI_API *ACPI_EFI_PROTOCOLS_PER_HANDLE) (
809     ACPI_EFI_HANDLE                 Handle,
810     ACPI_EFI_GUID                   ***ProtocolBuffer,
811     UINTN                           *ProtocolBufferCount);
812 
813 typedef
814 ACPI_EFI_STATUS
815 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE_BUFFER) (
816     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
817     ACPI_EFI_GUID                   *Protocol,
818     VOID                            *SearchKey,
819     UINTN                           *NoHandles,
820     ACPI_EFI_HANDLE                 **Buffer);
821 
822 typedef
823 ACPI_EFI_STATUS
824 (ACPI_EFI_API *ACPI_EFI_LOCATE_PROTOCOL) (
825     ACPI_EFI_GUID                   *Protocol,
826     VOID                            *Registration,
827     VOID                            **Interface);
828 
829 typedef
830 ACPI_EFI_STATUS
831 (ACPI_EFI_API *ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
832     ACPI_EFI_HANDLE                 *Handle,
833     ...);
834 
835 typedef
836 ACPI_EFI_STATUS
837 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
838     ACPI_EFI_HANDLE                 Handle,
839     ...);
840 
841 typedef
842 ACPI_EFI_STATUS
843 (ACPI_EFI_API *ACPI_EFI_CALCULATE_CRC32) (
844     VOID                            *Data,
845     UINTN                           DataSize,
846     UINT32                          *Crc32);
847 
848 typedef
849 VOID
850 (ACPI_EFI_API *ACPI_EFI_COPY_MEM) (
851     VOID                            *Destination,
852     VOID                            *Source,
853     UINTN                           Length);
854 
855 typedef
856 VOID
857 (ACPI_EFI_API *ACPI_EFI_SET_MEM) (
858     VOID                            *Buffer,
859     UINTN                           Size,
860     UINT8                           Value);
861 
862 /*
863  * EFI Boot Services Table
864  */
865 #define ACPI_EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
866 #define ACPI_EFI_BOOT_SERVICES_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
867 
868 typedef struct _ACPI_EFI_BOOT_SERVICES {
869     ACPI_EFI_TABLE_HEADER               Hdr;
870 
871 #if 0
872     ACPI_EFI_RAISE_TPL                  RaiseTPL;
873     ACPI_EFI_RESTORE_TPL                RestoreTPL;
874 #else
875     ACPI_EFI_UNKNOWN_INTERFACE          RaiseTPL;
876     ACPI_EFI_UNKNOWN_INTERFACE          RestoreTPL;
877 #endif
878 
879     ACPI_EFI_ALLOCATE_PAGES             AllocatePages;
880     ACPI_EFI_FREE_PAGES                 FreePages;
881     ACPI_EFI_GET_MEMORY_MAP             GetMemoryMap;
882     ACPI_EFI_ALLOCATE_POOL              AllocatePool;
883     ACPI_EFI_FREE_POOL                  FreePool;
884 
885 #if 0
886     ACPI_EFI_CREATE_EVENT               CreateEvent;
887     ACPI_EFI_SET_TIMER                  SetTimer;
888     ACPI_EFI_WAIT_FOR_EVENT             WaitForEvent;
889     ACPI_EFI_SIGNAL_EVENT               SignalEvent;
890     ACPI_EFI_CLOSE_EVENT                CloseEvent;
891     ACPI_EFI_CHECK_EVENT                CheckEvent;
892 #else
893     ACPI_EFI_UNKNOWN_INTERFACE          CreateEvent;
894     ACPI_EFI_UNKNOWN_INTERFACE          SetTimer;
895     ACPI_EFI_UNKNOWN_INTERFACE          WaitForEvent;
896     ACPI_EFI_UNKNOWN_INTERFACE          SignalEvent;
897     ACPI_EFI_UNKNOWN_INTERFACE          CloseEvent;
898     ACPI_EFI_UNKNOWN_INTERFACE          CheckEvent;
899 #endif
900 
901     ACPI_EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
902     ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
903     ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
904     ACPI_EFI_HANDLE_PROTOCOL            HandleProtocol;
905     ACPI_EFI_HANDLE_PROTOCOL            PCHandleProtocol;
906     ACPI_EFI_REGISTER_PROTOCOL_NOTIFY   RegisterProtocolNotify;
907     ACPI_EFI_LOCATE_HANDLE              LocateHandle;
908     ACPI_EFI_LOCATE_DEVICE_PATH         LocateDevicePath;
909     ACPI_EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
910 
911     ACPI_EFI_IMAGE_LOAD                 LoadImage;
912     ACPI_EFI_IMAGE_START                StartImage;
913     ACPI_EFI_EXIT                       Exit;
914     ACPI_EFI_IMAGE_UNLOAD               UnloadImage;
915 
916 #if 0
917     ACPI_EFI_EXIT_BOOT_SERVICES         ExitBootServices;
918     ACPI_EFI_GET_NEXT_MONOTONIC_COUNT   GetNextMonotonicCount;
919 #else
920     ACPI_EFI_UNKNOWN_INTERFACE          ExitBootServices;
921     ACPI_EFI_UNKNOWN_INTERFACE          GetNextMonotonicCount;
922 #endif
923     ACPI_EFI_STALL                      Stall;
924     ACPI_EFI_SET_WATCHDOG_TIMER         SetWatchdogTimer;
925 
926 #if 0
927     ACPI_EFI_CONNECT_CONTROLLER         ConnectController;
928     ACPI_EFI_DISCONNECT_CONTROLLER      DisconnectController;
929 #else
930     ACPI_EFI_UNKNOWN_INTERFACE          ConnectController;
931     ACPI_EFI_UNKNOWN_INTERFACE          DisconnectController;
932 #endif
933 
934     ACPI_EFI_OPEN_PROTOCOL              OpenProtocol;
935     ACPI_EFI_CLOSE_PROTOCOL             CloseProtocol;
936     ACPI_EFI_OPEN_PROTOCOL_INFORMATION  OpenProtocolInformation;
937     ACPI_EFI_PROTOCOLS_PER_HANDLE       ProtocolsPerHandle;
938     ACPI_EFI_LOCATE_HANDLE_BUFFER       LocateHandleBuffer;
939     ACPI_EFI_LOCATE_PROTOCOL            LocateProtocol;
940     ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
941     ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
942 
943     ACPI_EFI_CALCULATE_CRC32        CalculateCrc32;
944 
945     ACPI_EFI_COPY_MEM               CopyMem;
946     ACPI_EFI_SET_MEM                SetMem;
947 
948 #if 0
949     ACPI_EFI_CREATE_EVENT_EX        CreateEventEx;
950 #else
951     ACPI_EFI_UNKNOWN_INTERFACE      CreateEventEx;
952 #endif
953 } ACPI_EFI_BOOT_SERVICES;
954 
955 
956 /*
957  * EFI Runtime Services Table
958  */
959 #define ACPI_EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
960 #define ACPI_EFI_RUNTIME_SERVICES_REVISION  (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
961 
962 typedef struct _ACPI_EFI_RUNTIME_SERVICES {
963     ACPI_EFI_TABLE_HEADER               Hdr;
964 
965     ACPI_EFI_GET_TIME                   GetTime;
966     ACPI_EFI_SET_TIME                   SetTime;
967 #if 0
968     ACPI_EFI_GET_WAKEUP_TIME            GetWakeupTime;
969     ACPI_EFI_SET_WAKEUP_TIME            SetWakeupTime;
970 #else
971     ACPI_EFI_UNKNOWN_INTERFACE          GetWakeupTime;
972     ACPI_EFI_UNKNOWN_INTERFACE          SetWakeupTime;
973 #endif
974 
975 #if 0
976     ACPI_EFI_SET_VIRTUAL_ADDRESS_MAP    SetVirtualAddressMap;
977     ACPI_EFI_CONVERT_POINTER            ConvertPointer;
978 #else
979     ACPI_EFI_UNKNOWN_INTERFACE          SetVirtualAddressMap;
980     ACPI_EFI_UNKNOWN_INTERFACE          ConvertPointer;
981 #endif
982 
983 #if 0
984     ACPI_EFI_GET_VARIABLE               GetVariable;
985     ACPI_EFI_GET_NEXT_VARIABLE_NAME     GetNextVariableName;
986     ACPI_EFI_SET_VARIABLE               SetVariable;
987 #else
988     ACPI_EFI_UNKNOWN_INTERFACE          GetVariable;
989     ACPI_EFI_UNKNOWN_INTERFACE          GetNextVariableName;
990     ACPI_EFI_UNKNOWN_INTERFACE          SetVariable;
991 #endif
992 
993 #if 0
994     ACPI_EFI_GET_NEXT_HIGH_MONO_COUNT   GetNextHighMonotonicCount;
995     ACPI_EFI_RESET_SYSTEM               ResetSystem;
996 #else
997     ACPI_EFI_UNKNOWN_INTERFACE          GetNextHighMonotonicCount;
998     ACPI_EFI_UNKNOWN_INTERFACE          ResetSystem;
999 #endif
1000 
1001 } ACPI_EFI_RUNTIME_SERVICES;
1002 
1003 
1004 /*
1005  * EFI System Table
1006  */
1007 
1008 /*
1009  * EFI Configuration Table and GUID definitions
1010  */
1011 #define ACPI_TABLE_GUID \
1012     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
1013 #define ACPI_20_TABLE_GUID \
1014     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
1015 
1016 typedef struct _ACPI_EFI_CONFIGURATION_TABLE {
1017     ACPI_EFI_GUID           VendorGuid;
1018     VOID                    *VendorTable;
1019 } ACPI_EFI_CONFIGURATION_TABLE;
1020 
1021 
1022 #define ACPI_EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
1023 #define ACPI_EFI_SYSTEM_TABLE_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
1024 
1025 typedef struct _ACPI_EFI_SYSTEM_TABLE {
1026     ACPI_EFI_TABLE_HEADER               Hdr;
1027 
1028     CHAR16                              *FirmwareVendor;
1029     UINT32                              FirmwareRevision;
1030 
1031     ACPI_EFI_HANDLE                     ConsoleInHandle;
1032     ACPI_SIMPLE_INPUT_INTERFACE         *ConIn;
1033 
1034     ACPI_EFI_HANDLE                     ConsoleOutHandle;
1035     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *ConOut;
1036 
1037     ACPI_EFI_HANDLE                     StandardErrorHandle;
1038     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *StdErr;
1039 
1040     ACPI_EFI_RUNTIME_SERVICES           *RuntimeServices;
1041     ACPI_EFI_BOOT_SERVICES              *BootServices;
1042 
1043     UINTN                               NumberOfTableEntries;
1044     ACPI_EFI_CONFIGURATION_TABLE        *ConfigurationTable;
1045 
1046 } ACPI_EFI_SYSTEM_TABLE;
1047 
1048 
1049 /*
1050  * EFI PCI I/O Protocol
1051  */
1052 #define ACPI_EFI_PCI_IO_PROTOCOL \
1053     { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a} }
1054 
1055 typedef enum {
1056     AcpiEfiPciIoWidthUint8 = 0,
1057     AcpiEfiPciIoWidthUint16,
1058     AcpiEfiPciIoWidthUint32,
1059     AcpiEfiPciIoWidthUint64,
1060     AcpiEfiPciIoWidthFifoUint8,
1061     AcpiEfiPciIoWidthFifoUint16,
1062     AcpiEfiPciIoWidthFifoUint32,
1063     AcpiEfiPciIoWidthFifoUint64,
1064     AcpiEfiPciIoWidthFillUint8,
1065     AcpiEfiPciIoWidthFillUint16,
1066     AcpiEfiPciIoWidthFillUint32,
1067     AcpiEfiPciIoWidthFillUint64,
1068     AcpiEfiPciIoWidthMaximum
1069 } ACPI_EFI_PCI_IO_PROTOCOL_WIDTH;
1070 
1071 typedef
1072 ACPI_EFI_STATUS
1073 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_CONFIG)(
1074     struct _ACPI_EFI_PCI_IO             *This,
1075     ACPI_EFI_PCI_IO_PROTOCOL_WIDTH      Width,
1076     UINT32                              Offset,
1077     UINTN                               Count,
1078     VOID                                *Buffer);
1079 
1080 typedef struct {
1081     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Read;
1082     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Write;
1083 } ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
1084 
1085 typedef
1086 ACPI_EFI_STATUS
1087 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION)(
1088     struct _ACPI_EFI_PCI_IO             *This,
1089     UINTN                               *SegmentNumber,
1090     UINTN                               *BusNumber,
1091     UINTN                               *DeviceNumber,
1092     UINTN                               *FunctionNumber);
1093 
1094 typedef struct _ACPI_EFI_PCI_IO {
1095     ACPI_EFI_UNKNOWN_INTERFACE          PollMem;
1096     ACPI_EFI_UNKNOWN_INTERFACE          PollIo;
1097     ACPI_EFI_UNKNOWN_INTERFACE          Mem;
1098     ACPI_EFI_UNKNOWN_INTERFACE          Io;
1099     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci;
1100     ACPI_EFI_UNKNOWN_INTERFACE          CopyMem;
1101     ACPI_EFI_UNKNOWN_INTERFACE          Map;
1102     ACPI_EFI_UNKNOWN_INTERFACE          Unmap;
1103     ACPI_EFI_UNKNOWN_INTERFACE          AllocateBuffer;
1104     ACPI_EFI_UNKNOWN_INTERFACE          FreeBuffer;
1105     ACPI_EFI_UNKNOWN_INTERFACE          Flush;
1106     ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation;
1107     ACPI_EFI_UNKNOWN_INTERFACE          Attributes;
1108     ACPI_EFI_UNKNOWN_INTERFACE          GetBarAttributes;
1109     ACPI_EFI_UNKNOWN_INTERFACE          SetBarAttributes;
1110     UINT64                              RomSize;
1111     VOID                                *RomImage;
1112 } ACPI_EFI_PCI_IO;
1113 
1114 /* FILE abstraction */
1115 
1116 union acpi_efi_file {
1117     struct _ACPI_EFI_FILE_HANDLE File;
1118     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE ConOut;
1119     struct _ACPI_SIMPLE_INPUT_INTERFACE ConIn;
1120 };
1121 
1122 
1123 /* EFI definitions */
1124 
1125 #if defined(_GNU_EFI) || defined(_EDK2_EFI)
1126 
1127 /*
1128  * This is needed to hide platform specific code from ACPICA
1129  */
1130 UINT64 ACPI_EFI_API
1131 DivU64x32 (
1132     UINT64                  Dividend,
1133     UINTN                   Divisor,
1134     UINTN                   *Remainder);
1135 
1136 UINT64 ACPI_EFI_API
1137 MultU64x32 (
1138     UINT64                  Multiplicand,
1139     UINTN                   Multiplier);
1140 
1141 UINT64 ACPI_EFI_API
1142 LShiftU64 (
1143     UINT64                  Operand,
1144     UINTN                   Count);
1145 
1146 UINT64 ACPI_EFI_API
1147 RShiftU64 (
1148     UINT64                  Operand,
1149     UINTN                   Count);
1150 
1151 /*
1152  * EFI specific prototypes
1153  */
1154 ACPI_EFI_STATUS
1155 efi_main (
1156     ACPI_EFI_HANDLE         Image,
1157     ACPI_EFI_SYSTEM_TABLE   *SystemTab);
1158 
1159 int
1160 acpi_main (
1161     int                     argc,
1162     char                    *argv[]);
1163 
1164 #endif
1165 
1166 extern ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol;
1167 extern ACPI_EFI_GUID AcpiGbl_TextInProtocol;
1168 extern ACPI_EFI_GUID AcpiGbl_TextOutProtocol;
1169 extern ACPI_EFI_GUID AcpiGbl_FileSystemProtocol;
1170 extern ACPI_EFI_GUID AcpiGbl_GenericFileInfo;
1171 
1172 #endif /* __ACEFIEX_H__ */
1173