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