Home | History | Annotate | Download | only in Include
      1 /*++
      2 
      3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   EfiDevicePath.h
     15 
     16 Abstract:
     17 
     18   EFI Device Path definitions
     19 
     20 --*/
     21 
     22 #ifndef _EFI_DEVICE_PATH_H
     23 #define _EFI_DEVICE_PATH_H
     24 
     25 
     26 
     27 #pragma pack(1)
     28 
     29 
     30 //
     31 // Device Path defines and macros
     32 //
     33 #define EFI_DP_TYPE_MASK                    0x7F
     34 #define EFI_DP_TYPE_UNPACKED                0x80
     35 #define END_DEVICE_PATH_TYPE                0x7f
     36 #define END_ENTIRE_DEVICE_PATH_SUBTYPE      0xff
     37 #define END_INSTANCE_DEVICE_PATH_SUBTYPE    0x01
     38 #define END_DEVICE_PATH_LENGTH              (sizeof(EFI_DEVICE_PATH_PROTOCOL))
     39 
     40 #define DP_IS_END_TYPE(a)
     41 #define DP_IS_END_SUBTYPE(a)        ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
     42 
     43 #define DevicePathType(a)           ( ((a)->Type) & EFI_DP_TYPE_MASK )
     44 #define DevicePathSubType(a)        ( (a)->SubType )
     45 #define DevicePathNodeLength(a)     ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
     46 #define NextDevicePathNode(a)       ( (EFI_DEVICE_PATH_PROTOCOL *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
     47 #define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
     48 #define IsDevicePathEndSubType(a)   ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
     49 #define IsDevicePathEnd(a)          ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
     50 #define IsDevicePathUnpacked(a)     ( (a)->Type & EFI_DP_TYPE_UNPACKED )
     51 
     52 
     53 #define SetDevicePathNodeLength(a,l) {                \
     54           (a)->Length[0] = (UINT8) (l);               \
     55           (a)->Length[1] = (UINT8) ((l) >> 8);        \
     56           }
     57 
     58 #define SetDevicePathEndNode(a)  {                       \
     59           (a)->Type = END_DEVICE_PATH_TYPE;              \
     60           (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \
     61           (a)->Length[0] = (UINT8) sizeof (EFI_DEVICE_PATH_PROTOCOL);      \
     62           (a)->Length[1] = 0;                            \
     63           }
     64 
     65 //
     66 // Hardware Device Paths
     67 //
     68 #define HARDWARE_DEVICE_PATH      0x01
     69 
     70 #define HW_PCI_DP                 0x01
     71 typedef struct {
     72   EFI_DEVICE_PATH_PROTOCOL        Header;
     73   UINT8                           Function;
     74   UINT8                           Device;
     75 } PCI_DEVICE_PATH;
     76 
     77 #define HW_PCCARD_DP              0x02
     78 typedef struct {
     79   EFI_DEVICE_PATH_PROTOCOL        Header;
     80   UINT8                           FunctionNumber;
     81 } PCCARD_DEVICE_PATH;
     82 
     83 #define HW_MEMMAP_DP              0x03
     84 typedef struct {
     85   EFI_DEVICE_PATH_PROTOCOL        Header;
     86   UINT32                          MemoryType;
     87   EFI_PHYSICAL_ADDRESS            StartingAddress;
     88   EFI_PHYSICAL_ADDRESS            EndingAddress;
     89 } MEMMAP_DEVICE_PATH;
     90 
     91 #define HW_VENDOR_DP              0x04
     92 typedef struct {
     93   EFI_DEVICE_PATH_PROTOCOL        Header;
     94   EFI_GUID                        Guid;
     95 } VENDOR_DEVICE_PATH;
     96 
     97 #define HW_CONTROLLER_DP          0x05
     98 typedef struct {
     99   EFI_DEVICE_PATH_PROTOCOL        Header;
    100   UINT32                          Controller;
    101 } CONTROLLER_DEVICE_PATH;
    102 
    103 //
    104 // ACPI Device Paths
    105 //
    106 #define ACPI_DEVICE_PATH          0x02
    107 
    108 #define ACPI_DP                   0x01
    109 typedef struct {
    110   EFI_DEVICE_PATH_PROTOCOL        Header;
    111   UINT32                          HID;
    112   UINT32                          UID;
    113 } ACPI_HID_DEVICE_PATH;
    114 
    115 #define ACPI_EXTENDED_DP          0x02
    116 typedef struct {
    117   EFI_DEVICE_PATH_PROTOCOL        Header;
    118   UINT32                          HID;
    119   UINT32                          UID;
    120   UINT32                          CID;
    121   //
    122   // Optional variable length _HIDSTR
    123   // Optional variable length _UIDSTR
    124   //
    125 } ACPI_EXTENDED_HID_DEVICE_PATH;
    126 
    127 #define ACPI_ADR_DP               0x03
    128 
    129 typedef struct {
    130   EFI_DEVICE_PATH_PROTOCOL        Header;
    131   UINT32                          ADR;
    132 } ACPI_ADR_DEVICE_PATH;
    133 
    134 #define ACPI_ADR_DISPLAY_TYPE_OTHER             0
    135 #define ACPI_ADR_DISPLAY_TYPE_VGA               1
    136 #define ACPI_ADR_DISPLAY_TYPE_TV                2
    137 #define ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL  3
    138 #define ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL  4
    139 
    140 #define ACPI_DISPLAY_ADR(_DeviceIdScheme, _HeadId, _NonVgaOutput, _BiosCanDetect, _VendorInfo, _Type, _Port, _Index) \
    141           ((UINT32) ( (((_DeviceIdScheme) & 0x1) << 31) |  \
    142                       (((_HeadId)         & 0x7) << 18) |  \
    143                       (((_NonVgaOutput)   & 0x1) << 17) |  \
    144                       (((_BiosCanDetect)  & 0x1) << 16) |  \
    145                       (((_VendorInfo)     & 0xf) << 12) |  \
    146                       (((_Type)           & 0xf) << 8)  |  \
    147                       (((_Port)           & 0xf) << 4)  |  \
    148                        ((_Index)          & 0xf) ))
    149 
    150 //
    151 //  EISA ID Macro
    152 //  EISA ID Definition 32-bits
    153 //   bits[15:0] - three character compressed ASCII EISA ID.
    154 //   bits[31:16] - binary number
    155 //    Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
    156 //
    157 #define PNP_EISA_ID_CONST         0x41d0
    158 #define EISA_ID(_Name, _Num)      ((UINT32) ((_Name) | (_Num) << 16))
    159 #define EISA_PNP_ID(_PNPId)       (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
    160 #define EFI_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 // Messaging Device Paths
    167 //
    168 #define MESSAGING_DEVICE_PATH     0x03
    169 
    170 #define MSG_ATAPI_DP              0x01
    171 typedef struct {
    172   EFI_DEVICE_PATH_PROTOCOL        Header;
    173   UINT8                           PrimarySecondary;
    174   UINT8                           SlaveMaster;
    175   UINT16                          Lun;
    176 } ATAPI_DEVICE_PATH;
    177 
    178 #define MSG_SCSI_DP               0x02
    179 typedef struct {
    180   EFI_DEVICE_PATH_PROTOCOL        Header;
    181   UINT16                          Pun;
    182   UINT16                          Lun;
    183 } SCSI_DEVICE_PATH;
    184 
    185 #define MSG_FIBRECHANNEL_DP       0x03
    186 typedef struct {
    187   EFI_DEVICE_PATH_PROTOCOL        Header;
    188   UINT32                          Reserved;
    189   UINT64                          WWN;
    190   UINT64                          Lun;
    191 } FIBRECHANNEL_DEVICE_PATH;
    192 
    193 #define MSG_1394_DP               0x04
    194 typedef struct {
    195   EFI_DEVICE_PATH_PROTOCOL        Header;
    196   UINT32                          Reserved;
    197   UINT64                          Guid;
    198 } F1394_DEVICE_PATH;
    199 
    200 #define MSG_USB_DP                0x05
    201 typedef struct {
    202   EFI_DEVICE_PATH_PROTOCOL        Header;
    203   UINT8                           ParentPortNumber;
    204   UINT8                           InterfaceNumber;
    205 } USB_DEVICE_PATH;
    206 
    207 #define MSG_USB_CLASS_DP          0x0f
    208 typedef struct {
    209   EFI_DEVICE_PATH_PROTOCOL        Header;
    210   UINT16                          VendorId;
    211   UINT16                          ProductId;
    212   UINT8                           DeviceClass;
    213   UINT8                           DeviceSubClass;
    214   UINT8                           DeviceProtocol;
    215 } USB_CLASS_DEVICE_PATH;
    216 
    217 #define MSG_USB_WWID_DP           0x10
    218 typedef struct {
    219   EFI_DEVICE_PATH_PROTOCOL        Header;
    220   UINT16                          InterfaceNumber;
    221   UINT16                          VendorId;
    222   UINT16                          ProductId;
    223   //
    224   // CHAR16                     SerialNumber[];
    225   //
    226 } USB_WWID_DEVICE_PATH;
    227 
    228 #define MSG_DEVICE_LOGICAL_UNIT_DP  0x11
    229 typedef struct {
    230   EFI_DEVICE_PATH_PROTOCOL        Header;
    231   UINT8                           Lun;
    232 } DEVICE_LOGICAL_UNIT_DEVICE_PATH;
    233 
    234 #define MSG_SATA_DP               0x12
    235 typedef struct {
    236   EFI_DEVICE_PATH_PROTOCOL        Header;
    237   UINT16                          HBAPortNumber;
    238   UINT16                          PortMultiplierPortNumber;
    239   UINT16                          Lun;
    240 } SATA_DEVICE_PATH;
    241 
    242 #define SATA_HBA_DIRECT_CONNECT_FLAG 0x8000
    243 
    244 #define MSG_I2O_DP                0x06
    245 typedef struct {
    246   EFI_DEVICE_PATH_PROTOCOL        Header;
    247   UINT32                          Tid;
    248 } I2O_DEVICE_PATH;
    249 
    250 #define MSG_MAC_ADDR_DP           0x0b
    251 typedef struct {
    252   EFI_DEVICE_PATH_PROTOCOL        Header;
    253   EFI_MAC_ADDRESS                 MacAddress;
    254   UINT8                           IfType;
    255 } MAC_ADDR_DEVICE_PATH;
    256 
    257 #define MSG_IPv4_DP               0x0c
    258 typedef struct {
    259   EFI_DEVICE_PATH_PROTOCOL        Header;
    260   EFI_IPv4_ADDRESS                LocalIpAddress;
    261   EFI_IPv4_ADDRESS                RemoteIpAddress;
    262   UINT16                          LocalPort;
    263   UINT16                          RemotePort;
    264   UINT16                          Protocol;
    265   BOOLEAN                         StaticIpAddress;
    266 } IPv4_DEVICE_PATH;
    267 
    268 #define MSG_IPv6_DP               0x0d
    269 typedef struct {
    270   EFI_DEVICE_PATH_PROTOCOL        Header;
    271   EFI_IPv6_ADDRESS                LocalIpAddress;
    272   EFI_IPv6_ADDRESS                RemoteIpAddress;
    273   UINT16                          LocalPort;
    274   UINT16                          RemotePort;
    275   UINT16                          Protocol;
    276   BOOLEAN                         StaticIpAddress;
    277 } IPv6_DEVICE_PATH;
    278 
    279 #define MSG_INFINIBAND_DP         0x09
    280 typedef struct {
    281   EFI_DEVICE_PATH_PROTOCOL        Header;
    282   UINT32                          ResourceFlags;
    283   UINT8                           PortGid[16];
    284   UINT64                          ServiceId;
    285   UINT64                          TargetPortId;
    286   UINT64                          DeviceId;
    287 } INFINIBAND_DEVICE_PATH;
    288 
    289 #define INFINIBAND_RESOURCE_FLAG_IOC_SERVICE                0x01
    290 #define INFINIBAND_RESOURCE_FLAG_EXTENDED_BOOT_ENVIRONMENT  0x02
    291 #define INFINIBAND_RESOURCE_FLAG_CONSOLE_PROTOCOL           0x04
    292 #define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL           0x08
    293 #define INFINIBAND_RESOURCE_FLAG_NETWORK_PROTOCOL           0x10
    294 
    295 #define MSG_UART_DP               0x0e
    296 typedef struct {
    297   EFI_DEVICE_PATH_PROTOCOL        Header;
    298   UINT32                          Reserved;
    299   UINT64                          BaudRate;
    300   UINT8                           DataBits;
    301   UINT8                           Parity;
    302   UINT8                           StopBits;
    303 } UART_DEVICE_PATH;
    304 
    305 //
    306 // Use VENDOR_DEVICE_PATH struct
    307 //
    308 #define MSG_VENDOR_DP             0x0a
    309 
    310 #define DEVICE_PATH_MESSAGING_PC_ANSI \
    311     { 0xe0c14753, 0xf9be, 0x11d2,  {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}  }
    312 
    313 #define DEVICE_PATH_MESSAGING_VT_100 \
    314     { 0xdfa66065, 0xb419, 0x11d3,  {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}  }
    315 
    316 #define DEVICE_PATH_MESSAGING_VT_100_PLUS \
    317     { 0x7baec70b, 0x57e0, 0x4c76, {0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43}  }
    318 
    319 #define DEVICE_PATH_MESSAGING_VT_UTF8 \
    320     { 0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} }
    321 
    322 #define DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL \
    323     { 0x37499a9d, 0x542f, 0x4c89, {0xa0, 0x26, 0x35, 0xda, 0x14, 0x20, 0x94, 0xe4} }
    324 
    325 typedef struct {
    326   EFI_DEVICE_PATH_PROTOCOL        Header;
    327   EFI_GUID                        Guid;
    328   UINT32                          FlowControlMap;
    329 } UART_FLOW_CONTROL_DEVICE_PATH;
    330 
    331 #define DEVICE_PATH_MESSAGING_SAS \
    332     { 0xd487ddb4, 0x008b, 0x11d9, {0xaf, 0xdc, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d} }
    333 
    334 typedef struct {
    335   EFI_DEVICE_PATH_PROTOCOL        Header;
    336   EFI_GUID                        Guid;
    337   UINT32                          Reserved;
    338   UINT64                          SasAddress;
    339   UINT64                          Lun;
    340   UINT16                          DeviceTopology;
    341   UINT16                          RelativeTargetPort;
    342 } SAS_DEVICE_PATH;
    343 
    344 #define MSG_ISCSI_DP              0x13
    345 typedef struct {
    346   EFI_DEVICE_PATH_PROTOCOL        Header;
    347   UINT16                          NetworkProtocol;
    348   UINT16                          LoginOption;
    349   UINT64                          Lun;
    350   UINT16                          TargetPortalGroupTag;
    351   // CHAR8                        iSCSI Target Name
    352 } ISCSI_DEVICE_PATH;
    353 
    354 #define ISCSI_LOGIN_OPTION_NO_HEADER_DIGEST             0x0000
    355 #define ISCSI_LOGIN_OPTION_HEADER_DIGEST_USING_CRC32C   0x0002
    356 #define ISCSI_LOGIN_OPTION_NO_DATA_DIGEST               0x0000
    357 #define ISCSI_LOGIN_OPTION_DATA_DIGEST_USING_CRC32C     0x0008
    358 #define ISCSI_LOGIN_OPTION_AUTHMETHOD_CHAP              0x0000
    359 #define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON               0x1000
    360 #define ISCSI_LOGIN_OPTION_CHAP_BI                      0x0000
    361 #define ISCSI_LOGIN_OPTION_CHAP_UNI                     0x2000
    362 
    363 ///
    364 /// VLAN Device Path SubType.
    365 ///
    366 #define MSG_VLAN_DP               0x14
    367 typedef struct {
    368   EFI_DEVICE_PATH_PROTOCOL        Header;
    369   ///
    370   /// VLAN identifier (0-4094).
    371   ///
    372   UINT16                          VlanId;
    373 } VLAN_DEVICE_PATH;
    374 
    375 
    376 //
    377 // Media Device Path
    378 //
    379 #define MEDIA_DEVICE_PATH         0x04
    380 
    381 #define MEDIA_HARDDRIVE_DP        0x01
    382 typedef struct {
    383   EFI_DEVICE_PATH_PROTOCOL        Header;
    384   UINT32                          PartitionNumber;
    385   UINT64                          PartitionStart;
    386   UINT64                          PartitionSize;
    387   UINT8                           Signature[16];
    388   UINT8                           MBRType;
    389   UINT8                           SignatureType;
    390 } HARDDRIVE_DEVICE_PATH;
    391 
    392 #define MBR_TYPE_PCAT             0x01
    393 #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
    394 
    395 #define SIGNATURE_TYPE_MBR        0x01
    396 #define SIGNATURE_TYPE_GUID       0x02
    397 
    398 #define MEDIA_CDROM_DP            0x02
    399 typedef struct {
    400   EFI_DEVICE_PATH_PROTOCOL        Header;
    401   UINT32                          BootEntry;
    402   UINT64                          PartitionStart;
    403   UINT64                          PartitionSize;
    404 } CDROM_DEVICE_PATH;
    405 
    406 //
    407 // Use VENDOR_DEVICE_PATH struct
    408 //
    409 #define MEDIA_VENDOR_DP           0x03
    410 
    411 #define MEDIA_FILEPATH_DP         0x04
    412 typedef struct {
    413   EFI_DEVICE_PATH_PROTOCOL        Header;
    414   CHAR16                          PathName[1];
    415 } FILEPATH_DEVICE_PATH;
    416 
    417 #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
    418 
    419 #define MEDIA_PROTOCOL_DP         0x05
    420 typedef struct {
    421   EFI_DEVICE_PATH_PROTOCOL        Header;
    422   EFI_GUID                        Protocol;
    423 } MEDIA_PROTOCOL_DEVICE_PATH;
    424 
    425 #define MEDIA_FV_DP  0x07
    426 typedef struct {
    427   EFI_DEVICE_PATH_PROTOCOL  Header;
    428   EFI_GUID                  NameGuid;
    429 } MEDIA_FW_VOL_DEVICE_PATH;
    430 
    431 #define MEDIA_FV_FILEPATH_DP  0x06
    432 typedef struct {
    433   EFI_DEVICE_PATH_PROTOCOL  Header;
    434   EFI_GUID                  NameGuid;
    435 } MEDIA_FW_VOL_FILEPATH_DEVICE_PATH;
    436 
    437 #define MEDIA_RELATIVE_OFFSET_RANGE_DP 0x08
    438 typedef struct {
    439   EFI_DEVICE_PATH_PROTOCOL  Header;
    440   UINT32                    Reserved;
    441   UINT64                    StartingOffset;
    442   UINT64                    EndingOffset;
    443 } MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH;
    444 
    445 //
    446 // BBS Device Path
    447 //
    448 #define BBS_DEVICE_PATH           0x05
    449 #define BBS_BBS_DP                0x01
    450 typedef struct {
    451   EFI_DEVICE_PATH_PROTOCOL        Header;
    452   UINT16                          DeviceType;
    453   UINT16                          StatusFlag;
    454   CHAR8                           String[1];
    455 } BBS_BBS_DEVICE_PATH;
    456 
    457 //
    458 // DeviceType definitions - from BBS specification
    459 //
    460 #define BBS_TYPE_FLOPPY           0x01
    461 #define BBS_TYPE_HARDDRIVE        0x02
    462 #define BBS_TYPE_CDROM            0x03
    463 #define BBS_TYPE_PCMCIA           0x04
    464 #define BBS_TYPE_USB              0x05
    465 #define BBS_TYPE_EMBEDDED_NETWORK 0x06
    466 #define BBS_TYPE_BEV              0x80
    467 #define BBS_TYPE_UNKNOWN          0xFF
    468 
    469 #define UNKNOWN_DEVICE_GUID \
    470   { 0xcf31fac5, 0xc24e, 0x11d2,  {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b}  }
    471 
    472 typedef struct {
    473   VENDOR_DEVICE_PATH              DevicePath;
    474   UINT8                           LegacyDriveLetter;
    475 } UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
    476 
    477 
    478 //
    479 // Union of all possible Device Paths and pointers to Device Paths
    480 //
    481 
    482 typedef union {
    483   EFI_DEVICE_PATH_PROTOCOL             DevPath;
    484   PCI_DEVICE_PATH                      Pci;
    485   PCCARD_DEVICE_PATH                   PcCard;
    486   MEMMAP_DEVICE_PATH                   MemMap;
    487   VENDOR_DEVICE_PATH                   Vendor;
    488 
    489   UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    UnknownVendor;
    490 
    491   CONTROLLER_DEVICE_PATH               Controller;
    492   ACPI_HID_DEVICE_PATH                 Acpi;
    493   ACPI_EXTENDED_HID_DEVICE_PATH        ExtendedAcpi;
    494 
    495   ATAPI_DEVICE_PATH                    Atapi;
    496   SCSI_DEVICE_PATH                     Scsi;
    497   FIBRECHANNEL_DEVICE_PATH             FibreChannel;
    498   SATA_DEVICE_PATH                     Sata;
    499 
    500   F1394_DEVICE_PATH                    F1394;
    501   USB_DEVICE_PATH                      Usb;
    502   USB_CLASS_DEVICE_PATH                UsbClass;
    503   USB_WWID_DEVICE_PATH                 UsbWwid;
    504   DEVICE_LOGICAL_UNIT_DEVICE_PATH      LogicUnit;
    505   I2O_DEVICE_PATH                      I2O;
    506   MAC_ADDR_DEVICE_PATH                 MacAddr;
    507   IPv4_DEVICE_PATH                     Ipv4;
    508   IPv6_DEVICE_PATH                     Ipv6;
    509   INFINIBAND_DEVICE_PATH               InfiniBand;
    510   UART_DEVICE_PATH                     Uart;
    511   UART_FLOW_CONTROL_DEVICE_PATH        UartFlowControl;
    512   SAS_DEVICE_PATH                      Sas;
    513   ISCSI_DEVICE_PATH                    Iscsi;
    514   HARDDRIVE_DEVICE_PATH                HardDrive;
    515   CDROM_DEVICE_PATH                    CD;
    516 
    517   FILEPATH_DEVICE_PATH                 FilePath;
    518   MEDIA_PROTOCOL_DEVICE_PATH           MediaProtocol;
    519 
    520   MEDIA_FW_VOL_DEVICE_PATH             PiwgFirmwareVolume;
    521   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH    PiwgFirmwareFile;
    522   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH
    523                                        Offset;
    524 
    525   BBS_BBS_DEVICE_PATH                  Bbs;
    526 } EFI_DEV_PATH;
    527 
    528 
    529 
    530 typedef union {
    531   EFI_DEVICE_PATH_PROTOCOL             *DevPath;
    532   PCI_DEVICE_PATH                      *Pci;
    533   PCCARD_DEVICE_PATH                   *PcCard;
    534   MEMMAP_DEVICE_PATH                   *MemMap;
    535   VENDOR_DEVICE_PATH                   *Vendor;
    536 
    537   UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    *UnknownVendor;
    538 
    539   CONTROLLER_DEVICE_PATH               *Controller;
    540   ACPI_HID_DEVICE_PATH                 *Acpi;
    541   ACPI_EXTENDED_HID_DEVICE_PATH        *ExtendedAcpi;
    542 
    543   ATAPI_DEVICE_PATH                    *Atapi;
    544   SCSI_DEVICE_PATH                     *Scsi;
    545   FIBRECHANNEL_DEVICE_PATH             *FibreChannel;
    546   SATA_DEVICE_PATH                     *Sata;
    547 
    548   F1394_DEVICE_PATH                    *F1394;
    549   USB_DEVICE_PATH                      *Usb;
    550   USB_CLASS_DEVICE_PATH                *UsbClass;
    551   USB_WWID_DEVICE_PATH                 *UsbWwid;
    552   DEVICE_LOGICAL_UNIT_DEVICE_PATH      *LogicUnit;
    553   I2O_DEVICE_PATH                      *I2O;
    554   MAC_ADDR_DEVICE_PATH                 *MacAddr;
    555   IPv4_DEVICE_PATH                     *Ipv4;
    556   IPv6_DEVICE_PATH                     *Ipv6;
    557   INFINIBAND_DEVICE_PATH               *InfiniBand;
    558   UART_DEVICE_PATH                     *Uart;
    559   UART_FLOW_CONTROL_DEVICE_PATH        *UartFlowControl;
    560 
    561   SAS_DEVICE_PATH                      *Sas;
    562   ISCSI_DEVICE_PATH                    *Iscsi;
    563 
    564   HARDDRIVE_DEVICE_PATH                *HardDrive;
    565   CDROM_DEVICE_PATH                    *CD;
    566 
    567   FILEPATH_DEVICE_PATH                 *FilePath;
    568   MEDIA_PROTOCOL_DEVICE_PATH           *MediaProtocol;
    569 
    570   MEDIA_FW_VOL_DEVICE_PATH             *PiwgFirmwareVolume;
    571   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH    *PiwgFirmwareFile;
    572   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH
    573                                        *Offset;
    574 
    575   BBS_BBS_DEVICE_PATH                  *Bbs;
    576   UINT8                                *Raw;
    577 } EFI_DEV_PATH_PTR;
    578 
    579 #pragma pack()
    580 
    581 
    582 #endif
    583