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