1/*	$NetBSD: efiprot.h,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
2
3#ifndef _EFI_PROT_H
4#define _EFI_PROT_H
5
6/*++
7
8Copyright (c) 1998  Intel Corporation
9
10Module Name:
11
12    efiprot.h
13
14Abstract:
15
16    EFI Protocols
17
18
19
20Revision History
21
22--*/
23
24//
25//  FPSWA library protocol
26//
27#define EFI_FPSWA_PROTOCOL_GUID \
28    { 0xc41b6531, 0x97b9, 0x11d3, {0x9a, 0x29, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
29#define FPSWA_PROTOCOL EFI_FPSWA_PROTOCOL_GUID
30
31//
32// Device Path protocol
33//
34
35#define EFI_DEVICE_PATH_PROTOCOL_GUID \
36    { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
37#define DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL_GUID
38
39
40//
41// Block IO protocol
42//
43
44#define EFI_BLOCK_IO_PROTOCOL_GUID \
45    { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
46#define BLOCK_IO_PROTOCOL EFI_BLOCK_IO_PROTOCOL_GUID
47
48#define EFI_BLOCK_IO_PROTOCOL_REVISION    0x00010000
49#define EFI_BLOCK_IO_PROTOCOL_REVISION2   0x00020001
50#define EFI_BLOCK_IO_PROTOCOL_REVISION3   ((2<<16) | 31)
51#define EFI_BLOCK_IO_INTERFACE_REVISION   EFI_BLOCK_IO_PROTOCOL_REVISION
52#define EFI_BLOCK_IO_INTERFACE_REVISION2  EFI_BLOCK_IO_PROTOCOL_REVISION2
53#define EFI_BLOCK_IO_INTERFACE_REVISION3  EFI_BLOCK_IO_PROTOCOL_REVISION3
54
55INTERFACE_DECL(_EFI_BLOCK_IO_PROTOCOL);
56
57typedef
58EFI_STATUS
59(EFIAPI *EFI_BLOCK_RESET) (
60    IN struct _EFI_BLOCK_IO_PROTOCOL  *This,
61    IN BOOLEAN                        ExtendedVerification
62    );
63
64typedef
65EFI_STATUS
66(EFIAPI *EFI_BLOCK_READ) (
67    IN struct _EFI_BLOCK_IO_PROTOCOL  *This,
68    IN UINT32                         MediaId,
69    IN EFI_LBA                        LBA,
70    IN UINTN                          BufferSize,
71    OUT VOID                          *Buffer
72    );
73
74
75typedef
76EFI_STATUS
77(EFIAPI *EFI_BLOCK_WRITE) (
78    IN struct _EFI_BLOCK_IO_PROTOCOL  *This,
79    IN UINT32                         MediaId,
80    IN EFI_LBA                        LBA,
81    IN UINTN                          BufferSize,
82    IN VOID                           *Buffer
83    );
84
85
86typedef
87EFI_STATUS
88(EFIAPI *EFI_BLOCK_FLUSH) (
89    IN struct _EFI_BLOCK_IO_PROTOCOL  *This
90    );
91
92
93
94typedef struct {
95    UINT32              MediaId;
96    BOOLEAN             RemovableMedia;
97    BOOLEAN             MediaPresent;
98
99    BOOLEAN             LogicalPartition;
100    BOOLEAN             ReadOnly;
101    BOOLEAN             WriteCaching;
102
103    UINT32              BlockSize;
104    UINT32              IoAlign;
105
106    EFI_LBA             LastBlock;
107
108    /* revision 2 */
109    EFI_LBA             LowestAlignedLba;
110    UINT32              LogicalBlocksPerPhysicalBlock;
111    /* revision 3 */
112    UINT32              OptimalTransferLengthGranularity;
113} EFI_BLOCK_IO_MEDIA;
114
115typedef struct _EFI_BLOCK_IO_PROTOCOL {
116    UINT64                  Revision;
117
118    EFI_BLOCK_IO_MEDIA      *Media;
119
120    EFI_BLOCK_RESET         Reset;
121    EFI_BLOCK_READ          ReadBlocks;
122    EFI_BLOCK_WRITE         WriteBlocks;
123    EFI_BLOCK_FLUSH         FlushBlocks;
124
125} EFI_BLOCK_IO_PROTOCOL;
126
127typedef struct _EFI_BLOCK_IO_PROTOCOL _EFI_BLOCK_IO;
128typedef EFI_BLOCK_IO_PROTOCOL EFI_BLOCK_IO;
129
130#define EFI_BLOCK_IO2_PROTOCOL_GUID \
131    { 0xa77b2472, 0xe282, 0x4e9f, {0xa2, 0x45, 0xc2, 0xc0, 0xe2, 0x7b, 0xbc, 0xc1} }
132
133INTERFACE_DECL(_EFI_BLOCK_IO2_PROTOCOL);
134
135typedef struct {
136    EFI_EVENT               Event;
137    EFI_STATUS              TransactionStatus;
138} EFI_BLOCK_IO2_TOKEN;
139
140typedef
141EFI_STATUS
142(EFIAPI *EFI_BLOCK_RESET_EX) (
143    IN struct _EFI_BLOCK_IO2_PROTOCOL  *This,
144    IN BOOLEAN                         ExtendedVerification
145    );
146
147typedef
148EFI_STATUS
149(EFIAPI *EFI_BLOCK_READ_EX) (
150    IN struct _EFI_BLOCK_IO2_PROTOCOL  *This,
151    IN UINT32                          MediaId,
152    IN EFI_LBA                         LBA,
153    IN OUT EFI_BLOCK_IO2_TOKEN         *Token,
154    IN UINTN                           BufferSize,
155    OUT VOID                           *Buffer
156    );
157
158typedef
159EFI_STATUS
160(EFIAPI *EFI_BLOCK_WRITE_EX) (
161    IN struct _EFI_BLOCK_IO2_PROTOCOL  *This,
162    IN UINT32                          MediaId,
163    IN EFI_LBA                         LBA,
164    IN OUT EFI_BLOCK_IO2_TOKEN         *Token,
165    IN UINTN                           BufferSize,
166    IN VOID                            *Buffer
167    );
168
169typedef
170EFI_STATUS
171(EFIAPI *EFI_BLOCK_FLUSH_EX) (
172    IN struct _EFI_BLOCK_IO2_PROTOCOL  *This,
173    IN OUT EFI_BLOCK_IO2_TOKEN         *Token
174    );
175
176typedef struct _EFI_BLOCK_IO2_PROTOCOL {
177    EFI_BLOCK_IO_MEDIA  *Media;
178    EFI_BLOCK_RESET_EX  Reset;
179    EFI_BLOCK_READ_EX   ReadBlocksEx;
180    EFI_BLOCK_WRITE_EX  WriteBlocksEx;
181    EFI_BLOCK_FLUSH_EX  FlushBlocksEx;
182} EFI_BLOCK_IO2_PROTOCOL;
183
184//
185// Disk Block IO protocol
186//
187
188#define EFI_DISK_IO_PROTOCOL_GUID \
189    { 0xce345171, 0xba0b, 0x11d2,  {0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
190#define DISK_IO_PROTOCOL EFI_DISK_IO_PROTOCOL_GUID
191
192#define EFI_DISK_IO_PROTOCOL_REVISION  0x00010000
193#define EFI_DISK_IO_INTERFACE_REVISION EFI_DISK_IO_PROTOCOL_REVISION
194
195INTERFACE_DECL(_EFI_DISK_IO_PROTOCOL);
196
197typedef
198EFI_STATUS
199(EFIAPI *EFI_DISK_READ) (
200    IN struct _EFI_DISK_IO_PROTOCOL  *This,
201    IN UINT32                        MediaId,
202    IN UINT64                        Offset,
203    IN UINTN                         BufferSize,
204    OUT VOID                         *Buffer
205    );
206
207
208typedef
209EFI_STATUS
210(EFIAPI *EFI_DISK_WRITE) (
211    IN struct _EFI_DISK_IO_PROTOCOL  *This,
212    IN UINT32                        MediaId,
213    IN UINT64                        Offset,
214    IN UINTN                         BufferSize,
215    IN VOID                          *Buffer
216    );
217
218
219typedef struct _EFI_DISK_IO_PROTOCOL {
220    UINT64              Revision;
221    EFI_DISK_READ       ReadDisk;
222    EFI_DISK_WRITE      WriteDisk;
223} EFI_DISK_IO_PROTOCOL;
224
225typedef struct _EFI_DISK_IO_PROTOCOL _EFI_DISK_IO;
226typedef EFI_DISK_IO_PROTOCOL EFI_DISK_IO;
227
228
229#define EFI_DISK_IO2_PROTOCOL_GUID \
230    { 0x151c8eae, 0x7f2c, 0x472c,  {0x9e, 0x54, 0x98, 0x28, 0x19, 0x4f, 0x6a, 0x88} }
231
232#define EFI_DISK_IO2_PROTOCOL_REVISION  0x00020000
233
234INTERFACE_DECL(_EFI_DISK_IO2_PROTOCOL);
235
236typedef struct {
237    EFI_EVENT  Event;
238    EFI_STATUS TransactionStatus;
239} EFI_DISK_IO2_TOKEN;
240
241typedef
242EFI_STATUS
243(EFIAPI *EFI_DISK_CANCEL_EX) (
244    IN struct _EFI_DISK_IO2_PROTOCOL  *This
245    );
246
247typedef
248EFI_STATUS
249(EFIAPI *EFI_DISK_READ_EX) (
250    IN struct _EFI_DISK_IO2_PROTOCOL  *This,
251    IN UINT32                         MediaId,
252    IN UINT64                         Offset,
253    IN OUT EFI_DISK_IO2_TOKEN         *Token,
254    IN UINTN                          BufferSize,
255    OUT VOID                          *Buffer
256    );
257
258typedef
259EFI_STATUS
260(EFIAPI *EFI_DISK_WRITE_EX) (
261    IN struct _EFI_DISK_IO2_PROTOCOL  *This,
262    IN UINT32                         MediaId,
263    IN UINT64                         Offset,
264    IN OUT EFI_DISK_IO2_TOKEN         *Token,
265    IN UINTN                          BufferSize,
266    IN VOID                           *Buffer
267    );
268
269typedef
270EFI_STATUS
271(EFIAPI *EFI_DISK_FLUSH_EX) (
272    IN struct _EFI_DISK_IO2_PROTOCOL  *This,
273    IN OUT EFI_DISK_IO2_TOKEN         *Token
274    );
275
276typedef struct _EFI_DISK_IO2_PROTOCOL {
277    UINT64                            Revision;
278    EFI_DISK_CANCEL_EX                Cancel;
279    EFI_DISK_READ_EX                  ReadDiskEx;
280    EFI_DISK_WRITE_EX                 WriteDiskEx;
281    EFI_DISK_FLUSH_EX                 FlushDiskEx;
282} EFI_DISK_IO2_PROTOCOL;
283
284//
285// Simple file system protocol
286//
287
288#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
289    { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
290#define SIMPLE_FILE_SYSTEM_PROTOCOL EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID
291
292INTERFACE_DECL(_EFI_SIMPLE_FILE_SYSTEM_PROTOCOL);
293INTERFACE_DECL(_EFI_FILE_HANDLE);
294
295typedef
296EFI_STATUS
297(EFIAPI *EFI_VOLUME_OPEN) (
298    IN struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
299    OUT struct _EFI_FILE_HANDLE                   **Root
300    );
301
302#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION  0x00010000
303#define EFI_FILE_IO_INTERFACE_REVISION EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION
304
305typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {
306    UINT64                  Revision;
307    EFI_VOLUME_OPEN         OpenVolume;
308} EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;
309
310typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL _EFI_FILE_IO_INTERFACE;
311typedef EFI_SIMPLE_FILE_SYSTEM_PROTOCOL EFI_FILE_IO_INTERFACE;
312
313//
314//
315//
316
317typedef
318EFI_STATUS
319(EFIAPI *EFI_FILE_OPEN) (
320    IN struct _EFI_FILE_HANDLE  *File,
321    OUT struct _EFI_FILE_HANDLE **NewHandle,
322    IN CHAR16                   *FileName,
323    IN UINT64                   OpenMode,
324    IN UINT64                   Attributes
325    );
326
327// Open modes
328#define EFI_FILE_MODE_READ      0x0000000000000001
329#define EFI_FILE_MODE_WRITE     0x0000000000000002
330#define EFI_FILE_MODE_CREATE    0x8000000000000000
331
332// File attributes
333#define EFI_FILE_READ_ONLY      0x0000000000000001
334#define EFI_FILE_HIDDEN         0x0000000000000002
335#define EFI_FILE_SYSTEM         0x0000000000000004
336#define EFI_FILE_RESERVIED      0x0000000000000008
337#define EFI_FILE_DIRECTORY      0x0000000000000010
338#define EFI_FILE_ARCHIVE        0x0000000000000020
339#define EFI_FILE_VALID_ATTR     0x0000000000000037
340
341typedef
342EFI_STATUS
343(EFIAPI *EFI_FILE_CLOSE) (
344    IN struct _EFI_FILE_HANDLE  *File
345    );
346
347typedef
348EFI_STATUS
349(EFIAPI *EFI_FILE_DELETE) (
350    IN struct _EFI_FILE_HANDLE  *File
351    );
352
353typedef
354EFI_STATUS
355(EFIAPI *EFI_FILE_READ) (
356    IN struct _EFI_FILE_HANDLE  *File,
357    IN OUT UINTN                *BufferSize,
358    OUT VOID                    *Buffer
359    );
360
361typedef
362EFI_STATUS
363(EFIAPI *EFI_FILE_WRITE) (
364    IN struct _EFI_FILE_HANDLE  *File,
365    IN OUT UINTN                *BufferSize,
366    IN VOID                     *Buffer
367    );
368
369typedef
370EFI_STATUS
371(EFIAPI *EFI_FILE_SET_POSITION) (
372    IN struct _EFI_FILE_HANDLE  *File,
373    IN UINT64                   Position
374    );
375
376typedef
377EFI_STATUS
378(EFIAPI *EFI_FILE_GET_POSITION) (
379    IN struct _EFI_FILE_HANDLE  *File,
380    OUT UINT64                  *Position
381    );
382
383typedef
384EFI_STATUS
385(EFIAPI *EFI_FILE_GET_INFO) (
386    IN struct _EFI_FILE_HANDLE  *File,
387    IN EFI_GUID                 *InformationType,
388    IN OUT UINTN                *BufferSize,
389    OUT VOID                    *Buffer
390    );
391
392typedef
393EFI_STATUS
394(EFIAPI *EFI_FILE_SET_INFO) (
395    IN struct _EFI_FILE_HANDLE  *File,
396    IN EFI_GUID                 *InformationType,
397    IN UINTN                    BufferSize,
398    IN VOID                     *Buffer
399    );
400
401typedef
402EFI_STATUS
403(EFIAPI *EFI_FILE_FLUSH) (
404    IN struct _EFI_FILE_HANDLE  *File
405    );
406
407typedef struct {
408    EFI_EVENT       Event;
409    EFI_STATUS      Status;
410    UINTN           BufferSize;
411    VOID            *Buffer;
412} EFI_FILE_IO_TOKEN;
413
414typedef
415EFI_STATUS
416(EFIAPI *EFI_FILE_OPEN_EX)(
417    IN struct _EFI_FILE_HANDLE  *File,
418    OUT struct _EFI_FILE_HANDLE **NewHandle,
419    IN CHAR16                   *FileName,
420    IN UINT64                   OpenMode,
421    IN UINT64                   Attributes,
422    IN OUT EFI_FILE_IO_TOKEN    *Token
423    );
424
425typedef
426EFI_STATUS
427(EFIAPI *EFI_FILE_READ_EX) (
428    IN struct _EFI_FILE_HANDLE  *File,
429    IN OUT EFI_FILE_IO_TOKEN    *Token
430    );
431
432typedef
433EFI_STATUS
434(EFIAPI *EFI_FILE_WRITE_EX) (
435    IN struct _EFI_FILE_HANDLE  *File,
436    IN OUT EFI_FILE_IO_TOKEN    *Token
437    );
438
439typedef
440EFI_STATUS
441(EFIAPI *EFI_FILE_FLUSH_EX) (
442    IN struct _EFI_FILE_HANDLE  *File,
443    IN OUT EFI_FILE_IO_TOKEN    *Token
444    );
445
446#define EFI_FILE_PROTOCOL_REVISION         0x00010000
447#define EFI_FILE_PROTOCOL_REVISION2        0x00020000
448#define EFI_FILE_PROTOCOL_LATEST_REVISION  EFI_FILE_PROTOCOL_REVISION2
449#define EFI_FILE_HANDLE_REVISION           EFI_FILE_PROTOCOL_REVISION
450
451typedef struct _EFI_FILE_HANDLE {
452    UINT64                  Revision;
453    EFI_FILE_OPEN           Open;
454    EFI_FILE_CLOSE          Close;
455    EFI_FILE_DELETE         Delete;
456    EFI_FILE_READ           Read;
457    EFI_FILE_WRITE          Write;
458    EFI_FILE_GET_POSITION   GetPosition;
459    EFI_FILE_SET_POSITION   SetPosition;
460    EFI_FILE_GET_INFO       GetInfo;
461    EFI_FILE_SET_INFO       SetInfo;
462    EFI_FILE_FLUSH          Flush;
463    EFI_FILE_OPEN_EX        OpenEx;
464    EFI_FILE_READ_EX        ReadEx;
465    EFI_FILE_WRITE_EX       WriteEx;
466    EFI_FILE_FLUSH_EX       FlushEx;
467} EFI_FILE_PROTOCOL, *EFI_FILE_HANDLE;
468
469typedef EFI_FILE_PROTOCOL EFI_FILE;
470
471
472//
473// File information types
474//
475
476#define EFI_FILE_INFO_ID   \
477    { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
478
479typedef struct {
480    UINT64                  Size;
481    UINT64                  FileSize;
482    UINT64                  PhysicalSize;
483    EFI_TIME                CreateTime;
484    EFI_TIME                LastAccessTime;
485    EFI_TIME                ModificationTime;
486    UINT64                  Attribute;
487    CHAR16                  FileName[1];
488} EFI_FILE_INFO;
489
490//
491// The FileName field of the EFI_FILE_INFO data structure is variable length.
492// Whenever code needs to know the size of the EFI_FILE_INFO data structure, it needs to
493// be the size of the data structure without the FileName field.  The following macro
494// computes this size correctly no matter how big the FileName array is declared.
495// This is required to make the EFI_FILE_INFO data structure ANSI compilant.
496//
497
498#define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName)
499
500#define EFI_FILE_SYSTEM_INFO_ID    \
501    { 0x9576e93, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
502
503typedef struct {
504    UINT64                  Size;
505    BOOLEAN                 ReadOnly;
506    UINT64                  VolumeSize;
507    UINT64                  FreeSpace;
508    UINT32                  BlockSize;
509    CHAR16                  VolumeLabel[1];
510} EFI_FILE_SYSTEM_INFO;
511
512//
513// The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length.
514// Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data structure, it needs
515// to be the size of the data structure without the VolumeLable field.  The following macro
516// computes this size correctly no matter how big the VolumeLable array is declared.
517// This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI compilant.
518//
519
520#define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_INFO,VolumeLabel)
521
522#define EFI_FILE_SYSTEM_VOLUME_LABEL_ID    \
523    { 0xDB47D7D3,0xFE81, 0x11d3, {0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
524
525typedef struct {
526    CHAR16                  VolumeLabel[1];
527} EFI_FILE_SYSTEM_VOLUME_LABEL;
528
529#define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_VOLUME_LABEL,VolumeLabel)
530
531//
532// For compatibility with older versions of gnu-efi
533//
534#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID EFI_FILE_SYSTEM_VOLUME_LABEL_ID
535#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO    EFI_FILE_SYSTEM_VOLUME_LABEL
536
537//
538// Load file protocol
539//
540
541
542#define EFI_LOAD_FILE_PROTOCOL_GUID \
543    { 0x56EC3091, 0x954C, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
544#define LOAD_FILE_PROTOCOL EFI_LOAD_FILE_PROTOCOL_GUID
545
546INTERFACE_DECL(_EFI_LOAD_FILE_PROTOCOL);
547
548typedef
549EFI_STATUS
550(EFIAPI *EFI_LOAD_FILE) (
551    IN struct _EFI_LOAD_FILE_PROTOCOL  *This,
552    IN EFI_DEVICE_PATH                  *FilePath,
553    IN BOOLEAN                          BootPolicy,
554    IN OUT UINTN                        *BufferSize,
555    IN VOID                             *Buffer OPTIONAL
556    );
557
558typedef struct _EFI_LOAD_FILE_PROTOCOL {
559    EFI_LOAD_FILE                       LoadFile;
560} EFI_LOAD_FILE_PROTOCOL;
561
562typedef struct _EFI_LOAD_FILE_PROTOCOL _EFI_LOAD_FILE_INTERFACE;
563typedef EFI_LOAD_FILE_PROTOCOL EFI_LOAD_FILE_INTERFACE;
564
565//
566// Device IO protocol
567//
568
569#define EFI_DEVICE_IO_PROTOCOL_GUID \
570    { 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
571#define DEVICE_IO_PROTOCOL EFI_DEVICE_IO_PROTOCOL_GUID
572
573INTERFACE_DECL(_EFI_DEVICE_IO_PROTOCOL);
574
575typedef enum {
576    IO_UINT8,
577    IO_UINT16,
578    IO_UINT32,
579    IO_UINT64,
580//
581// Specification Change: Copy from MMIO to MMIO vs. MMIO to buffer, buffer to MMIO
582//
583    MMIO_COPY_UINT8,
584    MMIO_COPY_UINT16,
585    MMIO_COPY_UINT32,
586    MMIO_COPY_UINT64
587} EFI_IO_WIDTH;
588
589#define EFI_PCI_ADDRESS(_bus,_dev,_func) \
590    ( (UINT64) ( (((UINTN)_bus) << 24) + (((UINTN)_dev) << 16) + (((UINTN)_func) << 8) ) )
591
592
593typedef
594EFI_STATUS
595(EFIAPI *EFI_DEVICE_IO) (
596    IN struct _EFI_DEVICE_IO_PROTOCOL *This,
597    IN EFI_IO_WIDTH                 Width,
598    IN UINT64                       Address,
599    IN UINTN                        Count,
600    IN OUT VOID                     *Buffer
601    );
602
603typedef struct {
604    EFI_DEVICE_IO                   Read;
605    EFI_DEVICE_IO                   Write;
606} EFI_IO_ACCESS;
607
608typedef
609EFI_STATUS
610(EFIAPI *EFI_PCI_DEVICE_PATH) (
611    IN struct _EFI_DEVICE_IO_PROTOCOL   *This,
612    IN UINT64                           Address,
613    IN OUT EFI_DEVICE_PATH              **PciDevicePath
614    );
615
616typedef enum {
617    EfiBusMasterRead,
618    EfiBusMasterWrite,
619    EfiBusMasterCommonBuffer
620} EFI_IO_OPERATION_TYPE;
621
622typedef
623EFI_STATUS
624(EFIAPI *EFI_IO_MAP) (
625    IN struct _EFI_DEVICE_IO_PROTOCOL   *This,
626    IN EFI_IO_OPERATION_TYPE            Operation,
627    IN EFI_PHYSICAL_ADDRESS             *HostAddress,
628    IN OUT UINTN                        *NumberOfBytes,
629    OUT EFI_PHYSICAL_ADDRESS            *DeviceAddress,
630    OUT VOID                            **Mapping
631    );
632
633typedef
634EFI_STATUS
635(EFIAPI *EFI_IO_UNMAP) (
636    IN struct _EFI_DEVICE_IO_PROTOCOL   *This,
637    IN VOID                             *Mapping
638    );
639
640typedef
641EFI_STATUS
642(EFIAPI *EFI_IO_ALLOCATE_BUFFER) (
643    IN struct _EFI_DEVICE_IO_PROTOCOL   *This,
644    IN EFI_ALLOCATE_TYPE                Type,
645    IN EFI_MEMORY_TYPE                  MemoryType,
646    IN UINTN                            Pages,
647    IN OUT EFI_PHYSICAL_ADDRESS         *HostAddress
648    );
649
650typedef
651EFI_STATUS
652(EFIAPI *EFI_IO_FLUSH) (
653    IN struct _EFI_DEVICE_IO_PROTOCOL   *This
654    );
655
656typedef
657EFI_STATUS
658(EFIAPI *EFI_IO_FREE_BUFFER) (
659    IN struct _EFI_DEVICE_IO_PROTOCOL   *This,
660    IN UINTN                            Pages,
661    IN EFI_PHYSICAL_ADDRESS             HostAddress
662    );
663
664typedef struct _EFI_DEVICE_IO_PROTOCOL {
665    EFI_IO_ACCESS                       Mem;
666    EFI_IO_ACCESS                       Io;
667    EFI_IO_ACCESS                       Pci;
668    EFI_IO_MAP                          Map;
669    EFI_PCI_DEVICE_PATH                 PciDevicePath;
670    EFI_IO_UNMAP                        Unmap;
671    EFI_IO_ALLOCATE_BUFFER              AllocateBuffer;
672    EFI_IO_FLUSH                        Flush;
673    EFI_IO_FREE_BUFFER                  FreeBuffer;
674} EFI_DEVICE_IO_PROTOCOL;
675
676typedef struct _EFI_DEVICE_IO_PROTOCOL _EFI_DEVICE_IO_INTERFACE;
677typedef EFI_DEVICE_IO_PROTOCOL EFI_DEVICE_IO_INTERFACE;
678
679//
680// Unicode Collation protocol
681//
682
683#define EFI_UNICODE_COLLATION_PROTOCOL_GUID \
684    { 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc,  0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
685#define UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL_GUID
686
687#define EFI_UNICODE_BYTE_ORDER_MARK       (CHAR16)(0xfeff)
688#define UNICODE_BYTE_ORDER_MARK EFI_UNICODE_BYTE_ORDER_MARK
689
690INTERFACE_DECL(_EFI_UNICODE_COLLATION_PROTOCOL);
691
692typedef
693INTN
694(EFIAPI *EFI_UNICODE_STRICOLL) (
695    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
696    IN CHAR16                         *s1,
697    IN CHAR16                         *s2
698    );
699
700typedef
701BOOLEAN
702(EFIAPI *EFI_UNICODE_METAIMATCH) (
703    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
704    IN CHAR16                         *String,
705    IN CHAR16                         *Pattern
706    );
707
708typedef
709VOID
710(EFIAPI *EFI_UNICODE_STRLWR) (
711    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
712    IN OUT CHAR16                       *Str
713    );
714
715typedef
716VOID
717(EFIAPI *EFI_UNICODE_STRUPR) (
718    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
719    IN OUT CHAR16                       *Str
720    );
721
722typedef
723VOID
724(EFIAPI *EFI_UNICODE_FATTOSTR) (
725    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
726    IN UINTN                            FatSize,
727    IN CHAR8                            *Fat,
728    OUT CHAR16                          *String
729    );
730
731typedef
732BOOLEAN
733(EFIAPI *EFI_UNICODE_STRTOFAT) (
734    IN struct _EFI_UNICODE_COLLATION_PROTOCOL  *This,
735    IN CHAR16                           *String,
736    IN UINTN                            FatSize,
737    OUT CHAR8                           *Fat
738    );
739
740//
741// Hash Protocol
742//
743#define EFI_HASH_PROTOCOL_GUID \
744  { 0xC5184932, 0xDBA5, 0x46DB, { 0xA5, 0xBA, 0xCC, 0x0B, 0xDA, 0x9C, 0x14, 0x35 } }
745#define HASH_PROTOCOL EFI_HASH_PROTOCOL_GUID
746
747#define EFI_HASH_ALGORITHM_SHA1_GUID \
748  { 0x2AE9D80F, 0x3FB2, 0x4095, { 0xB7, 0xB1, 0xE9, 0x31, 0x57, 0xB9, 0x46, 0xB6 } } // Deprecated
749#define EFI_HASH_ALGORITHM_SHA1 EFI_HASH_ALGORITHM_SHA1_GUID
750
751#define EFI_HASH_ALGORITHM_SHA224_GUID \
752  { 0x8DF01A06, 0x9BD5, 0x4BF7, { 0xB0, 0x21, 0xDB, 0x4F, 0xD9, 0xCC, 0xF4, 0x5B } } // Deprecated
753#define EFI_HASH_ALGORITHM_SHA224 EFI_HASH_ALGORITHM_SHA224_GUID
754
755#define EFI_HASH_ALGORITHM_SHA256_GUID \
756  { 0x51AA59DE, 0xFDF2, 0x4EA3, { 0xBC, 0x63, 0x87, 0x5F, 0xB7, 0x84, 0x2E, 0xE9 } } // Deprecated
757#define EFI_HASH_ALGORITHM_SHA256 EFI_HASH_ALGORITHM_SHA256_GUID
758
759#define EFI_HASH_ALGORITHM_SHA384_GUID \
760  { 0xEFA96432, 0xDE33, 0x4DD2, { 0xAE, 0xE6, 0x32, 0x8C, 0x33, 0xDF, 0x77, 0x7A } } // Deprecated
761#define EFI_HASH_ALGORITHM_SHA384 EFI_HASH_ALGORITHM_SHA384_GUID
762
763#define EFI_HASH_ALGORITHM_SHA512_GUID \
764  { 0xCAA4381E, 0x750C, 0x4770, { 0xB8, 0x70, 0x7A, 0x23, 0xB4, 0xE4, 0x21, 0x30 } } // Deprecated
765#define EFI_HASH_ALGORITHM_SHA512 EFI_HASH_ALGORITHM_SHA512_GUID
766
767#define EFI_HASH_ALGORITHM_MD5_GUID \
768  { 0x0AF7C79C, 0x65B5, 0x4319, { 0xB0, 0xAE, 0x44, 0xEC, 0x48, 0x4E, 0x4A, 0xD7 } } // Deprecated
769#define EFI_HASH_ALGORITHM_MD5 EFI_HASH_ALGORITHM_MD5_GUID
770
771#define EFI_HASH_ALGORITHM_SHA1_NOPAD_GUID \
772  { 0x24C5DC2F, 0x53E2, 0x40CA, { 0x9E, 0xD6, 0xA5, 0xD9, 0xA4, 0x9F, 0x46, 0x3B } }
773#define EFI_HASH_ALGORITHM_SHA1_NOPAD EFI_HASH_ALGORITHM_SHA1_NOPAD_GUID
774
775#define EFI_HASH_ALGORITHM_SHA256_NOPAD_GUID \
776  { 0x8628752A, 0x6CB7, 0x4814, { 0x96, 0xFC, 0x24, 0xA8, 0x15, 0xAC, 0x22, 0x26 } }
777#define EFI_HASH_ALGORITHM_SHA256_NOPAD EFI_HASH_ALGORITHM_SHA256_NOPAD_GUID
778
779
780INTERFACE_DECL(_EFI_HASH_PROTOCOL);
781
782typedef UINT8 EFI_MD5_HASH[16];
783typedef UINT8 EFI_SHA1_HASH[20];
784typedef UINT8 EFI_SHA224_HASH[28];
785typedef UINT8 EFI_SHA256_HASH[32];
786typedef UINT8 EFI_SHA384_HASH[48];
787typedef UINT8 EFI_SHA512_HASH[64];
788typedef union _EFI_HASH_OUTPUT {
789  EFI_MD5_HASH                    *Md5Hash;
790  EFI_SHA1_HASH                   *Sha1Hash;
791  EFI_SHA224_HASH                 *Sha224Hash;
792  EFI_SHA256_HASH                 *Sha256Hash;
793  EFI_SHA384_HASH                 *Sha384Hash;
794  EFI_SHA512_HASH                 *Sha512Hash;
795} EFI_HASH_OUTPUT;
796
797typedef
798EFI_STATUS
799(EFIAPI *EFI_HASH_GET_HASH_SIZE) (
800  IN CONST struct _EFI_HASH_PROTOCOL  *This,
801  IN CONST EFI_GUID               *HashAlgorithm,
802  OUT UINTN                       *HashSize);
803
804typedef
805EFI_STATUS
806(EFIAPI *EFI_HASH_HASH) (
807  IN CONST struct _EFI_HASH_PROTOCOL  *This,
808  IN CONST EFI_GUID               *HashAlgorithm,
809  IN BOOLEAN                      Extend,
810  IN CONST UINT8                  *Message,
811  IN UINT64                       MessageSize,
812  IN OUT EFI_HASH_OUTPUT          *Hash);
813
814typedef struct _EFI_HASH_PROTOCOL {
815  EFI_HASH_GET_HASH_SIZE                  GetHashSize;
816  EFI_HASH_HASH                           Hash;
817} EFI_HASH_PROTOCOL;
818
819typedef struct _EFI_HASH_PROTOCOL _EFI_HASH;
820typedef EFI_HASH_PROTOCOL EFI_HASH;
821
822
823typedef struct _EFI_UNICODE_COLLATION_PROTOCOL {
824
825    // general
826    EFI_UNICODE_STRICOLL                StriColl;
827    EFI_UNICODE_METAIMATCH              MetaiMatch;
828    EFI_UNICODE_STRLWR                  StrLwr;
829    EFI_UNICODE_STRUPR                  StrUpr;
830
831    // for supporting fat volumes
832    EFI_UNICODE_FATTOSTR                FatToStr;
833    EFI_UNICODE_STRTOFAT                StrToFat;
834
835    CHAR8                               *SupportedLanguages;
836} EFI_UNICODE_COLLATION_PROTOCOL;
837
838typedef EFI_UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_INTERFACE;
839
840/* Graphics output protocol */
841#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
842   { 0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a } }
843typedef struct _EFI_GRAPHICS_OUTPUT_PROTOCOL EFI_GRAPHICS_OUTPUT_PROTOCOL;
844
845typedef struct {
846  UINT32            RedMask;
847  UINT32            GreenMask;
848  UINT32            BlueMask;
849  UINT32            ReservedMask;
850} EFI_PIXEL_BITMASK;
851
852typedef enum {
853  PixelRedGreenBlueReserved8BitPerColor,
854  PixelBlueGreenRedReserved8BitPerColor,
855  PixelBitMask,
856  PixelBltOnly,
857  PixelFormatMax
858} EFI_GRAPHICS_PIXEL_FORMAT;
859
860typedef struct {
861  UINT32                     Version;
862  UINT32                     HorizontalResolution;
863  UINT32                     VerticalResolution;
864  EFI_GRAPHICS_PIXEL_FORMAT  PixelFormat;
865  EFI_PIXEL_BITMASK          PixelInformation;
866  UINT32                     PixelsPerScanLine;
867} EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;
868
869/**
870  Return the current video mode information.
871
872  @param  This       Protocol instance pointer.
873  @param  ModeNumber The mode number to return information on.
874  @param  SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
875  @param  Info       A pointer to callee allocated buffer that returns information about ModeNumber.
876
877  @retval EFI_SUCCESS           Mode information returned.
878  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
879  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.
880  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
881  @retval EFI_INVALID_PARAMETER One of the input args was NULL.
882
883**/
884typedef
885EFI_STATUS
886(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) (
887  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
888  IN  UINT32                                ModeNumber,
889  OUT UINTN                                 *SizeOfInfo,
890  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
891  )
892;
893
894/**
895  Return the current video mode information.
896
897  @param  This              Protocol instance pointer.
898  @param  ModeNumber        The mode number to be set.
899
900  @retval EFI_SUCCESS       Graphics mode was changed.
901  @retval EFI_DEVICE_ERROR  The device had an error and could not complete the request.
902  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.
903
904**/
905typedef
906EFI_STATUS
907(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) (
908  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
909  IN  UINT32                       ModeNumber
910  );
911
912typedef struct {
913  UINT8 Blue;
914  UINT8 Green;
915  UINT8 Red;
916  UINT8 Reserved;
917} EFI_GRAPHICS_OUTPUT_BLT_PIXEL;
918
919typedef union {
920  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Pixel;
921  UINT32                        Raw;
922} EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION;
923
924typedef enum {
925  EfiBltVideoFill,
926  EfiBltVideoToBltBuffer,
927  EfiBltBufferToVideo,
928  EfiBltVideoToVideo,
929  EfiGraphicsOutputBltOperationMax
930} EFI_GRAPHICS_OUTPUT_BLT_OPERATION;
931
932/**
933  The following table defines actions for BltOperations:
934
935  <B>EfiBltVideoFill</B> - Write data from the  BltBuffer pixel (SourceX, SourceY)
936  directly to every pixel of the video display rectangle
937  (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height).
938  Only one pixel will be used from the BltBuffer. Delta is NOT used.
939
940  <B>EfiBltVideoToBltBuffer</B> - Read data from the video display rectangle
941  (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in
942  the BltBuffer rectangle (DestinationX, DestinationY )
943  (DestinationX + Width, DestinationY + Height). If DestinationX or
944  DestinationY is not zero then Delta must be set to the length in bytes
945  of a row in the BltBuffer.
946
947  <B>EfiBltBufferToVideo</B> - Write data from the  BltBuffer rectangle
948  (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the
949  video display rectangle (DestinationX, DestinationY)
950  (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is
951  not zero then Delta must be set to the length in bytes of a row in the
952  BltBuffer.
953
954  <B>EfiBltVideoToVideo</B> - Copy from the video display rectangle (SourceX, SourceY)
955  (SourceX + Width, SourceY + Height) .to the video display rectangle
956  (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height).
957  The BltBuffer and Delta  are not used in this mode.
958
959  @param  This         Protocol instance pointer.
960  @param  BltBuffer    Buffer containing data to blit into video buffer. This
961                       buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
962  @param  BltOperation Operation to perform on BlitBuffer and video memory
963  @param  SourceX      X coordinate of source for the BltBuffer.
964  @param  SourceY      Y coordinate of source for the BltBuffer.
965  @param  DestinationX X coordinate of destination for the BltBuffer.
966  @param  DestinationY Y coordinate of destination for the BltBuffer.
967  @param  Width        Width of rectangle in BltBuffer in pixels.
968  @param  Height       Hight of rectangle in BltBuffer in pixels.
969  @param  Delta        OPTIONAL
970
971  @retval EFI_SUCCESS           The Blt operation completed.
972  @retval EFI_INVALID_PARAMETER BltOperation is not valid.
973  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the video buffer.
974
975**/
976typedef
977EFI_STATUS
978(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) (
979  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
980  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL
981  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
982  IN  UINTN                                   SourceX,
983  IN  UINTN                                   SourceY,
984  IN  UINTN                                   DestinationX,
985  IN  UINTN                                   DestinationY,
986  IN  UINTN                                   Width,
987  IN  UINTN                                   Height,
988  IN  UINTN                                   Delta         OPTIONAL
989  );
990
991typedef struct {
992  UINT32                                 MaxMode;
993  UINT32                                 Mode;
994  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION   *Info;
995  UINTN                                  SizeOfInfo;
996  EFI_PHYSICAL_ADDRESS                   FrameBufferBase;
997  UINTN                                  FrameBufferSize;
998} EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;
999
1000struct _EFI_GRAPHICS_OUTPUT_PROTOCOL {
1001  EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE  QueryMode;
1002  EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE    SetMode;
1003  EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT         Blt;
1004  EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE        *Mode;
1005};
1006
1007
1008
1009/*
1010 * EFI EDID Discovered Protocol
1011 * UEFI Specification Version 2.5 Section 11.9
1012 */
1013#define EFI_EDID_DISCOVERED_PROTOCOL_GUID \
1014    { 0x1C0C34F6, 0xD380, 0x41FA, { 0xA0, 0x49, 0x8a, 0xD0, 0x6C, 0x1A, 0x66, 0xAA} }
1015
1016typedef struct _EFI_EDID_DISCOVERED_PROTOCOL {
1017    UINT32   SizeOfEdid;
1018    UINT8   *Edid;
1019} EFI_EDID_DISCOVERED_PROTOCOL;
1020
1021
1022
1023/*
1024 * EFI EDID Active Protocol
1025 * UEFI Specification Version 2.5 Section 11.9
1026 */
1027#define EFI_EDID_ACTIVE_PROTOCOL_GUID \
1028    { 0xBD8C1056, 0x9F36, 0x44EC, { 0x92, 0xA8, 0xA6, 0x33, 0x7F, 0x81, 0x79, 0x86} }
1029
1030typedef struct _EFI_EDID_ACTIVE_PROTOCOL {
1031    UINT32   SizeOfEdid;
1032    UINT8   *Edid;
1033} EFI_EDID_ACTIVE_PROTOCOL;
1034
1035
1036
1037/*
1038 * EFI EDID Override Protocol
1039 * UEFI Specification Version 2.5 Section 11.9
1040 */
1041#define EFI_EDID_OVERRIDE_PROTOCOL_GUID \
1042    { 0x48ECB431, 0xFB72, 0x45C0, { 0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5} }
1043
1044INTERFACE_DECL(_EFI_EDID_OVERRIDE_PROTOCOL);
1045
1046typedef
1047EFI_STATUS
1048(EFIAPI *EFI_EDID_OVERRIDE_PROTOCOL_GET_EDID) (
1049  IN      struct _EFI_EDID_OVERRIDE_PROTOCOL   *This,
1050  IN      EFI_HANDLE                           *ChildHandle,
1051  OUT     UINT32                               *Attributes,
1052  IN OUT  UINTN                                *EdidSize,
1053  IN OUT  UINT8                               **Edid);
1054
1055typedef struct _EFI_EDID_OVERRIDE_PROTOCOL {
1056    EFI_EDID_OVERRIDE_PROTOCOL_GET_EDID  GetEdid;
1057} EFI_EDID_OVERRIDE_PROTOCOL;
1058
1059
1060
1061INTERFACE_DECL(_EFI_SERVICE_BINDING);
1062
1063typedef
1064EFI_STATUS
1065(EFIAPI *EFI_SERVICE_BINDING_CREATE_CHILD) (
1066    IN struct _EFI_SERVICE_BINDING *This,
1067    IN EFI_HANDLE                  *ChildHandle
1068    );
1069
1070typedef
1071EFI_STATUS
1072(EFIAPI *EFI_SERVICE_BINDING_DESTROY_CHILD) (
1073    IN struct _EFI_SERVICE_BINDING *This,
1074    IN EFI_HANDLE                  ChildHandle
1075    );
1076
1077typedef struct _EFI_SERVICE_BINDING {
1078    EFI_SERVICE_BINDING_CREATE_CHILD  CreateChild;
1079    EFI_SERVICE_BINDING_DESTROY_CHILD DestroyChild;
1080} EFI_SERVICE_BINDING;
1081
1082
1083
1084/*
1085 * EFI Driver Binding Protocol
1086 * UEFI Specification Version 2.5 Section 10.1
1087 */
1088#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
1089    { 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71} }
1090#define DRIVER_BINDING_PROTOCOL EFI_DRIVER_BINDING_PROTOCOL_GUID
1091
1092INTERFACE_DECL(_EFI_DRIVER_BINDING_PROTOCOL);
1093
1094typedef
1095EFI_STATUS
1096(EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED) (
1097  IN      struct _EFI_DRIVER_BINDING_PROTOCOL *This,
1098  IN      EFI_HANDLE                          ControllerHandle,
1099  IN      EFI_DEVICE_PATH                     *RemainingDevicePath OPTIONAL);
1100
1101typedef
1102EFI_STATUS
1103(EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_START) (
1104  IN      struct _EFI_DRIVER_BINDING_PROTOCOL *This,
1105  IN      EFI_HANDLE                          ControllerHandle,
1106  IN      EFI_DEVICE_PATH                     *RemainingDevicePath OPTIONAL);
1107
1108typedef
1109EFI_STATUS
1110(EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_STOP) (
1111  IN      struct _EFI_DRIVER_BINDING_PROTOCOL *This,
1112  IN      EFI_HANDLE                          ControllerHandle,
1113  IN      UINTN                               NumberOfChildren,
1114  IN      EFI_HANDLE                          *ChildHandleBuffer OPTIONAL);
1115
1116typedef struct _EFI_DRIVER_BINDING_PROTOCOL {
1117  EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED       Supported;
1118  EFI_DRIVER_BINDING_PROTOCOL_START           Start;
1119  EFI_DRIVER_BINDING_PROTOCOL_STOP            Stop;
1120  UINT32                                      Version;
1121  EFI_HANDLE                                  ImageHandle;
1122  EFI_HANDLE                                  DriverBindingHandle;
1123} EFI_DRIVER_BINDING_PROTOCOL;
1124
1125typedef struct _EFI_DRIVER_BINDING_PROTOCOL _EFI_DRIVER_BINDING;
1126typedef EFI_DRIVER_BINDING_PROTOCOL EFI_DRIVER_BINDING;
1127
1128
1129/*
1130 * Backwards compatibility with older GNU-EFI versions. Deprecated.
1131 */
1132#define EFI_DRIVER_SUPPORTED         EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED
1133#define EFI_DRIVER_START             EFI_DRIVER_BINDING_PROTOCOL_START
1134#define EFI_DRIVER_STOP              EFI_DRIVER_BINDING_PROTOCOL_STOP
1135
1136
1137
1138/*
1139 * EFI Component Name Protocol
1140 * Deprecated - use EFI Component Name 2 Protocol instead
1141 */
1142#define EFI_COMPONENT_NAME_PROTOCOL_GUID \
1143    {0x107A772C, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
1144#define COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME_PROTOCOL_GUID
1145
1146INTERFACE_DECL(_EFI_COMPONENT_NAME_PROTOCOL);
1147
1148typedef
1149EFI_STATUS
1150(EFIAPI *EFI_COMPONENT_NAME_GET_DRIVER_NAME) (
1151  IN      struct _EFI_COMPONENT_NAME_PROTOCOL   *This,
1152  IN      CHAR8                                 *Language,
1153  OUT     CHAR16                                **DriverName);
1154
1155typedef
1156EFI_STATUS
1157(EFIAPI *EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) (
1158  IN      struct _EFI_COMPONENT_NAME_PROTOCOL   *This,
1159  IN      EFI_HANDLE                            ControllerHandle,
1160  IN      EFI_HANDLE                            ChildHandle OPTIONAL,
1161  IN      CHAR8                                 *Language,
1162  OUT     CHAR16                                **ControllerName);
1163
1164typedef struct _EFI_COMPONENT_NAME_PROTOCOL {
1165  EFI_COMPONENT_NAME_GET_DRIVER_NAME      GetDriverName;
1166  EFI_COMPONENT_NAME_GET_CONTROLLER_NAME  GetControllerName;
1167  CHAR8                                   *SupportedLanguages;
1168} EFI_COMPONENT_NAME_PROTOCOL;
1169
1170typedef struct _EFI_COMPONENT_NAME_PROTOCOL _EFI_COMPONENT_NAME;
1171typedef EFI_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME;
1172
1173
1174/*
1175 * EFI Component Name 2 Protocol
1176 * UEFI Specification Version 2.5 Section 10.5
1177 */
1178#define EFI_COMPONENT_NAME2_PROTOCOL_GUID \
1179    {0x6A7A5CFF, 0xE8D9, 0x4F70, { 0xBA, 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14} }
1180#define COMPONENT_NAME2_PROTOCOL EFI_COMPONENT_NAME2_PROTOCOL_GUID
1181
1182INTERFACE_DECL(_EFI_COMPONENT_NAME2_PROTOCOL);
1183
1184typedef
1185EFI_STATUS
1186(EFIAPI *EFI_COMPONENT_NAME2_GET_DRIVER_NAME) (
1187  IN      struct _EFI_COMPONENT_NAME2_PROTOCOL   *This,
1188  IN      CHAR8                                  *Language,
1189  OUT     CHAR16                                 **DriverName);
1190
1191typedef
1192EFI_STATUS
1193(EFIAPI *EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) (
1194  IN      struct _EFI_COMPONENT_NAME2_PROTOCOL   *This,
1195  IN      EFI_HANDLE                             ControllerHandle,
1196  IN      EFI_HANDLE                             ChildHandle OPTIONAL,
1197  IN      CHAR8                                  *Language,
1198  OUT     CHAR16                                 **ControllerName);
1199
1200typedef struct _EFI_COMPONENT_NAME2_PROTOCOL {
1201  EFI_COMPONENT_NAME2_GET_DRIVER_NAME       GetDriverName;
1202  EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME   GetControllerName;
1203  CHAR8                                     *SupportedLanguages;
1204} EFI_COMPONENT_NAME2_PROTOCOL;
1205
1206typedef struct _EFI_COMPONENT_NAME2_PROTOCOL _EFI_COMPONENT_NAME2;
1207typedef EFI_COMPONENT_NAME2_PROTOCOL EFI_COMPONENT_NAME2;
1208
1209
1210
1211/*
1212 * EFI Loaded Image Protocol
1213 * UEFI Specification Version 2.5 Section 8.1
1214 */
1215#define EFI_LOADED_IMAGE_PROTOCOL_GUID \
1216    { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
1217#define LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL_GUID
1218
1219#define EFI_LOADED_IMAGE_PROTOCOL_REVISION  0x1000
1220#define EFI_IMAGE_INFORMATION_REVISION  EFI_LOADED_IMAGE_PROTOCOL_REVISION
1221
1222typedef
1223EFI_STATUS
1224(EFIAPI *EFI_IMAGE_UNLOAD) (
1225    IN EFI_HANDLE                   ImageHandle
1226    );
1227
1228typedef struct {
1229    UINT32                          Revision;
1230    EFI_HANDLE                      ParentHandle;
1231    struct _EFI_SYSTEM_TABLE        *SystemTable;
1232
1233    // Source location of image
1234    EFI_HANDLE                      DeviceHandle;
1235    EFI_DEVICE_PATH                 *FilePath;
1236    VOID                            *Reserved;
1237
1238    // Images load options
1239    UINT32                          LoadOptionsSize;
1240    VOID                            *LoadOptions;
1241
1242    // Location of where image was loaded
1243    VOID                            *ImageBase;
1244    UINT64                          ImageSize;
1245    EFI_MEMORY_TYPE                 ImageCodeType;
1246    EFI_MEMORY_TYPE                 ImageDataType;
1247
1248    // If the driver image supports a dynamic unload request
1249    EFI_IMAGE_UNLOAD                Unload;
1250} EFI_LOADED_IMAGE_PROTOCOL;
1251
1252typedef EFI_LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE;
1253
1254#define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \
1255    {0xbc62157e, 0x3e33, 0x4fec, {0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf} }
1256
1257/*
1258 * Random Number Generator Protocol
1259 * UEFI Specification Version 2.5 Section 35.5
1260 */
1261#define EFI_RNG_PROTOCOL_GUID                          \
1262          { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} }
1263
1264typedef EFI_GUID EFI_RNG_ALGORITHM;
1265
1266#define EFI_RNG_ALGORITHM_SP800_90_HASH_256_GUID       \
1267     {0xa7af67cb, 0x603b, 0x4d42, {0xba, 0x21, 0x70, 0xbf, 0xb6, 0x29, 0x3f, 0x96} }
1268
1269#define EFI_RNG_ALGORITHM_SP800_90_HMAC_256_GUID       \
1270     {0xc5149b43, 0xae85, 0x4f53, {0x99, 0x82, 0xb9, 0x43, 0x35, 0xd3, 0xa9, 0xe7} }
1271
1272#define EFI_RNG_ALGORITHM_SP800_90_CTR_256_GUID        \
1273     {0x44f0de6e, 0x4d8c, 0x4045, {0xa8, 0xc7, 0x4d, 0xd1, 0x68, 0x85, 0x6b, 0x9e} }
1274
1275#define EFI_RNG_ALGORITHM_X9_31_3DES_GUID              \
1276     {0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46} }
1277
1278#define EFI_RNG_ALGORITHM_X9_31_AES_GUID               \
1279     {0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9} }
1280
1281#define EFI_RNG_ALGORITHM_RAW                          \
1282     {0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61} }
1283
1284INTERFACE_DECL(_EFI_RNG_PROTOCOL);
1285
1286typedef
1287EFI_STATUS
1288(EFIAPI *EFI_RNG_GET_INFO) (
1289  IN      struct _EFI_RNG_PROTOCOL   *This,
1290  IN OUT  UINTN                      *RNGAlgorithmListSize,
1291  OUT     EFI_RNG_ALGORITHM          *RNGAlgorithmList
1292);
1293
1294typedef
1295EFI_STATUS
1296(EFIAPI *EFI_RNG_GET_RNG) (
1297  IN      struct _EFI_RNG_PROTOCOL   *This,
1298  IN      EFI_RNG_ALGORITHM          *RNGAlgorithm,           OPTIONAL
1299  IN      UINTN                      RNGValueLength,
1300  OUT     UINT8                      *RNGValue
1301);
1302
1303typedef struct _EFI_RNG_PROTOCOL {
1304          EFI_RNG_GET_INFO           GetInfo;
1305          EFI_RNG_GET_RNG            GetRNG;
1306} EFI_RNG_PROTOCOL;
1307
1308
1309//
1310// EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL
1311//
1312
1313#define EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL_GUID          \
1314          { 0x6b30c738, 0xa391, 0x11d4, {0x9a, 0x3b, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
1315
1316INTERFACE_DECL(_EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL);
1317
1318typedef
1319EFI_STATUS
1320(EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER) (
1321IN      struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL  *This,
1322IN      EFI_HANDLE                                      ControllerHandle,
1323IN OUT  EFI_HANDLE                                     *DriverImageHandle);
1324
1325typedef
1326EFI_STATUS
1327(EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER_PATH) (
1328IN      struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL  *This,
1329IN      EFI_HANDLE                                      ControllerHandle,
1330IN OUT  EFI_DEVICE_PATH                               **DriverImagePath);
1331
1332typedef
1333EFI_STATUS
1334(EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_DRIVER_LOADED) (
1335IN      struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL  *This,
1336IN      EFI_HANDLE                                      ControllerHandle,
1337IN      EFI_DEVICE_PATH                                *DriverImagePath,
1338IN      EFI_HANDLE                                      DriverImageHandle);
1339
1340typedef struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL {
1341  EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER       GetDriver;
1342  EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER_PATH  GetDriverPath;
1343  EFI_PLATFORM_DRIVER_OVERRIDE_DRIVER_LOADED    DriverLoaded;
1344} EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL;
1345
1346//
1347// EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL
1348//
1349
1350#define EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL_GUID          \
1351          { 0x3bc1b285, 0x8a15, 0x4a82, {0xaa, 0xbf, 0x4d, 0x7d, 0x13, 0xfb, 0x32, 0x65} }
1352
1353INTERFACE_DECL(_EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL);
1354
1355typedef
1356EFI_STATUS
1357(EFIAPI *EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_GET_DRIVER) (
1358IN      struct _EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL  *This,
1359IN OUT  EFI_HANDLE                                         *DriverImageHandle);
1360
1361typedef struct _EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL {
1362  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_GET_DRIVER       GetDriver;
1363} EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL;
1364
1365//
1366// EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL
1367//
1368
1369#define EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL_GUID          \
1370          { 0xb1ee129e, 0xda36, 0x4181, {0x91, 0xf8, 0x04, 0xa4, 0x92, 0x37, 0x66, 0xa7} }
1371
1372INTERFACE_DECL(_EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL);
1373
1374typedef
1375UINT32
1376(EFIAPI *EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION) (
1377IN      struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL  *This);
1378
1379typedef struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL {
1380  EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION       GetVersion;
1381} EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL;
1382
1383//
1384// EFI_EBC_PROTOCOL
1385//
1386
1387#define EFI_EBC_INTERPRETER_PROTOCOL_GUID              \
1388     {0x13ac6dd1, 0x73d0, 0x11d4, {0xb0, 0x6b, 0x00, 0xaa, 0x00, 0xbd, 0x6d, 0xe7} }
1389
1390#define EFI_EBC_PROTOCOL_GUID EFI_EBC_INTERPRETER_PROTOCOL_GUID
1391
1392INTERFACE_DECL(_EFI_EBC_PROTOCOL);
1393
1394typedef
1395EFI_STATUS
1396(EFIAPI *EFI_EBC_CREATE_THUNK)(
1397  IN struct _EFI_EBC_PROTOCOL   *This,
1398  IN EFI_HANDLE                 ImageHandle,
1399  IN VOID                       *EbcEntryPoint,
1400  OUT VOID                      **Thunk);
1401
1402typedef
1403EFI_STATUS
1404(EFIAPI *EFI_EBC_UNLOAD_IMAGE)(
1405  IN struct _EFI_EBC_PROTOCOL   *This,
1406  IN EFI_HANDLE                 ImageHandle);
1407
1408typedef
1409EFI_STATUS
1410(EFIAPI *EBC_ICACHE_FLUSH)(
1411  IN EFI_PHYSICAL_ADDRESS       Start,
1412  IN UINT64                     Length);
1413
1414typedef
1415EFI_STATUS
1416(EFIAPI *EFI_EBC_REGISTER_ICACHE_FLUSH)(
1417  IN struct _EFI_EBC_PROTOCOL   *This,
1418  IN EBC_ICACHE_FLUSH           Flush);
1419
1420typedef
1421EFI_STATUS
1422(EFIAPI *EFI_EBC_GET_VERSION)(
1423  IN struct _EFI_EBC_PROTOCOL   *This,
1424  IN OUT UINT64                 *Version);
1425
1426typedef struct _EFI_EBC_PROTOCOL {
1427  EFI_EBC_CREATE_THUNK          CreateThunk;
1428  EFI_EBC_UNLOAD_IMAGE          UnloadImage;
1429  EFI_EBC_REGISTER_ICACHE_FLUSH RegisterICacheFlush;
1430  EFI_EBC_GET_VERSION           GetVersion;
1431} EFI_EBC_PROTOCOL;
1432
1433#endif
1434