1*22ce4affSfengbojiang /** @file
2*22ce4affSfengbojiang   The device path protocol as defined in UEFI 2.0.
3*22ce4affSfengbojiang 
4*22ce4affSfengbojiang   The device path represents a programmatic path to a device,
5*22ce4affSfengbojiang   from a software point of view. The path must persist from boot to boot, so
6*22ce4affSfengbojiang   it can not contain things like PCI bus numbers that change from boot to boot.
7*22ce4affSfengbojiang 
8*22ce4affSfengbojiang Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
9*22ce4affSfengbojiang SPDX-License-Identifier: BSD-2-Clause-Patent
10*22ce4affSfengbojiang 
11*22ce4affSfengbojiang **/
12*22ce4affSfengbojiang 
13*22ce4affSfengbojiang #ifndef __EFI_DEVICE_PATH_PROTOCOL_H__
14*22ce4affSfengbojiang #define __EFI_DEVICE_PATH_PROTOCOL_H__
15*22ce4affSfengbojiang 
16*22ce4affSfengbojiang #include <Guid/PcAnsi.h>
17*22ce4affSfengbojiang #include <IndustryStandard/Bluetooth.h>
18*22ce4affSfengbojiang #include <IndustryStandard/Acpi60.h>
19*22ce4affSfengbojiang 
20*22ce4affSfengbojiang ///
21*22ce4affSfengbojiang /// Device Path protocol.
22*22ce4affSfengbojiang ///
23*22ce4affSfengbojiang #define EFI_DEVICE_PATH_PROTOCOL_GUID \
24*22ce4affSfengbojiang   { \
25*22ce4affSfengbojiang     0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
26*22ce4affSfengbojiang   }
27*22ce4affSfengbojiang 
28*22ce4affSfengbojiang ///
29*22ce4affSfengbojiang /// Device Path guid definition for backward-compatible with EFI1.1.
30*22ce4affSfengbojiang ///
31*22ce4affSfengbojiang #define DEVICE_PATH_PROTOCOL  EFI_DEVICE_PATH_PROTOCOL_GUID
32*22ce4affSfengbojiang 
33*22ce4affSfengbojiang #pragma pack(1)
34*22ce4affSfengbojiang 
35*22ce4affSfengbojiang /**
36*22ce4affSfengbojiang   This protocol can be used on any device handle to obtain generic path/location
37*22ce4affSfengbojiang   information concerning the physical device or logical device. If the handle does
38*22ce4affSfengbojiang   not logically map to a physical device, the handle may not necessarily support
39*22ce4affSfengbojiang   the device path protocol. The device path describes the location of the device
40*22ce4affSfengbojiang   the handle is for. The size of the Device Path can be determined from the structures
41*22ce4affSfengbojiang   that make up the Device Path.
42*22ce4affSfengbojiang **/
43*22ce4affSfengbojiang typedef struct {
44*22ce4affSfengbojiang   UINT8 Type;       ///< 0x01 Hardware Device Path.
45*22ce4affSfengbojiang                     ///< 0x02 ACPI Device Path.
46*22ce4affSfengbojiang                     ///< 0x03 Messaging Device Path.
47*22ce4affSfengbojiang                     ///< 0x04 Media Device Path.
48*22ce4affSfengbojiang                     ///< 0x05 BIOS Boot Specification Device Path.
49*22ce4affSfengbojiang                     ///< 0x7F End of Hardware Device Path.
50*22ce4affSfengbojiang 
51*22ce4affSfengbojiang   UINT8 SubType;    ///< Varies by Type
52*22ce4affSfengbojiang                     ///< 0xFF End Entire Device Path, or
53*22ce4affSfengbojiang                     ///< 0x01 End This Instance of a Device Path and start a new
54*22ce4affSfengbojiang                     ///< Device Path.
55*22ce4affSfengbojiang 
56*22ce4affSfengbojiang   UINT8 Length[2];  ///< Specific Device Path data. Type and Sub-Type define
57*22ce4affSfengbojiang                     ///< type of data. Size of data is included in Length.
58*22ce4affSfengbojiang 
59*22ce4affSfengbojiang } EFI_DEVICE_PATH_PROTOCOL;
60*22ce4affSfengbojiang 
61*22ce4affSfengbojiang ///
62*22ce4affSfengbojiang /// Device Path protocol definition for backward-compatible with EFI1.1.
63*22ce4affSfengbojiang ///
64*22ce4affSfengbojiang typedef EFI_DEVICE_PATH_PROTOCOL  EFI_DEVICE_PATH;
65*22ce4affSfengbojiang 
66*22ce4affSfengbojiang ///
67*22ce4affSfengbojiang /// Hardware Device Paths.
68*22ce4affSfengbojiang ///
69*22ce4affSfengbojiang #define HARDWARE_DEVICE_PATH      0x01
70*22ce4affSfengbojiang 
71*22ce4affSfengbojiang ///
72*22ce4affSfengbojiang /// PCI Device Path SubType.
73*22ce4affSfengbojiang ///
74*22ce4affSfengbojiang #define HW_PCI_DP                 0x01
75*22ce4affSfengbojiang 
76*22ce4affSfengbojiang ///
77*22ce4affSfengbojiang /// PCI Device Path.
78*22ce4affSfengbojiang ///
79*22ce4affSfengbojiang typedef struct {
80*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
81*22ce4affSfengbojiang   ///
82*22ce4affSfengbojiang   /// PCI Function Number.
83*22ce4affSfengbojiang   ///
84*22ce4affSfengbojiang   UINT8                           Function;
85*22ce4affSfengbojiang   ///
86*22ce4affSfengbojiang   /// PCI Device Number.
87*22ce4affSfengbojiang   ///
88*22ce4affSfengbojiang   UINT8                           Device;
89*22ce4affSfengbojiang } PCI_DEVICE_PATH;
90*22ce4affSfengbojiang 
91*22ce4affSfengbojiang ///
92*22ce4affSfengbojiang /// PCCARD Device Path SubType.
93*22ce4affSfengbojiang ///
94*22ce4affSfengbojiang #define HW_PCCARD_DP              0x02
95*22ce4affSfengbojiang 
96*22ce4affSfengbojiang ///
97*22ce4affSfengbojiang /// PCCARD Device Path.
98*22ce4affSfengbojiang ///
99*22ce4affSfengbojiang typedef struct {
100*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
101*22ce4affSfengbojiang   ///
102*22ce4affSfengbojiang   /// Function Number (0 = First Function).
103*22ce4affSfengbojiang   ///
104*22ce4affSfengbojiang   UINT8                           FunctionNumber;
105*22ce4affSfengbojiang } PCCARD_DEVICE_PATH;
106*22ce4affSfengbojiang 
107*22ce4affSfengbojiang ///
108*22ce4affSfengbojiang /// Memory Mapped Device Path SubType.
109*22ce4affSfengbojiang ///
110*22ce4affSfengbojiang #define HW_MEMMAP_DP              0x03
111*22ce4affSfengbojiang 
112*22ce4affSfengbojiang ///
113*22ce4affSfengbojiang /// Memory Mapped Device Path.
114*22ce4affSfengbojiang ///
115*22ce4affSfengbojiang typedef struct {
116*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
117*22ce4affSfengbojiang   ///
118*22ce4affSfengbojiang   /// EFI_MEMORY_TYPE
119*22ce4affSfengbojiang   ///
120*22ce4affSfengbojiang   UINT32                          MemoryType;
121*22ce4affSfengbojiang   ///
122*22ce4affSfengbojiang   /// Starting Memory Address.
123*22ce4affSfengbojiang   ///
124*22ce4affSfengbojiang   EFI_PHYSICAL_ADDRESS            StartingAddress;
125*22ce4affSfengbojiang   ///
126*22ce4affSfengbojiang   /// Ending Memory Address.
127*22ce4affSfengbojiang   ///
128*22ce4affSfengbojiang   EFI_PHYSICAL_ADDRESS            EndingAddress;
129*22ce4affSfengbojiang } MEMMAP_DEVICE_PATH;
130*22ce4affSfengbojiang 
131*22ce4affSfengbojiang ///
132*22ce4affSfengbojiang /// Hardware Vendor Device Path SubType.
133*22ce4affSfengbojiang ///
134*22ce4affSfengbojiang #define HW_VENDOR_DP              0x04
135*22ce4affSfengbojiang 
136*22ce4affSfengbojiang ///
137*22ce4affSfengbojiang /// The Vendor Device Path allows the creation of vendor-defined Device Paths. A vendor must
138*22ce4affSfengbojiang /// allocate a Vendor GUID for a Device Path. The Vendor GUID can then be used to define the
139*22ce4affSfengbojiang /// contents on the n bytes that follow in the Vendor Device Path node.
140*22ce4affSfengbojiang ///
141*22ce4affSfengbojiang typedef struct {
142*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
143*22ce4affSfengbojiang   ///
144*22ce4affSfengbojiang   /// Vendor-assigned GUID that defines the data that follows.
145*22ce4affSfengbojiang   ///
146*22ce4affSfengbojiang   EFI_GUID                        Guid;
147*22ce4affSfengbojiang   ///
148*22ce4affSfengbojiang   /// Vendor-defined variable size data.
149*22ce4affSfengbojiang   ///
150*22ce4affSfengbojiang } VENDOR_DEVICE_PATH;
151*22ce4affSfengbojiang 
152*22ce4affSfengbojiang ///
153*22ce4affSfengbojiang /// Controller Device Path SubType.
154*22ce4affSfengbojiang ///
155*22ce4affSfengbojiang #define HW_CONTROLLER_DP          0x05
156*22ce4affSfengbojiang 
157*22ce4affSfengbojiang ///
158*22ce4affSfengbojiang /// Controller Device Path.
159*22ce4affSfengbojiang ///
160*22ce4affSfengbojiang typedef struct {
161*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
162*22ce4affSfengbojiang   ///
163*22ce4affSfengbojiang   /// Controller number.
164*22ce4affSfengbojiang   ///
165*22ce4affSfengbojiang   UINT32                          ControllerNumber;
166*22ce4affSfengbojiang } CONTROLLER_DEVICE_PATH;
167*22ce4affSfengbojiang 
168*22ce4affSfengbojiang ///
169*22ce4affSfengbojiang /// BMC Device Path SubType.
170*22ce4affSfengbojiang ///
171*22ce4affSfengbojiang #define HW_BMC_DP                 0x06
172*22ce4affSfengbojiang 
173*22ce4affSfengbojiang ///
174*22ce4affSfengbojiang /// BMC Device Path.
175*22ce4affSfengbojiang ///
176*22ce4affSfengbojiang typedef struct {
177*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
178*22ce4affSfengbojiang   ///
179*22ce4affSfengbojiang   /// Interface Type.
180*22ce4affSfengbojiang   ///
181*22ce4affSfengbojiang   UINT8                           InterfaceType;
182*22ce4affSfengbojiang   ///
183*22ce4affSfengbojiang   /// Base Address.
184*22ce4affSfengbojiang   ///
185*22ce4affSfengbojiang   UINT8                           BaseAddress[8];
186*22ce4affSfengbojiang } BMC_DEVICE_PATH;
187*22ce4affSfengbojiang 
188*22ce4affSfengbojiang ///
189*22ce4affSfengbojiang /// ACPI Device Paths.
190*22ce4affSfengbojiang ///
191*22ce4affSfengbojiang #define ACPI_DEVICE_PATH          0x02
192*22ce4affSfengbojiang 
193*22ce4affSfengbojiang ///
194*22ce4affSfengbojiang /// ACPI Device Path SubType.
195*22ce4affSfengbojiang ///
196*22ce4affSfengbojiang #define ACPI_DP                   0x01
197*22ce4affSfengbojiang typedef struct {
198*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
199*22ce4affSfengbojiang   ///
200*22ce4affSfengbojiang   /// Device's PnP hardware ID stored in a numeric 32-bit
201*22ce4affSfengbojiang   /// compressed EISA-type ID. This value must match the
202*22ce4affSfengbojiang   /// corresponding _HID in the ACPI name space.
203*22ce4affSfengbojiang   ///
204*22ce4affSfengbojiang   UINT32                          HID;
205*22ce4affSfengbojiang   ///
206*22ce4affSfengbojiang   /// Unique ID that is required by ACPI if two devices have the
207*22ce4affSfengbojiang   /// same _HID. This value must also match the corresponding
208*22ce4affSfengbojiang   /// _UID/_HID pair in the ACPI name space. Only the 32-bit
209*22ce4affSfengbojiang   /// numeric value type of _UID is supported. Thus, strings must
210*22ce4affSfengbojiang   /// not be used for the _UID in the ACPI name space.
211*22ce4affSfengbojiang   ///
212*22ce4affSfengbojiang   UINT32                          UID;
213*22ce4affSfengbojiang } ACPI_HID_DEVICE_PATH;
214*22ce4affSfengbojiang 
215*22ce4affSfengbojiang ///
216*22ce4affSfengbojiang /// Expanded ACPI Device Path SubType.
217*22ce4affSfengbojiang ///
218*22ce4affSfengbojiang #define ACPI_EXTENDED_DP          0x02
219*22ce4affSfengbojiang typedef struct {
220*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
221*22ce4affSfengbojiang   ///
222*22ce4affSfengbojiang   /// Device's PnP hardware ID stored in a numeric 32-bit
223*22ce4affSfengbojiang   /// compressed EISA-type ID. This value must match the
224*22ce4affSfengbojiang   /// corresponding _HID in the ACPI name space.
225*22ce4affSfengbojiang   ///
226*22ce4affSfengbojiang   UINT32                          HID;
227*22ce4affSfengbojiang   ///
228*22ce4affSfengbojiang   /// Unique ID that is required by ACPI if two devices have the
229*22ce4affSfengbojiang   /// same _HID. This value must also match the corresponding
230*22ce4affSfengbojiang   /// _UID/_HID pair in the ACPI name space.
231*22ce4affSfengbojiang   ///
232*22ce4affSfengbojiang   UINT32                          UID;
233*22ce4affSfengbojiang   ///
234*22ce4affSfengbojiang   /// Device's compatible PnP hardware ID stored in a numeric
235*22ce4affSfengbojiang   /// 32-bit compressed EISA-type ID. This value must match at
236*22ce4affSfengbojiang   /// least one of the compatible device IDs returned by the
237*22ce4affSfengbojiang   /// corresponding _CID in the ACPI name space.
238*22ce4affSfengbojiang   ///
239*22ce4affSfengbojiang   UINT32                          CID;
240*22ce4affSfengbojiang   ///
241*22ce4affSfengbojiang   /// Optional variable length _HIDSTR.
242*22ce4affSfengbojiang   /// Optional variable length _UIDSTR.
243*22ce4affSfengbojiang   /// Optional variable length _CIDSTR.
244*22ce4affSfengbojiang   ///
245*22ce4affSfengbojiang } ACPI_EXTENDED_HID_DEVICE_PATH;
246*22ce4affSfengbojiang 
247*22ce4affSfengbojiang //
248*22ce4affSfengbojiang //  EISA ID Macro
249*22ce4affSfengbojiang //  EISA ID Definition 32-bits
250*22ce4affSfengbojiang //   bits[15:0] - three character compressed ASCII EISA ID.
251*22ce4affSfengbojiang //   bits[31:16] - binary number
252*22ce4affSfengbojiang //    Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
253*22ce4affSfengbojiang //
254*22ce4affSfengbojiang #define PNP_EISA_ID_CONST         0x41d0
255*22ce4affSfengbojiang #define EISA_ID(_Name, _Num)      ((UINT32)((_Name) | (_Num) << 16))
256*22ce4affSfengbojiang #define EISA_PNP_ID(_PNPId)       (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
257*22ce4affSfengbojiang #define EFI_PNP_ID(_PNPId)        (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
258*22ce4affSfengbojiang 
259*22ce4affSfengbojiang #define PNP_EISA_ID_MASK          0xffff
260*22ce4affSfengbojiang #define EISA_ID_TO_NUM(_Id)       ((_Id) >> 16)
261*22ce4affSfengbojiang 
262*22ce4affSfengbojiang ///
263*22ce4affSfengbojiang /// ACPI _ADR Device Path SubType.
264*22ce4affSfengbojiang ///
265*22ce4affSfengbojiang #define ACPI_ADR_DP               0x03
266*22ce4affSfengbojiang 
267*22ce4affSfengbojiang ///
268*22ce4affSfengbojiang /// The _ADR device path is used to contain video output device attributes to support the Graphics
269*22ce4affSfengbojiang /// Output Protocol. The device path can contain multiple _ADR entries if multiple video output
270*22ce4affSfengbojiang /// devices are displaying the same output.
271*22ce4affSfengbojiang ///
272*22ce4affSfengbojiang typedef struct {
273*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
274*22ce4affSfengbojiang   ///
275*22ce4affSfengbojiang   /// _ADR value. For video output devices the value of this
276*22ce4affSfengbojiang   /// field comes from Table B-2 of the ACPI 3.0 specification. At
277*22ce4affSfengbojiang   /// least one _ADR value is required.
278*22ce4affSfengbojiang   ///
279*22ce4affSfengbojiang   UINT32                          ADR;
280*22ce4affSfengbojiang   //
281*22ce4affSfengbojiang   // This device path may optionally contain more than one _ADR entry.
282*22ce4affSfengbojiang   //
283*22ce4affSfengbojiang } ACPI_ADR_DEVICE_PATH;
284*22ce4affSfengbojiang 
285*22ce4affSfengbojiang ///
286*22ce4affSfengbojiang /// ACPI NVDIMM Device Path SubType.
287*22ce4affSfengbojiang ///
288*22ce4affSfengbojiang #define ACPI_NVDIMM_DP               0x04
289*22ce4affSfengbojiang ///
290*22ce4affSfengbojiang ///
291*22ce4affSfengbojiang typedef struct {
292*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
293*22ce4affSfengbojiang   ///
294*22ce4affSfengbojiang   /// NFIT Device Handle, the _ADR of the NVDIMM device.
295*22ce4affSfengbojiang   /// The value of this field comes from Section 9.20.3 of the ACPI 6.2A specification.
296*22ce4affSfengbojiang   ///
297*22ce4affSfengbojiang   UINT32                          NFITDeviceHandle;
298*22ce4affSfengbojiang } ACPI_NVDIMM_DEVICE_PATH;
299*22ce4affSfengbojiang 
300*22ce4affSfengbojiang #define ACPI_ADR_DISPLAY_TYPE_OTHER             0
301*22ce4affSfengbojiang #define ACPI_ADR_DISPLAY_TYPE_VGA               1
302*22ce4affSfengbojiang #define ACPI_ADR_DISPLAY_TYPE_TV                2
303*22ce4affSfengbojiang #define ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL  3
304*22ce4affSfengbojiang #define ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL  4
305*22ce4affSfengbojiang 
306*22ce4affSfengbojiang #define ACPI_DISPLAY_ADR(_DeviceIdScheme, _HeadId, _NonVgaOutput, _BiosCanDetect, _VendorInfo, _Type, _Port, _Index) \
307*22ce4affSfengbojiang           ((UINT32)(  ((UINT32)((_DeviceIdScheme) & 0x1) << 31) |  \
308*22ce4affSfengbojiang                       (((_HeadId)                 & 0x7) << 18) |  \
309*22ce4affSfengbojiang                       (((_NonVgaOutput)           & 0x1) << 17) |  \
310*22ce4affSfengbojiang                       (((_BiosCanDetect)          & 0x1) << 16) |  \
311*22ce4affSfengbojiang                       (((_VendorInfo)             & 0xf) << 12) |  \
312*22ce4affSfengbojiang                       (((_Type)                   & 0xf) << 8)  |  \
313*22ce4affSfengbojiang                       (((_Port)                   & 0xf) << 4)  |  \
314*22ce4affSfengbojiang                        ((_Index)                  & 0xf) ))
315*22ce4affSfengbojiang 
316*22ce4affSfengbojiang ///
317*22ce4affSfengbojiang /// Messaging Device Paths.
318*22ce4affSfengbojiang /// This Device Path is used to describe the connection of devices outside the resource domain of the
319*22ce4affSfengbojiang /// system. This Device Path can describe physical messaging information like SCSI ID, or abstract
320*22ce4affSfengbojiang /// information like networking protocol IP addresses.
321*22ce4affSfengbojiang ///
322*22ce4affSfengbojiang #define MESSAGING_DEVICE_PATH     0x03
323*22ce4affSfengbojiang 
324*22ce4affSfengbojiang ///
325*22ce4affSfengbojiang /// ATAPI Device Path SubType
326*22ce4affSfengbojiang ///
327*22ce4affSfengbojiang #define MSG_ATAPI_DP              0x01
328*22ce4affSfengbojiang typedef struct {
329*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
330*22ce4affSfengbojiang   ///
331*22ce4affSfengbojiang   /// Set to zero for primary, or one for secondary.
332*22ce4affSfengbojiang   ///
333*22ce4affSfengbojiang   UINT8                           PrimarySecondary;
334*22ce4affSfengbojiang   ///
335*22ce4affSfengbojiang   /// Set to zero for master, or one for slave mode.
336*22ce4affSfengbojiang   ///
337*22ce4affSfengbojiang   UINT8                           SlaveMaster;
338*22ce4affSfengbojiang   ///
339*22ce4affSfengbojiang   /// Logical Unit Number.
340*22ce4affSfengbojiang   ///
341*22ce4affSfengbojiang   UINT16                          Lun;
342*22ce4affSfengbojiang } ATAPI_DEVICE_PATH;
343*22ce4affSfengbojiang 
344*22ce4affSfengbojiang ///
345*22ce4affSfengbojiang /// SCSI Device Path SubType.
346*22ce4affSfengbojiang ///
347*22ce4affSfengbojiang #define MSG_SCSI_DP               0x02
348*22ce4affSfengbojiang typedef struct {
349*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
350*22ce4affSfengbojiang   ///
351*22ce4affSfengbojiang   /// Target ID on the SCSI bus (PUN).
352*22ce4affSfengbojiang   ///
353*22ce4affSfengbojiang   UINT16                          Pun;
354*22ce4affSfengbojiang   ///
355*22ce4affSfengbojiang   /// Logical Unit Number (LUN).
356*22ce4affSfengbojiang   ///
357*22ce4affSfengbojiang   UINT16                          Lun;
358*22ce4affSfengbojiang } SCSI_DEVICE_PATH;
359*22ce4affSfengbojiang 
360*22ce4affSfengbojiang ///
361*22ce4affSfengbojiang /// Fibre Channel SubType.
362*22ce4affSfengbojiang ///
363*22ce4affSfengbojiang #define MSG_FIBRECHANNEL_DP       0x03
364*22ce4affSfengbojiang typedef struct {
365*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
366*22ce4affSfengbojiang   ///
367*22ce4affSfengbojiang   /// Reserved for the future.
368*22ce4affSfengbojiang   ///
369*22ce4affSfengbojiang   UINT32                          Reserved;
370*22ce4affSfengbojiang   ///
371*22ce4affSfengbojiang   /// Fibre Channel World Wide Number.
372*22ce4affSfengbojiang   ///
373*22ce4affSfengbojiang   UINT64                          WWN;
374*22ce4affSfengbojiang   ///
375*22ce4affSfengbojiang   /// Fibre Channel Logical Unit Number.
376*22ce4affSfengbojiang   ///
377*22ce4affSfengbojiang   UINT64                          Lun;
378*22ce4affSfengbojiang } FIBRECHANNEL_DEVICE_PATH;
379*22ce4affSfengbojiang 
380*22ce4affSfengbojiang ///
381*22ce4affSfengbojiang /// Fibre Channel Ex SubType.
382*22ce4affSfengbojiang ///
383*22ce4affSfengbojiang #define MSG_FIBRECHANNELEX_DP     0x15
384*22ce4affSfengbojiang typedef struct {
385*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
386*22ce4affSfengbojiang   ///
387*22ce4affSfengbojiang   /// Reserved for the future.
388*22ce4affSfengbojiang   ///
389*22ce4affSfengbojiang   UINT32                          Reserved;
390*22ce4affSfengbojiang   ///
391*22ce4affSfengbojiang   /// 8 byte array containing Fibre Channel End Device Port Name.
392*22ce4affSfengbojiang   ///
393*22ce4affSfengbojiang   UINT8                           WWN[8];
394*22ce4affSfengbojiang   ///
395*22ce4affSfengbojiang   /// 8 byte array containing Fibre Channel Logical Unit Number.
396*22ce4affSfengbojiang   ///
397*22ce4affSfengbojiang   UINT8                           Lun[8];
398*22ce4affSfengbojiang } FIBRECHANNELEX_DEVICE_PATH;
399*22ce4affSfengbojiang 
400*22ce4affSfengbojiang ///
401*22ce4affSfengbojiang /// 1394 Device Path SubType
402*22ce4affSfengbojiang ///
403*22ce4affSfengbojiang #define MSG_1394_DP               0x04
404*22ce4affSfengbojiang typedef struct {
405*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
406*22ce4affSfengbojiang   ///
407*22ce4affSfengbojiang   /// Reserved for the future.
408*22ce4affSfengbojiang   ///
409*22ce4affSfengbojiang   UINT32                          Reserved;
410*22ce4affSfengbojiang   ///
411*22ce4affSfengbojiang   /// 1394 Global Unique ID (GUID).
412*22ce4affSfengbojiang   ///
413*22ce4affSfengbojiang   UINT64                          Guid;
414*22ce4affSfengbojiang } F1394_DEVICE_PATH;
415*22ce4affSfengbojiang 
416*22ce4affSfengbojiang ///
417*22ce4affSfengbojiang /// USB Device Path SubType.
418*22ce4affSfengbojiang ///
419*22ce4affSfengbojiang #define MSG_USB_DP                0x05
420*22ce4affSfengbojiang typedef struct {
421*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL      Header;
422*22ce4affSfengbojiang   ///
423*22ce4affSfengbojiang   /// USB Parent Port Number.
424*22ce4affSfengbojiang   ///
425*22ce4affSfengbojiang   UINT8                         ParentPortNumber;
426*22ce4affSfengbojiang   ///
427*22ce4affSfengbojiang   /// USB Interface Number.
428*22ce4affSfengbojiang   ///
429*22ce4affSfengbojiang   UINT8                         InterfaceNumber;
430*22ce4affSfengbojiang } USB_DEVICE_PATH;
431*22ce4affSfengbojiang 
432*22ce4affSfengbojiang ///
433*22ce4affSfengbojiang /// USB Class Device Path SubType.
434*22ce4affSfengbojiang ///
435*22ce4affSfengbojiang #define MSG_USB_CLASS_DP          0x0f
436*22ce4affSfengbojiang typedef struct {
437*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL      Header;
438*22ce4affSfengbojiang   ///
439*22ce4affSfengbojiang   /// Vendor ID assigned by USB-IF. A value of 0xFFFF will
440*22ce4affSfengbojiang   /// match any Vendor ID.
441*22ce4affSfengbojiang   ///
442*22ce4affSfengbojiang   UINT16                        VendorId;
443*22ce4affSfengbojiang   ///
444*22ce4affSfengbojiang   /// Product ID assigned by USB-IF. A value of 0xFFFF will
445*22ce4affSfengbojiang   /// match any Product ID.
446*22ce4affSfengbojiang   ///
447*22ce4affSfengbojiang   UINT16                        ProductId;
448*22ce4affSfengbojiang   ///
449*22ce4affSfengbojiang   /// The class code assigned by the USB-IF. A value of 0xFF
450*22ce4affSfengbojiang   /// will match any class code.
451*22ce4affSfengbojiang   ///
452*22ce4affSfengbojiang   UINT8                         DeviceClass;
453*22ce4affSfengbojiang   ///
454*22ce4affSfengbojiang   /// The subclass code assigned by the USB-IF. A value of
455*22ce4affSfengbojiang   /// 0xFF will match any subclass code.
456*22ce4affSfengbojiang   ///
457*22ce4affSfengbojiang   UINT8                         DeviceSubClass;
458*22ce4affSfengbojiang   ///
459*22ce4affSfengbojiang   /// The protocol code assigned by the USB-IF. A value of
460*22ce4affSfengbojiang   /// 0xFF will match any protocol code.
461*22ce4affSfengbojiang   ///
462*22ce4affSfengbojiang   UINT8                         DeviceProtocol;
463*22ce4affSfengbojiang } USB_CLASS_DEVICE_PATH;
464*22ce4affSfengbojiang 
465*22ce4affSfengbojiang ///
466*22ce4affSfengbojiang /// USB WWID Device Path SubType.
467*22ce4affSfengbojiang ///
468*22ce4affSfengbojiang #define MSG_USB_WWID_DP           0x10
469*22ce4affSfengbojiang 
470*22ce4affSfengbojiang ///
471*22ce4affSfengbojiang /// This device path describes a USB device using its serial number.
472*22ce4affSfengbojiang ///
473*22ce4affSfengbojiang typedef struct {
474*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL      Header;
475*22ce4affSfengbojiang   ///
476*22ce4affSfengbojiang   /// USB interface number.
477*22ce4affSfengbojiang   ///
478*22ce4affSfengbojiang   UINT16                        InterfaceNumber;
479*22ce4affSfengbojiang   ///
480*22ce4affSfengbojiang   /// USB vendor id of the device.
481*22ce4affSfengbojiang   ///
482*22ce4affSfengbojiang   UINT16                        VendorId;
483*22ce4affSfengbojiang   ///
484*22ce4affSfengbojiang   /// USB product id of the device.
485*22ce4affSfengbojiang   ///
486*22ce4affSfengbojiang   UINT16                        ProductId;
487*22ce4affSfengbojiang   ///
488*22ce4affSfengbojiang   /// Last 64-or-fewer UTF-16 characters of the USB
489*22ce4affSfengbojiang   /// serial number. The length of the string is
490*22ce4affSfengbojiang   /// determined by the Length field less the offset of the
491*22ce4affSfengbojiang   /// Serial Number field (10)
492*22ce4affSfengbojiang   ///
493*22ce4affSfengbojiang   /// CHAR16                     SerialNumber[...];
494*22ce4affSfengbojiang } USB_WWID_DEVICE_PATH;
495*22ce4affSfengbojiang 
496*22ce4affSfengbojiang ///
497*22ce4affSfengbojiang /// Device Logical Unit SubType.
498*22ce4affSfengbojiang ///
499*22ce4affSfengbojiang #define MSG_DEVICE_LOGICAL_UNIT_DP  0x11
500*22ce4affSfengbojiang typedef struct {
501*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL      Header;
502*22ce4affSfengbojiang   ///
503*22ce4affSfengbojiang   /// Logical Unit Number for the interface.
504*22ce4affSfengbojiang   ///
505*22ce4affSfengbojiang   UINT8                         Lun;
506*22ce4affSfengbojiang } DEVICE_LOGICAL_UNIT_DEVICE_PATH;
507*22ce4affSfengbojiang 
508*22ce4affSfengbojiang ///
509*22ce4affSfengbojiang /// SATA Device Path SubType.
510*22ce4affSfengbojiang ///
511*22ce4affSfengbojiang #define MSG_SATA_DP               0x12
512*22ce4affSfengbojiang typedef struct {
513*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
514*22ce4affSfengbojiang   ///
515*22ce4affSfengbojiang   /// The HBA port number that facilitates the connection to the
516*22ce4affSfengbojiang   /// device or a port multiplier. The value 0xFFFF is reserved.
517*22ce4affSfengbojiang   ///
518*22ce4affSfengbojiang   UINT16                          HBAPortNumber;
519*22ce4affSfengbojiang   ///
520*22ce4affSfengbojiang   /// The Port multiplier port number that facilitates the connection
521*22ce4affSfengbojiang   /// to the device. Must be set to 0xFFFF if the device is directly
522*22ce4affSfengbojiang   /// connected to the HBA.
523*22ce4affSfengbojiang   ///
524*22ce4affSfengbojiang   UINT16                          PortMultiplierPortNumber;
525*22ce4affSfengbojiang   ///
526*22ce4affSfengbojiang   /// Logical Unit Number.
527*22ce4affSfengbojiang   ///
528*22ce4affSfengbojiang   UINT16                          Lun;
529*22ce4affSfengbojiang } SATA_DEVICE_PATH;
530*22ce4affSfengbojiang 
531*22ce4affSfengbojiang ///
532*22ce4affSfengbojiang /// Flag for if the device is directly connected to the HBA.
533*22ce4affSfengbojiang ///
534*22ce4affSfengbojiang #define SATA_HBA_DIRECT_CONNECT_FLAG 0x8000
535*22ce4affSfengbojiang 
536*22ce4affSfengbojiang ///
537*22ce4affSfengbojiang /// I2O Device Path SubType.
538*22ce4affSfengbojiang ///
539*22ce4affSfengbojiang #define MSG_I2O_DP                0x06
540*22ce4affSfengbojiang typedef struct {
541*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
542*22ce4affSfengbojiang   ///
543*22ce4affSfengbojiang   /// Target ID (TID) for a device.
544*22ce4affSfengbojiang   ///
545*22ce4affSfengbojiang   UINT32                          Tid;
546*22ce4affSfengbojiang } I2O_DEVICE_PATH;
547*22ce4affSfengbojiang 
548*22ce4affSfengbojiang ///
549*22ce4affSfengbojiang /// MAC Address Device Path SubType.
550*22ce4affSfengbojiang ///
551*22ce4affSfengbojiang #define MSG_MAC_ADDR_DP           0x0b
552*22ce4affSfengbojiang typedef struct {
553*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
554*22ce4affSfengbojiang   ///
555*22ce4affSfengbojiang   /// The MAC address for a network interface padded with 0s.
556*22ce4affSfengbojiang   ///
557*22ce4affSfengbojiang   EFI_MAC_ADDRESS                 MacAddress;
558*22ce4affSfengbojiang   ///
559*22ce4affSfengbojiang   /// Network interface type(i.e. 802.3, FDDI).
560*22ce4affSfengbojiang   ///
561*22ce4affSfengbojiang   UINT8                           IfType;
562*22ce4affSfengbojiang } MAC_ADDR_DEVICE_PATH;
563*22ce4affSfengbojiang 
564*22ce4affSfengbojiang ///
565*22ce4affSfengbojiang /// IPv4 Device Path SubType
566*22ce4affSfengbojiang ///
567*22ce4affSfengbojiang #define MSG_IPv4_DP               0x0c
568*22ce4affSfengbojiang typedef struct {
569*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
570*22ce4affSfengbojiang   ///
571*22ce4affSfengbojiang   /// The local IPv4 address.
572*22ce4affSfengbojiang   ///
573*22ce4affSfengbojiang   EFI_IPv4_ADDRESS                LocalIpAddress;
574*22ce4affSfengbojiang   ///
575*22ce4affSfengbojiang   /// The remote IPv4 address.
576*22ce4affSfengbojiang   ///
577*22ce4affSfengbojiang   EFI_IPv4_ADDRESS                RemoteIpAddress;
578*22ce4affSfengbojiang   ///
579*22ce4affSfengbojiang   /// The local port number.
580*22ce4affSfengbojiang   ///
581*22ce4affSfengbojiang   UINT16                          LocalPort;
582*22ce4affSfengbojiang   ///
583*22ce4affSfengbojiang   /// The remote port number.
584*22ce4affSfengbojiang   ///
585*22ce4affSfengbojiang   UINT16                          RemotePort;
586*22ce4affSfengbojiang   ///
587*22ce4affSfengbojiang   /// The network protocol(i.e. UDP, TCP).
588*22ce4affSfengbojiang   ///
589*22ce4affSfengbojiang   UINT16                          Protocol;
590*22ce4affSfengbojiang   ///
591*22ce4affSfengbojiang   /// 0x00 - The Source IP Address was assigned though DHCP.
592*22ce4affSfengbojiang   /// 0x01 - The Source IP Address is statically bound.
593*22ce4affSfengbojiang   ///
594*22ce4affSfengbojiang   BOOLEAN                         StaticIpAddress;
595*22ce4affSfengbojiang   ///
596*22ce4affSfengbojiang   /// The gateway IP address
597*22ce4affSfengbojiang   ///
598*22ce4affSfengbojiang   EFI_IPv4_ADDRESS                GatewayIpAddress;
599*22ce4affSfengbojiang   ///
600*22ce4affSfengbojiang   /// The subnet mask
601*22ce4affSfengbojiang   ///
602*22ce4affSfengbojiang   EFI_IPv4_ADDRESS                SubnetMask;
603*22ce4affSfengbojiang } IPv4_DEVICE_PATH;
604*22ce4affSfengbojiang 
605*22ce4affSfengbojiang ///
606*22ce4affSfengbojiang /// IPv6 Device Path SubType.
607*22ce4affSfengbojiang ///
608*22ce4affSfengbojiang #define MSG_IPv6_DP               0x0d
609*22ce4affSfengbojiang typedef struct {
610*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
611*22ce4affSfengbojiang   ///
612*22ce4affSfengbojiang   /// The local IPv6 address.
613*22ce4affSfengbojiang   ///
614*22ce4affSfengbojiang   EFI_IPv6_ADDRESS                LocalIpAddress;
615*22ce4affSfengbojiang   ///
616*22ce4affSfengbojiang   /// The remote IPv6 address.
617*22ce4affSfengbojiang   ///
618*22ce4affSfengbojiang   EFI_IPv6_ADDRESS                RemoteIpAddress;
619*22ce4affSfengbojiang   ///
620*22ce4affSfengbojiang   /// The local port number.
621*22ce4affSfengbojiang   ///
622*22ce4affSfengbojiang   UINT16                          LocalPort;
623*22ce4affSfengbojiang   ///
624*22ce4affSfengbojiang   /// The remote port number.
625*22ce4affSfengbojiang   ///
626*22ce4affSfengbojiang   UINT16                          RemotePort;
627*22ce4affSfengbojiang   ///
628*22ce4affSfengbojiang   /// The network protocol(i.e. UDP, TCP).
629*22ce4affSfengbojiang   ///
630*22ce4affSfengbojiang   UINT16                          Protocol;
631*22ce4affSfengbojiang   ///
632*22ce4affSfengbojiang   /// 0x00 - The Local IP Address was manually configured.
633*22ce4affSfengbojiang   /// 0x01 - The Local IP Address is assigned through IPv6
634*22ce4affSfengbojiang   /// stateless auto-configuration.
635*22ce4affSfengbojiang   /// 0x02 - The Local IP Address is assigned through IPv6
636*22ce4affSfengbojiang   /// stateful configuration.
637*22ce4affSfengbojiang   ///
638*22ce4affSfengbojiang   UINT8                           IpAddressOrigin;
639*22ce4affSfengbojiang   ///
640*22ce4affSfengbojiang   /// The prefix length
641*22ce4affSfengbojiang   ///
642*22ce4affSfengbojiang   UINT8                           PrefixLength;
643*22ce4affSfengbojiang   ///
644*22ce4affSfengbojiang   /// The gateway IP address
645*22ce4affSfengbojiang   ///
646*22ce4affSfengbojiang   EFI_IPv6_ADDRESS                GatewayIpAddress;
647*22ce4affSfengbojiang } IPv6_DEVICE_PATH;
648*22ce4affSfengbojiang 
649*22ce4affSfengbojiang ///
650*22ce4affSfengbojiang /// InfiniBand Device Path SubType.
651*22ce4affSfengbojiang ///
652*22ce4affSfengbojiang #define MSG_INFINIBAND_DP         0x09
653*22ce4affSfengbojiang typedef struct {
654*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
655*22ce4affSfengbojiang   ///
656*22ce4affSfengbojiang   /// Flags to help identify/manage InfiniBand device path elements:
657*22ce4affSfengbojiang   /// Bit 0 - IOC/Service (0b = IOC, 1b = Service).
658*22ce4affSfengbojiang   /// Bit 1 - Extend Boot Environment.
659*22ce4affSfengbojiang   /// Bit 2 - Console Protocol.
660*22ce4affSfengbojiang   /// Bit 3 - Storage Protocol.
661*22ce4affSfengbojiang   /// Bit 4 - Network Protocol.
662*22ce4affSfengbojiang   /// All other bits are reserved.
663*22ce4affSfengbojiang   ///
664*22ce4affSfengbojiang   UINT32                          ResourceFlags;
665*22ce4affSfengbojiang   ///
666*22ce4affSfengbojiang   /// 128-bit Global Identifier for remote fabric port.
667*22ce4affSfengbojiang   ///
668*22ce4affSfengbojiang   UINT8                           PortGid[16];
669*22ce4affSfengbojiang   ///
670*22ce4affSfengbojiang   /// 64-bit unique identifier to remote IOC or server process.
671*22ce4affSfengbojiang   /// Interpretation of field specified by Resource Flags (bit 0).
672*22ce4affSfengbojiang   ///
673*22ce4affSfengbojiang   UINT64                          ServiceId;
674*22ce4affSfengbojiang   ///
675*22ce4affSfengbojiang   /// 64-bit persistent ID of remote IOC port.
676*22ce4affSfengbojiang   ///
677*22ce4affSfengbojiang   UINT64                          TargetPortId;
678*22ce4affSfengbojiang   ///
679*22ce4affSfengbojiang   /// 64-bit persistent ID of remote device.
680*22ce4affSfengbojiang   ///
681*22ce4affSfengbojiang   UINT64                          DeviceId;
682*22ce4affSfengbojiang } INFINIBAND_DEVICE_PATH;
683*22ce4affSfengbojiang 
684*22ce4affSfengbojiang #define INFINIBAND_RESOURCE_FLAG_IOC_SERVICE                0x01
685*22ce4affSfengbojiang #define INFINIBAND_RESOURCE_FLAG_EXTENDED_BOOT_ENVIRONMENT  0x02
686*22ce4affSfengbojiang #define INFINIBAND_RESOURCE_FLAG_CONSOLE_PROTOCOL           0x04
687*22ce4affSfengbojiang #define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL           0x08
688*22ce4affSfengbojiang #define INFINIBAND_RESOURCE_FLAG_NETWORK_PROTOCOL           0x10
689*22ce4affSfengbojiang 
690*22ce4affSfengbojiang ///
691*22ce4affSfengbojiang /// UART Device Path SubType.
692*22ce4affSfengbojiang ///
693*22ce4affSfengbojiang #define MSG_UART_DP               0x0e
694*22ce4affSfengbojiang typedef struct {
695*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
696*22ce4affSfengbojiang   ///
697*22ce4affSfengbojiang   /// Reserved.
698*22ce4affSfengbojiang   ///
699*22ce4affSfengbojiang   UINT32                          Reserved;
700*22ce4affSfengbojiang   ///
701*22ce4affSfengbojiang   /// The baud rate setting for the UART style device. A value of 0
702*22ce4affSfengbojiang   /// means that the device's default baud rate will be used.
703*22ce4affSfengbojiang   ///
704*22ce4affSfengbojiang   UINT64                          BaudRate;
705*22ce4affSfengbojiang   ///
706*22ce4affSfengbojiang   /// The number of data bits for the UART style device. A value
707*22ce4affSfengbojiang   /// of 0 means that the device's default number of data bits will be used.
708*22ce4affSfengbojiang   ///
709*22ce4affSfengbojiang   UINT8                           DataBits;
710*22ce4affSfengbojiang   ///
711*22ce4affSfengbojiang   /// The parity setting for the UART style device.
712*22ce4affSfengbojiang   /// Parity 0x00 - Default Parity.
713*22ce4affSfengbojiang   /// Parity 0x01 - No Parity.
714*22ce4affSfengbojiang   /// Parity 0x02 - Even Parity.
715*22ce4affSfengbojiang   /// Parity 0x03 - Odd Parity.
716*22ce4affSfengbojiang   /// Parity 0x04 - Mark Parity.
717*22ce4affSfengbojiang   /// Parity 0x05 - Space Parity.
718*22ce4affSfengbojiang   ///
719*22ce4affSfengbojiang   UINT8                           Parity;
720*22ce4affSfengbojiang   ///
721*22ce4affSfengbojiang   /// The number of stop bits for the UART style device.
722*22ce4affSfengbojiang   /// Stop Bits 0x00 - Default Stop Bits.
723*22ce4affSfengbojiang   /// Stop Bits 0x01 - 1 Stop Bit.
724*22ce4affSfengbojiang   /// Stop Bits 0x02 - 1.5 Stop Bits.
725*22ce4affSfengbojiang   /// Stop Bits 0x03 - 2 Stop Bits.
726*22ce4affSfengbojiang   ///
727*22ce4affSfengbojiang   UINT8                           StopBits;
728*22ce4affSfengbojiang } UART_DEVICE_PATH;
729*22ce4affSfengbojiang 
730*22ce4affSfengbojiang ///
731*22ce4affSfengbojiang /// NVDIMM Namespace Device Path SubType.
732*22ce4affSfengbojiang ///
733*22ce4affSfengbojiang #define NVDIMM_NAMESPACE_DP               0x20
734*22ce4affSfengbojiang typedef struct {
735*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
736*22ce4affSfengbojiang   ///
737*22ce4affSfengbojiang   /// Namespace unique label identifier UUID.
738*22ce4affSfengbojiang   ///
739*22ce4affSfengbojiang   EFI_GUID Uuid;
740*22ce4affSfengbojiang } NVDIMM_NAMESPACE_DEVICE_PATH;
741*22ce4affSfengbojiang 
742*22ce4affSfengbojiang //
743*22ce4affSfengbojiang // Use VENDOR_DEVICE_PATH struct
744*22ce4affSfengbojiang //
745*22ce4affSfengbojiang #define MSG_VENDOR_DP             0x0a
746*22ce4affSfengbojiang typedef VENDOR_DEVICE_PATH        VENDOR_DEFINED_DEVICE_PATH;
747*22ce4affSfengbojiang 
748*22ce4affSfengbojiang #define DEVICE_PATH_MESSAGING_PC_ANSI     EFI_PC_ANSI_GUID
749*22ce4affSfengbojiang #define DEVICE_PATH_MESSAGING_VT_100      EFI_VT_100_GUID
750*22ce4affSfengbojiang #define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID
751*22ce4affSfengbojiang #define DEVICE_PATH_MESSAGING_VT_UTF8     EFI_VT_UTF8_GUID
752*22ce4affSfengbojiang 
753*22ce4affSfengbojiang ///
754*22ce4affSfengbojiang /// A new device path node is defined to declare flow control characteristics.
755*22ce4affSfengbojiang /// UART Flow Control Messaging Device Path
756*22ce4affSfengbojiang ///
757*22ce4affSfengbojiang typedef struct {
758*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
759*22ce4affSfengbojiang   ///
760*22ce4affSfengbojiang   /// DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL GUID.
761*22ce4affSfengbojiang   ///
762*22ce4affSfengbojiang   EFI_GUID                        Guid;
763*22ce4affSfengbojiang   ///
764*22ce4affSfengbojiang   /// Bitmap of supported flow control types.
765*22ce4affSfengbojiang   /// Bit 0 set indicates hardware flow control.
766*22ce4affSfengbojiang   /// Bit 1 set indicates Xon/Xoff flow control.
767*22ce4affSfengbojiang   /// All other bits are reserved and are clear.
768*22ce4affSfengbojiang   ///
769*22ce4affSfengbojiang   UINT32                          FlowControlMap;
770*22ce4affSfengbojiang } UART_FLOW_CONTROL_DEVICE_PATH;
771*22ce4affSfengbojiang 
772*22ce4affSfengbojiang #define UART_FLOW_CONTROL_HARDWARE         0x00000001
773*22ce4affSfengbojiang #define UART_FLOW_CONTROL_XON_XOFF         0x00000010
774*22ce4affSfengbojiang 
775*22ce4affSfengbojiang #define DEVICE_PATH_MESSAGING_SAS          EFI_SAS_DEVICE_PATH_GUID
776*22ce4affSfengbojiang ///
777*22ce4affSfengbojiang /// Serial Attached SCSI (SAS) Device Path.
778*22ce4affSfengbojiang ///
779*22ce4affSfengbojiang typedef struct {
780*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
781*22ce4affSfengbojiang   ///
782*22ce4affSfengbojiang   /// DEVICE_PATH_MESSAGING_SAS GUID.
783*22ce4affSfengbojiang   ///
784*22ce4affSfengbojiang   EFI_GUID                        Guid;
785*22ce4affSfengbojiang   ///
786*22ce4affSfengbojiang   /// Reserved for future use.
787*22ce4affSfengbojiang   ///
788*22ce4affSfengbojiang   UINT32                          Reserved;
789*22ce4affSfengbojiang   ///
790*22ce4affSfengbojiang   /// SAS Address for Serial Attached SCSI Target.
791*22ce4affSfengbojiang   ///
792*22ce4affSfengbojiang   UINT64                          SasAddress;
793*22ce4affSfengbojiang   ///
794*22ce4affSfengbojiang   /// SAS Logical Unit Number.
795*22ce4affSfengbojiang   ///
796*22ce4affSfengbojiang   UINT64                          Lun;
797*22ce4affSfengbojiang   ///
798*22ce4affSfengbojiang   /// More Information about the device and its interconnect.
799*22ce4affSfengbojiang   ///
800*22ce4affSfengbojiang   UINT16                          DeviceTopology;
801*22ce4affSfengbojiang   ///
802*22ce4affSfengbojiang   /// Relative Target Port (RTP).
803*22ce4affSfengbojiang   ///
804*22ce4affSfengbojiang   UINT16                          RelativeTargetPort;
805*22ce4affSfengbojiang } SAS_DEVICE_PATH;
806*22ce4affSfengbojiang 
807*22ce4affSfengbojiang ///
808*22ce4affSfengbojiang /// Serial Attached SCSI (SAS) Ex Device Path SubType
809*22ce4affSfengbojiang ///
810*22ce4affSfengbojiang #define MSG_SASEX_DP              0x16
811*22ce4affSfengbojiang typedef struct {
812*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
813*22ce4affSfengbojiang   ///
814*22ce4affSfengbojiang   /// 8-byte array of the SAS Address for Serial Attached SCSI Target Port.
815*22ce4affSfengbojiang   ///
816*22ce4affSfengbojiang   UINT8                           SasAddress[8];
817*22ce4affSfengbojiang   ///
818*22ce4affSfengbojiang   /// 8-byte array of the SAS Logical Unit Number.
819*22ce4affSfengbojiang   ///
820*22ce4affSfengbojiang   UINT8                           Lun[8];
821*22ce4affSfengbojiang   ///
822*22ce4affSfengbojiang   /// More Information about the device and its interconnect.
823*22ce4affSfengbojiang   ///
824*22ce4affSfengbojiang   UINT16                          DeviceTopology;
825*22ce4affSfengbojiang   ///
826*22ce4affSfengbojiang   /// Relative Target Port (RTP).
827*22ce4affSfengbojiang   ///
828*22ce4affSfengbojiang   UINT16                          RelativeTargetPort;
829*22ce4affSfengbojiang } SASEX_DEVICE_PATH;
830*22ce4affSfengbojiang 
831*22ce4affSfengbojiang ///
832*22ce4affSfengbojiang /// NvmExpress Namespace Device Path SubType.
833*22ce4affSfengbojiang ///
834*22ce4affSfengbojiang #define MSG_NVME_NAMESPACE_DP     0x17
835*22ce4affSfengbojiang typedef struct {
836*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
837*22ce4affSfengbojiang   UINT32                          NamespaceId;
838*22ce4affSfengbojiang   UINT64                          NamespaceUuid;
839*22ce4affSfengbojiang } NVME_NAMESPACE_DEVICE_PATH;
840*22ce4affSfengbojiang 
841*22ce4affSfengbojiang ///
842*22ce4affSfengbojiang /// DNS Device Path SubType
843*22ce4affSfengbojiang ///
844*22ce4affSfengbojiang #define MSG_DNS_DP                0x1F
845*22ce4affSfengbojiang typedef struct {
846*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
847*22ce4affSfengbojiang   ///
848*22ce4affSfengbojiang   /// Indicates the DNS server address is IPv4 or IPv6 address.
849*22ce4affSfengbojiang   ///
850*22ce4affSfengbojiang   UINT8                           IsIPv6;
851*22ce4affSfengbojiang   ///
852*22ce4affSfengbojiang   /// Instance of the DNS server address.
853*22ce4affSfengbojiang   ///
854*22ce4affSfengbojiang   EFI_IP_ADDRESS                  DnsServerIp[];
855*22ce4affSfengbojiang } DNS_DEVICE_PATH;
856*22ce4affSfengbojiang 
857*22ce4affSfengbojiang ///
858*22ce4affSfengbojiang /// Uniform Resource Identifiers (URI) Device Path SubType
859*22ce4affSfengbojiang ///
860*22ce4affSfengbojiang #define MSG_URI_DP                0x18
861*22ce4affSfengbojiang typedef struct {
862*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
863*22ce4affSfengbojiang   ///
864*22ce4affSfengbojiang   /// Instance of the URI pursuant to RFC 3986.
865*22ce4affSfengbojiang   ///
866*22ce4affSfengbojiang   CHAR8                           Uri[];
867*22ce4affSfengbojiang } URI_DEVICE_PATH;
868*22ce4affSfengbojiang 
869*22ce4affSfengbojiang ///
870*22ce4affSfengbojiang /// Universal Flash Storage (UFS) Device Path SubType.
871*22ce4affSfengbojiang ///
872*22ce4affSfengbojiang #define MSG_UFS_DP                0x19
873*22ce4affSfengbojiang typedef struct {
874*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
875*22ce4affSfengbojiang   ///
876*22ce4affSfengbojiang   /// Target ID on the UFS bus (PUN).
877*22ce4affSfengbojiang   ///
878*22ce4affSfengbojiang   UINT8                           Pun;
879*22ce4affSfengbojiang   ///
880*22ce4affSfengbojiang   /// Logical Unit Number (LUN).
881*22ce4affSfengbojiang   ///
882*22ce4affSfengbojiang   UINT8                           Lun;
883*22ce4affSfengbojiang } UFS_DEVICE_PATH;
884*22ce4affSfengbojiang 
885*22ce4affSfengbojiang ///
886*22ce4affSfengbojiang /// SD (Secure Digital) Device Path SubType.
887*22ce4affSfengbojiang ///
888*22ce4affSfengbojiang #define MSG_SD_DP                 0x1A
889*22ce4affSfengbojiang typedef struct {
890*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
891*22ce4affSfengbojiang   UINT8                           SlotNumber;
892*22ce4affSfengbojiang } SD_DEVICE_PATH;
893*22ce4affSfengbojiang 
894*22ce4affSfengbojiang ///
895*22ce4affSfengbojiang /// EMMC (Embedded MMC) Device Path SubType.
896*22ce4affSfengbojiang ///
897*22ce4affSfengbojiang #define MSG_EMMC_DP                 0x1D
898*22ce4affSfengbojiang typedef struct {
899*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
900*22ce4affSfengbojiang   UINT8                           SlotNumber;
901*22ce4affSfengbojiang } EMMC_DEVICE_PATH;
902*22ce4affSfengbojiang 
903*22ce4affSfengbojiang ///
904*22ce4affSfengbojiang /// iSCSI Device Path SubType
905*22ce4affSfengbojiang ///
906*22ce4affSfengbojiang #define MSG_ISCSI_DP              0x13
907*22ce4affSfengbojiang typedef struct {
908*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
909*22ce4affSfengbojiang   ///
910*22ce4affSfengbojiang   /// Network Protocol (0 = TCP, 1+ = reserved).
911*22ce4affSfengbojiang   ///
912*22ce4affSfengbojiang   UINT16                          NetworkProtocol;
913*22ce4affSfengbojiang   ///
914*22ce4affSfengbojiang   /// iSCSI Login Options.
915*22ce4affSfengbojiang   ///
916*22ce4affSfengbojiang   UINT16                          LoginOption;
917*22ce4affSfengbojiang   ///
918*22ce4affSfengbojiang   /// iSCSI Logical Unit Number.
919*22ce4affSfengbojiang   ///
920*22ce4affSfengbojiang   UINT64                          Lun;
921*22ce4affSfengbojiang   ///
922*22ce4affSfengbojiang   /// iSCSI Target Portal group tag the initiator intends
923*22ce4affSfengbojiang   /// to establish a session with.
924*22ce4affSfengbojiang   ///
925*22ce4affSfengbojiang   UINT16                          TargetPortalGroupTag;
926*22ce4affSfengbojiang   ///
927*22ce4affSfengbojiang   /// iSCSI NodeTarget Name. The length of the name
928*22ce4affSfengbojiang   /// is determined by subtracting the offset of this field from Length.
929*22ce4affSfengbojiang   ///
930*22ce4affSfengbojiang   /// CHAR8                        iSCSI Target Name.
931*22ce4affSfengbojiang } ISCSI_DEVICE_PATH;
932*22ce4affSfengbojiang 
933*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_NO_HEADER_DIGEST             0x0000
934*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_HEADER_DIGEST_USING_CRC32C   0x0002
935*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_NO_DATA_DIGEST               0x0000
936*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_DATA_DIGEST_USING_CRC32C     0x0008
937*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_AUTHMETHOD_CHAP              0x0000
938*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON               0x1000
939*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_CHAP_BI                      0x0000
940*22ce4affSfengbojiang #define ISCSI_LOGIN_OPTION_CHAP_UNI                     0x2000
941*22ce4affSfengbojiang 
942*22ce4affSfengbojiang ///
943*22ce4affSfengbojiang /// VLAN Device Path SubType.
944*22ce4affSfengbojiang ///
945*22ce4affSfengbojiang #define MSG_VLAN_DP               0x14
946*22ce4affSfengbojiang typedef struct {
947*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
948*22ce4affSfengbojiang   ///
949*22ce4affSfengbojiang   /// VLAN identifier (0-4094).
950*22ce4affSfengbojiang   ///
951*22ce4affSfengbojiang   UINT16                          VlanId;
952*22ce4affSfengbojiang } VLAN_DEVICE_PATH;
953*22ce4affSfengbojiang 
954*22ce4affSfengbojiang ///
955*22ce4affSfengbojiang /// Bluetooth Device Path SubType.
956*22ce4affSfengbojiang ///
957*22ce4affSfengbojiang #define MSG_BLUETOOTH_DP     0x1b
958*22ce4affSfengbojiang typedef struct {
959*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
960*22ce4affSfengbojiang   ///
961*22ce4affSfengbojiang   /// 48bit Bluetooth device address.
962*22ce4affSfengbojiang   ///
963*22ce4affSfengbojiang   BLUETOOTH_ADDRESS               BD_ADDR;
964*22ce4affSfengbojiang } BLUETOOTH_DEVICE_PATH;
965*22ce4affSfengbojiang 
966*22ce4affSfengbojiang ///
967*22ce4affSfengbojiang /// Wi-Fi Device Path SubType.
968*22ce4affSfengbojiang ///
969*22ce4affSfengbojiang #define MSG_WIFI_DP               0x1C
970*22ce4affSfengbojiang typedef struct {
971*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
972*22ce4affSfengbojiang   ///
973*22ce4affSfengbojiang   /// Service set identifier. A 32-byte octets string.
974*22ce4affSfengbojiang   ///
975*22ce4affSfengbojiang   UINT8                           SSId[32];
976*22ce4affSfengbojiang } WIFI_DEVICE_PATH;
977*22ce4affSfengbojiang 
978*22ce4affSfengbojiang ///
979*22ce4affSfengbojiang /// Bluetooth LE Device Path SubType.
980*22ce4affSfengbojiang ///
981*22ce4affSfengbojiang #define MSG_BLUETOOTH_LE_DP       0x1E
982*22ce4affSfengbojiang typedef struct {
983*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
984*22ce4affSfengbojiang   BLUETOOTH_LE_ADDRESS            Address;
985*22ce4affSfengbojiang } BLUETOOTH_LE_DEVICE_PATH;
986*22ce4affSfengbojiang 
987*22ce4affSfengbojiang //
988*22ce4affSfengbojiang // Media Device Path
989*22ce4affSfengbojiang //
990*22ce4affSfengbojiang #define MEDIA_DEVICE_PATH         0x04
991*22ce4affSfengbojiang 
992*22ce4affSfengbojiang ///
993*22ce4affSfengbojiang /// Hard Drive Media Device Path SubType.
994*22ce4affSfengbojiang ///
995*22ce4affSfengbojiang #define MEDIA_HARDDRIVE_DP        0x01
996*22ce4affSfengbojiang 
997*22ce4affSfengbojiang ///
998*22ce4affSfengbojiang /// The Hard Drive Media Device Path is used to represent a partition on a hard drive.
999*22ce4affSfengbojiang ///
1000*22ce4affSfengbojiang typedef struct {
1001*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1002*22ce4affSfengbojiang   ///
1003*22ce4affSfengbojiang   /// Describes the entry in a partition table, starting with entry 1.
1004*22ce4affSfengbojiang   /// Partition number zero represents the entire device. Valid
1005*22ce4affSfengbojiang   /// partition numbers for a MBR partition are [1, 4]. Valid
1006*22ce4affSfengbojiang   /// partition numbers for a GPT partition are [1, NumberOfPartitionEntries].
1007*22ce4affSfengbojiang   ///
1008*22ce4affSfengbojiang   UINT32                          PartitionNumber;
1009*22ce4affSfengbojiang   ///
1010*22ce4affSfengbojiang   /// Starting LBA of the partition on the hard drive.
1011*22ce4affSfengbojiang   ///
1012*22ce4affSfengbojiang   UINT64                          PartitionStart;
1013*22ce4affSfengbojiang   ///
1014*22ce4affSfengbojiang   /// Size of the partition in units of Logical Blocks.
1015*22ce4affSfengbojiang   ///
1016*22ce4affSfengbojiang   UINT64                          PartitionSize;
1017*22ce4affSfengbojiang   ///
1018*22ce4affSfengbojiang   /// Signature unique to this partition:
1019*22ce4affSfengbojiang   /// If SignatureType is 0, this field has to be initialized with 16 zeros.
1020*22ce4affSfengbojiang   /// If SignatureType is 1, the MBR signature is stored in the first 4 bytes of this field.
1021*22ce4affSfengbojiang   /// The other 12 bytes are initialized with zeros.
1022*22ce4affSfengbojiang   /// If SignatureType is 2, this field contains a 16 byte signature.
1023*22ce4affSfengbojiang   ///
1024*22ce4affSfengbojiang   UINT8                           Signature[16];
1025*22ce4affSfengbojiang   ///
1026*22ce4affSfengbojiang   /// Partition Format: (Unused values reserved).
1027*22ce4affSfengbojiang   /// 0x01 - PC-AT compatible legacy MBR.
1028*22ce4affSfengbojiang   /// 0x02 - GUID Partition Table.
1029*22ce4affSfengbojiang   ///
1030*22ce4affSfengbojiang   UINT8                           MBRType;
1031*22ce4affSfengbojiang   ///
1032*22ce4affSfengbojiang   /// Type of Disk Signature: (Unused values reserved).
1033*22ce4affSfengbojiang   /// 0x00 - No Disk Signature.
1034*22ce4affSfengbojiang   /// 0x01 - 32-bit signature from address 0x1b8 of the type 0x01 MBR.
1035*22ce4affSfengbojiang   /// 0x02 - GUID signature.
1036*22ce4affSfengbojiang   ///
1037*22ce4affSfengbojiang   UINT8                           SignatureType;
1038*22ce4affSfengbojiang } HARDDRIVE_DEVICE_PATH;
1039*22ce4affSfengbojiang 
1040*22ce4affSfengbojiang #define MBR_TYPE_PCAT             0x01
1041*22ce4affSfengbojiang #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
1042*22ce4affSfengbojiang 
1043*22ce4affSfengbojiang #define NO_DISK_SIGNATURE         0x00
1044*22ce4affSfengbojiang #define SIGNATURE_TYPE_MBR        0x01
1045*22ce4affSfengbojiang #define SIGNATURE_TYPE_GUID       0x02
1046*22ce4affSfengbojiang 
1047*22ce4affSfengbojiang ///
1048*22ce4affSfengbojiang /// CD-ROM Media Device Path SubType.
1049*22ce4affSfengbojiang ///
1050*22ce4affSfengbojiang #define MEDIA_CDROM_DP            0x02
1051*22ce4affSfengbojiang 
1052*22ce4affSfengbojiang ///
1053*22ce4affSfengbojiang /// The CD-ROM Media Device Path is used to define a system partition that exists on a CD-ROM.
1054*22ce4affSfengbojiang ///
1055*22ce4affSfengbojiang typedef struct {
1056*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1057*22ce4affSfengbojiang   ///
1058*22ce4affSfengbojiang   /// Boot Entry number from the Boot Catalog. The Initial/Default entry is defined as zero.
1059*22ce4affSfengbojiang   ///
1060*22ce4affSfengbojiang   UINT32                          BootEntry;
1061*22ce4affSfengbojiang   ///
1062*22ce4affSfengbojiang   /// Starting RBA of the partition on the medium. CD-ROMs use Relative logical Block Addressing.
1063*22ce4affSfengbojiang   ///
1064*22ce4affSfengbojiang   UINT64                          PartitionStart;
1065*22ce4affSfengbojiang   ///
1066*22ce4affSfengbojiang   /// Size of the partition in units of Blocks, also called Sectors.
1067*22ce4affSfengbojiang   ///
1068*22ce4affSfengbojiang   UINT64                          PartitionSize;
1069*22ce4affSfengbojiang } CDROM_DEVICE_PATH;
1070*22ce4affSfengbojiang 
1071*22ce4affSfengbojiang //
1072*22ce4affSfengbojiang // Use VENDOR_DEVICE_PATH struct
1073*22ce4affSfengbojiang //
1074*22ce4affSfengbojiang #define MEDIA_VENDOR_DP           0x03  ///< Media vendor device path subtype.
1075*22ce4affSfengbojiang 
1076*22ce4affSfengbojiang ///
1077*22ce4affSfengbojiang /// File Path Media Device Path SubType
1078*22ce4affSfengbojiang ///
1079*22ce4affSfengbojiang #define MEDIA_FILEPATH_DP         0x04
1080*22ce4affSfengbojiang typedef struct {
1081*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1082*22ce4affSfengbojiang   ///
1083*22ce4affSfengbojiang   /// A NULL-terminated Path string including directory and file names.
1084*22ce4affSfengbojiang   ///
1085*22ce4affSfengbojiang   CHAR16                          PathName[1];
1086*22ce4affSfengbojiang } FILEPATH_DEVICE_PATH;
1087*22ce4affSfengbojiang 
1088*22ce4affSfengbojiang #define SIZE_OF_FILEPATH_DEVICE_PATH  OFFSET_OF(FILEPATH_DEVICE_PATH,PathName)
1089*22ce4affSfengbojiang 
1090*22ce4affSfengbojiang ///
1091*22ce4affSfengbojiang /// Media Protocol Device Path SubType.
1092*22ce4affSfengbojiang ///
1093*22ce4affSfengbojiang #define MEDIA_PROTOCOL_DP         0x05
1094*22ce4affSfengbojiang 
1095*22ce4affSfengbojiang ///
1096*22ce4affSfengbojiang /// The Media Protocol Device Path is used to denote the protocol that is being
1097*22ce4affSfengbojiang /// used in a device path at the location of the path specified.
1098*22ce4affSfengbojiang /// Many protocols are inherent to the style of device path.
1099*22ce4affSfengbojiang ///
1100*22ce4affSfengbojiang typedef struct {
1101*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1102*22ce4affSfengbojiang   ///
1103*22ce4affSfengbojiang   /// The ID of the protocol.
1104*22ce4affSfengbojiang   ///
1105*22ce4affSfengbojiang   EFI_GUID                        Protocol;
1106*22ce4affSfengbojiang } MEDIA_PROTOCOL_DEVICE_PATH;
1107*22ce4affSfengbojiang 
1108*22ce4affSfengbojiang ///
1109*22ce4affSfengbojiang /// PIWG Firmware File SubType.
1110*22ce4affSfengbojiang ///
1111*22ce4affSfengbojiang #define MEDIA_PIWG_FW_FILE_DP     0x06
1112*22ce4affSfengbojiang 
1113*22ce4affSfengbojiang ///
1114*22ce4affSfengbojiang /// This device path is used by systems implementing the UEFI PI Specification 1.0 to describe a firmware file.
1115*22ce4affSfengbojiang ///
1116*22ce4affSfengbojiang typedef struct {
1117*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1118*22ce4affSfengbojiang   ///
1119*22ce4affSfengbojiang   /// Firmware file name
1120*22ce4affSfengbojiang   ///
1121*22ce4affSfengbojiang   EFI_GUID                        FvFileName;
1122*22ce4affSfengbojiang } MEDIA_FW_VOL_FILEPATH_DEVICE_PATH;
1123*22ce4affSfengbojiang 
1124*22ce4affSfengbojiang ///
1125*22ce4affSfengbojiang /// PIWG Firmware Volume Device Path SubType.
1126*22ce4affSfengbojiang ///
1127*22ce4affSfengbojiang #define MEDIA_PIWG_FW_VOL_DP      0x07
1128*22ce4affSfengbojiang 
1129*22ce4affSfengbojiang ///
1130*22ce4affSfengbojiang /// This device path is used by systems implementing the UEFI PI Specification 1.0 to describe a firmware volume.
1131*22ce4affSfengbojiang ///
1132*22ce4affSfengbojiang typedef struct {
1133*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1134*22ce4affSfengbojiang   ///
1135*22ce4affSfengbojiang   /// Firmware volume name.
1136*22ce4affSfengbojiang   ///
1137*22ce4affSfengbojiang   EFI_GUID                        FvName;
1138*22ce4affSfengbojiang } MEDIA_FW_VOL_DEVICE_PATH;
1139*22ce4affSfengbojiang 
1140*22ce4affSfengbojiang ///
1141*22ce4affSfengbojiang /// Media relative offset range device path.
1142*22ce4affSfengbojiang ///
1143*22ce4affSfengbojiang #define MEDIA_RELATIVE_OFFSET_RANGE_DP 0x08
1144*22ce4affSfengbojiang 
1145*22ce4affSfengbojiang ///
1146*22ce4affSfengbojiang /// Used to describe the offset range of media relative.
1147*22ce4affSfengbojiang ///
1148*22ce4affSfengbojiang typedef struct {
1149*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL  Header;
1150*22ce4affSfengbojiang   UINT32                    Reserved;
1151*22ce4affSfengbojiang   UINT64                    StartingOffset;
1152*22ce4affSfengbojiang   UINT64                    EndingOffset;
1153*22ce4affSfengbojiang } MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH;
1154*22ce4affSfengbojiang 
1155*22ce4affSfengbojiang ///
1156*22ce4affSfengbojiang /// This GUID defines a RAM Disk supporting a raw disk format in volatile memory.
1157*22ce4affSfengbojiang ///
1158*22ce4affSfengbojiang #define EFI_VIRTUAL_DISK_GUID               EFI_ACPI_6_0_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_VOLATILE
1159*22ce4affSfengbojiang 
1160*22ce4affSfengbojiang extern  EFI_GUID                            gEfiVirtualDiskGuid;
1161*22ce4affSfengbojiang 
1162*22ce4affSfengbojiang ///
1163*22ce4affSfengbojiang /// This GUID defines a RAM Disk supporting an ISO image in volatile memory.
1164*22ce4affSfengbojiang ///
1165*22ce4affSfengbojiang #define EFI_VIRTUAL_CD_GUID                 EFI_ACPI_6_0_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_VOLATILE
1166*22ce4affSfengbojiang 
1167*22ce4affSfengbojiang extern  EFI_GUID                            gEfiVirtualCdGuid;
1168*22ce4affSfengbojiang 
1169*22ce4affSfengbojiang ///
1170*22ce4affSfengbojiang /// This GUID defines a RAM Disk supporting a raw disk format in persistent memory.
1171*22ce4affSfengbojiang ///
1172*22ce4affSfengbojiang #define EFI_PERSISTENT_VIRTUAL_DISK_GUID    EFI_ACPI_6_0_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_PERSISTENT
1173*22ce4affSfengbojiang 
1174*22ce4affSfengbojiang extern  EFI_GUID                            gEfiPersistentVirtualDiskGuid;
1175*22ce4affSfengbojiang 
1176*22ce4affSfengbojiang ///
1177*22ce4affSfengbojiang /// This GUID defines a RAM Disk supporting an ISO image in persistent memory.
1178*22ce4affSfengbojiang ///
1179*22ce4affSfengbojiang #define EFI_PERSISTENT_VIRTUAL_CD_GUID      EFI_ACPI_6_0_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_PERSISTENT
1180*22ce4affSfengbojiang 
1181*22ce4affSfengbojiang extern  EFI_GUID                            gEfiPersistentVirtualCdGuid;
1182*22ce4affSfengbojiang 
1183*22ce4affSfengbojiang ///
1184*22ce4affSfengbojiang /// Media ram disk device path.
1185*22ce4affSfengbojiang ///
1186*22ce4affSfengbojiang #define MEDIA_RAM_DISK_DP         0x09
1187*22ce4affSfengbojiang 
1188*22ce4affSfengbojiang ///
1189*22ce4affSfengbojiang /// Used to describe the ram disk device path.
1190*22ce4affSfengbojiang ///
1191*22ce4affSfengbojiang typedef struct {
1192*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1193*22ce4affSfengbojiang   ///
1194*22ce4affSfengbojiang   /// Starting Memory Address.
1195*22ce4affSfengbojiang   ///
1196*22ce4affSfengbojiang   UINT32                          StartingAddr[2];
1197*22ce4affSfengbojiang   ///
1198*22ce4affSfengbojiang   /// Ending Memory Address.
1199*22ce4affSfengbojiang   ///
1200*22ce4affSfengbojiang   UINT32                          EndingAddr[2];
1201*22ce4affSfengbojiang   ///
1202*22ce4affSfengbojiang   /// GUID that defines the type of the RAM Disk.
1203*22ce4affSfengbojiang   ///
1204*22ce4affSfengbojiang   EFI_GUID                        TypeGuid;
1205*22ce4affSfengbojiang   ///
1206*22ce4affSfengbojiang   /// RAM Diskinstance number, if supported. The default value is zero.
1207*22ce4affSfengbojiang   ///
1208*22ce4affSfengbojiang   UINT16                          Instance;
1209*22ce4affSfengbojiang } MEDIA_RAM_DISK_DEVICE_PATH;
1210*22ce4affSfengbojiang 
1211*22ce4affSfengbojiang ///
1212*22ce4affSfengbojiang /// BIOS Boot Specification Device Path.
1213*22ce4affSfengbojiang ///
1214*22ce4affSfengbojiang #define BBS_DEVICE_PATH           0x05
1215*22ce4affSfengbojiang 
1216*22ce4affSfengbojiang ///
1217*22ce4affSfengbojiang /// BIOS Boot Specification Device Path SubType.
1218*22ce4affSfengbojiang ///
1219*22ce4affSfengbojiang #define BBS_BBS_DP                0x01
1220*22ce4affSfengbojiang 
1221*22ce4affSfengbojiang ///
1222*22ce4affSfengbojiang /// This Device Path is used to describe the booting of non-EFI-aware operating systems.
1223*22ce4affSfengbojiang ///
1224*22ce4affSfengbojiang typedef struct {
1225*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL        Header;
1226*22ce4affSfengbojiang   ///
1227*22ce4affSfengbojiang   /// Device Type as defined by the BIOS Boot Specification.
1228*22ce4affSfengbojiang   ///
1229*22ce4affSfengbojiang   UINT16                          DeviceType;
1230*22ce4affSfengbojiang   ///
1231*22ce4affSfengbojiang   /// Status Flags as defined by the BIOS Boot Specification.
1232*22ce4affSfengbojiang   ///
1233*22ce4affSfengbojiang   UINT16                          StatusFlag;
1234*22ce4affSfengbojiang   ///
1235*22ce4affSfengbojiang   /// Null-terminated ASCII string that describes the boot device to a user.
1236*22ce4affSfengbojiang   ///
1237*22ce4affSfengbojiang   CHAR8                           String[1];
1238*22ce4affSfengbojiang } BBS_BBS_DEVICE_PATH;
1239*22ce4affSfengbojiang 
1240*22ce4affSfengbojiang //
1241*22ce4affSfengbojiang // DeviceType definitions - from BBS specification
1242*22ce4affSfengbojiang //
1243*22ce4affSfengbojiang #define BBS_TYPE_FLOPPY           0x01
1244*22ce4affSfengbojiang #define BBS_TYPE_HARDDRIVE        0x02
1245*22ce4affSfengbojiang #define BBS_TYPE_CDROM            0x03
1246*22ce4affSfengbojiang #define BBS_TYPE_PCMCIA           0x04
1247*22ce4affSfengbojiang #define BBS_TYPE_USB              0x05
1248*22ce4affSfengbojiang #define BBS_TYPE_EMBEDDED_NETWORK 0x06
1249*22ce4affSfengbojiang #define BBS_TYPE_BEV              0x80
1250*22ce4affSfengbojiang #define BBS_TYPE_UNKNOWN          0xFF
1251*22ce4affSfengbojiang 
1252*22ce4affSfengbojiang 
1253*22ce4affSfengbojiang ///
1254*22ce4affSfengbojiang /// Union of all possible Device Paths and pointers to Device Paths.
1255*22ce4affSfengbojiang ///
1256*22ce4affSfengbojiang typedef union {
1257*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL                   DevPath;
1258*22ce4affSfengbojiang   PCI_DEVICE_PATH                            Pci;
1259*22ce4affSfengbojiang   PCCARD_DEVICE_PATH                         PcCard;
1260*22ce4affSfengbojiang   MEMMAP_DEVICE_PATH                         MemMap;
1261*22ce4affSfengbojiang   VENDOR_DEVICE_PATH                         Vendor;
1262*22ce4affSfengbojiang 
1263*22ce4affSfengbojiang   CONTROLLER_DEVICE_PATH                     Controller;
1264*22ce4affSfengbojiang   BMC_DEVICE_PATH                            Bmc;
1265*22ce4affSfengbojiang   ACPI_HID_DEVICE_PATH                       Acpi;
1266*22ce4affSfengbojiang   ACPI_EXTENDED_HID_DEVICE_PATH              ExtendedAcpi;
1267*22ce4affSfengbojiang   ACPI_ADR_DEVICE_PATH                       AcpiAdr;
1268*22ce4affSfengbojiang 
1269*22ce4affSfengbojiang   ATAPI_DEVICE_PATH                          Atapi;
1270*22ce4affSfengbojiang   SCSI_DEVICE_PATH                           Scsi;
1271*22ce4affSfengbojiang   ISCSI_DEVICE_PATH                          Iscsi;
1272*22ce4affSfengbojiang   FIBRECHANNEL_DEVICE_PATH                   FibreChannel;
1273*22ce4affSfengbojiang   FIBRECHANNELEX_DEVICE_PATH                 FibreChannelEx;
1274*22ce4affSfengbojiang 
1275*22ce4affSfengbojiang   F1394_DEVICE_PATH                          F1394;
1276*22ce4affSfengbojiang   USB_DEVICE_PATH                            Usb;
1277*22ce4affSfengbojiang   SATA_DEVICE_PATH                           Sata;
1278*22ce4affSfengbojiang   USB_CLASS_DEVICE_PATH                      UsbClass;
1279*22ce4affSfengbojiang   USB_WWID_DEVICE_PATH                       UsbWwid;
1280*22ce4affSfengbojiang   DEVICE_LOGICAL_UNIT_DEVICE_PATH            LogicUnit;
1281*22ce4affSfengbojiang   I2O_DEVICE_PATH                            I2O;
1282*22ce4affSfengbojiang   MAC_ADDR_DEVICE_PATH                       MacAddr;
1283*22ce4affSfengbojiang   IPv4_DEVICE_PATH                           Ipv4;
1284*22ce4affSfengbojiang   IPv6_DEVICE_PATH                           Ipv6;
1285*22ce4affSfengbojiang   VLAN_DEVICE_PATH                           Vlan;
1286*22ce4affSfengbojiang   INFINIBAND_DEVICE_PATH                     InfiniBand;
1287*22ce4affSfengbojiang   UART_DEVICE_PATH                           Uart;
1288*22ce4affSfengbojiang   UART_FLOW_CONTROL_DEVICE_PATH              UartFlowControl;
1289*22ce4affSfengbojiang   SAS_DEVICE_PATH                            Sas;
1290*22ce4affSfengbojiang   SASEX_DEVICE_PATH                          SasEx;
1291*22ce4affSfengbojiang   NVME_NAMESPACE_DEVICE_PATH                 NvmeNamespace;
1292*22ce4affSfengbojiang   DNS_DEVICE_PATH                            Dns;
1293*22ce4affSfengbojiang   URI_DEVICE_PATH                            Uri;
1294*22ce4affSfengbojiang   BLUETOOTH_DEVICE_PATH                      Bluetooth;
1295*22ce4affSfengbojiang   WIFI_DEVICE_PATH                           WiFi;
1296*22ce4affSfengbojiang   UFS_DEVICE_PATH                            Ufs;
1297*22ce4affSfengbojiang   SD_DEVICE_PATH                             Sd;
1298*22ce4affSfengbojiang   EMMC_DEVICE_PATH                           Emmc;
1299*22ce4affSfengbojiang   HARDDRIVE_DEVICE_PATH                      HardDrive;
1300*22ce4affSfengbojiang   CDROM_DEVICE_PATH                          CD;
1301*22ce4affSfengbojiang 
1302*22ce4affSfengbojiang   FILEPATH_DEVICE_PATH                       FilePath;
1303*22ce4affSfengbojiang   MEDIA_PROTOCOL_DEVICE_PATH                 MediaProtocol;
1304*22ce4affSfengbojiang 
1305*22ce4affSfengbojiang   MEDIA_FW_VOL_DEVICE_PATH                   FirmwareVolume;
1306*22ce4affSfengbojiang   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH          FirmwareFile;
1307*22ce4affSfengbojiang   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH    Offset;
1308*22ce4affSfengbojiang   MEDIA_RAM_DISK_DEVICE_PATH                 RamDisk;
1309*22ce4affSfengbojiang   BBS_BBS_DEVICE_PATH                        Bbs;
1310*22ce4affSfengbojiang } EFI_DEV_PATH;
1311*22ce4affSfengbojiang 
1312*22ce4affSfengbojiang 
1313*22ce4affSfengbojiang 
1314*22ce4affSfengbojiang typedef union {
1315*22ce4affSfengbojiang   EFI_DEVICE_PATH_PROTOCOL                   *DevPath;
1316*22ce4affSfengbojiang   PCI_DEVICE_PATH                            *Pci;
1317*22ce4affSfengbojiang   PCCARD_DEVICE_PATH                         *PcCard;
1318*22ce4affSfengbojiang   MEMMAP_DEVICE_PATH                         *MemMap;
1319*22ce4affSfengbojiang   VENDOR_DEVICE_PATH                         *Vendor;
1320*22ce4affSfengbojiang 
1321*22ce4affSfengbojiang   CONTROLLER_DEVICE_PATH                     *Controller;
1322*22ce4affSfengbojiang   BMC_DEVICE_PATH                            *Bmc;
1323*22ce4affSfengbojiang   ACPI_HID_DEVICE_PATH                       *Acpi;
1324*22ce4affSfengbojiang   ACPI_EXTENDED_HID_DEVICE_PATH              *ExtendedAcpi;
1325*22ce4affSfengbojiang   ACPI_ADR_DEVICE_PATH                       *AcpiAdr;
1326*22ce4affSfengbojiang 
1327*22ce4affSfengbojiang   ATAPI_DEVICE_PATH                          *Atapi;
1328*22ce4affSfengbojiang   SCSI_DEVICE_PATH                           *Scsi;
1329*22ce4affSfengbojiang   ISCSI_DEVICE_PATH                          *Iscsi;
1330*22ce4affSfengbojiang   FIBRECHANNEL_DEVICE_PATH                   *FibreChannel;
1331*22ce4affSfengbojiang   FIBRECHANNELEX_DEVICE_PATH                 *FibreChannelEx;
1332*22ce4affSfengbojiang 
1333*22ce4affSfengbojiang   F1394_DEVICE_PATH                          *F1394;
1334*22ce4affSfengbojiang   USB_DEVICE_PATH                            *Usb;
1335*22ce4affSfengbojiang   SATA_DEVICE_PATH                           *Sata;
1336*22ce4affSfengbojiang   USB_CLASS_DEVICE_PATH                      *UsbClass;
1337*22ce4affSfengbojiang   USB_WWID_DEVICE_PATH                       *UsbWwid;
1338*22ce4affSfengbojiang   DEVICE_LOGICAL_UNIT_DEVICE_PATH            *LogicUnit;
1339*22ce4affSfengbojiang   I2O_DEVICE_PATH                            *I2O;
1340*22ce4affSfengbojiang   MAC_ADDR_DEVICE_PATH                       *MacAddr;
1341*22ce4affSfengbojiang   IPv4_DEVICE_PATH                           *Ipv4;
1342*22ce4affSfengbojiang   IPv6_DEVICE_PATH                           *Ipv6;
1343*22ce4affSfengbojiang   VLAN_DEVICE_PATH                           *Vlan;
1344*22ce4affSfengbojiang   INFINIBAND_DEVICE_PATH                     *InfiniBand;
1345*22ce4affSfengbojiang   UART_DEVICE_PATH                           *Uart;
1346*22ce4affSfengbojiang   UART_FLOW_CONTROL_DEVICE_PATH              *UartFlowControl;
1347*22ce4affSfengbojiang   SAS_DEVICE_PATH                            *Sas;
1348*22ce4affSfengbojiang   SASEX_DEVICE_PATH                          *SasEx;
1349*22ce4affSfengbojiang   NVME_NAMESPACE_DEVICE_PATH                 *NvmeNamespace;
1350*22ce4affSfengbojiang   DNS_DEVICE_PATH                            *Dns;
1351*22ce4affSfengbojiang   URI_DEVICE_PATH                            *Uri;
1352*22ce4affSfengbojiang   BLUETOOTH_DEVICE_PATH                      *Bluetooth;
1353*22ce4affSfengbojiang   WIFI_DEVICE_PATH                           *WiFi;
1354*22ce4affSfengbojiang   UFS_DEVICE_PATH                            *Ufs;
1355*22ce4affSfengbojiang   SD_DEVICE_PATH                             *Sd;
1356*22ce4affSfengbojiang   EMMC_DEVICE_PATH                           *Emmc;
1357*22ce4affSfengbojiang   HARDDRIVE_DEVICE_PATH                      *HardDrive;
1358*22ce4affSfengbojiang   CDROM_DEVICE_PATH                          *CD;
1359*22ce4affSfengbojiang 
1360*22ce4affSfengbojiang   FILEPATH_DEVICE_PATH                       *FilePath;
1361*22ce4affSfengbojiang   MEDIA_PROTOCOL_DEVICE_PATH                 *MediaProtocol;
1362*22ce4affSfengbojiang 
1363*22ce4affSfengbojiang   MEDIA_FW_VOL_DEVICE_PATH                   *FirmwareVolume;
1364*22ce4affSfengbojiang   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH          *FirmwareFile;
1365*22ce4affSfengbojiang   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH    *Offset;
1366*22ce4affSfengbojiang   MEDIA_RAM_DISK_DEVICE_PATH                 *RamDisk;
1367*22ce4affSfengbojiang   BBS_BBS_DEVICE_PATH                        *Bbs;
1368*22ce4affSfengbojiang   UINT8                                      *Raw;
1369*22ce4affSfengbojiang } EFI_DEV_PATH_PTR;
1370*22ce4affSfengbojiang 
1371*22ce4affSfengbojiang #pragma pack()
1372*22ce4affSfengbojiang 
1373*22ce4affSfengbojiang #define END_DEVICE_PATH_TYPE                 0x7f
1374*22ce4affSfengbojiang #define END_ENTIRE_DEVICE_PATH_SUBTYPE       0xFF
1375*22ce4affSfengbojiang #define END_INSTANCE_DEVICE_PATH_SUBTYPE     0x01
1376*22ce4affSfengbojiang 
1377*22ce4affSfengbojiang extern EFI_GUID gEfiDevicePathProtocolGuid;
1378*22ce4affSfengbojiang 
1379*22ce4affSfengbojiang #endif
1380