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