1/*	$NetBSD: efiapi.h,v 1.1 2006/04/07 14:21:29 cherry Exp $	*/
2/* $FreeBSD: src/sys/boot/efi/include/efiapi.h,v 1.6 2003/12/10 19:08:09 jhb Exp $ */
3#ifndef _EFI_API_H
4#define _EFI_API_H
5
6/*++
7
8Copyright (c) 1998  Intel Corporation
9
10Module Name:
11
12    efiapi.h
13
14Abstract:
15
16    Global EFI runtime & boot service interfaces
17
18
19
20
21Revision History
22
23--*/
24
25/*
26 * EFI Specification Revision
27 */
28
29#define EFI_SPECIFICATION_MAJOR_REVISION 1
30#define EFI_SPECIFICATION_MINOR_REVISION 02
31
32/*
33 * Declare forward referenced data structures
34 */
35
36INTERFACE_DECL(_EFI_SYSTEM_TABLE);
37
38/*
39 * EFI Memory
40 */
41
42typedef
43EFI_STATUS
44(EFIAPI *EFI_ALLOCATE_PAGES) (
45    IN EFI_ALLOCATE_TYPE            Type,
46    IN EFI_MEMORY_TYPE              MemoryType,
47    IN UINTN                        NoPages,
48    OUT EFI_PHYSICAL_ADDRESS        *Memory
49    );
50
51typedef
52EFI_STATUS
53(EFIAPI *EFI_FREE_PAGES) (
54    IN EFI_PHYSICAL_ADDRESS         Memory,
55    IN UINTN                        NoPages
56    );
57
58typedef
59EFI_STATUS
60(EFIAPI *EFI_GET_MEMORY_MAP) (
61    IN OUT UINTN                    *MemoryMapSize,
62    IN OUT EFI_MEMORY_DESCRIPTOR    *MemoryMap,
63    OUT UINTN                       *MapKey,
64    OUT UINTN                       *DescriptorSize,
65    OUT UINT32                      *DescriptorVersion
66    );
67
68#define NextMemoryDescriptor(Ptr,Size)  ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
69
70
71typedef
72EFI_STATUS
73(EFIAPI *EFI_ALLOCATE_POOL) (
74    IN EFI_MEMORY_TYPE              PoolType,
75    IN UINTN                        Size,
76    OUT VOID                        **Buffer
77    );
78
79typedef
80EFI_STATUS
81(EFIAPI *EFI_FREE_POOL) (
82    IN VOID                         *Buffer
83    );
84
85typedef
86EFI_STATUS
87(EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
88    IN UINTN                        MemoryMapSize,
89    IN UINTN                        DescriptorSize,
90    IN UINT32                       DescriptorVersion,
91    IN EFI_MEMORY_DESCRIPTOR        *VirtualMap
92    );
93
94
95#define EFI_OPTIONAL_PTR            0x00000001
96#define EFI_INTERNAL_FNC            0x00000002      /* Pointer to internal runtime fnc */
97#define EFI_INTERNAL_PTR            0x00000004      /* Pointer to internal runtime data */
98
99
100typedef
101EFI_STATUS
102(EFIAPI *EFI_CONVERT_POINTER) (
103    IN UINTN                        DebugDisposition,
104    IN OUT VOID                     **Address
105    );
106
107
108/*
109 * EFI Events
110 */
111
112
113
114#define EVT_TIMER                           0x80000000
115#define EVT_RUNTIME                         0x40000000
116#define EVT_RUNTIME_CONTEXT                 0x20000000
117
118#define EVT_NOTIFY_WAIT                     0x00000100
119#define EVT_NOTIFY_SIGNAL                   0x00000200
120
121#define EVT_SIGNAL_EXIT_BOOT_SERVICES       0x00000201
122#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE   0x60000202
123
124#define EVT_EFI_SIGNAL_MASK                 0x000000FF
125#define EVT_EFI_SIGNAL_MAX                  2
126
127typedef
128VOID
129(EFIAPI *EFI_EVENT_NOTIFY) (
130    IN EFI_EVENT                Event,
131    IN VOID                     *Context
132    );
133
134typedef
135EFI_STATUS
136(EFIAPI *EFI_CREATE_EVENT) (
137    IN UINT32                       Type,
138    IN EFI_TPL                      NotifyTpl,
139    IN EFI_EVENT_NOTIFY             NotifyFunction,
140    IN VOID                         *NotifyContext,
141    OUT EFI_EVENT                   *Event
142    );
143
144typedef enum {
145    TimerCancel,
146    TimerPeriodic,
147    TimerRelative,
148    TimerTypeMax
149} EFI_TIMER_DELAY;
150
151typedef
152EFI_STATUS
153(EFIAPI *EFI_SET_TIMER) (
154    IN EFI_EVENT                Event,
155    IN EFI_TIMER_DELAY          Type,
156    IN UINT64                   TriggerTime
157    );
158
159typedef
160EFI_STATUS
161(EFIAPI *EFI_SIGNAL_EVENT) (
162    IN EFI_EVENT                Event
163    );
164
165typedef
166EFI_STATUS
167(EFIAPI *EFI_WAIT_FOR_EVENT) (
168    IN UINTN                    NumberOfEvents,
169    IN EFI_EVENT                *Event,
170    OUT UINTN                   *Index
171    );
172
173typedef
174EFI_STATUS
175(EFIAPI *EFI_CLOSE_EVENT) (
176    IN EFI_EVENT                Event
177    );
178
179typedef
180EFI_STATUS
181(EFIAPI *EFI_CHECK_EVENT) (
182    IN EFI_EVENT                Event
183    );
184
185/*
186 * Task priority level
187 */
188
189#define TPL_APPLICATION    4
190#define TPL_CALLBACK       8
191#define TPL_NOTIFY        16
192#define TPL_HIGH_LEVEL    31
193
194typedef
195EFI_TPL
196(EFIAPI *EFI_RAISE_TPL) (
197    IN EFI_TPL      NewTpl
198    );
199
200typedef
201VOID
202(EFIAPI *EFI_RESTORE_TPL) (
203    IN EFI_TPL      OldTpl
204    );
205
206
207/*
208 * EFI platform variables
209 */
210
211#define EFI_GLOBAL_VARIABLE     \
212    { 0x8BE4DF61, 0x93CA, 0x11d2, 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }
213
214/* Variable attributes */
215#define EFI_VARIABLE_NON_VOLATILE           0x00000001
216#define EFI_VARIABLE_BOOTSERVICE_ACCESS     0x00000002
217#define EFI_VARIABLE_RUNTIME_ACCESS         0x00000004
218
219/* Variable size limitation */
220#define EFI_MAXIMUM_VARIABLE_SIZE           1024
221
222typedef
223EFI_STATUS
224(EFIAPI *EFI_GET_VARIABLE) (
225    IN CHAR16                       *VariableName,
226    IN EFI_GUID                     *VendorGuid,
227    OUT UINT32                      *Attributes OPTIONAL,
228    IN OUT UINTN                    *DataSize,
229    OUT VOID                        *Data
230    );
231
232typedef
233EFI_STATUS
234(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
235    IN OUT UINTN                    *VariableNameSize,
236    IN OUT CHAR16                   *VariableName,
237    IN OUT EFI_GUID                 *VendorGuid
238    );
239
240
241typedef
242EFI_STATUS
243(EFIAPI *EFI_SET_VARIABLE) (
244    IN CHAR16                       *VariableName,
245    IN EFI_GUID                     *VendorGuid,
246    IN UINT32                       Attributes,
247    IN UINTN                        DataSize,
248    IN VOID                         *Data
249    );
250
251
252/*
253 * EFI Time
254 */
255
256typedef struct {
257        UINT32              Resolution;     /* 1e-6 parts per million */
258        UINT32              Accuracy;       /* hertz */
259        BOOLEAN             SetsToZero;     /* Set clears sub-second time */
260} EFI_TIME_CAPABILITIES;
261
262
263typedef
264EFI_STATUS
265(EFIAPI *EFI_GET_TIME) (
266    OUT EFI_TIME                    *Time,
267    OUT EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
268    );
269
270typedef
271EFI_STATUS
272(EFIAPI *EFI_SET_TIME) (
273    IN EFI_TIME                     *Time
274    );
275
276typedef
277EFI_STATUS
278(EFIAPI *EFI_GET_WAKEUP_TIME) (
279    OUT BOOLEAN                     *Enabled,
280    OUT BOOLEAN                     *Pending,
281    OUT EFI_TIME                    *Time
282    );
283
284typedef
285EFI_STATUS
286(EFIAPI *EFI_SET_WAKEUP_TIME) (
287    IN BOOLEAN                      Enable,
288    IN EFI_TIME                     *Time OPTIONAL
289    );
290
291
292/*
293 * Image functions
294 */
295
296
297/* PE32+ Subsystem type for EFI images */
298
299#if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
300#define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
301#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
302#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
303#endif
304
305/* PE32+ Machine type for EFI images */
306
307#if !defined(EFI_IMAGE_MACHINE_IA32)
308#define EFI_IMAGE_MACHINE_IA32      0x014c
309#endif
310
311#if !defined(EFI_IMAGE_MACHINE_IA64)
312#define EFI_IMAGE_MACHINE_IA64      0x0200
313#endif
314
315/* Image Entry prototype */
316
317typedef
318EFI_STATUS
319(EFIAPI *EFI_IMAGE_ENTRY_POINT) (
320    IN EFI_HANDLE                   ImageHandle,
321    IN struct _EFI_SYSTEM_TABLE     *SystemTable
322    );
323
324typedef
325EFI_STATUS
326(EFIAPI *EFI_IMAGE_LOAD) (
327    IN BOOLEAN                      BootPolicy,
328    IN EFI_HANDLE                   ParentImageHandle,
329    IN EFI_DEVICE_PATH              *FilePath,
330    IN VOID                         *SourceBuffer   OPTIONAL,
331    IN UINTN                        SourceSize,
332    OUT EFI_HANDLE                  *ImageHandle
333    );
334
335typedef
336EFI_STATUS
337(EFIAPI *EFI_IMAGE_START) (
338    IN EFI_HANDLE                   ImageHandle,
339    OUT UINTN                       *ExitDataSize,
340    OUT CHAR16                      **ExitData  OPTIONAL
341    );
342
343typedef
344EFI_STATUS
345(EFIAPI *EFI_EXIT) (
346    IN EFI_HANDLE                   ImageHandle,
347    IN EFI_STATUS                   ExitStatus,
348    IN UINTN                        ExitDataSize,
349    IN CHAR16                       *ExitData OPTIONAL
350    );
351
352typedef
353EFI_STATUS
354(EFIAPI *EFI_IMAGE_UNLOAD) (
355    IN EFI_HANDLE                   ImageHandle
356    );
357
358
359/* Image handle */
360#define LOADED_IMAGE_PROTOCOL      \
361    { 0x5B1B31A1, 0x9562, 0x11d2, 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }
362
363#define EFI_IMAGE_INFORMATION_REVISION      0x1000
364typedef struct {
365    UINT32                          Revision;
366    EFI_HANDLE                      ParentHandle;
367    struct _EFI_SYSTEM_TABLE        *SystemTable;
368
369	/* Source location of image */
370    EFI_HANDLE                      DeviceHandle;
371    EFI_DEVICE_PATH                 *FilePath;
372    VOID                            *Reserved;
373
374	/* Images load options */
375    UINT32                          LoadOptionsSize;
376    VOID                            *LoadOptions;
377
378	/* Location of where image was loaded */
379    VOID                            *ImageBase;
380    UINT64                          ImageSize;
381    EFI_MEMORY_TYPE                 ImageCodeType;
382    EFI_MEMORY_TYPE                 ImageDataType;
383
384	/* If the driver image supports a dynamic unload request */
385    EFI_IMAGE_UNLOAD                Unload;
386
387} EFI_LOADED_IMAGE;
388
389
390typedef
391EFI_STATUS
392(EFIAPI *EFI_EXIT_BOOT_SERVICES) (
393    IN EFI_HANDLE                   ImageHandle,
394    IN UINTN                        MapKey
395    );
396
397/*
398 * Misc
399 */
400
401
402typedef
403EFI_STATUS
404(EFIAPI *EFI_STALL) (
405    IN UINTN                    Microseconds
406    );
407
408typedef
409EFI_STATUS
410(EFIAPI *EFI_SET_WATCHDOG_TIMER) (
411    IN UINTN                    Timeout,
412    IN UINT64                   WatchdogCode,
413    IN UINTN                    DataSize,
414    IN CHAR16                   *WatchdogData OPTIONAL
415    );
416
417
418typedef enum {
419    EfiResetCold,
420    EfiResetWarm
421} EFI_RESET_TYPE;
422
423typedef
424EFI_STATUS
425(EFIAPI *EFI_RESET_SYSTEM) (
426    IN EFI_RESET_TYPE           ResetType,
427    IN EFI_STATUS               ResetStatus,
428    IN UINTN                    DataSize,
429    IN CHAR16                   *ResetData OPTIONAL
430    );
431
432typedef
433EFI_STATUS
434(EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
435    OUT UINT64                  *Count
436    );
437
438typedef
439EFI_STATUS
440(EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
441    OUT UINT32                  *HighCount
442    );
443
444/*
445 * Protocol handler functions
446 */
447
448typedef enum {
449    EFI_NATIVE_INTERFACE,
450    EFI_PCODE_INTERFACE
451} EFI_INTERFACE_TYPE;
452
453typedef
454EFI_STATUS
455(EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
456    IN OUT EFI_HANDLE           *Handle,
457    IN EFI_GUID                 *Protocol,
458    IN EFI_INTERFACE_TYPE       InterfaceType,
459    IN VOID                     *Interface
460    );
461
462typedef
463EFI_STATUS
464(EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
465    IN EFI_HANDLE               Handle,
466    IN EFI_GUID                 *Protocol,
467    IN VOID                     *OldInterface,
468    IN VOID                     *NewInterface
469    );
470
471typedef
472EFI_STATUS
473(EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
474    IN EFI_HANDLE               Handle,
475    IN EFI_GUID                 *Protocol,
476    IN VOID                     *Interface
477    );
478
479typedef
480EFI_STATUS
481(EFIAPI *EFI_HANDLE_PROTOCOL) (
482    IN EFI_HANDLE               Handle,
483    IN EFI_GUID                 *Protocol,
484    OUT VOID                    **Interface
485    );
486
487typedef
488EFI_STATUS
489(EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
490    IN EFI_GUID                 *Protocol,
491    IN EFI_EVENT                Event,
492    OUT VOID                    **Registration
493    );
494
495typedef enum {
496    AllHandles,
497    ByRegisterNotify,
498    ByProtocol
499} EFI_LOCATE_SEARCH_TYPE;
500
501typedef
502EFI_STATUS
503(EFIAPI *EFI_LOCATE_HANDLE) (
504    IN EFI_LOCATE_SEARCH_TYPE   SearchType,
505    IN EFI_GUID                 *Protocol OPTIONAL,
506    IN VOID                     *SearchKey OPTIONAL,
507    IN OUT UINTN                *BufferSize,
508    OUT EFI_HANDLE              *Buffer
509    );
510
511typedef
512EFI_STATUS
513(EFIAPI *EFI_LOCATE_DEVICE_PATH) (
514    IN EFI_GUID                 *Protocol,
515    IN OUT EFI_DEVICE_PATH      **DevicePath,
516    OUT EFI_HANDLE              *Device
517    );
518
519typedef
520EFI_STATUS
521(EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
522    IN EFI_GUID                 *Guid,
523    IN VOID                     *Table
524    );
525
526typedef
527EFI_STATUS
528(EFIAPI *EFI_RESERVED_SERVICE) (
529    VOID
530    );
531
532/*
533 * Standard EFI table header
534 */
535
536typedef struct _EFI_TABLE_HEARDER {
537    UINT64                      Signature;
538    UINT32                      Revision;
539    UINT32                      HeaderSize;
540    UINT32                      CRC32;
541    UINT32                      Reserved;
542} EFI_TABLE_HEADER;
543
544
545/*
546 * EFI Runtime Serivces Table
547 */
548
549#define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552
550#define EFI_RUNTIME_SERVICES_REVISION   (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
551
552typedef struct  {
553    EFI_TABLE_HEADER                Hdr;
554
555	/* Time services */
556
557    EFI_GET_TIME                    GetTime;
558    EFI_SET_TIME                    SetTime;
559    EFI_GET_WAKEUP_TIME             GetWakeupTime;
560    EFI_SET_WAKEUP_TIME             SetWakeupTime;
561
562	/* Virtual memory services */
563
564    EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
565    EFI_CONVERT_POINTER             ConvertPointer;
566
567	/* Variable serviers */
568
569    EFI_GET_VARIABLE                GetVariable;
570    EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
571    EFI_SET_VARIABLE                SetVariable;
572
573	/* Misc */
574
575    EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
576    EFI_RESET_SYSTEM                ResetSystem;
577
578} EFI_RUNTIME_SERVICES;
579
580
581/*
582 * EFI Boot Services Table
583 */
584
585#define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
586#define EFI_BOOT_SERVICES_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
587
588typedef struct _EFI_BOOT_SERVICES {
589
590    EFI_TABLE_HEADER                Hdr;
591
592	/* Task priority functions */
593
594    EFI_RAISE_TPL                   RaiseTPL;
595    EFI_RESTORE_TPL                 RestoreTPL;
596
597	/* Memory functions */
598
599    EFI_ALLOCATE_PAGES              AllocatePages;
600    EFI_FREE_PAGES                  FreePages;
601    EFI_GET_MEMORY_MAP              GetMemoryMap;
602    EFI_ALLOCATE_POOL               AllocatePool;
603    EFI_FREE_POOL                   FreePool;
604
605	/* Event & timer functions */
606
607    EFI_CREATE_EVENT                CreateEvent;
608    EFI_SET_TIMER                   SetTimer;
609    EFI_WAIT_FOR_EVENT              WaitForEvent;
610    EFI_SIGNAL_EVENT                SignalEvent;
611    EFI_CLOSE_EVENT                 CloseEvent;
612    EFI_CHECK_EVENT                 CheckEvent;
613
614	/* Protocol handler functions */
615
616    EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
617    EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
618    EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
619    EFI_HANDLE_PROTOCOL             HandleProtocol;
620    EFI_HANDLE_PROTOCOL             PCHandleProtocol;
621    EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
622    EFI_LOCATE_HANDLE               LocateHandle;
623    EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
624    EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
625
626	/* Image functions */
627
628    EFI_IMAGE_LOAD                  LoadImage;
629    EFI_IMAGE_START                 StartImage;
630    EFI_EXIT                        Exit;
631    EFI_IMAGE_UNLOAD                UnloadImage;
632    EFI_EXIT_BOOT_SERVICES          ExitBootServices;
633
634	/* Misc functions */
635
636    EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
637    EFI_STALL                       Stall;
638    EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
639
640} EFI_BOOT_SERVICES;
641
642
643/*
644 * EFI Configuration Table and GUID definitions
645 */
646
647#define MPS_TABLE_GUID    \
648    { 0xeb9d2d2f, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
649
650#define ACPI_TABLE_GUID    \
651    { 0xeb9d2d30, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
652
653#define ACPI_20_TABLE_GUID  \
654    { 0x8868e871, 0xe4f1, 0x11d3, { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }
655
656#define SMBIOS_TABLE_GUID    \
657    { 0xeb9d2d31, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
658
659#define SAL_SYSTEM_TABLE_GUID    \
660    { 0xeb9d2d32, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
661
662/* DIG64 Headless Console & Debug Port Table. */
663#define	HCDP_TABLE_GUID		\
664	{0xf951938d,0x620b,0x42ef,{0x82,0x79,0xa8,0x4b,0x79,0x61,0x78,0x98}}
665
666typedef struct _EFI_CONFIGURATION_TABLE {
667    EFI_GUID                VendorGuid;
668    VOID                    *VendorTable;
669} EFI_CONFIGURATION_TABLE;
670
671
672/*
673 * EFI System Table
674 */
675
676
677
678
679#define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
680#define EFI_SYSTEM_TABLE_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
681
682typedef struct _EFI_SYSTEM_TABLE {
683    EFI_TABLE_HEADER                Hdr;
684
685    CHAR16                          *FirmwareVendor;
686    UINT32                          FirmwareRevision;
687
688    EFI_HANDLE                      ConsoleInHandle;
689    SIMPLE_INPUT_INTERFACE          *ConIn;
690
691    EFI_HANDLE                      ConsoleOutHandle;
692    SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
693
694    EFI_HANDLE                      StandardErrorHandle;
695    SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
696
697    EFI_RUNTIME_SERVICES            *RuntimeServices;
698    EFI_BOOT_SERVICES               *BootServices;
699
700    UINTN                           NumberOfTableEntries;
701    EFI_CONFIGURATION_TABLE         *ConfigurationTable;
702
703} EFI_SYSTEM_TABLE;
704
705#endif
706