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