]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
Fix wrong parameter usage in GenericBdsLibConstructor
[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
4d0a30a4 4Copyright (c) 2013, 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
572f5d8a 699/**\r
48557c65 700 Converts a 1394 device path structure to its string representative.\r
572f5d8a 701\r
48557c65 702 @param Str The string representative of input device.\r
572f5d8a 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
95276127 712VOID\r
713DevPathToText1394 (\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
572f5d8a 720 F1394_DEVICE_PATH *F1394DevPath;\r
95276127 721\r
572f5d8a 722 F1394DevPath = DevPath;\r
cf40f28a 723 //\r
724 // Guid has format of IEEE-EUI64\r
725 //\r
4d0a30a4 726 UefiDevicePathLibCatPrint (Str, L"I1394(%016lx)", F1394DevPath->Guid);\r
95276127 727}\r
728\r
572f5d8a 729/**\r
48557c65 730 Converts a USB device path structure to its string representative.\r
572f5d8a 731\r
48557c65 732 @param Str The string representative of input device.\r
572f5d8a 733 @param DevPath The input device path structure.\r
734 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
735 of the display node is used, where applicable. If DisplayOnly\r
736 is FALSE, then the longer text representation of the display node\r
737 is used.\r
738 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
739 representation for a device node can be used, where applicable.\r
740\r
741**/\r
95276127 742VOID\r
743DevPathToTextUsb (\r
744 IN OUT POOL_PRINT *Str,\r
745 IN VOID *DevPath,\r
746 IN BOOLEAN DisplayOnly,\r
747 IN BOOLEAN AllowShortcuts\r
748 )\r
749{\r
750 USB_DEVICE_PATH *Usb;\r
751\r
752 Usb = DevPath;\r
4d0a30a4 753 UefiDevicePathLibCatPrint (Str, L"USB(0x%x,0x%x)", Usb->ParentPortNumber, Usb->InterfaceNumber);\r
95276127 754}\r
755\r
572f5d8a 756/**\r
48557c65 757 Converts a USB WWID device path structure to its string representative.\r
572f5d8a 758\r
48557c65 759 @param Str The string representative of input device.\r
572f5d8a 760 @param DevPath The input device path structure.\r
761 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
762 of the display node is used, where applicable. If DisplayOnly\r
763 is FALSE, then the longer text representation of the display node\r
764 is used.\r
765 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
766 representation for a device node can be used, where applicable.\r
767\r
768**/\r
95276127 769VOID\r
770DevPathToTextUsbWWID (\r
771 IN OUT POOL_PRINT *Str,\r
772 IN VOID *DevPath,\r
773 IN BOOLEAN DisplayOnly,\r
774 IN BOOLEAN AllowShortcuts\r
775 )\r
776{\r
777 USB_WWID_DEVICE_PATH *UsbWWId;\r
cf40f28a 778 CHAR16 *SerialNumberStr;\r
779 CHAR16 *NewStr;\r
780 UINT16 Length;\r
95276127 781\r
782 UsbWWId = DevPath;\r
cf40f28a 783\r
784 SerialNumberStr = (CHAR16 *) ((UINT8 *) UsbWWId + sizeof (USB_WWID_DEVICE_PATH));\r
785 Length = (UINT16) ((DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) UsbWWId) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16));\r
786 if (SerialNumberStr [Length - 1] != 0) {\r
787 //\r
788 // In case no NULL terminator in SerialNumber, create a new one with NULL terminator\r
789 //\r
790 NewStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), SerialNumberStr);\r
3069bc19 791 ASSERT (NewStr != NULL);\r
cf40f28a 792 NewStr [Length] = 0;\r
793 SerialNumberStr = NewStr;\r
794 }\r
795\r
4d0a30a4 796 UefiDevicePathLibCatPrint (\r
95276127 797 Str,\r
cf40f28a 798 L"UsbWwid(0x%x,0x%x,0x%x,\"%s\")",\r
e9b3cd55
RN
799 UsbWWId->VendorId,\r
800 UsbWWId->ProductId,\r
801 UsbWWId->InterfaceNumber,\r
cf40f28a 802 SerialNumberStr\r
95276127 803 );\r
804}\r
805\r
572f5d8a 806/**\r
48557c65 807 Converts a Logic Unit device path structure to its string representative.\r
572f5d8a 808\r
48557c65 809 @param Str The string representative of input device.\r
572f5d8a 810 @param DevPath The input device path structure.\r
811 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
812 of the display node is used, where applicable. If DisplayOnly\r
813 is FALSE, then the longer text representation of the display node\r
814 is used.\r
815 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
816 representation for a device node can be used, where applicable.\r
817\r
818**/\r
95276127 819VOID\r
820DevPathToTextLogicalUnit (\r
821 IN OUT POOL_PRINT *Str,\r
822 IN VOID *DevPath,\r
823 IN BOOLEAN DisplayOnly,\r
824 IN BOOLEAN AllowShortcuts\r
825 )\r
826{\r
827 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
828\r
829 LogicalUnit = DevPath;\r
4d0a30a4 830 UefiDevicePathLibCatPrint (Str, L"Unit(0x%x)", LogicalUnit->Lun);\r
95276127 831}\r
832\r
572f5d8a 833/**\r
48557c65 834 Converts a USB class device path structure to its string representative.\r
572f5d8a 835\r
48557c65 836 @param Str The string representative of input device.\r
572f5d8a 837 @param DevPath The input device path structure.\r
838 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
839 of the display node is used, where applicable. If DisplayOnly\r
840 is FALSE, then the longer text representation of the display node\r
841 is used.\r
842 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
843 representation for a device node can be used, where applicable.\r
844\r
845**/\r
95276127 846VOID\r
847DevPathToTextUsbClass (\r
848 IN OUT POOL_PRINT *Str,\r
849 IN VOID *DevPath,\r
850 IN BOOLEAN DisplayOnly,\r
851 IN BOOLEAN AllowShortcuts\r
852 )\r
853{\r
854 USB_CLASS_DEVICE_PATH *UsbClass;\r
cf40f28a 855 BOOLEAN IsKnownSubClass;\r
856\r
95276127 857\r
858 UsbClass = DevPath;\r
859\r
cf40f28a 860 IsKnownSubClass = TRUE;\r
861 switch (UsbClass->DeviceClass) {\r
862 case USB_CLASS_AUDIO:\r
4d0a30a4 863 UefiDevicePathLibCatPrint (Str, L"UsbAudio");\r
cf40f28a 864 break;\r
95276127 865\r
cf40f28a 866 case USB_CLASS_CDCCONTROL:\r
4d0a30a4 867 UefiDevicePathLibCatPrint (Str, L"UsbCDCControl");\r
cf40f28a 868 break;\r
95276127 869\r
cf40f28a 870 case USB_CLASS_HID:\r
4d0a30a4 871 UefiDevicePathLibCatPrint (Str, L"UsbHID");\r
cf40f28a 872 break;\r
95276127 873\r
cf40f28a 874 case USB_CLASS_IMAGE:\r
4d0a30a4 875 UefiDevicePathLibCatPrint (Str, L"UsbImage");\r
cf40f28a 876 break;\r
95276127 877\r
cf40f28a 878 case USB_CLASS_PRINTER:\r
4d0a30a4 879 UefiDevicePathLibCatPrint (Str, L"UsbPrinter");\r
cf40f28a 880 break;\r
95276127 881\r
cf40f28a 882 case USB_CLASS_MASS_STORAGE:\r
4d0a30a4 883 UefiDevicePathLibCatPrint (Str, L"UsbMassStorage");\r
cf40f28a 884 break;\r
95276127 885\r
cf40f28a 886 case USB_CLASS_HUB:\r
4d0a30a4 887 UefiDevicePathLibCatPrint (Str, L"UsbHub");\r
cf40f28a 888 break;\r
95276127 889\r
cf40f28a 890 case USB_CLASS_CDCDATA:\r
4d0a30a4 891 UefiDevicePathLibCatPrint (Str, L"UsbCDCData");\r
cf40f28a 892 break;\r
95276127 893\r
cf40f28a 894 case USB_CLASS_SMART_CARD:\r
4d0a30a4 895 UefiDevicePathLibCatPrint (Str, L"UsbSmartCard");\r
cf40f28a 896 break;\r
95276127 897\r
cf40f28a 898 case USB_CLASS_VIDEO:\r
4d0a30a4 899 UefiDevicePathLibCatPrint (Str, L"UsbVideo");\r
cf40f28a 900 break;\r
901\r
902 case USB_CLASS_DIAGNOSTIC:\r
4d0a30a4 903 UefiDevicePathLibCatPrint (Str, L"UsbDiagnostic");\r
cf40f28a 904 break;\r
905\r
906 case USB_CLASS_WIRELESS:\r
4d0a30a4 907 UefiDevicePathLibCatPrint (Str, L"UsbWireless");\r
cf40f28a 908 break;\r
909\r
910 default:\r
911 IsKnownSubClass = FALSE;\r
912 break;\r
913 }\r
914\r
915 if (IsKnownSubClass) {\r
4d0a30a4 916 UefiDevicePathLibCatPrint (\r
cf40f28a 917 Str,\r
918 L"(0x%x,0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
919 UsbClass->VendorId,\r
920 UsbClass->ProductId,\r
921 UsbClass->DeviceSubClass,\r
922 UsbClass->DeviceProtocol\r
cf40f28a 923 );\r
924 return;\r
925 }\r
926\r
927 if (UsbClass->DeviceClass == USB_CLASS_RESERVE) {\r
928 if (UsbClass->DeviceSubClass == USB_SUBCLASS_FW_UPDATE) {\r
4d0a30a4 929 UefiDevicePathLibCatPrint (\r
95276127 930 Str,\r
cf40f28a 931 L"UsbDeviceFirmwareUpdate(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
932 UsbClass->VendorId,\r
933 UsbClass->ProductId,\r
934 UsbClass->DeviceProtocol\r
95276127 935 );\r
cf40f28a 936 return;\r
937 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_IRDA_BRIDGE) {\r
4d0a30a4 938 UefiDevicePathLibCatPrint (\r
95276127 939 Str,\r
cf40f28a 940 L"UsbIrdaBridge(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
941 UsbClass->VendorId,\r
942 UsbClass->ProductId,\r
943 UsbClass->DeviceProtocol\r
95276127 944 );\r
cf40f28a 945 return;\r
946 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_TEST) {\r
4d0a30a4 947 UefiDevicePathLibCatPrint (\r
95276127 948 Str,\r
cf40f28a 949 L"UsbTestAndMeasurement(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
950 UsbClass->VendorId,\r
951 UsbClass->ProductId,\r
952 UsbClass->DeviceProtocol\r
95276127 953 );\r
cf40f28a 954 return;\r
95276127 955 }\r
95276127 956 }\r
957\r
4d0a30a4 958 UefiDevicePathLibCatPrint (\r
95276127 959 Str,\r
cf40f28a 960 L"UsbClass(0x%x,0x%x,0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
961 UsbClass->VendorId,\r
962 UsbClass->ProductId,\r
963 UsbClass->DeviceClass,\r
964 UsbClass->DeviceSubClass,\r
965 UsbClass->DeviceProtocol\r
95276127 966 );\r
967}\r
968\r
572f5d8a 969/**\r
48557c65 970 Converts a SATA device path structure to its string representative.\r
572f5d8a 971\r
48557c65 972 @param Str The string representative of input device.\r
572f5d8a 973 @param DevPath The input device path structure.\r
974 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
975 of the display node is used, where applicable. If DisplayOnly\r
976 is FALSE, then the longer text representation of the display node\r
977 is used.\r
978 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
979 representation for a device node can be used, where applicable.\r
980\r
981**/\r
cf40f28a 982VOID\r
983DevPathToTextSata (\r
984 IN OUT POOL_PRINT *Str,\r
985 IN VOID *DevPath,\r
986 IN BOOLEAN DisplayOnly,\r
987 IN BOOLEAN AllowShortcuts\r
988 )\r
989{\r
990 SATA_DEVICE_PATH *Sata;\r
991\r
992 Sata = DevPath;\r
4140a663 993 if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {\r
4d0a30a4 994 UefiDevicePathLibCatPrint (\r
186ca8b0 995 Str,\r
996 L"Sata(0x%x,0x%x)",\r
e9b3cd55
RN
997 Sata->HBAPortNumber,\r
998 Sata->Lun\r
186ca8b0 999 );\r
1000 } else {\r
4d0a30a4 1001 UefiDevicePathLibCatPrint (\r
186ca8b0 1002 Str,\r
1003 L"Sata(0x%x,0x%x,0x%x)",\r
e9b3cd55
RN
1004 Sata->HBAPortNumber,\r
1005 Sata->PortMultiplierPortNumber,\r
1006 Sata->Lun\r
186ca8b0 1007 );\r
1008 }\r
cf40f28a 1009}\r
1010\r
572f5d8a 1011/**\r
48557c65 1012 Converts a I20 device path structure to its string representative.\r
572f5d8a 1013\r
48557c65 1014 @param Str The string representative of input device.\r
572f5d8a 1015 @param DevPath The input device path structure.\r
1016 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1017 of the display node is used, where applicable. If DisplayOnly\r
1018 is FALSE, then the longer text representation of the display node\r
1019 is used.\r
1020 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1021 representation for a device node can be used, where applicable.\r
1022\r
1023**/\r
95276127 1024VOID\r
1025DevPathToTextI2O (\r
1026 IN OUT POOL_PRINT *Str,\r
1027 IN VOID *DevPath,\r
1028 IN BOOLEAN DisplayOnly,\r
1029 IN BOOLEAN AllowShortcuts\r
1030 )\r
1031{\r
572f5d8a 1032 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1033\r
572f5d8a 1034 I2ODevPath = DevPath;\r
4d0a30a4 1035 UefiDevicePathLibCatPrint (Str, L"I2O(0x%x)", I2ODevPath->Tid);\r
95276127 1036}\r
1037\r
572f5d8a 1038/**\r
48557c65 1039 Converts a MAC address device path structure to its string representative.\r
572f5d8a 1040\r
48557c65 1041 @param Str The string representative of input device.\r
572f5d8a 1042 @param DevPath The input device path structure.\r
1043 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1044 of the display node is used, where applicable. If DisplayOnly\r
1045 is FALSE, then the longer text representation of the display node\r
1046 is used.\r
1047 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1048 representation for a device node can be used, where applicable.\r
1049\r
1050**/\r
95276127 1051VOID\r
1052DevPathToTextMacAddr (\r
1053 IN OUT POOL_PRINT *Str,\r
1054 IN VOID *DevPath,\r
1055 IN BOOLEAN DisplayOnly,\r
1056 IN BOOLEAN AllowShortcuts\r
1057 )\r
1058{\r
572f5d8a 1059 MAC_ADDR_DEVICE_PATH *MacDevPath;\r
95276127 1060 UINTN HwAddressSize;\r
1061 UINTN Index;\r
1062\r
572f5d8a 1063 MacDevPath = DevPath;\r
95276127 1064\r
1065 HwAddressSize = sizeof (EFI_MAC_ADDRESS);\r
572f5d8a 1066 if (MacDevPath->IfType == 0x01 || MacDevPath->IfType == 0x00) {\r
95276127 1067 HwAddressSize = 6;\r
1068 }\r
1069\r
4d0a30a4 1070 UefiDevicePathLibCatPrint (Str, L"MAC(");\r
95276127 1071\r
1072 for (Index = 0; Index < HwAddressSize; Index++) {\r
4d0a30a4 1073 UefiDevicePathLibCatPrint (Str, L"%02x", MacDevPath->MacAddress.Addr[Index]);\r
95276127 1074 }\r
1075\r
4d0a30a4 1076 UefiDevicePathLibCatPrint (Str, L",0x%x)", MacDevPath->IfType);\r
95276127 1077}\r
1078\r
052019e1 1079/**\r
1080 Converts network protocol string to its text representation.\r
1081\r
1082 @param Str The string representative of input device.\r
1083 @param Protocol The network protocol ID.\r
1084\r
1085**/\r
1086VOID\r
1087CatNetworkProtocol (\r
1088 IN OUT POOL_PRINT *Str,\r
1089 IN UINT16 Protocol\r
1090 )\r
1091{\r
1092 if (Protocol == RFC_1700_TCP_PROTOCOL) {\r
4d0a30a4 1093 UefiDevicePathLibCatPrint (Str, L"TCP");\r
052019e1 1094 } else if (Protocol == RFC_1700_UDP_PROTOCOL) {\r
4d0a30a4 1095 UefiDevicePathLibCatPrint (Str, L"UDP");\r
052019e1 1096 } else {\r
4d0a30a4 1097 UefiDevicePathLibCatPrint (Str, L"0x%x", Protocol);\r
052019e1 1098 }\r
1099}\r
1100\r
4d0a30a4
RN
1101/**\r
1102 Converts IP v4 address to its text representation.\r
1103\r
1104 @param Str The string representative of input device.\r
1105 @param Address The IP v4 address.\r
1106**/\r
1107VOID\r
1108CatIPv4Address (\r
1109 IN OUT POOL_PRINT *Str,\r
1110 IN EFI_IPv4_ADDRESS *Address\r
1111 )\r
1112{\r
1113 UefiDevicePathLibCatPrint (Str, L"%d.%d.%d.%d", Address->Addr[0], Address->Addr[1], Address->Addr[2], Address->Addr[3]);\r
1114}\r
1115\r
1116/**\r
1117 Converts IP v6 address to its text representation.\r
1118\r
1119 @param Str The string representative of input device.\r
1120 @param Address The IP v6 address.\r
1121**/\r
1122VOID\r
1123CatIPv6Address (\r
1124 IN OUT POOL_PRINT *Str,\r
1125 IN EFI_IPv6_ADDRESS *Address\r
1126 )\r
1127{\r
1128 UefiDevicePathLibCatPrint (\r
1129 Str, L"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",\r
1130 Address->Addr[0], Address->Addr[1],\r
1131 Address->Addr[2], Address->Addr[3],\r
1132 Address->Addr[4], Address->Addr[5],\r
1133 Address->Addr[6], Address->Addr[7],\r
1134 Address->Addr[8], Address->Addr[9],\r
1135 Address->Addr[10], Address->Addr[11],\r
1136 Address->Addr[12], Address->Addr[13],\r
1137 Address->Addr[14], Address->Addr[15]\r
1138 );\r
1139}\r
1140\r
572f5d8a 1141/**\r
48557c65 1142 Converts a IPv4 device path structure to its string representative.\r
572f5d8a 1143\r
48557c65 1144 @param Str The string representative of input device.\r
572f5d8a 1145 @param DevPath The input device path structure.\r
1146 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1147 of the display node is used, where applicable. If DisplayOnly\r
1148 is FALSE, then the longer text representation of the display node\r
1149 is used.\r
1150 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1151 representation for a device node can be used, where applicable.\r
1152\r
1153**/\r
95276127 1154VOID\r
1155DevPathToTextIPv4 (\r
1156 IN OUT POOL_PRINT *Str,\r
1157 IN VOID *DevPath,\r
1158 IN BOOLEAN DisplayOnly,\r
1159 IN BOOLEAN AllowShortcuts\r
1160 )\r
1161{\r
572f5d8a 1162 IPv4_DEVICE_PATH *IPDevPath;\r
95276127 1163\r
572f5d8a 1164 IPDevPath = DevPath;\r
4d0a30a4
RN
1165 UefiDevicePathLibCatPrint (Str, L"IPv4(");\r
1166 CatIPv4Address (Str, &IPDevPath->RemoteIpAddress);\r
1167\r
572f5d8a 1168 if (DisplayOnly) {\r
4d0a30a4 1169 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1170 return ;\r
1171 }\r
1172\r
4d0a30a4
RN
1173 UefiDevicePathLibCatPrint (Str, L",");\r
1174 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1175\r
4d0a30a4
RN
1176 UefiDevicePathLibCatPrint (Str, L",%s,", IPDevPath->StaticIpAddress ? L"Static" : L"DHCP");\r
1177 CatIPv4Address (Str, &IPDevPath->LocalIpAddress);\r
e9b3cd55 1178 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv4_DEVICE_PATH)) {\r
4d0a30a4
RN
1179 UefiDevicePathLibCatPrint (Str, L",");\r
1180 CatIPv4Address (Str, &IPDevPath->GatewayIpAddress);\r
1181 UefiDevicePathLibCatPrint (Str, L",");\r
1182 CatIPv4Address (Str, &IPDevPath->SubnetMask);\r
e9b3cd55 1183 }\r
4d0a30a4 1184 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1185}\r
1186\r
572f5d8a 1187/**\r
48557c65 1188 Converts a IPv6 device path structure to its string representative.\r
572f5d8a 1189\r
48557c65 1190 @param Str The string representative of input device.\r
572f5d8a 1191 @param DevPath The input device path structure.\r
1192 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1193 of the display node is used, where applicable. If DisplayOnly\r
1194 is FALSE, then the longer text representation of the display node\r
1195 is used.\r
1196 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1197 representation for a device node can be used, where applicable.\r
1198\r
1199**/\r
95276127 1200VOID\r
1201DevPathToTextIPv6 (\r
1202 IN OUT POOL_PRINT *Str,\r
1203 IN VOID *DevPath,\r
1204 IN BOOLEAN DisplayOnly,\r
1205 IN BOOLEAN AllowShortcuts\r
1206 )\r
1207{\r
572f5d8a 1208 IPv6_DEVICE_PATH *IPDevPath;\r
95276127 1209\r
572f5d8a 1210 IPDevPath = DevPath;\r
4d0a30a4
RN
1211 UefiDevicePathLibCatPrint (Str, L"IPv6(");\r
1212 CatIPv6Address (Str, &IPDevPath->RemoteIpAddress);\r
572f5d8a 1213 if (DisplayOnly) {\r
4d0a30a4 1214 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1215 return ;\r
1216 }\r
4d0a30a4
RN
1217 \r
1218 UefiDevicePathLibCatPrint (Str, L",");\r
1219 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1220\r
501793fa
RN
1221 switch (IPDevPath->IpAddressOrigin) {\r
1222 case 0:\r
4d0a30a4 1223 UefiDevicePathLibCatPrint (Str, L",Static,");\r
501793fa
RN
1224 break;\r
1225 case 1:\r
4d0a30a4 1226 UefiDevicePathLibCatPrint (Str, L",StatelessAutoConfigure,");\r
501793fa
RN
1227 break;\r
1228 default:\r
4d0a30a4 1229 UefiDevicePathLibCatPrint (Str, L",StatefulAutoConfigure,");\r
501793fa
RN
1230 break;\r
1231 }\r
1232\r
4d0a30a4 1233 CatIPv6Address (Str, &IPDevPath->LocalIpAddress);\r
501793fa
RN
1234\r
1235 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv6_DEVICE_PATH)) {\r
4d0a30a4
RN
1236 UefiDevicePathLibCatPrint (Str, L",0x%x,", IPDevPath->PrefixLength);\r
1237 CatIPv6Address (Str, &IPDevPath->GatewayIpAddress);\r
501793fa 1238 }\r
4d0a30a4 1239 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1240}\r
1241\r
572f5d8a 1242/**\r
48557c65 1243 Converts an Infini Band device path structure to its string representative.\r
572f5d8a 1244\r
48557c65 1245 @param Str The string representative of input device.\r
572f5d8a 1246 @param DevPath The input device path structure.\r
1247 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1248 of the display node is used, where applicable. If DisplayOnly\r
1249 is FALSE, then the longer text representation of the display node\r
1250 is used.\r
1251 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1252 representation for a device node can be used, where applicable.\r
1253\r
1254**/\r
95276127 1255VOID\r
1256DevPathToTextInfiniBand (\r
1257 IN OUT POOL_PRINT *Str,\r
1258 IN VOID *DevPath,\r
1259 IN BOOLEAN DisplayOnly,\r
1260 IN BOOLEAN AllowShortcuts\r
1261 )\r
1262{\r
1263 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1264\r
1265 InfiniBand = DevPath;\r
4d0a30a4 1266 UefiDevicePathLibCatPrint (\r
95276127 1267 Str,\r
cf40f28a 1268 L"Infiniband(0x%x,%g,0x%lx,0x%lx,0x%lx)",\r
e9b3cd55 1269 InfiniBand->ResourceFlags,\r
95276127 1270 InfiniBand->PortGid,\r
1271 InfiniBand->ServiceId,\r
1272 InfiniBand->TargetPortId,\r
1273 InfiniBand->DeviceId\r
1274 );\r
1275}\r
1276\r
572f5d8a 1277/**\r
48557c65 1278 Converts a UART device path structure to its string representative.\r
572f5d8a 1279\r
48557c65 1280 @param Str The string representative of input device.\r
572f5d8a 1281 @param DevPath The input device path structure.\r
1282 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1283 of the display node is used, where applicable. If DisplayOnly\r
1284 is FALSE, then the longer text representation of the display node\r
1285 is used.\r
1286 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1287 representation for a device node can be used, where applicable.\r
1288\r
1289**/\r
95276127 1290VOID\r
1291DevPathToTextUart (\r
1292 IN OUT POOL_PRINT *Str,\r
1293 IN VOID *DevPath,\r
1294 IN BOOLEAN DisplayOnly,\r
1295 IN BOOLEAN AllowShortcuts\r
1296 )\r
1297{\r
1298 UART_DEVICE_PATH *Uart;\r
1299 CHAR8 Parity;\r
1300\r
1301 Uart = DevPath;\r
1302 switch (Uart->Parity) {\r
1303 case 0:\r
1304 Parity = 'D';\r
1305 break;\r
1306\r
1307 case 1:\r
1308 Parity = 'N';\r
1309 break;\r
1310\r
1311 case 2:\r
1312 Parity = 'E';\r
1313 break;\r
1314\r
1315 case 3:\r
1316 Parity = 'O';\r
1317 break;\r
1318\r
1319 case 4:\r
1320 Parity = 'M';\r
1321 break;\r
1322\r
1323 case 5:\r
1324 Parity = 'S';\r
1325 break;\r
1326\r
1327 default:\r
1328 Parity = 'x';\r
1329 break;\r
1330 }\r
1331\r
1332 if (Uart->BaudRate == 0) {\r
4d0a30a4 1333 UefiDevicePathLibCatPrint (Str, L"Uart(DEFAULT,");\r
95276127 1334 } else {\r
4d0a30a4 1335 UefiDevicePathLibCatPrint (Str, L"Uart(%ld,", Uart->BaudRate);\r
95276127 1336 }\r
1337\r
1338 if (Uart->DataBits == 0) {\r
4d0a30a4 1339 UefiDevicePathLibCatPrint (Str, L"DEFAULT,");\r
95276127 1340 } else {\r
4d0a30a4 1341 UefiDevicePathLibCatPrint (Str, L"%d,", Uart->DataBits);\r
95276127 1342 }\r
1343\r
4d0a30a4 1344 UefiDevicePathLibCatPrint (Str, L"%c,", Parity);\r
95276127 1345\r
1346 switch (Uart->StopBits) {\r
1347 case 0:\r
4d0a30a4 1348 UefiDevicePathLibCatPrint (Str, L"D)");\r
95276127 1349 break;\r
1350\r
1351 case 1:\r
4d0a30a4 1352 UefiDevicePathLibCatPrint (Str, L"1)");\r
95276127 1353 break;\r
1354\r
1355 case 2:\r
4d0a30a4 1356 UefiDevicePathLibCatPrint (Str, L"1.5)");\r
95276127 1357 break;\r
1358\r
1359 case 3:\r
4d0a30a4 1360 UefiDevicePathLibCatPrint (Str, L"2)");\r
95276127 1361 break;\r
1362\r
1363 default:\r
4d0a30a4 1364 UefiDevicePathLibCatPrint (Str, L"x)");\r
95276127 1365 break;\r
1366 }\r
1367}\r
1368\r
572f5d8a 1369/**\r
48557c65 1370 Converts an iSCSI device path structure to its string representative.\r
572f5d8a 1371\r
48557c65 1372 @param Str The string representative of input device.\r
572f5d8a 1373 @param DevPath The input device path structure.\r
1374 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1375 of the display node is used, where applicable. If DisplayOnly\r
1376 is FALSE, then the longer text representation of the display node\r
1377 is used.\r
1378 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1379 representation for a device node can be used, where applicable.\r
1380\r
1381**/\r
95276127 1382VOID\r
1383DevPathToTextiSCSI (\r
1384 IN OUT POOL_PRINT *Str,\r
1385 IN VOID *DevPath,\r
1386 IN BOOLEAN DisplayOnly,\r
1387 IN BOOLEAN AllowShortcuts\r
1388 )\r
1389{\r
572f5d8a 1390 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
95276127 1391 UINT16 Options;\r
1392\r
572f5d8a 1393 ISCSIDevPath = DevPath;\r
4d0a30a4 1394 UefiDevicePathLibCatPrint (\r
95276127 1395 Str,\r
cf40f28a 1396 L"iSCSI(%a,0x%x,0x%lx,",\r
184f7d83 1397 ISCSIDevPath->TargetName,\r
e9b3cd55 1398 ISCSIDevPath->TargetPortalGroupTag,\r
572f5d8a 1399 ISCSIDevPath->Lun\r
95276127 1400 );\r
1401\r
572f5d8a 1402 Options = ISCSIDevPath->LoginOption;\r
4d0a30a4
RN
1403 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
1404 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
572f5d8a 1405 if (((Options >> 11) & 0x0001) != 0) {\r
4d0a30a4 1406 UefiDevicePathLibCatPrint (Str, L"%s,", L"None");\r
572f5d8a 1407 } else if (((Options >> 12) & 0x0001) != 0) {\r
4d0a30a4 1408 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_UNI");\r
95276127 1409 } else {\r
4d0a30a4 1410 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_BI");\r
95276127 1411\r
1412 }\r
1413\r
4d0a30a4 1414 UefiDevicePathLibCatPrint (Str, L"%s)", (ISCSIDevPath->NetworkProtocol == 0) ? L"TCP" : L"reserved");\r
95276127 1415}\r
1416\r
8f97f911 1417/**\r
1418 Converts a VLAN device path structure to its string representative.\r
1419\r
1420 @param Str The string representative of input device.\r
1421 @param DevPath The input device path structure.\r
1422 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1423 of the display node is used, where applicable. If DisplayOnly\r
1424 is FALSE, then the longer text representation of the display node\r
1425 is used.\r
1426 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1427 representation for a device node can be used, where applicable.\r
1428\r
1429**/\r
1430VOID\r
1431DevPathToTextVlan (\r
1432 IN OUT POOL_PRINT *Str,\r
1433 IN VOID *DevPath,\r
1434 IN BOOLEAN DisplayOnly,\r
1435 IN BOOLEAN AllowShortcuts\r
1436 )\r
1437{\r
1438 VLAN_DEVICE_PATH *Vlan;\r
1439\r
1440 Vlan = DevPath;\r
4d0a30a4 1441 UefiDevicePathLibCatPrint (Str, L"Vlan(%d)", Vlan->VlanId);\r
8f97f911 1442}\r
1443\r
572f5d8a 1444/**\r
48557c65 1445 Converts a Hard drive device path structure to its string representative.\r
572f5d8a 1446\r
48557c65 1447 @param Str The string representative of input device.\r
572f5d8a 1448 @param DevPath The input device path structure.\r
1449 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1450 of the display node is used, where applicable. If DisplayOnly\r
1451 is FALSE, then the longer text representation of the display node\r
1452 is used.\r
1453 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1454 representation for a device node can be used, where applicable.\r
1455\r
1456**/\r
95276127 1457VOID\r
1458DevPathToTextHardDrive (\r
1459 IN OUT POOL_PRINT *Str,\r
1460 IN VOID *DevPath,\r
1461 IN BOOLEAN DisplayOnly,\r
1462 IN BOOLEAN AllowShortcuts\r
1463 )\r
1464{\r
1465 HARDDRIVE_DEVICE_PATH *Hd;\r
1466\r
1467 Hd = DevPath;\r
1468 switch (Hd->SignatureType) {\r
95276127 1469 case SIGNATURE_TYPE_MBR:\r
4d0a30a4 1470 UefiDevicePathLibCatPrint (\r
95276127 1471 Str,\r
cf40f28a 1472 L"HD(%d,%s,0x%08x,",\r
e9b3cd55 1473 Hd->PartitionNumber,\r
95276127 1474 L"MBR",\r
e9b3cd55 1475 *((UINT32 *) (&(Hd->Signature[0])))\r
95276127 1476 );\r
1477 break;\r
1478\r
1479 case SIGNATURE_TYPE_GUID:\r
4d0a30a4 1480 UefiDevicePathLibCatPrint (\r
95276127 1481 Str,\r
1482 L"HD(%d,%s,%g,",\r
e9b3cd55 1483 Hd->PartitionNumber,\r
cf40f28a 1484 L"GPT",\r
95276127 1485 (EFI_GUID *) &(Hd->Signature[0])\r
1486 );\r
1487 break;\r
1488\r
1489 default:\r
4d0a30a4 1490 UefiDevicePathLibCatPrint (\r
cf40f28a 1491 Str,\r
1492 L"HD(%d,%d,0,",\r
e9b3cd55
RN
1493 Hd->PartitionNumber,\r
1494 Hd->SignatureType\r
cf40f28a 1495 );\r
95276127 1496 break;\r
1497 }\r
1498\r
4d0a30a4 1499 UefiDevicePathLibCatPrint (Str, L"0x%lx,0x%lx)", Hd->PartitionStart, Hd->PartitionSize);\r
95276127 1500}\r
1501\r
572f5d8a 1502/**\r
48557c65 1503 Converts a CDROM device path structure to its string representative.\r
572f5d8a 1504\r
48557c65 1505 @param Str The string representative of input device.\r
572f5d8a 1506 @param DevPath The input device path structure.\r
1507 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1508 of the display node is used, where applicable. If DisplayOnly\r
1509 is FALSE, then the longer text representation of the display node\r
1510 is used.\r
1511 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1512 representation for a device node can be used, where applicable.\r
1513\r
1514**/\r
95276127 1515VOID\r
1516DevPathToTextCDROM (\r
1517 IN OUT POOL_PRINT *Str,\r
1518 IN VOID *DevPath,\r
1519 IN BOOLEAN DisplayOnly,\r
1520 IN BOOLEAN AllowShortcuts\r
1521 )\r
1522{\r
1523 CDROM_DEVICE_PATH *Cd;\r
1524\r
1525 Cd = DevPath;\r
572f5d8a 1526 if (DisplayOnly) {\r
4d0a30a4 1527 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x)", Cd->BootEntry);\r
95276127 1528 return ;\r
1529 }\r
1530\r
4d0a30a4 1531 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x,0x%lx,0x%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize);\r
95276127 1532}\r
1533\r
572f5d8a 1534/**\r
48557c65 1535 Converts a File device path structure to its string representative.\r
572f5d8a 1536\r
48557c65 1537 @param Str The string representative of input device.\r
572f5d8a 1538 @param DevPath The input device path structure.\r
1539 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1540 of the display node is used, where applicable. If DisplayOnly\r
1541 is FALSE, then the longer text representation of the display node\r
1542 is used.\r
1543 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1544 representation for a device node can be used, where applicable.\r
1545\r
1546**/\r
95276127 1547VOID\r
1548DevPathToTextFilePath (\r
1549 IN OUT POOL_PRINT *Str,\r
1550 IN VOID *DevPath,\r
1551 IN BOOLEAN DisplayOnly,\r
1552 IN BOOLEAN AllowShortcuts\r
1553 )\r
1554{\r
1555 FILEPATH_DEVICE_PATH *Fp;\r
1556\r
1557 Fp = DevPath;\r
4d0a30a4 1558 UefiDevicePathLibCatPrint (Str, L"%s", Fp->PathName);\r
95276127 1559}\r
1560\r
572f5d8a 1561/**\r
48557c65 1562 Converts a Media protocol device path structure to its string representative.\r
572f5d8a 1563\r
48557c65 1564 @param Str The string representative of input device.\r
572f5d8a 1565 @param DevPath The input device path structure.\r
1566 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1567 of the display node is used, where applicable. If DisplayOnly\r
1568 is FALSE, then the longer text representation of the display node\r
1569 is used.\r
1570 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1571 representation for a device node can be used, where applicable.\r
1572\r
1573**/\r
95276127 1574VOID\r
1575DevPathToTextMediaProtocol (\r
1576 IN OUT POOL_PRINT *Str,\r
1577 IN VOID *DevPath,\r
1578 IN BOOLEAN DisplayOnly,\r
1579 IN BOOLEAN AllowShortcuts\r
1580 )\r
1581{\r
1582 MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;\r
1583\r
1584 MediaProt = DevPath;\r
4d0a30a4 1585 UefiDevicePathLibCatPrint (Str, L"Media(%g)", &MediaProt->Protocol);\r
95276127 1586}\r
1587\r
572f5d8a 1588/**\r
48557c65 1589 Converts a Firmware Volume device path structure to its string representative.\r
572f5d8a 1590\r
48557c65 1591 @param Str The string representative of input device.\r
572f5d8a 1592 @param DevPath The input device path structure.\r
1593 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1594 of the display node is used, where applicable. If DisplayOnly\r
1595 is FALSE, then the longer text representation of the display node\r
1596 is used.\r
1597 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1598 representation for a device node can be used, where applicable.\r
1599\r
1600**/\r
cf40f28a 1601VOID\r
1602DevPathToTextFv (\r
1603 IN OUT POOL_PRINT *Str,\r
1604 IN VOID *DevPath,\r
1605 IN BOOLEAN DisplayOnly,\r
1606 IN BOOLEAN AllowShortcuts\r
1607 )\r
1608{\r
1609 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
1610\r
1611 Fv = DevPath;\r
4d0a30a4 1612 UefiDevicePathLibCatPrint (Str, L"Fv(%g)", &Fv->FvName);\r
cf40f28a 1613}\r
1614\r
572f5d8a 1615/**\r
48557c65 1616 Converts a Firmware Volume File device path structure to its string representative.\r
572f5d8a 1617\r
48557c65 1618 @param Str The string representative of input device.\r
572f5d8a 1619 @param DevPath The input device path structure.\r
1620 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1621 of the display node is used, where applicable. If DisplayOnly\r
1622 is FALSE, then the longer text representation of the display node\r
1623 is used.\r
1624 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1625 representation for a device node can be used, where applicable.\r
1626\r
1627**/\r
cf40f28a 1628VOID\r
1629DevPathToTextFvFile (\r
1630 IN OUT POOL_PRINT *Str,\r
1631 IN VOID *DevPath,\r
1632 IN BOOLEAN DisplayOnly,\r
1633 IN BOOLEAN AllowShortcuts\r
1634 )\r
1635{\r
1636 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
1637\r
1638 FvFile = DevPath;\r
4d0a30a4 1639 UefiDevicePathLibCatPrint (Str, L"FvFile(%g)", &FvFile->FvFileName);\r
cf40f28a 1640}\r
1641\r
09e15613 1642/**\r
1643 Converts a Relative Offset device path structure to its string representative.\r
1644\r
1645 @param Str The string representative of input device.\r
1646 @param DevPath The input device path structure.\r
1647 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1648 of the display node is used, where applicable. If DisplayOnly\r
1649 is FALSE, then the longer text representation of the display node\r
1650 is used.\r
1651 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1652 representation for a device node can be used, where applicable.\r
1653\r
1654**/\r
1655VOID\r
1656DevPathRelativeOffsetRange (\r
1657 IN OUT POOL_PRINT *Str,\r
1658 IN VOID *DevPath,\r
1659 IN BOOLEAN DisplayOnly,\r
1660 IN BOOLEAN AllowShortcuts\r
1661 )\r
1662{\r
1663 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
1664\r
1665 Offset = DevPath;\r
4d0a30a4 1666 UefiDevicePathLibCatPrint (\r
09e15613 1667 Str,\r
7748eb28 1668 L"Offset(0x%lx,0x%lx)",\r
09e15613 1669 Offset->StartingOffset,\r
1670 Offset->EndingOffset\r
1671 );\r
1672}\r
1673\r
572f5d8a 1674/**\r
48557c65 1675 Converts a BIOS Boot Specification device path structure to its string representative.\r
572f5d8a 1676\r
48557c65 1677 @param Str The string representative of input device.\r
572f5d8a 1678 @param DevPath The input device path structure.\r
1679 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1680 of the display node is used, where applicable. If DisplayOnly\r
1681 is FALSE, then the longer text representation of the display node\r
1682 is used.\r
1683 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1684 representation for a device node can be used, where applicable.\r
1685\r
1686**/\r
95276127 1687VOID\r
1688DevPathToTextBBS (\r
1689 IN OUT POOL_PRINT *Str,\r
1690 IN VOID *DevPath,\r
1691 IN BOOLEAN DisplayOnly,\r
1692 IN BOOLEAN AllowShortcuts\r
1693 )\r
1694{\r
1695 BBS_BBS_DEVICE_PATH *Bbs;\r
1696 CHAR16 *Type;\r
1697\r
1698 Bbs = DevPath;\r
1699 switch (Bbs->DeviceType) {\r
1700 case BBS_TYPE_FLOPPY:\r
1701 Type = L"Floppy";\r
1702 break;\r
1703\r
1704 case BBS_TYPE_HARDDRIVE:\r
1705 Type = L"HD";\r
1706 break;\r
1707\r
1708 case BBS_TYPE_CDROM:\r
1709 Type = L"CDROM";\r
1710 break;\r
1711\r
1712 case BBS_TYPE_PCMCIA:\r
1713 Type = L"PCMCIA";\r
1714 break;\r
1715\r
1716 case BBS_TYPE_USB:\r
1717 Type = L"USB";\r
1718 break;\r
1719\r
1720 case BBS_TYPE_EMBEDDED_NETWORK:\r
1721 Type = L"Network";\r
1722 break;\r
1723\r
1724 default:\r
cf40f28a 1725 Type = NULL;\r
95276127 1726 break;\r
1727 }\r
1728\r
cf40f28a 1729 if (Type != NULL) {\r
4d0a30a4 1730 UefiDevicePathLibCatPrint (Str, L"BBS(%s,%a", Type, Bbs->String);\r
cf40f28a 1731 } else {\r
4d0a30a4 1732 UefiDevicePathLibCatPrint (Str, L"BBS(0x%x,%a", Bbs->DeviceType, Bbs->String);\r
cf40f28a 1733 }\r
95276127 1734\r
572f5d8a 1735 if (DisplayOnly) {\r
4d0a30a4 1736 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1737 return ;\r
1738 }\r
1739\r
4d0a30a4 1740 UefiDevicePathLibCatPrint (Str, L",0x%x)", Bbs->StatusFlag);\r
95276127 1741}\r
1742\r
572f5d8a 1743/**\r
48557c65 1744 Converts an End-of-Device-Path structure to its string representative.\r
572f5d8a 1745\r
48557c65 1746 @param Str The string representative of input device.\r
572f5d8a 1747 @param DevPath The input device path structure.\r
1748 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1749 of the display node is used, where applicable. If DisplayOnly\r
1750 is FALSE, then the longer text representation of the display node\r
1751 is used.\r
1752 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1753 representation for a device node can be used, where applicable.\r
1754\r
1755**/\r
95276127 1756VOID\r
1757DevPathToTextEndInstance (\r
1758 IN OUT POOL_PRINT *Str,\r
1759 IN VOID *DevPath,\r
1760 IN BOOLEAN DisplayOnly,\r
1761 IN BOOLEAN AllowShortcuts\r
1762 )\r
1763{\r
4d0a30a4 1764 UefiDevicePathLibCatPrint (Str, L",");\r
95276127 1765}\r
1766\r
572f5d8a 1767/**\r
48557c65 1768 Converts an unknown device path structure to its string representative.\r
572f5d8a 1769\r
48557c65 1770 @param Str The string representative of input device.\r
572f5d8a 1771 @param DevPath The input device path structure.\r
1772 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1773 of the display node is used, where applicable. If DisplayOnly\r
1774 is FALSE, then the longer text representation of the display node\r
1775 is used.\r
1776 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1777 representation for a device node can be used, where applicable.\r
1778\r
1779**/\r
95276127 1780VOID\r
1781DevPathToTextNodeUnknown (\r
1782 IN OUT POOL_PRINT *Str,\r
1783 IN VOID *DevPath,\r
1784 IN BOOLEAN DisplayOnly,\r
1785 IN BOOLEAN AllowShortcuts\r
1786 )\r
1787{\r
4d0a30a4 1788 UefiDevicePathLibCatPrint (Str, L"?");\r
95276127 1789}\r
1790\r
4d0a30a4
RN
1791GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLibDevPathToTextTable[] = {\r
1792 {HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci },\r
1793 {HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard },\r
1794 {HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap },\r
1795 {HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor },\r
1796 {HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController },\r
1797 {ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi },\r
1798 {ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextAcpiEx },\r
1799 {ACPI_DEVICE_PATH, ACPI_ADR_DP, DevPathToTextAcpiAdr },\r
1800 {MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi },\r
1801 {MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi },\r
1802 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre },\r
1803 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, DevPathToTextFibreEx },\r
1804 {MESSAGING_DEVICE_PATH, MSG_SASEX_DP, DevPathToTextSasEx },\r
1805 {MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394 },\r
1806 {MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb },\r
1807 {MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID },\r
1808 {MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit },\r
1809 {MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass },\r
1810 {MESSAGING_DEVICE_PATH, MSG_SATA_DP, DevPathToTextSata },\r
1811 {MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O },\r
1812 {MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr },\r
1813 {MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4 },\r
1814 {MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6 },\r
1815 {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand },\r
1816 {MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart },\r
1817 {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor },\r
1818 {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI },\r
1819 {MESSAGING_DEVICE_PATH, MSG_VLAN_DP, DevPathToTextVlan },\r
1820 {MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive },\r
1821 {MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM },\r
1822 {MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor },\r
1823 {MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol },\r
1824 {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath },\r
1825 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_VOL_DP, DevPathToTextFv },\r
1826 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_FILE_DP, DevPathToTextFvFile },\r
1827 {MEDIA_DEVICE_PATH, MEDIA_RELATIVE_OFFSET_RANGE_DP, DevPathRelativeOffsetRange },\r
1828 {BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS },\r
1829 {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance },\r
95276127 1830 {0, 0, NULL}\r
1831};\r
1832\r
572f5d8a 1833/**\r
1834 Converts a device node to its string representation.\r
1835\r
1836 @param DeviceNode A Pointer to the device node to be converted.\r
1837 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1838 of the display node is used, where applicable. If DisplayOnly\r
1839 is FALSE, then the longer text representation of the display node\r
1840 is used.\r
1841 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1842 representation for a device node can be used, where applicable.\r
1843\r
1844 @return A pointer to the allocated text representation of the device node or NULL if DeviceNode\r
1845 is NULL or there was insufficient memory.\r
1846\r
1847**/\r
95276127 1848CHAR16 *\r
572f5d8a 1849EFIAPI\r
4d0a30a4 1850UefiDevicePathLibConvertDeviceNodeToText (\r
95276127 1851 IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,\r
1852 IN BOOLEAN DisplayOnly,\r
1853 IN BOOLEAN AllowShortcuts\r
1854 )\r
95276127 1855{\r
4d0a30a4
RN
1856 POOL_PRINT Str;\r
1857 UINTN Index;\r
1858 DEVICE_PATH_TO_TEXT ToText;\r
95276127 1859\r
1860 if (DeviceNode == NULL) {\r
1861 return NULL;\r
1862 }\r
1863\r
1864 ZeroMem (&Str, sizeof (Str));\r
1865\r
1866 //\r
1867 // Process the device path node\r
4d0a30a4 1868 // If not found, use a generic function\r
95276127 1869 //\r
4d0a30a4
RN
1870 ToText = DevPathToTextNodeUnknown;\r
1871 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index++) {\r
1872 if (DevicePathType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1873 DevicePathSubType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
95276127 1874 ) {\r
4d0a30a4 1875 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
95276127 1876 break;\r
1877 }\r
1878 }\r
95276127 1879\r
1880 //\r
1881 // Print this node\r
1882 //\r
4d0a30a4 1883 ToText (&Str, (VOID *) DeviceNode, DisplayOnly, AllowShortcuts);\r
95276127 1884\r
9d4af8fc 1885 ASSERT (Str.Str != NULL);\r
95276127 1886 return Str.Str;\r
1887}\r
1888\r
572f5d8a 1889/**\r
1890 Converts a device path to its text representation.\r
95276127 1891\r
572f5d8a 1892 @param DevicePath A Pointer to the device to be converted.\r
1893 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
95276127 1894 of the display node is used, where applicable. If DisplayOnly\r
1895 is FALSE, then the longer text representation of the display node\r
1896 is used.\r
572f5d8a 1897 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
95276127 1898 representation for a device node can be used, where applicable.\r
1899\r
572f5d8a 1900 @return A pointer to the allocated text representation of the device path or\r
1901 NULL if DeviceNode is NULL or there was insufficient memory.\r
95276127 1902\r
572f5d8a 1903**/\r
1904CHAR16 *\r
1905EFIAPI\r
4d0a30a4 1906UefiDevicePathLibConvertDevicePathToText (\r
572f5d8a 1907 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
1908 IN BOOLEAN DisplayOnly,\r
1909 IN BOOLEAN AllowShortcuts\r
1910 )\r
95276127 1911{\r
4d0a30a4
RN
1912 POOL_PRINT Str;\r
1913 EFI_DEVICE_PATH_PROTOCOL *Node;\r
1914 EFI_DEVICE_PATH_PROTOCOL *AlignedNode;\r
1915 UINTN Index;\r
1916 DEVICE_PATH_TO_TEXT ToText;\r
95276127 1917\r
1918 if (DevicePath == NULL) {\r
1919 return NULL;\r
1920 }\r
1921\r
1922 ZeroMem (&Str, sizeof (Str));\r
1923\r
95276127 1924 //\r
1925 // Process each device path node\r
1926 //\r
4d0a30a4
RN
1927 Node = (EFI_DEVICE_PATH_PROTOCOL *) DevicePath;\r
1928 while (!IsDevicePathEnd (Node)) {\r
95276127 1929 //\r
1930 // Find the handler to dump this device path node\r
4d0a30a4 1931 // If not found, use a generic function\r
95276127 1932 //\r
4d0a30a4
RN
1933 ToText = DevPathToTextNodeUnknown;\r
1934 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index += 1) {\r
95276127 1935\r
4d0a30a4
RN
1936 if (DevicePathType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1937 DevicePathSubType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
95276127 1938 ) {\r
4d0a30a4 1939 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
95276127 1940 break;\r
1941 }\r
1942 }\r
1943 //\r
5755841f 1944 // Put a path separator in if needed\r
95276127 1945 //\r
4d0a30a4
RN
1946 if ((Str.Count != 0) && (ToText != DevPathToTextEndInstance)) {\r
1947 if (Str.Str[Str.Count] != L',') {\r
1948 UefiDevicePathLibCatPrint (&Str, L"/");\r
cf40f28a 1949 }\r
95276127 1950 }\r
1232b214 1951 \r
4d0a30a4 1952 AlignedNode = AllocateCopyPool (DevicePathNodeLength (Node), Node);\r
95276127 1953 //\r
1954 // Print this node of the device path\r
1955 //\r
4d0a30a4
RN
1956 ToText (&Str, AlignedNode, DisplayOnly, AllowShortcuts);\r
1957 FreePool (AlignedNode);\r
1232b214 1958 \r
95276127 1959 //\r
1960 // Next device path node\r
1961 //\r
4d0a30a4 1962 Node = NextDevicePathNode (Node);\r
95276127 1963 }\r
95276127 1964\r
9d4af8fc
RN
1965 if (Str.Str == NULL) {\r
1966 return AllocateZeroPool (sizeof (CHAR16));\r
1967 } else {\r
1968 return Str.Str;\r
1969 }\r
95276127 1970}\r