1#ifndef _EFI_PROT_H
2#define _EFI_PROT_H
3
4/*++
5
6Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
7This software and associated documentation (if any) is furnished
8under a license and may only be used or copied in accordance
9with the terms of the license. Except as permitted by such
10license, no part of this software or documentation may be
11reproduced, stored in a retrieval system, or transmitted in any
12form or by any means without the express written consent of
13Intel Corporation.
14
15Module Name:
16
17    efiprot.h
18
19Abstract:
20
21    EFI Protocols
22
23
24
25Revision History
26
27--*/
28
29#include <efidef.h>
30
31//
32// Device Path protocol
33//
34
35#define DEVICE_PATH_PROTOCOL \
36    { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
37
38
39//
40// Block IO protocol
41//
42
43#define BLOCK_IO_PROTOCOL \
44    { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
45#define EFI_BLOCK_IO_INTERFACE_REVISION   0x00010000
46
47INTERFACE_DECL(_EFI_BLOCK_IO);
48
49typedef
50EFI_STATUS
51(EFIAPI *EFI_BLOCK_RESET) (
52    IN struct _EFI_BLOCK_IO     *This,
53    IN BOOLEAN                  ExtendedVerification
54    );
55
56typedef
57EFI_STATUS
58(EFIAPI *EFI_BLOCK_READ) (
59    IN struct _EFI_BLOCK_IO     *This,
60    IN UINT32                   MediaId,
61    IN EFI_LBA                  LBA,
62    IN UINTN                    BufferSize,
63    OUT VOID                    *Buffer
64    );
65
66
67typedef
68EFI_STATUS
69(EFIAPI *EFI_BLOCK_WRITE) (
70    IN struct _EFI_BLOCK_IO     *This,
71    IN UINT32                   MediaId,
72    IN EFI_LBA                  LBA,
73    IN UINTN                    BufferSize,
74    IN VOID                     *Buffer
75    );
76
77
78typedef
79EFI_STATUS
80(EFIAPI *EFI_BLOCK_FLUSH) (
81    IN struct _EFI_BLOCK_IO     *This
82    );
83
84
85
86typedef struct {
87    UINT32              MediaId;
88    BOOLEAN             RemovableMedia;
89    BOOLEAN             MediaPresent;
90
91    BOOLEAN             LogicalPartition;
92    BOOLEAN             ReadOnly;
93    BOOLEAN             WriteCaching;
94
95    UINT32              BlockSize;
96    UINT32              IoAlign;
97
98    EFI_LBA             LastBlock;
99} EFI_BLOCK_IO_MEDIA;
100
101typedef struct _EFI_BLOCK_IO {
102    UINT64                  Revision;
103
104    EFI_BLOCK_IO_MEDIA      *Media;
105
106    EFI_BLOCK_RESET         Reset;
107    EFI_BLOCK_READ          ReadBlocks;
108    EFI_BLOCK_WRITE         WriteBlocks;
109    EFI_BLOCK_FLUSH         FlushBlocks;
110
111} EFI_BLOCK_IO;
112
113
114
115//
116// Disk Block IO protocol
117//
118
119#define DISK_IO_PROTOCOL \
120    { 0xce345171, 0xba0b, 0x11d2, {0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
121#define EFI_DISK_IO_INTERFACE_REVISION   0x00010000
122
123INTERFACE_DECL(_EFI_DISK_IO);
124
125typedef
126EFI_STATUS
127(EFIAPI *EFI_DISK_READ) (
128    IN struct _EFI_DISK_IO      *This,
129    IN UINT32                   MediaId,
130    IN UINT64                   Offset,
131    IN UINTN                    BufferSize,
132    OUT VOID                    *Buffer
133    );
134
135
136typedef
137EFI_STATUS
138(EFIAPI *EFI_DISK_WRITE) (
139    IN struct _EFI_DISK_IO      *This,
140    IN UINT32                   MediaId,
141    IN UINT64                   Offset,
142    IN UINTN                    BufferSize,
143    IN VOID                     *Buffer
144    );
145
146
147typedef struct _EFI_DISK_IO {
148    UINT64              Revision;
149    EFI_DISK_READ       ReadDisk;
150    EFI_DISK_WRITE      WriteDisk;
151} EFI_DISK_IO;
152
153
154//
155// Simple file system protocol
156//
157
158#define SIMPLE_FILE_SYSTEM_PROTOCOL \
159    { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
160
161INTERFACE_DECL(_EFI_FILE_IO_INTERFACE);
162INTERFACE_DECL(_EFI_FILE_HANDLE);
163
164typedef
165EFI_STATUS
166(EFIAPI *EFI_VOLUME_OPEN) (
167    IN struct _EFI_FILE_IO_INTERFACE    *This,
168    OUT struct _EFI_FILE_HANDLE         **Root
169    );
170
171#define EFI_FILE_IO_INTERFACE_REVISION   0x00010000
172
173typedef struct _EFI_FILE_IO_INTERFACE {
174    UINT64                  Revision;
175    EFI_VOLUME_OPEN         OpenVolume;
176} EFI_FILE_IO_INTERFACE;
177
178//
179//
180//
181
182typedef
183EFI_STATUS
184(EFIAPI *EFI_FILE_OPEN) (
185    IN struct _EFI_FILE_HANDLE  *File,
186    OUT struct _EFI_FILE_HANDLE **NewHandle,
187    IN CHAR16                   *FileName,
188    IN UINT64                   OpenMode,
189    IN UINT64                   Attributes
190    );
191
192// Open modes
193#define EFI_FILE_MODE_READ      0x0000000000000001
194#define EFI_FILE_MODE_WRITE     0x0000000000000002
195#define EFI_FILE_MODE_CREATE    0x8000000000000000
196
197// File attributes
198#define EFI_FILE_READ_ONLY      0x0000000000000001
199#define EFI_FILE_HIDDEN         0x0000000000000002
200#define EFI_FILE_SYSTEM         0x0000000000000004
201#define EFI_FILE_RESERVIED      0x0000000000000008
202#define EFI_FILE_DIRECTORY      0x0000000000000010
203#define EFI_FILE_ARCHIVE        0x0000000000000020
204#define EFI_FILE_VALID_ATTR     0x0000000000000037
205
206typedef
207EFI_STATUS
208(EFIAPI *EFI_FILE_CLOSE) (
209    IN struct _EFI_FILE_HANDLE  *File
210    );
211
212typedef
213EFI_STATUS
214(EFIAPI *EFI_FILE_DELETE) (
215    IN struct _EFI_FILE_HANDLE  *File
216    );
217
218typedef
219EFI_STATUS
220(EFIAPI *EFI_FILE_READ) (
221    IN struct _EFI_FILE_HANDLE  *File,
222    IN OUT UINTN                *BufferSize,
223    OUT VOID                    *Buffer
224    );
225
226typedef
227EFI_STATUS
228(EFIAPI *EFI_FILE_WRITE) (
229    IN struct _EFI_FILE_HANDLE  *File,
230    IN OUT UINTN                *BufferSize,
231    IN VOID                     *Buffer
232    );
233
234typedef
235EFI_STATUS
236(EFIAPI *EFI_FILE_SET_POSITION) (
237    IN struct _EFI_FILE_HANDLE  *File,
238    IN UINT64                   Position
239    );
240
241typedef
242EFI_STATUS
243(EFIAPI *EFI_FILE_GET_POSITION) (
244    IN struct _EFI_FILE_HANDLE  *File,
245    OUT UINT64                  *Position
246    );
247
248typedef
249EFI_STATUS
250(EFIAPI *EFI_FILE_GET_INFO) (
251    IN struct _EFI_FILE_HANDLE  *File,
252    IN EFI_GUID                 *InformationType,
253    IN OUT UINTN                *BufferSize,
254    OUT VOID                    *Buffer
255    );
256
257typedef
258EFI_STATUS
259(EFIAPI *EFI_FILE_SET_INFO) (
260    IN struct _EFI_FILE_HANDLE  *File,
261    IN EFI_GUID                 *InformationType,
262    IN UINTN                    BufferSize,
263    IN VOID                     *Buffer
264    );
265
266typedef
267EFI_STATUS
268(EFIAPI *EFI_FILE_FLUSH) (
269    IN struct _EFI_FILE_HANDLE  *File
270    );
271
272
273
274#define EFI_FILE_HANDLE_REVISION         0x00010000
275typedef struct _EFI_FILE_HANDLE {
276    UINT64                  Revision;
277    EFI_FILE_OPEN           Open;
278    EFI_FILE_CLOSE          Close;
279    EFI_FILE_DELETE         Delete;
280    EFI_FILE_READ           Read;
281    EFI_FILE_WRITE          Write;
282    EFI_FILE_GET_POSITION   GetPosition;
283    EFI_FILE_SET_POSITION   SetPosition;
284    EFI_FILE_GET_INFO       GetInfo;
285    EFI_FILE_SET_INFO       SetInfo;
286    EFI_FILE_FLUSH          Flush;
287} EFI_FILE, *EFI_FILE_HANDLE;
288
289
290//
291// File information types
292//
293
294#define EFI_FILE_INFO_ID \
295    { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
296
297typedef struct {
298    UINT64                  Size;
299    UINT64                  FileSize;
300    UINT64                  PhysicalSize;
301    EFI_TIME                CreateTime;
302    EFI_TIME                LastAccessTime;
303    EFI_TIME                ModificationTime;
304    UINT64                  Attribute;
305    CHAR16                  FileName[1];
306} EFI_FILE_INFO;
307
308//
309// The FileName field of the EFI_FILE_INFO data structure is variable length.
310// Whenever code needs to know the size of the EFI_FILE_INFO data structure, it needs to
311// be the size of the data structure without the FileName field.  The following macro
312// computes this size correctly no matter how big the FileName array is declared.
313// This is required to make the EFI_FILE_INFO data structure ANSI compilant.
314//
315
316#define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName)
317
318#define EFI_FILE_SYSTEM_INFO_ID \
319    { 0x9576e93, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
320
321typedef struct {
322    UINT64                  Size;
323    BOOLEAN                 ReadOnly;
324    UINT64                  VolumeSize;
325    UINT64                  FreeSpace;
326    UINT32                  BlockSize;
327    CHAR16                  VolumeLabel[1];
328} EFI_FILE_SYSTEM_INFO;
329
330//
331// The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length.
332// Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data structure, it needs
333// to be the size of the data structure without the VolumeLable field.  The following macro
334// computes this size correctly no matter how big the VolumeLable array is declared.
335// This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI compilant.
336//
337
338#define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_INFO,VolumeLabel)
339
340#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID \
341    { 0xDB47D7D3,0xFE81, 0x11d3, {0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
342
343typedef struct {
344    CHAR16                  VolumeLabel[1];
345} EFI_FILE_SYSTEM_VOLUME_LABEL_INFO;
346
347#define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_VOLUME_LABEL_INFO,VolumeLabel)
348
349//
350// Load file protocol
351//
352
353
354#define LOAD_FILE_PROTOCOL \
355    { 0x56EC3091, 0x954C, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
356
357INTERFACE_DECL(_EFI_LOAD_FILE_INTERFACE);
358
359typedef
360EFI_STATUS
361(EFIAPI *EFI_LOAD_FILE) (
362    IN struct _EFI_LOAD_FILE_INTERFACE  *This,
363    IN EFI_DEVICE_PATH                  *FilePath,
364    IN BOOLEAN                          BootPolicy,
365    IN OUT UINTN                        *BufferSize,
366    IN VOID                             *Buffer OPTIONAL
367    );
368
369typedef struct _EFI_LOAD_FILE_INTERFACE {
370    EFI_LOAD_FILE                       LoadFile;
371} EFI_LOAD_FILE_INTERFACE;
372
373
374//
375// Device IO protocol
376//
377
378#define DEVICE_IO_PROTOCOL \
379    { 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
380
381INTERFACE_DECL(_EFI_DEVICE_IO_INTERFACE);
382
383typedef enum {
384    IO_UINT8,
385    IO_UINT16,
386    IO_UINT32,
387    IO_UINT64,
388//
389// Specification Change: Copy from MMIO to MMIO vs. MMIO to buffer, buffer to MMIO
390//
391    MMIO_COPY_UINT8,
392    MMIO_COPY_UINT16,
393    MMIO_COPY_UINT32,
394    MMIO_COPY_UINT64
395} EFI_IO_WIDTH;
396
397#define EFI_PCI_ADDRESS(bus,dev,func,reg) \
398  ( (UINT64) ( (((UINTN)bus) << 24) + (((UINTN)dev) << 16) + (((UINTN)func) << 8) + ((UINTN)reg) ))
399
400typedef
401EFI_STATUS
402(EFIAPI *EFI_DEVICE_IO) (
403    IN struct _EFI_DEVICE_IO_INTERFACE *This,
404    IN EFI_IO_WIDTH                 Width,
405    IN UINT64                       Address,
406    IN UINTN                        Count,
407    IN OUT VOID                     *Buffer
408    );
409
410typedef struct {
411    EFI_DEVICE_IO                   Read;
412    EFI_DEVICE_IO                   Write;
413} EFI_IO_ACCESS;
414
415typedef
416EFI_STATUS
417(EFIAPI *EFI_PCI_DEVICE_PATH) (
418    IN struct _EFI_DEVICE_IO_INTERFACE  *This,
419    IN UINT64                           Address,
420    IN OUT EFI_DEVICE_PATH              **PciDevicePath
421    );
422
423typedef enum {
424    EfiBusMasterRead,
425    EfiBusMasterWrite,
426    EfiBusMasterCommonBuffer
427} EFI_IO_OPERATION_TYPE;
428
429typedef
430EFI_STATUS
431(EFIAPI *EFI_IO_MAP) (
432    IN struct _EFI_DEVICE_IO_INTERFACE  *This,
433    IN EFI_IO_OPERATION_TYPE            Operation,
434    IN EFI_PHYSICAL_ADDRESS             *HostAddress,
435    IN OUT UINTN                        *NumberOfBytes,
436    OUT EFI_PHYSICAL_ADDRESS            *DeviceAddress,
437    OUT VOID                            **Mapping
438    );
439
440typedef
441EFI_STATUS
442(EFIAPI *EFI_IO_UNMAP) (
443    IN struct _EFI_DEVICE_IO_INTERFACE  *This,
444    IN VOID                             *Mapping
445    );
446
447typedef
448EFI_STATUS
449(EFIAPI *EFI_IO_ALLOCATE_BUFFER) (
450    IN struct _EFI_DEVICE_IO_INTERFACE  *This,
451    IN EFI_ALLOCATE_TYPE                Type,
452    IN EFI_MEMORY_TYPE                  MemoryType,
453    IN UINTN                            Pages,
454    IN OUT EFI_PHYSICAL_ADDRESS         *HostAddress
455    );
456
457typedef
458EFI_STATUS
459(EFIAPI *EFI_IO_FLUSH) (
460    IN struct _EFI_DEVICE_IO_INTERFACE  *This
461    );
462
463typedef
464EFI_STATUS
465(EFIAPI *EFI_IO_FREE_BUFFER) (
466    IN struct _EFI_DEVICE_IO_INTERFACE  *This,
467    IN UINTN                            Pages,
468    IN EFI_PHYSICAL_ADDRESS             HostAddress
469    );
470
471typedef struct _EFI_DEVICE_IO_INTERFACE {
472    EFI_IO_ACCESS                       Mem;
473    EFI_IO_ACCESS                       Io;
474    EFI_IO_ACCESS                       Pci;
475    EFI_IO_MAP                          Map;
476    EFI_PCI_DEVICE_PATH                 PciDevicePath;
477    EFI_IO_UNMAP                        Unmap;
478    EFI_IO_ALLOCATE_BUFFER              AllocateBuffer;
479    EFI_IO_FLUSH                        Flush;
480    EFI_IO_FREE_BUFFER                  FreeBuffer;
481} EFI_DEVICE_IO_INTERFACE;
482
483
484//
485// Unicode Collation protocol
486//
487
488#define UNICODE_COLLATION_PROTOCOL \
489    { 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
490
491#define UNICODE_BYTE_ORDER_MARK       (CHAR16)(0xfeff)
492
493INTERFACE_DECL(_EFI_UNICODE_COLLATION_INTERFACE);
494
495typedef
496INTN
497(EFIAPI *EFI_UNICODE_COLLATION_STRICOLL) (
498    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
499    IN CHAR16                         *s1,
500    IN CHAR16                         *s2
501    );
502
503typedef
504BOOLEAN
505(EFIAPI *EFI_UNICODE_COLLATION_METAIMATCH) (
506    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
507    IN CHAR16                         *String,
508    IN CHAR16                         *Pattern
509    );
510
511typedef
512VOID
513(EFIAPI *EFI_UNICODE_COLLATION_STRLWR) (
514    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
515    IN OUT CHAR16                       *Str
516    );
517
518typedef
519VOID
520(EFIAPI *EFI_UNICODE_COLLATION_STRUPR) (
521    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
522    IN OUT CHAR16                       *Str
523    );
524
525typedef
526VOID
527(EFIAPI *EFI_UNICODE_COLLATION_FATTOSTR) (
528    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
529    IN UINTN                            FatSize,
530    IN CHAR8                            *Fat,
531    OUT CHAR16                          *String
532    );
533
534typedef
535BOOLEAN
536(EFIAPI *EFI_UNICODE_COLLATION_STRTOFAT) (
537    IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
538    IN CHAR16                           *String,
539    IN UINTN                            FatSize,
540    OUT CHAR8                           *Fat
541    );
542
543
544typedef struct _EFI_UNICODE_COLLATION_INTERFACE {
545
546    // general
547    EFI_UNICODE_COLLATION_STRICOLL                StriColl;
548    EFI_UNICODE_COLLATION_METAIMATCH              MetaiMatch;
549    EFI_UNICODE_COLLATION_STRLWR                  StrLwr;
550    EFI_UNICODE_COLLATION_STRUPR                  StrUpr;
551
552    // for supporting fat volumes
553    EFI_UNICODE_COLLATION_FATTOSTR                FatToStr;
554    EFI_UNICODE_COLLATION_STRTOFAT                StrToFat;
555
556    CHAR8                               *SupportedLanguages;
557} EFI_UNICODE_COLLATION_INTERFACE;
558
559//
560// Driver Binding protocol
561//
562
563#define DRIVER_BINDING_PROTOCOL \
564  { 0x18a031ab, 0xb443, 0x4d1a, {0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71} }
565
566INTERFACE_DECL(_EFI_DRIVER_BINDING);
567
568typedef
569EFI_STATUS
570(EFIAPI *EFI_DRIVER_BINDING_SUPPORTED) (
571    IN struct _EFI_DRIVER_BINDING *This,
572    IN EFI_HANDLE ControllerHandle,
573    IN EFI_DEVICE_PATH *RemainingPath
574    );
575
576typedef
577EFI_STATUS
578(EFIAPI *EFI_DRIVER_BINDING_START) (
579    IN struct _EFI_DRIVER_BINDING *This,
580    IN EFI_HANDLE ControllerHandle,
581    IN EFI_DEVICE_PATH *RemainingPath
582    );
583
584typedef
585EFI_STATUS
586(EFIAPI *EFI_DRIVER_BINDING_STOP) (
587    IN struct _EFI_DRIVER_BINDING *This,
588    IN EFI_HANDLE ControllerHandle,
589    IN UINTN NumberOfChildren,
590    IN EFI_HANDLE *ChildHandleBuffer
591    );
592
593typedef struct _EFI_DRIVER_BINDING {
594    EFI_DRIVER_BINDING_SUPPORTED Supported;
595    EFI_DRIVER_BINDING_START Start;
596    EFI_DRIVER_BINDING_STOP Stop;
597    UINT32 Version;
598    EFI_HANDLE ImageHandle;
599    EFI_HANDLE DriverBindingHandle;
600} EFI_DRIVER_BINDING;
601
602//
603// Component Name Protocol 2
604//
605
606#define COMPONENT_NAME2_PROTOCOL \
607  { 0x6a7a5cff, 0xe8d9, 0x4f70, {0xba, 0xda, 0x75, 0xab, 0x30, 0x25, 0xce, 0x14 } }
608
609INTERFACE_DECL(_EFI_COMPONENT_NAME2);
610
611typedef
612EFI_STATUS
613(EFIAPI *EFI_COMPONENT_NAME_GET_DRIVER_NAME) (
614    IN struct _EFI_COMPONENT_NAME2 *This,
615    IN CHAR8 * Language,
616    OUT CHAR16 **DriverName
617    );
618
619typedef
620EFI_STATUS
621(EFIAPI *EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) (
622    IN struct _EFI_COMPONENT_NAME2 *This,
623    IN EFI_HANDLE ControllerHandle,
624    IN EFI_HANDLE ChildHandle OPTIONAL,
625    IN CHAR8 *Language,
626    OUT CHAR16 **ControllerName
627    );
628
629typedef struct _EFI_COMPONENT_NAME2 {
630    EFI_COMPONENT_NAME_GET_DRIVER_NAME GetDriverName;
631    EFI_COMPONENT_NAME_GET_CONTROLLER_NAME GetControllerName;
632    CHAR8 **SupportedLanguages;
633} EFI_COMPONENT_NAME2;
634
635#endif
636