Home | History | Annotate | Download | only in efi
      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 {
     27         UINT8                           Type;
     28         UINT8                           SubType;
     29         UINT8                           Length[2];
     30 } EFI_DEVICE_PATH;
     31 
     32 #define EFI_DP_TYPE_MASK                    0x7F
     33 #define EFI_DP_TYPE_UNPACKED                0x80
     34 
     35 //#define END_DEVICE_PATH_TYPE                0xff
     36 #define END_DEVICE_PATH_TYPE                0x7f
     37 //#define END_DEVICE_PATH_TYPE_UNPACKED       0x7f
     38 
     39 #define END_ENTIRE_DEVICE_PATH_SUBTYPE      0xff
     40 #define END_INSTANCE_DEVICE_PATH_SUBTYPE    0x01
     41 #define END_DEVICE_PATH_LENGTH              (sizeof(EFI_DEVICE_PATH))
     42 
     43 
     44 #define DP_IS_END_TYPE(a)
     45 #define DP_IS_END_SUBTYPE(a)        ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
     46 
     47 #define DevicePathType(a)           ( ((a)->Type) & EFI_DP_TYPE_MASK )
     48 #define DevicePathSubType(a)        ( (a)->SubType )
     49 #define DevicePathNodeLength(a)     ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
     50 #define NextDevicePathNode(a)       ( (EFI_DEVICE_PATH *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
     51 //#define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED )
     52 #define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
     53 #define IsDevicePathEndSubType(a)   ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
     54 #define IsDevicePathEnd(a)          ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
     55 #define IsDevicePathUnpacked(a)     ( (a)->Type & EFI_DP_TYPE_UNPACKED )
     56 
     57 
     58 #define SetDevicePathNodeLength(a,l) {                  \
     59             (a)->Length[0] = (UINT8) (l);               \
     60             (a)->Length[1] = (UINT8) ((l) >> 8);        \
     61             }
     62 
     63 #define SetDevicePathEndNode(a)  {                      \
     64             (a)->Type = END_DEVICE_PATH_TYPE;           \
     65             (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;     \
     66             (a)->Length[0] = sizeof(EFI_DEVICE_PATH);   \
     67             (a)->Length[1] = 0;                         \
     68             }
     69 
     70 
     71 
     72 /*
     73  *
     74  */
     75 #define HARDWARE_DEVICE_PATH            0x01
     76 
     77 #define HW_PCI_DP                       0x01
     78 typedef struct _PCI_DEVICE_PATH {
     79         EFI_DEVICE_PATH                 Header;
     80         UINT8                           Function;
     81         UINT8                           Device;
     82 } PCI_DEVICE_PATH;
     83 
     84 #define HW_PCCARD_DP                    0x02
     85 typedef struct _PCCARD_DEVICE_PATH {
     86         EFI_DEVICE_PATH                 Header;
     87         UINT8                           SocketNumber;
     88 } PCCARD_DEVICE_PATH;
     89 
     90 #define HW_MEMMAP_DP                    0x03
     91 typedef struct _MEMMAP_DEVICE_PATH {
     92         EFI_DEVICE_PATH                 Header;
     93         UINT32                          MemoryType;
     94         EFI_PHYSICAL_ADDRESS            StartingAddress;
     95         EFI_PHYSICAL_ADDRESS            EndingAddress;
     96 } MEMMAP_DEVICE_PATH;
     97 
     98 #define HW_VENDOR_DP                    0x04
     99 typedef struct _VENDOR_DEVICE_PATH {
    100         EFI_DEVICE_PATH                 Header;
    101         EFI_GUID                        Guid;
    102 } VENDOR_DEVICE_PATH;
    103 
    104 #define UNKNOWN_DEVICE_GUID \
    105     { 0xcf31fac5, 0xc24e, 0x11d2,  {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b}  }
    106 
    107 typedef struct _UKNOWN_DEVICE_VENDOR_DP {
    108     VENDOR_DEVICE_PATH      DevicePath;
    109     UINT8                   LegacyDriveLetter;
    110 } UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
    111 
    112 #define HW_CONTROLLER_DP            0x05
    113 typedef struct _CONTROLLER_DEVICE_PATH {
    114         EFI_DEVICE_PATH     Header;
    115         UINT32              Controller;
    116 } CONTROLLER_DEVICE_PATH;
    117 
    118 /*
    119  *
    120  */
    121 #define ACPI_DEVICE_PATH                 0x02
    122 
    123 #define ACPI_DP                         0x01
    124 typedef struct _ACPI_HID_DEVICE_PATH {
    125         EFI_DEVICE_PATH                 Header;
    126         UINT32                          HID;
    127         UINT32                          UID;
    128 } ACPI_HID_DEVICE_PATH;
    129 
    130 #define EXPANDED_ACPI_DP		0x02
    131 typedef struct _EXPANDED_ACPI_HID_DEVICE_PATH {
    132 	EFI_DEVICE_PATH			Header;
    133 	UINT32				HID;
    134 	UINT32				UID;
    135 	UINT32				CID;
    136 	UINT8				HidStr[1];
    137 } EXPANDED_ACPI_HID_DEVICE_PATH;
    138 
    139 //
    140 // EISA ID Macro
    141 // EISA ID Definition 32-bits
    142 //  bits[15:0] - three character compressed ASCII EISA ID.
    143 //  bits[31:16] - binary number
    144 //   Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
    145 //
    146 #define PNP_EISA_ID_CONST       0x41d0
    147 #define EISA_ID(_Name, _Num)    ((UINT32) ((_Name) | (_Num) << 16))
    148 #define EISA_PNP_ID(_PNPId)     (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
    149 
    150 #define PNP_EISA_ID_MASK        0xffff
    151 #define EISA_ID_TO_NUM(_Id)     ((_Id) >> 16)
    152 /*
    153  *
    154  */
    155 #define MESSAGING_DEVICE_PATH           0x03
    156 
    157 #define MSG_ATAPI_DP                    0x01
    158 typedef struct _ATAPI_DEVICE_PATH {
    159         EFI_DEVICE_PATH                 Header;
    160         UINT8                           PrimarySecondary;
    161         UINT8                           SlaveMaster;
    162         UINT16                          Lun;
    163 } ATAPI_DEVICE_PATH;
    164 
    165 #define MSG_SCSI_DP                     0x02
    166 typedef struct _SCSI_DEVICE_PATH {
    167         EFI_DEVICE_PATH                 Header;
    168         UINT16                          Pun;
    169         UINT16                          Lun;
    170 } SCSI_DEVICE_PATH;
    171 
    172 #define MSG_FIBRECHANNEL_DP             0x03
    173 typedef struct _FIBRECHANNEL_DEVICE_PATH {
    174         EFI_DEVICE_PATH                 Header;
    175         UINT32                          Reserved;
    176         UINT64                          WWN;
    177         UINT64                          Lun;
    178 } FIBRECHANNEL_DEVICE_PATH;
    179 
    180 #define MSG_1394_DP                     0x04
    181 typedef struct _F1394_DEVICE_PATH {
    182         EFI_DEVICE_PATH                 Header;
    183         UINT32                          Reserved;
    184         UINT64                          Guid;
    185 } F1394_DEVICE_PATH;
    186 
    187 #define MSG_USB_DP                      0x05
    188 typedef struct _USB_DEVICE_PATH {
    189         EFI_DEVICE_PATH                 Header;
    190         UINT8                           Port;
    191         UINT8                           Endpoint;
    192 } USB_DEVICE_PATH;
    193 
    194 #define MSG_USB_CLASS_DP                0x0F
    195 typedef struct _USB_CLASS_DEVICE_PATH {
    196         EFI_DEVICE_PATH                 Header;
    197         UINT16                          VendorId;
    198         UINT16                          ProductId;
    199         UINT8                           DeviceClass;
    200         UINT8                           DeviceSubclass;
    201         UINT8                           DeviceProtocol;
    202 } USB_CLASS_DEVICE_PATH;
    203 
    204 #define MSG_I2O_DP                      0x06
    205 typedef struct _I2O_DEVICE_PATH {
    206         EFI_DEVICE_PATH                 Header;
    207         UINT32                          Tid;
    208 } I2O_DEVICE_PATH;
    209 
    210 #define MSG_MAC_ADDR_DP                 0x0b
    211 typedef struct _MAC_ADDR_DEVICE_PATH {
    212         EFI_DEVICE_PATH                 Header;
    213         EFI_MAC_ADDRESS                 MacAddress;
    214         UINT8                           IfType;
    215 } MAC_ADDR_DEVICE_PATH;
    216 
    217 #define MSG_IPv4_DP                     0x0c
    218 typedef struct _IPv4_DEVICE_PATH {
    219         EFI_DEVICE_PATH                 Header;
    220         EFI_IPv4_ADDRESS                LocalIpAddress;
    221         EFI_IPv4_ADDRESS                RemoteIpAddress;
    222         UINT16                          LocalPort;
    223         UINT16                          RemotePort;
    224         UINT16                          Protocol;
    225         BOOLEAN                         StaticIpAddress;
    226 } IPv4_DEVICE_PATH;
    227 
    228 #define MSG_IPv6_DP                     0x0d
    229 typedef struct _IPv6_DEVICE_PATH {
    230         EFI_DEVICE_PATH                 Header;
    231         EFI_IPv6_ADDRESS                LocalIpAddress;
    232         EFI_IPv6_ADDRESS                RemoteIpAddress;
    233         UINT16                          LocalPort;
    234         UINT16                          RemotePort;
    235         UINT16                          Protocol;
    236         BOOLEAN                         StaticIpAddress;
    237 } IPv6_DEVICE_PATH;
    238 
    239 #define MSG_INFINIBAND_DP               0x09
    240 typedef struct _INFINIBAND_DEVICE_PATH {
    241         EFI_DEVICE_PATH                 Header;
    242         UINT32                          Reserved;
    243         UINT64                          NodeGuid;
    244         UINT64                          IocGuid;
    245         UINT64                          DeviceId;
    246 } INFINIBAND_DEVICE_PATH;
    247 
    248 #define MSG_UART_DP                     0x0e
    249 typedef struct _UART_DEVICE_PATH {
    250         EFI_DEVICE_PATH                 Header;
    251         UINT32                          Reserved;
    252         UINT64                          BaudRate;
    253         UINT8                           DataBits;
    254         UINT8                           Parity;
    255         UINT8                           StopBits;
    256 } UART_DEVICE_PATH;
    257 
    258 #define MSG_VENDOR_DP                   0x0A
    259 /* Use VENDOR_DEVICE_PATH struct */
    260 
    261 #define DEVICE_PATH_MESSAGING_PC_ANSI \
    262     { 0xe0c14753, 0xf9be, 0x11d2,  {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}  }
    263 
    264 #define DEVICE_PATH_MESSAGING_VT_100 \
    265     { 0xdfa66065, 0xb419, 0x11d3,  {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}  }
    266 
    267 
    268 
    269 #define MEDIA_DEVICE_PATH               0x04
    270 
    271 #define MEDIA_HARDDRIVE_DP              0x01
    272 typedef struct _HARDDRIVE_DEVICE_PATH {
    273         EFI_DEVICE_PATH                 Header;
    274         UINT32                          PartitionNumber;
    275         UINT64                          PartitionStart;
    276         UINT64                          PartitionSize;
    277         UINT8                           Signature[16];
    278         UINT8                           MBRType;
    279         UINT8                           SignatureType;
    280 } HARDDRIVE_DEVICE_PATH;
    281 
    282 #define MBR_TYPE_PCAT                       0x01
    283 #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
    284 
    285 #define SIGNATURE_TYPE_MBR                  0x01
    286 #define SIGNATURE_TYPE_GUID                 0x02
    287 
    288 #define MEDIA_CDROM_DP                  0x02
    289 typedef struct _CDROM_DEVICE_PATH {
    290         EFI_DEVICE_PATH                 Header;
    291         UINT32                          BootEntry;
    292         UINT64                          PartitionStart;
    293         UINT64                          PartitionSize;
    294 } CDROM_DEVICE_PATH;
    295 
    296 #define MEDIA_VENDOR_DP                 0x03
    297 /* Use VENDOR_DEVICE_PATH struct */
    298 
    299 #define MEDIA_FILEPATH_DP               0x04
    300 typedef struct _FILEPATH_DEVICE_PATH {
    301         EFI_DEVICE_PATH                 Header;
    302         CHAR16                          PathName[1];
    303 } FILEPATH_DEVICE_PATH;
    304 
    305 #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
    306 
    307 #define MEDIA_PROTOCOL_DP               0x05
    308 typedef struct _MEDIA_PROTOCOL_DEVICE_PATH {
    309         EFI_DEVICE_PATH                 Header;
    310         EFI_GUID                        Protocol;
    311 } MEDIA_PROTOCOL_DEVICE_PATH;
    312 
    313 
    314 #define BBS_DEVICE_PATH                 0x05
    315 #define BBS_BBS_DP                      0x01
    316 typedef struct _BBS_BBS_DEVICE_PATH {
    317         EFI_DEVICE_PATH                 Header;
    318         UINT16                          DeviceType;
    319         UINT16                          StatusFlag;
    320         CHAR8                           String[1];
    321 } BBS_BBS_DEVICE_PATH;
    322 
    323 /* DeviceType definitions - from BBS specification */
    324 #define BBS_TYPE_FLOPPY                 0x01
    325 #define BBS_TYPE_HARDDRIVE              0x02
    326 #define BBS_TYPE_CDROM                  0x03
    327 #define BBS_TYPE_PCMCIA                 0x04
    328 #define BBS_TYPE_USB                    0x05
    329 #define BBS_TYPE_EMBEDDED_NETWORK       0x06
    330 #define BBS_TYPE_DEV                    0x80
    331 #define BBS_TYPE_UNKNOWN                0xFF
    332 
    333 typedef union {
    334     EFI_DEVICE_PATH                      DevPath;
    335     PCI_DEVICE_PATH                      Pci;
    336     PCCARD_DEVICE_PATH                   PcCard;
    337     MEMMAP_DEVICE_PATH                   MemMap;
    338     VENDOR_DEVICE_PATH                   Vendor;
    339     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    UnknownVendor;
    340     CONTROLLER_DEVICE_PATH               Controller;
    341     ACPI_HID_DEVICE_PATH                 Acpi;
    342 
    343     ATAPI_DEVICE_PATH                    Atapi;
    344     SCSI_DEVICE_PATH                     Scsi;
    345     FIBRECHANNEL_DEVICE_PATH             FibreChannel;
    346 
    347     F1394_DEVICE_PATH                    F1394;
    348     USB_DEVICE_PATH                      Usb;
    349     USB_CLASS_DEVICE_PATH                UsbClass;
    350     I2O_DEVICE_PATH                      I2O;
    351     MAC_ADDR_DEVICE_PATH                 MacAddr;
    352     IPv4_DEVICE_PATH                     Ipv4;
    353     IPv6_DEVICE_PATH                     Ipv6;
    354     INFINIBAND_DEVICE_PATH               InfiniBand;
    355     UART_DEVICE_PATH                     Uart;
    356 
    357     HARDDRIVE_DEVICE_PATH                HardDrive;
    358     CDROM_DEVICE_PATH                    CD;
    359 
    360     FILEPATH_DEVICE_PATH                 FilePath;
    361     MEDIA_PROTOCOL_DEVICE_PATH           MediaProtocol;
    362 
    363     BBS_BBS_DEVICE_PATH                  Bbs;
    364 
    365 } EFI_DEV_PATH;
    366 
    367 typedef union {
    368     EFI_DEVICE_PATH                      *DevPath;
    369     PCI_DEVICE_PATH                      *Pci;
    370     PCCARD_DEVICE_PATH                   *PcCard;
    371     MEMMAP_DEVICE_PATH                   *MemMap;
    372     VENDOR_DEVICE_PATH                   *Vendor;
    373     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    *UnknownVendor;
    374     CONTROLLER_DEVICE_PATH               *Controller;
    375     ACPI_HID_DEVICE_PATH                 *Acpi;
    376 
    377     ATAPI_DEVICE_PATH                    *Atapi;
    378     SCSI_DEVICE_PATH                     *Scsi;
    379     FIBRECHANNEL_DEVICE_PATH             *FibreChannel;
    380 
    381     F1394_DEVICE_PATH                    *F1394;
    382     USB_DEVICE_PATH                      *Usb;
    383     USB_CLASS_DEVICE_PATH                *UsbClass;
    384     I2O_DEVICE_PATH                      *I2O;
    385     MAC_ADDR_DEVICE_PATH                 *MacAddr;
    386     IPv4_DEVICE_PATH                     *Ipv4;
    387     IPv6_DEVICE_PATH                     *Ipv6;
    388     INFINIBAND_DEVICE_PATH               *InfiniBand;
    389     UART_DEVICE_PATH                     *Uart;
    390 
    391     HARDDRIVE_DEVICE_PATH                *HardDrive;
    392 
    393     FILEPATH_DEVICE_PATH                 *FilePath;
    394     MEDIA_PROTOCOL_DEVICE_PATH           *MediaProtocol;
    395 
    396     CDROM_DEVICE_PATH                    *CD;
    397     BBS_BBS_DEVICE_PATH                  *Bbs;
    398 
    399 } EFI_DEV_PATH_PTR;
    400 
    401 
    402 #endif
    403