1#ifndef _DEVPATH_H
2#define _DEVPATH_H
3
4/*++
5
6Copyright (c) 1998  Intel Corporation
7
8Module Name:
9
10    devpath.h
11
12Abstract:
13
14    Defines for parsing the EFI Device Path structures
15
16
17
18Revision History
19
20--*/
21
22//
23// Device Path structures - Section C
24//
25
26typedef 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
78typedef 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
85typedef struct _PCCARD_DEVICE_PATH {
86        EFI_DEVICE_PATH                 Header;
87        UINT8                           SocketNumber;
88} PCCARD_DEVICE_PATH;
89
90#define HW_MEMMAP_DP                    0x03
91typedef 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
99typedef 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
107typedef 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
113typedef 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
124typedef 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
131typedef 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
158typedef 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
166typedef 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
173typedef 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
181typedef 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
188typedef 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
195typedef 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
205typedef struct _I2O_DEVICE_PATH {
206        EFI_DEVICE_PATH                 Header;
207        UINT32                          Tid;
208} I2O_DEVICE_PATH;
209
210#define MSG_MAC_ADDR_DP                 0x0b
211typedef 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
218typedef 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
229typedef 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
240typedef 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
249typedef 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
272typedef 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
289typedef 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
300typedef 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
308typedef 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
316typedef 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
333typedef 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
367typedef 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