xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/inc/efidevp.h (revision 1eb4b21779cd330f45cea12cb60eb09e852039cb)
1 /*	$NetBSD: efidevp.h,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
2 
3 #ifndef _DEVPATH_H
4 #define _DEVPATH_H
5 
6 /*++
7 
8 Copyright (c) 1998  Intel Corporation
9 
10 Module Name:
11 
12     devpath.h
13 
14 Abstract:
15 
16     Defines for parsing the EFI Device Path structures
17 
18 
19 
20 Revision History
21 
22 --*/
23 
24 //
25 // Device Path structures - Section C
26 //
27 
28 typedef struct _EFI_DEVICE_PATH_PROTOCOL {
29         UINT8                           Type;
30         UINT8                           SubType;
31         UINT8                           Length[2];
32 } EFI_DEVICE_PATH_PROTOCOL;
33 
34 typedef struct _EFI_DEVICE_PATH_PROTOCOL _EFI_DEVICE_PATH;
35 typedef EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH;
36 
37 #define EFI_DP_TYPE_MASK                    0x7F
38 #define EFI_DP_TYPE_UNPACKED                0x80
39 
40 //#define END_DEVICE_PATH_TYPE                0xff
41 #define END_DEVICE_PATH_TYPE                0x7f
42 //#define END_DEVICE_PATH_TYPE_UNPACKED       0x7f
43 
44 #define END_ENTIRE_DEVICE_PATH_SUBTYPE      0xff
45 #define END_INSTANCE_DEVICE_PATH_SUBTYPE    0x01
46 #define END_DEVICE_PATH_LENGTH              (sizeof(EFI_DEVICE_PATH_PROTOCOL))
47 
48 
49 #define DP_IS_END_TYPE(a)
50 #define DP_IS_END_SUBTYPE(a)        ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
51 
52 #define DevicePathType(a)           ( ((a)->Type) & EFI_DP_TYPE_MASK )
53 #define DevicePathSubType(a)        ( (a)->SubType )
54 #define DevicePathNodeLength(a)     ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
55 #define NextDevicePathNode(a)       ( (EFI_DEVICE_PATH_PROTOCOL *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
56 //#define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED )
57 #define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
58 #define IsDevicePathEndSubType(a)   ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
59 #define IsDevicePathEnd(a)          ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
60 #define IsDevicePathUnpacked(a)     ( (a)->Type & EFI_DP_TYPE_UNPACKED )
61 
62 
63 #define SetDevicePathNodeLength(a,l) {                  \
64             (a)->Length[0] = (UINT8) (l);               \
65             (a)->Length[1] = (UINT8) ((l) >> 8);        \
66             }
67 
68 #define SetDevicePathEndNode(a)  {                      \
69             (a)->Type = END_DEVICE_PATH_TYPE;           \
70             (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;     \
71             (a)->Length[0] = sizeof(EFI_DEVICE_PATH_PROTOCOL); \
72             (a)->Length[1] = 0;                         \
73             }
74 
75 
76 /*
77  * Hardware Device Path (UEFI 2.4 specification, version 2.4 § 9.3.2.)
78  */
79 
80 #define HARDWARE_DEVICE_PATH            0x01
81 
82 #define HW_PCI_DP                       0x01
83 typedef struct _PCI_DEVICE_PATH {
84         EFI_DEVICE_PATH_PROTOCOL        Header;
85         UINT8                           Function;
86         UINT8                           Device;
87 } PCI_DEVICE_PATH;
88 
89 #define HW_PCCARD_DP                    0x02
90 typedef struct _PCCARD_DEVICE_PATH {
91         EFI_DEVICE_PATH_PROTOCOL        Header;
92         UINT8                           FunctionNumber ;
93 } PCCARD_DEVICE_PATH;
94 
95 #define HW_MEMMAP_DP                    0x03
96 typedef struct _MEMMAP_DEVICE_PATH {
97         EFI_DEVICE_PATH_PROTOCOL        Header;
98         UINT32                          MemoryType;
99         EFI_PHYSICAL_ADDRESS            StartingAddress;
100         EFI_PHYSICAL_ADDRESS            EndingAddress;
101 } MEMMAP_DEVICE_PATH;
102 
103 #define HW_VENDOR_DP                    0x04
104 typedef struct _VENDOR_DEVICE_PATH {
105         EFI_DEVICE_PATH_PROTOCOL        Header;
106         EFI_GUID                        Guid;
107 } VENDOR_DEVICE_PATH;
108 
109 #define UNKNOWN_DEVICE_GUID \
110     { 0xcf31fac5, 0xc24e, 0x11d2,  {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b}  }
111 
112 typedef struct _UKNOWN_DEVICE_VENDOR_DP {
113     VENDOR_DEVICE_PATH      DevicePath;
114     UINT8                   LegacyDriveLetter;
115 } UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
116 
117 #define HW_CONTROLLER_DP            0x05
118 typedef struct _CONTROLLER_DEVICE_PATH {
119         EFI_DEVICE_PATH_PROTOCOL  Header;
120         UINT32                    Controller;
121 } CONTROLLER_DEVICE_PATH;
122 
123 
124 /*
125  * ACPI Device Path (UEFI 2.4 specification, version 2.4 § 9.3.3 and 9.3.4.)
126  */
127 #define ACPI_DEVICE_PATH                0x02
128 
129 #define ACPI_DP                         0x01
130 typedef struct _ACPI_HID_DEVICE_PATH {
131         EFI_DEVICE_PATH_PROTOCOL        Header;
132         UINT32                          HID;
133         UINT32                          UID;
134 } ACPI_HID_DEVICE_PATH;
135 
136 #define EXPANDED_ACPI_DP                0x02
137 typedef struct _EXPANDED_ACPI_HID_DEVICE_PATH {
138         EFI_DEVICE_PATH_PROTOCOL        Header;
139         UINT32                          HID;
140         UINT32                          UID;
141         UINT32                          CID;
142         UINT8                           HidStr[1];
143 } EXPANDED_ACPI_HID_DEVICE_PATH;
144 
145 #define ACPI_ADR_DP 3
146 typedef struct _ACPI_ADR_DEVICE_PATH {
147     EFI_DEVICE_PATH_PROTOCOL Header ;
148     UINT32 ADR ;
149 } ACPI_ADR_DEVICE_PATH ;
150 
151 //
152 // EISA ID Macro
153 // EISA ID Definition 32-bits
154 //  bits[15:0] - three character compressed ASCII EISA ID.
155 //  bits[31:16] - binary number
156 //   Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
157 //
158 #define PNP_EISA_ID_CONST       0x41d0
159 #define EISA_ID(_Name, _Num)    ((UINT32) ((_Name) | (_Num) << 16))
160 #define EISA_PNP_ID(_PNPId)     (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
161 
162 #define PNP_EISA_ID_MASK        0xffff
163 #define EISA_ID_TO_NUM(_Id)     ((_Id) >> 16)
164 
165 
166 /*
167  * Messaging Device Path (UEFI 2.4 specification, version 2.4 § 9.3.5.)
168  */
169 #define MESSAGING_DEVICE_PATH           0x03
170 
171 #define MSG_ATAPI_DP                    0x01
172 typedef struct _ATAPI_DEVICE_PATH {
173         EFI_DEVICE_PATH_PROTOCOL        Header;
174         UINT8                           PrimarySecondary;
175         UINT8                           SlaveMaster;
176         UINT16                          Lun;
177 } ATAPI_DEVICE_PATH;
178 
179 #define MSG_SCSI_DP                     0x02
180 typedef struct _SCSI_DEVICE_PATH {
181         EFI_DEVICE_PATH_PROTOCOL        Header;
182         UINT16                          Pun;
183         UINT16                          Lun;
184 } SCSI_DEVICE_PATH;
185 
186 #define MSG_FIBRECHANNEL_DP             0x03
187 typedef struct _FIBRECHANNEL_DEVICE_PATH {
188         EFI_DEVICE_PATH_PROTOCOL        Header;
189         UINT32                          Reserved;
190         UINT64                          WWN;
191         UINT64                          Lun;
192 } FIBRECHANNEL_DEVICE_PATH;
193 
194 /**
195  * Fibre Channel Ex SubType.
196  * UEFI 2.0 specification version 2.4 § 9.3.5.6.
197  */
198 #define MSG_FIBRECHANNELEX_DP 21
199 typedef struct _FIBRECHANNELEX_DEVICE_PATH {
200     EFI_DEVICE_PATH_PROTOCOL Header ;
201     UINT32 Reserved ;
202     UINT8 WWN[ 8 ] ; /* World Wide Name */
203     UINT8 Lun[ 8 ] ; /* Logical unit, T-10 SCSI Architecture Model 4 specification */
204 } FIBRECHANNELEX_DEVICE_PATH ;
205 
206 #define MSG_1394_DP                     0x04
207 typedef struct _F1394_DEVICE_PATH {
208         EFI_DEVICE_PATH_PROTOCOL        Header;
209         UINT32                          Reserved;
210         UINT64                          Guid;
211 } F1394_DEVICE_PATH;
212 
213 #define MSG_USB_DP                      0x05
214 typedef struct _USB_DEVICE_PATH {
215         EFI_DEVICE_PATH_PROTOCOL        Header;
216         UINT8                           Port;
217         UINT8                           Endpoint;
218 } USB_DEVICE_PATH;
219 
220 /**
221  * SATA Device Path SubType.
222  * UEFI 2.0 specification version 2.4 § 9.3.5.6.
223  */
224 #define MSG_SATA_DP 18
225 typedef struct _SATA_DEVICE_PATH {
226     EFI_DEVICE_PATH_PROTOCOL Header ;
227     UINT16 HBAPortNumber ;
228     UINT16 PortMultiplierPortNumber ;
229     UINT16 Lun ; /* Logical Unit Number */
230 } SATA_DEVICE_PATH ;
231 
232 /**
233  * USB WWID Device Path SubType.
234  * UEFI 2.0 specification version 2.4 § 9.3.5.7.
235  */
236 #define MSG_USB_WWID_DP 16
237 typedef struct _USB_WWID_DEVICE_PATH {
238     EFI_DEVICE_PATH_PROTOCOL Header ;
239     UINT16 InterfaceNumber ;
240     UINT16 VendorId ;
241     UINT16 ProductId ;
242     CHAR16 SerialNumber[ 1 ] ; /* UTF-16 characters of the USB serial number */
243 } USB_WWID_DEVICE_PATH ;
244 
245 /**
246  * Device Logical Unit SubType.
247  * UEFI 2.0 specification version 2.4 § 9.3.5.8.
248  */
249 #define MSG_DEVICE_LOGICAL_UNIT_DP 17
250 typedef struct _DEVICE_LOGICAL_UNIT_DEVICE_PATH {
251     EFI_DEVICE_PATH_PROTOCOL Header ;
252     UINT8 Lun ; /* Logical Unit Number */
253 } DEVICE_LOGICAL_UNIT_DEVICE_PATH ;
254 
255 #define MSG_USB_CLASS_DP                0x0F
256 typedef struct _USB_CLASS_DEVICE_PATH {
257         EFI_DEVICE_PATH_PROTOCOL        Header;
258         UINT16                          VendorId;
259         UINT16                          ProductId;
260         UINT8                           DeviceClass;
261         UINT8                           DeviceSubclass;
262         UINT8                           DeviceProtocol;
263 } USB_CLASS_DEVICE_PATH;
264 
265 #define MSG_I2O_DP                      0x06
266 typedef struct _I2O_DEVICE_PATH {
267         EFI_DEVICE_PATH_PROTOCOL        Header;
268         UINT32                          Tid;
269 } I2O_DEVICE_PATH;
270 
271 #define MSG_MAC_ADDR_DP                 0x0b
272 typedef struct _MAC_ADDR_DEVICE_PATH {
273         EFI_DEVICE_PATH_PROTOCOL        Header;
274         EFI_MAC_ADDRESS                 MacAddress;
275         UINT8                           IfType;
276 } MAC_ADDR_DEVICE_PATH;
277 
278 #define MSG_IPv4_DP                     0x0c
279 typedef struct _IPv4_DEVICE_PATH {
280         EFI_DEVICE_PATH_PROTOCOL        Header;
281         EFI_IPv4_ADDRESS                LocalIpAddress;
282         EFI_IPv4_ADDRESS                RemoteIpAddress;
283         UINT16                          LocalPort;
284         UINT16                          RemotePort;
285         UINT16                          Protocol;
286         BOOLEAN                         StaticIpAddress;
287         /* new from UEFI version 2, code must check Length field in Header */
288         EFI_IPv4_ADDRESS                GatewayIpAddress ;
289         EFI_IPv4_ADDRESS                SubnetMask ;
290 } IPv4_DEVICE_PATH;
291 
292 #define MSG_IPv6_DP                     0x0d
293 typedef struct _IPv6_DEVICE_PATH {
294         EFI_DEVICE_PATH_PROTOCOL        Header;
295         EFI_IPv6_ADDRESS                LocalIpAddress;
296         EFI_IPv6_ADDRESS                RemoteIpAddress;
297         UINT16                          LocalPort;
298         UINT16                          RemotePort;
299         UINT16                          Protocol;
300         BOOLEAN                         IPAddressOrigin ;
301         /* new from UEFI version 2, code must check Length field in Header */
302         UINT8                           PrefixLength ;
303         EFI_IPv6_ADDRESS                GatewayIpAddress ;
304 } IPv6_DEVICE_PATH;
305 
306 
307 /**
308  * Uniform Resource Identifiers SubType.
309  * UEFI 2.0 specification version 2.4C § 9.3.5.23.
310  */
311 #define MSG_URI_DP                      24
312 typedef struct _URI_DEVICE_PATH {
313         EFI_DEVICE_PATH_PROTOCOL        Header;
314         CHAR8                           Uri[1];
315 } URI_DEVICE_PATH;
316 
317 /**
318  * Device Logical Unit SubType.
319  * UEFI 2.0 specification version 2.4 § 9.3.5.8.
320  */
321 #define MSG_VLAN_DP 20
322 typedef struct _VLAN_DEVICE_PATH {
323     EFI_DEVICE_PATH_PROTOCOL Header ;
324     UINT16 VlanId ;
325 } VLAN_DEVICE_PATH;
326 
327 #define MSG_INFINIBAND_DP               0x09
328 typedef struct _INFINIBAND_DEVICE_PATH {
329         EFI_DEVICE_PATH_PROTOCOL        Header;
330         UINT32                          ResourceFlags;
331         UINT8                           PortGid[16];
332         UINT64                          ServiceId;
333         UINT64                          TargetPortId;
334         UINT64                          DeviceId;
335 } INFINIBAND_DEVICE_PATH;
336 
337 #define MSG_UART_DP                     0x0e
338 typedef struct _UART_DEVICE_PATH {
339         EFI_DEVICE_PATH_PROTOCOL        Header;
340         UINT32                          Reserved;
341         UINT64                          BaudRate;
342         UINT8                           DataBits;
343         UINT8                           Parity;
344         UINT8                           StopBits;
345 } UART_DEVICE_PATH;
346 
347 #define MSG_VENDOR_DP                   0x0A
348 /* Use VENDOR_DEVICE_PATH struct */
349 
350 #define EFI_PC_ANSI_GUID \
351     { 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
352 #define DEVICE_PATH_MESSAGING_PC_ANSI EFI_PC_ANSI_GUID
353 
354 #define EFI_VT_100_GUID \
355     { 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
356 #define DEVICE_PATH_MESSAGING_VT_100 EFI_VT_100_GUID
357 
358 #define EFI_VT_100_PLUS_GUID \
359     { 0x7baec70b, 0x57e0, 0x4c76, {0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43} }
360 #define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID
361 
362 #define EFI_VT_UTF8_GUID \
363     { 0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} }
364 #define DEVICE_PATH_MESSAGING_VT_UTF8 EFI_VT_UTF8_GUID
365 
366 
367 /*
368  * Media Device Path (UEFI 2.4 specification, version 2.4 § 9.3.6.)
369  */
370 #define MEDIA_DEVICE_PATH               0x04
371 
372 #define MEDIA_HARDDRIVE_DP              0x01
373 typedef struct _HARDDRIVE_DEVICE_PATH {
374         EFI_DEVICE_PATH_PROTOCOL        Header;
375         UINT32                          PartitionNumber;
376         UINT64                          PartitionStart;
377         UINT64                          PartitionSize;
378         UINT8                           Signature[16];
379         UINT8                           MBRType;
380         UINT8                           SignatureType;
381 } HARDDRIVE_DEVICE_PATH;
382 
383 #define MBR_TYPE_PCAT                       0x01
384 #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
385 
386 #define SIGNATURE_TYPE_MBR                  0x01
387 #define SIGNATURE_TYPE_GUID                 0x02
388 
389 #define MEDIA_CDROM_DP                  0x02
390 typedef struct _CDROM_DEVICE_PATH {
391         EFI_DEVICE_PATH_PROTOCOL        Header;
392         UINT32                          BootEntry;
393         UINT64                          PartitionStart;
394         UINT64                          PartitionSize;
395 } CDROM_DEVICE_PATH;
396 
397 #define MEDIA_VENDOR_DP                 0x03
398 /* Use VENDOR_DEVICE_PATH struct */
399 
400 #define MEDIA_FILEPATH_DP               0x04
401 typedef struct _FILEPATH_DEVICE_PATH {
402         EFI_DEVICE_PATH_PROTOCOL        Header;
403         CHAR16                          PathName[1];
404 } FILEPATH_DEVICE_PATH;
405 
406 #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
407 
408 #define MEDIA_PROTOCOL_DP               0x05
409 typedef struct _MEDIA_PROTOCOL_DEVICE_PATH {
410         EFI_DEVICE_PATH_PROTOCOL        Header;
411         EFI_GUID                        Protocol;
412 } MEDIA_PROTOCOL_DEVICE_PATH;
413 
414 /**
415  * PIWG Firmware File SubType.
416  * UEFI 2.0 specification version 2.4 § 9.3.6.6.
417  */
418 #define MEDIA_PIWG_FW_FILE_DP 6
419 typedef struct _MEDIA_FW_VOL_FILEPATH_DEVICE_PATH {
420     EFI_DEVICE_PATH_PROTOCOL Header ;
421     EFI_GUID FvFileName ;
422 } MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ;
423 
424 /**
425  * PIWG Firmware Volume Device Path SubType.
426  * UEFI 2.0 specification version 2.4 § 9.3.6.7.
427  */
428 #define MEDIA_PIWG_FW_VOL_DP 7
429 typedef struct _MEDIA_FW_VOL_DEVICE_PATH {
430     EFI_DEVICE_PATH_PROTOCOL Header ;
431     EFI_GUID FvName ;
432 } MEDIA_FW_VOL_DEVICE_PATH ;
433 
434 /**
435  * Media relative offset range device path.
436  * UEFI 2.0 specification version 2.4 § 9.3.6.8.
437  */
438 #define MEDIA_RELATIVE_OFFSET_RANGE_DP 8
439 typedef struct _MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH {
440     EFI_DEVICE_PATH_PROTOCOL Header ;
441     UINT32 Reserved ;
442     UINT64 StartingOffset ;
443     UINT64 EndingOffset ;
444 } MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH ;
445 
446 
447 /*
448  * BIOS Boot Specification Device Path (UEFI 2.4 specification, version 2.4 § 9.3.7.)
449  */
450 #define BBS_DEVICE_PATH                 0x05
451 
452 #define BBS_BBS_DP                      0x01
453 typedef struct _BBS_BBS_DEVICE_PATH {
454         EFI_DEVICE_PATH_PROTOCOL        Header;
455         UINT16                          DeviceType;
456         UINT16                          StatusFlag;
457         CHAR8                           String[1];
458 } BBS_BBS_DEVICE_PATH;
459 
460 /* DeviceType definitions - from BBS specification */
461 #define BBS_TYPE_FLOPPY                 0x01
462 #define BBS_TYPE_HARDDRIVE              0x02
463 #define BBS_TYPE_CDROM                  0x03
464 #define BBS_TYPE_PCMCIA                 0x04
465 #define BBS_TYPE_USB                    0x05
466 #define BBS_TYPE_EMBEDDED_NETWORK       0x06
467 #define BBS_TYPE_DEV                    0x80
468 #define BBS_TYPE_UNKNOWN                0xFF
469 
470 typedef union {
471     EFI_DEVICE_PATH_PROTOCOL             DevPath;
472     PCI_DEVICE_PATH                      Pci;
473     PCCARD_DEVICE_PATH                   PcCard;
474     MEMMAP_DEVICE_PATH                   MemMap;
475     VENDOR_DEVICE_PATH                   Vendor;
476     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    UnknownVendor;
477     CONTROLLER_DEVICE_PATH               Controller;
478     ACPI_HID_DEVICE_PATH                 Acpi;
479 
480     ATAPI_DEVICE_PATH                    Atapi;
481     SCSI_DEVICE_PATH                     Scsi;
482     FIBRECHANNEL_DEVICE_PATH             FibreChannel;
483 
484     F1394_DEVICE_PATH                    F1394;
485     USB_DEVICE_PATH                      Usb;
486     USB_CLASS_DEVICE_PATH                UsbClass;
487     I2O_DEVICE_PATH                      I2O;
488     MAC_ADDR_DEVICE_PATH                 MacAddr;
489     IPv4_DEVICE_PATH                     Ipv4;
490     IPv6_DEVICE_PATH                     Ipv6;
491     URI_DEVICE_PATH                      Uri;
492     INFINIBAND_DEVICE_PATH               InfiniBand;
493     UART_DEVICE_PATH                     Uart;
494 
495     HARDDRIVE_DEVICE_PATH                HardDrive;
496     CDROM_DEVICE_PATH                    CD;
497 
498     FILEPATH_DEVICE_PATH                 FilePath;
499     MEDIA_PROTOCOL_DEVICE_PATH           MediaProtocol;
500 
501     BBS_BBS_DEVICE_PATH                  Bbs;
502 
503 } EFI_DEV_PATH;
504 
505 typedef union {
506     EFI_DEVICE_PATH_PROTOCOL             *DevPath;
507     PCI_DEVICE_PATH                      *Pci;
508     PCCARD_DEVICE_PATH                   *PcCard;
509     MEMMAP_DEVICE_PATH                   *MemMap;
510     VENDOR_DEVICE_PATH                   *Vendor;
511     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    *UnknownVendor;
512     CONTROLLER_DEVICE_PATH               *Controller;
513     ACPI_HID_DEVICE_PATH                 *Acpi;
514 
515     ATAPI_DEVICE_PATH                    *Atapi;
516     SCSI_DEVICE_PATH                     *Scsi;
517     FIBRECHANNEL_DEVICE_PATH             *FibreChannel;
518 
519     F1394_DEVICE_PATH                    *F1394;
520     USB_DEVICE_PATH                      *Usb;
521     USB_CLASS_DEVICE_PATH                *UsbClass;
522     I2O_DEVICE_PATH                      *I2O;
523     MAC_ADDR_DEVICE_PATH                 *MacAddr;
524     IPv4_DEVICE_PATH                     *Ipv4;
525     IPv6_DEVICE_PATH                     *Ipv6;
526     URI_DEVICE_PATH                      *Uri;
527     INFINIBAND_DEVICE_PATH               *InfiniBand;
528     UART_DEVICE_PATH                     *Uart;
529 
530     HARDDRIVE_DEVICE_PATH                *HardDrive;
531 
532     FILEPATH_DEVICE_PATH                 *FilePath;
533     MEDIA_PROTOCOL_DEVICE_PATH           *MediaProtocol;
534 
535     CDROM_DEVICE_PATH                    *CD;
536     BBS_BBS_DEVICE_PATH                  *Bbs;
537 
538 } EFI_DEV_PATH_PTR;
539 
540 #define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
541   { 0x8b843e20, 0x8132, 0x4852, {0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c} }
542 
543 typedef
544 CHAR16*
545 (EFIAPI *EFI_DEVICE_PATH_TO_TEXT_NODE) (
546     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DeviceNode,
547     IN BOOLEAN                           DisplayOnly,
548     IN BOOLEAN                           AllowShortcuts
549     );
550 
551 typedef
552 CHAR16*
553 (EFIAPI *EFI_DEVICE_PATH_TO_TEXT_PATH) (
554     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath,
555     IN BOOLEAN                           DisplayOnly,
556     IN BOOLEAN                           AllowShortcuts
557     );
558 
559 typedef struct _EFI_DEVICE_PATH_TO_TEXT_PROTOCOL {
560     EFI_DEVICE_PATH_TO_TEXT_NODE         ConvertDeviceNodeToText;
561     EFI_DEVICE_PATH_TO_TEXT_PATH         ConvertDevicePathToText;
562 } EFI_DEVICE_PATH_TO_TEXT_PROTOCOL;
563 
564 #define EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID \
565   { 0x5c99a21, 0xc70f, 0x4ad2, {0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e} }
566 
567 typedef
568 EFI_DEVICE_PATH_PROTOCOL*
569 (EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_NODE) (
570     IN CONST CHAR16                      *TextDeviceNode
571     );
572 
573 typedef
574 EFI_DEVICE_PATH_PROTOCOL*
575 (EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_PATH) (
576     IN CONST CHAR16                      *TextDevicePath
577     );
578 
579 typedef struct {
580     EFI_DEVICE_PATH_FROM_TEXT_NODE       ConvertTextToDeviceNode;
581     EFI_DEVICE_PATH_FROM_TEXT_PATH       ConvertTextToDevicePath;
582 } EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL;
583 
584 #define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
585   { 0x379be4e, 0xd706, 0x437d, {0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4} }
586 
587 typedef
588 UINTN
589 (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE) (
590     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath
591     );
592 
593 typedef
594 EFI_DEVICE_PATH_PROTOCOL*
595 (EFIAPI *EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH) (
596     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath
597     );
598 
599 typedef
600 EFI_DEVICE_PATH_PROTOCOL*
601 (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_PATH) (
602     IN CONST EFI_DEVICE_PATH_PROTOCOL    *Src1,
603     IN CONST EFI_DEVICE_PATH_PROTOCOL    *Src2
604     );
605 
606 typedef
607 EFI_DEVICE_PATH_PROTOCOL*
608 (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_NODE) (
609     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath,
610     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DeviceNode
611 );
612 
613 typedef
614 EFI_DEVICE_PATH_PROTOCOL*
615 (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE) (
616     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath,
617     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePathInstance
618 );
619 
620 typedef
621 EFI_DEVICE_PATH_PROTOCOL*
622 (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE) (
623     IN OUT EFI_DEVICE_PATH_PROTOCOL      **DevicePathInstance,
624     OUT UINTN                            *DevicePathInstanceSize OPTIONAL
625 );
626 
627 typedef
628 EFI_DEVICE_PATH_PROTOCOL*
629 (EFIAPI *EFI_DEVICE_PATH_UTILS_CREATE_NODE) (
630     IN UINT8                             NodeType,
631     IN UINT8                             NodeSubType,
632     IN UINT16                            NodeLength
633     );
634 
635 typedef
636 BOOLEAN
637 (EFIAPI *EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE) (
638     IN CONST EFI_DEVICE_PATH_PROTOCOL    *DevicePath
639     );
640 
641 typedef struct _EFI_DEVICE_PATH_UTILITIES_PROTOCOL {
642     EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE   GetDevicePathSize;
643     EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH        DuplicateDevicePath;
644     EFI_DEVICE_PATH_UTILS_APPEND_PATH            AppendDevicePath;
645     EFI_DEVICE_PATH_UTILS_APPEND_NODE            AppendDeviceNode;
646     EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE        AppendDevicePathInstance;
647     EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE      GetNextDevicePathInstance;
648     EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE      IsDevicePathMultiInstance;
649     EFI_DEVICE_PATH_UTILS_CREATE_NODE            CreateDeviceNode;
650 } EFI_DEVICE_PATH_UTILITIES_PROTOCOL;
651 
652 #endif
653