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 _ACPI_EFI_DEVICE_PATH {
99         UINT8                           Type;
100         UINT8                           SubType;
101         UINT8                           Length[2];
102 } ACPI_EFI_DEVICE_PATH;
103 
104 typedef UINT64          ACPI_EFI_PHYSICAL_ADDRESS;
105 typedef UINT64          ACPI_EFI_VIRTUAL_ADDRESS;
106 
107 typedef enum {
108     AcpiEfiAllocateAnyPages,
109     AcpiEfiAllocateMaxAddress,
110     AcpiEfiAllocateAddress,
111     AcpiEfiMaxAllocateType
112 } ACPI_EFI_ALLOCATE_TYPE;
113 
114 typedef enum {
115     AcpiEfiReservedMemoryType,
116     AcpiEfiLoaderCode,
117     AcpiEfiLoaderData,
118     AcpiEfiBootServicesCode,
119     AcpiEfiBootServicesData,
120     AcpiEfiRuntimeServicesCode,
121     AcpiEfiRuntimeServicesData,
122     AcpiEfiConventionalMemory,
123     AcpiEfiUnusableMemory,
124     AcpiEfiACPIReclaimMemory,
125     AcpiEfiACPIMemoryNVS,
126     AcpiEfiMemoryMappedIO,
127     AcpiEfiMemoryMappedIOPortSpace,
128     AcpiEfiPalCode,
129     AcpiEfiMaxMemoryType
130 } ACPI_EFI_MEMORY_TYPE;
131 
132 /* possible caching types for the memory range */
133 #define ACPI_EFI_MEMORY_UC      0x0000000000000001
134 #define ACPI_EFI_MEMORY_WC      0x0000000000000002
135 #define ACPI_EFI_MEMORY_WT      0x0000000000000004
136 #define ACPI_EFI_MEMORY_WB      0x0000000000000008
137 #define ACPI_EFI_MEMORY_UCE     0x0000000000000010
138 
139 /* physical memory protection on range */
140 #define ACPI_EFI_MEMORY_WP      0x0000000000001000
141 #define ACPI_EFI_MEMORY_RP      0x0000000000002000
142 #define ACPI_EFI_MEMORY_XP      0x0000000000004000
143 
144 /* range requires a runtime mapping */
145 #define ACPI_EFI_MEMORY_RUNTIME 0x8000000000000000
146 
147 #define ACPI_EFI_MEMORY_DESCRIPTOR_VERSION  1
148 typedef struct {
149     UINT32                          Type;
150     UINT32                          Pad;
151     ACPI_EFI_PHYSICAL_ADDRESS       PhysicalStart;
152     ACPI_EFI_VIRTUAL_ADDRESS        VirtualStart;
153     UINT64                          NumberOfPages;
154     UINT64                          Attribute;
155 } ACPI_EFI_MEMORY_DESCRIPTOR;
156 
157 typedef struct _ACPI_EFI_TABLE_HEARDER {
158     UINT64                      Signature;
159     UINT32                      Revision;
160     UINT32                      HeaderSize;
161     UINT32                      CRC32;
162     UINT32                      Reserved;
163 } ACPI_EFI_TABLE_HEADER;
164 
165 typedef
166 ACPI_EFI_STATUS
167 (ACPI_EFI_API *ACPI_EFI_UNKNOWN_INTERFACE) (
168     void);
169 
170 
171 /*
172  * Text output protocol
173  */
174 #define ACPI_SIMPLE_TEXT_OUTPUT_PROTOCOL \
175     { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
176 
177 typedef
178 ACPI_EFI_STATUS
179 (ACPI_EFI_API *ACPI_EFI_TEXT_RESET) (
180     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
181     BOOLEAN                                     ExtendedVerification);
182 
183 typedef
184 ACPI_EFI_STATUS
185 (ACPI_EFI_API *ACPI_EFI_TEXT_OUTPUT_STRING) (
186     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
187     CHAR16                                      *String);
188 
189 typedef
190 ACPI_EFI_STATUS
191 (ACPI_EFI_API *ACPI_EFI_TEXT_TEST_STRING) (
192     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
193     CHAR16                                      *String);
194 
195 typedef
196 ACPI_EFI_STATUS
197 (ACPI_EFI_API *ACPI_EFI_TEXT_QUERY_MODE) (
198     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
199     UINTN                                       ModeNumber,
200     UINTN                                       *Columns,
201     UINTN                                       *Rows);
202 
203 typedef
204 ACPI_EFI_STATUS
205 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_MODE) (
206     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
207     UINTN                                       ModeNumber);
208 
209 typedef
210 ACPI_EFI_STATUS
211 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_ATTRIBUTE) (
212     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
213     UINTN                                       Attribute);
214 
215 typedef
216 ACPI_EFI_STATUS
217 (ACPI_EFI_API *ACPI_EFI_TEXT_CLEAR_SCREEN) (
218     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This);
219 
220 typedef
221 ACPI_EFI_STATUS
222 (ACPI_EFI_API *ACPI_EFI_TEXT_SET_CURSOR_POSITION) (
223     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
224     UINTN                                       Column,
225     UINTN                                       Row);
226 
227 typedef
228 ACPI_EFI_STATUS
229 (ACPI_EFI_API *ACPI_EFI_TEXT_ENABLE_CURSOR) (
230     struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *This,
231     BOOLEAN                                     Enable);
232 
233 typedef struct {
234     INT32                           MaxMode;
235     INT32                           Mode;
236     INT32                           Attribute;
237     INT32                           CursorColumn;
238     INT32                           CursorRow;
239     BOOLEAN                         CursorVisible;
240 } ACPI_SIMPLE_TEXT_OUTPUT_MODE;
241 
242 typedef struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE {
243     ACPI_EFI_TEXT_RESET                 Reset;
244 
245     ACPI_EFI_TEXT_OUTPUT_STRING         OutputString;
246     ACPI_EFI_TEXT_TEST_STRING           TestString;
247 
248     ACPI_EFI_TEXT_QUERY_MODE            QueryMode;
249     ACPI_EFI_TEXT_SET_MODE              SetMode;
250     ACPI_EFI_TEXT_SET_ATTRIBUTE         SetAttribute;
251 
252     ACPI_EFI_TEXT_CLEAR_SCREEN          ClearScreen;
253     ACPI_EFI_TEXT_SET_CURSOR_POSITION   SetCursorPosition;
254     ACPI_EFI_TEXT_ENABLE_CURSOR         EnableCursor;
255 
256     ACPI_SIMPLE_TEXT_OUTPUT_MODE        *Mode;
257 } ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE;
258 
259 /*
260  * Text input protocol
261  */
262 #define ACPI_SIMPLE_TEXT_INPUT_PROTOCOL  \
263     { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
264 
265 typedef struct {
266     UINT16                              ScanCode;
267     CHAR16                              UnicodeChar;
268 } ACPI_EFI_INPUT_KEY;
269 
270 /*
271  * Baseline unicode control chars
272  */
273 #define CHAR_NULL                       0x0000
274 #define CHAR_BACKSPACE                  0x0008
275 #define CHAR_TAB                        0x0009
276 #define CHAR_LINEFEED                   0x000A
277 #define CHAR_CARRIAGE_RETURN            0x000D
278 
279 typedef
280 ACPI_EFI_STATUS
281 (ACPI_EFI_API *ACPI_EFI_INPUT_RESET) (
282     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
283     BOOLEAN                                     ExtendedVerification);
284 
285 typedef
286 ACPI_EFI_STATUS
287 (ACPI_EFI_API *ACPI_EFI_INPUT_READ_KEY) (
288     struct _ACPI_SIMPLE_INPUT_INTERFACE         *This,
289     ACPI_EFI_INPUT_KEY                          *Key);
290 
291 typedef struct _ACPI_SIMPLE_INPUT_INTERFACE {
292     ACPI_EFI_INPUT_RESET                    Reset;
293     ACPI_EFI_INPUT_READ_KEY                 ReadKeyStroke;
294     ACPI_EFI_EVENT                          WaitForKey;
295 } ACPI_SIMPLE_INPUT_INTERFACE;
296 
297 
298 /*
299  * Simple file system protocol
300  */
301 #define ACPI_SIMPLE_FILE_SYSTEM_PROTOCOL \
302     { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
303 
304 typedef
305 ACPI_EFI_STATUS
306 (ACPI_EFI_API *ACPI_EFI_VOLUME_OPEN) (
307     struct _ACPI_EFI_FILE_IO_INTERFACE          *This,
308     struct _ACPI_EFI_FILE_HANDLE                **Root);
309 
310 #define ACPI_EFI_FILE_IO_INTERFACE_REVISION     0x00010000
311 
312 typedef struct _ACPI_EFI_FILE_IO_INTERFACE {
313     UINT64                  Revision;
314     ACPI_EFI_VOLUME_OPEN    OpenVolume;
315 } ACPI_EFI_FILE_IO_INTERFACE;
316 
317 typedef
318 ACPI_EFI_STATUS
319 (ACPI_EFI_API *ACPI_EFI_FILE_OPEN) (
320     struct _ACPI_EFI_FILE_HANDLE                *File,
321     struct _ACPI_EFI_FILE_HANDLE                **NewHandle,
322     CHAR16                                      *FileName,
323     UINT64                                      OpenMode,
324     UINT64                                      Attributes);
325 
326 /* Values for OpenMode used above */
327 
328 #define ACPI_EFI_FILE_MODE_READ     0x0000000000000001
329 #define ACPI_EFI_FILE_MODE_WRITE    0x0000000000000002
330 #define ACPI_EFI_FILE_MODE_CREATE   0x8000000000000000
331 
332 /* Values for Attribute used above */
333 
334 #define ACPI_EFI_FILE_READ_ONLY     0x0000000000000001
335 #define ACPI_EFI_FILE_HIDDEN        0x0000000000000002
336 #define ACPI_EFI_FILE_SYSTEM        0x0000000000000004
337 #define ACPI_EFI_FILE_RESERVIED     0x0000000000000008
338 #define ACPI_EFI_FILE_DIRECTORY     0x0000000000000010
339 #define ACPI_EFI_FILE_ARCHIVE       0x0000000000000020
340 #define ACPI_EFI_FILE_VALID_ATTR    0x0000000000000037
341 
342 typedef
343 ACPI_EFI_STATUS
344 (ACPI_EFI_API *ACPI_EFI_FILE_CLOSE) (
345     struct _ACPI_EFI_FILE_HANDLE                *File);
346 
347 typedef
348 ACPI_EFI_STATUS
349 (ACPI_EFI_API *ACPI_EFI_FILE_DELETE) (
350     struct _ACPI_EFI_FILE_HANDLE                *File);
351 
352 typedef
353 ACPI_EFI_STATUS
354 (ACPI_EFI_API *ACPI_EFI_FILE_READ) (
355     struct _ACPI_EFI_FILE_HANDLE                *File,
356     UINTN                                       *BufferSize,
357     VOID                                        *Buffer);
358 
359 typedef
360 ACPI_EFI_STATUS
361 (ACPI_EFI_API *ACPI_EFI_FILE_WRITE) (
362     struct _ACPI_EFI_FILE_HANDLE                *File,
363     UINTN                                       *BufferSize,
364     VOID                                        *Buffer);
365 
366 typedef
367 ACPI_EFI_STATUS
368 (ACPI_EFI_API *ACPI_EFI_FILE_SET_POSITION) (
369     struct _ACPI_EFI_FILE_HANDLE                *File,
370     UINT64                                      Position);
371 
372 typedef
373 ACPI_EFI_STATUS
374 (ACPI_EFI_API *ACPI_EFI_FILE_GET_POSITION) (
375     struct _ACPI_EFI_FILE_HANDLE                *File,
376     UINT64                                      *Position);
377 
378 typedef
379 ACPI_EFI_STATUS
380 (ACPI_EFI_API *ACPI_EFI_FILE_GET_INFO) (
381     struct _ACPI_EFI_FILE_HANDLE                *File,
382     ACPI_EFI_GUID                               *InformationType,
383     UINTN                                       *BufferSize,
384     VOID                                        *Buffer);
385 
386 typedef
387 ACPI_EFI_STATUS
388 (ACPI_EFI_API *ACPI_EFI_FILE_SET_INFO) (
389     struct _ACPI_EFI_FILE_HANDLE                *File,
390     ACPI_EFI_GUID                               *InformationType,
391     UINTN                                       BufferSize,
392     VOID                                        *Buffer);
393 
394 typedef
395 ACPI_EFI_STATUS
396 (ACPI_EFI_API *ACPI_EFI_FILE_FLUSH) (
397     struct _ACPI_EFI_FILE_HANDLE                *File);
398 
399 
400 #define ACPI_EFI_FILE_HANDLE_REVISION           0x00010000
401 
402 typedef struct _ACPI_EFI_FILE_HANDLE {
403     UINT64                      Revision;
404     ACPI_EFI_FILE_OPEN          Open;
405     ACPI_EFI_FILE_CLOSE         Close;
406     ACPI_EFI_FILE_DELETE        Delete;
407     ACPI_EFI_FILE_READ          Read;
408     ACPI_EFI_FILE_WRITE         Write;
409     ACPI_EFI_FILE_GET_POSITION  GetPosition;
410     ACPI_EFI_FILE_SET_POSITION  SetPosition;
411     ACPI_EFI_FILE_GET_INFO      GetInfo;
412     ACPI_EFI_FILE_SET_INFO      SetInfo;
413     ACPI_EFI_FILE_FLUSH         Flush;
414 } ACPI_EFI_FILE_STRUCT, *ACPI_EFI_FILE_HANDLE;
415 
416 
417 /*
418  * Loaded image protocol
419  */
420 #define ACPI_EFI_LOADED_IMAGE_PROTOCOL \
421     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
422 
423 typedef
424 ACPI_EFI_STATUS
425 (ACPI_EFI_API *ACPI_EFI_IMAGE_ENTRY_POINT) (
426     ACPI_EFI_HANDLE                         ImageHandle,
427     struct _ACPI_EFI_SYSTEM_TABLE           *SystemTable);
428 
429 typedef
430 ACPI_EFI_STATUS
431 (ACPI_EFI_API *ACPI_EFI_IMAGE_LOAD) (
432     BOOLEAN                         BootPolicy,
433     ACPI_EFI_HANDLE                 ParentImageHandle,
434     ACPI_EFI_DEVICE_PATH            *FilePath,
435     VOID                            *SourceBuffer,
436     UINTN                           SourceSize,
437     ACPI_EFI_HANDLE                 *ImageHandle);
438 
439 typedef
440 ACPI_EFI_STATUS
441 (ACPI_EFI_API *ACPI_EFI_IMAGE_START) (
442     ACPI_EFI_HANDLE                 ImageHandle,
443     UINTN                           *ExitDataSize,
444     CHAR16                          **ExitData);
445 
446 typedef
447 ACPI_EFI_STATUS
448 (ACPI_EFI_API *ACPI_EFI_EXIT) (
449     ACPI_EFI_HANDLE                 ImageHandle,
450     ACPI_EFI_STATUS                 ExitStatus,
451     UINTN                           ExitDataSize,
452     CHAR16                          *ExitData);
453 
454 typedef
455 ACPI_EFI_STATUS
456 (ACPI_EFI_API *ACPI_EFI_IMAGE_UNLOAD) (
457     ACPI_EFI_HANDLE                 ImageHandle);
458 
459 
460 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
461 typedef struct {
462     UINT32                          Revision;
463     ACPI_EFI_HANDLE                 ParentHandle;
464     struct _ACPI_EFI_SYSTEM_TABLE   *SystemTable;
465     ACPI_EFI_HANDLE                 DeviceHandle;
466     ACPI_EFI_DEVICE_PATH            *FilePath;
467     VOID                            *Reserved;
468     UINT32                          LoadOptionsSize;
469     VOID                            *LoadOptions;
470     VOID                            *ImageBase;
471     UINT64                          ImageSize;
472     ACPI_EFI_MEMORY_TYPE            ImageCodeType;
473     ACPI_EFI_MEMORY_TYPE            ImageDataType;
474     ACPI_EFI_IMAGE_UNLOAD           Unload;
475 
476 } ACPI_EFI_LOADED_IMAGE;
477 
478 
479 /*
480  * EFI Memory
481  */
482 typedef
483 ACPI_EFI_STATUS
484 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_PAGES) (
485     ACPI_EFI_ALLOCATE_TYPE          Type,
486     ACPI_EFI_MEMORY_TYPE            MemoryType,
487     UINTN                           NoPages,
488     ACPI_EFI_PHYSICAL_ADDRESS       *Memory);
489 
490 typedef
491 ACPI_EFI_STATUS
492 (ACPI_EFI_API *ACPI_EFI_FREE_PAGES) (
493     ACPI_EFI_PHYSICAL_ADDRESS       Memory,
494     UINTN                           NoPages);
495 
496 typedef
497 ACPI_EFI_STATUS
498 (ACPI_EFI_API *ACPI_EFI_GET_MEMORY_MAP) (
499     UINTN                           *MemoryMapSize,
500     ACPI_EFI_MEMORY_DESCRIPTOR      *MemoryMap,
501     UINTN                           *MapKey,
502     UINTN                           *DescriptorSize,
503     UINT32                          *DescriptorVersion);
504 
505 #define NextMemoryDescriptor(Ptr,Size)  ((ACPI_EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
506 
507 typedef
508 ACPI_EFI_STATUS
509 (ACPI_EFI_API *ACPI_EFI_ALLOCATE_POOL) (
510     ACPI_EFI_MEMORY_TYPE            PoolType,
511     UINTN                           Size,
512     VOID                            **Buffer);
513 
514 typedef
515 ACPI_EFI_STATUS
516 (ACPI_EFI_API *ACPI_EFI_FREE_POOL) (
517     VOID                            *Buffer);
518 
519 
520 /*
521  * Protocol handler functions
522  */
523 typedef enum {
524     ACPI_EFI_NATIVE_INTERFACE,
525     ACPI_EFI_PCODE_INTERFACE
526 } ACPI_EFI_INTERFACE_TYPE;
527 
528 typedef enum {
529     AcpiEfiAllHandles,
530     AcpiEfiByRegisterNotify,
531     AcpiEfiByProtocol
532 } ACPI_EFI_LOCATE_SEARCH_TYPE;
533 
534 typedef
535 ACPI_EFI_STATUS
536 (ACPI_EFI_API *ACPI_EFI_INSTALL_PROTOCOL_INTERFACE) (
537     ACPI_EFI_HANDLE                 *Handle,
538     ACPI_EFI_GUID                   *Protocol,
539     ACPI_EFI_INTERFACE_TYPE         InterfaceType,
540     VOID                            *Interface);
541 
542 typedef
543 ACPI_EFI_STATUS
544 (ACPI_EFI_API *ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE) (
545     ACPI_EFI_HANDLE                 Handle,
546     ACPI_EFI_GUID                   *Protocol,
547     VOID                            *OldInterface,
548     VOID                            *NewInterface);
549 
550 typedef
551 ACPI_EFI_STATUS
552 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE) (
553     ACPI_EFI_HANDLE                 Handle,
554     ACPI_EFI_GUID                   *Protocol,
555     VOID                            *Interface);
556 
557 typedef
558 ACPI_EFI_STATUS
559 (ACPI_EFI_API *ACPI_EFI_HANDLE_PROTOCOL) (
560     ACPI_EFI_HANDLE                 Handle,
561     ACPI_EFI_GUID                   *Protocol,
562     VOID                            **Interface);
563 
564 typedef
565 ACPI_EFI_STATUS
566 (ACPI_EFI_API *ACPI_EFI_REGISTER_PROTOCOL_NOTIFY) (
567     ACPI_EFI_GUID                   *Protocol,
568     ACPI_EFI_EVENT                  Event,
569     VOID                            **Registration);
570 
571 typedef
572 ACPI_EFI_STATUS
573 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE) (
574     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
575     ACPI_EFI_GUID                   *Protocol,
576     VOID                            *SearchKey,
577     UINTN                           *BufferSize,
578     ACPI_EFI_HANDLE                 *Buffer);
579 
580 typedef
581 ACPI_EFI_STATUS
582 (ACPI_EFI_API *ACPI_EFI_LOCATE_DEVICE_PATH) (
583     ACPI_EFI_GUID                   *Protocol,
584     ACPI_EFI_DEVICE_PATH            **DevicePath,
585     ACPI_EFI_HANDLE                 *Device);
586 
587 typedef
588 ACPI_EFI_STATUS
589 (ACPI_EFI_API *ACPI_EFI_INSTALL_CONFIGURATION_TABLE) (
590     ACPI_EFI_GUID                   *Guid,
591     VOID                            *Table);
592 
593 #define ACPI_EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
594 #define ACPI_EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
595 #define ACPI_EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
596 #define ACPI_EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
597 #define ACPI_EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
598 #define ACPI_EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
599 
600 typedef
601 ACPI_EFI_STATUS
602 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL) (
603     ACPI_EFI_HANDLE                 Handle,
604     ACPI_EFI_GUID                   *Protocol,
605     VOID                            **Interface,
606     ACPI_EFI_HANDLE                 AgentHandle,
607     ACPI_EFI_HANDLE                 ControllerHandle,
608     UINT32                          Attributes);
609 
610 typedef
611 ACPI_EFI_STATUS
612 (ACPI_EFI_API *ACPI_EFI_CLOSE_PROTOCOL) (
613     ACPI_EFI_HANDLE                 Handle,
614     ACPI_EFI_GUID                   *Protocol,
615     ACPI_EFI_HANDLE                 AgentHandle,
616     ACPI_EFI_HANDLE                 ControllerHandle);
617 
618 typedef struct {
619     ACPI_EFI_HANDLE                 AgentHandle;
620     ACPI_EFI_HANDLE                 ControllerHandle;
621     UINT32                          Attributes;
622     UINT32                          OpenCount;
623 } ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
624 
625 typedef
626 ACPI_EFI_STATUS
627 (ACPI_EFI_API *ACPI_EFI_OPEN_PROTOCOL_INFORMATION) (
628     ACPI_EFI_HANDLE                 Handle,
629     ACPI_EFI_GUID                   *Protocol,
630     ACPI_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
631     UINTN                           *EntryCount);
632 
633 typedef
634 ACPI_EFI_STATUS
635 (ACPI_EFI_API *ACPI_EFI_PROTOCOLS_PER_HANDLE) (
636     ACPI_EFI_HANDLE                 Handle,
637     ACPI_EFI_GUID                   ***ProtocolBuffer,
638     UINTN                           *ProtocolBufferCount);
639 
640 typedef
641 ACPI_EFI_STATUS
642 (ACPI_EFI_API *ACPI_EFI_LOCATE_HANDLE_BUFFER) (
643     ACPI_EFI_LOCATE_SEARCH_TYPE     SearchType,
644     ACPI_EFI_GUID                   *Protocol,
645     VOID                            *SearchKey,
646     UINTN                           *NoHandles,
647     ACPI_EFI_HANDLE                 **Buffer);
648 
649 typedef
650 ACPI_EFI_STATUS
651 (ACPI_EFI_API *ACPI_EFI_LOCATE_PROTOCOL) (
652     ACPI_EFI_GUID                   *Protocol,
653     VOID                            *Registration,
654     VOID                            **Interface);
655 
656 typedef
657 ACPI_EFI_STATUS
658 (ACPI_EFI_API *ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
659     ACPI_EFI_HANDLE                 *Handle,
660     ...);
661 
662 typedef
663 ACPI_EFI_STATUS
664 (ACPI_EFI_API *ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
665     ACPI_EFI_HANDLE                 Handle,
666     ...);
667 
668 typedef
669 ACPI_EFI_STATUS
670 (ACPI_EFI_API *ACPI_EFI_CALCULATE_CRC32) (
671     VOID                            *Data,
672     UINTN                           DataSize,
673     UINT32                          *Crc32);
674 
675 typedef
676 VOID
677 (ACPI_EFI_API *ACPI_EFI_COPY_MEM) (
678     VOID                            *Destination,
679     VOID                            *Source,
680     UINTN                           Length);
681 
682 typedef
683 VOID
684 (ACPI_EFI_API *ACPI_EFI_SET_MEM) (
685     VOID                            *Buffer,
686     UINTN                           Size,
687     UINT8                           Value);
688 
689 /*
690  * EFI Boot Services Table
691  */
692 #define ACPI_EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
693 #define ACPI_EFI_BOOT_SERVICES_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
694 
695 typedef struct _ACPI_EFI_BOOT_SERVICES {
696     ACPI_EFI_TABLE_HEADER               Hdr;
697 
698 #if 0
699     ACPI_EFI_RAISE_TPL                  RaiseTPL;
700     ACPI_EFI_RESTORE_TPL                RestoreTPL;
701 #else
702     ACPI_EFI_UNKNOWN_INTERFACE          RaiseTPL;
703     ACPI_EFI_UNKNOWN_INTERFACE          RestoreTPL;
704 #endif
705 
706     ACPI_EFI_ALLOCATE_PAGES             AllocatePages;
707     ACPI_EFI_FREE_PAGES                 FreePages;
708     ACPI_EFI_GET_MEMORY_MAP             GetMemoryMap;
709     ACPI_EFI_ALLOCATE_POOL              AllocatePool;
710     ACPI_EFI_FREE_POOL                  FreePool;
711 
712 #if 0
713     ACPI_EFI_CREATE_EVENT               CreateEvent;
714     ACPI_EFI_SET_TIMER                  SetTimer;
715     ACPI_EFI_WAIT_FOR_EVENT             WaitForEvent;
716     ACPI_EFI_SIGNAL_EVENT               SignalEvent;
717     ACPI_EFI_CLOSE_EVENT                CloseEvent;
718     ACPI_EFI_CHECK_EVENT                CheckEvent;
719 #else
720     ACPI_EFI_UNKNOWN_INTERFACE          CreateEvent;
721     ACPI_EFI_UNKNOWN_INTERFACE          SetTimer;
722     ACPI_EFI_UNKNOWN_INTERFACE          WaitForEvent;
723     ACPI_EFI_UNKNOWN_INTERFACE          SignalEvent;
724     ACPI_EFI_UNKNOWN_INTERFACE          CloseEvent;
725     ACPI_EFI_UNKNOWN_INTERFACE          CheckEvent;
726 #endif
727 
728     ACPI_EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
729     ACPI_EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
730     ACPI_EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
731     ACPI_EFI_HANDLE_PROTOCOL            HandleProtocol;
732     ACPI_EFI_HANDLE_PROTOCOL            PCHandleProtocol;
733     ACPI_EFI_REGISTER_PROTOCOL_NOTIFY   RegisterProtocolNotify;
734     ACPI_EFI_LOCATE_HANDLE              LocateHandle;
735     ACPI_EFI_LOCATE_DEVICE_PATH         LocateDevicePath;
736     ACPI_EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
737 
738     ACPI_EFI_IMAGE_LOAD                 LoadImage;
739     ACPI_EFI_IMAGE_START                StartImage;
740     ACPI_EFI_EXIT                       Exit;
741     ACPI_EFI_IMAGE_UNLOAD               UnloadImage;
742 
743 #if 0
744     ACPI_EFI_EXIT_BOOT_SERVICES         ExitBootServices;
745     ACPI_EFI_GET_NEXT_MONOTONIC_COUNT   GetNextMonotonicCount;
746     ACPI_EFI_STALL                      Stall;
747     ACPI_EFI_SET_WATCHDOG_TIMER         SetWatchdogTimer;
748 #else
749     ACPI_EFI_UNKNOWN_INTERFACE          ExitBootServices;
750     ACPI_EFI_UNKNOWN_INTERFACE          GetNextMonotonicCount;
751     ACPI_EFI_UNKNOWN_INTERFACE          Stall;
752     ACPI_EFI_UNKNOWN_INTERFACE          SetWatchdogTimer;
753 #endif
754 
755 #if 0
756     ACPI_EFI_CONNECT_CONTROLLER         ConnectController;
757     ACPI_EFI_DISCONNECT_CONTROLLER      DisconnectController;
758 #else
759     ACPI_EFI_UNKNOWN_INTERFACE          ConnectController;
760     ACPI_EFI_UNKNOWN_INTERFACE          DisconnectController;
761 #endif
762 
763     ACPI_EFI_OPEN_PROTOCOL              OpenProtocol;
764     ACPI_EFI_CLOSE_PROTOCOL             CloseProtocol;
765     ACPI_EFI_OPEN_PROTOCOL_INFORMATION  OpenProtocolInformation;
766     ACPI_EFI_PROTOCOLS_PER_HANDLE       ProtocolsPerHandle;
767     ACPI_EFI_LOCATE_HANDLE_BUFFER       LocateHandleBuffer;
768     ACPI_EFI_LOCATE_PROTOCOL            LocateProtocol;
769     ACPI_EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
770     ACPI_EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
771 
772     ACPI_EFI_CALCULATE_CRC32        CalculateCrc32;
773 
774     ACPI_EFI_COPY_MEM               CopyMem;
775     ACPI_EFI_SET_MEM                SetMem;
776 
777 #if 0
778     ACPI_EFI_CREATE_EVENT_EX        CreateEventEx;
779 #else
780     ACPI_EFI_UNKNOWN_INTERFACE      CreateEventEx;
781 #endif
782 } ACPI_EFI_BOOT_SERVICES;
783 
784 
785 /*
786  * EFI System Table
787  */
788 
789 /*
790  * EFI Configuration Table and GUID definitions
791  */
792 #define ACPI_TABLE_GUID \
793     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
794 #define ACPI_20_TABLE_GUID \
795     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
796 
797 typedef struct _ACPI_EFI_CONFIGURATION_TABLE {
798     ACPI_EFI_GUID           VendorGuid;
799     VOID                    *VendorTable;
800 } ACPI_EFI_CONFIGURATION_TABLE;
801 
802 
803 #define ACPI_EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
804 #define ACPI_EFI_SYSTEM_TABLE_REVISION  (ACPI_EFI_SPECIFICATION_MAJOR_REVISION<<16) | (ACPI_EFI_SPECIFICATION_MINOR_REVISION)
805 
806 typedef struct _ACPI_EFI_SYSTEM_TABLE {
807     ACPI_EFI_TABLE_HEADER               Hdr;
808 
809     CHAR16                              *FirmwareVendor;
810     UINT32                              FirmwareRevision;
811 
812     ACPI_EFI_HANDLE                     ConsoleInHandle;
813     ACPI_SIMPLE_INPUT_INTERFACE         *ConIn;
814 
815     ACPI_EFI_HANDLE                     ConsoleOutHandle;
816     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *ConOut;
817 
818     ACPI_EFI_HANDLE                     StandardErrorHandle;
819     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *StdErr;
820 
821 #if 0
822     ACPI_EFI_RUNTIME_SERVICES           *RuntimeServices;
823 #else
824     ACPI_EFI_HANDLE                     *RuntimeServices;
825 #endif
826     ACPI_EFI_BOOT_SERVICES              *BootServices;
827 
828     UINTN                               NumberOfTableEntries;
829     ACPI_EFI_CONFIGURATION_TABLE        *ConfigurationTable;
830 
831 } ACPI_EFI_SYSTEM_TABLE;
832 
833 
834 /*
835  * EFI PCI I/O Protocol
836  */
837 #define ACPI_EFI_PCI_IO_PROTOCOL \
838     { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a} }
839 
840 typedef enum {
841     AcpiEfiPciIoWidthUint8 = 0,
842     AcpiEfiPciIoWidthUint16,
843     AcpiEfiPciIoWidthUint32,
844     AcpiEfiPciIoWidthUint64,
845     AcpiEfiPciIoWidthFifoUint8,
846     AcpiEfiPciIoWidthFifoUint16,
847     AcpiEfiPciIoWidthFifoUint32,
848     AcpiEfiPciIoWidthFifoUint64,
849     AcpiEfiPciIoWidthFillUint8,
850     AcpiEfiPciIoWidthFillUint16,
851     AcpiEfiPciIoWidthFillUint32,
852     AcpiEfiPciIoWidthFillUint64,
853     AcpiEfiPciIoWidthMaximum
854 } ACPI_EFI_PCI_IO_PROTOCOL_WIDTH;
855 
856 typedef
857 ACPI_EFI_STATUS
858 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_CONFIG)(
859     struct _ACPI_EFI_PCI_IO             *This,
860     ACPI_EFI_PCI_IO_PROTOCOL_WIDTH      Width,
861     UINT32                              Offset,
862     UINTN                               Count,
863     VOID                                *Buffer);
864 
865 typedef struct {
866     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Read;
867     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG     Write;
868 } ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
869 
870 typedef
871 ACPI_EFI_STATUS
872 (ACPI_EFI_API *ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION)(
873     struct _ACPI_EFI_PCI_IO             *This,
874     UINTN                               *SegmentNumber,
875     UINTN                               *BusNumber,
876     UINTN                               *DeviceNumber,
877     UINTN                               *FunctionNumber);
878 
879 typedef struct _ACPI_EFI_PCI_IO {
880     ACPI_EFI_UNKNOWN_INTERFACE          PollMem;
881     ACPI_EFI_UNKNOWN_INTERFACE          PollIo;
882     ACPI_EFI_UNKNOWN_INTERFACE          Mem;
883     ACPI_EFI_UNKNOWN_INTERFACE          Io;
884     ACPI_EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci;
885     ACPI_EFI_UNKNOWN_INTERFACE          CopyMem;
886     ACPI_EFI_UNKNOWN_INTERFACE          Map;
887     ACPI_EFI_UNKNOWN_INTERFACE          Unmap;
888     ACPI_EFI_UNKNOWN_INTERFACE          AllocateBuffer;
889     ACPI_EFI_UNKNOWN_INTERFACE          FreeBuffer;
890     ACPI_EFI_UNKNOWN_INTERFACE          Flush;
891     ACPI_EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation;
892     ACPI_EFI_UNKNOWN_INTERFACE          Attributes;
893     ACPI_EFI_UNKNOWN_INTERFACE          GetBarAttributes;
894     ACPI_EFI_UNKNOWN_INTERFACE          SetBarAttributes;
895     UINT64                              RomSize;
896     VOID                                *RomImage;
897 } ACPI_EFI_PCI_IO;
898 
899 /* GNU EFI definitions */
900 
901 #if defined(_GNU_EFI)
902 
903 /*
904  * This is needed to hide platform specific code from ACPICA
905  */
906 UINT64
907 DivU64x32 (
908     UINT64                  Dividend,
909     UINTN                   Divisor,
910     UINTN                   *Remainder);
911 
912 /*
913  * EFI specific prototypes
914  */
915 ACPI_EFI_STATUS
916 efi_main (
917     ACPI_EFI_HANDLE         Image,
918     ACPI_EFI_SYSTEM_TABLE   *SystemTab);
919 
920 int
921 acpi_main (
922     int                     argc,
923     char                    *argv[]);
924 
925 
926 #endif
927 
928 extern ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol;
929 extern ACPI_EFI_GUID AcpiGbl_TextInProtocol;
930 extern ACPI_EFI_GUID AcpiGbl_TextOutProtocol;
931 extern ACPI_EFI_GUID AcpiGbl_FileSystemProtocol;
932 
933 #endif /* __ACEFIEX_H__ */
934