]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
MdePkg: Add UEFI2.5 bluetooth protocol/devicepath definition in MdePkg.
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathToText.c
CommitLineData
13d40edd 1/** @file\r
2 DevicePathToText protocol as defined in the UEFI 2.0 specification.\r
95276127 3\r
5d6a5aee 4Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
13d40edd 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
95276127 9\r
13d40edd 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
95276127 12\r
13d40edd 13**/\r
95276127 14\r
4d0a30a4 15#include "UefiDevicePathLib.h"\r
95276127 16\r
572f5d8a 17/**\r
18 Concatenates a formatted unicode string to allocated pool. The caller must\r
19 free the resulting buffer.\r
20\r
21 @param Str Tracks the allocated pool, size in use, and\r
22 amount of pool allocated.\r
23 @param Fmt The format string\r
24 @param ... Variable arguments based on the format string.\r
25\r
26 @return Allocated buffer with the formatted string printed in it.\r
27 The caller must free the allocated buffer. The buffer\r
28 allocation is not packed.\r
29\r
30**/\r
95276127 31CHAR16 *\r
eed8d676 32EFIAPI\r
4d0a30a4 33UefiDevicePathLibCatPrint (\r
95276127 34 IN OUT POOL_PRINT *Str,\r
35 IN CHAR16 *Fmt,\r
36 ...\r
37 )\r
95276127 38{\r
4d0a30a4 39 UINTN Count;\r
95276127 40 VA_LIST Args;\r
95276127 41\r
95276127 42 VA_START (Args, Fmt);\r
4d0a30a4 43 Count = SPrintLength (Fmt, Args);\r
e9b3cd55 44\r
4d0a30a4
RN
45 if ((Str->Count + (Count + 1)) * sizeof (CHAR16) > Str->Capacity) {\r
46 Str->Capacity = (Str->Count + (Count + 1) * 2) * sizeof (CHAR16);\r
95276127 47 Str->Str = ReallocatePool (\r
4d0a30a4 48 Str->Count * sizeof (CHAR16),\r
e9b3cd55 49 Str->Capacity,\r
48557c65 50 Str->Str\r
51 );\r
95276127 52 ASSERT (Str->Str != NULL);\r
53 }\r
4d0a30a4
RN
54 UnicodeVSPrint (&Str->Str[Str->Count], Str->Capacity - Str->Count * sizeof (CHAR16), Fmt, Args);\r
55 Str->Count += Count;\r
56 \r
57 VA_END (Args);\r
95276127 58 return Str->Str;\r
59}\r
60\r
572f5d8a 61/**\r
48557c65 62 Converts a PCI device path structure to its string representative.\r
572f5d8a 63\r
48557c65 64 @param Str The string representative of input device.\r
572f5d8a 65 @param DevPath The input device path structure.\r
66 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
67 of the display node is used, where applicable. If DisplayOnly\r
68 is FALSE, then the longer text representation of the display node\r
69 is used.\r
70 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
71 representation for a device node can be used, where applicable.\r
72\r
73**/\r
95276127 74VOID\r
75DevPathToTextPci (\r
76 IN OUT POOL_PRINT *Str,\r
77 IN VOID *DevPath,\r
78 IN BOOLEAN DisplayOnly,\r
79 IN BOOLEAN AllowShortcuts\r
80 )\r
81{\r
82 PCI_DEVICE_PATH *Pci;\r
83\r
84 Pci = DevPath;\r
4d0a30a4 85 UefiDevicePathLibCatPrint (Str, L"Pci(0x%x,0x%x)", Pci->Device, Pci->Function);\r
95276127 86}\r
87\r
572f5d8a 88/**\r
48557c65 89 Converts a PC Card device path structure to its string representative.\r
572f5d8a 90\r
48557c65 91 @param Str The string representative of input device.\r
572f5d8a 92 @param DevPath The input device path structure.\r
93 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
94 of the display node is used, where applicable. If DisplayOnly\r
95 is FALSE, then the longer text representation of the display node\r
96 is used.\r
97 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
98 representation for a device node can be used, where applicable.\r
99\r
100**/\r
95276127 101VOID\r
102DevPathToTextPccard (\r
103 IN OUT POOL_PRINT *Str,\r
104 IN VOID *DevPath,\r
105 IN BOOLEAN DisplayOnly,\r
106 IN BOOLEAN AllowShortcuts\r
107 )\r
108{\r
109 PCCARD_DEVICE_PATH *Pccard;\r
110\r
111 Pccard = DevPath;\r
4d0a30a4 112 UefiDevicePathLibCatPrint (Str, L"PcCard(0x%x)", Pccard->FunctionNumber);\r
95276127 113}\r
114\r
572f5d8a 115/**\r
48557c65 116 Converts a Memory Map device path structure to its string representative.\r
572f5d8a 117\r
48557c65 118 @param Str The string representative of input device.\r
572f5d8a 119 @param DevPath The input device path structure.\r
120 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
121 of the display node is used, where applicable. If DisplayOnly\r
122 is FALSE, then the longer text representation of the display node\r
123 is used.\r
124 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
125 representation for a device node can be used, where applicable.\r
126\r
127**/\r
95276127 128VOID\r
129DevPathToTextMemMap (\r
130 IN OUT POOL_PRINT *Str,\r
131 IN VOID *DevPath,\r
132 IN BOOLEAN DisplayOnly,\r
133 IN BOOLEAN AllowShortcuts\r
134 )\r
135{\r
136 MEMMAP_DEVICE_PATH *MemMap;\r
137\r
138 MemMap = DevPath;\r
4d0a30a4 139 UefiDevicePathLibCatPrint (\r
95276127 140 Str,\r
cf40f28a 141 L"MemoryMapped(0x%x,0x%lx,0x%lx)",\r
e9b3cd55 142 MemMap->MemoryType,\r
95276127 143 MemMap->StartingAddress,\r
144 MemMap->EndingAddress\r
145 );\r
146}\r
147\r
572f5d8a 148/**\r
48557c65 149 Converts a Vendor device path structure to its string representative.\r
572f5d8a 150\r
48557c65 151 @param Str The string representative of input device.\r
572f5d8a 152 @param DevPath The input device path structure.\r
153 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
154 of the display node is used, where applicable. If DisplayOnly\r
155 is FALSE, then the longer text representation of the display node\r
156 is used.\r
157 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
158 representation for a device node can be used, where applicable.\r
159\r
160**/\r
95276127 161VOID\r
162DevPathToTextVendor (\r
163 IN OUT POOL_PRINT *Str,\r
164 IN VOID *DevPath,\r
165 IN BOOLEAN DisplayOnly,\r
166 IN BOOLEAN AllowShortcuts\r
167 )\r
168{\r
169 VENDOR_DEVICE_PATH *Vendor;\r
170 CHAR16 *Type;\r
171 UINTN Index;\r
cf40f28a 172 UINTN DataLength;\r
95276127 173 UINT32 FlowControlMap;\r
174 UINT16 Info;\r
175\r
176 Vendor = (VENDOR_DEVICE_PATH *) DevPath;\r
177 switch (DevicePathType (&Vendor->Header)) {\r
178 case HARDWARE_DEVICE_PATH:\r
179 Type = L"Hw";\r
180 break;\r
181\r
182 case MESSAGING_DEVICE_PATH:\r
183 Type = L"Msg";\r
184 if (AllowShortcuts) {\r
185 if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) {\r
4d0a30a4 186 UefiDevicePathLibCatPrint (Str, L"VenPcAnsi()");\r
95276127 187 return ;\r
188 } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) {\r
4d0a30a4 189 UefiDevicePathLibCatPrint (Str, L"VenVt100()");\r
95276127 190 return ;\r
191 } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) {\r
4d0a30a4 192 UefiDevicePathLibCatPrint (Str, L"VenVt100Plus()");\r
95276127 193 return ;\r
194 } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {\r
4d0a30a4 195 UefiDevicePathLibCatPrint (Str, L"VenUft8()");\r
95276127 196 return ;\r
48557c65 197 } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid)) {\r
95276127 198 FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);\r
199 switch (FlowControlMap & 0x00000003) {\r
200 case 0:\r
4d0a30a4 201 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"None");\r
95276127 202 break;\r
203\r
204 case 1:\r
4d0a30a4 205 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"Hardware");\r
95276127 206 break;\r
207\r
208 case 2:\r
4d0a30a4 209 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"XonXoff");\r
95276127 210 break;\r
211\r
212 default:\r
213 break;\r
214 }\r
215\r
216 return ;\r
48557c65 217 } else if (CompareGuid (&Vendor->Guid, &gEfiSasDevicePathGuid)) {\r
4d0a30a4 218 UefiDevicePathLibCatPrint (\r
95276127 219 Str,\r
cf40f28a 220 L"SAS(0x%lx,0x%lx,0x%x,",\r
95276127 221 ((SAS_DEVICE_PATH *) Vendor)->SasAddress,\r
222 ((SAS_DEVICE_PATH *) Vendor)->Lun,\r
e9b3cd55 223 ((SAS_DEVICE_PATH *) Vendor)->RelativeTargetPort\r
95276127 224 );\r
225 Info = (((SAS_DEVICE_PATH *) Vendor)->DeviceTopology);\r
562fce0b 226 if (((Info & 0x0f) == 0) && ((Info & BIT7) == 0)) {\r
4d0a30a4 227 UefiDevicePathLibCatPrint (Str, L"NoTopology,0,0,0,");\r
562fce0b 228 } else if (((Info & 0x0f) <= 2) && ((Info & BIT7) == 0)) {\r
4d0a30a4 229 UefiDevicePathLibCatPrint (\r
95276127 230 Str,\r
231 L"%s,%s,%s,",\r
562fce0b
RN
232 ((Info & BIT4) != 0) ? L"SATA" : L"SAS",\r
233 ((Info & BIT5) != 0) ? L"External" : L"Internal",\r
234 ((Info & BIT6) != 0) ? L"Expanded" : L"Direct"\r
95276127 235 );\r
236 if ((Info & 0x0f) == 1) {\r
4d0a30a4 237 UefiDevicePathLibCatPrint (Str, L"0,");\r
95276127 238 } else {\r
562fce0b
RN
239 //\r
240 // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256\r
241 //\r
4d0a30a4 242 UefiDevicePathLibCatPrint (Str, L"0x%x,", ((Info >> 8) & 0xff) + 1);\r
95276127 243 }\r
244 } else {\r
4d0a30a4 245 UefiDevicePathLibCatPrint (Str, L"0x%x,0,0,0,", Info);\r
95276127 246 }\r
247\r
4d0a30a4 248 UefiDevicePathLibCatPrint (Str, L"0x%x)", ((SAS_DEVICE_PATH *) Vendor)->Reserved);\r
95276127 249 return ;\r
250 } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {\r
4d0a30a4 251 UefiDevicePathLibCatPrint (Str, L"DebugPort()");\r
95276127 252 return ;\r
95276127 253 }\r
254 }\r
255 break;\r
256\r
257 case MEDIA_DEVICE_PATH:\r
258 Type = L"Media";\r
259 break;\r
260\r
261 default:\r
262 Type = L"?";\r
263 break;\r
264 }\r
265\r
cf40f28a 266 DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH);\r
4d0a30a4 267 UefiDevicePathLibCatPrint (Str, L"Ven%s(%g", Type, &Vendor->Guid);\r
cf40f28a 268 if (DataLength != 0) {\r
4d0a30a4 269 UefiDevicePathLibCatPrint (Str, L",");\r
cf40f28a 270 for (Index = 0; Index < DataLength; Index++) {\r
4d0a30a4 271 UefiDevicePathLibCatPrint (Str, L"%02x", ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);\r
cf40f28a 272 }\r
95276127 273 }\r
274\r
4d0a30a4 275 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 276}\r
277\r
572f5d8a 278/**\r
48557c65 279 Converts a Controller device path structure to its string representative.\r
572f5d8a 280\r
48557c65 281 @param Str The string representative of input device.\r
572f5d8a 282 @param DevPath The input device path structure.\r
283 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
284 of the display node is used, where applicable. If DisplayOnly\r
285 is FALSE, then the longer text representation of the display node\r
286 is used.\r
287 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
288 representation for a device node can be used, where applicable.\r
289\r
290**/\r
95276127 291VOID\r
292DevPathToTextController (\r
293 IN OUT POOL_PRINT *Str,\r
294 IN VOID *DevPath,\r
295 IN BOOLEAN DisplayOnly,\r
296 IN BOOLEAN AllowShortcuts\r
297 )\r
298{\r
299 CONTROLLER_DEVICE_PATH *Controller;\r
300\r
301 Controller = DevPath;\r
4d0a30a4 302 UefiDevicePathLibCatPrint (\r
95276127 303 Str,\r
cf40f28a 304 L"Ctrl(0x%x)",\r
e9b3cd55 305 Controller->ControllerNumber\r
95276127 306 );\r
307}\r
308\r
572f5d8a 309/**\r
48557c65 310 Converts a ACPI device path structure to its string representative.\r
572f5d8a 311\r
48557c65 312 @param Str The string representative of input device.\r
572f5d8a 313 @param DevPath The input device path structure.\r
314 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
315 of the display node is used, where applicable. If DisplayOnly\r
316 is FALSE, then the longer text representation of the display node\r
317 is used.\r
318 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
319 representation for a device node can be used, where applicable.\r
320\r
321**/\r
95276127 322VOID\r
323DevPathToTextAcpi (\r
324 IN OUT POOL_PRINT *Str,\r
325 IN VOID *DevPath,\r
326 IN BOOLEAN DisplayOnly,\r
327 IN BOOLEAN AllowShortcuts\r
328 )\r
329{\r
330 ACPI_HID_DEVICE_PATH *Acpi;\r
331\r
332 Acpi = DevPath;\r
333 if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {\r
cf40f28a 334 switch (EISA_ID_TO_NUM (Acpi->HID)) {\r
335 case 0x0a03:\r
4d0a30a4 336 UefiDevicePathLibCatPrint (Str, L"PciRoot(0x%x)", Acpi->UID);\r
e9b3cd55
RN
337 break;\r
338\r
339 case 0x0a08:\r
4d0a30a4 340 UefiDevicePathLibCatPrint (Str, L"PcieRoot(0x%x)", Acpi->UID);\r
cf40f28a 341 break;\r
95276127 342\r
cf40f28a 343 case 0x0604:\r
4d0a30a4 344 UefiDevicePathLibCatPrint (Str, L"Floppy(0x%x)", Acpi->UID);\r
cf40f28a 345 break;\r
95276127 346\r
cf40f28a 347 case 0x0301:\r
4d0a30a4 348 UefiDevicePathLibCatPrint (Str, L"Keyboard(0x%x)", Acpi->UID);\r
cf40f28a 349 break;\r
95276127 350\r
cf40f28a 351 case 0x0501:\r
4d0a30a4 352 UefiDevicePathLibCatPrint (Str, L"Serial(0x%x)", Acpi->UID);\r
cf40f28a 353 break;\r
95276127 354\r
cf40f28a 355 case 0x0401:\r
4d0a30a4 356 UefiDevicePathLibCatPrint (Str, L"ParallelPort(0x%x)", Acpi->UID);\r
cf40f28a 357 break;\r
95276127 358\r
cf40f28a 359 default:\r
4d0a30a4 360 UefiDevicePathLibCatPrint (Str, L"Acpi(PNP%04x,0x%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID);\r
cf40f28a 361 break;\r
95276127 362 }\r
95276127 363 } else {\r
4d0a30a4 364 UefiDevicePathLibCatPrint (Str, L"Acpi(0x%08x,0x%x)", Acpi->HID, Acpi->UID);\r
95276127 365 }\r
366}\r
367\r
572f5d8a 368/**\r
48557c65 369 Converts a ACPI extended HID device path structure to its string representative.\r
572f5d8a 370\r
48557c65 371 @param Str The string representative of input device.\r
572f5d8a 372 @param DevPath The input device path structure.\r
373 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
374 of the display node is used, where applicable. If DisplayOnly\r
375 is FALSE, then the longer text representation of the display node\r
376 is used.\r
377 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
378 representation for a device node can be used, where applicable.\r
379\r
380**/\r
95276127 381VOID\r
cf40f28a 382DevPathToTextAcpiEx (\r
95276127 383 IN OUT POOL_PRINT *Str,\r
384 IN VOID *DevPath,\r
385 IN BOOLEAN DisplayOnly,\r
386 IN BOOLEAN AllowShortcuts\r
387 )\r
388{\r
cf40f28a 389 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
390 CHAR8 *HIDStr;\r
391 CHAR8 *UIDStr;\r
392 CHAR8 *CIDStr;\r
393 CHAR16 HIDText[11];\r
394 CHAR16 CIDText[11];\r
395\r
396 AcpiEx = DevPath;\r
397 HIDStr = (CHAR8 *) (((UINT8 *) AcpiEx) + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
398 UIDStr = HIDStr + AsciiStrLen (HIDStr) + 1;\r
399 CIDStr = UIDStr + AsciiStrLen (UIDStr) + 1;\r
400\r
4d0a30a4
RN
401 //\r
402 // Converts EISA identification to string.\r
403 // \r
404 UnicodeSPrint (\r
405 HIDText,\r
406 sizeof (HIDText),\r
407 L"%c%c%c%04X",\r
408 ((AcpiEx->HID >> 10) & 0x1f) + 'A' - 1,\r
409 ((AcpiEx->HID >> 5) & 0x1f) + 'A' - 1,\r
410 ((AcpiEx->HID >> 0) & 0x1f) + 'A' - 1,\r
411 (AcpiEx->HID >> 16) & 0xFFFF\r
412 );\r
413 UnicodeSPrint (\r
414 CIDText,\r
415 sizeof (CIDText),\r
416 L"%c%c%c%04X",\r
417 ((AcpiEx->CID >> 10) & 0x1f) + 'A' - 1,\r
418 ((AcpiEx->CID >> 5) & 0x1f) + 'A' - 1,\r
419 ((AcpiEx->CID >> 0) & 0x1f) + 'A' - 1,\r
420 (AcpiEx->CID >> 16) & 0xFFFF\r
421 );\r
cf40f28a 422\r
423 if ((*HIDStr == '\0') && (*CIDStr == '\0') && (AcpiEx->UID == 0)) {\r
424 //\r
425 // use AcpiExp()\r
426 //\r
4d0a30a4 427 UefiDevicePathLibCatPrint (\r
cf40f28a 428 Str,\r
429 L"AcpiExp(%s,%s,%a)",\r
430 HIDText,\r
431 CIDText,\r
432 UIDStr\r
433 );\r
434 } else {\r
435 if (AllowShortcuts) {\r
436 //\r
437 // display only\r
438 //\r
439 if (AcpiEx->HID == 0) {\r
4d0a30a4 440 UefiDevicePathLibCatPrint (Str, L"AcpiEx(%a,", HIDStr);\r
cf40f28a 441 } else {\r
4d0a30a4 442 UefiDevicePathLibCatPrint (Str, L"AcpiEx(%s,", HIDText);\r
cf40f28a 443 }\r
95276127 444\r
cf40f28a 445 if (AcpiEx->UID == 0) {\r
4d0a30a4 446 UefiDevicePathLibCatPrint (Str, L"%a,", UIDStr);\r
cf40f28a 447 } else {\r
4d0a30a4 448 UefiDevicePathLibCatPrint (Str, L"0x%x,", AcpiEx->UID);\r
cf40f28a 449 }\r
95276127 450\r
cf40f28a 451 if (AcpiEx->CID == 0) {\r
4d0a30a4 452 UefiDevicePathLibCatPrint (Str, L"%a)", CIDStr);\r
95276127 453 } else {\r
4d0a30a4 454 UefiDevicePathLibCatPrint (Str, L"%s)", CIDText);\r
95276127 455 }\r
cf40f28a 456 } else {\r
4d0a30a4 457 UefiDevicePathLibCatPrint (\r
cf40f28a 458 Str,\r
459 L"AcpiEx(%s,%s,0x%x,%a,%a,%a)",\r
460 HIDText,\r
461 CIDText,\r
e9b3cd55 462 AcpiEx->UID,\r
cf40f28a 463 HIDStr,\r
464 CIDStr,\r
465 UIDStr\r
466 );\r
95276127 467 }\r
95276127 468 }\r
cf40f28a 469}\r
95276127 470\r
572f5d8a 471/**\r
48557c65 472 Converts a ACPI address device path structure to its string representative.\r
572f5d8a 473\r
48557c65 474 @param Str The string representative of input device.\r
572f5d8a 475 @param DevPath The input device path structure.\r
476 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
477 of the display node is used, where applicable. If DisplayOnly\r
478 is FALSE, then the longer text representation of the display node\r
479 is used.\r
480 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
481 representation for a device node can be used, where applicable.\r
482\r
483**/\r
cf40f28a 484VOID\r
485DevPathToTextAcpiAdr (\r
486 IN OUT POOL_PRINT *Str,\r
487 IN VOID *DevPath,\r
488 IN BOOLEAN DisplayOnly,\r
489 IN BOOLEAN AllowShortcuts\r
490 )\r
491{\r
492 ACPI_ADR_DEVICE_PATH *AcpiAdr;\r
493 UINT16 Index;\r
494 UINT16 Length;\r
495 UINT16 AdditionalAdrCount;\r
496\r
497 AcpiAdr = DevPath;\r
498 Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr);\r
499 AdditionalAdrCount = (UINT16) ((Length - 8) / 4);\r
500\r
4d0a30a4 501 UefiDevicePathLibCatPrint (Str, L"AcpiAdr(0x%x", AcpiAdr->ADR);\r
cf40f28a 502 for (Index = 0; Index < AdditionalAdrCount; Index++) {\r
4d0a30a4 503 UefiDevicePathLibCatPrint (Str, L",0x%x", *(UINT32 *) ((UINT8 *) AcpiAdr + 8 + Index * 4));\r
95276127 504 }\r
4d0a30a4 505 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 506}\r
507\r
572f5d8a 508/**\r
48557c65 509 Converts a ATAPI device path structure to its string representative.\r
572f5d8a 510\r
48557c65 511 @param Str The string representative of input device.\r
572f5d8a 512 @param DevPath The input device path structure.\r
513 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
514 of the display node is used, where applicable. If DisplayOnly\r
515 is FALSE, then the longer text representation of the display node\r
516 is used.\r
517 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
518 representation for a device node can be used, where applicable.\r
519\r
520**/\r
95276127 521VOID\r
522DevPathToTextAtapi (\r
523 IN OUT POOL_PRINT *Str,\r
524 IN VOID *DevPath,\r
525 IN BOOLEAN DisplayOnly,\r
526 IN BOOLEAN AllowShortcuts\r
527 )\r
528{\r
529 ATAPI_DEVICE_PATH *Atapi;\r
530\r
531 Atapi = DevPath;\r
532\r
533 if (DisplayOnly) {\r
4d0a30a4 534 UefiDevicePathLibCatPrint (Str, L"Ata(0x%x)", Atapi->Lun);\r
95276127 535 } else {\r
4d0a30a4 536 UefiDevicePathLibCatPrint (\r
95276127 537 Str,\r
cf40f28a 538 L"Ata(%s,%s,0x%x)",\r
7ae9c1ce 539 (Atapi->PrimarySecondary == 1) ? L"Secondary" : L"Primary",\r
540 (Atapi->SlaveMaster == 1) ? L"Slave" : L"Master",\r
e9b3cd55 541 Atapi->Lun\r
95276127 542 );\r
543 }\r
544}\r
545\r
572f5d8a 546/**\r
48557c65 547 Converts a SCSI device path structure to its string representative.\r
572f5d8a 548\r
48557c65 549 @param Str The string representative of input device.\r
572f5d8a 550 @param DevPath The input device path structure.\r
551 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
552 of the display node is used, where applicable. If DisplayOnly\r
553 is FALSE, then the longer text representation of the display node\r
554 is used.\r
555 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
556 representation for a device node can be used, where applicable.\r
557\r
558**/\r
95276127 559VOID\r
560DevPathToTextScsi (\r
561 IN OUT POOL_PRINT *Str,\r
562 IN VOID *DevPath,\r
563 IN BOOLEAN DisplayOnly,\r
564 IN BOOLEAN AllowShortcuts\r
565 )\r
566{\r
567 SCSI_DEVICE_PATH *Scsi;\r
568\r
569 Scsi = DevPath;\r
4d0a30a4 570 UefiDevicePathLibCatPrint (Str, L"Scsi(0x%x,0x%x)", Scsi->Pun, Scsi->Lun);\r
95276127 571}\r
572\r
572f5d8a 573/**\r
48557c65 574 Converts a Fibre device path structure to its string representative.\r
572f5d8a 575\r
48557c65 576 @param Str The string representative of input device.\r
572f5d8a 577 @param DevPath The input device path structure.\r
578 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
579 of the display node is used, where applicable. If DisplayOnly\r
580 is FALSE, then the longer text representation of the display node\r
581 is used.\r
582 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
583 representation for a device node can be used, where applicable.\r
584\r
585**/\r
95276127 586VOID\r
587DevPathToTextFibre (\r
588 IN OUT POOL_PRINT *Str,\r
589 IN VOID *DevPath,\r
590 IN BOOLEAN DisplayOnly,\r
591 IN BOOLEAN AllowShortcuts\r
592 )\r
593{\r
594 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
595\r
596 Fibre = DevPath;\r
4d0a30a4 597 UefiDevicePathLibCatPrint (Str, L"Fibre(0x%lx,0x%lx)", Fibre->WWN, Fibre->Lun);\r
95276127 598}\r
599\r
e9b3cd55
RN
600/**\r
601 Converts a FibreEx device path structure to its string representative.\r
602\r
603 @param Str The string representative of input device.\r
604 @param DevPath The input device path structure.\r
605 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
606 of the display node is used, where applicable. If DisplayOnly\r
607 is FALSE, then the longer text representation of the display node\r
608 is used.\r
609 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
610 representation for a device node can be used, where applicable.\r
611\r
612**/\r
613VOID\r
614DevPathToTextFibreEx (\r
615 IN OUT POOL_PRINT *Str,\r
616 IN VOID *DevPath,\r
617 IN BOOLEAN DisplayOnly,\r
618 IN BOOLEAN AllowShortcuts\r
619 )\r
620{\r
621 FIBRECHANNELEX_DEVICE_PATH *FibreEx;\r
622 UINTN Index;\r
623\r
624 FibreEx = DevPath;\r
4d0a30a4 625 UefiDevicePathLibCatPrint (Str, L"FibreEx(0x");\r
e9b3cd55 626 for (Index = 0; Index < sizeof (FibreEx->WWN) / sizeof (FibreEx->WWN[0]); Index++) {\r
4d0a30a4 627 UefiDevicePathLibCatPrint (Str, L"%02x", FibreEx->WWN[Index]);\r
e9b3cd55 628 }\r
4d0a30a4 629 UefiDevicePathLibCatPrint (Str, L",0x");\r
e9b3cd55 630 for (Index = 0; Index < sizeof (FibreEx->Lun) / sizeof (FibreEx->Lun[0]); Index++) {\r
4d0a30a4 631 UefiDevicePathLibCatPrint (Str, L"%02x", FibreEx->Lun[Index]);\r
e9b3cd55 632 }\r
4d0a30a4 633 UefiDevicePathLibCatPrint (Str, L")");\r
e9b3cd55
RN
634}\r
635\r
501793fa
RN
636/**\r
637 Converts a Sas Ex device path structure to its string representative.\r
638\r
639 @param Str The string representative of input device.\r
640 @param DevPath The input device path structure.\r
641 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
642 of the display node is used, where applicable. If DisplayOnly\r
643 is FALSE, then the longer text representation of the display node\r
644 is used.\r
645 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
646 representation for a device node can be used, where applicable.\r
647\r
648**/\r
649VOID\r
650DevPathToTextSasEx (\r
651 IN OUT POOL_PRINT *Str,\r
652 IN VOID *DevPath,\r
653 IN BOOLEAN DisplayOnly,\r
654 IN BOOLEAN AllowShortcuts\r
655 )\r
656{\r
657 SASEX_DEVICE_PATH *SasEx;\r
658 UINTN Index;\r
659\r
660 SasEx = DevPath;\r
4d0a30a4 661 UefiDevicePathLibCatPrint (Str, L"SasEx(0x");\r
501793fa
RN
662\r
663 for (Index = 0; Index < sizeof (SasEx->SasAddress) / sizeof (SasEx->SasAddress[0]); Index++) {\r
4d0a30a4 664 UefiDevicePathLibCatPrint (Str, L"%02x", SasEx->SasAddress[Index]);\r
501793fa 665 }\r
4d0a30a4 666 UefiDevicePathLibCatPrint (Str, L",0x");\r
501793fa 667 for (Index = 0; Index < sizeof (SasEx->Lun) / sizeof (SasEx->Lun[0]); Index++) {\r
4d0a30a4 668 UefiDevicePathLibCatPrint (Str, L"%02x", SasEx->Lun[Index]);\r
501793fa 669 }\r
4d0a30a4 670 UefiDevicePathLibCatPrint (Str, L",0x%x,", SasEx->RelativeTargetPort);\r
501793fa 671\r
562fce0b 672 if (((SasEx->DeviceTopology & 0x0f) == 0) && ((SasEx->DeviceTopology & BIT7) == 0)) {\r
4d0a30a4 673 UefiDevicePathLibCatPrint (Str, L"NoTopology,0,0,0");\r
562fce0b 674 } else if (((SasEx->DeviceTopology & 0x0f) <= 2) && ((SasEx->DeviceTopology & BIT7) == 0)) {\r
4d0a30a4 675 UefiDevicePathLibCatPrint (\r
501793fa
RN
676 Str,\r
677 L"%s,%s,%s,",\r
562fce0b
RN
678 ((SasEx->DeviceTopology & BIT4) != 0) ? L"SATA" : L"SAS",\r
679 ((SasEx->DeviceTopology & BIT5) != 0) ? L"External" : L"Internal",\r
680 ((SasEx->DeviceTopology & BIT6) != 0) ? L"Expanded" : L"Direct"\r
501793fa
RN
681 );\r
682 if ((SasEx->DeviceTopology & 0x0f) == 1) {\r
4d0a30a4 683 UefiDevicePathLibCatPrint (Str, L"0");\r
501793fa 684 } else {\r
562fce0b
RN
685 //\r
686 // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256\r
687 //\r
4d0a30a4 688 UefiDevicePathLibCatPrint (Str, L"0x%x", ((SasEx->DeviceTopology >> 8) & 0xff) + 1);\r
501793fa
RN
689 }\r
690 } else {\r
4d0a30a4 691 UefiDevicePathLibCatPrint (Str, L"0x%x,0,0,0", SasEx->DeviceTopology);\r
501793fa
RN
692 }\r
693\r
4d0a30a4 694 UefiDevicePathLibCatPrint (Str, L")");\r
501793fa
RN
695 return ;\r
696\r
697}\r
698\r
a06ec3e2
RN
699/**\r
700 Converts a NVM Express Namespace device path structure to its string representative.\r
701\r
702 @param Str The string representative of input device.\r
703 @param DevPath The input device path structure.\r
704 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
705 of the display node is used, where applicable. If DisplayOnly\r
706 is FALSE, then the longer text representation of the display node\r
707 is used.\r
708 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
709 representation for a device node can be used, where applicable.\r
710\r
711**/\r
712VOID\r
713DevPathToTextNVMe (\r
714 IN OUT POOL_PRINT *Str,\r
715 IN VOID *DevPath,\r
716 IN BOOLEAN DisplayOnly,\r
717 IN BOOLEAN AllowShortcuts\r
718 )\r
719{\r
720 NVME_NAMESPACE_DEVICE_PATH *Nvme;\r
721 UINT8 *Uuid;\r
722\r
723 Nvme = DevPath;\r
724 Uuid = (UINT8 *) &Nvme->NamespaceUuid;\r
725 UefiDevicePathLibCatPrint (\r
726 Str,\r
727 L"NVMe(0x%x,%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)",\r
728 Nvme->NamespaceId,\r
729 Uuid[7], Uuid[6], Uuid[5], Uuid[4],\r
730 Uuid[3], Uuid[2], Uuid[1], Uuid[0]\r
731 );\r
732}\r
733\r
52306166
FT
734/**\r
735 Converts a UFS device path structure to its string representative.\r
736\r
737 @param Str The string representative of input device.\r
738 @param DevPath The input device path structure.\r
739 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
740 of the display node is used, where applicable. If DisplayOnly\r
741 is FALSE, then the longer text representation of the display node\r
742 is used.\r
743 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
744 representation for a device node can be used, where applicable.\r
745\r
746**/\r
747VOID\r
748DevPathToTextUfs (\r
749 IN OUT POOL_PRINT *Str,\r
750 IN VOID *DevPath,\r
751 IN BOOLEAN DisplayOnly,\r
752 IN BOOLEAN AllowShortcuts\r
753 )\r
754{\r
755 UFS_DEVICE_PATH *Ufs;\r
756\r
757 Ufs = DevPath;\r
758 UefiDevicePathLibCatPrint (Str, L"UFS(0x%x,0x%x)", Ufs->Pun, Ufs->Lun);\r
759}\r
760\r
572f5d8a 761/**\r
48557c65 762 Converts a 1394 device path structure to its string representative.\r
572f5d8a 763\r
48557c65 764 @param Str The string representative of input device.\r
572f5d8a 765 @param DevPath The input device path structure.\r
766 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
767 of the display node is used, where applicable. If DisplayOnly\r
768 is FALSE, then the longer text representation of the display node\r
769 is used.\r
770 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
771 representation for a device node can be used, where applicable.\r
772\r
773**/\r
95276127 774VOID\r
775DevPathToText1394 (\r
776 IN OUT POOL_PRINT *Str,\r
777 IN VOID *DevPath,\r
778 IN BOOLEAN DisplayOnly,\r
779 IN BOOLEAN AllowShortcuts\r
780 )\r
781{\r
572f5d8a 782 F1394_DEVICE_PATH *F1394DevPath;\r
95276127 783\r
572f5d8a 784 F1394DevPath = DevPath;\r
cf40f28a 785 //\r
786 // Guid has format of IEEE-EUI64\r
787 //\r
4d0a30a4 788 UefiDevicePathLibCatPrint (Str, L"I1394(%016lx)", F1394DevPath->Guid);\r
95276127 789}\r
790\r
572f5d8a 791/**\r
48557c65 792 Converts a USB device path structure to its string representative.\r
572f5d8a 793\r
48557c65 794 @param Str The string representative of input device.\r
572f5d8a 795 @param DevPath The input device path structure.\r
796 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
797 of the display node is used, where applicable. If DisplayOnly\r
798 is FALSE, then the longer text representation of the display node\r
799 is used.\r
800 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
801 representation for a device node can be used, where applicable.\r
802\r
803**/\r
95276127 804VOID\r
805DevPathToTextUsb (\r
806 IN OUT POOL_PRINT *Str,\r
807 IN VOID *DevPath,\r
808 IN BOOLEAN DisplayOnly,\r
809 IN BOOLEAN AllowShortcuts\r
810 )\r
811{\r
812 USB_DEVICE_PATH *Usb;\r
813\r
814 Usb = DevPath;\r
4d0a30a4 815 UefiDevicePathLibCatPrint (Str, L"USB(0x%x,0x%x)", Usb->ParentPortNumber, Usb->InterfaceNumber);\r
95276127 816}\r
817\r
572f5d8a 818/**\r
48557c65 819 Converts a USB WWID device path structure to its string representative.\r
572f5d8a 820\r
48557c65 821 @param Str The string representative of input device.\r
572f5d8a 822 @param DevPath The input device path structure.\r
823 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
824 of the display node is used, where applicable. If DisplayOnly\r
825 is FALSE, then the longer text representation of the display node\r
826 is used.\r
827 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
828 representation for a device node can be used, where applicable.\r
829\r
830**/\r
95276127 831VOID\r
832DevPathToTextUsbWWID (\r
833 IN OUT POOL_PRINT *Str,\r
834 IN VOID *DevPath,\r
835 IN BOOLEAN DisplayOnly,\r
836 IN BOOLEAN AllowShortcuts\r
837 )\r
838{\r
839 USB_WWID_DEVICE_PATH *UsbWWId;\r
cf40f28a 840 CHAR16 *SerialNumberStr;\r
841 CHAR16 *NewStr;\r
842 UINT16 Length;\r
95276127 843\r
844 UsbWWId = DevPath;\r
cf40f28a 845\r
846 SerialNumberStr = (CHAR16 *) ((UINT8 *) UsbWWId + sizeof (USB_WWID_DEVICE_PATH));\r
847 Length = (UINT16) ((DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) UsbWWId) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16));\r
848 if (SerialNumberStr [Length - 1] != 0) {\r
849 //\r
850 // In case no NULL terminator in SerialNumber, create a new one with NULL terminator\r
851 //\r
852 NewStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), SerialNumberStr);\r
3069bc19 853 ASSERT (NewStr != NULL);\r
cf40f28a 854 NewStr [Length] = 0;\r
855 SerialNumberStr = NewStr;\r
856 }\r
857\r
4d0a30a4 858 UefiDevicePathLibCatPrint (\r
95276127 859 Str,\r
cf40f28a 860 L"UsbWwid(0x%x,0x%x,0x%x,\"%s\")",\r
e9b3cd55
RN
861 UsbWWId->VendorId,\r
862 UsbWWId->ProductId,\r
863 UsbWWId->InterfaceNumber,\r
cf40f28a 864 SerialNumberStr\r
95276127 865 );\r
866}\r
867\r
572f5d8a 868/**\r
48557c65 869 Converts a Logic Unit device path structure to its string representative.\r
572f5d8a 870\r
48557c65 871 @param Str The string representative of input device.\r
572f5d8a 872 @param DevPath The input device path structure.\r
873 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
874 of the display node is used, where applicable. If DisplayOnly\r
875 is FALSE, then the longer text representation of the display node\r
876 is used.\r
877 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
878 representation for a device node can be used, where applicable.\r
879\r
880**/\r
95276127 881VOID\r
882DevPathToTextLogicalUnit (\r
883 IN OUT POOL_PRINT *Str,\r
884 IN VOID *DevPath,\r
885 IN BOOLEAN DisplayOnly,\r
886 IN BOOLEAN AllowShortcuts\r
887 )\r
888{\r
889 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
890\r
891 LogicalUnit = DevPath;\r
4d0a30a4 892 UefiDevicePathLibCatPrint (Str, L"Unit(0x%x)", LogicalUnit->Lun);\r
95276127 893}\r
894\r
572f5d8a 895/**\r
48557c65 896 Converts a USB class device path structure to its string representative.\r
572f5d8a 897\r
48557c65 898 @param Str The string representative of input device.\r
572f5d8a 899 @param DevPath The input device path structure.\r
900 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
901 of the display node is used, where applicable. If DisplayOnly\r
902 is FALSE, then the longer text representation of the display node\r
903 is used.\r
904 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
905 representation for a device node can be used, where applicable.\r
906\r
907**/\r
95276127 908VOID\r
909DevPathToTextUsbClass (\r
910 IN OUT POOL_PRINT *Str,\r
911 IN VOID *DevPath,\r
912 IN BOOLEAN DisplayOnly,\r
913 IN BOOLEAN AllowShortcuts\r
914 )\r
915{\r
916 USB_CLASS_DEVICE_PATH *UsbClass;\r
cf40f28a 917 BOOLEAN IsKnownSubClass;\r
918\r
95276127 919\r
920 UsbClass = DevPath;\r
921\r
cf40f28a 922 IsKnownSubClass = TRUE;\r
923 switch (UsbClass->DeviceClass) {\r
924 case USB_CLASS_AUDIO:\r
4d0a30a4 925 UefiDevicePathLibCatPrint (Str, L"UsbAudio");\r
cf40f28a 926 break;\r
95276127 927\r
cf40f28a 928 case USB_CLASS_CDCCONTROL:\r
4d0a30a4 929 UefiDevicePathLibCatPrint (Str, L"UsbCDCControl");\r
cf40f28a 930 break;\r
95276127 931\r
cf40f28a 932 case USB_CLASS_HID:\r
4d0a30a4 933 UefiDevicePathLibCatPrint (Str, L"UsbHID");\r
cf40f28a 934 break;\r
95276127 935\r
cf40f28a 936 case USB_CLASS_IMAGE:\r
4d0a30a4 937 UefiDevicePathLibCatPrint (Str, L"UsbImage");\r
cf40f28a 938 break;\r
95276127 939\r
cf40f28a 940 case USB_CLASS_PRINTER:\r
4d0a30a4 941 UefiDevicePathLibCatPrint (Str, L"UsbPrinter");\r
cf40f28a 942 break;\r
95276127 943\r
cf40f28a 944 case USB_CLASS_MASS_STORAGE:\r
4d0a30a4 945 UefiDevicePathLibCatPrint (Str, L"UsbMassStorage");\r
cf40f28a 946 break;\r
95276127 947\r
cf40f28a 948 case USB_CLASS_HUB:\r
4d0a30a4 949 UefiDevicePathLibCatPrint (Str, L"UsbHub");\r
cf40f28a 950 break;\r
95276127 951\r
cf40f28a 952 case USB_CLASS_CDCDATA:\r
4d0a30a4 953 UefiDevicePathLibCatPrint (Str, L"UsbCDCData");\r
cf40f28a 954 break;\r
95276127 955\r
cf40f28a 956 case USB_CLASS_SMART_CARD:\r
4d0a30a4 957 UefiDevicePathLibCatPrint (Str, L"UsbSmartCard");\r
cf40f28a 958 break;\r
95276127 959\r
cf40f28a 960 case USB_CLASS_VIDEO:\r
4d0a30a4 961 UefiDevicePathLibCatPrint (Str, L"UsbVideo");\r
cf40f28a 962 break;\r
963\r
964 case USB_CLASS_DIAGNOSTIC:\r
4d0a30a4 965 UefiDevicePathLibCatPrint (Str, L"UsbDiagnostic");\r
cf40f28a 966 break;\r
967\r
968 case USB_CLASS_WIRELESS:\r
4d0a30a4 969 UefiDevicePathLibCatPrint (Str, L"UsbWireless");\r
cf40f28a 970 break;\r
971\r
972 default:\r
973 IsKnownSubClass = FALSE;\r
974 break;\r
975 }\r
976\r
977 if (IsKnownSubClass) {\r
4d0a30a4 978 UefiDevicePathLibCatPrint (\r
cf40f28a 979 Str,\r
980 L"(0x%x,0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
981 UsbClass->VendorId,\r
982 UsbClass->ProductId,\r
983 UsbClass->DeviceSubClass,\r
984 UsbClass->DeviceProtocol\r
cf40f28a 985 );\r
986 return;\r
987 }\r
988\r
989 if (UsbClass->DeviceClass == USB_CLASS_RESERVE) {\r
990 if (UsbClass->DeviceSubClass == USB_SUBCLASS_FW_UPDATE) {\r
4d0a30a4 991 UefiDevicePathLibCatPrint (\r
95276127 992 Str,\r
cf40f28a 993 L"UsbDeviceFirmwareUpdate(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
994 UsbClass->VendorId,\r
995 UsbClass->ProductId,\r
996 UsbClass->DeviceProtocol\r
95276127 997 );\r
cf40f28a 998 return;\r
999 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_IRDA_BRIDGE) {\r
4d0a30a4 1000 UefiDevicePathLibCatPrint (\r
95276127 1001 Str,\r
cf40f28a 1002 L"UsbIrdaBridge(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
1003 UsbClass->VendorId,\r
1004 UsbClass->ProductId,\r
1005 UsbClass->DeviceProtocol\r
95276127 1006 );\r
cf40f28a 1007 return;\r
1008 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_TEST) {\r
4d0a30a4 1009 UefiDevicePathLibCatPrint (\r
95276127 1010 Str,\r
cf40f28a 1011 L"UsbTestAndMeasurement(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
1012 UsbClass->VendorId,\r
1013 UsbClass->ProductId,\r
1014 UsbClass->DeviceProtocol\r
95276127 1015 );\r
cf40f28a 1016 return;\r
95276127 1017 }\r
95276127 1018 }\r
1019\r
4d0a30a4 1020 UefiDevicePathLibCatPrint (\r
95276127 1021 Str,\r
cf40f28a 1022 L"UsbClass(0x%x,0x%x,0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
1023 UsbClass->VendorId,\r
1024 UsbClass->ProductId,\r
1025 UsbClass->DeviceClass,\r
1026 UsbClass->DeviceSubClass,\r
1027 UsbClass->DeviceProtocol\r
95276127 1028 );\r
1029}\r
1030\r
572f5d8a 1031/**\r
48557c65 1032 Converts a SATA device path structure to its string representative.\r
572f5d8a 1033\r
48557c65 1034 @param Str The string representative of input device.\r
572f5d8a 1035 @param DevPath The input device path structure.\r
1036 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1037 of the display node is used, where applicable. If DisplayOnly\r
1038 is FALSE, then the longer text representation of the display node\r
1039 is used.\r
1040 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1041 representation for a device node can be used, where applicable.\r
1042\r
1043**/\r
cf40f28a 1044VOID\r
1045DevPathToTextSata (\r
1046 IN OUT POOL_PRINT *Str,\r
1047 IN VOID *DevPath,\r
1048 IN BOOLEAN DisplayOnly,\r
1049 IN BOOLEAN AllowShortcuts\r
1050 )\r
1051{\r
1052 SATA_DEVICE_PATH *Sata;\r
1053\r
1054 Sata = DevPath;\r
9da38884
RN
1055 UefiDevicePathLibCatPrint (\r
1056 Str,\r
1057 L"Sata(0x%x,0x%x,0x%x)",\r
1058 Sata->HBAPortNumber,\r
1059 Sata->PortMultiplierPortNumber,\r
1060 Sata->Lun\r
1061 );\r
cf40f28a 1062}\r
1063\r
572f5d8a 1064/**\r
48557c65 1065 Converts a I20 device path structure to its string representative.\r
572f5d8a 1066\r
48557c65 1067 @param Str The string representative of input device.\r
572f5d8a 1068 @param DevPath The input device path structure.\r
1069 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1070 of the display node is used, where applicable. If DisplayOnly\r
1071 is FALSE, then the longer text representation of the display node\r
1072 is used.\r
1073 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1074 representation for a device node can be used, where applicable.\r
1075\r
1076**/\r
95276127 1077VOID\r
1078DevPathToTextI2O (\r
1079 IN OUT POOL_PRINT *Str,\r
1080 IN VOID *DevPath,\r
1081 IN BOOLEAN DisplayOnly,\r
1082 IN BOOLEAN AllowShortcuts\r
1083 )\r
1084{\r
572f5d8a 1085 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1086\r
572f5d8a 1087 I2ODevPath = DevPath;\r
4d0a30a4 1088 UefiDevicePathLibCatPrint (Str, L"I2O(0x%x)", I2ODevPath->Tid);\r
95276127 1089}\r
1090\r
572f5d8a 1091/**\r
48557c65 1092 Converts a MAC address device path structure to its string representative.\r
572f5d8a 1093\r
48557c65 1094 @param Str The string representative of input device.\r
572f5d8a 1095 @param DevPath The input device path structure.\r
1096 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1097 of the display node is used, where applicable. If DisplayOnly\r
1098 is FALSE, then the longer text representation of the display node\r
1099 is used.\r
1100 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1101 representation for a device node can be used, where applicable.\r
1102\r
1103**/\r
95276127 1104VOID\r
1105DevPathToTextMacAddr (\r
1106 IN OUT POOL_PRINT *Str,\r
1107 IN VOID *DevPath,\r
1108 IN BOOLEAN DisplayOnly,\r
1109 IN BOOLEAN AllowShortcuts\r
1110 )\r
1111{\r
572f5d8a 1112 MAC_ADDR_DEVICE_PATH *MacDevPath;\r
95276127 1113 UINTN HwAddressSize;\r
1114 UINTN Index;\r
1115\r
572f5d8a 1116 MacDevPath = DevPath;\r
95276127 1117\r
1118 HwAddressSize = sizeof (EFI_MAC_ADDRESS);\r
572f5d8a 1119 if (MacDevPath->IfType == 0x01 || MacDevPath->IfType == 0x00) {\r
95276127 1120 HwAddressSize = 6;\r
1121 }\r
1122\r
4d0a30a4 1123 UefiDevicePathLibCatPrint (Str, L"MAC(");\r
95276127 1124\r
1125 for (Index = 0; Index < HwAddressSize; Index++) {\r
4d0a30a4 1126 UefiDevicePathLibCatPrint (Str, L"%02x", MacDevPath->MacAddress.Addr[Index]);\r
95276127 1127 }\r
1128\r
4d0a30a4 1129 UefiDevicePathLibCatPrint (Str, L",0x%x)", MacDevPath->IfType);\r
95276127 1130}\r
1131\r
052019e1 1132/**\r
1133 Converts network protocol string to its text representation.\r
1134\r
1135 @param Str The string representative of input device.\r
1136 @param Protocol The network protocol ID.\r
1137\r
1138**/\r
1139VOID\r
1140CatNetworkProtocol (\r
1141 IN OUT POOL_PRINT *Str,\r
1142 IN UINT16 Protocol\r
1143 )\r
1144{\r
1145 if (Protocol == RFC_1700_TCP_PROTOCOL) {\r
4d0a30a4 1146 UefiDevicePathLibCatPrint (Str, L"TCP");\r
052019e1 1147 } else if (Protocol == RFC_1700_UDP_PROTOCOL) {\r
4d0a30a4 1148 UefiDevicePathLibCatPrint (Str, L"UDP");\r
052019e1 1149 } else {\r
4d0a30a4 1150 UefiDevicePathLibCatPrint (Str, L"0x%x", Protocol);\r
052019e1 1151 }\r
1152}\r
1153\r
4d0a30a4
RN
1154/**\r
1155 Converts IP v4 address to its text representation.\r
1156\r
1157 @param Str The string representative of input device.\r
1158 @param Address The IP v4 address.\r
1159**/\r
1160VOID\r
1161CatIPv4Address (\r
1162 IN OUT POOL_PRINT *Str,\r
1163 IN EFI_IPv4_ADDRESS *Address\r
1164 )\r
1165{\r
1166 UefiDevicePathLibCatPrint (Str, L"%d.%d.%d.%d", Address->Addr[0], Address->Addr[1], Address->Addr[2], Address->Addr[3]);\r
1167}\r
1168\r
1169/**\r
1170 Converts IP v6 address to its text representation.\r
1171\r
1172 @param Str The string representative of input device.\r
1173 @param Address The IP v6 address.\r
1174**/\r
1175VOID\r
1176CatIPv6Address (\r
1177 IN OUT POOL_PRINT *Str,\r
1178 IN EFI_IPv6_ADDRESS *Address\r
1179 )\r
1180{\r
1181 UefiDevicePathLibCatPrint (\r
1182 Str, L"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",\r
1183 Address->Addr[0], Address->Addr[1],\r
1184 Address->Addr[2], Address->Addr[3],\r
1185 Address->Addr[4], Address->Addr[5],\r
1186 Address->Addr[6], Address->Addr[7],\r
1187 Address->Addr[8], Address->Addr[9],\r
1188 Address->Addr[10], Address->Addr[11],\r
1189 Address->Addr[12], Address->Addr[13],\r
1190 Address->Addr[14], Address->Addr[15]\r
1191 );\r
1192}\r
1193\r
572f5d8a 1194/**\r
48557c65 1195 Converts a IPv4 device path structure to its string representative.\r
572f5d8a 1196\r
48557c65 1197 @param Str The string representative of input device.\r
572f5d8a 1198 @param DevPath The input device path structure.\r
1199 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1200 of the display node is used, where applicable. If DisplayOnly\r
1201 is FALSE, then the longer text representation of the display node\r
1202 is used.\r
1203 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1204 representation for a device node can be used, where applicable.\r
1205\r
1206**/\r
95276127 1207VOID\r
1208DevPathToTextIPv4 (\r
1209 IN OUT POOL_PRINT *Str,\r
1210 IN VOID *DevPath,\r
1211 IN BOOLEAN DisplayOnly,\r
1212 IN BOOLEAN AllowShortcuts\r
1213 )\r
1214{\r
572f5d8a 1215 IPv4_DEVICE_PATH *IPDevPath;\r
95276127 1216\r
572f5d8a 1217 IPDevPath = DevPath;\r
4d0a30a4
RN
1218 UefiDevicePathLibCatPrint (Str, L"IPv4(");\r
1219 CatIPv4Address (Str, &IPDevPath->RemoteIpAddress);\r
1220\r
572f5d8a 1221 if (DisplayOnly) {\r
4d0a30a4 1222 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1223 return ;\r
1224 }\r
1225\r
4d0a30a4
RN
1226 UefiDevicePathLibCatPrint (Str, L",");\r
1227 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1228\r
4d0a30a4
RN
1229 UefiDevicePathLibCatPrint (Str, L",%s,", IPDevPath->StaticIpAddress ? L"Static" : L"DHCP");\r
1230 CatIPv4Address (Str, &IPDevPath->LocalIpAddress);\r
e9b3cd55 1231 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv4_DEVICE_PATH)) {\r
4d0a30a4
RN
1232 UefiDevicePathLibCatPrint (Str, L",");\r
1233 CatIPv4Address (Str, &IPDevPath->GatewayIpAddress);\r
1234 UefiDevicePathLibCatPrint (Str, L",");\r
1235 CatIPv4Address (Str, &IPDevPath->SubnetMask);\r
e9b3cd55 1236 }\r
4d0a30a4 1237 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1238}\r
1239\r
572f5d8a 1240/**\r
48557c65 1241 Converts a IPv6 device path structure to its string representative.\r
572f5d8a 1242\r
48557c65 1243 @param Str The string representative of input device.\r
572f5d8a 1244 @param DevPath The input device path structure.\r
1245 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1246 of the display node is used, where applicable. If DisplayOnly\r
1247 is FALSE, then the longer text representation of the display node\r
1248 is used.\r
1249 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1250 representation for a device node can be used, where applicable.\r
1251\r
1252**/\r
95276127 1253VOID\r
1254DevPathToTextIPv6 (\r
1255 IN OUT POOL_PRINT *Str,\r
1256 IN VOID *DevPath,\r
1257 IN BOOLEAN DisplayOnly,\r
1258 IN BOOLEAN AllowShortcuts\r
1259 )\r
1260{\r
572f5d8a 1261 IPv6_DEVICE_PATH *IPDevPath;\r
95276127 1262\r
572f5d8a 1263 IPDevPath = DevPath;\r
4d0a30a4
RN
1264 UefiDevicePathLibCatPrint (Str, L"IPv6(");\r
1265 CatIPv6Address (Str, &IPDevPath->RemoteIpAddress);\r
572f5d8a 1266 if (DisplayOnly) {\r
4d0a30a4 1267 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1268 return ;\r
1269 }\r
4d0a30a4
RN
1270 \r
1271 UefiDevicePathLibCatPrint (Str, L",");\r
1272 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1273\r
501793fa
RN
1274 switch (IPDevPath->IpAddressOrigin) {\r
1275 case 0:\r
4d0a30a4 1276 UefiDevicePathLibCatPrint (Str, L",Static,");\r
501793fa
RN
1277 break;\r
1278 case 1:\r
4d0a30a4 1279 UefiDevicePathLibCatPrint (Str, L",StatelessAutoConfigure,");\r
501793fa
RN
1280 break;\r
1281 default:\r
4d0a30a4 1282 UefiDevicePathLibCatPrint (Str, L",StatefulAutoConfigure,");\r
501793fa
RN
1283 break;\r
1284 }\r
1285\r
4d0a30a4 1286 CatIPv6Address (Str, &IPDevPath->LocalIpAddress);\r
501793fa
RN
1287\r
1288 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv6_DEVICE_PATH)) {\r
4d0a30a4
RN
1289 UefiDevicePathLibCatPrint (Str, L",0x%x,", IPDevPath->PrefixLength);\r
1290 CatIPv6Address (Str, &IPDevPath->GatewayIpAddress);\r
501793fa 1291 }\r
4d0a30a4 1292 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1293}\r
1294\r
572f5d8a 1295/**\r
48557c65 1296 Converts an Infini Band device path structure to its string representative.\r
572f5d8a 1297\r
48557c65 1298 @param Str The string representative of input device.\r
572f5d8a 1299 @param DevPath The input device path structure.\r
1300 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1301 of the display node is used, where applicable. If DisplayOnly\r
1302 is FALSE, then the longer text representation of the display node\r
1303 is used.\r
1304 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1305 representation for a device node can be used, where applicable.\r
1306\r
1307**/\r
95276127 1308VOID\r
1309DevPathToTextInfiniBand (\r
1310 IN OUT POOL_PRINT *Str,\r
1311 IN VOID *DevPath,\r
1312 IN BOOLEAN DisplayOnly,\r
1313 IN BOOLEAN AllowShortcuts\r
1314 )\r
1315{\r
1316 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1317\r
1318 InfiniBand = DevPath;\r
4d0a30a4 1319 UefiDevicePathLibCatPrint (\r
95276127 1320 Str,\r
cf40f28a 1321 L"Infiniband(0x%x,%g,0x%lx,0x%lx,0x%lx)",\r
e9b3cd55 1322 InfiniBand->ResourceFlags,\r
95276127 1323 InfiniBand->PortGid,\r
1324 InfiniBand->ServiceId,\r
1325 InfiniBand->TargetPortId,\r
1326 InfiniBand->DeviceId\r
1327 );\r
1328}\r
1329\r
572f5d8a 1330/**\r
48557c65 1331 Converts a UART device path structure to its string representative.\r
572f5d8a 1332\r
48557c65 1333 @param Str The string representative of input device.\r
572f5d8a 1334 @param DevPath The input device path structure.\r
1335 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1336 of the display node is used, where applicable. If DisplayOnly\r
1337 is FALSE, then the longer text representation of the display node\r
1338 is used.\r
1339 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1340 representation for a device node can be used, where applicable.\r
1341\r
1342**/\r
95276127 1343VOID\r
1344DevPathToTextUart (\r
1345 IN OUT POOL_PRINT *Str,\r
1346 IN VOID *DevPath,\r
1347 IN BOOLEAN DisplayOnly,\r
1348 IN BOOLEAN AllowShortcuts\r
1349 )\r
1350{\r
1351 UART_DEVICE_PATH *Uart;\r
1352 CHAR8 Parity;\r
1353\r
1354 Uart = DevPath;\r
1355 switch (Uart->Parity) {\r
1356 case 0:\r
1357 Parity = 'D';\r
1358 break;\r
1359\r
1360 case 1:\r
1361 Parity = 'N';\r
1362 break;\r
1363\r
1364 case 2:\r
1365 Parity = 'E';\r
1366 break;\r
1367\r
1368 case 3:\r
1369 Parity = 'O';\r
1370 break;\r
1371\r
1372 case 4:\r
1373 Parity = 'M';\r
1374 break;\r
1375\r
1376 case 5:\r
1377 Parity = 'S';\r
1378 break;\r
1379\r
1380 default:\r
1381 Parity = 'x';\r
1382 break;\r
1383 }\r
1384\r
1385 if (Uart->BaudRate == 0) {\r
4d0a30a4 1386 UefiDevicePathLibCatPrint (Str, L"Uart(DEFAULT,");\r
95276127 1387 } else {\r
4d0a30a4 1388 UefiDevicePathLibCatPrint (Str, L"Uart(%ld,", Uart->BaudRate);\r
95276127 1389 }\r
1390\r
1391 if (Uart->DataBits == 0) {\r
4d0a30a4 1392 UefiDevicePathLibCatPrint (Str, L"DEFAULT,");\r
95276127 1393 } else {\r
4d0a30a4 1394 UefiDevicePathLibCatPrint (Str, L"%d,", Uart->DataBits);\r
95276127 1395 }\r
1396\r
4d0a30a4 1397 UefiDevicePathLibCatPrint (Str, L"%c,", Parity);\r
95276127 1398\r
1399 switch (Uart->StopBits) {\r
1400 case 0:\r
4d0a30a4 1401 UefiDevicePathLibCatPrint (Str, L"D)");\r
95276127 1402 break;\r
1403\r
1404 case 1:\r
4d0a30a4 1405 UefiDevicePathLibCatPrint (Str, L"1)");\r
95276127 1406 break;\r
1407\r
1408 case 2:\r
4d0a30a4 1409 UefiDevicePathLibCatPrint (Str, L"1.5)");\r
95276127 1410 break;\r
1411\r
1412 case 3:\r
4d0a30a4 1413 UefiDevicePathLibCatPrint (Str, L"2)");\r
95276127 1414 break;\r
1415\r
1416 default:\r
4d0a30a4 1417 UefiDevicePathLibCatPrint (Str, L"x)");\r
95276127 1418 break;\r
1419 }\r
1420}\r
1421\r
572f5d8a 1422/**\r
48557c65 1423 Converts an iSCSI device path structure to its string representative.\r
572f5d8a 1424\r
48557c65 1425 @param Str The string representative of input device.\r
572f5d8a 1426 @param DevPath The input device path structure.\r
1427 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1428 of the display node is used, where applicable. If DisplayOnly\r
1429 is FALSE, then the longer text representation of the display node\r
1430 is used.\r
1431 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1432 representation for a device node can be used, where applicable.\r
1433\r
1434**/\r
95276127 1435VOID\r
1436DevPathToTextiSCSI (\r
1437 IN OUT POOL_PRINT *Str,\r
1438 IN VOID *DevPath,\r
1439 IN BOOLEAN DisplayOnly,\r
1440 IN BOOLEAN AllowShortcuts\r
1441 )\r
1442{\r
572f5d8a 1443 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
95276127 1444 UINT16 Options;\r
1445\r
572f5d8a 1446 ISCSIDevPath = DevPath;\r
4d0a30a4 1447 UefiDevicePathLibCatPrint (\r
95276127 1448 Str,\r
cf40f28a 1449 L"iSCSI(%a,0x%x,0x%lx,",\r
184f7d83 1450 ISCSIDevPath->TargetName,\r
e9b3cd55 1451 ISCSIDevPath->TargetPortalGroupTag,\r
572f5d8a 1452 ISCSIDevPath->Lun\r
95276127 1453 );\r
1454\r
572f5d8a 1455 Options = ISCSIDevPath->LoginOption;\r
4d0a30a4
RN
1456 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
1457 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
572f5d8a 1458 if (((Options >> 11) & 0x0001) != 0) {\r
4d0a30a4 1459 UefiDevicePathLibCatPrint (Str, L"%s,", L"None");\r
572f5d8a 1460 } else if (((Options >> 12) & 0x0001) != 0) {\r
4d0a30a4 1461 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_UNI");\r
95276127 1462 } else {\r
4d0a30a4 1463 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_BI");\r
95276127 1464\r
1465 }\r
1466\r
4d0a30a4 1467 UefiDevicePathLibCatPrint (Str, L"%s)", (ISCSIDevPath->NetworkProtocol == 0) ? L"TCP" : L"reserved");\r
95276127 1468}\r
1469\r
8f97f911 1470/**\r
1471 Converts a VLAN device path structure to its string representative.\r
1472\r
1473 @param Str The string representative of input device.\r
1474 @param DevPath The input device path structure.\r
1475 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1476 of the display node is used, where applicable. If DisplayOnly\r
1477 is FALSE, then the longer text representation of the display node\r
1478 is used.\r
1479 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1480 representation for a device node can be used, where applicable.\r
1481\r
1482**/\r
1483VOID\r
1484DevPathToTextVlan (\r
1485 IN OUT POOL_PRINT *Str,\r
1486 IN VOID *DevPath,\r
1487 IN BOOLEAN DisplayOnly,\r
1488 IN BOOLEAN AllowShortcuts\r
1489 )\r
1490{\r
1491 VLAN_DEVICE_PATH *Vlan;\r
1492\r
1493 Vlan = DevPath;\r
4d0a30a4 1494 UefiDevicePathLibCatPrint (Str, L"Vlan(%d)", Vlan->VlanId);\r
8f97f911 1495}\r
1496\r
572f5d8a 1497/**\r
48557c65 1498 Converts a Hard drive device path structure to its string representative.\r
572f5d8a 1499\r
48557c65 1500 @param Str The string representative of input device.\r
572f5d8a 1501 @param DevPath The input device path structure.\r
1502 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1503 of the display node is used, where applicable. If DisplayOnly\r
1504 is FALSE, then the longer text representation of the display node\r
1505 is used.\r
1506 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1507 representation for a device node can be used, where applicable.\r
1508\r
1509**/\r
95276127 1510VOID\r
1511DevPathToTextHardDrive (\r
1512 IN OUT POOL_PRINT *Str,\r
1513 IN VOID *DevPath,\r
1514 IN BOOLEAN DisplayOnly,\r
1515 IN BOOLEAN AllowShortcuts\r
1516 )\r
1517{\r
1518 HARDDRIVE_DEVICE_PATH *Hd;\r
1519\r
1520 Hd = DevPath;\r
1521 switch (Hd->SignatureType) {\r
95276127 1522 case SIGNATURE_TYPE_MBR:\r
4d0a30a4 1523 UefiDevicePathLibCatPrint (\r
95276127 1524 Str,\r
cf40f28a 1525 L"HD(%d,%s,0x%08x,",\r
e9b3cd55 1526 Hd->PartitionNumber,\r
95276127 1527 L"MBR",\r
e9b3cd55 1528 *((UINT32 *) (&(Hd->Signature[0])))\r
95276127 1529 );\r
1530 break;\r
1531\r
1532 case SIGNATURE_TYPE_GUID:\r
4d0a30a4 1533 UefiDevicePathLibCatPrint (\r
95276127 1534 Str,\r
1535 L"HD(%d,%s,%g,",\r
e9b3cd55 1536 Hd->PartitionNumber,\r
cf40f28a 1537 L"GPT",\r
95276127 1538 (EFI_GUID *) &(Hd->Signature[0])\r
1539 );\r
1540 break;\r
1541\r
1542 default:\r
4d0a30a4 1543 UefiDevicePathLibCatPrint (\r
cf40f28a 1544 Str,\r
1545 L"HD(%d,%d,0,",\r
e9b3cd55
RN
1546 Hd->PartitionNumber,\r
1547 Hd->SignatureType\r
cf40f28a 1548 );\r
95276127 1549 break;\r
1550 }\r
1551\r
4d0a30a4 1552 UefiDevicePathLibCatPrint (Str, L"0x%lx,0x%lx)", Hd->PartitionStart, Hd->PartitionSize);\r
95276127 1553}\r
1554\r
572f5d8a 1555/**\r
48557c65 1556 Converts a CDROM device path structure to its string representative.\r
572f5d8a 1557\r
48557c65 1558 @param Str The string representative of input device.\r
572f5d8a 1559 @param DevPath The input device path structure.\r
1560 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1561 of the display node is used, where applicable. If DisplayOnly\r
1562 is FALSE, then the longer text representation of the display node\r
1563 is used.\r
1564 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1565 representation for a device node can be used, where applicable.\r
1566\r
1567**/\r
95276127 1568VOID\r
1569DevPathToTextCDROM (\r
1570 IN OUT POOL_PRINT *Str,\r
1571 IN VOID *DevPath,\r
1572 IN BOOLEAN DisplayOnly,\r
1573 IN BOOLEAN AllowShortcuts\r
1574 )\r
1575{\r
1576 CDROM_DEVICE_PATH *Cd;\r
1577\r
1578 Cd = DevPath;\r
572f5d8a 1579 if (DisplayOnly) {\r
4d0a30a4 1580 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x)", Cd->BootEntry);\r
95276127 1581 return ;\r
1582 }\r
1583\r
4d0a30a4 1584 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x,0x%lx,0x%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize);\r
95276127 1585}\r
1586\r
572f5d8a 1587/**\r
48557c65 1588 Converts a File device path structure to its string representative.\r
572f5d8a 1589\r
48557c65 1590 @param Str The string representative of input device.\r
572f5d8a 1591 @param DevPath The input device path structure.\r
1592 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1593 of the display node is used, where applicable. If DisplayOnly\r
1594 is FALSE, then the longer text representation of the display node\r
1595 is used.\r
1596 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1597 representation for a device node can be used, where applicable.\r
1598\r
1599**/\r
95276127 1600VOID\r
1601DevPathToTextFilePath (\r
1602 IN OUT POOL_PRINT *Str,\r
1603 IN VOID *DevPath,\r
1604 IN BOOLEAN DisplayOnly,\r
1605 IN BOOLEAN AllowShortcuts\r
1606 )\r
1607{\r
1608 FILEPATH_DEVICE_PATH *Fp;\r
1609\r
1610 Fp = DevPath;\r
4d0a30a4 1611 UefiDevicePathLibCatPrint (Str, L"%s", Fp->PathName);\r
95276127 1612}\r
1613\r
572f5d8a 1614/**\r
48557c65 1615 Converts a Media protocol device path structure to its string representative.\r
572f5d8a 1616\r
48557c65 1617 @param Str The string representative of input device.\r
572f5d8a 1618 @param DevPath The input device path structure.\r
1619 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1620 of the display node is used, where applicable. If DisplayOnly\r
1621 is FALSE, then the longer text representation of the display node\r
1622 is used.\r
1623 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1624 representation for a device node can be used, where applicable.\r
1625\r
1626**/\r
95276127 1627VOID\r
1628DevPathToTextMediaProtocol (\r
1629 IN OUT POOL_PRINT *Str,\r
1630 IN VOID *DevPath,\r
1631 IN BOOLEAN DisplayOnly,\r
1632 IN BOOLEAN AllowShortcuts\r
1633 )\r
1634{\r
1635 MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;\r
1636\r
1637 MediaProt = DevPath;\r
4d0a30a4 1638 UefiDevicePathLibCatPrint (Str, L"Media(%g)", &MediaProt->Protocol);\r
95276127 1639}\r
1640\r
572f5d8a 1641/**\r
48557c65 1642 Converts a Firmware Volume device path structure to its string representative.\r
572f5d8a 1643\r
48557c65 1644 @param Str The string representative of input device.\r
572f5d8a 1645 @param DevPath The input device path structure.\r
1646 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1647 of the display node is used, where applicable. If DisplayOnly\r
1648 is FALSE, then the longer text representation of the display node\r
1649 is used.\r
1650 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1651 representation for a device node can be used, where applicable.\r
1652\r
1653**/\r
cf40f28a 1654VOID\r
1655DevPathToTextFv (\r
1656 IN OUT POOL_PRINT *Str,\r
1657 IN VOID *DevPath,\r
1658 IN BOOLEAN DisplayOnly,\r
1659 IN BOOLEAN AllowShortcuts\r
1660 )\r
1661{\r
1662 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
1663\r
1664 Fv = DevPath;\r
4d0a30a4 1665 UefiDevicePathLibCatPrint (Str, L"Fv(%g)", &Fv->FvName);\r
cf40f28a 1666}\r
1667\r
572f5d8a 1668/**\r
48557c65 1669 Converts a Firmware Volume File device path structure to its string representative.\r
572f5d8a 1670\r
48557c65 1671 @param Str The string representative of input device.\r
572f5d8a 1672 @param DevPath The input device path structure.\r
1673 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1674 of the display node is used, where applicable. If DisplayOnly\r
1675 is FALSE, then the longer text representation of the display node\r
1676 is used.\r
1677 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1678 representation for a device node can be used, where applicable.\r
1679\r
1680**/\r
cf40f28a 1681VOID\r
1682DevPathToTextFvFile (\r
1683 IN OUT POOL_PRINT *Str,\r
1684 IN VOID *DevPath,\r
1685 IN BOOLEAN DisplayOnly,\r
1686 IN BOOLEAN AllowShortcuts\r
1687 )\r
1688{\r
1689 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
1690\r
1691 FvFile = DevPath;\r
4d0a30a4 1692 UefiDevicePathLibCatPrint (Str, L"FvFile(%g)", &FvFile->FvFileName);\r
cf40f28a 1693}\r
1694\r
09e15613 1695/**\r
1696 Converts a Relative Offset device path structure to its string representative.\r
1697\r
1698 @param Str The string representative of input device.\r
1699 @param DevPath The input device path structure.\r
1700 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1701 of the display node is used, where applicable. If DisplayOnly\r
1702 is FALSE, then the longer text representation of the display node\r
1703 is used.\r
1704 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1705 representation for a device node can be used, where applicable.\r
1706\r
1707**/\r
1708VOID\r
1709DevPathRelativeOffsetRange (\r
1710 IN OUT POOL_PRINT *Str,\r
1711 IN VOID *DevPath,\r
1712 IN BOOLEAN DisplayOnly,\r
1713 IN BOOLEAN AllowShortcuts\r
1714 )\r
1715{\r
1716 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
1717\r
1718 Offset = DevPath;\r
4d0a30a4 1719 UefiDevicePathLibCatPrint (\r
09e15613 1720 Str,\r
7748eb28 1721 L"Offset(0x%lx,0x%lx)",\r
09e15613 1722 Offset->StartingOffset,\r
1723 Offset->EndingOffset\r
1724 );\r
1725}\r
1726\r
572f5d8a 1727/**\r
48557c65 1728 Converts a BIOS Boot Specification device path structure to its string representative.\r
572f5d8a 1729\r
48557c65 1730 @param Str The string representative of input device.\r
572f5d8a 1731 @param DevPath The input device path structure.\r
1732 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1733 of the display node is used, where applicable. If DisplayOnly\r
1734 is FALSE, then the longer text representation of the display node\r
1735 is used.\r
1736 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1737 representation for a device node can be used, where applicable.\r
1738\r
1739**/\r
95276127 1740VOID\r
1741DevPathToTextBBS (\r
1742 IN OUT POOL_PRINT *Str,\r
1743 IN VOID *DevPath,\r
1744 IN BOOLEAN DisplayOnly,\r
1745 IN BOOLEAN AllowShortcuts\r
1746 )\r
1747{\r
1748 BBS_BBS_DEVICE_PATH *Bbs;\r
1749 CHAR16 *Type;\r
1750\r
1751 Bbs = DevPath;\r
1752 switch (Bbs->DeviceType) {\r
1753 case BBS_TYPE_FLOPPY:\r
1754 Type = L"Floppy";\r
1755 break;\r
1756\r
1757 case BBS_TYPE_HARDDRIVE:\r
1758 Type = L"HD";\r
1759 break;\r
1760\r
1761 case BBS_TYPE_CDROM:\r
1762 Type = L"CDROM";\r
1763 break;\r
1764\r
1765 case BBS_TYPE_PCMCIA:\r
1766 Type = L"PCMCIA";\r
1767 break;\r
1768\r
1769 case BBS_TYPE_USB:\r
1770 Type = L"USB";\r
1771 break;\r
1772\r
1773 case BBS_TYPE_EMBEDDED_NETWORK:\r
1774 Type = L"Network";\r
1775 break;\r
1776\r
1777 default:\r
cf40f28a 1778 Type = NULL;\r
95276127 1779 break;\r
1780 }\r
1781\r
cf40f28a 1782 if (Type != NULL) {\r
4d0a30a4 1783 UefiDevicePathLibCatPrint (Str, L"BBS(%s,%a", Type, Bbs->String);\r
cf40f28a 1784 } else {\r
4d0a30a4 1785 UefiDevicePathLibCatPrint (Str, L"BBS(0x%x,%a", Bbs->DeviceType, Bbs->String);\r
cf40f28a 1786 }\r
95276127 1787\r
572f5d8a 1788 if (DisplayOnly) {\r
4d0a30a4 1789 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1790 return ;\r
1791 }\r
1792\r
4d0a30a4 1793 UefiDevicePathLibCatPrint (Str, L",0x%x)", Bbs->StatusFlag);\r
95276127 1794}\r
1795\r
572f5d8a 1796/**\r
48557c65 1797 Converts an End-of-Device-Path structure to its string representative.\r
572f5d8a 1798\r
48557c65 1799 @param Str The string representative of input device.\r
572f5d8a 1800 @param DevPath The input device path structure.\r
1801 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1802 of the display node is used, where applicable. If DisplayOnly\r
1803 is FALSE, then the longer text representation of the display node\r
1804 is used.\r
1805 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1806 representation for a device node can be used, where applicable.\r
1807\r
1808**/\r
95276127 1809VOID\r
1810DevPathToTextEndInstance (\r
1811 IN OUT POOL_PRINT *Str,\r
1812 IN VOID *DevPath,\r
1813 IN BOOLEAN DisplayOnly,\r
1814 IN BOOLEAN AllowShortcuts\r
1815 )\r
1816{\r
4d0a30a4 1817 UefiDevicePathLibCatPrint (Str, L",");\r
95276127 1818}\r
1819\r
5d6a5aee
RN
1820GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_GENERIC_TABLE mUefiDevicePathLibToTextTableGeneric[] = {\r
1821 {HARDWARE_DEVICE_PATH, L"HardwarePath" },\r
1822 {ACPI_DEVICE_PATH, L"AcpiPath" },\r
1823 {MESSAGING_DEVICE_PATH, L"Msg" },\r
1824 {MEDIA_DEVICE_PATH, L"MediaPath" },\r
1825 {BBS_DEVICE_PATH, L"BbsPath" },\r
1826 {0, NULL}\r
1827};\r
1828\r
572f5d8a 1829/**\r
48557c65 1830 Converts an unknown device path structure to its string representative.\r
572f5d8a 1831\r
48557c65 1832 @param Str The string representative of input device.\r
572f5d8a 1833 @param DevPath The input device path structure.\r
1834 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1835 of the display node is used, where applicable. If DisplayOnly\r
1836 is FALSE, then the longer text representation of the display node\r
1837 is used.\r
1838 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1839 representation for a device node can be used, where applicable.\r
1840\r
1841**/\r
95276127 1842VOID\r
5d6a5aee 1843DevPathToTextNodeGeneric (\r
95276127 1844 IN OUT POOL_PRINT *Str,\r
1845 IN VOID *DevPath,\r
1846 IN BOOLEAN DisplayOnly,\r
1847 IN BOOLEAN AllowShortcuts\r
1848 )\r
1849{\r
5d6a5aee
RN
1850 EFI_DEVICE_PATH_PROTOCOL *Node;\r
1851 UINTN Index;\r
1852\r
1853 Node = DevPath;\r
1854\r
1855 for (Index = 0; mUefiDevicePathLibToTextTableGeneric[Index].Text != NULL; Index++) {\r
1856 if (DevicePathType (Node) == mUefiDevicePathLibToTextTableGeneric[Index].Type) {\r
1857 break;\r
1858 }\r
1859 }\r
1860\r
1861 if (mUefiDevicePathLibToTextTableGeneric[Index].Text == NULL) {\r
1862 //\r
1863 // It's a node whose type cannot be recognized\r
1864 //\r
1865 UefiDevicePathLibCatPrint (Str, L"Path(%d,%d", DevicePathType (Node), DevicePathSubType (Node));\r
1866 } else {\r
1867 //\r
1868 // It's a node whose type can be recognized\r
1869 //\r
1870 UefiDevicePathLibCatPrint (Str, L"%s(%d", mUefiDevicePathLibToTextTableGeneric[Index].Text, DevicePathSubType (Node));\r
1871 }\r
1872\r
1873 Index = sizeof (EFI_DEVICE_PATH_PROTOCOL);\r
1874 if (Index < DevicePathNodeLength (Node)) {\r
1875 UefiDevicePathLibCatPrint (Str, L",");\r
1876 for (; Index < DevicePathNodeLength (Node); Index++) {\r
1877 UefiDevicePathLibCatPrint (Str, L"%02x", ((UINT8 *) Node)[Index]);\r
1878 }\r
1879 }\r
1880\r
1881 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1882}\r
1883\r
5d6a5aee 1884GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLibToTextTable[] = {\r
4d0a30a4
RN
1885 {HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci },\r
1886 {HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard },\r
1887 {HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap },\r
1888 {HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor },\r
1889 {HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController },\r
1890 {ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi },\r
1891 {ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextAcpiEx },\r
1892 {ACPI_DEVICE_PATH, ACPI_ADR_DP, DevPathToTextAcpiAdr },\r
1893 {MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi },\r
1894 {MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi },\r
1895 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre },\r
1896 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, DevPathToTextFibreEx },\r
1897 {MESSAGING_DEVICE_PATH, MSG_SASEX_DP, DevPathToTextSasEx },\r
a06ec3e2 1898 {MESSAGING_DEVICE_PATH, MSG_NVME_NAMESPACE_DP, DevPathToTextNVMe },\r
52306166 1899 {MESSAGING_DEVICE_PATH, MSG_UFS_DP, DevPathToTextUfs },\r
4d0a30a4
RN
1900 {MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394 },\r
1901 {MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb },\r
1902 {MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID },\r
1903 {MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit },\r
1904 {MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass },\r
1905 {MESSAGING_DEVICE_PATH, MSG_SATA_DP, DevPathToTextSata },\r
1906 {MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O },\r
1907 {MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr },\r
1908 {MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4 },\r
1909 {MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6 },\r
1910 {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand },\r
1911 {MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart },\r
1912 {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor },\r
1913 {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI },\r
1914 {MESSAGING_DEVICE_PATH, MSG_VLAN_DP, DevPathToTextVlan },\r
1915 {MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive },\r
1916 {MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM },\r
1917 {MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor },\r
1918 {MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol },\r
1919 {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath },\r
1920 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_VOL_DP, DevPathToTextFv },\r
1921 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_FILE_DP, DevPathToTextFvFile },\r
1922 {MEDIA_DEVICE_PATH, MEDIA_RELATIVE_OFFSET_RANGE_DP, DevPathRelativeOffsetRange },\r
1923 {BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS },\r
1924 {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance },\r
95276127 1925 {0, 0, NULL}\r
1926};\r
1927\r
572f5d8a 1928/**\r
1929 Converts a device node to its string representation.\r
1930\r
1931 @param DeviceNode A Pointer to the device node to be converted.\r
1932 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1933 of the display node is used, where applicable. If DisplayOnly\r
1934 is FALSE, then the longer text representation of the display node\r
1935 is used.\r
1936 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1937 representation for a device node can be used, where applicable.\r
1938\r
1939 @return A pointer to the allocated text representation of the device node or NULL if DeviceNode\r
1940 is NULL or there was insufficient memory.\r
1941\r
1942**/\r
95276127 1943CHAR16 *\r
572f5d8a 1944EFIAPI\r
4d0a30a4 1945UefiDevicePathLibConvertDeviceNodeToText (\r
95276127 1946 IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,\r
1947 IN BOOLEAN DisplayOnly,\r
1948 IN BOOLEAN AllowShortcuts\r
1949 )\r
95276127 1950{\r
4d0a30a4
RN
1951 POOL_PRINT Str;\r
1952 UINTN Index;\r
1953 DEVICE_PATH_TO_TEXT ToText;\r
95276127 1954\r
1955 if (DeviceNode == NULL) {\r
1956 return NULL;\r
1957 }\r
1958\r
1959 ZeroMem (&Str, sizeof (Str));\r
1960\r
1961 //\r
1962 // Process the device path node\r
4d0a30a4 1963 // If not found, use a generic function\r
95276127 1964 //\r
5d6a5aee
RN
1965 ToText = DevPathToTextNodeGeneric;\r
1966 for (Index = 0; mUefiDevicePathLibToTextTable[Index].Function != NULL; Index++) {\r
1967 if (DevicePathType (DeviceNode) == mUefiDevicePathLibToTextTable[Index].Type &&\r
1968 DevicePathSubType (DeviceNode) == mUefiDevicePathLibToTextTable[Index].SubType\r
95276127 1969 ) {\r
5d6a5aee 1970 ToText = mUefiDevicePathLibToTextTable[Index].Function;\r
95276127 1971 break;\r
1972 }\r
1973 }\r
95276127 1974\r
1975 //\r
1976 // Print this node\r
1977 //\r
4d0a30a4 1978 ToText (&Str, (VOID *) DeviceNode, DisplayOnly, AllowShortcuts);\r
95276127 1979\r
9d4af8fc 1980 ASSERT (Str.Str != NULL);\r
95276127 1981 return Str.Str;\r
1982}\r
1983\r
572f5d8a 1984/**\r
1985 Converts a device path to its text representation.\r
95276127 1986\r
572f5d8a 1987 @param DevicePath A Pointer to the device to be converted.\r
1988 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
95276127 1989 of the display node is used, where applicable. If DisplayOnly\r
1990 is FALSE, then the longer text representation of the display node\r
1991 is used.\r
572f5d8a 1992 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
95276127 1993 representation for a device node can be used, where applicable.\r
1994\r
572f5d8a 1995 @return A pointer to the allocated text representation of the device path or\r
1996 NULL if DeviceNode is NULL or there was insufficient memory.\r
95276127 1997\r
572f5d8a 1998**/\r
1999CHAR16 *\r
2000EFIAPI\r
4d0a30a4 2001UefiDevicePathLibConvertDevicePathToText (\r
572f5d8a 2002 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
2003 IN BOOLEAN DisplayOnly,\r
2004 IN BOOLEAN AllowShortcuts\r
2005 )\r
95276127 2006{\r
4d0a30a4
RN
2007 POOL_PRINT Str;\r
2008 EFI_DEVICE_PATH_PROTOCOL *Node;\r
2009 EFI_DEVICE_PATH_PROTOCOL *AlignedNode;\r
2010 UINTN Index;\r
2011 DEVICE_PATH_TO_TEXT ToText;\r
95276127 2012\r
2013 if (DevicePath == NULL) {\r
2014 return NULL;\r
2015 }\r
2016\r
2017 ZeroMem (&Str, sizeof (Str));\r
2018\r
95276127 2019 //\r
2020 // Process each device path node\r
2021 //\r
4d0a30a4
RN
2022 Node = (EFI_DEVICE_PATH_PROTOCOL *) DevicePath;\r
2023 while (!IsDevicePathEnd (Node)) {\r
95276127 2024 //\r
2025 // Find the handler to dump this device path node\r
4d0a30a4 2026 // If not found, use a generic function\r
95276127 2027 //\r
5d6a5aee
RN
2028 ToText = DevPathToTextNodeGeneric;\r
2029 for (Index = 0; mUefiDevicePathLibToTextTable[Index].Function != NULL; Index += 1) {\r
95276127 2030\r
5d6a5aee
RN
2031 if (DevicePathType (Node) == mUefiDevicePathLibToTextTable[Index].Type &&\r
2032 DevicePathSubType (Node) == mUefiDevicePathLibToTextTable[Index].SubType\r
95276127 2033 ) {\r
5d6a5aee 2034 ToText = mUefiDevicePathLibToTextTable[Index].Function;\r
95276127 2035 break;\r
2036 }\r
2037 }\r
2038 //\r
5755841f 2039 // Put a path separator in if needed\r
95276127 2040 //\r
4d0a30a4
RN
2041 if ((Str.Count != 0) && (ToText != DevPathToTextEndInstance)) {\r
2042 if (Str.Str[Str.Count] != L',') {\r
2043 UefiDevicePathLibCatPrint (&Str, L"/");\r
cf40f28a 2044 }\r
95276127 2045 }\r
1232b214 2046 \r
4d0a30a4 2047 AlignedNode = AllocateCopyPool (DevicePathNodeLength (Node), Node);\r
95276127 2048 //\r
2049 // Print this node of the device path\r
2050 //\r
4d0a30a4
RN
2051 ToText (&Str, AlignedNode, DisplayOnly, AllowShortcuts);\r
2052 FreePool (AlignedNode);\r
1232b214 2053 \r
95276127 2054 //\r
2055 // Next device path node\r
2056 //\r
4d0a30a4 2057 Node = NextDevicePathNode (Node);\r
95276127 2058 }\r
95276127 2059\r
9d4af8fc
RN
2060 if (Str.Str == NULL) {\r
2061 return AllocateZeroPool (sizeof (CHAR16));\r
2062 } else {\r
2063 return Str.Str;\r
2064 }\r
95276127 2065}\r