1*1370a723SSascha Wildner /** @file
2*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILITIES_PROTOCOL as defined in UEFI 2.0.
3*1370a723SSascha Wildner   Use to create and manipulate device paths and device nodes.
4*1370a723SSascha Wildner 
5*1370a723SSascha Wildner   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
6*1370a723SSascha Wildner   SPDX-License-Identifier: BSD-2-Clause-Patent
7*1370a723SSascha Wildner 
8*1370a723SSascha Wildner **/
9*1370a723SSascha Wildner 
10*1370a723SSascha Wildner #ifndef __DEVICE_PATH_UTILITIES_PROTOCOL_H__
11*1370a723SSascha Wildner #define __DEVICE_PATH_UTILITIES_PROTOCOL_H__
12*1370a723SSascha Wildner 
13*1370a723SSascha Wildner ///
14*1370a723SSascha Wildner /// Device Path Utilities protocol
15*1370a723SSascha Wildner ///
16*1370a723SSascha Wildner #define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
17*1370a723SSascha Wildner   { \
18*1370a723SSascha Wildner     0x379be4e, 0xd706, 0x437d, {0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4 } \
19*1370a723SSascha Wildner   }
20*1370a723SSascha Wildner 
21*1370a723SSascha Wildner /**
22*1370a723SSascha Wildner   Returns the size of the device path, in bytes.
23*1370a723SSascha Wildner 
24*1370a723SSascha Wildner   @param  DevicePath Points to the start of the EFI device path.
25*1370a723SSascha Wildner 
26*1370a723SSascha Wildner   @return Size  Size of the specified device path, in bytes, including the end-of-path tag.
27*1370a723SSascha Wildner   @retval 0     DevicePath is NULL
28*1370a723SSascha Wildner 
29*1370a723SSascha Wildner **/
30*1370a723SSascha Wildner typedef
31*1370a723SSascha Wildner UINTN
32*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE)(
33*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
34*1370a723SSascha Wildner   );
35*1370a723SSascha Wildner 
36*1370a723SSascha Wildner /**
37*1370a723SSascha Wildner   Create a duplicate of the specified path.
38*1370a723SSascha Wildner 
39*1370a723SSascha Wildner   @param  DevicePath Points to the source EFI device path.
40*1370a723SSascha Wildner 
41*1370a723SSascha Wildner   @retval Pointer    A pointer to the duplicate device path.
42*1370a723SSascha Wildner   @retval NULL       insufficient memory or DevicePath is NULL
43*1370a723SSascha Wildner 
44*1370a723SSascha Wildner **/
45*1370a723SSascha Wildner typedef
46*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
47*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH)(
48*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
49*1370a723SSascha Wildner   );
50*1370a723SSascha Wildner 
51*1370a723SSascha Wildner /**
52*1370a723SSascha Wildner   Create a new path by appending the second device path to the first.
53*1370a723SSascha Wildner   If Src1 is NULL and Src2 is non-NULL, then a duplicate of Src2 is returned.
54*1370a723SSascha Wildner   If Src1 is non-NULL and Src2 is NULL, then a duplicate of Src1 is returned.
55*1370a723SSascha Wildner   If Src1 and Src2 are both NULL, then a copy of an end-of-device-path is returned.
56*1370a723SSascha Wildner 
57*1370a723SSascha Wildner   @param  Src1 Points to the first device path.
58*1370a723SSascha Wildner   @param  Src2 Points to the second device path.
59*1370a723SSascha Wildner 
60*1370a723SSascha Wildner   @retval Pointer  A pointer to the newly created device path.
61*1370a723SSascha Wildner   @retval NULL     Memory could not be allocated
62*1370a723SSascha Wildner 
63*1370a723SSascha Wildner **/
64*1370a723SSascha Wildner typedef
65*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
66*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_PATH)(
67*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1,
68*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2
69*1370a723SSascha Wildner   );
70*1370a723SSascha Wildner 
71*1370a723SSascha Wildner /**
72*1370a723SSascha Wildner   Creates a new path by appending the device node to the device path.
73*1370a723SSascha Wildner   If DeviceNode is NULL then a copy of DevicePath is returned.
74*1370a723SSascha Wildner   If DevicePath is NULL then a copy of DeviceNode, followed by an end-of-device path device node is returned.
75*1370a723SSascha Wildner   If both DeviceNode and DevicePath are NULL then a copy of an end-of-device-path device node is returned.
76*1370a723SSascha Wildner 
77*1370a723SSascha Wildner   @param  DevicePath Points to the device path.
78*1370a723SSascha Wildner   @param  DeviceNode Points to the device node.
79*1370a723SSascha Wildner 
80*1370a723SSascha Wildner   @retval Pointer    A pointer to the allocated device node.
81*1370a723SSascha Wildner   @retval NULL       There was insufficient memory.
82*1370a723SSascha Wildner 
83*1370a723SSascha Wildner **/
84*1370a723SSascha Wildner typedef
85*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
86*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_NODE)(
87*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
88*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode
89*1370a723SSascha Wildner   );
90*1370a723SSascha Wildner 
91*1370a723SSascha Wildner /**
92*1370a723SSascha Wildner   Creates a new path by appending the specified device path instance to the specified device path.
93*1370a723SSascha Wildner 
94*1370a723SSascha Wildner   @param  DevicePath         Points to the device path. If NULL, then ignored.
95*1370a723SSascha Wildner   @param  DevicePathInstance Points to the device path instance.
96*1370a723SSascha Wildner 
97*1370a723SSascha Wildner   @retval Pointer            A pointer to the newly created device path
98*1370a723SSascha Wildner   @retval NULL               Memory could not be allocated or DevicePathInstance is NULL.
99*1370a723SSascha Wildner 
100*1370a723SSascha Wildner **/
101*1370a723SSascha Wildner typedef
102*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
103*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE)(
104*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
105*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance
106*1370a723SSascha Wildner   );
107*1370a723SSascha Wildner 
108*1370a723SSascha Wildner /**
109*1370a723SSascha Wildner   Creates a copy of the current device path instance and returns a pointer to the next device path
110*1370a723SSascha Wildner   instance.
111*1370a723SSascha Wildner 
112*1370a723SSascha Wildner   @param  DevicePathInstance     On input, this holds the pointer to the current device path
113*1370a723SSascha Wildner                                  instance. On output, this holds the pointer to the next
114*1370a723SSascha Wildner                                  device path instance or NULL if there are no more device
115*1370a723SSascha Wildner                                  path instances in the device path.
116*1370a723SSascha Wildner   @param  DevicePathInstanceSize On output, this holds the size of the device path instance,
117*1370a723SSascha Wildner                                  in bytes or zero, if DevicePathInstance is NULL.
118*1370a723SSascha Wildner                                  If NULL, then the instance size is not output.
119*1370a723SSascha Wildner 
120*1370a723SSascha Wildner   @retval Pointer                A pointer to the copy of the current device path instance.
121*1370a723SSascha Wildner   @retval NULL                   DevicePathInstace was NULL on entry or there was insufficient memory.
122*1370a723SSascha Wildner 
123*1370a723SSascha Wildner **/
124*1370a723SSascha Wildner typedef
125*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
126*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE)(
127*1370a723SSascha Wildner   IN  OUT EFI_DEVICE_PATH_PROTOCOL  **DevicePathInstance,
128*1370a723SSascha Wildner   OUT UINTN                         *DevicePathInstanceSize
129*1370a723SSascha Wildner   );
130*1370a723SSascha Wildner 
131*1370a723SSascha Wildner /**
132*1370a723SSascha Wildner   Creates a device node
133*1370a723SSascha Wildner 
134*1370a723SSascha Wildner   @param  NodeType    NodeType is the device node type (EFI_DEVICE_PATH.Type) for
135*1370a723SSascha Wildner                       the new device node.
136*1370a723SSascha Wildner   @param  NodeSubType NodeSubType is the device node sub-type
137*1370a723SSascha Wildner                       EFI_DEVICE_PATH.SubType) for the new device node.
138*1370a723SSascha Wildner   @param  NodeLength  NodeLength is the length of the device node
139*1370a723SSascha Wildner                       (EFI_DEVICE_PATH.Length) for the new device node.
140*1370a723SSascha Wildner 
141*1370a723SSascha Wildner   @retval Pointer     A pointer to the newly created device node.
142*1370a723SSascha Wildner   @retval NULL        NodeLength is less than
143*1370a723SSascha Wildner                       the size of the header or there was insufficient memory.
144*1370a723SSascha Wildner 
145*1370a723SSascha Wildner **/
146*1370a723SSascha Wildner typedef
147*1370a723SSascha Wildner EFI_DEVICE_PATH_PROTOCOL*
148*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_CREATE_NODE)(
149*1370a723SSascha Wildner   IN UINT8                          NodeType,
150*1370a723SSascha Wildner   IN UINT8                          NodeSubType,
151*1370a723SSascha Wildner   IN UINT16                         NodeLength
152*1370a723SSascha Wildner );
153*1370a723SSascha Wildner 
154*1370a723SSascha Wildner /**
155*1370a723SSascha Wildner   Returns whether a device path is multi-instance.
156*1370a723SSascha Wildner 
157*1370a723SSascha Wildner   @param  DevicePath Points to the device path. If NULL, then ignored.
158*1370a723SSascha Wildner 
159*1370a723SSascha Wildner   @retval TRUE       The device path has more than one instance
160*1370a723SSascha Wildner   @retval FALSE      The device path is empty or contains only a single instance.
161*1370a723SSascha Wildner 
162*1370a723SSascha Wildner **/
163*1370a723SSascha Wildner typedef
164*1370a723SSascha Wildner BOOLEAN
165*1370a723SSascha Wildner (EFIAPI *EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE)(
166*1370a723SSascha Wildner   IN CONST EFI_DEVICE_PATH_PROTOCOL         *DevicePath
167*1370a723SSascha Wildner   );
168*1370a723SSascha Wildner 
169*1370a723SSascha Wildner ///
170*1370a723SSascha Wildner /// This protocol is used to creates and manipulates device paths and device nodes.
171*1370a723SSascha Wildner ///
172*1370a723SSascha Wildner typedef struct {
173*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE GetDevicePathSize;
174*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH      DuplicateDevicePath;
175*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_APPEND_PATH          AppendDevicePath;
176*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_APPEND_NODE          AppendDeviceNode;
177*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE      AppendDevicePathInstance;
178*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE    GetNextDevicePathInstance;
179*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE    IsDevicePathMultiInstance;
180*1370a723SSascha Wildner   EFI_DEVICE_PATH_UTILS_CREATE_NODE          CreateDeviceNode;
181*1370a723SSascha Wildner } EFI_DEVICE_PATH_UTILITIES_PROTOCOL;
182*1370a723SSascha Wildner 
183*1370a723SSascha Wildner extern EFI_GUID gEfiDevicePathUtilitiesProtocolGuid;
184*1370a723SSascha Wildner 
185*1370a723SSascha Wildner #endif
186