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