]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
Fix several bugs in DevicePathLib implementation regarding the device path node and...
[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
9da38884
RN
993 UefiDevicePathLibCatPrint (\r
994 Str,\r
995 L"Sata(0x%x,0x%x,0x%x)",\r
996 Sata->HBAPortNumber,\r
997 Sata->PortMultiplierPortNumber,\r
998 Sata->Lun\r
999 );\r
cf40f28a 1000}\r
1001\r
572f5d8a 1002/**\r
48557c65 1003 Converts a I20 device path structure to its string representative.\r
572f5d8a 1004\r
48557c65 1005 @param Str The string representative of input device.\r
572f5d8a 1006 @param DevPath The input device path structure.\r
1007 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1008 of the display node is used, where applicable. If DisplayOnly\r
1009 is FALSE, then the longer text representation of the display node\r
1010 is used.\r
1011 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1012 representation for a device node can be used, where applicable.\r
1013\r
1014**/\r
95276127 1015VOID\r
1016DevPathToTextI2O (\r
1017 IN OUT POOL_PRINT *Str,\r
1018 IN VOID *DevPath,\r
1019 IN BOOLEAN DisplayOnly,\r
1020 IN BOOLEAN AllowShortcuts\r
1021 )\r
1022{\r
572f5d8a 1023 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1024\r
572f5d8a 1025 I2ODevPath = DevPath;\r
4d0a30a4 1026 UefiDevicePathLibCatPrint (Str, L"I2O(0x%x)", I2ODevPath->Tid);\r
95276127 1027}\r
1028\r
572f5d8a 1029/**\r
48557c65 1030 Converts a MAC address device path structure to its string representative.\r
572f5d8a 1031\r
48557c65 1032 @param Str The string representative of input device.\r
572f5d8a 1033 @param DevPath The input device path structure.\r
1034 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1035 of the display node is used, where applicable. If DisplayOnly\r
1036 is FALSE, then the longer text representation of the display node\r
1037 is used.\r
1038 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1039 representation for a device node can be used, where applicable.\r
1040\r
1041**/\r
95276127 1042VOID\r
1043DevPathToTextMacAddr (\r
1044 IN OUT POOL_PRINT *Str,\r
1045 IN VOID *DevPath,\r
1046 IN BOOLEAN DisplayOnly,\r
1047 IN BOOLEAN AllowShortcuts\r
1048 )\r
1049{\r
572f5d8a 1050 MAC_ADDR_DEVICE_PATH *MacDevPath;\r
95276127 1051 UINTN HwAddressSize;\r
1052 UINTN Index;\r
1053\r
572f5d8a 1054 MacDevPath = DevPath;\r
95276127 1055\r
1056 HwAddressSize = sizeof (EFI_MAC_ADDRESS);\r
572f5d8a 1057 if (MacDevPath->IfType == 0x01 || MacDevPath->IfType == 0x00) {\r
95276127 1058 HwAddressSize = 6;\r
1059 }\r
1060\r
4d0a30a4 1061 UefiDevicePathLibCatPrint (Str, L"MAC(");\r
95276127 1062\r
1063 for (Index = 0; Index < HwAddressSize; Index++) {\r
4d0a30a4 1064 UefiDevicePathLibCatPrint (Str, L"%02x", MacDevPath->MacAddress.Addr[Index]);\r
95276127 1065 }\r
1066\r
4d0a30a4 1067 UefiDevicePathLibCatPrint (Str, L",0x%x)", MacDevPath->IfType);\r
95276127 1068}\r
1069\r
052019e1 1070/**\r
1071 Converts network protocol string to its text representation.\r
1072\r
1073 @param Str The string representative of input device.\r
1074 @param Protocol The network protocol ID.\r
1075\r
1076**/\r
1077VOID\r
1078CatNetworkProtocol (\r
1079 IN OUT POOL_PRINT *Str,\r
1080 IN UINT16 Protocol\r
1081 )\r
1082{\r
1083 if (Protocol == RFC_1700_TCP_PROTOCOL) {\r
4d0a30a4 1084 UefiDevicePathLibCatPrint (Str, L"TCP");\r
052019e1 1085 } else if (Protocol == RFC_1700_UDP_PROTOCOL) {\r
4d0a30a4 1086 UefiDevicePathLibCatPrint (Str, L"UDP");\r
052019e1 1087 } else {\r
4d0a30a4 1088 UefiDevicePathLibCatPrint (Str, L"0x%x", Protocol);\r
052019e1 1089 }\r
1090}\r
1091\r
4d0a30a4
RN
1092/**\r
1093 Converts IP v4 address to its text representation.\r
1094\r
1095 @param Str The string representative of input device.\r
1096 @param Address The IP v4 address.\r
1097**/\r
1098VOID\r
1099CatIPv4Address (\r
1100 IN OUT POOL_PRINT *Str,\r
1101 IN EFI_IPv4_ADDRESS *Address\r
1102 )\r
1103{\r
1104 UefiDevicePathLibCatPrint (Str, L"%d.%d.%d.%d", Address->Addr[0], Address->Addr[1], Address->Addr[2], Address->Addr[3]);\r
1105}\r
1106\r
1107/**\r
1108 Converts IP v6 address to its text representation.\r
1109\r
1110 @param Str The string representative of input device.\r
1111 @param Address The IP v6 address.\r
1112**/\r
1113VOID\r
1114CatIPv6Address (\r
1115 IN OUT POOL_PRINT *Str,\r
1116 IN EFI_IPv6_ADDRESS *Address\r
1117 )\r
1118{\r
1119 UefiDevicePathLibCatPrint (\r
1120 Str, L"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",\r
1121 Address->Addr[0], Address->Addr[1],\r
1122 Address->Addr[2], Address->Addr[3],\r
1123 Address->Addr[4], Address->Addr[5],\r
1124 Address->Addr[6], Address->Addr[7],\r
1125 Address->Addr[8], Address->Addr[9],\r
1126 Address->Addr[10], Address->Addr[11],\r
1127 Address->Addr[12], Address->Addr[13],\r
1128 Address->Addr[14], Address->Addr[15]\r
1129 );\r
1130}\r
1131\r
572f5d8a 1132/**\r
48557c65 1133 Converts a IPv4 device path structure to its string representative.\r
572f5d8a 1134\r
48557c65 1135 @param Str The string representative of input device.\r
572f5d8a 1136 @param DevPath The input device path structure.\r
1137 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1138 of the display node is used, where applicable. If DisplayOnly\r
1139 is FALSE, then the longer text representation of the display node\r
1140 is used.\r
1141 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1142 representation for a device node can be used, where applicable.\r
1143\r
1144**/\r
95276127 1145VOID\r
1146DevPathToTextIPv4 (\r
1147 IN OUT POOL_PRINT *Str,\r
1148 IN VOID *DevPath,\r
1149 IN BOOLEAN DisplayOnly,\r
1150 IN BOOLEAN AllowShortcuts\r
1151 )\r
1152{\r
572f5d8a 1153 IPv4_DEVICE_PATH *IPDevPath;\r
95276127 1154\r
572f5d8a 1155 IPDevPath = DevPath;\r
4d0a30a4
RN
1156 UefiDevicePathLibCatPrint (Str, L"IPv4(");\r
1157 CatIPv4Address (Str, &IPDevPath->RemoteIpAddress);\r
1158\r
572f5d8a 1159 if (DisplayOnly) {\r
4d0a30a4 1160 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1161 return ;\r
1162 }\r
1163\r
4d0a30a4
RN
1164 UefiDevicePathLibCatPrint (Str, L",");\r
1165 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1166\r
4d0a30a4
RN
1167 UefiDevicePathLibCatPrint (Str, L",%s,", IPDevPath->StaticIpAddress ? L"Static" : L"DHCP");\r
1168 CatIPv4Address (Str, &IPDevPath->LocalIpAddress);\r
e9b3cd55 1169 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv4_DEVICE_PATH)) {\r
4d0a30a4
RN
1170 UefiDevicePathLibCatPrint (Str, L",");\r
1171 CatIPv4Address (Str, &IPDevPath->GatewayIpAddress);\r
1172 UefiDevicePathLibCatPrint (Str, L",");\r
1173 CatIPv4Address (Str, &IPDevPath->SubnetMask);\r
e9b3cd55 1174 }\r
4d0a30a4 1175 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1176}\r
1177\r
572f5d8a 1178/**\r
48557c65 1179 Converts a IPv6 device path structure to its string representative.\r
572f5d8a 1180\r
48557c65 1181 @param Str The string representative of input device.\r
572f5d8a 1182 @param DevPath The input device path structure.\r
1183 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1184 of the display node is used, where applicable. If DisplayOnly\r
1185 is FALSE, then the longer text representation of the display node\r
1186 is used.\r
1187 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1188 representation for a device node can be used, where applicable.\r
1189\r
1190**/\r
95276127 1191VOID\r
1192DevPathToTextIPv6 (\r
1193 IN OUT POOL_PRINT *Str,\r
1194 IN VOID *DevPath,\r
1195 IN BOOLEAN DisplayOnly,\r
1196 IN BOOLEAN AllowShortcuts\r
1197 )\r
1198{\r
572f5d8a 1199 IPv6_DEVICE_PATH *IPDevPath;\r
95276127 1200\r
572f5d8a 1201 IPDevPath = DevPath;\r
4d0a30a4
RN
1202 UefiDevicePathLibCatPrint (Str, L"IPv6(");\r
1203 CatIPv6Address (Str, &IPDevPath->RemoteIpAddress);\r
572f5d8a 1204 if (DisplayOnly) {\r
4d0a30a4 1205 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1206 return ;\r
1207 }\r
4d0a30a4
RN
1208 \r
1209 UefiDevicePathLibCatPrint (Str, L",");\r
1210 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
052019e1 1211\r
501793fa
RN
1212 switch (IPDevPath->IpAddressOrigin) {\r
1213 case 0:\r
4d0a30a4 1214 UefiDevicePathLibCatPrint (Str, L",Static,");\r
501793fa
RN
1215 break;\r
1216 case 1:\r
4d0a30a4 1217 UefiDevicePathLibCatPrint (Str, L",StatelessAutoConfigure,");\r
501793fa
RN
1218 break;\r
1219 default:\r
4d0a30a4 1220 UefiDevicePathLibCatPrint (Str, L",StatefulAutoConfigure,");\r
501793fa
RN
1221 break;\r
1222 }\r
1223\r
4d0a30a4 1224 CatIPv6Address (Str, &IPDevPath->LocalIpAddress);\r
501793fa
RN
1225\r
1226 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv6_DEVICE_PATH)) {\r
4d0a30a4
RN
1227 UefiDevicePathLibCatPrint (Str, L",0x%x,", IPDevPath->PrefixLength);\r
1228 CatIPv6Address (Str, &IPDevPath->GatewayIpAddress);\r
501793fa 1229 }\r
4d0a30a4 1230 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1231}\r
1232\r
572f5d8a 1233/**\r
48557c65 1234 Converts an Infini Band device path structure to its string representative.\r
572f5d8a 1235\r
48557c65 1236 @param Str The string representative of input device.\r
572f5d8a 1237 @param DevPath The input device path structure.\r
1238 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1239 of the display node is used, where applicable. If DisplayOnly\r
1240 is FALSE, then the longer text representation of the display node\r
1241 is used.\r
1242 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1243 representation for a device node can be used, where applicable.\r
1244\r
1245**/\r
95276127 1246VOID\r
1247DevPathToTextInfiniBand (\r
1248 IN OUT POOL_PRINT *Str,\r
1249 IN VOID *DevPath,\r
1250 IN BOOLEAN DisplayOnly,\r
1251 IN BOOLEAN AllowShortcuts\r
1252 )\r
1253{\r
1254 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1255\r
1256 InfiniBand = DevPath;\r
4d0a30a4 1257 UefiDevicePathLibCatPrint (\r
95276127 1258 Str,\r
cf40f28a 1259 L"Infiniband(0x%x,%g,0x%lx,0x%lx,0x%lx)",\r
e9b3cd55 1260 InfiniBand->ResourceFlags,\r
95276127 1261 InfiniBand->PortGid,\r
1262 InfiniBand->ServiceId,\r
1263 InfiniBand->TargetPortId,\r
1264 InfiniBand->DeviceId\r
1265 );\r
1266}\r
1267\r
572f5d8a 1268/**\r
48557c65 1269 Converts a UART device path structure to its string representative.\r
572f5d8a 1270\r
48557c65 1271 @param Str The string representative of input device.\r
572f5d8a 1272 @param DevPath The input device path structure.\r
1273 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1274 of the display node is used, where applicable. If DisplayOnly\r
1275 is FALSE, then the longer text representation of the display node\r
1276 is used.\r
1277 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1278 representation for a device node can be used, where applicable.\r
1279\r
1280**/\r
95276127 1281VOID\r
1282DevPathToTextUart (\r
1283 IN OUT POOL_PRINT *Str,\r
1284 IN VOID *DevPath,\r
1285 IN BOOLEAN DisplayOnly,\r
1286 IN BOOLEAN AllowShortcuts\r
1287 )\r
1288{\r
1289 UART_DEVICE_PATH *Uart;\r
1290 CHAR8 Parity;\r
1291\r
1292 Uart = DevPath;\r
1293 switch (Uart->Parity) {\r
1294 case 0:\r
1295 Parity = 'D';\r
1296 break;\r
1297\r
1298 case 1:\r
1299 Parity = 'N';\r
1300 break;\r
1301\r
1302 case 2:\r
1303 Parity = 'E';\r
1304 break;\r
1305\r
1306 case 3:\r
1307 Parity = 'O';\r
1308 break;\r
1309\r
1310 case 4:\r
1311 Parity = 'M';\r
1312 break;\r
1313\r
1314 case 5:\r
1315 Parity = 'S';\r
1316 break;\r
1317\r
1318 default:\r
1319 Parity = 'x';\r
1320 break;\r
1321 }\r
1322\r
1323 if (Uart->BaudRate == 0) {\r
4d0a30a4 1324 UefiDevicePathLibCatPrint (Str, L"Uart(DEFAULT,");\r
95276127 1325 } else {\r
4d0a30a4 1326 UefiDevicePathLibCatPrint (Str, L"Uart(%ld,", Uart->BaudRate);\r
95276127 1327 }\r
1328\r
1329 if (Uart->DataBits == 0) {\r
4d0a30a4 1330 UefiDevicePathLibCatPrint (Str, L"DEFAULT,");\r
95276127 1331 } else {\r
4d0a30a4 1332 UefiDevicePathLibCatPrint (Str, L"%d,", Uart->DataBits);\r
95276127 1333 }\r
1334\r
4d0a30a4 1335 UefiDevicePathLibCatPrint (Str, L"%c,", Parity);\r
95276127 1336\r
1337 switch (Uart->StopBits) {\r
1338 case 0:\r
4d0a30a4 1339 UefiDevicePathLibCatPrint (Str, L"D)");\r
95276127 1340 break;\r
1341\r
1342 case 1:\r
4d0a30a4 1343 UefiDevicePathLibCatPrint (Str, L"1)");\r
95276127 1344 break;\r
1345\r
1346 case 2:\r
4d0a30a4 1347 UefiDevicePathLibCatPrint (Str, L"1.5)");\r
95276127 1348 break;\r
1349\r
1350 case 3:\r
4d0a30a4 1351 UefiDevicePathLibCatPrint (Str, L"2)");\r
95276127 1352 break;\r
1353\r
1354 default:\r
4d0a30a4 1355 UefiDevicePathLibCatPrint (Str, L"x)");\r
95276127 1356 break;\r
1357 }\r
1358}\r
1359\r
572f5d8a 1360/**\r
48557c65 1361 Converts an iSCSI device path structure to its string representative.\r
572f5d8a 1362\r
48557c65 1363 @param Str The string representative of input device.\r
572f5d8a 1364 @param DevPath The input device path structure.\r
1365 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1366 of the display node is used, where applicable. If DisplayOnly\r
1367 is FALSE, then the longer text representation of the display node\r
1368 is used.\r
1369 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1370 representation for a device node can be used, where applicable.\r
1371\r
1372**/\r
95276127 1373VOID\r
1374DevPathToTextiSCSI (\r
1375 IN OUT POOL_PRINT *Str,\r
1376 IN VOID *DevPath,\r
1377 IN BOOLEAN DisplayOnly,\r
1378 IN BOOLEAN AllowShortcuts\r
1379 )\r
1380{\r
572f5d8a 1381 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
95276127 1382 UINT16 Options;\r
1383\r
572f5d8a 1384 ISCSIDevPath = DevPath;\r
4d0a30a4 1385 UefiDevicePathLibCatPrint (\r
95276127 1386 Str,\r
cf40f28a 1387 L"iSCSI(%a,0x%x,0x%lx,",\r
184f7d83 1388 ISCSIDevPath->TargetName,\r
e9b3cd55 1389 ISCSIDevPath->TargetPortalGroupTag,\r
572f5d8a 1390 ISCSIDevPath->Lun\r
95276127 1391 );\r
1392\r
572f5d8a 1393 Options = ISCSIDevPath->LoginOption;\r
4d0a30a4
RN
1394 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
1395 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
572f5d8a 1396 if (((Options >> 11) & 0x0001) != 0) {\r
4d0a30a4 1397 UefiDevicePathLibCatPrint (Str, L"%s,", L"None");\r
572f5d8a 1398 } else if (((Options >> 12) & 0x0001) != 0) {\r
4d0a30a4 1399 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_UNI");\r
95276127 1400 } else {\r
4d0a30a4 1401 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_BI");\r
95276127 1402\r
1403 }\r
1404\r
4d0a30a4 1405 UefiDevicePathLibCatPrint (Str, L"%s)", (ISCSIDevPath->NetworkProtocol == 0) ? L"TCP" : L"reserved");\r
95276127 1406}\r
1407\r
8f97f911 1408/**\r
1409 Converts a VLAN device path structure to its string representative.\r
1410\r
1411 @param Str The string representative of input device.\r
1412 @param DevPath The input device path structure.\r
1413 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1414 of the display node is used, where applicable. If DisplayOnly\r
1415 is FALSE, then the longer text representation of the display node\r
1416 is used.\r
1417 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1418 representation for a device node can be used, where applicable.\r
1419\r
1420**/\r
1421VOID\r
1422DevPathToTextVlan (\r
1423 IN OUT POOL_PRINT *Str,\r
1424 IN VOID *DevPath,\r
1425 IN BOOLEAN DisplayOnly,\r
1426 IN BOOLEAN AllowShortcuts\r
1427 )\r
1428{\r
1429 VLAN_DEVICE_PATH *Vlan;\r
1430\r
1431 Vlan = DevPath;\r
4d0a30a4 1432 UefiDevicePathLibCatPrint (Str, L"Vlan(%d)", Vlan->VlanId);\r
8f97f911 1433}\r
1434\r
572f5d8a 1435/**\r
48557c65 1436 Converts a Hard drive device path structure to its string representative.\r
572f5d8a 1437\r
48557c65 1438 @param Str The string representative of input device.\r
572f5d8a 1439 @param DevPath The input device path structure.\r
1440 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1441 of the display node is used, where applicable. If DisplayOnly\r
1442 is FALSE, then the longer text representation of the display node\r
1443 is used.\r
1444 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1445 representation for a device node can be used, where applicable.\r
1446\r
1447**/\r
95276127 1448VOID\r
1449DevPathToTextHardDrive (\r
1450 IN OUT POOL_PRINT *Str,\r
1451 IN VOID *DevPath,\r
1452 IN BOOLEAN DisplayOnly,\r
1453 IN BOOLEAN AllowShortcuts\r
1454 )\r
1455{\r
1456 HARDDRIVE_DEVICE_PATH *Hd;\r
1457\r
1458 Hd = DevPath;\r
1459 switch (Hd->SignatureType) {\r
95276127 1460 case SIGNATURE_TYPE_MBR:\r
4d0a30a4 1461 UefiDevicePathLibCatPrint (\r
95276127 1462 Str,\r
cf40f28a 1463 L"HD(%d,%s,0x%08x,",\r
e9b3cd55 1464 Hd->PartitionNumber,\r
95276127 1465 L"MBR",\r
e9b3cd55 1466 *((UINT32 *) (&(Hd->Signature[0])))\r
95276127 1467 );\r
1468 break;\r
1469\r
1470 case SIGNATURE_TYPE_GUID:\r
4d0a30a4 1471 UefiDevicePathLibCatPrint (\r
95276127 1472 Str,\r
1473 L"HD(%d,%s,%g,",\r
e9b3cd55 1474 Hd->PartitionNumber,\r
cf40f28a 1475 L"GPT",\r
95276127 1476 (EFI_GUID *) &(Hd->Signature[0])\r
1477 );\r
1478 break;\r
1479\r
1480 default:\r
4d0a30a4 1481 UefiDevicePathLibCatPrint (\r
cf40f28a 1482 Str,\r
1483 L"HD(%d,%d,0,",\r
e9b3cd55
RN
1484 Hd->PartitionNumber,\r
1485 Hd->SignatureType\r
cf40f28a 1486 );\r
95276127 1487 break;\r
1488 }\r
1489\r
4d0a30a4 1490 UefiDevicePathLibCatPrint (Str, L"0x%lx,0x%lx)", Hd->PartitionStart, Hd->PartitionSize);\r
95276127 1491}\r
1492\r
572f5d8a 1493/**\r
48557c65 1494 Converts a CDROM device path structure to its string representative.\r
572f5d8a 1495\r
48557c65 1496 @param Str The string representative of input device.\r
572f5d8a 1497 @param DevPath The input device path structure.\r
1498 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1499 of the display node is used, where applicable. If DisplayOnly\r
1500 is FALSE, then the longer text representation of the display node\r
1501 is used.\r
1502 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1503 representation for a device node can be used, where applicable.\r
1504\r
1505**/\r
95276127 1506VOID\r
1507DevPathToTextCDROM (\r
1508 IN OUT POOL_PRINT *Str,\r
1509 IN VOID *DevPath,\r
1510 IN BOOLEAN DisplayOnly,\r
1511 IN BOOLEAN AllowShortcuts\r
1512 )\r
1513{\r
1514 CDROM_DEVICE_PATH *Cd;\r
1515\r
1516 Cd = DevPath;\r
572f5d8a 1517 if (DisplayOnly) {\r
4d0a30a4 1518 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x)", Cd->BootEntry);\r
95276127 1519 return ;\r
1520 }\r
1521\r
4d0a30a4 1522 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x,0x%lx,0x%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize);\r
95276127 1523}\r
1524\r
572f5d8a 1525/**\r
48557c65 1526 Converts a File device path structure to its string representative.\r
572f5d8a 1527\r
48557c65 1528 @param Str The string representative of input device.\r
572f5d8a 1529 @param DevPath The input device path structure.\r
1530 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1531 of the display node is used, where applicable. If DisplayOnly\r
1532 is FALSE, then the longer text representation of the display node\r
1533 is used.\r
1534 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1535 representation for a device node can be used, where applicable.\r
1536\r
1537**/\r
95276127 1538VOID\r
1539DevPathToTextFilePath (\r
1540 IN OUT POOL_PRINT *Str,\r
1541 IN VOID *DevPath,\r
1542 IN BOOLEAN DisplayOnly,\r
1543 IN BOOLEAN AllowShortcuts\r
1544 )\r
1545{\r
1546 FILEPATH_DEVICE_PATH *Fp;\r
1547\r
1548 Fp = DevPath;\r
4d0a30a4 1549 UefiDevicePathLibCatPrint (Str, L"%s", Fp->PathName);\r
95276127 1550}\r
1551\r
572f5d8a 1552/**\r
48557c65 1553 Converts a Media protocol device path structure to its string representative.\r
572f5d8a 1554\r
48557c65 1555 @param Str The string representative of input device.\r
572f5d8a 1556 @param DevPath The input device path structure.\r
1557 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1558 of the display node is used, where applicable. If DisplayOnly\r
1559 is FALSE, then the longer text representation of the display node\r
1560 is used.\r
1561 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1562 representation for a device node can be used, where applicable.\r
1563\r
1564**/\r
95276127 1565VOID\r
1566DevPathToTextMediaProtocol (\r
1567 IN OUT POOL_PRINT *Str,\r
1568 IN VOID *DevPath,\r
1569 IN BOOLEAN DisplayOnly,\r
1570 IN BOOLEAN AllowShortcuts\r
1571 )\r
1572{\r
1573 MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;\r
1574\r
1575 MediaProt = DevPath;\r
4d0a30a4 1576 UefiDevicePathLibCatPrint (Str, L"Media(%g)", &MediaProt->Protocol);\r
95276127 1577}\r
1578\r
572f5d8a 1579/**\r
48557c65 1580 Converts a Firmware Volume device path structure to its string representative.\r
572f5d8a 1581\r
48557c65 1582 @param Str The string representative of input device.\r
572f5d8a 1583 @param DevPath The input device path structure.\r
1584 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1585 of the display node is used, where applicable. If DisplayOnly\r
1586 is FALSE, then the longer text representation of the display node\r
1587 is used.\r
1588 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1589 representation for a device node can be used, where applicable.\r
1590\r
1591**/\r
cf40f28a 1592VOID\r
1593DevPathToTextFv (\r
1594 IN OUT POOL_PRINT *Str,\r
1595 IN VOID *DevPath,\r
1596 IN BOOLEAN DisplayOnly,\r
1597 IN BOOLEAN AllowShortcuts\r
1598 )\r
1599{\r
1600 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
1601\r
1602 Fv = DevPath;\r
4d0a30a4 1603 UefiDevicePathLibCatPrint (Str, L"Fv(%g)", &Fv->FvName);\r
cf40f28a 1604}\r
1605\r
572f5d8a 1606/**\r
48557c65 1607 Converts a Firmware Volume File device path structure to its string representative.\r
572f5d8a 1608\r
48557c65 1609 @param Str The string representative of input device.\r
572f5d8a 1610 @param DevPath The input device path structure.\r
1611 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1612 of the display node is used, where applicable. If DisplayOnly\r
1613 is FALSE, then the longer text representation of the display node\r
1614 is used.\r
1615 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1616 representation for a device node can be used, where applicable.\r
1617\r
1618**/\r
cf40f28a 1619VOID\r
1620DevPathToTextFvFile (\r
1621 IN OUT POOL_PRINT *Str,\r
1622 IN VOID *DevPath,\r
1623 IN BOOLEAN DisplayOnly,\r
1624 IN BOOLEAN AllowShortcuts\r
1625 )\r
1626{\r
1627 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
1628\r
1629 FvFile = DevPath;\r
4d0a30a4 1630 UefiDevicePathLibCatPrint (Str, L"FvFile(%g)", &FvFile->FvFileName);\r
cf40f28a 1631}\r
1632\r
09e15613 1633/**\r
1634 Converts a Relative Offset device path structure to its string representative.\r
1635\r
1636 @param Str The string representative of input device.\r
1637 @param DevPath The input device path structure.\r
1638 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1639 of the display node is used, where applicable. If DisplayOnly\r
1640 is FALSE, then the longer text representation of the display node\r
1641 is used.\r
1642 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1643 representation for a device node can be used, where applicable.\r
1644\r
1645**/\r
1646VOID\r
1647DevPathRelativeOffsetRange (\r
1648 IN OUT POOL_PRINT *Str,\r
1649 IN VOID *DevPath,\r
1650 IN BOOLEAN DisplayOnly,\r
1651 IN BOOLEAN AllowShortcuts\r
1652 )\r
1653{\r
1654 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
1655\r
1656 Offset = DevPath;\r
4d0a30a4 1657 UefiDevicePathLibCatPrint (\r
09e15613 1658 Str,\r
7748eb28 1659 L"Offset(0x%lx,0x%lx)",\r
09e15613 1660 Offset->StartingOffset,\r
1661 Offset->EndingOffset\r
1662 );\r
1663}\r
1664\r
572f5d8a 1665/**\r
48557c65 1666 Converts a BIOS Boot Specification device path structure to its string representative.\r
572f5d8a 1667\r
48557c65 1668 @param Str The string representative of input device.\r
572f5d8a 1669 @param DevPath The input device path structure.\r
1670 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1671 of the display node is used, where applicable. If DisplayOnly\r
1672 is FALSE, then the longer text representation of the display node\r
1673 is used.\r
1674 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1675 representation for a device node can be used, where applicable.\r
1676\r
1677**/\r
95276127 1678VOID\r
1679DevPathToTextBBS (\r
1680 IN OUT POOL_PRINT *Str,\r
1681 IN VOID *DevPath,\r
1682 IN BOOLEAN DisplayOnly,\r
1683 IN BOOLEAN AllowShortcuts\r
1684 )\r
1685{\r
1686 BBS_BBS_DEVICE_PATH *Bbs;\r
1687 CHAR16 *Type;\r
1688\r
1689 Bbs = DevPath;\r
1690 switch (Bbs->DeviceType) {\r
1691 case BBS_TYPE_FLOPPY:\r
1692 Type = L"Floppy";\r
1693 break;\r
1694\r
1695 case BBS_TYPE_HARDDRIVE:\r
1696 Type = L"HD";\r
1697 break;\r
1698\r
1699 case BBS_TYPE_CDROM:\r
1700 Type = L"CDROM";\r
1701 break;\r
1702\r
1703 case BBS_TYPE_PCMCIA:\r
1704 Type = L"PCMCIA";\r
1705 break;\r
1706\r
1707 case BBS_TYPE_USB:\r
1708 Type = L"USB";\r
1709 break;\r
1710\r
1711 case BBS_TYPE_EMBEDDED_NETWORK:\r
1712 Type = L"Network";\r
1713 break;\r
1714\r
1715 default:\r
cf40f28a 1716 Type = NULL;\r
95276127 1717 break;\r
1718 }\r
1719\r
cf40f28a 1720 if (Type != NULL) {\r
4d0a30a4 1721 UefiDevicePathLibCatPrint (Str, L"BBS(%s,%a", Type, Bbs->String);\r
cf40f28a 1722 } else {\r
4d0a30a4 1723 UefiDevicePathLibCatPrint (Str, L"BBS(0x%x,%a", Bbs->DeviceType, Bbs->String);\r
cf40f28a 1724 }\r
95276127 1725\r
572f5d8a 1726 if (DisplayOnly) {\r
4d0a30a4 1727 UefiDevicePathLibCatPrint (Str, L")");\r
95276127 1728 return ;\r
1729 }\r
1730\r
4d0a30a4 1731 UefiDevicePathLibCatPrint (Str, L",0x%x)", Bbs->StatusFlag);\r
95276127 1732}\r
1733\r
572f5d8a 1734/**\r
48557c65 1735 Converts an End-of-Device-Path structure to its string representative.\r
572f5d8a 1736\r
48557c65 1737 @param Str The string representative of input device.\r
572f5d8a 1738 @param DevPath The input device path structure.\r
1739 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1740 of the display node is used, where applicable. If DisplayOnly\r
1741 is FALSE, then the longer text representation of the display node\r
1742 is used.\r
1743 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1744 representation for a device node can be used, where applicable.\r
1745\r
1746**/\r
95276127 1747VOID\r
1748DevPathToTextEndInstance (\r
1749 IN OUT POOL_PRINT *Str,\r
1750 IN VOID *DevPath,\r
1751 IN BOOLEAN DisplayOnly,\r
1752 IN BOOLEAN AllowShortcuts\r
1753 )\r
1754{\r
4d0a30a4 1755 UefiDevicePathLibCatPrint (Str, L",");\r
95276127 1756}\r
1757\r
572f5d8a 1758/**\r
48557c65 1759 Converts an unknown device path structure to its string representative.\r
572f5d8a 1760\r
48557c65 1761 @param Str The string representative of input device.\r
572f5d8a 1762 @param DevPath The input device path structure.\r
1763 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1764 of the display node is used, where applicable. If DisplayOnly\r
1765 is FALSE, then the longer text representation of the display node\r
1766 is used.\r
1767 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1768 representation for a device node can be used, where applicable.\r
1769\r
1770**/\r
95276127 1771VOID\r
1772DevPathToTextNodeUnknown (\r
1773 IN OUT POOL_PRINT *Str,\r
1774 IN VOID *DevPath,\r
1775 IN BOOLEAN DisplayOnly,\r
1776 IN BOOLEAN AllowShortcuts\r
1777 )\r
1778{\r
4d0a30a4 1779 UefiDevicePathLibCatPrint (Str, L"?");\r
95276127 1780}\r
1781\r
4d0a30a4
RN
1782GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLibDevPathToTextTable[] = {\r
1783 {HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci },\r
1784 {HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard },\r
1785 {HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap },\r
1786 {HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor },\r
1787 {HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController },\r
1788 {ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi },\r
1789 {ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextAcpiEx },\r
1790 {ACPI_DEVICE_PATH, ACPI_ADR_DP, DevPathToTextAcpiAdr },\r
1791 {MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi },\r
1792 {MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi },\r
1793 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre },\r
1794 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, DevPathToTextFibreEx },\r
1795 {MESSAGING_DEVICE_PATH, MSG_SASEX_DP, DevPathToTextSasEx },\r
1796 {MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394 },\r
1797 {MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb },\r
1798 {MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID },\r
1799 {MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit },\r
1800 {MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass },\r
1801 {MESSAGING_DEVICE_PATH, MSG_SATA_DP, DevPathToTextSata },\r
1802 {MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O },\r
1803 {MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr },\r
1804 {MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4 },\r
1805 {MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6 },\r
1806 {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand },\r
1807 {MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart },\r
1808 {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor },\r
1809 {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI },\r
1810 {MESSAGING_DEVICE_PATH, MSG_VLAN_DP, DevPathToTextVlan },\r
1811 {MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive },\r
1812 {MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM },\r
1813 {MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor },\r
1814 {MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol },\r
1815 {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath },\r
1816 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_VOL_DP, DevPathToTextFv },\r
1817 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_FILE_DP, DevPathToTextFvFile },\r
1818 {MEDIA_DEVICE_PATH, MEDIA_RELATIVE_OFFSET_RANGE_DP, DevPathRelativeOffsetRange },\r
1819 {BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS },\r
1820 {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance },\r
95276127 1821 {0, 0, NULL}\r
1822};\r
1823\r
572f5d8a 1824/**\r
1825 Converts a device node to its string representation.\r
1826\r
1827 @param DeviceNode A Pointer to the device node to be converted.\r
1828 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1829 of the display node is used, where applicable. If DisplayOnly\r
1830 is FALSE, then the longer text representation of the display node\r
1831 is used.\r
1832 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1833 representation for a device node can be used, where applicable.\r
1834\r
1835 @return A pointer to the allocated text representation of the device node or NULL if DeviceNode\r
1836 is NULL or there was insufficient memory.\r
1837\r
1838**/\r
95276127 1839CHAR16 *\r
572f5d8a 1840EFIAPI\r
4d0a30a4 1841UefiDevicePathLibConvertDeviceNodeToText (\r
95276127 1842 IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,\r
1843 IN BOOLEAN DisplayOnly,\r
1844 IN BOOLEAN AllowShortcuts\r
1845 )\r
95276127 1846{\r
4d0a30a4
RN
1847 POOL_PRINT Str;\r
1848 UINTN Index;\r
1849 DEVICE_PATH_TO_TEXT ToText;\r
95276127 1850\r
1851 if (DeviceNode == NULL) {\r
1852 return NULL;\r
1853 }\r
1854\r
1855 ZeroMem (&Str, sizeof (Str));\r
1856\r
1857 //\r
1858 // Process the device path node\r
4d0a30a4 1859 // If not found, use a generic function\r
95276127 1860 //\r
4d0a30a4
RN
1861 ToText = DevPathToTextNodeUnknown;\r
1862 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index++) {\r
1863 if (DevicePathType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1864 DevicePathSubType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
95276127 1865 ) {\r
4d0a30a4 1866 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
95276127 1867 break;\r
1868 }\r
1869 }\r
95276127 1870\r
1871 //\r
1872 // Print this node\r
1873 //\r
4d0a30a4 1874 ToText (&Str, (VOID *) DeviceNode, DisplayOnly, AllowShortcuts);\r
95276127 1875\r
9d4af8fc 1876 ASSERT (Str.Str != NULL);\r
95276127 1877 return Str.Str;\r
1878}\r
1879\r
572f5d8a 1880/**\r
1881 Converts a device path to its text representation.\r
95276127 1882\r
572f5d8a 1883 @param DevicePath A Pointer to the device to be converted.\r
1884 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
95276127 1885 of the display node is used, where applicable. If DisplayOnly\r
1886 is FALSE, then the longer text representation of the display node\r
1887 is used.\r
572f5d8a 1888 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
95276127 1889 representation for a device node can be used, where applicable.\r
1890\r
572f5d8a 1891 @return A pointer to the allocated text representation of the device path or\r
1892 NULL if DeviceNode is NULL or there was insufficient memory.\r
95276127 1893\r
572f5d8a 1894**/\r
1895CHAR16 *\r
1896EFIAPI\r
4d0a30a4 1897UefiDevicePathLibConvertDevicePathToText (\r
572f5d8a 1898 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
1899 IN BOOLEAN DisplayOnly,\r
1900 IN BOOLEAN AllowShortcuts\r
1901 )\r
95276127 1902{\r
4d0a30a4
RN
1903 POOL_PRINT Str;\r
1904 EFI_DEVICE_PATH_PROTOCOL *Node;\r
1905 EFI_DEVICE_PATH_PROTOCOL *AlignedNode;\r
1906 UINTN Index;\r
1907 DEVICE_PATH_TO_TEXT ToText;\r
95276127 1908\r
1909 if (DevicePath == NULL) {\r
1910 return NULL;\r
1911 }\r
1912\r
1913 ZeroMem (&Str, sizeof (Str));\r
1914\r
95276127 1915 //\r
1916 // Process each device path node\r
1917 //\r
4d0a30a4
RN
1918 Node = (EFI_DEVICE_PATH_PROTOCOL *) DevicePath;\r
1919 while (!IsDevicePathEnd (Node)) {\r
95276127 1920 //\r
1921 // Find the handler to dump this device path node\r
4d0a30a4 1922 // If not found, use a generic function\r
95276127 1923 //\r
4d0a30a4
RN
1924 ToText = DevPathToTextNodeUnknown;\r
1925 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index += 1) {\r
95276127 1926\r
4d0a30a4
RN
1927 if (DevicePathType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1928 DevicePathSubType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
95276127 1929 ) {\r
4d0a30a4 1930 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
95276127 1931 break;\r
1932 }\r
1933 }\r
1934 //\r
5755841f 1935 // Put a path separator in if needed\r
95276127 1936 //\r
4d0a30a4
RN
1937 if ((Str.Count != 0) && (ToText != DevPathToTextEndInstance)) {\r
1938 if (Str.Str[Str.Count] != L',') {\r
1939 UefiDevicePathLibCatPrint (&Str, L"/");\r
cf40f28a 1940 }\r
95276127 1941 }\r
1232b214 1942 \r
4d0a30a4 1943 AlignedNode = AllocateCopyPool (DevicePathNodeLength (Node), Node);\r
95276127 1944 //\r
1945 // Print this node of the device path\r
1946 //\r
4d0a30a4
RN
1947 ToText (&Str, AlignedNode, DisplayOnly, AllowShortcuts);\r
1948 FreePool (AlignedNode);\r
1232b214 1949 \r
95276127 1950 //\r
1951 // Next device path node\r
1952 //\r
4d0a30a4 1953 Node = NextDevicePathNode (Node);\r
95276127 1954 }\r
95276127 1955\r
9d4af8fc
RN
1956 if (Str.Str == NULL) {\r
1957 return AllocateZeroPool (sizeof (CHAR16));\r
1958 } else {\r
1959 return Str.Str;\r
1960 }\r
95276127 1961}\r