17270962aSWarner Losh /*- 27270962aSWarner Losh * Copyright (c) 2017 Netflix, Inc. 37270962aSWarner Losh * 47270962aSWarner Losh * Redistribution and use in source and binary forms, with or without 57270962aSWarner Losh * modification, are permitted provided that the following conditions 67270962aSWarner Losh * are met: 77270962aSWarner Losh * 1. Redistributions of source code must retain the above copyright 86decf2ccSEd Maste * notice, this list of conditions and the following disclaimer. 97270962aSWarner Losh * 2. Redistributions in binary form must reproduce the above copyright 107270962aSWarner Losh * notice, this list of conditions and the following disclaimer in the 117270962aSWarner Losh * documentation and/or other materials provided with the distribution. 127270962aSWarner Losh * 136decf2ccSEd Maste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 146decf2ccSEd Maste * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 156decf2ccSEd Maste * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 166decf2ccSEd Maste * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 176decf2ccSEd Maste * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 186decf2ccSEd Maste * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 196decf2ccSEd Maste * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 206decf2ccSEd Maste * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 216decf2ccSEd Maste * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 226decf2ccSEd Maste * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 236decf2ccSEd Maste * SUCH DAMAGE. 247270962aSWarner Losh */ 257270962aSWarner Losh 267270962aSWarner Losh /* 277270962aSWarner Losh * Routines to format EFI_DEVICE_PATHs from the UEFI standard. Much of 287270962aSWarner Losh * this file is taken from EDK2 and rototilled. 297270962aSWarner Losh */ 307270962aSWarner Losh 317270962aSWarner Losh #include <sys/cdefs.h> 327270962aSWarner Losh #include <efivar.h> 337270962aSWarner Losh #include <stdio.h> 347270962aSWarner Losh #include <string.h> 357270962aSWarner Losh 360d802f5aSWarner Losh #include "efichar.h" 370d802f5aSWarner Losh 387270962aSWarner Losh #include "efi-osdep.h" 397270962aSWarner Losh #include "efivar-dp.h" 407270962aSWarner Losh 417270962aSWarner Losh #include "uefi-dplib.h" 427270962aSWarner Losh 437270962aSWarner Losh /* 447270962aSWarner Losh * This is a lie, but since we have converted everything 457270962aSWarner Losh * from wide to narrow, it's the right lie now. 467270962aSWarner Losh */ 477270962aSWarner Losh #define UnicodeSPrint snprintf 487270962aSWarner Losh 497270962aSWarner Losh /* 507270962aSWarner Losh * Taken from MdePkg/Library/UefiDevicePathLib/DevicePathToText.c 517270962aSWarner Losh * heavily modified: 527270962aSWarner Losh * wide strings converted to narrow 537270962aSWarner Losh * Low level printing code redone for narrow strings 547270962aSWarner Losh * Routines made static 557270962aSWarner Losh * %s -> %S in spots (where it is still UCS-2) 567270962aSWarner Losh * %a (ascii) -> %s 577270962aSWarner Losh * %g -> %36s hack to print guid (see above for caveat) 587270962aSWarner Losh * some tidying up of const and deconsting. It's evil, but const 597270962aSWarner Losh * poisoning the whole file was too much. 607270962aSWarner Losh */ 617270962aSWarner Losh 627270962aSWarner Losh /** @file 637270962aSWarner Losh DevicePathToText protocol as defined in the UEFI 2.0 specification. 647270962aSWarner Losh 657270962aSWarner Losh (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> 6650668299SJose Luis Duran Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> 6711a9ff5bSJose Luis Duran SPDX-License-Identifier: BSD-2-Clause-Patent 687270962aSWarner Losh 697270962aSWarner Losh **/ 707270962aSWarner Losh 717270962aSWarner Losh // #include "UefiDevicePathLib.h" 727270962aSWarner Losh 737270962aSWarner Losh /** 747270962aSWarner Losh Concatenates a formatted unicode string to allocated pool. The caller must 757270962aSWarner Losh free the resulting buffer. 767270962aSWarner Losh 777270962aSWarner Losh @param Str Tracks the allocated pool, size in use, and 787270962aSWarner Losh amount of pool allocated. 797270962aSWarner Losh @param Fmt The format string 807270962aSWarner Losh @param ... Variable arguments based on the format string. 817270962aSWarner Losh 827270962aSWarner Losh @return Allocated buffer with the formatted string printed in it. 837270962aSWarner Losh The caller must free the allocated buffer. The buffer 847270962aSWarner Losh allocation is not packed. 857270962aSWarner Losh 867270962aSWarner Losh **/ 877270962aSWarner Losh static char * 887270962aSWarner Losh EFIAPI 897270962aSWarner Losh UefiDevicePathLibCatPrint ( 907270962aSWarner Losh IN OUT POOL_PRINT *Str, 917270962aSWarner Losh IN const char *Fmt, 927270962aSWarner Losh ... 937270962aSWarner Losh ) 947270962aSWarner Losh { 957270962aSWarner Losh UINTN Count; 967270962aSWarner Losh VA_LIST Args; 977270962aSWarner Losh 987270962aSWarner Losh VA_START (Args, Fmt); 997270962aSWarner Losh Count = vsnprintf (NULL, 0, Fmt, Args); 1007270962aSWarner Losh VA_END (Args); 1017270962aSWarner Losh 1027270962aSWarner Losh if ((Str->Count + (Count + 1)) > Str->Capacity) { 1037270962aSWarner Losh Str->Capacity = (Str->Count + (Count + 1) * 2); 1045754f582SJose Luis Duran Str->Str = reallocf ( 1055754f582SJose Luis Duran Str->Str, 1065754f582SJose Luis Duran Str->Capacity 1075754f582SJose Luis Duran ); 1087270962aSWarner Losh ASSERT (Str->Str != NULL); 1097270962aSWarner Losh } 1105754f582SJose Luis Duran 1117270962aSWarner Losh VA_START (Args, Fmt); 1127270962aSWarner Losh vsnprintf (Str->Str + Str->Count, Str->Capacity - Str->Count, Fmt, Args); 1137270962aSWarner Losh Str->Count += Count; 1147270962aSWarner Losh 1157270962aSWarner Losh VA_END (Args); 1167270962aSWarner Losh return Str->Str; 1177270962aSWarner Losh } 1187270962aSWarner Losh 1197270962aSWarner Losh /** 1207270962aSWarner Losh Converts a PCI device path structure to its string representative. 1217270962aSWarner Losh 1227270962aSWarner Losh @param Str The string representative of input device. 1237270962aSWarner Losh @param DevPath The input device path structure. 1247270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 1257270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 1267270962aSWarner Losh is FALSE, then the longer text representation of the display node 1277270962aSWarner Losh is used. 1287270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 1297270962aSWarner Losh representation for a device node can be used, where applicable. 1307270962aSWarner Losh 1317270962aSWarner Losh **/ 1327270962aSWarner Losh static VOID 1337270962aSWarner Losh DevPathToTextPci ( 1347270962aSWarner Losh IN OUT POOL_PRINT *Str, 1357270962aSWarner Losh IN VOID *DevPath, 1367270962aSWarner Losh IN BOOLEAN DisplayOnly, 1377270962aSWarner Losh IN BOOLEAN AllowShortcuts 1387270962aSWarner Losh ) 1397270962aSWarner Losh { 1407270962aSWarner Losh PCI_DEVICE_PATH *Pci; 1417270962aSWarner Losh 1427270962aSWarner Losh Pci = DevPath; 1437270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Pci(0x%x,0x%x)", Pci->Device, Pci->Function); 1447270962aSWarner Losh } 1457270962aSWarner Losh 1467270962aSWarner Losh /** 1477270962aSWarner Losh Converts a PC Card device path structure to its string representative. 1487270962aSWarner Losh 1497270962aSWarner Losh @param Str The string representative of input device. 1507270962aSWarner Losh @param DevPath The input device path structure. 1517270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 1527270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 1537270962aSWarner Losh is FALSE, then the longer text representation of the display node 1547270962aSWarner Losh is used. 1557270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 1567270962aSWarner Losh representation for a device node can be used, where applicable. 1577270962aSWarner Losh 1587270962aSWarner Losh **/ 1597270962aSWarner Losh static VOID 1607270962aSWarner Losh DevPathToTextPccard ( 1617270962aSWarner Losh IN OUT POOL_PRINT *Str, 1627270962aSWarner Losh IN VOID *DevPath, 1637270962aSWarner Losh IN BOOLEAN DisplayOnly, 1647270962aSWarner Losh IN BOOLEAN AllowShortcuts 1657270962aSWarner Losh ) 1667270962aSWarner Losh { 1677270962aSWarner Losh PCCARD_DEVICE_PATH *Pccard; 1687270962aSWarner Losh 1697270962aSWarner Losh Pccard = DevPath; 1707270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "PcCard(0x%x)", Pccard->FunctionNumber); 1717270962aSWarner Losh } 1727270962aSWarner Losh 1737270962aSWarner Losh /** 1747270962aSWarner Losh Converts a Memory Map device path structure to its string representative. 1757270962aSWarner Losh 1767270962aSWarner Losh @param Str The string representative of input device. 1777270962aSWarner Losh @param DevPath The input device path structure. 1787270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 1797270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 1807270962aSWarner Losh is FALSE, then the longer text representation of the display node 1817270962aSWarner Losh is used. 1827270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 1837270962aSWarner Losh representation for a device node can be used, where applicable. 1847270962aSWarner Losh 1857270962aSWarner Losh **/ 1867270962aSWarner Losh static VOID 1877270962aSWarner Losh DevPathToTextMemMap ( 1887270962aSWarner Losh IN OUT POOL_PRINT *Str, 1897270962aSWarner Losh IN VOID *DevPath, 1907270962aSWarner Losh IN BOOLEAN DisplayOnly, 1917270962aSWarner Losh IN BOOLEAN AllowShortcuts 1927270962aSWarner Losh ) 1937270962aSWarner Losh { 1947270962aSWarner Losh MEMMAP_DEVICE_PATH *MemMap; 1957270962aSWarner Losh 1967270962aSWarner Losh MemMap = DevPath; 1977270962aSWarner Losh UefiDevicePathLibCatPrint ( 1987270962aSWarner Losh Str, 1997270962aSWarner Losh "MemoryMapped(0x%x,0x%lx,0x%lx)", 2007270962aSWarner Losh MemMap->MemoryType, 2017270962aSWarner Losh MemMap->StartingAddress, 2027270962aSWarner Losh MemMap->EndingAddress 2037270962aSWarner Losh ); 2047270962aSWarner Losh } 2057270962aSWarner Losh 2067270962aSWarner Losh /** 2077270962aSWarner Losh Converts a Vendor device path structure to its string representative. 2087270962aSWarner Losh 2097270962aSWarner Losh @param Str The string representative of input device. 2107270962aSWarner Losh @param DevPath The input device path structure. 2117270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 2127270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 2137270962aSWarner Losh is FALSE, then the longer text representation of the display node 2147270962aSWarner Losh is used. 2157270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 2167270962aSWarner Losh representation for a device node can be used, where applicable. 2177270962aSWarner Losh 2187270962aSWarner Losh **/ 2197270962aSWarner Losh static VOID 2207270962aSWarner Losh DevPathToTextVendor ( 2217270962aSWarner Losh IN OUT POOL_PRINT *Str, 2227270962aSWarner Losh IN VOID *DevPath, 2237270962aSWarner Losh IN BOOLEAN DisplayOnly, 2247270962aSWarner Losh IN BOOLEAN AllowShortcuts 2257270962aSWarner Losh ) 2267270962aSWarner Losh { 2277270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor; 2287270962aSWarner Losh const char *Type; 2297270962aSWarner Losh UINTN Index; 2307270962aSWarner Losh UINTN DataLength; 2317270962aSWarner Losh UINT32 FlowControlMap; 2327270962aSWarner Losh UINT16 Info; 2337270962aSWarner Losh 2347270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)DevPath; 2357270962aSWarner Losh switch (DevicePathType (&Vendor->Header)) { 2367270962aSWarner Losh case HARDWARE_DEVICE_PATH: 2377270962aSWarner Losh Type = "Hw"; 2387270962aSWarner Losh break; 2397270962aSWarner Losh 2407270962aSWarner Losh case MESSAGING_DEVICE_PATH: 2417270962aSWarner Losh Type = "Msg"; 2427270962aSWarner Losh if (AllowShortcuts) { 2437270962aSWarner Losh if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) { 2447270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "VenPcAnsi()"); 2457270962aSWarner Losh return; 2467270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) { 2477270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "VenVt100()"); 2487270962aSWarner Losh return; 2497270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) { 2507270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "VenVt100Plus()"); 2517270962aSWarner Losh return; 2527270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) { 25391a35e58SJose Luis Duran UefiDevicePathLibCatPrint (Str, "VenUtf8()"); 2547270962aSWarner Losh return; 2557270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid)) { 2567270962aSWarner Losh FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *)Vendor)->FlowControlMap); 2577270962aSWarner Losh switch (FlowControlMap & 0x00000003) { 2587270962aSWarner Losh case 0: 2597270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UartFlowCtrl(%s)", "None"); 2607270962aSWarner Losh break; 2617270962aSWarner Losh 2627270962aSWarner Losh case 1: 2637270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UartFlowCtrl(%s)", "Hardware"); 2647270962aSWarner Losh break; 2657270962aSWarner Losh 2667270962aSWarner Losh case 2: 2677270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UartFlowCtrl(%s)", "XonXoff"); 2687270962aSWarner Losh break; 2697270962aSWarner Losh 2707270962aSWarner Losh default: 2717270962aSWarner Losh break; 2727270962aSWarner Losh } 2737270962aSWarner Losh 2747270962aSWarner Losh return; 2757270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiSasDevicePathGuid)) { 2767270962aSWarner Losh UefiDevicePathLibCatPrint ( 2777270962aSWarner Losh Str, 2787270962aSWarner Losh "SAS(0x%lx,0x%lx,0x%x,", 2797270962aSWarner Losh ((SAS_DEVICE_PATH *)Vendor)->SasAddress, 2807270962aSWarner Losh ((SAS_DEVICE_PATH *)Vendor)->Lun, 2817270962aSWarner Losh ((SAS_DEVICE_PATH *)Vendor)->RelativeTargetPort 2827270962aSWarner Losh ); 2837270962aSWarner Losh Info = (((SAS_DEVICE_PATH *)Vendor)->DeviceTopology); 2847270962aSWarner Losh if (((Info & 0x0f) == 0) && ((Info & BIT7) == 0)) { 2857270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "NoTopology,0,0,0,"); 2867270962aSWarner Losh } else if (((Info & 0x0f) <= 2) && ((Info & BIT7) == 0)) { 2877270962aSWarner Losh UefiDevicePathLibCatPrint ( 2887270962aSWarner Losh Str, 2897270962aSWarner Losh "%s,%s,%s,", 2907270962aSWarner Losh ((Info & BIT4) != 0) ? "SATA" : "SAS", 2917270962aSWarner Losh ((Info & BIT5) != 0) ? "External" : "Internal", 2927270962aSWarner Losh ((Info & BIT6) != 0) ? "Expanded" : "Direct" 2937270962aSWarner Losh ); 2947270962aSWarner Losh if ((Info & 0x0f) == 1) { 2957270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0,"); 2967270962aSWarner Losh } else { 2977270962aSWarner Losh // 2987270962aSWarner Losh // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256 2997270962aSWarner Losh // 3007270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x,", ((Info >> 8) & 0xff) + 1); 3017270962aSWarner Losh } 3027270962aSWarner Losh } else { 3037270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x,0,0,0,", Info); 3047270962aSWarner Losh } 3057270962aSWarner Losh 3067270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x)", ((SAS_DEVICE_PATH *)Vendor)->Reserved); 3077270962aSWarner Losh return; 3087270962aSWarner Losh } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) { 3097270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "DebugPort()"); 3107270962aSWarner Losh return; 3117270962aSWarner Losh } 3127270962aSWarner Losh } 3135754f582SJose Luis Duran 3147270962aSWarner Losh break; 3157270962aSWarner Losh 3167270962aSWarner Losh case MEDIA_DEVICE_PATH: 3177270962aSWarner Losh Type = "Media"; 3187270962aSWarner Losh break; 3197270962aSWarner Losh 3207270962aSWarner Losh default: 3217270962aSWarner Losh Type = "?"; 3227270962aSWarner Losh break; 3237270962aSWarner Losh } 3247270962aSWarner Losh 3257270962aSWarner Losh DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH); 3267270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Ven%s(%36s", Type, G(&Vendor->Guid)); 3277270962aSWarner Losh if (DataLength != 0) { 3287270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 3297270962aSWarner Losh for (Index = 0; Index < DataLength; Index++) { 3307270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", ((VENDOR_DEVICE_PATH_WITH_DATA *)Vendor)->VendorDefinedData[Index]); 3317270962aSWarner Losh } 3327270962aSWarner Losh } 3337270962aSWarner Losh 3347270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 3357270962aSWarner Losh } 3367270962aSWarner Losh 3377270962aSWarner Losh /** 3387270962aSWarner Losh Converts a Controller device path structure to its string representative. 3397270962aSWarner Losh 3407270962aSWarner Losh @param Str The string representative of input device. 3417270962aSWarner Losh @param DevPath The input device path structure. 3427270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 3437270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 3447270962aSWarner Losh is FALSE, then the longer text representation of the display node 3457270962aSWarner Losh is used. 3467270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 3477270962aSWarner Losh representation for a device node can be used, where applicable. 3487270962aSWarner Losh 3497270962aSWarner Losh **/ 3507270962aSWarner Losh static VOID 3517270962aSWarner Losh DevPathToTextController ( 3527270962aSWarner Losh IN OUT POOL_PRINT *Str, 3537270962aSWarner Losh IN VOID *DevPath, 3547270962aSWarner Losh IN BOOLEAN DisplayOnly, 3557270962aSWarner Losh IN BOOLEAN AllowShortcuts 3567270962aSWarner Losh ) 3577270962aSWarner Losh { 3587270962aSWarner Losh CONTROLLER_DEVICE_PATH *Controller; 3597270962aSWarner Losh 3607270962aSWarner Losh Controller = DevPath; 3617270962aSWarner Losh UefiDevicePathLibCatPrint ( 3627270962aSWarner Losh Str, 3637270962aSWarner Losh "Ctrl(0x%x)", 3647270962aSWarner Losh Controller->ControllerNumber 3657270962aSWarner Losh ); 3667270962aSWarner Losh } 3677270962aSWarner Losh 3687270962aSWarner Losh /** 3697270962aSWarner Losh Converts a BMC device path structure to its string representative. 3707270962aSWarner Losh 3717270962aSWarner Losh @param Str The string representative of input device. 3727270962aSWarner Losh @param DevPath The input device path structure. 3737270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 3747270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 3757270962aSWarner Losh is FALSE, then the longer text representation of the display node 3767270962aSWarner Losh is used. 3777270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 3787270962aSWarner Losh representation for a device node can be used, where applicable. 3797270962aSWarner Losh 3807270962aSWarner Losh **/ 3817270962aSWarner Losh static VOID 3827270962aSWarner Losh DevPathToTextBmc ( 3837270962aSWarner Losh IN OUT POOL_PRINT *Str, 3847270962aSWarner Losh IN VOID *DevPath, 3857270962aSWarner Losh IN BOOLEAN DisplayOnly, 3867270962aSWarner Losh IN BOOLEAN AllowShortcuts 3877270962aSWarner Losh ) 3887270962aSWarner Losh { 3897270962aSWarner Losh BMC_DEVICE_PATH *Bmc; 3907270962aSWarner Losh 3917270962aSWarner Losh Bmc = DevPath; 3927270962aSWarner Losh UefiDevicePathLibCatPrint ( 3937270962aSWarner Losh Str, 3947270962aSWarner Losh "BMC(0x%x,0x%lx)", 3957270962aSWarner Losh Bmc->InterfaceType, 3967270962aSWarner Losh ReadUnaligned64 ((&Bmc->BaseAddress)) 3977270962aSWarner Losh ); 3987270962aSWarner Losh } 3997270962aSWarner Losh 4007270962aSWarner Losh /** 4017270962aSWarner Losh Converts a ACPI device path structure to its string representative. 4027270962aSWarner Losh 4037270962aSWarner Losh @param Str The string representative of input device. 4047270962aSWarner Losh @param DevPath The input device path structure. 4057270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 4067270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 4077270962aSWarner Losh is FALSE, then the longer text representation of the display node 4087270962aSWarner Losh is used. 4097270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 4107270962aSWarner Losh representation for a device node can be used, where applicable. 4117270962aSWarner Losh 4127270962aSWarner Losh **/ 4137270962aSWarner Losh static VOID 4147270962aSWarner Losh DevPathToTextAcpi ( 4157270962aSWarner Losh IN OUT POOL_PRINT *Str, 4167270962aSWarner Losh IN VOID *DevPath, 4177270962aSWarner Losh IN BOOLEAN DisplayOnly, 4187270962aSWarner Losh IN BOOLEAN AllowShortcuts 4197270962aSWarner Losh ) 4207270962aSWarner Losh { 4217270962aSWarner Losh ACPI_HID_DEVICE_PATH *Acpi; 4227270962aSWarner Losh 4237270962aSWarner Losh Acpi = DevPath; 4247270962aSWarner Losh if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) { 4257270962aSWarner Losh switch (EISA_ID_TO_NUM (Acpi->HID)) { 4267270962aSWarner Losh case 0x0a03: 4277270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "PciRoot(0x%x)", Acpi->UID); 4287270962aSWarner Losh break; 4297270962aSWarner Losh 4307270962aSWarner Losh case 0x0a08: 4317270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "PcieRoot(0x%x)", Acpi->UID); 4327270962aSWarner Losh break; 4337270962aSWarner Losh 4347270962aSWarner Losh case 0x0604: 4357270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Floppy(0x%x)", Acpi->UID); 4367270962aSWarner Losh break; 4377270962aSWarner Losh 4387270962aSWarner Losh case 0x0301: 4397270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Keyboard(0x%x)", Acpi->UID); 4407270962aSWarner Losh break; 4417270962aSWarner Losh 4427270962aSWarner Losh case 0x0501: 4437270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Serial(0x%x)", Acpi->UID); 4447270962aSWarner Losh break; 4457270962aSWarner Losh 4467270962aSWarner Losh case 0x0401: 4477270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "ParallelPort(0x%x)", Acpi->UID); 4487270962aSWarner Losh break; 4497270962aSWarner Losh 4507270962aSWarner Losh default: 4517270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Acpi(PNP%04x,0x%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID); 4527270962aSWarner Losh break; 4537270962aSWarner Losh } 4547270962aSWarner Losh } else { 4557270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Acpi(0x%08x,0x%x)", Acpi->HID, Acpi->UID); 4567270962aSWarner Losh } 4577270962aSWarner Losh } 4587270962aSWarner Losh 4597270962aSWarner Losh /** 4607270962aSWarner Losh Converts a ACPI extended HID device path structure to its string representative. 4617270962aSWarner Losh 4627270962aSWarner Losh @param Str The string representative of input device. 4637270962aSWarner Losh @param DevPath The input device path structure. 4647270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 4657270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 4667270962aSWarner Losh is FALSE, then the longer text representation of the display node 4677270962aSWarner Losh is used. 4687270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 4697270962aSWarner Losh representation for a device node can be used, where applicable. 4707270962aSWarner Losh 4717270962aSWarner Losh **/ 4727270962aSWarner Losh static VOID 4737270962aSWarner Losh DevPathToTextAcpiEx ( 4747270962aSWarner Losh IN OUT POOL_PRINT *Str, 4757270962aSWarner Losh IN VOID *DevPath, 4767270962aSWarner Losh IN BOOLEAN DisplayOnly, 4777270962aSWarner Losh IN BOOLEAN AllowShortcuts 4787270962aSWarner Losh ) 4797270962aSWarner Losh { 4807270962aSWarner Losh ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx; 4817270962aSWarner Losh char HIDText[11]; 4827270962aSWarner Losh char CIDText[11]; 483*3f0efe05SJose Luis Duran UINTN CurrentLength; 484*3f0efe05SJose Luis Duran CHAR8 *CurrentPos; 485*3f0efe05SJose Luis Duran UINTN NextStringOffset; 486*3f0efe05SJose Luis Duran CHAR8 *Strings[3]; 487*3f0efe05SJose Luis Duran UINT8 HidStrIndex; 488*3f0efe05SJose Luis Duran UINT8 UidStrIndex; 489*3f0efe05SJose Luis Duran UINT8 CidStrIndex; 490*3f0efe05SJose Luis Duran UINT8 StrIndex; 4917270962aSWarner Losh 492*3f0efe05SJose Luis Duran HidStrIndex = 0; 493*3f0efe05SJose Luis Duran UidStrIndex = 1; 494*3f0efe05SJose Luis Duran CidStrIndex = 2; 4957270962aSWarner Losh AcpiEx = DevPath; 496*3f0efe05SJose Luis Duran Strings[HidStrIndex] = NULL; 497*3f0efe05SJose Luis Duran Strings[UidStrIndex] = NULL; 498*3f0efe05SJose Luis Duran Strings[CidStrIndex] = NULL; 499*3f0efe05SJose Luis Duran CurrentLength = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH); 500*3f0efe05SJose Luis Duran CurrentPos = (CHAR8 *)(((UINT8 *)AcpiEx) + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH)); 501*3f0efe05SJose Luis Duran StrIndex = 0; 502*3f0efe05SJose Luis Duran while (CurrentLength < AcpiEx->Header.Length[0] && StrIndex < ARRAY_SIZE (Strings)) { 503*3f0efe05SJose Luis Duran Strings[StrIndex] = CurrentPos; 504*3f0efe05SJose Luis Duran NextStringOffset = AsciiStrLen (CurrentPos) + 1; 505*3f0efe05SJose Luis Duran CurrentLength += NextStringOffset; 506*3f0efe05SJose Luis Duran CurrentPos += NextStringOffset; 507*3f0efe05SJose Luis Duran StrIndex++; 508*3f0efe05SJose Luis Duran } 5097270962aSWarner Losh 510a51ae721SJose Luis Duran if (DisplayOnly) { 511a51ae721SJose Luis Duran if ((EISA_ID_TO_NUM (AcpiEx->HID) == 0x0A03) || 5125754f582SJose Luis Duran ((EISA_ID_TO_NUM (AcpiEx->CID) == 0x0A03) && (EISA_ID_TO_NUM (AcpiEx->HID) != 0x0A08))) 5135754f582SJose Luis Duran { 514*3f0efe05SJose Luis Duran if (Strings[UidStrIndex] != NULL) { 515*3f0efe05SJose Luis Duran UefiDevicePathLibCatPrint (Str, "PciRoot(%s)", Strings[UidStrIndex]); 516a51ae721SJose Luis Duran } else { 517a51ae721SJose Luis Duran UefiDevicePathLibCatPrint (Str, "PciRoot(0x%x)", AcpiEx->UID); 518a51ae721SJose Luis Duran } 5195754f582SJose Luis Duran 520a51ae721SJose Luis Duran return; 521a51ae721SJose Luis Duran } 522a51ae721SJose Luis Duran 5235754f582SJose Luis Duran if ((EISA_ID_TO_NUM (AcpiEx->HID) == 0x0A08) || (EISA_ID_TO_NUM (AcpiEx->CID) == 0x0A08)) { 524*3f0efe05SJose Luis Duran if (Strings[UidStrIndex] != NULL) { 525*3f0efe05SJose Luis Duran UefiDevicePathLibCatPrint (Str, "PcieRoot(%s)", Strings[UidStrIndex]); 526a51ae721SJose Luis Duran } else { 527a51ae721SJose Luis Duran UefiDevicePathLibCatPrint (Str, "PcieRoot(0x%x)", AcpiEx->UID); 528a51ae721SJose Luis Duran } 5295754f582SJose Luis Duran 530a51ae721SJose Luis Duran return; 531a51ae721SJose Luis Duran } 532a51ae721SJose Luis Duran } 533a51ae721SJose Luis Duran 5347270962aSWarner Losh // 5357270962aSWarner Losh // Converts EISA identification to string. 5367270962aSWarner Losh // 5377270962aSWarner Losh UnicodeSPrint ( 5387270962aSWarner Losh HIDText, 5397270962aSWarner Losh sizeof (HIDText), 5407270962aSWarner Losh "%c%c%c%04X", 5417270962aSWarner Losh ((AcpiEx->HID >> 10) & 0x1f) + 'A' - 1, 5427270962aSWarner Losh ((AcpiEx->HID >> 5) & 0x1f) + 'A' - 1, 5437270962aSWarner Losh ((AcpiEx->HID >> 0) & 0x1f) + 'A' - 1, 5447270962aSWarner Losh (AcpiEx->HID >> 16) & 0xFFFF 5457270962aSWarner Losh ); 5467270962aSWarner Losh UnicodeSPrint ( 5477270962aSWarner Losh CIDText, 5487270962aSWarner Losh sizeof (CIDText), 5497270962aSWarner Losh "%c%c%c%04X", 5507270962aSWarner Losh ((AcpiEx->CID >> 10) & 0x1f) + 'A' - 1, 5517270962aSWarner Losh ((AcpiEx->CID >> 5) & 0x1f) + 'A' - 1, 5527270962aSWarner Losh ((AcpiEx->CID >> 0) & 0x1f) + 'A' - 1, 5537270962aSWarner Losh (AcpiEx->CID >> 16) & 0xFFFF 5547270962aSWarner Losh ); 5557270962aSWarner Losh 556*3f0efe05SJose Luis Duran if (((Strings[HidStrIndex] != NULL) && (*Strings[HidStrIndex] == '\0')) && 557*3f0efe05SJose Luis Duran ((Strings[CidStrIndex] != NULL) && (*Strings[CidStrIndex] == '\0')) && 558*3f0efe05SJose Luis Duran ((Strings[UidStrIndex] != NULL) && (*Strings[UidStrIndex] != '\0'))) 559*3f0efe05SJose Luis Duran { 5607270962aSWarner Losh // 5617270962aSWarner Losh // use AcpiExp() 5627270962aSWarner Losh // 563492d9953SJose Luis Duran if (AcpiEx->CID == 0) { 564492d9953SJose Luis Duran UefiDevicePathLibCatPrint ( 565492d9953SJose Luis Duran Str, 566492d9953SJose Luis Duran "AcpiExp(%s,0,%s)", 567492d9953SJose Luis Duran HIDText, 568*3f0efe05SJose Luis Duran Strings[UidStrIndex] 569492d9953SJose Luis Duran ); 570492d9953SJose Luis Duran } else { 5717270962aSWarner Losh UefiDevicePathLibCatPrint ( 5727270962aSWarner Losh Str, 5737270962aSWarner Losh "AcpiExp(%s,%s,%s)", 5747270962aSWarner Losh HIDText, 5757270962aSWarner Losh CIDText, 576*3f0efe05SJose Luis Duran Strings[UidStrIndex] 5777270962aSWarner Losh ); 578492d9953SJose Luis Duran } 5797270962aSWarner Losh } else { 580c1fa6f4cSJose Luis Duran if (DisplayOnly) { 581*3f0efe05SJose Luis Duran if (Strings[HidStrIndex] != NULL) { 582*3f0efe05SJose Luis Duran UefiDevicePathLibCatPrint (Str, "AcpiEx(%s,", Strings[HidStrIndex]); 5837270962aSWarner Losh } else { 5847270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "AcpiEx(%s,", HIDText); 5857270962aSWarner Losh } 5867270962aSWarner Losh 587*3f0efe05SJose Luis Duran if (Strings[CidStrIndex] != NULL) { 588*3f0efe05SJose Luis Duran UefiDevicePathLibCatPrint (Str, "%s,", Strings[CidStrIndex]); 5897270962aSWarner Losh } else { 5908278071aSJose Luis Duran UefiDevicePathLibCatPrint (Str, "%s,", CIDText); 5917270962aSWarner Losh } 5927270962aSWarner Losh 593*3f0efe05SJose Luis Duran if (Strings[UidStrIndex] != NULL) { 594*3f0efe05SJose Luis Duran UefiDevicePathLibCatPrint (Str, "%s)", Strings[UidStrIndex]); 5957270962aSWarner Losh } else { 5968278071aSJose Luis Duran UefiDevicePathLibCatPrint (Str, "0x%x)", AcpiEx->UID); 5977270962aSWarner Losh } 5987270962aSWarner Losh } else { 5997270962aSWarner Losh UefiDevicePathLibCatPrint ( 6007270962aSWarner Losh Str, 6017270962aSWarner Losh "AcpiEx(%s,%s,0x%x,%s,%s,%s)", 6027270962aSWarner Losh HIDText, 6037270962aSWarner Losh CIDText, 6047270962aSWarner Losh AcpiEx->UID, 605*3f0efe05SJose Luis Duran Strings[HidStrIndex] != NULL ? Strings[HidStrIndex] : '\0', 606*3f0efe05SJose Luis Duran Strings[CidStrIndex] != NULL ? Strings[CidStrIndex] : '\0', 607*3f0efe05SJose Luis Duran Strings[UidStrIndex] != NULL ? Strings[UidStrIndex] : '\0' 6087270962aSWarner Losh ); 6097270962aSWarner Losh } 6107270962aSWarner Losh } 6117270962aSWarner Losh } 6127270962aSWarner Losh 6137270962aSWarner Losh /** 6147270962aSWarner Losh Converts a ACPI address device path structure to its string representative. 6157270962aSWarner Losh 6167270962aSWarner Losh @param Str The string representative of input device. 6177270962aSWarner Losh @param DevPath The input device path structure. 6187270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 6197270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 6207270962aSWarner Losh is FALSE, then the longer text representation of the display node 6217270962aSWarner Losh is used. 6227270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 6237270962aSWarner Losh representation for a device node can be used, where applicable. 6247270962aSWarner Losh 6257270962aSWarner Losh **/ 6267270962aSWarner Losh static VOID 6277270962aSWarner Losh DevPathToTextAcpiAdr ( 6287270962aSWarner Losh IN OUT POOL_PRINT *Str, 6297270962aSWarner Losh IN VOID *DevPath, 6307270962aSWarner Losh IN BOOLEAN DisplayOnly, 6317270962aSWarner Losh IN BOOLEAN AllowShortcuts 6327270962aSWarner Losh ) 6337270962aSWarner Losh { 6347270962aSWarner Losh ACPI_ADR_DEVICE_PATH *AcpiAdr; 6357270962aSWarner Losh UINT32 *Addr; 6367270962aSWarner Losh UINT16 Index; 6377270962aSWarner Losh UINT16 Length; 6387270962aSWarner Losh UINT16 AdditionalAdrCount; 6397270962aSWarner Losh 6407270962aSWarner Losh AcpiAdr = DevPath; 6417270962aSWarner Losh Length = (UINT16)DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr); 6427270962aSWarner Losh AdditionalAdrCount = (UINT16)((Length - 8) / 4); 6437270962aSWarner Losh 6447270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "AcpiAdr(0x%x", AcpiAdr->ADR); 6457270962aSWarner Losh Addr = &AcpiAdr->ADR + 1; 6467270962aSWarner Losh for (Index = 0; Index < AdditionalAdrCount; Index++) { 6477270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x%x", Addr[Index]); 6487270962aSWarner Losh } 6495754f582SJose Luis Duran 6507270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 6517270962aSWarner Losh } 6527270962aSWarner Losh 6537270962aSWarner Losh /** 6547270962aSWarner Losh Converts a ATAPI device path structure to its string representative. 6557270962aSWarner Losh 6567270962aSWarner Losh @param Str The string representative of input device. 6577270962aSWarner Losh @param DevPath The input device path structure. 6587270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 6597270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 6607270962aSWarner Losh is FALSE, then the longer text representation of the display node 6617270962aSWarner Losh is used. 6627270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 6637270962aSWarner Losh representation for a device node can be used, where applicable. 6647270962aSWarner Losh 6657270962aSWarner Losh **/ 6667270962aSWarner Losh static VOID 6677270962aSWarner Losh DevPathToTextAtapi ( 6687270962aSWarner Losh IN OUT POOL_PRINT *Str, 6697270962aSWarner Losh IN VOID *DevPath, 6707270962aSWarner Losh IN BOOLEAN DisplayOnly, 6717270962aSWarner Losh IN BOOLEAN AllowShortcuts 6727270962aSWarner Losh ) 6737270962aSWarner Losh { 6747270962aSWarner Losh ATAPI_DEVICE_PATH *Atapi; 6757270962aSWarner Losh 6767270962aSWarner Losh Atapi = DevPath; 6777270962aSWarner Losh 6787270962aSWarner Losh if (DisplayOnly) { 6797270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Ata(0x%x)", Atapi->Lun); 6807270962aSWarner Losh } else { 6817270962aSWarner Losh UefiDevicePathLibCatPrint ( 6827270962aSWarner Losh Str, 6837270962aSWarner Losh "Ata(%s,%s,0x%x)", 6847270962aSWarner Losh (Atapi->PrimarySecondary == 1) ? "Secondary" : "Primary", 6857270962aSWarner Losh (Atapi->SlaveMaster == 1) ? "Slave" : "Master", 6867270962aSWarner Losh Atapi->Lun 6877270962aSWarner Losh ); 6887270962aSWarner Losh } 6897270962aSWarner Losh } 6907270962aSWarner Losh 6917270962aSWarner Losh /** 6927270962aSWarner Losh Converts a SCSI device path structure to its string representative. 6937270962aSWarner Losh 6947270962aSWarner Losh @param Str The string representative of input device. 6957270962aSWarner Losh @param DevPath The input device path structure. 6967270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 6977270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 6987270962aSWarner Losh is FALSE, then the longer text representation of the display node 6997270962aSWarner Losh is used. 7007270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 7017270962aSWarner Losh representation for a device node can be used, where applicable. 7027270962aSWarner Losh 7037270962aSWarner Losh **/ 7047270962aSWarner Losh static VOID 7057270962aSWarner Losh DevPathToTextScsi ( 7067270962aSWarner Losh IN OUT POOL_PRINT *Str, 7077270962aSWarner Losh IN VOID *DevPath, 7087270962aSWarner Losh IN BOOLEAN DisplayOnly, 7097270962aSWarner Losh IN BOOLEAN AllowShortcuts 7107270962aSWarner Losh ) 7117270962aSWarner Losh { 7127270962aSWarner Losh SCSI_DEVICE_PATH *Scsi; 7137270962aSWarner Losh 7147270962aSWarner Losh Scsi = DevPath; 7157270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Scsi(0x%x,0x%x)", Scsi->Pun, Scsi->Lun); 7167270962aSWarner Losh } 7177270962aSWarner Losh 7187270962aSWarner Losh /** 7197270962aSWarner Losh Converts a Fibre device path structure to its string representative. 7207270962aSWarner Losh 7217270962aSWarner Losh @param Str The string representative of input device. 7227270962aSWarner Losh @param DevPath The input device path structure. 7237270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 7247270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 7257270962aSWarner Losh is FALSE, then the longer text representation of the display node 7267270962aSWarner Losh is used. 7277270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 7287270962aSWarner Losh representation for a device node can be used, where applicable. 7297270962aSWarner Losh 7307270962aSWarner Losh **/ 7317270962aSWarner Losh static VOID 7327270962aSWarner Losh DevPathToTextFibre ( 7337270962aSWarner Losh IN OUT POOL_PRINT *Str, 7347270962aSWarner Losh IN VOID *DevPath, 7357270962aSWarner Losh IN BOOLEAN DisplayOnly, 7367270962aSWarner Losh IN BOOLEAN AllowShortcuts 7377270962aSWarner Losh ) 7387270962aSWarner Losh { 7397270962aSWarner Losh FIBRECHANNEL_DEVICE_PATH *Fibre; 7407270962aSWarner Losh 7417270962aSWarner Losh Fibre = DevPath; 7427270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Fibre(0x%lx,0x%lx)", Fibre->WWN, Fibre->Lun); 7437270962aSWarner Losh } 7447270962aSWarner Losh 7457270962aSWarner Losh /** 7467270962aSWarner Losh Converts a FibreEx device path structure to its string representative. 7477270962aSWarner Losh 7487270962aSWarner Losh @param Str The string representative of input device. 7497270962aSWarner Losh @param DevPath The input device path structure. 7507270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 7517270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 7527270962aSWarner Losh is FALSE, then the longer text representation of the display node 7537270962aSWarner Losh is used. 7547270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 7557270962aSWarner Losh representation for a device node can be used, where applicable. 7567270962aSWarner Losh 7577270962aSWarner Losh **/ 7587270962aSWarner Losh static VOID 7597270962aSWarner Losh DevPathToTextFibreEx ( 7607270962aSWarner Losh IN OUT POOL_PRINT *Str, 7617270962aSWarner Losh IN VOID *DevPath, 7627270962aSWarner Losh IN BOOLEAN DisplayOnly, 7637270962aSWarner Losh IN BOOLEAN AllowShortcuts 7647270962aSWarner Losh ) 7657270962aSWarner Losh { 7667270962aSWarner Losh FIBRECHANNELEX_DEVICE_PATH *FibreEx; 7677270962aSWarner Losh UINTN Index; 7687270962aSWarner Losh 7697270962aSWarner Losh FibreEx = DevPath; 7707270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "FibreEx(0x"); 7717270962aSWarner Losh for (Index = 0; Index < sizeof (FibreEx->WWN) / sizeof (FibreEx->WWN[0]); Index++) { 7727270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", FibreEx->WWN[Index]); 7737270962aSWarner Losh } 7745754f582SJose Luis Duran 7757270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x"); 7767270962aSWarner Losh for (Index = 0; Index < sizeof (FibreEx->Lun) / sizeof (FibreEx->Lun[0]); Index++) { 7777270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", FibreEx->Lun[Index]); 7787270962aSWarner Losh } 7795754f582SJose Luis Duran 7807270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 7817270962aSWarner Losh } 7827270962aSWarner Losh 7837270962aSWarner Losh /** 7847270962aSWarner Losh Converts a Sas Ex device path structure to its string representative. 7857270962aSWarner Losh 7867270962aSWarner Losh @param Str The string representative of input device. 7877270962aSWarner Losh @param DevPath The input device path structure. 7887270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 7897270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 7907270962aSWarner Losh is FALSE, then the longer text representation of the display node 7917270962aSWarner Losh is used. 7927270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 7937270962aSWarner Losh representation for a device node can be used, where applicable. 7947270962aSWarner Losh 7957270962aSWarner Losh **/ 7967270962aSWarner Losh static VOID 7977270962aSWarner Losh DevPathToTextSasEx ( 7987270962aSWarner Losh IN OUT POOL_PRINT *Str, 7997270962aSWarner Losh IN VOID *DevPath, 8007270962aSWarner Losh IN BOOLEAN DisplayOnly, 8017270962aSWarner Losh IN BOOLEAN AllowShortcuts 8027270962aSWarner Losh ) 8037270962aSWarner Losh { 8047270962aSWarner Losh SASEX_DEVICE_PATH *SasEx; 8057270962aSWarner Losh UINTN Index; 8067270962aSWarner Losh 8077270962aSWarner Losh SasEx = DevPath; 8087270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "SasEx(0x"); 8097270962aSWarner Losh 8107270962aSWarner Losh for (Index = 0; Index < sizeof (SasEx->SasAddress) / sizeof (SasEx->SasAddress[0]); Index++) { 8117270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", SasEx->SasAddress[Index]); 8127270962aSWarner Losh } 8135754f582SJose Luis Duran 8147270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x"); 8157270962aSWarner Losh for (Index = 0; Index < sizeof (SasEx->Lun) / sizeof (SasEx->Lun[0]); Index++) { 8167270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", SasEx->Lun[Index]); 8177270962aSWarner Losh } 8185754f582SJose Luis Duran 8197270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x%x,", SasEx->RelativeTargetPort); 8207270962aSWarner Losh 8217270962aSWarner Losh if (((SasEx->DeviceTopology & 0x0f) == 0) && ((SasEx->DeviceTopology & BIT7) == 0)) { 8227270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "NoTopology,0,0,0"); 8237270962aSWarner Losh } else if (((SasEx->DeviceTopology & 0x0f) <= 2) && ((SasEx->DeviceTopology & BIT7) == 0)) { 8247270962aSWarner Losh UefiDevicePathLibCatPrint ( 8257270962aSWarner Losh Str, 8267270962aSWarner Losh "%s,%s,%s,", 8277270962aSWarner Losh ((SasEx->DeviceTopology & BIT4) != 0) ? "SATA" : "SAS", 8287270962aSWarner Losh ((SasEx->DeviceTopology & BIT5) != 0) ? "External" : "Internal", 8297270962aSWarner Losh ((SasEx->DeviceTopology & BIT6) != 0) ? "Expanded" : "Direct" 8307270962aSWarner Losh ); 8317270962aSWarner Losh if ((SasEx->DeviceTopology & 0x0f) == 1) { 8327270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0"); 8337270962aSWarner Losh } else { 8347270962aSWarner Losh // 8357270962aSWarner Losh // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256 8367270962aSWarner Losh // 8377270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x", ((SasEx->DeviceTopology >> 8) & 0xff) + 1); 8387270962aSWarner Losh } 8397270962aSWarner Losh } else { 8407270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x,0,0,0", SasEx->DeviceTopology); 8417270962aSWarner Losh } 8427270962aSWarner Losh 8437270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 8447270962aSWarner Losh return; 8457270962aSWarner Losh } 8467270962aSWarner Losh 8477270962aSWarner Losh /** 8487270962aSWarner Losh Converts a NVM Express Namespace device path structure to its string representative. 8497270962aSWarner Losh 8507270962aSWarner Losh @param Str The string representative of input device. 8517270962aSWarner Losh @param DevPath The input device path structure. 8527270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 8537270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 8547270962aSWarner Losh is FALSE, then the longer text representation of the display node 8557270962aSWarner Losh is used. 8567270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 8577270962aSWarner Losh representation for a device node can be used, where applicable. 8587270962aSWarner Losh 8597270962aSWarner Losh **/ 8607270962aSWarner Losh static VOID 8617270962aSWarner Losh DevPathToTextNVMe ( 8627270962aSWarner Losh IN OUT POOL_PRINT *Str, 8637270962aSWarner Losh IN VOID *DevPath, 8647270962aSWarner Losh IN BOOLEAN DisplayOnly, 8657270962aSWarner Losh IN BOOLEAN AllowShortcuts 8667270962aSWarner Losh ) 8677270962aSWarner Losh { 8687270962aSWarner Losh NVME_NAMESPACE_DEVICE_PATH *Nvme; 8697270962aSWarner Losh UINT8 *Uuid; 8707270962aSWarner Losh 8717270962aSWarner Losh Nvme = DevPath; 8727270962aSWarner Losh Uuid = (UINT8 *)&Nvme->NamespaceUuid; 8737270962aSWarner Losh UefiDevicePathLibCatPrint ( 8747270962aSWarner Losh Str, 8757270962aSWarner Losh "NVMe(0x%x,%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)", 8767270962aSWarner Losh Nvme->NamespaceId, 8775754f582SJose Luis Duran Uuid[7], 8785754f582SJose Luis Duran Uuid[6], 8795754f582SJose Luis Duran Uuid[5], 8805754f582SJose Luis Duran Uuid[4], 8815754f582SJose Luis Duran Uuid[3], 8825754f582SJose Luis Duran Uuid[2], 8835754f582SJose Luis Duran Uuid[1], 8845754f582SJose Luis Duran Uuid[0] 8857270962aSWarner Losh ); 8867270962aSWarner Losh } 8877270962aSWarner Losh 8887270962aSWarner Losh /** 8897270962aSWarner Losh Converts a UFS device path structure to its string representative. 8907270962aSWarner Losh 8917270962aSWarner Losh @param Str The string representative of input device. 8927270962aSWarner Losh @param DevPath The input device path structure. 8937270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 8947270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 8957270962aSWarner Losh is FALSE, then the longer text representation of the display node 8967270962aSWarner Losh is used. 8977270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 8987270962aSWarner Losh representation for a device node can be used, where applicable. 8997270962aSWarner Losh 9007270962aSWarner Losh **/ 9017270962aSWarner Losh static VOID 9027270962aSWarner Losh DevPathToTextUfs ( 9037270962aSWarner Losh IN OUT POOL_PRINT *Str, 9047270962aSWarner Losh IN VOID *DevPath, 9057270962aSWarner Losh IN BOOLEAN DisplayOnly, 9067270962aSWarner Losh IN BOOLEAN AllowShortcuts 9077270962aSWarner Losh ) 9087270962aSWarner Losh { 9097270962aSWarner Losh UFS_DEVICE_PATH *Ufs; 9107270962aSWarner Losh 9117270962aSWarner Losh Ufs = DevPath; 9127270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UFS(0x%x,0x%x)", Ufs->Pun, Ufs->Lun); 9137270962aSWarner Losh } 9147270962aSWarner Losh 9157270962aSWarner Losh /** 9167270962aSWarner Losh Converts a SD (Secure Digital) device path structure to its string representative. 9177270962aSWarner Losh 9187270962aSWarner Losh @param Str The string representative of input device. 9197270962aSWarner Losh @param DevPath The input device path structure. 9207270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 9217270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 9227270962aSWarner Losh is FALSE, then the longer text representation of the display node 9237270962aSWarner Losh is used. 9247270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 9257270962aSWarner Losh representation for a device node can be used, where applicable. 9267270962aSWarner Losh 9277270962aSWarner Losh **/ 9287270962aSWarner Losh static VOID 9297270962aSWarner Losh DevPathToTextSd ( 9307270962aSWarner Losh IN OUT POOL_PRINT *Str, 9317270962aSWarner Losh IN VOID *DevPath, 9327270962aSWarner Losh IN BOOLEAN DisplayOnly, 9337270962aSWarner Losh IN BOOLEAN AllowShortcuts 9347270962aSWarner Losh ) 9357270962aSWarner Losh { 9367270962aSWarner Losh SD_DEVICE_PATH *Sd; 9377270962aSWarner Losh 9387270962aSWarner Losh Sd = DevPath; 9397270962aSWarner Losh UefiDevicePathLibCatPrint ( 9407270962aSWarner Losh Str, 9417270962aSWarner Losh "SD(0x%x)", 9427270962aSWarner Losh Sd->SlotNumber 9437270962aSWarner Losh ); 9447270962aSWarner Losh } 9457270962aSWarner Losh 9467270962aSWarner Losh /** 9477270962aSWarner Losh Converts a EMMC (Embedded MMC) device path structure to its string representative. 9487270962aSWarner Losh 9497270962aSWarner Losh @param Str The string representative of input device. 9507270962aSWarner Losh @param DevPath The input device path structure. 9517270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 9527270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 9537270962aSWarner Losh is FALSE, then the longer text representation of the display node 9547270962aSWarner Losh is used. 9557270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 9567270962aSWarner Losh representation for a device node can be used, where applicable. 9577270962aSWarner Losh 9587270962aSWarner Losh **/ 9597270962aSWarner Losh static VOID 9607270962aSWarner Losh DevPathToTextEmmc ( 9617270962aSWarner Losh IN OUT POOL_PRINT *Str, 9627270962aSWarner Losh IN VOID *DevPath, 9637270962aSWarner Losh IN BOOLEAN DisplayOnly, 9647270962aSWarner Losh IN BOOLEAN AllowShortcuts 9657270962aSWarner Losh ) 9667270962aSWarner Losh { 9677270962aSWarner Losh EMMC_DEVICE_PATH *Emmc; 9687270962aSWarner Losh 9697270962aSWarner Losh Emmc = DevPath; 9707270962aSWarner Losh UefiDevicePathLibCatPrint ( 9717270962aSWarner Losh Str, 9727270962aSWarner Losh "eMMC(0x%x)", 9737270962aSWarner Losh Emmc->SlotNumber 9747270962aSWarner Losh ); 9757270962aSWarner Losh } 9767270962aSWarner Losh 9777270962aSWarner Losh /** 9787270962aSWarner Losh Converts a 1394 device path structure to its string representative. 9797270962aSWarner Losh 9807270962aSWarner Losh @param Str The string representative of input device. 9817270962aSWarner Losh @param DevPath The input device path structure. 9827270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 9837270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 9847270962aSWarner Losh is FALSE, then the longer text representation of the display node 9857270962aSWarner Losh is used. 9867270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 9877270962aSWarner Losh representation for a device node can be used, where applicable. 9887270962aSWarner Losh 9897270962aSWarner Losh **/ 9907270962aSWarner Losh static VOID 9917270962aSWarner Losh DevPathToText1394 ( 9927270962aSWarner Losh IN OUT POOL_PRINT *Str, 9937270962aSWarner Losh IN VOID *DevPath, 9947270962aSWarner Losh IN BOOLEAN DisplayOnly, 9957270962aSWarner Losh IN BOOLEAN AllowShortcuts 9967270962aSWarner Losh ) 9977270962aSWarner Losh { 9987270962aSWarner Losh F1394_DEVICE_PATH *F1394DevPath; 9997270962aSWarner Losh 10007270962aSWarner Losh F1394DevPath = DevPath; 10017270962aSWarner Losh // 10027270962aSWarner Losh // Guid has format of IEEE-EUI64 10037270962aSWarner Losh // 10047270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "I1394(%016lx)", F1394DevPath->Guid); 10057270962aSWarner Losh } 10067270962aSWarner Losh 10077270962aSWarner Losh /** 10087270962aSWarner Losh Converts a USB device path structure to its string representative. 10097270962aSWarner Losh 10107270962aSWarner Losh @param Str The string representative of input device. 10117270962aSWarner Losh @param DevPath The input device path structure. 10127270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 10137270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 10147270962aSWarner Losh is FALSE, then the longer text representation of the display node 10157270962aSWarner Losh is used. 10167270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 10177270962aSWarner Losh representation for a device node can be used, where applicable. 10187270962aSWarner Losh 10197270962aSWarner Losh **/ 10207270962aSWarner Losh static VOID 10217270962aSWarner Losh DevPathToTextUsb ( 10227270962aSWarner Losh IN OUT POOL_PRINT *Str, 10237270962aSWarner Losh IN VOID *DevPath, 10247270962aSWarner Losh IN BOOLEAN DisplayOnly, 10257270962aSWarner Losh IN BOOLEAN AllowShortcuts 10267270962aSWarner Losh ) 10277270962aSWarner Losh { 10287270962aSWarner Losh USB_DEVICE_PATH *Usb; 10297270962aSWarner Losh 10307270962aSWarner Losh Usb = DevPath; 10317270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "USB(0x%x,0x%x)", Usb->ParentPortNumber, Usb->InterfaceNumber); 10327270962aSWarner Losh } 10337270962aSWarner Losh 10347270962aSWarner Losh /** 10357270962aSWarner Losh Converts a USB WWID device path structure to its string representative. 10367270962aSWarner Losh 10377270962aSWarner Losh @param Str The string representative of input device. 10387270962aSWarner Losh @param DevPath The input device path structure. 10397270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 10407270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 10417270962aSWarner Losh is FALSE, then the longer text representation of the display node 10427270962aSWarner Losh is used. 10437270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 10447270962aSWarner Losh representation for a device node can be used, where applicable. 10457270962aSWarner Losh 10467270962aSWarner Losh **/ 10477270962aSWarner Losh static VOID 10487270962aSWarner Losh DevPathToTextUsbWWID ( 10497270962aSWarner Losh IN OUT POOL_PRINT *Str, 10507270962aSWarner Losh IN VOID *DevPath, 10517270962aSWarner Losh IN BOOLEAN DisplayOnly, 10527270962aSWarner Losh IN BOOLEAN AllowShortcuts 10537270962aSWarner Losh ) 10547270962aSWarner Losh { 10557270962aSWarner Losh USB_WWID_DEVICE_PATH *UsbWWId; 10567270962aSWarner Losh CHAR16 *SerialNumberStr; 10577270962aSWarner Losh CHAR16 *NewStr; 10587270962aSWarner Losh UINT16 Length; 10597270962aSWarner Losh 10607270962aSWarner Losh UsbWWId = DevPath; 10617270962aSWarner Losh 10627270962aSWarner Losh SerialNumberStr = (CHAR16 *)(&UsbWWId + 1); 10637270962aSWarner Losh Length = (UINT16)((DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *)UsbWWId) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16)); 10645754f582SJose Luis Duran if ((Length >= 1) && (SerialNumberStr[Length - 1] != 0)) { 10657270962aSWarner Losh // 10667270962aSWarner Losh // In case no NULL terminator in SerialNumber, create a new one with NULL terminator 10677270962aSWarner Losh // 1068d30a1689SJohn Baldwin NewStr = AllocatePool ((Length + 1) * sizeof (CHAR16)); 10697270962aSWarner Losh ASSERT (NewStr != NULL); 1070d30a1689SJohn Baldwin CopyMem (NewStr, SerialNumberStr, Length * sizeof (CHAR16)); 10717270962aSWarner Losh NewStr[Length] = 0; 10727270962aSWarner Losh SerialNumberStr = NewStr; 10737270962aSWarner Losh } 10747270962aSWarner Losh 10757270962aSWarner Losh UefiDevicePathLibCatPrint ( 10767270962aSWarner Losh Str, 10777270962aSWarner Losh "UsbWwid(0x%x,0x%x,0x%x,\"%S\")", 10787270962aSWarner Losh UsbWWId->VendorId, 10797270962aSWarner Losh UsbWWId->ProductId, 10807270962aSWarner Losh UsbWWId->InterfaceNumber, 10817270962aSWarner Losh SerialNumberStr 10827270962aSWarner Losh ); 10837270962aSWarner Losh } 10847270962aSWarner Losh 10857270962aSWarner Losh /** 10867270962aSWarner Losh Converts a Logic Unit device path structure to its string representative. 10877270962aSWarner Losh 10887270962aSWarner Losh @param Str The string representative of input device. 10897270962aSWarner Losh @param DevPath The input device path structure. 10907270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 10917270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 10927270962aSWarner Losh is FALSE, then the longer text representation of the display node 10937270962aSWarner Losh is used. 10947270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 10957270962aSWarner Losh representation for a device node can be used, where applicable. 10967270962aSWarner Losh 10977270962aSWarner Losh **/ 10987270962aSWarner Losh static VOID 10997270962aSWarner Losh DevPathToTextLogicalUnit ( 11007270962aSWarner Losh IN OUT POOL_PRINT *Str, 11017270962aSWarner Losh IN VOID *DevPath, 11027270962aSWarner Losh IN BOOLEAN DisplayOnly, 11037270962aSWarner Losh IN BOOLEAN AllowShortcuts 11047270962aSWarner Losh ) 11057270962aSWarner Losh { 11067270962aSWarner Losh DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit; 11077270962aSWarner Losh 11087270962aSWarner Losh LogicalUnit = DevPath; 11097270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Unit(0x%x)", LogicalUnit->Lun); 11107270962aSWarner Losh } 11117270962aSWarner Losh 11127270962aSWarner Losh /** 11137270962aSWarner Losh Converts a USB class device path structure to its string representative. 11147270962aSWarner Losh 11157270962aSWarner Losh @param Str The string representative of input device. 11167270962aSWarner Losh @param DevPath The input device path structure. 11177270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 11187270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 11197270962aSWarner Losh is FALSE, then the longer text representation of the display node 11207270962aSWarner Losh is used. 11217270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 11227270962aSWarner Losh representation for a device node can be used, where applicable. 11237270962aSWarner Losh 11247270962aSWarner Losh **/ 11257270962aSWarner Losh static VOID 11267270962aSWarner Losh DevPathToTextUsbClass ( 11277270962aSWarner Losh IN OUT POOL_PRINT *Str, 11287270962aSWarner Losh IN VOID *DevPath, 11297270962aSWarner Losh IN BOOLEAN DisplayOnly, 11307270962aSWarner Losh IN BOOLEAN AllowShortcuts 11317270962aSWarner Losh ) 11327270962aSWarner Losh { 11337270962aSWarner Losh USB_CLASS_DEVICE_PATH *UsbClass; 11347270962aSWarner Losh BOOLEAN IsKnownSubClass; 11357270962aSWarner Losh 11367270962aSWarner Losh UsbClass = DevPath; 11377270962aSWarner Losh 11387270962aSWarner Losh IsKnownSubClass = TRUE; 11397270962aSWarner Losh switch (UsbClass->DeviceClass) { 11407270962aSWarner Losh case USB_CLASS_AUDIO: 11417270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbAudio"); 11427270962aSWarner Losh break; 11437270962aSWarner Losh 11447270962aSWarner Losh case USB_CLASS_CDCCONTROL: 11457270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbCDCControl"); 11467270962aSWarner Losh break; 11477270962aSWarner Losh 11487270962aSWarner Losh case USB_CLASS_HID: 11497270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbHID"); 11507270962aSWarner Losh break; 11517270962aSWarner Losh 11527270962aSWarner Losh case USB_CLASS_IMAGE: 11537270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbImage"); 11547270962aSWarner Losh break; 11557270962aSWarner Losh 11567270962aSWarner Losh case USB_CLASS_PRINTER: 11577270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbPrinter"); 11587270962aSWarner Losh break; 11597270962aSWarner Losh 11607270962aSWarner Losh case USB_CLASS_MASS_STORAGE: 11617270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbMassStorage"); 11627270962aSWarner Losh break; 11637270962aSWarner Losh 11647270962aSWarner Losh case USB_CLASS_HUB: 11657270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbHub"); 11667270962aSWarner Losh break; 11677270962aSWarner Losh 11687270962aSWarner Losh case USB_CLASS_CDCDATA: 11697270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbCDCData"); 11707270962aSWarner Losh break; 11717270962aSWarner Losh 11727270962aSWarner Losh case USB_CLASS_SMART_CARD: 11737270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbSmartCard"); 11747270962aSWarner Losh break; 11757270962aSWarner Losh 11767270962aSWarner Losh case USB_CLASS_VIDEO: 11777270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbVideo"); 11787270962aSWarner Losh break; 11797270962aSWarner Losh 11807270962aSWarner Losh case USB_CLASS_DIAGNOSTIC: 11817270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbDiagnostic"); 11827270962aSWarner Losh break; 11837270962aSWarner Losh 11847270962aSWarner Losh case USB_CLASS_WIRELESS: 11857270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UsbWireless"); 11867270962aSWarner Losh break; 11877270962aSWarner Losh 11887270962aSWarner Losh default: 11897270962aSWarner Losh IsKnownSubClass = FALSE; 11907270962aSWarner Losh break; 11917270962aSWarner Losh } 11927270962aSWarner Losh 11937270962aSWarner Losh if (IsKnownSubClass) { 11947270962aSWarner Losh UefiDevicePathLibCatPrint ( 11957270962aSWarner Losh Str, 11967270962aSWarner Losh "(0x%x,0x%x,0x%x,0x%x)", 11977270962aSWarner Losh UsbClass->VendorId, 11987270962aSWarner Losh UsbClass->ProductId, 11997270962aSWarner Losh UsbClass->DeviceSubClass, 12007270962aSWarner Losh UsbClass->DeviceProtocol 12017270962aSWarner Losh ); 12027270962aSWarner Losh return; 12037270962aSWarner Losh } 12047270962aSWarner Losh 12057270962aSWarner Losh if (UsbClass->DeviceClass == USB_CLASS_RESERVE) { 12067270962aSWarner Losh if (UsbClass->DeviceSubClass == USB_SUBCLASS_FW_UPDATE) { 12077270962aSWarner Losh UefiDevicePathLibCatPrint ( 12087270962aSWarner Losh Str, 12097270962aSWarner Losh "UsbDeviceFirmwareUpdate(0x%x,0x%x,0x%x)", 12107270962aSWarner Losh UsbClass->VendorId, 12117270962aSWarner Losh UsbClass->ProductId, 12127270962aSWarner Losh UsbClass->DeviceProtocol 12137270962aSWarner Losh ); 12147270962aSWarner Losh return; 12157270962aSWarner Losh } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_IRDA_BRIDGE) { 12167270962aSWarner Losh UefiDevicePathLibCatPrint ( 12177270962aSWarner Losh Str, 12187270962aSWarner Losh "UsbIrdaBridge(0x%x,0x%x,0x%x)", 12197270962aSWarner Losh UsbClass->VendorId, 12207270962aSWarner Losh UsbClass->ProductId, 12217270962aSWarner Losh UsbClass->DeviceProtocol 12227270962aSWarner Losh ); 12237270962aSWarner Losh return; 12247270962aSWarner Losh } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_TEST) { 12257270962aSWarner Losh UefiDevicePathLibCatPrint ( 12267270962aSWarner Losh Str, 12277270962aSWarner Losh "UsbTestAndMeasurement(0x%x,0x%x,0x%x)", 12287270962aSWarner Losh UsbClass->VendorId, 12297270962aSWarner Losh UsbClass->ProductId, 12307270962aSWarner Losh UsbClass->DeviceProtocol 12317270962aSWarner Losh ); 12327270962aSWarner Losh return; 12337270962aSWarner Losh } 12347270962aSWarner Losh } 12357270962aSWarner Losh 12367270962aSWarner Losh UefiDevicePathLibCatPrint ( 12377270962aSWarner Losh Str, 12387270962aSWarner Losh "UsbClass(0x%x,0x%x,0x%x,0x%x,0x%x)", 12397270962aSWarner Losh UsbClass->VendorId, 12407270962aSWarner Losh UsbClass->ProductId, 12417270962aSWarner Losh UsbClass->DeviceClass, 12427270962aSWarner Losh UsbClass->DeviceSubClass, 12437270962aSWarner Losh UsbClass->DeviceProtocol 12447270962aSWarner Losh ); 12457270962aSWarner Losh } 12467270962aSWarner Losh 12477270962aSWarner Losh /** 12487270962aSWarner Losh Converts a SATA device path structure to its string representative. 12497270962aSWarner Losh 12507270962aSWarner Losh @param Str The string representative of input device. 12517270962aSWarner Losh @param DevPath The input device path structure. 12527270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 12537270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 12547270962aSWarner Losh is FALSE, then the longer text representation of the display node 12557270962aSWarner Losh is used. 12567270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 12577270962aSWarner Losh representation for a device node can be used, where applicable. 12587270962aSWarner Losh 12597270962aSWarner Losh **/ 12607270962aSWarner Losh static VOID 12617270962aSWarner Losh DevPathToTextSata ( 12627270962aSWarner Losh IN OUT POOL_PRINT *Str, 12637270962aSWarner Losh IN VOID *DevPath, 12647270962aSWarner Losh IN BOOLEAN DisplayOnly, 12657270962aSWarner Losh IN BOOLEAN AllowShortcuts 12667270962aSWarner Losh ) 12677270962aSWarner Losh { 12687270962aSWarner Losh SATA_DEVICE_PATH *Sata; 12697270962aSWarner Losh 12707270962aSWarner Losh Sata = DevPath; 12717270962aSWarner Losh UefiDevicePathLibCatPrint ( 12727270962aSWarner Losh Str, 12737270962aSWarner Losh "Sata(0x%x,0x%x,0x%x)", 12747270962aSWarner Losh Sata->HBAPortNumber, 12757270962aSWarner Losh Sata->PortMultiplierPortNumber, 12767270962aSWarner Losh Sata->Lun 12777270962aSWarner Losh ); 12787270962aSWarner Losh } 12797270962aSWarner Losh 12807270962aSWarner Losh /** 12817270962aSWarner Losh Converts a I20 device path structure to its string representative. 12827270962aSWarner Losh 12837270962aSWarner Losh @param Str The string representative of input device. 12847270962aSWarner Losh @param DevPath The input device path structure. 12857270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 12867270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 12877270962aSWarner Losh is FALSE, then the longer text representation of the display node 12887270962aSWarner Losh is used. 12897270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 12907270962aSWarner Losh representation for a device node can be used, where applicable. 12917270962aSWarner Losh 12927270962aSWarner Losh **/ 12937270962aSWarner Losh static VOID 12947270962aSWarner Losh DevPathToTextI2O ( 12957270962aSWarner Losh IN OUT POOL_PRINT *Str, 12967270962aSWarner Losh IN VOID *DevPath, 12977270962aSWarner Losh IN BOOLEAN DisplayOnly, 12987270962aSWarner Losh IN BOOLEAN AllowShortcuts 12997270962aSWarner Losh ) 13007270962aSWarner Losh { 13017270962aSWarner Losh I2O_DEVICE_PATH *I2ODevPath; 13027270962aSWarner Losh 13037270962aSWarner Losh I2ODevPath = DevPath; 13047270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "I2O(0x%x)", I2ODevPath->Tid); 13057270962aSWarner Losh } 13067270962aSWarner Losh 13077270962aSWarner Losh /** 13087270962aSWarner Losh Converts a MAC address device path structure to its string representative. 13097270962aSWarner Losh 13107270962aSWarner Losh @param Str The string representative of input device. 13117270962aSWarner Losh @param DevPath The input device path structure. 13127270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 13137270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 13147270962aSWarner Losh is FALSE, then the longer text representation of the display node 13157270962aSWarner Losh is used. 13167270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 13177270962aSWarner Losh representation for a device node can be used, where applicable. 13187270962aSWarner Losh 13197270962aSWarner Losh **/ 13207270962aSWarner Losh static VOID 13217270962aSWarner Losh DevPathToTextMacAddr ( 13227270962aSWarner Losh IN OUT POOL_PRINT *Str, 13237270962aSWarner Losh IN VOID *DevPath, 13247270962aSWarner Losh IN BOOLEAN DisplayOnly, 13257270962aSWarner Losh IN BOOLEAN AllowShortcuts 13267270962aSWarner Losh ) 13277270962aSWarner Losh { 13287270962aSWarner Losh MAC_ADDR_DEVICE_PATH *MacDevPath; 13297270962aSWarner Losh UINTN HwAddressSize; 13307270962aSWarner Losh UINTN Index; 13317270962aSWarner Losh 13327270962aSWarner Losh MacDevPath = DevPath; 13337270962aSWarner Losh 13347270962aSWarner Losh HwAddressSize = sizeof (EFI_MAC_ADDRESS); 13355754f582SJose Luis Duran if ((MacDevPath->IfType == 0x01) || (MacDevPath->IfType == 0x00)) { 13367270962aSWarner Losh HwAddressSize = 6; 13377270962aSWarner Losh } 13387270962aSWarner Losh 13397270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "MAC("); 13407270962aSWarner Losh 13417270962aSWarner Losh for (Index = 0; Index < HwAddressSize; Index++) { 13427270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", MacDevPath->MacAddress.Addr[Index]); 13437270962aSWarner Losh } 13447270962aSWarner Losh 13457270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x%x)", MacDevPath->IfType); 13467270962aSWarner Losh } 13477270962aSWarner Losh 13487270962aSWarner Losh /** 13497270962aSWarner Losh Converts network protocol string to its text representation. 13507270962aSWarner Losh 13517270962aSWarner Losh @param Str The string representative of input device. 13527270962aSWarner Losh @param Protocol The network protocol ID. 13537270962aSWarner Losh 13547270962aSWarner Losh **/ 13557270962aSWarner Losh static VOID 13567270962aSWarner Losh CatNetworkProtocol ( 13577270962aSWarner Losh IN OUT POOL_PRINT *Str, 13587270962aSWarner Losh IN UINT16 Protocol 13597270962aSWarner Losh ) 13607270962aSWarner Losh { 13617270962aSWarner Losh if (Protocol == RFC_1700_TCP_PROTOCOL) { 13627270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "TCP"); 13637270962aSWarner Losh } else if (Protocol == RFC_1700_UDP_PROTOCOL) { 13647270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "UDP"); 13657270962aSWarner Losh } else { 13667270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%x", Protocol); 13677270962aSWarner Losh } 13687270962aSWarner Losh } 13697270962aSWarner Losh 13707270962aSWarner Losh /** 13717270962aSWarner Losh Converts IP v4 address to its text representation. 13727270962aSWarner Losh 13737270962aSWarner Losh @param Str The string representative of input device. 13747270962aSWarner Losh @param Address The IP v4 address. 13757270962aSWarner Losh **/ 13767270962aSWarner Losh static VOID 13777270962aSWarner Losh CatIPv4Address ( 13787270962aSWarner Losh IN OUT POOL_PRINT *Str, 13797270962aSWarner Losh IN EFI_IPv4_ADDRESS *Address 13807270962aSWarner Losh ) 13817270962aSWarner Losh { 13827270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%d.%d.%d.%d", Address->Addr[0], Address->Addr[1], Address->Addr[2], Address->Addr[3]); 13837270962aSWarner Losh } 13847270962aSWarner Losh 13857270962aSWarner Losh /** 13867270962aSWarner Losh Converts IP v6 address to its text representation. 13877270962aSWarner Losh 13887270962aSWarner Losh @param Str The string representative of input device. 13897270962aSWarner Losh @param Address The IP v6 address. 13907270962aSWarner Losh **/ 13917270962aSWarner Losh static VOID 13927270962aSWarner Losh CatIPv6Address ( 13937270962aSWarner Losh IN OUT POOL_PRINT *Str, 13947270962aSWarner Losh IN EFI_IPv6_ADDRESS *Address 13957270962aSWarner Losh ) 13967270962aSWarner Losh { 13977270962aSWarner Losh UefiDevicePathLibCatPrint ( 13985754f582SJose Luis Duran Str, 13995754f582SJose Luis Duran "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", 14005754f582SJose Luis Duran Address->Addr[0], 14015754f582SJose Luis Duran Address->Addr[1], 14025754f582SJose Luis Duran Address->Addr[2], 14035754f582SJose Luis Duran Address->Addr[3], 14045754f582SJose Luis Duran Address->Addr[4], 14055754f582SJose Luis Duran Address->Addr[5], 14065754f582SJose Luis Duran Address->Addr[6], 14075754f582SJose Luis Duran Address->Addr[7], 14085754f582SJose Luis Duran Address->Addr[8], 14095754f582SJose Luis Duran Address->Addr[9], 14105754f582SJose Luis Duran Address->Addr[10], 14115754f582SJose Luis Duran Address->Addr[11], 14125754f582SJose Luis Duran Address->Addr[12], 14135754f582SJose Luis Duran Address->Addr[13], 14145754f582SJose Luis Duran Address->Addr[14], 14155754f582SJose Luis Duran Address->Addr[15] 14167270962aSWarner Losh ); 14177270962aSWarner Losh } 14187270962aSWarner Losh 14197270962aSWarner Losh /** 14207270962aSWarner Losh Converts a IPv4 device path structure to its string representative. 14217270962aSWarner Losh 14227270962aSWarner Losh @param Str The string representative of input device. 14237270962aSWarner Losh @param DevPath The input device path structure. 14247270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 14257270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 14267270962aSWarner Losh is FALSE, then the longer text representation of the display node 14277270962aSWarner Losh is used. 14287270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 14297270962aSWarner Losh representation for a device node can be used, where applicable. 14307270962aSWarner Losh 14317270962aSWarner Losh **/ 14327270962aSWarner Losh static VOID 14337270962aSWarner Losh DevPathToTextIPv4 ( 14347270962aSWarner Losh IN OUT POOL_PRINT *Str, 14357270962aSWarner Losh IN VOID *DevPath, 14367270962aSWarner Losh IN BOOLEAN DisplayOnly, 14377270962aSWarner Losh IN BOOLEAN AllowShortcuts 14387270962aSWarner Losh ) 14397270962aSWarner Losh { 14407270962aSWarner Losh IPv4_DEVICE_PATH *IPDevPath; 14417270962aSWarner Losh 14427270962aSWarner Losh IPDevPath = DevPath; 14437270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "IPv4("); 14447270962aSWarner Losh CatIPv4Address (Str, &IPDevPath->RemoteIpAddress); 14457270962aSWarner Losh 14467270962aSWarner Losh if (DisplayOnly) { 14477270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 14487270962aSWarner Losh return; 14497270962aSWarner Losh } 14507270962aSWarner Losh 14517270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 14527270962aSWarner Losh CatNetworkProtocol (Str, IPDevPath->Protocol); 14537270962aSWarner Losh 14547270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",%s,", IPDevPath->StaticIpAddress ? "Static" : "DHCP"); 14557270962aSWarner Losh CatIPv4Address (Str, &IPDevPath->LocalIpAddress); 14567270962aSWarner Losh if (DevicePathNodeLength (IPDevPath) == sizeof (IPv4_DEVICE_PATH)) { 14577270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 14587270962aSWarner Losh CatIPv4Address (Str, &IPDevPath->GatewayIpAddress); 14597270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 14607270962aSWarner Losh CatIPv4Address (Str, &IPDevPath->SubnetMask); 14617270962aSWarner Losh } 14625754f582SJose Luis Duran 14637270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 14647270962aSWarner Losh } 14657270962aSWarner Losh 14667270962aSWarner Losh /** 14677270962aSWarner Losh Converts a IPv6 device path structure to its string representative. 14687270962aSWarner Losh 14697270962aSWarner Losh @param Str The string representative of input device. 14707270962aSWarner Losh @param DevPath The input device path structure. 14717270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 14727270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 14737270962aSWarner Losh is FALSE, then the longer text representation of the display node 14747270962aSWarner Losh is used. 14757270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 14767270962aSWarner Losh representation for a device node can be used, where applicable. 14777270962aSWarner Losh 14787270962aSWarner Losh **/ 14797270962aSWarner Losh static VOID 14807270962aSWarner Losh DevPathToTextIPv6 ( 14817270962aSWarner Losh IN OUT POOL_PRINT *Str, 14827270962aSWarner Losh IN VOID *DevPath, 14837270962aSWarner Losh IN BOOLEAN DisplayOnly, 14847270962aSWarner Losh IN BOOLEAN AllowShortcuts 14857270962aSWarner Losh ) 14867270962aSWarner Losh { 14877270962aSWarner Losh IPv6_DEVICE_PATH *IPDevPath; 14887270962aSWarner Losh 14897270962aSWarner Losh IPDevPath = DevPath; 14907270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "IPv6("); 14917270962aSWarner Losh CatIPv6Address (Str, &IPDevPath->RemoteIpAddress); 14927270962aSWarner Losh if (DisplayOnly) { 14937270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 14947270962aSWarner Losh return; 14957270962aSWarner Losh } 14967270962aSWarner Losh 14977270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 14987270962aSWarner Losh CatNetworkProtocol (Str, IPDevPath->Protocol); 14997270962aSWarner Losh 15007270962aSWarner Losh switch (IPDevPath->IpAddressOrigin) { 15017270962aSWarner Losh case 0: 15027270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",Static,"); 15037270962aSWarner Losh break; 15047270962aSWarner Losh case 1: 15057270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",StatelessAutoConfigure,"); 15067270962aSWarner Losh break; 15077270962aSWarner Losh default: 15087270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",StatefulAutoConfigure,"); 15097270962aSWarner Losh break; 15107270962aSWarner Losh } 15117270962aSWarner Losh 15127270962aSWarner Losh CatIPv6Address (Str, &IPDevPath->LocalIpAddress); 15137270962aSWarner Losh 15147270962aSWarner Losh if (DevicePathNodeLength (IPDevPath) == sizeof (IPv6_DEVICE_PATH)) { 15157270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x%x,", IPDevPath->PrefixLength); 15167270962aSWarner Losh CatIPv6Address (Str, &IPDevPath->GatewayIpAddress); 15177270962aSWarner Losh } 15185754f582SJose Luis Duran 15197270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 15207270962aSWarner Losh } 15217270962aSWarner Losh 15227270962aSWarner Losh /** 15237270962aSWarner Losh Converts an Infini Band device path structure to its string representative. 15247270962aSWarner Losh 15257270962aSWarner Losh @param Str The string representative of input device. 15267270962aSWarner Losh @param DevPath The input device path structure. 15277270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 15287270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 15297270962aSWarner Losh is FALSE, then the longer text representation of the display node 15307270962aSWarner Losh is used. 15317270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 15327270962aSWarner Losh representation for a device node can be used, where applicable. 15337270962aSWarner Losh 15347270962aSWarner Losh **/ 15357270962aSWarner Losh static VOID 15367270962aSWarner Losh DevPathToTextInfiniBand ( 15377270962aSWarner Losh IN OUT POOL_PRINT *Str, 15387270962aSWarner Losh IN VOID *DevPath, 15397270962aSWarner Losh IN BOOLEAN DisplayOnly, 15407270962aSWarner Losh IN BOOLEAN AllowShortcuts 15417270962aSWarner Losh ) 15427270962aSWarner Losh { 15437270962aSWarner Losh INFINIBAND_DEVICE_PATH *InfiniBand; 15447270962aSWarner Losh 15457270962aSWarner Losh InfiniBand = DevPath; 15467270962aSWarner Losh UefiDevicePathLibCatPrint ( 15477270962aSWarner Losh Str, 15487270962aSWarner Losh "Infiniband(0x%x,%36s,0x%lx,0x%lx,0x%lx)", 15497270962aSWarner Losh InfiniBand->ResourceFlags, 15507270962aSWarner Losh G(InfiniBand->PortGid), 15517270962aSWarner Losh InfiniBand->ServiceId, 15527270962aSWarner Losh InfiniBand->TargetPortId, 15537270962aSWarner Losh InfiniBand->DeviceId 15547270962aSWarner Losh ); 15557270962aSWarner Losh } 15567270962aSWarner Losh 15577270962aSWarner Losh /** 15587270962aSWarner Losh Converts a UART device path structure to its string representative. 15597270962aSWarner Losh 15607270962aSWarner Losh @param Str The string representative of input device. 15617270962aSWarner Losh @param DevPath The input device path structure. 15627270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 15637270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 15647270962aSWarner Losh is FALSE, then the longer text representation of the display node 15657270962aSWarner Losh is used. 15667270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 15677270962aSWarner Losh representation for a device node can be used, where applicable. 15687270962aSWarner Losh 15697270962aSWarner Losh **/ 15707270962aSWarner Losh static VOID 15717270962aSWarner Losh DevPathToTextUart ( 15727270962aSWarner Losh IN OUT POOL_PRINT *Str, 15737270962aSWarner Losh IN VOID *DevPath, 15747270962aSWarner Losh IN BOOLEAN DisplayOnly, 15757270962aSWarner Losh IN BOOLEAN AllowShortcuts 15767270962aSWarner Losh ) 15777270962aSWarner Losh { 15787270962aSWarner Losh UART_DEVICE_PATH *Uart; 15797270962aSWarner Losh CHAR8 Parity; 15807270962aSWarner Losh 15817270962aSWarner Losh Uart = DevPath; 15827270962aSWarner Losh switch (Uart->Parity) { 15837270962aSWarner Losh case 0: 15847270962aSWarner Losh Parity = 'D'; 15857270962aSWarner Losh break; 15867270962aSWarner Losh 15877270962aSWarner Losh case 1: 15887270962aSWarner Losh Parity = 'N'; 15897270962aSWarner Losh break; 15907270962aSWarner Losh 15917270962aSWarner Losh case 2: 15927270962aSWarner Losh Parity = 'E'; 15937270962aSWarner Losh break; 15947270962aSWarner Losh 15957270962aSWarner Losh case 3: 15967270962aSWarner Losh Parity = 'O'; 15977270962aSWarner Losh break; 15987270962aSWarner Losh 15997270962aSWarner Losh case 4: 16007270962aSWarner Losh Parity = 'M'; 16017270962aSWarner Losh break; 16027270962aSWarner Losh 16037270962aSWarner Losh case 5: 16047270962aSWarner Losh Parity = 'S'; 16057270962aSWarner Losh break; 16067270962aSWarner Losh 16077270962aSWarner Losh default: 16087270962aSWarner Losh Parity = 'x'; 16097270962aSWarner Losh break; 16107270962aSWarner Losh } 16117270962aSWarner Losh 16127270962aSWarner Losh if (Uart->BaudRate == 0) { 16137270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Uart(DEFAULT,"); 16147270962aSWarner Losh } else { 16157270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Uart(%ld,", Uart->BaudRate); 16167270962aSWarner Losh } 16177270962aSWarner Losh 16187270962aSWarner Losh if (Uart->DataBits == 0) { 16197270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "DEFAULT,"); 16207270962aSWarner Losh } else { 16217270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%d,", Uart->DataBits); 16227270962aSWarner Losh } 16237270962aSWarner Losh 16247270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%c,", Parity); 16257270962aSWarner Losh 16267270962aSWarner Losh switch (Uart->StopBits) { 16277270962aSWarner Losh case 0: 16287270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "D)"); 16297270962aSWarner Losh break; 16307270962aSWarner Losh 16317270962aSWarner Losh case 1: 16327270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "1)"); 16337270962aSWarner Losh break; 16347270962aSWarner Losh 16357270962aSWarner Losh case 2: 16367270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "1.5)"); 16377270962aSWarner Losh break; 16387270962aSWarner Losh 16397270962aSWarner Losh case 3: 16407270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "2)"); 16417270962aSWarner Losh break; 16427270962aSWarner Losh 16437270962aSWarner Losh default: 16447270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "x)"); 16457270962aSWarner Losh break; 16467270962aSWarner Losh } 16477270962aSWarner Losh } 16487270962aSWarner Losh 16497270962aSWarner Losh /** 16507270962aSWarner Losh Converts an iSCSI device path structure to its string representative. 16517270962aSWarner Losh 16527270962aSWarner Losh @param Str The string representative of input device. 16537270962aSWarner Losh @param DevPath The input device path structure. 16547270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 16557270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 16567270962aSWarner Losh is FALSE, then the longer text representation of the display node 16577270962aSWarner Losh is used. 16587270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 16597270962aSWarner Losh representation for a device node can be used, where applicable. 16607270962aSWarner Losh 16617270962aSWarner Losh **/ 16627270962aSWarner Losh static VOID 16637270962aSWarner Losh DevPathToTextiSCSI ( 16647270962aSWarner Losh IN OUT POOL_PRINT *Str, 16657270962aSWarner Losh IN VOID *DevPath, 16667270962aSWarner Losh IN BOOLEAN DisplayOnly, 16677270962aSWarner Losh IN BOOLEAN AllowShortcuts 16687270962aSWarner Losh ) 16697270962aSWarner Losh { 16707270962aSWarner Losh ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath; 16717270962aSWarner Losh UINT16 Options; 167250668299SJose Luis Duran UINTN Index; 16737270962aSWarner Losh 16747270962aSWarner Losh ISCSIDevPath = DevPath; 16757270962aSWarner Losh UefiDevicePathLibCatPrint ( 16767270962aSWarner Losh Str, 167750668299SJose Luis Duran "iSCSI(%s,0x%x,0x", 16787270962aSWarner Losh ISCSIDevPath->TargetName, 167950668299SJose Luis Duran ISCSIDevPath->TargetPortalGroupTag 16807270962aSWarner Losh ); 168150668299SJose Luis Duran for (Index = 0; Index < sizeof (ISCSIDevPath->Lun) / sizeof (UINT8); Index++) { 168250668299SJose Luis Duran UefiDevicePathLibCatPrint (Str, "%02x", ((UINT8 *)&ISCSIDevPath->Lun)[Index]); 168350668299SJose Luis Duran } 16845754f582SJose Luis Duran 16857270962aSWarner Losh Options = ISCSIDevPath->LoginOption; 168650668299SJose Luis Duran UefiDevicePathLibCatPrint (Str, ",%s,", (((Options >> 1) & 0x0001) != 0) ? "CRC32C" : "None"); 16877270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s,", (((Options >> 3) & 0x0001) != 0) ? "CRC32C" : "None"); 16887270962aSWarner Losh if (((Options >> 11) & 0x0001) != 0) { 16897270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s,", "None"); 16907270962aSWarner Losh } else if (((Options >> 12) & 0x0001) != 0) { 16917270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s,", "CHAP_UNI"); 16927270962aSWarner Losh } else { 16937270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s,", "CHAP_BI"); 16947270962aSWarner Losh } 16957270962aSWarner Losh 16967270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s)", (ISCSIDevPath->NetworkProtocol == 0) ? "TCP" : "reserved"); 16977270962aSWarner Losh } 16987270962aSWarner Losh 16997270962aSWarner Losh /** 17007270962aSWarner Losh Converts a VLAN device path structure to its string representative. 17017270962aSWarner Losh 17027270962aSWarner Losh @param Str The string representative of input device. 17037270962aSWarner Losh @param DevPath The input device path structure. 17047270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 17057270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 17067270962aSWarner Losh is FALSE, then the longer text representation of the display node 17077270962aSWarner Losh is used. 17087270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 17097270962aSWarner Losh representation for a device node can be used, where applicable. 17107270962aSWarner Losh 17117270962aSWarner Losh **/ 17127270962aSWarner Losh static VOID 17137270962aSWarner Losh DevPathToTextVlan ( 17147270962aSWarner Losh IN OUT POOL_PRINT *Str, 17157270962aSWarner Losh IN VOID *DevPath, 17167270962aSWarner Losh IN BOOLEAN DisplayOnly, 17177270962aSWarner Losh IN BOOLEAN AllowShortcuts 17187270962aSWarner Losh ) 17197270962aSWarner Losh { 17207270962aSWarner Losh VLAN_DEVICE_PATH *Vlan; 17217270962aSWarner Losh 17227270962aSWarner Losh Vlan = DevPath; 17237270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Vlan(%d)", Vlan->VlanId); 17247270962aSWarner Losh } 17257270962aSWarner Losh 17267270962aSWarner Losh /** 17277270962aSWarner Losh Converts a Bluetooth device path structure to its string representative. 17287270962aSWarner Losh 17297270962aSWarner Losh @param Str The string representative of input device. 17307270962aSWarner Losh @param DevPath The input device path structure. 17317270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 17327270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 17337270962aSWarner Losh is FALSE, then the longer text representation of the display node 17347270962aSWarner Losh is used. 17357270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 17367270962aSWarner Losh representation for a device node can be used, where applicable. 17377270962aSWarner Losh 17387270962aSWarner Losh **/ 17397270962aSWarner Losh static VOID 17407270962aSWarner Losh DevPathToTextBluetooth ( 17417270962aSWarner Losh IN OUT POOL_PRINT *Str, 17427270962aSWarner Losh IN VOID *DevPath, 17437270962aSWarner Losh IN BOOLEAN DisplayOnly, 17447270962aSWarner Losh IN BOOLEAN AllowShortcuts 17457270962aSWarner Losh ) 17467270962aSWarner Losh { 17477270962aSWarner Losh BLUETOOTH_DEVICE_PATH *Bluetooth; 17487270962aSWarner Losh 17497270962aSWarner Losh Bluetooth = DevPath; 17507270962aSWarner Losh UefiDevicePathLibCatPrint ( 17517270962aSWarner Losh Str, 17527270962aSWarner Losh "Bluetooth(%02x%02x%02x%02x%02x%02x)", 175300816383SJose Luis Duran Bluetooth->BD_ADDR.Address[0], 17547270962aSWarner Losh Bluetooth->BD_ADDR.Address[1], 175500816383SJose Luis Duran Bluetooth->BD_ADDR.Address[2], 175600816383SJose Luis Duran Bluetooth->BD_ADDR.Address[3], 175700816383SJose Luis Duran Bluetooth->BD_ADDR.Address[4], 175800816383SJose Luis Duran Bluetooth->BD_ADDR.Address[5] 17597270962aSWarner Losh ); 17607270962aSWarner Losh } 17617270962aSWarner Losh 17627270962aSWarner Losh /** 17637270962aSWarner Losh Converts a Wi-Fi device path structure to its string representative. 17647270962aSWarner Losh 17657270962aSWarner Losh @param Str The string representative of input device. 17667270962aSWarner Losh @param DevPath The input device path structure. 17677270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 17687270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 17697270962aSWarner Losh is FALSE, then the longer text representation of the display node 17707270962aSWarner Losh is used. 17717270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 17727270962aSWarner Losh representation for a device node can be used, where applicable. 17737270962aSWarner Losh 17747270962aSWarner Losh **/ 17757270962aSWarner Losh static VOID 17767270962aSWarner Losh DevPathToTextWiFi ( 17777270962aSWarner Losh IN OUT POOL_PRINT *Str, 17787270962aSWarner Losh IN VOID *DevPath, 17797270962aSWarner Losh IN BOOLEAN DisplayOnly, 17807270962aSWarner Losh IN BOOLEAN AllowShortcuts 17817270962aSWarner Losh ) 17827270962aSWarner Losh { 17837270962aSWarner Losh WIFI_DEVICE_PATH *WiFi; 17847270962aSWarner Losh UINT8 SSId[33]; 17857270962aSWarner Losh 17867270962aSWarner Losh WiFi = DevPath; 17877270962aSWarner Losh 17887270962aSWarner Losh SSId[32] = '\0'; 17897270962aSWarner Losh CopyMem (SSId, WiFi->SSId, 32); 17907270962aSWarner Losh 17917270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Wi-Fi(%s)", SSId); 17927270962aSWarner Losh } 17937270962aSWarner Losh 17947270962aSWarner Losh /** 1795e8fc7f11SJose Luis Duran Converts a Bluetooth device path structure to its string representative. 1796e8fc7f11SJose Luis Duran 1797e8fc7f11SJose Luis Duran @param Str The string representative of input device. 1798e8fc7f11SJose Luis Duran @param DevPath The input device path structure. 1799e8fc7f11SJose Luis Duran @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 1800e8fc7f11SJose Luis Duran of the display node is used, where applicable. If DisplayOnly 1801e8fc7f11SJose Luis Duran is FALSE, then the longer text representation of the display node 1802e8fc7f11SJose Luis Duran is used. 1803e8fc7f11SJose Luis Duran @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 1804e8fc7f11SJose Luis Duran representation for a device node can be used, where applicable. 1805e8fc7f11SJose Luis Duran 1806e8fc7f11SJose Luis Duran **/ 1807e8fc7f11SJose Luis Duran static VOID 1808e8fc7f11SJose Luis Duran DevPathToTextBluetoothLE ( 1809e8fc7f11SJose Luis Duran IN OUT POOL_PRINT *Str, 1810e8fc7f11SJose Luis Duran IN VOID *DevPath, 1811e8fc7f11SJose Luis Duran IN BOOLEAN DisplayOnly, 1812e8fc7f11SJose Luis Duran IN BOOLEAN AllowShortcuts 1813e8fc7f11SJose Luis Duran ) 1814e8fc7f11SJose Luis Duran { 1815e8fc7f11SJose Luis Duran BLUETOOTH_LE_DEVICE_PATH *BluetoothLE; 1816e8fc7f11SJose Luis Duran 1817e8fc7f11SJose Luis Duran BluetoothLE = DevPath; 1818e8fc7f11SJose Luis Duran UefiDevicePathLibCatPrint ( 1819e8fc7f11SJose Luis Duran Str, 1820e8fc7f11SJose Luis Duran "BluetoothLE(%02x%02x%02x%02x%02x%02x,0x%02x)", 1821e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[0], 1822e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[1], 1823e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[2], 1824e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[3], 1825e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[4], 1826e8fc7f11SJose Luis Duran BluetoothLE->Address.Address[5], 1827e8fc7f11SJose Luis Duran BluetoothLE->Address.Type 1828e8fc7f11SJose Luis Duran ); 1829e8fc7f11SJose Luis Duran } 1830e8fc7f11SJose Luis Duran 1831e8fc7f11SJose Luis Duran /** 1832d9d1a1e7SJose Luis Duran Converts a DNS device path structure to its string representative. 1833d9d1a1e7SJose Luis Duran 1834d9d1a1e7SJose Luis Duran @param Str The string representative of input device. 1835d9d1a1e7SJose Luis Duran @param DevPath The input device path structure. 1836d9d1a1e7SJose Luis Duran @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 1837d9d1a1e7SJose Luis Duran of the display node is used, where applicable. If DisplayOnly 1838d9d1a1e7SJose Luis Duran is FALSE, then the longer text representation of the display node 1839d9d1a1e7SJose Luis Duran is used. 1840d9d1a1e7SJose Luis Duran @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 1841d9d1a1e7SJose Luis Duran representation for a device node can be used, where applicable. 1842d9d1a1e7SJose Luis Duran 1843d9d1a1e7SJose Luis Duran **/ 1844d9d1a1e7SJose Luis Duran static VOID 1845d9d1a1e7SJose Luis Duran DevPathToTextDns ( 1846d9d1a1e7SJose Luis Duran IN OUT POOL_PRINT *Str, 1847d9d1a1e7SJose Luis Duran IN VOID *DevPath, 1848d9d1a1e7SJose Luis Duran IN BOOLEAN DisplayOnly, 1849d9d1a1e7SJose Luis Duran IN BOOLEAN AllowShortcuts 1850d9d1a1e7SJose Luis Duran ) 1851d9d1a1e7SJose Luis Duran { 1852d9d1a1e7SJose Luis Duran DNS_DEVICE_PATH *DnsDevPath; 1853d9d1a1e7SJose Luis Duran UINT32 DnsServerIpCount; 1854d9d1a1e7SJose Luis Duran UINT32 DnsServerIpIndex; 1855d9d1a1e7SJose Luis Duran 1856d9d1a1e7SJose Luis Duran DnsDevPath = DevPath; 1857d9d1a1e7SJose Luis Duran DnsServerIpCount = (UINT32)(DevicePathNodeLength (DnsDevPath) - sizeof (EFI_DEVICE_PATH_PROTOCOL) - sizeof (DnsDevPath->IsIPv6)) / sizeof (EFI_IP_ADDRESS); 1858d9d1a1e7SJose Luis Duran 1859d9d1a1e7SJose Luis Duran UefiDevicePathLibCatPrint (Str, "Dns("); 1860d9d1a1e7SJose Luis Duran 1861d9d1a1e7SJose Luis Duran for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) { 1862d9d1a1e7SJose Luis Duran if (DnsDevPath->IsIPv6 == 0x00) { 1863d9d1a1e7SJose Luis Duran CatIPv4Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v4)); 1864d9d1a1e7SJose Luis Duran } else { 1865d9d1a1e7SJose Luis Duran CatIPv6Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v6)); 1866d9d1a1e7SJose Luis Duran } 1867d9d1a1e7SJose Luis Duran 1868d9d1a1e7SJose Luis Duran if (DnsServerIpIndex < DnsServerIpCount - 1) { 1869d9d1a1e7SJose Luis Duran UefiDevicePathLibCatPrint (Str, ","); 1870d9d1a1e7SJose Luis Duran } 1871d9d1a1e7SJose Luis Duran } 1872d9d1a1e7SJose Luis Duran 1873d9d1a1e7SJose Luis Duran UefiDevicePathLibCatPrint (Str, ")"); 1874d9d1a1e7SJose Luis Duran } 1875d9d1a1e7SJose Luis Duran 1876d9d1a1e7SJose Luis Duran /** 18777270962aSWarner Losh Converts a URI device path structure to its string representative. 18787270962aSWarner Losh 18797270962aSWarner Losh @param Str The string representative of input device. 18807270962aSWarner Losh @param DevPath The input device path structure. 18817270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 18827270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 18837270962aSWarner Losh is FALSE, then the longer text representation of the display node 18847270962aSWarner Losh is used. 18857270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 18867270962aSWarner Losh representation for a device node can be used, where applicable. 18877270962aSWarner Losh 18887270962aSWarner Losh **/ 18897270962aSWarner Losh static VOID 18907270962aSWarner Losh DevPathToTextUri ( 18917270962aSWarner Losh IN OUT POOL_PRINT *Str, 18927270962aSWarner Losh IN VOID *DevPath, 18937270962aSWarner Losh IN BOOLEAN DisplayOnly, 18947270962aSWarner Losh IN BOOLEAN AllowShortcuts 18957270962aSWarner Losh ) 18967270962aSWarner Losh { 18977270962aSWarner Losh URI_DEVICE_PATH *Uri; 18987270962aSWarner Losh UINTN UriLength; 18997270962aSWarner Losh CHAR8 *UriStr; 19007270962aSWarner Losh 19017270962aSWarner Losh // 19027270962aSWarner Losh // Uri in the device path may not be null terminated. 19037270962aSWarner Losh // 19047270962aSWarner Losh Uri = DevPath; 19057270962aSWarner Losh UriLength = DevicePathNodeLength (Uri) - sizeof (URI_DEVICE_PATH); 19067270962aSWarner Losh UriStr = AllocatePool (UriLength + 1); 19077270962aSWarner Losh ASSERT (UriStr != NULL); 19087270962aSWarner Losh 19097270962aSWarner Losh CopyMem (UriStr, Uri->Uri, UriLength); 19107270962aSWarner Losh UriStr[UriLength] = '\0'; 19117270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Uri(%s)", UriStr); 19127270962aSWarner Losh FreePool (UriStr); 19137270962aSWarner Losh } 19147270962aSWarner Losh 19157270962aSWarner Losh /** 19167270962aSWarner Losh Converts a Hard drive device path structure to its string representative. 19177270962aSWarner Losh 19187270962aSWarner Losh @param Str The string representative of input device. 19197270962aSWarner Losh @param DevPath The input device path structure. 19207270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 19217270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 19227270962aSWarner Losh is FALSE, then the longer text representation of the display node 19237270962aSWarner Losh is used. 19247270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 19257270962aSWarner Losh representation for a device node can be used, where applicable. 19267270962aSWarner Losh 19277270962aSWarner Losh **/ 19287270962aSWarner Losh static VOID 19297270962aSWarner Losh DevPathToTextHardDrive ( 19307270962aSWarner Losh IN OUT POOL_PRINT *Str, 19317270962aSWarner Losh IN VOID *DevPath, 19327270962aSWarner Losh IN BOOLEAN DisplayOnly, 19337270962aSWarner Losh IN BOOLEAN AllowShortcuts 19347270962aSWarner Losh ) 19357270962aSWarner Losh { 19367270962aSWarner Losh HARDDRIVE_DEVICE_PATH *Hd; 19377270962aSWarner Losh 19387270962aSWarner Losh Hd = DevPath; 19397270962aSWarner Losh switch (Hd->SignatureType) { 19407270962aSWarner Losh case SIGNATURE_TYPE_MBR: 19417270962aSWarner Losh UefiDevicePathLibCatPrint ( 19427270962aSWarner Losh Str, 19437270962aSWarner Losh "HD(%d,%s,0x%08x,", 19447270962aSWarner Losh Hd->PartitionNumber, 19457270962aSWarner Losh "MBR", 19467270962aSWarner Losh // *((UINT32 *)(&(Hd->Signature[0]))) 19477270962aSWarner Losh le32dec(&(Hd->Signature[0])) 19487270962aSWarner Losh ); 19497270962aSWarner Losh break; 19507270962aSWarner Losh 19517270962aSWarner Losh case SIGNATURE_TYPE_GUID: 19527270962aSWarner Losh UefiDevicePathLibCatPrint ( 19537270962aSWarner Losh Str, 19547270962aSWarner Losh "HD(%d,%s,%36s,", 19557270962aSWarner Losh Hd->PartitionNumber, 19567270962aSWarner Losh "GPT", 19577270962aSWarner Losh G(&(Hd->Signature[0])) 19587270962aSWarner Losh ); 19597270962aSWarner Losh break; 19607270962aSWarner Losh 19617270962aSWarner Losh default: 19627270962aSWarner Losh UefiDevicePathLibCatPrint ( 19637270962aSWarner Losh Str, 19647270962aSWarner Losh "HD(%d,%d,0,", 19657270962aSWarner Losh Hd->PartitionNumber, 19667270962aSWarner Losh Hd->SignatureType 19677270962aSWarner Losh ); 19687270962aSWarner Losh break; 19697270962aSWarner Losh } 19707270962aSWarner Losh 19717270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "0x%lx,0x%lx)", Hd->PartitionStart, Hd->PartitionSize); 19727270962aSWarner Losh } 19737270962aSWarner Losh 19747270962aSWarner Losh /** 19757270962aSWarner Losh Converts a CDROM device path structure to its string representative. 19767270962aSWarner Losh 19777270962aSWarner Losh @param Str The string representative of input device. 19787270962aSWarner Losh @param DevPath The input device path structure. 19797270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 19807270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 19817270962aSWarner Losh is FALSE, then the longer text representation of the display node 19827270962aSWarner Losh is used. 19837270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 19847270962aSWarner Losh representation for a device node can be used, where applicable. 19857270962aSWarner Losh 19867270962aSWarner Losh **/ 19877270962aSWarner Losh static VOID 19887270962aSWarner Losh DevPathToTextCDROM ( 19897270962aSWarner Losh IN OUT POOL_PRINT *Str, 19907270962aSWarner Losh IN VOID *DevPath, 19917270962aSWarner Losh IN BOOLEAN DisplayOnly, 19927270962aSWarner Losh IN BOOLEAN AllowShortcuts 19937270962aSWarner Losh ) 19947270962aSWarner Losh { 19957270962aSWarner Losh CDROM_DEVICE_PATH *Cd; 19967270962aSWarner Losh 19977270962aSWarner Losh Cd = DevPath; 19987270962aSWarner Losh if (DisplayOnly) { 19997270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "CDROM(0x%x)", Cd->BootEntry); 20007270962aSWarner Losh return; 20017270962aSWarner Losh } 20027270962aSWarner Losh 20037270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "CDROM(0x%x,0x%lx,0x%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize); 20047270962aSWarner Losh } 20057270962aSWarner Losh 20067270962aSWarner Losh /** 20077270962aSWarner Losh Converts a File device path structure to its string representative. 20087270962aSWarner Losh 20097270962aSWarner Losh @param Str The string representative of input device. 20107270962aSWarner Losh @param DevPath The input device path structure. 20117270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 20127270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 20137270962aSWarner Losh is FALSE, then the longer text representation of the display node 20147270962aSWarner Losh is used. 20157270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 20167270962aSWarner Losh representation for a device node can be used, where applicable. 20177270962aSWarner Losh 20187270962aSWarner Losh **/ 20197270962aSWarner Losh static VOID 20207270962aSWarner Losh DevPathToTextFilePath ( 20217270962aSWarner Losh IN OUT POOL_PRINT *Str, 20227270962aSWarner Losh IN VOID *DevPath, 20237270962aSWarner Losh IN BOOLEAN DisplayOnly, 20247270962aSWarner Losh IN BOOLEAN AllowShortcuts 20257270962aSWarner Losh ) 20267270962aSWarner Losh { 20277270962aSWarner Losh FILEPATH_DEVICE_PATH *Fp; 20280d802f5aSWarner Losh char *name = NULL; 20297270962aSWarner Losh 20307270962aSWarner Losh Fp = DevPath; 20310d802f5aSWarner Losh ucs2_to_utf8(Fp->PathName, &name); 20320d802f5aSWarner Losh UefiDevicePathLibCatPrint (Str, "File(%s)", name); 20330d802f5aSWarner Losh free(name); 20347270962aSWarner Losh } 20357270962aSWarner Losh 20367270962aSWarner Losh /** 20377270962aSWarner Losh Converts a Media protocol device path structure to its string representative. 20387270962aSWarner Losh 20397270962aSWarner Losh @param Str The string representative of input device. 20407270962aSWarner Losh @param DevPath The input device path structure. 20417270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 20427270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 20437270962aSWarner Losh is FALSE, then the longer text representation of the display node 20447270962aSWarner Losh is used. 20457270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 20467270962aSWarner Losh representation for a device node can be used, where applicable. 20477270962aSWarner Losh 20487270962aSWarner Losh **/ 20497270962aSWarner Losh static VOID 20507270962aSWarner Losh DevPathToTextMediaProtocol ( 20517270962aSWarner Losh IN OUT POOL_PRINT *Str, 20527270962aSWarner Losh IN VOID *DevPath, 20537270962aSWarner Losh IN BOOLEAN DisplayOnly, 20547270962aSWarner Losh IN BOOLEAN AllowShortcuts 20557270962aSWarner Losh ) 20567270962aSWarner Losh { 20577270962aSWarner Losh MEDIA_PROTOCOL_DEVICE_PATH *MediaProt; 20587270962aSWarner Losh 20597270962aSWarner Losh MediaProt = DevPath; 20607270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Media(%36s)", G(&MediaProt->Protocol)); 20617270962aSWarner Losh } 20627270962aSWarner Losh 20637270962aSWarner Losh /** 20647270962aSWarner Losh Converts a Firmware Volume device path structure to its string representative. 20657270962aSWarner Losh 20667270962aSWarner Losh @param Str The string representative of input device. 20677270962aSWarner Losh @param DevPath The input device path structure. 20687270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 20697270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 20707270962aSWarner Losh is FALSE, then the longer text representation of the display node 20717270962aSWarner Losh is used. 20727270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 20737270962aSWarner Losh representation for a device node can be used, where applicable. 20747270962aSWarner Losh 20757270962aSWarner Losh **/ 20767270962aSWarner Losh static VOID 20777270962aSWarner Losh DevPathToTextFv ( 20787270962aSWarner Losh IN OUT POOL_PRINT *Str, 20797270962aSWarner Losh IN VOID *DevPath, 20807270962aSWarner Losh IN BOOLEAN DisplayOnly, 20817270962aSWarner Losh IN BOOLEAN AllowShortcuts 20827270962aSWarner Losh ) 20837270962aSWarner Losh { 20847270962aSWarner Losh MEDIA_FW_VOL_DEVICE_PATH *Fv; 20857270962aSWarner Losh 20867270962aSWarner Losh Fv = DevPath; 20877270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Fv(%36s)", G(&Fv->FvName)); 20887270962aSWarner Losh } 20897270962aSWarner Losh 20907270962aSWarner Losh /** 20917270962aSWarner Losh Converts a Firmware Volume File device path structure to its string representative. 20927270962aSWarner Losh 20937270962aSWarner Losh @param Str The string representative of input device. 20947270962aSWarner Losh @param DevPath The input device path structure. 20957270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 20967270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 20977270962aSWarner Losh is FALSE, then the longer text representation of the display node 20987270962aSWarner Losh is used. 20997270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 21007270962aSWarner Losh representation for a device node can be used, where applicable. 21017270962aSWarner Losh 21027270962aSWarner Losh **/ 21037270962aSWarner Losh static VOID 21047270962aSWarner Losh DevPathToTextFvFile ( 21057270962aSWarner Losh IN OUT POOL_PRINT *Str, 21067270962aSWarner Losh IN VOID *DevPath, 21077270962aSWarner Losh IN BOOLEAN DisplayOnly, 21087270962aSWarner Losh IN BOOLEAN AllowShortcuts 21097270962aSWarner Losh ) 21107270962aSWarner Losh { 21117270962aSWarner Losh MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile; 21127270962aSWarner Losh 21137270962aSWarner Losh FvFile = DevPath; 21147270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "FvFile(%36s)", G(&FvFile->FvFileName)); 21157270962aSWarner Losh } 21167270962aSWarner Losh 21177270962aSWarner Losh /** 21187270962aSWarner Losh Converts a Relative Offset device path structure to its string representative. 21197270962aSWarner Losh 21207270962aSWarner Losh @param Str The string representative of input device. 21217270962aSWarner Losh @param DevPath The input device path structure. 21227270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 21237270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 21247270962aSWarner Losh is FALSE, then the longer text representation of the display node 21257270962aSWarner Losh is used. 21267270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 21277270962aSWarner Losh representation for a device node can be used, where applicable. 21287270962aSWarner Losh 21297270962aSWarner Losh **/ 21307270962aSWarner Losh static VOID 21317270962aSWarner Losh DevPathRelativeOffsetRange ( 21327270962aSWarner Losh IN OUT POOL_PRINT *Str, 21337270962aSWarner Losh IN VOID *DevPath, 21347270962aSWarner Losh IN BOOLEAN DisplayOnly, 21357270962aSWarner Losh IN BOOLEAN AllowShortcuts 21367270962aSWarner Losh ) 21377270962aSWarner Losh { 21387270962aSWarner Losh MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset; 21397270962aSWarner Losh 21407270962aSWarner Losh Offset = DevPath; 21417270962aSWarner Losh UefiDevicePathLibCatPrint ( 21427270962aSWarner Losh Str, 21437270962aSWarner Losh "Offset(0x%lx,0x%lx)", 21447270962aSWarner Losh Offset->StartingOffset, 21457270962aSWarner Losh Offset->EndingOffset 21467270962aSWarner Losh ); 21477270962aSWarner Losh } 21487270962aSWarner Losh 21497270962aSWarner Losh /** 21507270962aSWarner Losh Converts a Ram Disk device path structure to its string representative. 21517270962aSWarner Losh 21527270962aSWarner Losh @param Str The string representative of input device. 21537270962aSWarner Losh @param DevPath The input device path structure. 21547270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 21557270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 21567270962aSWarner Losh is FALSE, then the longer text representation of the display node 21577270962aSWarner Losh is used. 21587270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 21597270962aSWarner Losh representation for a device node can be used, where applicable. 21607270962aSWarner Losh 21617270962aSWarner Losh **/ 21627270962aSWarner Losh static VOID 21637270962aSWarner Losh DevPathToTextRamDisk ( 21647270962aSWarner Losh IN OUT POOL_PRINT *Str, 21657270962aSWarner Losh IN VOID *DevPath, 21667270962aSWarner Losh IN BOOLEAN DisplayOnly, 21677270962aSWarner Losh IN BOOLEAN AllowShortcuts 21687270962aSWarner Losh ) 21697270962aSWarner Losh { 21707270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk; 21717270962aSWarner Losh 21727270962aSWarner Losh RamDisk = DevPath; 21737270962aSWarner Losh 21747270962aSWarner Losh if (CompareGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid)) { 21757270962aSWarner Losh UefiDevicePathLibCatPrint ( 21767270962aSWarner Losh Str, 21777270962aSWarner Losh "VirtualDisk(0x%lx,0x%lx,%d)", 21787270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->StartingAddr[1], 32) | RamDisk->StartingAddr[0], 21797270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->EndingAddr[1], 32) | RamDisk->EndingAddr[0], 21807270962aSWarner Losh RamDisk->Instance 21817270962aSWarner Losh ); 21827270962aSWarner Losh } else if (CompareGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid)) { 21837270962aSWarner Losh UefiDevicePathLibCatPrint ( 21847270962aSWarner Losh Str, 21857270962aSWarner Losh "VirtualCD(0x%lx,0x%lx,%d)", 21867270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->StartingAddr[1], 32) | RamDisk->StartingAddr[0], 21877270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->EndingAddr[1], 32) | RamDisk->EndingAddr[0], 21887270962aSWarner Losh RamDisk->Instance 21897270962aSWarner Losh ); 21907270962aSWarner Losh } else if (CompareGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid)) { 21917270962aSWarner Losh UefiDevicePathLibCatPrint ( 21927270962aSWarner Losh Str, 21937270962aSWarner Losh "PersistentVirtualDisk(0x%lx,0x%lx,%d)", 21947270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->StartingAddr[1], 32) | RamDisk->StartingAddr[0], 21957270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->EndingAddr[1], 32) | RamDisk->EndingAddr[0], 21967270962aSWarner Losh RamDisk->Instance 21977270962aSWarner Losh ); 21987270962aSWarner Losh } else if (CompareGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid)) { 21997270962aSWarner Losh UefiDevicePathLibCatPrint ( 22007270962aSWarner Losh Str, 22017270962aSWarner Losh "PersistentVirtualCD(0x%lx,0x%lx,%d)", 22027270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->StartingAddr[1], 32) | RamDisk->StartingAddr[0], 22037270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->EndingAddr[1], 32) | RamDisk->EndingAddr[0], 22047270962aSWarner Losh RamDisk->Instance 22057270962aSWarner Losh ); 22067270962aSWarner Losh } else { 22077270962aSWarner Losh UefiDevicePathLibCatPrint ( 22087270962aSWarner Losh Str, 22097270962aSWarner Losh "RamDisk(0x%lx,0x%lx,%d,%36s)", 22107270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->StartingAddr[1], 32) | RamDisk->StartingAddr[0], 22117270962aSWarner Losh LShiftU64 ((UINT64)RamDisk->EndingAddr[1], 32) | RamDisk->EndingAddr[0], 22127270962aSWarner Losh RamDisk->Instance, 22137270962aSWarner Losh G(&RamDisk->TypeGuid) 22147270962aSWarner Losh ); 22157270962aSWarner Losh } 22167270962aSWarner Losh } 22177270962aSWarner Losh 22187270962aSWarner Losh /** 22197270962aSWarner Losh Converts a BIOS Boot Specification device path structure to its string representative. 22207270962aSWarner Losh 22217270962aSWarner Losh @param Str The string representative of input device. 22227270962aSWarner Losh @param DevPath The input device path structure. 22237270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 22247270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 22257270962aSWarner Losh is FALSE, then the longer text representation of the display node 22267270962aSWarner Losh is used. 22277270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 22287270962aSWarner Losh representation for a device node can be used, where applicable. 22297270962aSWarner Losh 22307270962aSWarner Losh **/ 22317270962aSWarner Losh static VOID 22327270962aSWarner Losh DevPathToTextBBS ( 22337270962aSWarner Losh IN OUT POOL_PRINT *Str, 22347270962aSWarner Losh IN VOID *DevPath, 22357270962aSWarner Losh IN BOOLEAN DisplayOnly, 22367270962aSWarner Losh IN BOOLEAN AllowShortcuts 22377270962aSWarner Losh ) 22387270962aSWarner Losh { 22397270962aSWarner Losh BBS_BBS_DEVICE_PATH *Bbs; 22407270962aSWarner Losh const char *Type; 22417270962aSWarner Losh 22427270962aSWarner Losh Bbs = DevPath; 22437270962aSWarner Losh switch (Bbs->DeviceType) { 22447270962aSWarner Losh case BBS_TYPE_FLOPPY: 22457270962aSWarner Losh Type = "Floppy"; 22467270962aSWarner Losh break; 22477270962aSWarner Losh 22487270962aSWarner Losh case BBS_TYPE_HARDDRIVE: 22497270962aSWarner Losh Type = "HD"; 22507270962aSWarner Losh break; 22517270962aSWarner Losh 22527270962aSWarner Losh case BBS_TYPE_CDROM: 22537270962aSWarner Losh Type = "CDROM"; 22547270962aSWarner Losh break; 22557270962aSWarner Losh 22567270962aSWarner Losh case BBS_TYPE_PCMCIA: 22577270962aSWarner Losh Type = "PCMCIA"; 22587270962aSWarner Losh break; 22597270962aSWarner Losh 22607270962aSWarner Losh case BBS_TYPE_USB: 22617270962aSWarner Losh Type = "USB"; 22627270962aSWarner Losh break; 22637270962aSWarner Losh 22647270962aSWarner Losh case BBS_TYPE_EMBEDDED_NETWORK: 22657270962aSWarner Losh Type = "Network"; 22667270962aSWarner Losh break; 22677270962aSWarner Losh 22687270962aSWarner Losh default: 22697270962aSWarner Losh Type = NULL; 22707270962aSWarner Losh break; 22717270962aSWarner Losh } 22727270962aSWarner Losh 22737270962aSWarner Losh if (Type != NULL) { 22747270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "BBS(%s,%s", Type, Bbs->String); 22757270962aSWarner Losh } else { 22767270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "BBS(0x%x,%s", Bbs->DeviceType, Bbs->String); 22777270962aSWarner Losh } 22787270962aSWarner Losh 22797270962aSWarner Losh if (DisplayOnly) { 22807270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 22817270962aSWarner Losh return; 22827270962aSWarner Losh } 22837270962aSWarner Losh 22847270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ",0x%x)", Bbs->StatusFlag); 22857270962aSWarner Losh } 22867270962aSWarner Losh 22877270962aSWarner Losh /** 22887270962aSWarner Losh Converts an End-of-Device-Path structure to its string representative. 22897270962aSWarner Losh 22907270962aSWarner Losh @param Str The string representative of input device. 22917270962aSWarner Losh @param DevPath The input device path structure. 22927270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 22937270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 22947270962aSWarner Losh is FALSE, then the longer text representation of the display node 22957270962aSWarner Losh is used. 22967270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 22977270962aSWarner Losh representation for a device node can be used, where applicable. 22987270962aSWarner Losh 22997270962aSWarner Losh **/ 23007270962aSWarner Losh static VOID 23017270962aSWarner Losh DevPathToTextEndInstance ( 23027270962aSWarner Losh IN OUT POOL_PRINT *Str, 23037270962aSWarner Losh IN VOID *DevPath, 23047270962aSWarner Losh IN BOOLEAN DisplayOnly, 23057270962aSWarner Losh IN BOOLEAN AllowShortcuts 23067270962aSWarner Losh ) 23077270962aSWarner Losh { 23087270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 23097270962aSWarner Losh } 23107270962aSWarner Losh 23117270962aSWarner Losh GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_GENERIC_TABLE mUefiDevicePathLibToTextTableGeneric[] = { 23127270962aSWarner Losh { HARDWARE_DEVICE_PATH, "HardwarePath" }, 23137270962aSWarner Losh { ACPI_DEVICE_PATH, "AcpiPath" }, 23147270962aSWarner Losh { MESSAGING_DEVICE_PATH, "Msg" }, 23157270962aSWarner Losh { MEDIA_DEVICE_PATH, "MediaPath" }, 23167270962aSWarner Losh { BBS_DEVICE_PATH, "BbsPath" }, 23177270962aSWarner Losh { 0, NULL } 23187270962aSWarner Losh }; 23197270962aSWarner Losh 23207270962aSWarner Losh /** 23217270962aSWarner Losh Converts an unknown device path structure to its string representative. 23227270962aSWarner Losh 23237270962aSWarner Losh @param Str The string representative of input device. 23247270962aSWarner Losh @param DevPath The input device path structure. 23257270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 23267270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 23277270962aSWarner Losh is FALSE, then the longer text representation of the display node 23287270962aSWarner Losh is used. 23297270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 23307270962aSWarner Losh representation for a device node can be used, where applicable. 23317270962aSWarner Losh 23327270962aSWarner Losh **/ 23337270962aSWarner Losh static VOID 23347270962aSWarner Losh DevPathToTextNodeGeneric ( 23357270962aSWarner Losh IN OUT POOL_PRINT *Str, 23367270962aSWarner Losh IN VOID *DevPath, 23377270962aSWarner Losh IN BOOLEAN DisplayOnly, 23387270962aSWarner Losh IN BOOLEAN AllowShortcuts 23397270962aSWarner Losh ) 23407270962aSWarner Losh { 23417270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *Node; 23427270962aSWarner Losh UINTN Index; 23437270962aSWarner Losh 23447270962aSWarner Losh Node = DevPath; 23457270962aSWarner Losh 23467270962aSWarner Losh for (Index = 0; mUefiDevicePathLibToTextTableGeneric[Index].Text != NULL; Index++) { 23477270962aSWarner Losh if (DevicePathType (Node) == mUefiDevicePathLibToTextTableGeneric[Index].Type) { 23487270962aSWarner Losh break; 23497270962aSWarner Losh } 23507270962aSWarner Losh } 23517270962aSWarner Losh 23527270962aSWarner Losh if (mUefiDevicePathLibToTextTableGeneric[Index].Text == NULL) { 23537270962aSWarner Losh // 23547270962aSWarner Losh // It's a node whose type cannot be recognized 23557270962aSWarner Losh // 23567270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "Path(%d,%d", DevicePathType (Node), DevicePathSubType (Node)); 23577270962aSWarner Losh } else { 23587270962aSWarner Losh // 23597270962aSWarner Losh // It's a node whose type can be recognized 23607270962aSWarner Losh // 23617270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%s(%d", mUefiDevicePathLibToTextTableGeneric[Index].Text, DevicePathSubType (Node)); 23627270962aSWarner Losh } 23637270962aSWarner Losh 23647270962aSWarner Losh Index = sizeof (EFI_DEVICE_PATH_PROTOCOL); 23657270962aSWarner Losh if (Index < DevicePathNodeLength (Node)) { 23667270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ","); 23677270962aSWarner Losh for ( ; Index < DevicePathNodeLength (Node); Index++) { 23687270962aSWarner Losh UefiDevicePathLibCatPrint (Str, "%02x", ((UINT8 *)Node)[Index]); 23697270962aSWarner Losh } 23707270962aSWarner Losh } 23717270962aSWarner Losh 23727270962aSWarner Losh UefiDevicePathLibCatPrint (Str, ")"); 23737270962aSWarner Losh } 23747270962aSWarner Losh 23757270962aSWarner Losh static const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLibToTextTable[] = { 23767270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci }, 23777270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard }, 23787270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap }, 23797270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor }, 23807270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController }, 23817270962aSWarner Losh { HARDWARE_DEVICE_PATH, HW_BMC_DP, DevPathToTextBmc }, 23827270962aSWarner Losh { ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi }, 23837270962aSWarner Losh { ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextAcpiEx }, 23847270962aSWarner Losh { ACPI_DEVICE_PATH, ACPI_ADR_DP, DevPathToTextAcpiAdr }, 23857270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi }, 23867270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi }, 23877270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre }, 23887270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, DevPathToTextFibreEx }, 23897270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_SASEX_DP, DevPathToTextSasEx }, 23907270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_NVME_NAMESPACE_DP, DevPathToTextNVMe }, 23917270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_UFS_DP, DevPathToTextUfs }, 23927270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_SD_DP, DevPathToTextSd }, 23937270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_EMMC_DP, DevPathToTextEmmc }, 23947270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394 }, 23957270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb }, 23967270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID }, 23977270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit }, 23987270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass }, 23997270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_SATA_DP, DevPathToTextSata }, 24007270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O }, 24017270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr }, 24027270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4 }, 24037270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6 }, 24047270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand }, 24057270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart }, 24067270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor }, 24077270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI }, 24087270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_VLAN_DP, DevPathToTextVlan }, 2409d9d1a1e7SJose Luis Duran { MESSAGING_DEVICE_PATH, MSG_DNS_DP, DevPathToTextDns }, 24107270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_URI_DP, DevPathToTextUri }, 24117270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_DP, DevPathToTextBluetooth }, 24127270962aSWarner Losh { MESSAGING_DEVICE_PATH, MSG_WIFI_DP, DevPathToTextWiFi }, 2413e8fc7f11SJose Luis Duran { MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_LE_DP, DevPathToTextBluetoothLE }, 24147270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive }, 24157270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM }, 24167270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor }, 24177270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol }, 24187270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath }, 24197270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_VOL_DP, DevPathToTextFv }, 24207270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_FILE_DP, DevPathToTextFvFile }, 24217270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_RELATIVE_OFFSET_RANGE_DP, DevPathRelativeOffsetRange }, 24227270962aSWarner Losh { MEDIA_DEVICE_PATH, MEDIA_RAM_DISK_DP, DevPathToTextRamDisk }, 24237270962aSWarner Losh { BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS }, 24247270962aSWarner Losh { END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance }, 24257270962aSWarner Losh { 0, 0, NULL } 24267270962aSWarner Losh }; 24277270962aSWarner Losh 24287270962aSWarner Losh /** 24297270962aSWarner Losh Converts a device node to its string representation. 24307270962aSWarner Losh 24317270962aSWarner Losh @param DeviceNode A Pointer to the device node to be converted. 24327270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 24337270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 24347270962aSWarner Losh is FALSE, then the longer text representation of the display node 24357270962aSWarner Losh is used. 24367270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 24377270962aSWarner Losh representation for a device node can be used, where applicable. 24387270962aSWarner Losh 24397270962aSWarner Losh @return A pointer to the allocated text representation of the device node or NULL if DeviceNode 24407270962aSWarner Losh is NULL or there was insufficient memory. 24417270962aSWarner Losh 24427270962aSWarner Losh **/ 24435320ef6aSWarner Losh static char * 24447270962aSWarner Losh EFIAPI 24457270962aSWarner Losh UefiDevicePathLibConvertDeviceNodeToText ( 24467270962aSWarner Losh IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode, 24477270962aSWarner Losh IN BOOLEAN DisplayOnly, 24487270962aSWarner Losh IN BOOLEAN AllowShortcuts 24497270962aSWarner Losh ) 24507270962aSWarner Losh { 24517270962aSWarner Losh POOL_PRINT Str; 24527270962aSWarner Losh UINTN Index; 24537270962aSWarner Losh DEVICE_PATH_TO_TEXT ToText; 24545320ef6aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *Node; 24557270962aSWarner Losh 24567270962aSWarner Losh if (DeviceNode == NULL) { 24577270962aSWarner Losh return NULL; 24587270962aSWarner Losh } 24597270962aSWarner Losh 24607270962aSWarner Losh ZeroMem (&Str, sizeof (Str)); 24617270962aSWarner Losh 24627270962aSWarner Losh // 24637270962aSWarner Losh // Process the device path node 24647270962aSWarner Losh // If not found, use a generic function 24657270962aSWarner Losh // 24665320ef6aSWarner Losh Node = __DECONST(EFI_DEVICE_PATH_PROTOCOL *, DeviceNode); 24677270962aSWarner Losh ToText = DevPathToTextNodeGeneric; 24687270962aSWarner Losh for (Index = 0; mUefiDevicePathLibToTextTable[Index].Function != NULL; Index++) { 24695754f582SJose Luis Duran if ((DevicePathType (DeviceNode) == mUefiDevicePathLibToTextTable[Index].Type) && 24705754f582SJose Luis Duran (DevicePathSubType (DeviceNode) == mUefiDevicePathLibToTextTable[Index].SubType) 24715754f582SJose Luis Duran ) 24725754f582SJose Luis Duran { 24737270962aSWarner Losh ToText = mUefiDevicePathLibToTextTable[Index].Function; 24747270962aSWarner Losh break; 24757270962aSWarner Losh } 24767270962aSWarner Losh } 24777270962aSWarner Losh 24787270962aSWarner Losh // 24797270962aSWarner Losh // Print this node 24807270962aSWarner Losh // 24815320ef6aSWarner Losh ToText (&Str, (VOID *)Node, DisplayOnly, AllowShortcuts); 24827270962aSWarner Losh 24837270962aSWarner Losh ASSERT (Str.Str != NULL); 24847270962aSWarner Losh return Str.Str; 24857270962aSWarner Losh } 24867270962aSWarner Losh 24877270962aSWarner Losh /** 24887270962aSWarner Losh Converts a device path to its text representation. 24897270962aSWarner Losh 24907270962aSWarner Losh @param DevicePath A Pointer to the device to be converted. 24917270962aSWarner Losh @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation 24927270962aSWarner Losh of the display node is used, where applicable. If DisplayOnly 24937270962aSWarner Losh is FALSE, then the longer text representation of the display node 24947270962aSWarner Losh is used. 24957270962aSWarner Losh @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text 24967270962aSWarner Losh representation for a device node can be used, where applicable. 24977270962aSWarner Losh 24987270962aSWarner Losh @return A pointer to the allocated text representation of the device path or 24997270962aSWarner Losh NULL if DeviceNode is NULL or there was insufficient memory. 25007270962aSWarner Losh 25017270962aSWarner Losh **/ 25027270962aSWarner Losh static char * 25037270962aSWarner Losh EFIAPI 25047270962aSWarner Losh UefiDevicePathLibConvertDevicePathToText ( 25057270962aSWarner Losh IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, 25067270962aSWarner Losh IN BOOLEAN DisplayOnly, 25077270962aSWarner Losh IN BOOLEAN AllowShortcuts 25087270962aSWarner Losh ) 25097270962aSWarner Losh { 25107270962aSWarner Losh POOL_PRINT Str; 25117270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *Node; 25127270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *AlignedNode; 25137270962aSWarner Losh UINTN Index; 25147270962aSWarner Losh DEVICE_PATH_TO_TEXT ToText; 25157270962aSWarner Losh 25167270962aSWarner Losh if (DevicePath == NULL) { 25177270962aSWarner Losh return NULL; 25187270962aSWarner Losh } 25197270962aSWarner Losh 25207270962aSWarner Losh ZeroMem (&Str, sizeof (Str)); 25217270962aSWarner Losh 25227270962aSWarner Losh // 25237270962aSWarner Losh // Process each device path node 25247270962aSWarner Losh // 25257270962aSWarner Losh Node = __DECONST(EFI_DEVICE_PATH_PROTOCOL *, DevicePath); 25267270962aSWarner Losh while (!IsDevicePathEnd (Node)) { 25277270962aSWarner Losh // 25287270962aSWarner Losh // Find the handler to dump this device path node 25297270962aSWarner Losh // If not found, use a generic function 25307270962aSWarner Losh // 25317270962aSWarner Losh ToText = DevPathToTextNodeGeneric; 25327270962aSWarner Losh for (Index = 0; mUefiDevicePathLibToTextTable[Index].Function != NULL; Index += 1) { 25335754f582SJose Luis Duran if ((DevicePathType (Node) == mUefiDevicePathLibToTextTable[Index].Type) && 25345754f582SJose Luis Duran (DevicePathSubType (Node) == mUefiDevicePathLibToTextTable[Index].SubType) 25355754f582SJose Luis Duran ) 25365754f582SJose Luis Duran { 25377270962aSWarner Losh ToText = mUefiDevicePathLibToTextTable[Index].Function; 25387270962aSWarner Losh break; 25397270962aSWarner Losh } 25407270962aSWarner Losh } 25415754f582SJose Luis Duran 25427270962aSWarner Losh // 25437270962aSWarner Losh // Put a path separator in if needed 25447270962aSWarner Losh // 25457270962aSWarner Losh if ((Str.Count != 0) && (ToText != DevPathToTextEndInstance)) { 25467270962aSWarner Losh if (Str.Str[Str.Count] != ',') { 25477270962aSWarner Losh UefiDevicePathLibCatPrint (&Str, "/"); 25487270962aSWarner Losh } 25497270962aSWarner Losh } 25507270962aSWarner Losh 25517270962aSWarner Losh AlignedNode = AllocateCopyPool (DevicePathNodeLength (Node), Node); 25527270962aSWarner Losh // 25537270962aSWarner Losh // Print this node of the device path 25547270962aSWarner Losh // 25557270962aSWarner Losh ToText (&Str, AlignedNode, DisplayOnly, AllowShortcuts); 25567270962aSWarner Losh FreePool (AlignedNode); 25577270962aSWarner Losh 25587270962aSWarner Losh // 25597270962aSWarner Losh // Next device path node 25607270962aSWarner Losh // 25617270962aSWarner Losh Node = NextDevicePathNode (Node); 25627270962aSWarner Losh } 25637270962aSWarner Losh 25647270962aSWarner Losh if (Str.Str == NULL) { 25657270962aSWarner Losh return AllocateZeroPool (sizeof (CHAR16)); 25667270962aSWarner Losh } else { 25677270962aSWarner Losh return Str.Str; 25687270962aSWarner Losh } 25697270962aSWarner Losh } 25707270962aSWarner Losh 25717270962aSWarner Losh ssize_t 25727270962aSWarner Losh efidp_format_device_path(char *buf, size_t len, const_efidp dp, ssize_t max) 25737270962aSWarner Losh { 25747270962aSWarner Losh char *str; 25757270962aSWarner Losh ssize_t retval; 25767270962aSWarner Losh 2577366a7b3dSWarner Losh /* 2578366a7b3dSWarner Losh * Basic sanity check on the device path. 2579366a7b3dSWarner Losh */ 2580366a7b3dSWarner Losh if (!IsDevicePathValid((CONST EFI_DEVICE_PATH_PROTOCOL *) dp, max)) { 2581366a7b3dSWarner Losh *buf = '\0'; 2582366a7b3dSWarner Losh return 0; 2583366a7b3dSWarner Losh } 2584366a7b3dSWarner Losh 25857270962aSWarner Losh str = UefiDevicePathLibConvertDevicePathToText ( 25867270962aSWarner Losh __DECONST(EFI_DEVICE_PATH_PROTOCOL *, dp), FALSE, TRUE); 25877270962aSWarner Losh if (str == NULL) 25887270962aSWarner Losh return -1; 25897270962aSWarner Losh strlcpy(buf, str, len); 25907270962aSWarner Losh retval = strlen(str); 25917270962aSWarner Losh free(str); 25927270962aSWarner Losh 25937270962aSWarner Losh return retval; 25947270962aSWarner Losh } 25951028a2d4SWarner Losh 25965320ef6aSWarner Losh ssize_t 259709ee5d8aSWarner Losh efidp_format_device_path_node(char *buf, size_t len, const_efidp dp) 25985320ef6aSWarner Losh { 25995320ef6aSWarner Losh char *str; 26005320ef6aSWarner Losh ssize_t retval; 26015320ef6aSWarner Losh 26025320ef6aSWarner Losh str = UefiDevicePathLibConvertDeviceNodeToText ( 26035320ef6aSWarner Losh __DECONST(EFI_DEVICE_PATH_PROTOCOL *, dp), FALSE, TRUE); 26045320ef6aSWarner Losh if (str == NULL) 26055320ef6aSWarner Losh return -1; 26065320ef6aSWarner Losh strlcpy(buf, str, len); 26075320ef6aSWarner Losh retval = strlen(str); 26085320ef6aSWarner Losh free(str); 26095320ef6aSWarner Losh 26105320ef6aSWarner Losh return retval; 26115320ef6aSWarner Losh } 26125320ef6aSWarner Losh 26131028a2d4SWarner Losh size_t 26141028a2d4SWarner Losh efidp_size(const_efidp dp) 26151028a2d4SWarner Losh { 26165320ef6aSWarner Losh 26171028a2d4SWarner Losh return GetDevicePathSize(__DECONST(EFI_DEVICE_PATH_PROTOCOL *, dp)); 26181028a2d4SWarner Losh } 261909ee5d8aSWarner Losh 262009ee5d8aSWarner Losh char * 262109ee5d8aSWarner Losh efidp_extract_file_path(const_efidp dp) 262209ee5d8aSWarner Losh { 262309ee5d8aSWarner Losh const FILEPATH_DEVICE_PATH *fp; 262409ee5d8aSWarner Losh char *name = NULL; 262509ee5d8aSWarner Losh 262609ee5d8aSWarner Losh fp = (const void *)dp; 262709ee5d8aSWarner Losh ucs2_to_utf8(fp->PathName, &name); 262809ee5d8aSWarner Losh return name; 262909ee5d8aSWarner Losh } 2630