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 <ctype.h>
337270962aSWarner Losh #include <efivar.h>
347270962aSWarner Losh #include <stdio.h>
357270962aSWarner Losh #include <string.h>
367270962aSWarner Losh #include <wchar.h>
377270962aSWarner Losh
38ae3adc06SWarner Losh #include "efichar.h"
39ae3adc06SWarner Losh
407270962aSWarner Losh #include "efi-osdep.h"
417270962aSWarner Losh #include "efivar-dp.h"
427270962aSWarner Losh
437270962aSWarner Losh #include "uefi-dplib.h"
447270962aSWarner Losh
457270962aSWarner Losh /* XXX STUBS -- this stuff doesn't work yet */
46*ccfd87feSJohn Baldwin #define StrToIpv4Address(str, unk, ipv4ptr, unk2) (void)(str)
47*ccfd87feSJohn Baldwin #define StrToIpv6Address(str, unk, ipv6ptr, unk2) (void)(str)
487270962aSWarner Losh
497270962aSWarner Losh /*
507270962aSWarner Losh * OK. Now this is evil. Can't typedef it again. Sure beats changing them all.
517270962aSWarner Losh * Since we're doing it all as narrow characters since wchar_t can't be used on
527270962aSWarner Losh * FreeBSD and CHAR16 strings generally aren't a good fit. Since this parsing
537270962aSWarner Losh * doesn't need Unicode for anything, this works out well.
547270962aSWarner Losh */
557270962aSWarner Losh #define CHAR16 char
567270962aSWarner Losh
577270962aSWarner Losh /*
587270962aSWarner Losh * Taken from MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
597270962aSWarner Losh */
607270962aSWarner Losh
617270962aSWarner Losh /** @file
627270962aSWarner Losh DevicePathFromText protocol as defined in the UEFI 2.0 specification.
637270962aSWarner Losh
6476ed5f1bSJose Luis Duran Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
6511a9ff5bSJose Luis Duran SPDX-License-Identifier: BSD-2-Clause-Patent
667270962aSWarner Losh
677270962aSWarner Losh **/
687270962aSWarner Losh
697270962aSWarner Losh // #include "UefiDevicePathLib.h"
707270962aSWarner Losh
717270962aSWarner Losh /**
727270962aSWarner Losh
737270962aSWarner Losh Duplicates a string.
747270962aSWarner Losh
757270962aSWarner Losh @param Src Source string.
767270962aSWarner Losh
777270962aSWarner Losh @return The duplicated string.
787270962aSWarner Losh
797270962aSWarner Losh **/
807270962aSWarner Losh static
817270962aSWarner Losh CHAR16 *
UefiDevicePathLibStrDuplicate(IN CONST CHAR16 * Src)827270962aSWarner Losh UefiDevicePathLibStrDuplicate (
837270962aSWarner Losh IN CONST CHAR16 *Src
847270962aSWarner Losh )
857270962aSWarner Losh {
867270962aSWarner Losh return AllocateCopyPool (StrSize (Src), Src);
877270962aSWarner Losh }
887270962aSWarner Losh
897270962aSWarner Losh /**
907270962aSWarner Losh
917270962aSWarner Losh Get parameter in a pair of parentheses follow the given node name.
927270962aSWarner Losh For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
937270962aSWarner Losh
947270962aSWarner Losh @param Str Device Path Text.
957270962aSWarner Losh @param NodeName Name of the node.
967270962aSWarner Losh
977270962aSWarner Losh @return Parameter text for the node.
987270962aSWarner Losh
997270962aSWarner Losh **/
1007270962aSWarner Losh static
1017270962aSWarner Losh CHAR16 *
GetParamByNodeName(IN CHAR16 * Str,IN const CHAR16 * NodeName)1027270962aSWarner Losh GetParamByNodeName (
1037270962aSWarner Losh IN CHAR16 *Str,
1047270962aSWarner Losh IN const CHAR16 *NodeName
1057270962aSWarner Losh )
1067270962aSWarner Losh {
1077270962aSWarner Losh CHAR16 *ParamStr;
1087270962aSWarner Losh CHAR16 *StrPointer;
1097270962aSWarner Losh UINTN NodeNameLength;
1107270962aSWarner Losh UINTN ParameterLength;
1117270962aSWarner Losh
1127270962aSWarner Losh //
1137270962aSWarner Losh // Check whether the node name matchs
1147270962aSWarner Losh //
1157270962aSWarner Losh NodeNameLength = StrLen (NodeName);
1167270962aSWarner Losh if (StrnCmp (Str, NodeName, NodeNameLength) != 0) {
1177270962aSWarner Losh return NULL;
1187270962aSWarner Losh }
1197270962aSWarner Losh
1207270962aSWarner Losh ParamStr = Str + NodeNameLength;
1217270962aSWarner Losh if (!IS_LEFT_PARENTH (*ParamStr)) {
1227270962aSWarner Losh return NULL;
1237270962aSWarner Losh }
1247270962aSWarner Losh
1257270962aSWarner Losh //
1267270962aSWarner Losh // Skip the found '(' and find first occurrence of ')'
1277270962aSWarner Losh //
1287270962aSWarner Losh ParamStr++;
1297270962aSWarner Losh ParameterLength = 0;
1307270962aSWarner Losh StrPointer = ParamStr;
1317270962aSWarner Losh while (!IS_NULL (*StrPointer)) {
1327270962aSWarner Losh if (IS_RIGHT_PARENTH (*StrPointer)) {
1337270962aSWarner Losh break;
1347270962aSWarner Losh }
1355754f582SJose Luis Duran
1367270962aSWarner Losh StrPointer++;
1377270962aSWarner Losh ParameterLength++;
1387270962aSWarner Losh }
1395754f582SJose Luis Duran
1407270962aSWarner Losh if (IS_NULL (*StrPointer)) {
1417270962aSWarner Losh //
1427270962aSWarner Losh // ')' not found
1437270962aSWarner Losh //
1447270962aSWarner Losh return NULL;
1457270962aSWarner Losh }
1467270962aSWarner Losh
1477270962aSWarner Losh ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
1487270962aSWarner Losh if (ParamStr == NULL) {
1497270962aSWarner Losh return NULL;
1507270962aSWarner Losh }
1515754f582SJose Luis Duran
1527270962aSWarner Losh //
1537270962aSWarner Losh // Terminate the parameter string
1547270962aSWarner Losh //
1557270962aSWarner Losh ParamStr[ParameterLength] = '\0';
1567270962aSWarner Losh
1577270962aSWarner Losh return ParamStr;
1587270962aSWarner Losh }
1597270962aSWarner Losh
1607270962aSWarner Losh /**
1617270962aSWarner Losh Gets current sub-string from a string list, before return
1627270962aSWarner Losh the list header is moved to next sub-string. The sub-string is separated
1637270962aSWarner Losh by the specified character. For example, the separator is ',', the string
1647270962aSWarner Losh list is "2,0,3", it returns "2", the remain list move to "0,3"
1657270962aSWarner Losh
1667270962aSWarner Losh @param List A string list separated by the specified separator
1677270962aSWarner Losh @param Separator The separator character
1687270962aSWarner Losh
1697270962aSWarner Losh @return A pointer to the current sub-string
1707270962aSWarner Losh
1717270962aSWarner Losh **/
1727270962aSWarner Losh static
1737270962aSWarner Losh CHAR16 *
SplitStr(IN OUT CHAR16 ** List,IN CHAR16 Separator)1747270962aSWarner Losh SplitStr (
1757270962aSWarner Losh IN OUT CHAR16 **List,
1767270962aSWarner Losh IN CHAR16 Separator
1777270962aSWarner Losh )
1787270962aSWarner Losh {
1797270962aSWarner Losh CHAR16 *Str;
1807270962aSWarner Losh CHAR16 *ReturnStr;
1817270962aSWarner Losh
1827270962aSWarner Losh Str = *List;
1837270962aSWarner Losh ReturnStr = Str;
1847270962aSWarner Losh
1857270962aSWarner Losh if (IS_NULL (*Str)) {
1867270962aSWarner Losh return ReturnStr;
1877270962aSWarner Losh }
1887270962aSWarner Losh
1897270962aSWarner Losh //
1907270962aSWarner Losh // Find first occurrence of the separator
1917270962aSWarner Losh //
1927270962aSWarner Losh while (!IS_NULL (*Str)) {
1937270962aSWarner Losh if (*Str == Separator) {
1947270962aSWarner Losh break;
1957270962aSWarner Losh }
1965754f582SJose Luis Duran
1977270962aSWarner Losh Str++;
1987270962aSWarner Losh }
1997270962aSWarner Losh
2007270962aSWarner Losh if (*Str == Separator) {
2017270962aSWarner Losh //
2027270962aSWarner Losh // Find a sub-string, terminate it
2037270962aSWarner Losh //
2047270962aSWarner Losh *Str = '\0';
2057270962aSWarner Losh Str++;
2067270962aSWarner Losh }
2077270962aSWarner Losh
2087270962aSWarner Losh //
2097270962aSWarner Losh // Move to next sub-string
2107270962aSWarner Losh //
2117270962aSWarner Losh *List = Str;
2127270962aSWarner Losh
2137270962aSWarner Losh return ReturnStr;
2147270962aSWarner Losh }
2157270962aSWarner Losh
2167270962aSWarner Losh /**
2177270962aSWarner Losh Gets the next parameter string from the list.
2187270962aSWarner Losh
2197270962aSWarner Losh @param List A string list separated by the specified separator
2207270962aSWarner Losh
2217270962aSWarner Losh @return A pointer to the current sub-string
2227270962aSWarner Losh
2237270962aSWarner Losh **/
2247270962aSWarner Losh static
2257270962aSWarner Losh CHAR16 *
GetNextParamStr(IN OUT CHAR16 ** List)2267270962aSWarner Losh GetNextParamStr (
2277270962aSWarner Losh IN OUT CHAR16 **List
2287270962aSWarner Losh )
2297270962aSWarner Losh {
2307270962aSWarner Losh //
2317270962aSWarner Losh // The separator is comma
2327270962aSWarner Losh //
2337270962aSWarner Losh return SplitStr (List, ',');
2347270962aSWarner Losh }
2357270962aSWarner Losh
2367270962aSWarner Losh /**
2377270962aSWarner Losh Get one device node from entire device path text.
2387270962aSWarner Losh
2397270962aSWarner Losh @param DevicePath On input, the current Device Path node; on output, the next device path node
2407270962aSWarner Losh @param IsInstanceEnd This node is the end of a device path instance
2417270962aSWarner Losh
2427270962aSWarner Losh @return A device node text or NULL if no more device node available
2437270962aSWarner Losh
2447270962aSWarner Losh **/
2457270962aSWarner Losh static
2467270962aSWarner Losh CHAR16 *
GetNextDeviceNodeStr(IN OUT CHAR16 ** DevicePath,OUT BOOLEAN * IsInstanceEnd)2477270962aSWarner Losh GetNextDeviceNodeStr (
2487270962aSWarner Losh IN OUT CHAR16 **DevicePath,
2497270962aSWarner Losh OUT BOOLEAN *IsInstanceEnd
2507270962aSWarner Losh )
2517270962aSWarner Losh {
2527270962aSWarner Losh CHAR16 *Str;
2537270962aSWarner Losh CHAR16 *ReturnStr;
2547270962aSWarner Losh UINTN ParenthesesStack;
2557270962aSWarner Losh
2567270962aSWarner Losh Str = *DevicePath;
2577270962aSWarner Losh if (IS_NULL (*Str)) {
2587270962aSWarner Losh return NULL;
2597270962aSWarner Losh }
2607270962aSWarner Losh
2617270962aSWarner Losh //
2627270962aSWarner Losh // Skip the leading '/', '(', ')' and ','
2637270962aSWarner Losh //
2647270962aSWarner Losh while (!IS_NULL (*Str)) {
2657270962aSWarner Losh if (!IS_SLASH (*Str) &&
2667270962aSWarner Losh !IS_COMMA (*Str) &&
2677270962aSWarner Losh !IS_LEFT_PARENTH (*Str) &&
2685754f582SJose Luis Duran !IS_RIGHT_PARENTH (*Str))
2695754f582SJose Luis Duran {
2707270962aSWarner Losh break;
2717270962aSWarner Losh }
2725754f582SJose Luis Duran
2737270962aSWarner Losh Str++;
2747270962aSWarner Losh }
2757270962aSWarner Losh
2767270962aSWarner Losh ReturnStr = Str;
2777270962aSWarner Losh
2787270962aSWarner Losh //
2797270962aSWarner Losh // Scan for the separator of this device node, '/' or ','
2807270962aSWarner Losh //
2817270962aSWarner Losh ParenthesesStack = 0;
2827270962aSWarner Losh while (!IS_NULL (*Str)) {
2837270962aSWarner Losh if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
2847270962aSWarner Losh break;
2857270962aSWarner Losh }
2867270962aSWarner Losh
2877270962aSWarner Losh if (IS_LEFT_PARENTH (*Str)) {
2887270962aSWarner Losh ParenthesesStack++;
2897270962aSWarner Losh } else if (IS_RIGHT_PARENTH (*Str)) {
2907270962aSWarner Losh ParenthesesStack--;
2917270962aSWarner Losh }
2927270962aSWarner Losh
2937270962aSWarner Losh Str++;
2947270962aSWarner Losh }
2957270962aSWarner Losh
2967270962aSWarner Losh if (ParenthesesStack != 0) {
2977270962aSWarner Losh //
2987270962aSWarner Losh // The '(' doesn't pair with ')', invalid device path text
2997270962aSWarner Losh //
3007270962aSWarner Losh return NULL;
3017270962aSWarner Losh }
3027270962aSWarner Losh
3037270962aSWarner Losh if (IS_COMMA (*Str)) {
3047270962aSWarner Losh *IsInstanceEnd = TRUE;
3057270962aSWarner Losh *Str = '\0';
3067270962aSWarner Losh Str++;
3077270962aSWarner Losh } else {
3087270962aSWarner Losh *IsInstanceEnd = FALSE;
3097270962aSWarner Losh if (!IS_NULL (*Str)) {
3107270962aSWarner Losh *Str = '\0';
3117270962aSWarner Losh Str++;
3127270962aSWarner Losh }
3137270962aSWarner Losh }
3147270962aSWarner Losh
3157270962aSWarner Losh *DevicePath = Str;
3167270962aSWarner Losh
3177270962aSWarner Losh return ReturnStr;
3187270962aSWarner Losh }
3197270962aSWarner Losh
3207270962aSWarner Losh
3217270962aSWarner Losh #ifndef __FreeBSD__
3227270962aSWarner Losh /**
3237270962aSWarner Losh Return whether the integer string is a hex string.
3247270962aSWarner Losh
3257270962aSWarner Losh @param Str The integer string
3267270962aSWarner Losh
3277270962aSWarner Losh @retval TRUE Hex string
3287270962aSWarner Losh @retval FALSE Decimal string
3297270962aSWarner Losh
3307270962aSWarner Losh **/
3317270962aSWarner Losh static
3327270962aSWarner Losh BOOLEAN
IsHexStr(IN CHAR16 * Str)3337270962aSWarner Losh IsHexStr (
3347270962aSWarner Losh IN CHAR16 *Str
3357270962aSWarner Losh )
3367270962aSWarner Losh {
3377270962aSWarner Losh //
3387270962aSWarner Losh // skip preceeding white space
3397270962aSWarner Losh //
3407270962aSWarner Losh while ((*Str != 0) && *Str == ' ') {
3417270962aSWarner Losh Str++;
3427270962aSWarner Losh }
3435754f582SJose Luis Duran
3447270962aSWarner Losh //
3457270962aSWarner Losh // skip preceeding zeros
3467270962aSWarner Losh //
3477270962aSWarner Losh while ((*Str != 0) && *Str == '0') {
3487270962aSWarner Losh Str++;
3497270962aSWarner Losh }
3507270962aSWarner Losh
3517270962aSWarner Losh return (BOOLEAN)(*Str == 'x' || *Str == 'X');
3527270962aSWarner Losh }
3537270962aSWarner Losh
3547270962aSWarner Losh /**
3557270962aSWarner Losh
3567270962aSWarner Losh Convert integer string to uint.
3577270962aSWarner Losh
3587270962aSWarner Losh @param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.
3597270962aSWarner Losh
3607270962aSWarner Losh @return A UINTN value represented by Str
3617270962aSWarner Losh
3627270962aSWarner Losh **/
3637270962aSWarner Losh static
3647270962aSWarner Losh UINTN
Strtoi(IN CHAR16 * Str)3657270962aSWarner Losh Strtoi (
3667270962aSWarner Losh IN CHAR16 *Str
3677270962aSWarner Losh )
3687270962aSWarner Losh {
3697270962aSWarner Losh if (IsHexStr (Str)) {
3707270962aSWarner Losh return StrHexToUintn (Str);
3717270962aSWarner Losh } else {
3727270962aSWarner Losh return StrDecimalToUintn (Str);
3737270962aSWarner Losh }
3747270962aSWarner Losh }
3757270962aSWarner Losh
3767270962aSWarner Losh /**
3777270962aSWarner Losh
3787270962aSWarner Losh Convert integer string to 64 bit data.
3797270962aSWarner Losh
3807270962aSWarner Losh @param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.
3817270962aSWarner Losh @param Data A pointer to the UINT64 value represented by Str
3827270962aSWarner Losh
3837270962aSWarner Losh **/
3847270962aSWarner Losh static
3857270962aSWarner Losh VOID
Strtoi64(IN CHAR16 * Str,OUT UINT64 * Data)3867270962aSWarner Losh Strtoi64 (
3877270962aSWarner Losh IN CHAR16 *Str,
3887270962aSWarner Losh OUT UINT64 *Data
3897270962aSWarner Losh )
3907270962aSWarner Losh {
3917270962aSWarner Losh if (IsHexStr (Str)) {
3927270962aSWarner Losh *Data = StrHexToUint64 (Str);
3937270962aSWarner Losh } else {
3947270962aSWarner Losh *Data = StrDecimalToUint64 (Str);
3957270962aSWarner Losh }
3967270962aSWarner Losh }
3977270962aSWarner Losh #endif
3987270962aSWarner Losh
3997270962aSWarner Losh /**
4007270962aSWarner Losh Converts a Unicode string to ASCII string.
4017270962aSWarner Losh
4027270962aSWarner Losh @param Str The equivalent Unicode string
4037270962aSWarner Losh @param AsciiStr On input, it points to destination ASCII string buffer; on output, it points
4047270962aSWarner Losh to the next ASCII string next to it
4057270962aSWarner Losh
4067270962aSWarner Losh **/
4077270962aSWarner Losh static
4087270962aSWarner Losh VOID
StrToAscii(IN CHAR16 * Str,IN OUT CHAR8 ** AsciiStr)4097270962aSWarner Losh StrToAscii (
4107270962aSWarner Losh IN CHAR16 *Str,
4117270962aSWarner Losh IN OUT CHAR8 **AsciiStr
4127270962aSWarner Losh )
4137270962aSWarner Losh {
4147270962aSWarner Losh CHAR8 *Dest;
4157270962aSWarner Losh
4167270962aSWarner Losh Dest = *AsciiStr;
4177270962aSWarner Losh while (!IS_NULL (*Str)) {
4187270962aSWarner Losh *(Dest++) = (CHAR8)*(Str++);
4197270962aSWarner Losh }
4205754f582SJose Luis Duran
4217270962aSWarner Losh *Dest = 0;
4227270962aSWarner Losh
4237270962aSWarner Losh //
4247270962aSWarner Losh // Return the string next to it
4257270962aSWarner Losh //
4267270962aSWarner Losh *AsciiStr = Dest + 1;
4277270962aSWarner Losh }
4287270962aSWarner Losh
4297270962aSWarner Losh /**
4307270962aSWarner Losh Converts a generic text device path node to device path structure.
4317270962aSWarner Losh
4327270962aSWarner Losh @param Type The type of the device path node.
4337270962aSWarner Losh @param TextDeviceNode The input text device path node.
4347270962aSWarner Losh
4357270962aSWarner Losh @return A pointer to device path structure.
4367270962aSWarner Losh **/
4377270962aSWarner Losh static
4387270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextGenericPath(IN UINT8 Type,IN CHAR16 * TextDeviceNode)4397270962aSWarner Losh DevPathFromTextGenericPath (
4407270962aSWarner Losh IN UINT8 Type,
4417270962aSWarner Losh IN CHAR16 *TextDeviceNode
4427270962aSWarner Losh )
4437270962aSWarner Losh {
4447270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *Node;
4457270962aSWarner Losh CHAR16 *SubtypeStr;
4467270962aSWarner Losh CHAR16 *DataStr;
4477270962aSWarner Losh UINTN DataLength;
4487270962aSWarner Losh
4497270962aSWarner Losh SubtypeStr = GetNextParamStr (&TextDeviceNode);
4507270962aSWarner Losh DataStr = GetNextParamStr (&TextDeviceNode);
4517270962aSWarner Losh
4527270962aSWarner Losh if (DataStr == NULL) {
4537270962aSWarner Losh DataLength = 0;
4547270962aSWarner Losh } else {
4557270962aSWarner Losh DataLength = StrLen (DataStr) / 2;
4567270962aSWarner Losh }
4575754f582SJose Luis Duran
4587270962aSWarner Losh Node = CreateDeviceNode (
4597270962aSWarner Losh Type,
4607270962aSWarner Losh (UINT8)Strtoi (SubtypeStr),
4617270962aSWarner Losh (UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)
4627270962aSWarner Losh );
4637270962aSWarner Losh
4647270962aSWarner Losh StrHexToBytes (DataStr, DataLength * 2, (UINT8 *)(Node + 1), DataLength);
4657270962aSWarner Losh return Node;
4667270962aSWarner Losh }
4677270962aSWarner Losh
4687270962aSWarner Losh /**
4697270962aSWarner Losh Converts a generic text device path node to device path structure.
4707270962aSWarner Losh
4717270962aSWarner Losh @param TextDeviceNode The input Text device path node.
4727270962aSWarner Losh
4737270962aSWarner Losh @return A pointer to device path structure.
4747270962aSWarner Losh
4757270962aSWarner Losh **/
4767270962aSWarner Losh static
4777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPath(IN CHAR16 * TextDeviceNode)4787270962aSWarner Losh DevPathFromTextPath (
4797270962aSWarner Losh IN CHAR16 *TextDeviceNode
4807270962aSWarner Losh )
4817270962aSWarner Losh {
4827270962aSWarner Losh CHAR16 *TypeStr;
4837270962aSWarner Losh
4847270962aSWarner Losh TypeStr = GetNextParamStr (&TextDeviceNode);
4857270962aSWarner Losh
4867270962aSWarner Losh return DevPathFromTextGenericPath ((UINT8)Strtoi (TypeStr), TextDeviceNode);
4877270962aSWarner Losh }
4887270962aSWarner Losh
4897270962aSWarner Losh /**
4907270962aSWarner Losh Converts a generic hardware text device path node to Hardware device path structure.
4917270962aSWarner Losh
4927270962aSWarner Losh @param TextDeviceNode The input Text device path node.
4937270962aSWarner Losh
4947270962aSWarner Losh @return A pointer to Hardware device path structure.
4957270962aSWarner Losh
4967270962aSWarner Losh **/
4977270962aSWarner Losh static
4987270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHardwarePath(IN CHAR16 * TextDeviceNode)4997270962aSWarner Losh DevPathFromTextHardwarePath (
5007270962aSWarner Losh IN CHAR16 *TextDeviceNode
5017270962aSWarner Losh )
5027270962aSWarner Losh {
5037270962aSWarner Losh return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);
5047270962aSWarner Losh }
5057270962aSWarner Losh
5067270962aSWarner Losh /**
5077270962aSWarner Losh Converts a text device path node to Hardware PCI device path structure.
5087270962aSWarner Losh
5097270962aSWarner Losh @param TextDeviceNode The input Text device path node.
5107270962aSWarner Losh
5117270962aSWarner Losh @return A pointer to Hardware PCI device path structure.
5127270962aSWarner Losh
5137270962aSWarner Losh **/
5147270962aSWarner Losh static
5157270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPci(IN CHAR16 * TextDeviceNode)5167270962aSWarner Losh DevPathFromTextPci (
5177270962aSWarner Losh IN CHAR16 *TextDeviceNode
5187270962aSWarner Losh )
5197270962aSWarner Losh {
5207270962aSWarner Losh CHAR16 *FunctionStr;
5217270962aSWarner Losh CHAR16 *DeviceStr;
5227270962aSWarner Losh PCI_DEVICE_PATH *Pci;
5237270962aSWarner Losh
5247270962aSWarner Losh DeviceStr = GetNextParamStr (&TextDeviceNode);
5257270962aSWarner Losh FunctionStr = GetNextParamStr (&TextDeviceNode);
5267270962aSWarner Losh Pci = (PCI_DEVICE_PATH *)CreateDeviceNode (
5277270962aSWarner Losh HARDWARE_DEVICE_PATH,
5287270962aSWarner Losh HW_PCI_DP,
5297270962aSWarner Losh (UINT16)sizeof (PCI_DEVICE_PATH)
5307270962aSWarner Losh );
5317270962aSWarner Losh
5327270962aSWarner Losh Pci->Function = (UINT8)Strtoi (FunctionStr);
5337270962aSWarner Losh Pci->Device = (UINT8)Strtoi (DeviceStr);
5347270962aSWarner Losh
5357270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Pci;
5367270962aSWarner Losh }
5377270962aSWarner Losh
5387270962aSWarner Losh /**
5397270962aSWarner Losh Converts a text device path node to Hardware PC card device path structure.
5407270962aSWarner Losh
5417270962aSWarner Losh @param TextDeviceNode The input Text device path node.
5427270962aSWarner Losh
5437270962aSWarner Losh @return A pointer to Hardware PC card device path structure.
5447270962aSWarner Losh
5457270962aSWarner Losh **/
5467270962aSWarner Losh static
5477270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcCard(IN CHAR16 * TextDeviceNode)5487270962aSWarner Losh DevPathFromTextPcCard (
5497270962aSWarner Losh IN CHAR16 *TextDeviceNode
5507270962aSWarner Losh )
5517270962aSWarner Losh {
5527270962aSWarner Losh CHAR16 *FunctionNumberStr;
5537270962aSWarner Losh PCCARD_DEVICE_PATH *Pccard;
5547270962aSWarner Losh
5557270962aSWarner Losh FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
5567270962aSWarner Losh Pccard = (PCCARD_DEVICE_PATH *)CreateDeviceNode (
5577270962aSWarner Losh HARDWARE_DEVICE_PATH,
5587270962aSWarner Losh HW_PCCARD_DP,
5597270962aSWarner Losh (UINT16)sizeof (PCCARD_DEVICE_PATH)
5607270962aSWarner Losh );
5617270962aSWarner Losh
5627270962aSWarner Losh Pccard->FunctionNumber = (UINT8)Strtoi (FunctionNumberStr);
5637270962aSWarner Losh
5647270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Pccard;
5657270962aSWarner Losh }
5667270962aSWarner Losh
5677270962aSWarner Losh /**
5687270962aSWarner Losh Converts a text device path node to Hardware memory map device path structure.
5697270962aSWarner Losh
5707270962aSWarner Losh @param TextDeviceNode The input Text device path node.
5717270962aSWarner Losh
5727270962aSWarner Losh @return A pointer to Hardware memory map device path structure.
5737270962aSWarner Losh
5747270962aSWarner Losh **/
5757270962aSWarner Losh static
5767270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMemoryMapped(IN CHAR16 * TextDeviceNode)5777270962aSWarner Losh DevPathFromTextMemoryMapped (
5787270962aSWarner Losh IN CHAR16 *TextDeviceNode
5797270962aSWarner Losh )
5807270962aSWarner Losh {
5817270962aSWarner Losh CHAR16 *MemoryTypeStr;
5827270962aSWarner Losh CHAR16 *StartingAddressStr;
5837270962aSWarner Losh CHAR16 *EndingAddressStr;
5847270962aSWarner Losh MEMMAP_DEVICE_PATH *MemMap;
5857270962aSWarner Losh
5867270962aSWarner Losh MemoryTypeStr = GetNextParamStr (&TextDeviceNode);
5877270962aSWarner Losh StartingAddressStr = GetNextParamStr (&TextDeviceNode);
5887270962aSWarner Losh EndingAddressStr = GetNextParamStr (&TextDeviceNode);
5897270962aSWarner Losh MemMap = (MEMMAP_DEVICE_PATH *)CreateDeviceNode (
5907270962aSWarner Losh HARDWARE_DEVICE_PATH,
5917270962aSWarner Losh HW_MEMMAP_DP,
5927270962aSWarner Losh (UINT16)sizeof (MEMMAP_DEVICE_PATH)
5937270962aSWarner Losh );
5947270962aSWarner Losh
5957270962aSWarner Losh MemMap->MemoryType = (UINT32)Strtoi (MemoryTypeStr);
5967270962aSWarner Losh Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);
5977270962aSWarner Losh Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);
5987270962aSWarner Losh
5997270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)MemMap;
6007270962aSWarner Losh }
6017270962aSWarner Losh
6027270962aSWarner Losh /**
6037270962aSWarner Losh Converts a text device path node to Vendor device path structure based on the input Type
6047270962aSWarner Losh and SubType.
6057270962aSWarner Losh
6067270962aSWarner Losh @param TextDeviceNode The input Text device path node.
6077270962aSWarner Losh @param Type The type of device path node.
6087270962aSWarner Losh @param SubType The subtype of device path node.
6097270962aSWarner Losh
6107270962aSWarner Losh @return A pointer to the newly-created Vendor device path structure.
6117270962aSWarner Losh
6127270962aSWarner Losh **/
6137270962aSWarner Losh static
6147270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextVendor(IN CHAR16 * TextDeviceNode,IN UINT8 Type,IN UINT8 SubType)6157270962aSWarner Losh ConvertFromTextVendor (
6167270962aSWarner Losh IN CHAR16 *TextDeviceNode,
6177270962aSWarner Losh IN UINT8 Type,
6187270962aSWarner Losh IN UINT8 SubType
6197270962aSWarner Losh )
6207270962aSWarner Losh {
6217270962aSWarner Losh CHAR16 *GuidStr;
6227270962aSWarner Losh CHAR16 *DataStr;
6237270962aSWarner Losh UINTN Length;
6247270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor;
6257270962aSWarner Losh
6267270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
6277270962aSWarner Losh
6287270962aSWarner Losh DataStr = GetNextParamStr (&TextDeviceNode);
6297270962aSWarner Losh Length = StrLen (DataStr);
6307270962aSWarner Losh //
6317270962aSWarner Losh // Two hex characters make up 1 buffer byte
6327270962aSWarner Losh //
6337270962aSWarner Losh Length = (Length + 1) / 2;
6347270962aSWarner Losh
6357270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
6367270962aSWarner Losh Type,
6377270962aSWarner Losh SubType,
6387270962aSWarner Losh (UINT16)(sizeof (VENDOR_DEVICE_PATH) + Length)
6397270962aSWarner Losh );
6407270962aSWarner Losh
6417270962aSWarner Losh StrToGuid (GuidStr, &Vendor->Guid);
6427270962aSWarner Losh StrHexToBytes (DataStr, Length * 2, (UINT8 *)(Vendor + 1), Length);
6437270962aSWarner Losh
6447270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
6457270962aSWarner Losh }
6467270962aSWarner Losh
6477270962aSWarner Losh /**
6487270962aSWarner Losh Converts a text device path node to Vendor Hardware device path structure.
6497270962aSWarner Losh
6507270962aSWarner Losh @param TextDeviceNode The input Text device path node.
6517270962aSWarner Losh
6527270962aSWarner Losh @return A pointer to the newly-created Vendor Hardware device path structure.
6537270962aSWarner Losh
6547270962aSWarner Losh **/
6557270962aSWarner Losh static
6567270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenHw(IN CHAR16 * TextDeviceNode)6577270962aSWarner Losh DevPathFromTextVenHw (
6587270962aSWarner Losh IN CHAR16 *TextDeviceNode
6597270962aSWarner Losh )
6607270962aSWarner Losh {
6617270962aSWarner Losh return ConvertFromTextVendor (
6627270962aSWarner Losh TextDeviceNode,
6637270962aSWarner Losh HARDWARE_DEVICE_PATH,
6647270962aSWarner Losh HW_VENDOR_DP
6657270962aSWarner Losh );
6667270962aSWarner Losh }
6677270962aSWarner Losh
6687270962aSWarner Losh /**
6697270962aSWarner Losh Converts a text device path node to Hardware Controller device path structure.
6707270962aSWarner Losh
6717270962aSWarner Losh @param TextDeviceNode The input Text device path node.
6727270962aSWarner Losh
6737270962aSWarner Losh @return A pointer to the newly-created Hardware Controller device path structure.
6747270962aSWarner Losh
6757270962aSWarner Losh **/
6767270962aSWarner Losh static
6777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCtrl(IN CHAR16 * TextDeviceNode)6787270962aSWarner Losh DevPathFromTextCtrl (
6797270962aSWarner Losh IN CHAR16 *TextDeviceNode
6807270962aSWarner Losh )
6817270962aSWarner Losh {
6827270962aSWarner Losh CHAR16 *ControllerStr;
6837270962aSWarner Losh CONTROLLER_DEVICE_PATH *Controller;
6847270962aSWarner Losh
6857270962aSWarner Losh ControllerStr = GetNextParamStr (&TextDeviceNode);
6867270962aSWarner Losh Controller = (CONTROLLER_DEVICE_PATH *)CreateDeviceNode (
6877270962aSWarner Losh HARDWARE_DEVICE_PATH,
6887270962aSWarner Losh HW_CONTROLLER_DP,
6897270962aSWarner Losh (UINT16)sizeof (CONTROLLER_DEVICE_PATH)
6907270962aSWarner Losh );
6917270962aSWarner Losh Controller->ControllerNumber = (UINT32)Strtoi (ControllerStr);
6927270962aSWarner Losh
6937270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Controller;
6947270962aSWarner Losh }
6957270962aSWarner Losh
6967270962aSWarner Losh /**
6977270962aSWarner Losh Converts a text device path node to BMC device path structure.
6987270962aSWarner Losh
6997270962aSWarner Losh @param TextDeviceNode The input Text device path node.
7007270962aSWarner Losh
7017270962aSWarner Losh @return A pointer to the newly-created BMC device path structure.
7027270962aSWarner Losh
7037270962aSWarner Losh **/
7047270962aSWarner Losh static
7057270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBmc(IN CHAR16 * TextDeviceNode)7067270962aSWarner Losh DevPathFromTextBmc (
7077270962aSWarner Losh IN CHAR16 *TextDeviceNode
7087270962aSWarner Losh )
7097270962aSWarner Losh {
7107270962aSWarner Losh CHAR16 *InterfaceTypeStr;
7117270962aSWarner Losh CHAR16 *BaseAddressStr;
7127270962aSWarner Losh BMC_DEVICE_PATH *BmcDp;
7137270962aSWarner Losh
7147270962aSWarner Losh InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);
7157270962aSWarner Losh BaseAddressStr = GetNextParamStr (&TextDeviceNode);
7167270962aSWarner Losh BmcDp = (BMC_DEVICE_PATH *)CreateDeviceNode (
7177270962aSWarner Losh HARDWARE_DEVICE_PATH,
7187270962aSWarner Losh HW_BMC_DP,
7197270962aSWarner Losh (UINT16)sizeof (BMC_DEVICE_PATH)
7207270962aSWarner Losh );
7217270962aSWarner Losh
7227270962aSWarner Losh BmcDp->InterfaceType = (UINT8)Strtoi (InterfaceTypeStr);
7237270962aSWarner Losh WriteUnaligned64 (
7247270962aSWarner Losh (UINT64 *)(&BmcDp->BaseAddress),
7257270962aSWarner Losh StrHexToUint64 (BaseAddressStr)
7267270962aSWarner Losh );
7277270962aSWarner Losh
7287270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)BmcDp;
7297270962aSWarner Losh }
7307270962aSWarner Losh
7317270962aSWarner Losh /**
7327270962aSWarner Losh Converts a generic ACPI text device path node to ACPI device path structure.
7337270962aSWarner Losh
7347270962aSWarner Losh @param TextDeviceNode The input Text device path node.
7357270962aSWarner Losh
7367270962aSWarner Losh @return A pointer to ACPI device path structure.
7377270962aSWarner Losh
7387270962aSWarner Losh **/
7397270962aSWarner Losh static
7407270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiPath(IN CHAR16 * TextDeviceNode)7417270962aSWarner Losh DevPathFromTextAcpiPath (
7427270962aSWarner Losh IN CHAR16 *TextDeviceNode
7437270962aSWarner Losh )
7447270962aSWarner Losh {
7457270962aSWarner Losh return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);
7467270962aSWarner Losh }
7477270962aSWarner Losh
7487270962aSWarner Losh /**
7497270962aSWarner Losh Converts a string to EisaId.
7507270962aSWarner Losh
7517270962aSWarner Losh @param Text The input string.
7527270962aSWarner Losh
7537270962aSWarner Losh @return UINT32 EISA ID.
7547270962aSWarner Losh **/
7557270962aSWarner Losh static
7567270962aSWarner Losh UINT32
EisaIdFromText(IN CHAR16 * Text)7577270962aSWarner Losh EisaIdFromText (
7587270962aSWarner Losh IN CHAR16 *Text
7597270962aSWarner Losh )
7607270962aSWarner Losh {
7617270962aSWarner Losh return (((Text[0] - 'A' + 1) & 0x1f) << 10)
7627270962aSWarner Losh + (((Text[1] - 'A' + 1) & 0x1f) << 5)
7637270962aSWarner Losh + (((Text[2] - 'A' + 1) & 0x1f) << 0)
7647270962aSWarner Losh + (UINT32)(StrHexToUintn (&Text[3]) << 16)
7657270962aSWarner Losh ;
7667270962aSWarner Losh }
7677270962aSWarner Losh
7687270962aSWarner Losh /**
7697270962aSWarner Losh Converts a text device path node to ACPI HID device path structure.
7707270962aSWarner Losh
7717270962aSWarner Losh @param TextDeviceNode The input Text device path node.
7727270962aSWarner Losh
7737270962aSWarner Losh @return A pointer to the newly-created ACPI HID device path structure.
7747270962aSWarner Losh
7757270962aSWarner Losh **/
7767270962aSWarner Losh static
7777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpi(IN CHAR16 * TextDeviceNode)7787270962aSWarner Losh DevPathFromTextAcpi (
7797270962aSWarner Losh IN CHAR16 *TextDeviceNode
7807270962aSWarner Losh )
7817270962aSWarner Losh {
7827270962aSWarner Losh CHAR16 *HIDStr;
7837270962aSWarner Losh CHAR16 *UIDStr;
7847270962aSWarner Losh ACPI_HID_DEVICE_PATH *Acpi;
7857270962aSWarner Losh
7867270962aSWarner Losh HIDStr = GetNextParamStr (&TextDeviceNode);
7877270962aSWarner Losh UIDStr = GetNextParamStr (&TextDeviceNode);
7887270962aSWarner Losh Acpi = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
7897270962aSWarner Losh ACPI_DEVICE_PATH,
7907270962aSWarner Losh ACPI_DP,
7917270962aSWarner Losh (UINT16)sizeof (ACPI_HID_DEVICE_PATH)
7927270962aSWarner Losh );
7937270962aSWarner Losh
7947270962aSWarner Losh Acpi->HID = EisaIdFromText (HIDStr);
7957270962aSWarner Losh Acpi->UID = (UINT32)Strtoi (UIDStr);
7967270962aSWarner Losh
7977270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
7987270962aSWarner Losh }
7997270962aSWarner Losh
8007270962aSWarner Losh /**
8017270962aSWarner Losh Converts a text device path node to ACPI HID device path structure.
8027270962aSWarner Losh
8037270962aSWarner Losh @param TextDeviceNode The input Text device path node.
8047270962aSWarner Losh @param PnPId The input plug and play identification.
8057270962aSWarner Losh
8067270962aSWarner Losh @return A pointer to the newly-created ACPI HID device path structure.
8077270962aSWarner Losh
8087270962aSWarner Losh **/
8097270962aSWarner Losh static
8107270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextAcpi(IN CHAR16 * TextDeviceNode,IN UINT32 PnPId)8117270962aSWarner Losh ConvertFromTextAcpi (
8127270962aSWarner Losh IN CHAR16 *TextDeviceNode,
8137270962aSWarner Losh IN UINT32 PnPId
8147270962aSWarner Losh )
8157270962aSWarner Losh {
8167270962aSWarner Losh CHAR16 *UIDStr;
8177270962aSWarner Losh ACPI_HID_DEVICE_PATH *Acpi;
8187270962aSWarner Losh
8197270962aSWarner Losh UIDStr = GetNextParamStr (&TextDeviceNode);
8207270962aSWarner Losh Acpi = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
8217270962aSWarner Losh ACPI_DEVICE_PATH,
8227270962aSWarner Losh ACPI_DP,
8237270962aSWarner Losh (UINT16)sizeof (ACPI_HID_DEVICE_PATH)
8247270962aSWarner Losh );
8257270962aSWarner Losh
8267270962aSWarner Losh Acpi->HID = EFI_PNP_ID (PnPId);
8277270962aSWarner Losh Acpi->UID = (UINT32)Strtoi (UIDStr);
8287270962aSWarner Losh
8297270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
8307270962aSWarner Losh }
8317270962aSWarner Losh
8327270962aSWarner Losh /**
8337270962aSWarner Losh Converts a text device path node to PCI root device path structure.
8347270962aSWarner Losh
8357270962aSWarner Losh @param TextDeviceNode The input Text device path node.
8367270962aSWarner Losh
8377270962aSWarner Losh @return A pointer to the newly-created PCI root device path structure.
8387270962aSWarner Losh
8397270962aSWarner Losh **/
8407270962aSWarner Losh static
8417270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPciRoot(IN CHAR16 * TextDeviceNode)8427270962aSWarner Losh DevPathFromTextPciRoot (
8437270962aSWarner Losh IN CHAR16 *TextDeviceNode
8447270962aSWarner Losh )
8457270962aSWarner Losh {
8467270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);
8477270962aSWarner Losh }
8487270962aSWarner Losh
8497270962aSWarner Losh /**
8507270962aSWarner Losh Converts a text device path node to PCIE root device path structure.
8517270962aSWarner Losh
8527270962aSWarner Losh @param TextDeviceNode The input Text device path node.
8537270962aSWarner Losh
8547270962aSWarner Losh @return A pointer to the newly-created PCIE root device path structure.
8557270962aSWarner Losh
8567270962aSWarner Losh **/
8577270962aSWarner Losh static
8587270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcieRoot(IN CHAR16 * TextDeviceNode)8597270962aSWarner Losh DevPathFromTextPcieRoot (
8607270962aSWarner Losh IN CHAR16 *TextDeviceNode
8617270962aSWarner Losh )
8627270962aSWarner Losh {
8637270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);
8647270962aSWarner Losh }
8657270962aSWarner Losh
8667270962aSWarner Losh /**
8677270962aSWarner Losh Converts a text device path node to Floppy device path structure.
8687270962aSWarner Losh
8697270962aSWarner Losh @param TextDeviceNode The input Text device path node.
8707270962aSWarner Losh
8717270962aSWarner Losh @return A pointer to the newly-created Floppy device path structure.
8727270962aSWarner Losh
8737270962aSWarner Losh **/
8747270962aSWarner Losh static
8757270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFloppy(IN CHAR16 * TextDeviceNode)8767270962aSWarner Losh DevPathFromTextFloppy (
8777270962aSWarner Losh IN CHAR16 *TextDeviceNode
8787270962aSWarner Losh )
8797270962aSWarner Losh {
8807270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0604);
8817270962aSWarner Losh }
8827270962aSWarner Losh
8837270962aSWarner Losh /**
8847270962aSWarner Losh Converts a text device path node to Keyboard device path structure.
8857270962aSWarner Losh
8867270962aSWarner Losh @param TextDeviceNode The input Text device path node.
8877270962aSWarner Losh
8887270962aSWarner Losh @return A pointer to the newly-created Keyboard device path structure.
8897270962aSWarner Losh
8907270962aSWarner Losh **/
8917270962aSWarner Losh static
8927270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextKeyboard(IN CHAR16 * TextDeviceNode)8937270962aSWarner Losh DevPathFromTextKeyboard (
8947270962aSWarner Losh IN CHAR16 *TextDeviceNode
8957270962aSWarner Losh )
8967270962aSWarner Losh {
8977270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0301);
8987270962aSWarner Losh }
8997270962aSWarner Losh
9007270962aSWarner Losh /**
9017270962aSWarner Losh Converts a text device path node to Serial device path structure.
9027270962aSWarner Losh
9037270962aSWarner Losh @param TextDeviceNode The input Text device path node.
9047270962aSWarner Losh
9057270962aSWarner Losh @return A pointer to the newly-created Serial device path structure.
9067270962aSWarner Losh
9077270962aSWarner Losh **/
9087270962aSWarner Losh static
9097270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSerial(IN CHAR16 * TextDeviceNode)9107270962aSWarner Losh DevPathFromTextSerial (
9117270962aSWarner Losh IN CHAR16 *TextDeviceNode
9127270962aSWarner Losh )
9137270962aSWarner Losh {
9147270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0501);
9157270962aSWarner Losh }
9167270962aSWarner Losh
9177270962aSWarner Losh /**
9187270962aSWarner Losh Converts a text device path node to Parallel Port device path structure.
9197270962aSWarner Losh
9207270962aSWarner Losh @param TextDeviceNode The input Text device path node.
9217270962aSWarner Losh
9227270962aSWarner Losh @return A pointer to the newly-created Parallel Port device path structure.
9237270962aSWarner Losh
9247270962aSWarner Losh **/
9257270962aSWarner Losh static
9267270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextParallelPort(IN CHAR16 * TextDeviceNode)9277270962aSWarner Losh DevPathFromTextParallelPort (
9287270962aSWarner Losh IN CHAR16 *TextDeviceNode
9297270962aSWarner Losh )
9307270962aSWarner Losh {
9317270962aSWarner Losh return ConvertFromTextAcpi (TextDeviceNode, 0x0401);
9327270962aSWarner Losh }
9337270962aSWarner Losh
9347270962aSWarner Losh /**
9357270962aSWarner Losh Converts a text device path node to ACPI extension device path structure.
9367270962aSWarner Losh
9377270962aSWarner Losh @param TextDeviceNode The input Text device path node.
9387270962aSWarner Losh
9397270962aSWarner Losh @return A pointer to the newly-created ACPI extension device path structure.
9407270962aSWarner Losh
9417270962aSWarner Losh **/
9427270962aSWarner Losh static
9437270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiEx(IN CHAR16 * TextDeviceNode)9447270962aSWarner Losh DevPathFromTextAcpiEx (
9457270962aSWarner Losh IN CHAR16 *TextDeviceNode
9467270962aSWarner Losh )
9477270962aSWarner Losh {
9487270962aSWarner Losh CHAR16 *HIDStr;
9497270962aSWarner Losh CHAR16 *CIDStr;
9507270962aSWarner Losh CHAR16 *UIDStr;
9517270962aSWarner Losh CHAR16 *HIDSTRStr;
9527270962aSWarner Losh CHAR16 *CIDSTRStr;
9537270962aSWarner Losh CHAR16 *UIDSTRStr;
9547270962aSWarner Losh CHAR8 *AsciiStr;
9557270962aSWarner Losh UINT16 Length;
9567270962aSWarner Losh ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;
9577270962aSWarner Losh
9587270962aSWarner Losh HIDStr = GetNextParamStr (&TextDeviceNode);
9597270962aSWarner Losh CIDStr = GetNextParamStr (&TextDeviceNode);
9607270962aSWarner Losh UIDStr = GetNextParamStr (&TextDeviceNode);
9617270962aSWarner Losh HIDSTRStr = GetNextParamStr (&TextDeviceNode);
9627270962aSWarner Losh CIDSTRStr = GetNextParamStr (&TextDeviceNode);
9637270962aSWarner Losh UIDSTRStr = GetNextParamStr (&TextDeviceNode);
9647270962aSWarner Losh
9657270962aSWarner Losh Length = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
9667270962aSWarner Losh Length = (UINT16)(Length + StrLen (UIDSTRStr) + 1);
9677270962aSWarner Losh Length = (UINT16)(Length + StrLen (CIDSTRStr) + 1);
9687270962aSWarner Losh AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
9697270962aSWarner Losh ACPI_DEVICE_PATH,
9707270962aSWarner Losh ACPI_EXTENDED_DP,
9717270962aSWarner Losh Length
9727270962aSWarner Losh );
9737270962aSWarner Losh
9747270962aSWarner Losh AcpiEx->HID = EisaIdFromText (HIDStr);
9757270962aSWarner Losh AcpiEx->CID = EisaIdFromText (CIDStr);
9767270962aSWarner Losh AcpiEx->UID = (UINT32)Strtoi (UIDStr);
9777270962aSWarner Losh
9787270962aSWarner Losh AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
9797270962aSWarner Losh StrToAscii (HIDSTRStr, &AsciiStr);
9807270962aSWarner Losh StrToAscii (UIDSTRStr, &AsciiStr);
9817270962aSWarner Losh StrToAscii (CIDSTRStr, &AsciiStr);
9827270962aSWarner Losh
9837270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
9847270962aSWarner Losh }
9857270962aSWarner Losh
9867270962aSWarner Losh /**
9877270962aSWarner Losh Converts a text device path node to ACPI extension device path structure.
9887270962aSWarner Losh
9897270962aSWarner Losh @param TextDeviceNode The input Text device path node.
9907270962aSWarner Losh
9917270962aSWarner Losh @return A pointer to the newly-created ACPI extension device path structure.
9927270962aSWarner Losh
9937270962aSWarner Losh **/
9947270962aSWarner Losh static
9957270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiExp(IN CHAR16 * TextDeviceNode)9967270962aSWarner Losh DevPathFromTextAcpiExp (
9977270962aSWarner Losh IN CHAR16 *TextDeviceNode
9987270962aSWarner Losh )
9997270962aSWarner Losh {
10007270962aSWarner Losh CHAR16 *HIDStr;
10017270962aSWarner Losh CHAR16 *CIDStr;
10027270962aSWarner Losh CHAR16 *UIDSTRStr;
10037270962aSWarner Losh CHAR8 *AsciiStr;
10047270962aSWarner Losh UINT16 Length;
10057270962aSWarner Losh ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;
10067270962aSWarner Losh
10077270962aSWarner Losh HIDStr = GetNextParamStr (&TextDeviceNode);
10087270962aSWarner Losh CIDStr = GetNextParamStr (&TextDeviceNode);
10097270962aSWarner Losh UIDSTRStr = GetNextParamStr (&TextDeviceNode);
10107270962aSWarner Losh Length = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);
10117270962aSWarner Losh AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
10127270962aSWarner Losh ACPI_DEVICE_PATH,
10137270962aSWarner Losh ACPI_EXTENDED_DP,
10147270962aSWarner Losh Length
10157270962aSWarner Losh );
10167270962aSWarner Losh
10177270962aSWarner Losh AcpiEx->HID = EisaIdFromText (HIDStr);
1018492d9953SJose Luis Duran //
1019492d9953SJose Luis Duran // According to UEFI spec, the CID parameter is optional and has a default value of 0.
1020492d9953SJose Luis Duran // So when the CID parameter is not specified or specified as 0 in the text device node.
1021492d9953SJose Luis Duran // Set the CID to 0 in the ACPI extension device path structure.
1022492d9953SJose Luis Duran //
10235754f582SJose Luis Duran if ((*CIDStr == '\0') || (*CIDStr == '0')) {
1024492d9953SJose Luis Duran AcpiEx->CID = 0;
1025492d9953SJose Luis Duran } else {
10267270962aSWarner Losh AcpiEx->CID = EisaIdFromText (CIDStr);
1027492d9953SJose Luis Duran }
10285754f582SJose Luis Duran
10297270962aSWarner Losh AcpiEx->UID = 0;
10307270962aSWarner Losh
10317270962aSWarner Losh AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
10327270962aSWarner Losh //
10337270962aSWarner Losh // HID string is NULL
10347270962aSWarner Losh //
10357270962aSWarner Losh *AsciiStr = '\0';
10367270962aSWarner Losh //
10377270962aSWarner Losh // Convert UID string
10387270962aSWarner Losh //
10397270962aSWarner Losh AsciiStr++;
10407270962aSWarner Losh StrToAscii (UIDSTRStr, &AsciiStr);
10417270962aSWarner Losh //
10427270962aSWarner Losh // CID string is NULL
10437270962aSWarner Losh //
10447270962aSWarner Losh *AsciiStr = '\0';
10457270962aSWarner Losh
10467270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
10477270962aSWarner Losh }
10487270962aSWarner Losh
10497270962aSWarner Losh /**
10507270962aSWarner Losh Converts a text device path node to ACPI _ADR device path structure.
10517270962aSWarner Losh
10527270962aSWarner Losh @param TextDeviceNode The input Text device path node.
10537270962aSWarner Losh
10547270962aSWarner Losh @return A pointer to the newly-created ACPI _ADR device path structure.
10557270962aSWarner Losh
10567270962aSWarner Losh **/
10577270962aSWarner Losh static
10587270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiAdr(IN CHAR16 * TextDeviceNode)10597270962aSWarner Losh DevPathFromTextAcpiAdr (
10607270962aSWarner Losh IN CHAR16 *TextDeviceNode
10617270962aSWarner Losh )
10627270962aSWarner Losh {
10637270962aSWarner Losh CHAR16 *DisplayDeviceStr;
10647270962aSWarner Losh ACPI_ADR_DEVICE_PATH *AcpiAdr;
10657270962aSWarner Losh UINTN Index;
10667270962aSWarner Losh UINTN Length;
10677270962aSWarner Losh
10687270962aSWarner Losh AcpiAdr = (ACPI_ADR_DEVICE_PATH *)CreateDeviceNode (
10697270962aSWarner Losh ACPI_DEVICE_PATH,
10707270962aSWarner Losh ACPI_ADR_DP,
10717270962aSWarner Losh (UINT16)sizeof (ACPI_ADR_DEVICE_PATH)
10727270962aSWarner Losh );
10737270962aSWarner Losh ASSERT (AcpiAdr != NULL);
10747270962aSWarner Losh
10757270962aSWarner Losh for (Index = 0; ; Index++) {
10767270962aSWarner Losh DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);
10777270962aSWarner Losh if (IS_NULL (*DisplayDeviceStr)) {
10787270962aSWarner Losh break;
10797270962aSWarner Losh }
10805754f582SJose Luis Duran
10817270962aSWarner Losh if (Index > 0) {
10827270962aSWarner Losh Length = DevicePathNodeLength (AcpiAdr);
10837270962aSWarner Losh AcpiAdr = ReallocatePool (
10847270962aSWarner Losh Length,
10857270962aSWarner Losh Length + sizeof (UINT32),
10867270962aSWarner Losh AcpiAdr
10877270962aSWarner Losh );
10887270962aSWarner Losh ASSERT (AcpiAdr != NULL);
10897270962aSWarner Losh SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));
10907270962aSWarner Losh }
10917270962aSWarner Losh
10927270962aSWarner Losh (&AcpiAdr->ADR)[Index] = (UINT32)Strtoi (DisplayDeviceStr);
10937270962aSWarner Losh }
10947270962aSWarner Losh
10957270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
10967270962aSWarner Losh }
10977270962aSWarner Losh
10987270962aSWarner Losh /**
10997270962aSWarner Losh Converts a generic messaging text device path node to messaging device path structure.
11007270962aSWarner Losh
11017270962aSWarner Losh @param TextDeviceNode The input Text device path node.
11027270962aSWarner Losh
11037270962aSWarner Losh @return A pointer to messaging device path structure.
11047270962aSWarner Losh
11057270962aSWarner Losh **/
11067270962aSWarner Losh static
11077270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMsg(IN CHAR16 * TextDeviceNode)11087270962aSWarner Losh DevPathFromTextMsg (
11097270962aSWarner Losh IN CHAR16 *TextDeviceNode
11107270962aSWarner Losh )
11117270962aSWarner Losh {
11127270962aSWarner Losh return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);
11137270962aSWarner Losh }
11147270962aSWarner Losh
11157270962aSWarner Losh /**
11167270962aSWarner Losh Converts a text device path node to Parallel Port device path structure.
11177270962aSWarner Losh
11187270962aSWarner Losh @param TextDeviceNode The input Text device path node.
11197270962aSWarner Losh
11207270962aSWarner Losh @return A pointer to the newly-created Parallel Port device path structure.
11217270962aSWarner Losh
11227270962aSWarner Losh **/
11237270962aSWarner Losh static
11247270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAta(IN CHAR16 * TextDeviceNode)11257270962aSWarner Losh DevPathFromTextAta (
11267270962aSWarner Losh IN CHAR16 *TextDeviceNode
11277270962aSWarner Losh )
11287270962aSWarner Losh {
11297270962aSWarner Losh CHAR16 *PrimarySecondaryStr;
11307270962aSWarner Losh CHAR16 *SlaveMasterStr;
11317270962aSWarner Losh CHAR16 *LunStr;
11327270962aSWarner Losh ATAPI_DEVICE_PATH *Atapi;
11337270962aSWarner Losh
11347270962aSWarner Losh Atapi = (ATAPI_DEVICE_PATH *)CreateDeviceNode (
11357270962aSWarner Losh MESSAGING_DEVICE_PATH,
11367270962aSWarner Losh MSG_ATAPI_DP,
11377270962aSWarner Losh (UINT16)sizeof (ATAPI_DEVICE_PATH)
11387270962aSWarner Losh );
11397270962aSWarner Losh
11407270962aSWarner Losh PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);
11417270962aSWarner Losh SlaveMasterStr = GetNextParamStr (&TextDeviceNode);
11427270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
11437270962aSWarner Losh
11447270962aSWarner Losh if (StrCmp (PrimarySecondaryStr, "Primary") == 0) {
11457270962aSWarner Losh Atapi->PrimarySecondary = 0;
11467270962aSWarner Losh } else if (StrCmp (PrimarySecondaryStr, "Secondary") == 0) {
11477270962aSWarner Losh Atapi->PrimarySecondary = 1;
11487270962aSWarner Losh } else {
11497270962aSWarner Losh Atapi->PrimarySecondary = (UINT8)Strtoi (PrimarySecondaryStr);
11507270962aSWarner Losh }
11515754f582SJose Luis Duran
11527270962aSWarner Losh if (StrCmp (SlaveMasterStr, "Master") == 0) {
11537270962aSWarner Losh Atapi->SlaveMaster = 0;
11547270962aSWarner Losh } else if (StrCmp (SlaveMasterStr, "Slave") == 0) {
11557270962aSWarner Losh Atapi->SlaveMaster = 1;
11567270962aSWarner Losh } else {
11577270962aSWarner Losh Atapi->SlaveMaster = (UINT8)Strtoi (SlaveMasterStr);
11587270962aSWarner Losh }
11597270962aSWarner Losh
11607270962aSWarner Losh Atapi->Lun = (UINT16)Strtoi (LunStr);
11617270962aSWarner Losh
11627270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Atapi;
11637270962aSWarner Losh }
11647270962aSWarner Losh
11657270962aSWarner Losh /**
11667270962aSWarner Losh Converts a text device path node to SCSI device path structure.
11677270962aSWarner Losh
11687270962aSWarner Losh @param TextDeviceNode The input Text device path node.
11697270962aSWarner Losh
11707270962aSWarner Losh @return A pointer to the newly-created SCSI device path structure.
11717270962aSWarner Losh
11727270962aSWarner Losh **/
11737270962aSWarner Losh static
11747270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextScsi(IN CHAR16 * TextDeviceNode)11757270962aSWarner Losh DevPathFromTextScsi (
11767270962aSWarner Losh IN CHAR16 *TextDeviceNode
11777270962aSWarner Losh )
11787270962aSWarner Losh {
11797270962aSWarner Losh CHAR16 *PunStr;
11807270962aSWarner Losh CHAR16 *LunStr;
11817270962aSWarner Losh SCSI_DEVICE_PATH *Scsi;
11827270962aSWarner Losh
11837270962aSWarner Losh PunStr = GetNextParamStr (&TextDeviceNode);
11847270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
11857270962aSWarner Losh Scsi = (SCSI_DEVICE_PATH *)CreateDeviceNode (
11867270962aSWarner Losh MESSAGING_DEVICE_PATH,
11877270962aSWarner Losh MSG_SCSI_DP,
11887270962aSWarner Losh (UINT16)sizeof (SCSI_DEVICE_PATH)
11897270962aSWarner Losh );
11907270962aSWarner Losh
11917270962aSWarner Losh Scsi->Pun = (UINT16)Strtoi (PunStr);
11927270962aSWarner Losh Scsi->Lun = (UINT16)Strtoi (LunStr);
11937270962aSWarner Losh
11947270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Scsi;
11957270962aSWarner Losh }
11967270962aSWarner Losh
11977270962aSWarner Losh /**
11987270962aSWarner Losh Converts a text device path node to Fibre device path structure.
11997270962aSWarner Losh
12007270962aSWarner Losh @param TextDeviceNode The input Text device path node.
12017270962aSWarner Losh
12027270962aSWarner Losh @return A pointer to the newly-created Fibre device path structure.
12037270962aSWarner Losh
12047270962aSWarner Losh **/
12057270962aSWarner Losh static
12067270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibre(IN CHAR16 * TextDeviceNode)12077270962aSWarner Losh DevPathFromTextFibre (
12087270962aSWarner Losh IN CHAR16 *TextDeviceNode
12097270962aSWarner Losh )
12107270962aSWarner Losh {
12117270962aSWarner Losh CHAR16 *WWNStr;
12127270962aSWarner Losh CHAR16 *LunStr;
12137270962aSWarner Losh FIBRECHANNEL_DEVICE_PATH *Fibre;
12147270962aSWarner Losh
12157270962aSWarner Losh WWNStr = GetNextParamStr (&TextDeviceNode);
12167270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
12177270962aSWarner Losh Fibre = (FIBRECHANNEL_DEVICE_PATH *)CreateDeviceNode (
12187270962aSWarner Losh MESSAGING_DEVICE_PATH,
12197270962aSWarner Losh MSG_FIBRECHANNEL_DP,
12207270962aSWarner Losh (UINT16)sizeof (FIBRECHANNEL_DEVICE_PATH)
12217270962aSWarner Losh );
12227270962aSWarner Losh
12237270962aSWarner Losh Fibre->Reserved = 0;
12247270962aSWarner Losh Strtoi64 (WWNStr, &Fibre->WWN);
12257270962aSWarner Losh Strtoi64 (LunStr, &Fibre->Lun);
12267270962aSWarner Losh
12277270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Fibre;
12287270962aSWarner Losh }
12297270962aSWarner Losh
12307270962aSWarner Losh /**
12317270962aSWarner Losh Converts a text device path node to FibreEx device path structure.
12327270962aSWarner Losh
12337270962aSWarner Losh @param TextDeviceNode The input Text device path node.
12347270962aSWarner Losh
12357270962aSWarner Losh @return A pointer to the newly-created FibreEx device path structure.
12367270962aSWarner Losh
12377270962aSWarner Losh **/
12387270962aSWarner Losh static
12397270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibreEx(IN CHAR16 * TextDeviceNode)12407270962aSWarner Losh DevPathFromTextFibreEx (
12417270962aSWarner Losh IN CHAR16 *TextDeviceNode
12427270962aSWarner Losh )
12437270962aSWarner Losh {
12447270962aSWarner Losh CHAR16 *WWNStr;
12457270962aSWarner Losh CHAR16 *LunStr;
12467270962aSWarner Losh FIBRECHANNELEX_DEVICE_PATH *FibreEx;
12477270962aSWarner Losh
12487270962aSWarner Losh WWNStr = GetNextParamStr (&TextDeviceNode);
12497270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
12507270962aSWarner Losh FibreEx = (FIBRECHANNELEX_DEVICE_PATH *)CreateDeviceNode (
12517270962aSWarner Losh MESSAGING_DEVICE_PATH,
12527270962aSWarner Losh MSG_FIBRECHANNELEX_DP,
12537270962aSWarner Losh (UINT16)sizeof (FIBRECHANNELEX_DEVICE_PATH)
12547270962aSWarner Losh );
12557270962aSWarner Losh
12567270962aSWarner Losh FibreEx->Reserved = 0;
12577270962aSWarner Losh Strtoi64 (WWNStr, (UINT64 *)(&FibreEx->WWN));
12587270962aSWarner Losh Strtoi64 (LunStr, (UINT64 *)(&FibreEx->Lun));
12597270962aSWarner Losh
12607270962aSWarner Losh *(UINT64 *)(&FibreEx->WWN) = SwapBytes64 (*(UINT64 *)(&FibreEx->WWN));
12617270962aSWarner Losh *(UINT64 *)(&FibreEx->Lun) = SwapBytes64 (*(UINT64 *)(&FibreEx->Lun));
12627270962aSWarner Losh
12637270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)FibreEx;
12647270962aSWarner Losh }
12657270962aSWarner Losh
12667270962aSWarner Losh /**
12677270962aSWarner Losh Converts a text device path node to 1394 device path structure.
12687270962aSWarner Losh
12697270962aSWarner Losh @param TextDeviceNode The input Text device path node.
12707270962aSWarner Losh
12717270962aSWarner Losh @return A pointer to the newly-created 1394 device path structure.
12727270962aSWarner Losh
12737270962aSWarner Losh **/
12747270962aSWarner Losh static
12757270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromText1394(IN CHAR16 * TextDeviceNode)12767270962aSWarner Losh DevPathFromText1394 (
12777270962aSWarner Losh IN CHAR16 *TextDeviceNode
12787270962aSWarner Losh )
12797270962aSWarner Losh {
12807270962aSWarner Losh CHAR16 *GuidStr;
12817270962aSWarner Losh F1394_DEVICE_PATH *F1394DevPath;
12827270962aSWarner Losh
12837270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
12847270962aSWarner Losh F1394DevPath = (F1394_DEVICE_PATH *)CreateDeviceNode (
12857270962aSWarner Losh MESSAGING_DEVICE_PATH,
12867270962aSWarner Losh MSG_1394_DP,
12877270962aSWarner Losh (UINT16)sizeof (F1394_DEVICE_PATH)
12887270962aSWarner Losh );
12897270962aSWarner Losh
12907270962aSWarner Losh F1394DevPath->Reserved = 0;
12917270962aSWarner Losh F1394DevPath->Guid = StrHexToUint64 (GuidStr);
12927270962aSWarner Losh
12937270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)F1394DevPath;
12947270962aSWarner Losh }
12957270962aSWarner Losh
12967270962aSWarner Losh /**
12977270962aSWarner Losh Converts a text device path node to USB device path structure.
12987270962aSWarner Losh
12997270962aSWarner Losh @param TextDeviceNode The input Text device path node.
13007270962aSWarner Losh
13017270962aSWarner Losh @return A pointer to the newly-created USB device path structure.
13027270962aSWarner Losh
13037270962aSWarner Losh **/
13047270962aSWarner Losh static
13057270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsb(IN CHAR16 * TextDeviceNode)13067270962aSWarner Losh DevPathFromTextUsb (
13077270962aSWarner Losh IN CHAR16 *TextDeviceNode
13087270962aSWarner Losh )
13097270962aSWarner Losh {
13107270962aSWarner Losh CHAR16 *PortStr;
13117270962aSWarner Losh CHAR16 *InterfaceStr;
13127270962aSWarner Losh USB_DEVICE_PATH *Usb;
13137270962aSWarner Losh
13147270962aSWarner Losh PortStr = GetNextParamStr (&TextDeviceNode);
13157270962aSWarner Losh InterfaceStr = GetNextParamStr (&TextDeviceNode);
13167270962aSWarner Losh Usb = (USB_DEVICE_PATH *)CreateDeviceNode (
13177270962aSWarner Losh MESSAGING_DEVICE_PATH,
13187270962aSWarner Losh MSG_USB_DP,
13197270962aSWarner Losh (UINT16)sizeof (USB_DEVICE_PATH)
13207270962aSWarner Losh );
13217270962aSWarner Losh
13227270962aSWarner Losh Usb->ParentPortNumber = (UINT8)Strtoi (PortStr);
13237270962aSWarner Losh Usb->InterfaceNumber = (UINT8)Strtoi (InterfaceStr);
13247270962aSWarner Losh
13257270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Usb;
13267270962aSWarner Losh }
13277270962aSWarner Losh
13287270962aSWarner Losh /**
13297270962aSWarner Losh Converts a text device path node to I20 device path structure.
13307270962aSWarner Losh
13317270962aSWarner Losh @param TextDeviceNode The input Text device path node.
13327270962aSWarner Losh
13337270962aSWarner Losh @return A pointer to the newly-created I20 device path structure.
13347270962aSWarner Losh
13357270962aSWarner Losh **/
13367270962aSWarner Losh static
13377270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextI2O(IN CHAR16 * TextDeviceNode)13387270962aSWarner Losh DevPathFromTextI2O (
13397270962aSWarner Losh IN CHAR16 *TextDeviceNode
13407270962aSWarner Losh )
13417270962aSWarner Losh {
13427270962aSWarner Losh CHAR16 *TIDStr;
13437270962aSWarner Losh I2O_DEVICE_PATH *I2ODevPath;
13447270962aSWarner Losh
13457270962aSWarner Losh TIDStr = GetNextParamStr (&TextDeviceNode);
13467270962aSWarner Losh I2ODevPath = (I2O_DEVICE_PATH *)CreateDeviceNode (
13477270962aSWarner Losh MESSAGING_DEVICE_PATH,
13487270962aSWarner Losh MSG_I2O_DP,
13497270962aSWarner Losh (UINT16)sizeof (I2O_DEVICE_PATH)
13507270962aSWarner Losh );
13517270962aSWarner Losh
13527270962aSWarner Losh I2ODevPath->Tid = (UINT32)Strtoi (TIDStr);
13537270962aSWarner Losh
13547270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)I2ODevPath;
13557270962aSWarner Losh }
13567270962aSWarner Losh
13577270962aSWarner Losh /**
13587270962aSWarner Losh Converts a text device path node to Infini Band device path structure.
13597270962aSWarner Losh
13607270962aSWarner Losh @param TextDeviceNode The input Text device path node.
13617270962aSWarner Losh
13627270962aSWarner Losh @return A pointer to the newly-created Infini Band device path structure.
13637270962aSWarner Losh
13647270962aSWarner Losh **/
13657270962aSWarner Losh static
13667270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextInfiniband(IN CHAR16 * TextDeviceNode)13677270962aSWarner Losh DevPathFromTextInfiniband (
13687270962aSWarner Losh IN CHAR16 *TextDeviceNode
13697270962aSWarner Losh )
13707270962aSWarner Losh {
13717270962aSWarner Losh CHAR16 *FlagsStr;
13727270962aSWarner Losh CHAR16 *GuidStr;
13737270962aSWarner Losh CHAR16 *SidStr;
13747270962aSWarner Losh CHAR16 *TidStr;
13757270962aSWarner Losh CHAR16 *DidStr;
13767270962aSWarner Losh INFINIBAND_DEVICE_PATH *InfiniBand;
13777270962aSWarner Losh
13787270962aSWarner Losh FlagsStr = GetNextParamStr (&TextDeviceNode);
13797270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
13807270962aSWarner Losh SidStr = GetNextParamStr (&TextDeviceNode);
13817270962aSWarner Losh TidStr = GetNextParamStr (&TextDeviceNode);
13827270962aSWarner Losh DidStr = GetNextParamStr (&TextDeviceNode);
13837270962aSWarner Losh InfiniBand = (INFINIBAND_DEVICE_PATH *)CreateDeviceNode (
13847270962aSWarner Losh MESSAGING_DEVICE_PATH,
13857270962aSWarner Losh MSG_INFINIBAND_DP,
13867270962aSWarner Losh (UINT16)sizeof (INFINIBAND_DEVICE_PATH)
13877270962aSWarner Losh );
13887270962aSWarner Losh
13897270962aSWarner Losh InfiniBand->ResourceFlags = (UINT32)Strtoi (FlagsStr);
13907270962aSWarner Losh StrToGuid (GuidStr, (EFI_GUID *)InfiniBand->PortGid);
13917270962aSWarner Losh Strtoi64 (SidStr, &InfiniBand->ServiceId);
13927270962aSWarner Losh Strtoi64 (TidStr, &InfiniBand->TargetPortId);
13937270962aSWarner Losh Strtoi64 (DidStr, &InfiniBand->DeviceId);
13947270962aSWarner Losh
13957270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)InfiniBand;
13967270962aSWarner Losh }
13977270962aSWarner Losh
13987270962aSWarner Losh /**
13997270962aSWarner Losh Converts a text device path node to Vendor-Defined Messaging device path structure.
14007270962aSWarner Losh
14017270962aSWarner Losh @param TextDeviceNode The input Text device path node.
14027270962aSWarner Losh
14037270962aSWarner Losh @return A pointer to the newly-created Vendor-Defined Messaging device path structure.
14047270962aSWarner Losh
14057270962aSWarner Losh **/
14067270962aSWarner Losh static
14077270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMsg(IN CHAR16 * TextDeviceNode)14087270962aSWarner Losh DevPathFromTextVenMsg (
14097270962aSWarner Losh IN CHAR16 *TextDeviceNode
14107270962aSWarner Losh )
14117270962aSWarner Losh {
14127270962aSWarner Losh return ConvertFromTextVendor (
14137270962aSWarner Losh TextDeviceNode,
14147270962aSWarner Losh MESSAGING_DEVICE_PATH,
14157270962aSWarner Losh MSG_VENDOR_DP
14167270962aSWarner Losh );
14177270962aSWarner Losh }
14187270962aSWarner Losh
14197270962aSWarner Losh /**
14207270962aSWarner Losh Converts a text device path node to Vendor defined PC-ANSI device path structure.
14217270962aSWarner Losh
14227270962aSWarner Losh @param TextDeviceNode The input Text device path node.
14237270962aSWarner Losh
14247270962aSWarner Losh @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.
14257270962aSWarner Losh
14267270962aSWarner Losh **/
14277270962aSWarner Losh static
14287270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenPcAnsi(IN CHAR16 * TextDeviceNode)14297270962aSWarner Losh DevPathFromTextVenPcAnsi (
14307270962aSWarner Losh IN CHAR16 *TextDeviceNode
14317270962aSWarner Losh )
14327270962aSWarner Losh {
14337270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor;
14347270962aSWarner Losh
14357270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
14367270962aSWarner Losh MESSAGING_DEVICE_PATH,
14377270962aSWarner Losh MSG_VENDOR_DP,
14385754f582SJose Luis Duran (UINT16)sizeof (VENDOR_DEVICE_PATH)
14395754f582SJose Luis Duran );
14407270962aSWarner Losh CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
14417270962aSWarner Losh
14427270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
14437270962aSWarner Losh }
14447270962aSWarner Losh
14457270962aSWarner Losh /**
14467270962aSWarner Losh Converts a text device path node to Vendor defined VT100 device path structure.
14477270962aSWarner Losh
14487270962aSWarner Losh @param TextDeviceNode The input Text device path node.
14497270962aSWarner Losh
14507270962aSWarner Losh @return A pointer to the newly-created Vendor defined VT100 device path structure.
14517270962aSWarner Losh
14527270962aSWarner Losh **/
14537270962aSWarner Losh static
14547270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100(IN CHAR16 * TextDeviceNode)14557270962aSWarner Losh DevPathFromTextVenVt100 (
14567270962aSWarner Losh IN CHAR16 *TextDeviceNode
14577270962aSWarner Losh )
14587270962aSWarner Losh {
14597270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor;
14607270962aSWarner Losh
14617270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
14627270962aSWarner Losh MESSAGING_DEVICE_PATH,
14637270962aSWarner Losh MSG_VENDOR_DP,
14645754f582SJose Luis Duran (UINT16)sizeof (VENDOR_DEVICE_PATH)
14655754f582SJose Luis Duran );
14667270962aSWarner Losh CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
14677270962aSWarner Losh
14687270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
14697270962aSWarner Losh }
14707270962aSWarner Losh
14717270962aSWarner Losh /**
14727270962aSWarner Losh Converts a text device path node to Vendor defined VT100 Plus device path structure.
14737270962aSWarner Losh
14747270962aSWarner Losh @param TextDeviceNode The input Text device path node.
14757270962aSWarner Losh
14767270962aSWarner Losh @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.
14777270962aSWarner Losh
14787270962aSWarner Losh **/
14797270962aSWarner Losh static
14807270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100Plus(IN CHAR16 * TextDeviceNode)14817270962aSWarner Losh DevPathFromTextVenVt100Plus (
14827270962aSWarner Losh IN CHAR16 *TextDeviceNode
14837270962aSWarner Losh )
14847270962aSWarner Losh {
14857270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor;
14867270962aSWarner Losh
14877270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
14887270962aSWarner Losh MESSAGING_DEVICE_PATH,
14897270962aSWarner Losh MSG_VENDOR_DP,
14905754f582SJose Luis Duran (UINT16)sizeof (VENDOR_DEVICE_PATH)
14915754f582SJose Luis Duran );
14927270962aSWarner Losh CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
14937270962aSWarner Losh
14947270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
14957270962aSWarner Losh }
14967270962aSWarner Losh
14977270962aSWarner Losh /**
14987270962aSWarner Losh Converts a text device path node to Vendor defined UTF8 device path structure.
14997270962aSWarner Losh
15007270962aSWarner Losh @param TextDeviceNode The input Text device path node.
15017270962aSWarner Losh
15027270962aSWarner Losh @return A pointer to the newly-created Vendor defined UTF8 device path structure.
15037270962aSWarner Losh
15047270962aSWarner Losh **/
15057270962aSWarner Losh static
15067270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenUtf8(IN CHAR16 * TextDeviceNode)15077270962aSWarner Losh DevPathFromTextVenUtf8 (
15087270962aSWarner Losh IN CHAR16 *TextDeviceNode
15097270962aSWarner Losh )
15107270962aSWarner Losh {
15117270962aSWarner Losh VENDOR_DEVICE_PATH *Vendor;
15127270962aSWarner Losh
15137270962aSWarner Losh Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
15147270962aSWarner Losh MESSAGING_DEVICE_PATH,
15157270962aSWarner Losh MSG_VENDOR_DP,
15165754f582SJose Luis Duran (UINT16)sizeof (VENDOR_DEVICE_PATH)
15175754f582SJose Luis Duran );
15187270962aSWarner Losh CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
15197270962aSWarner Losh
15207270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
15217270962aSWarner Losh }
15227270962aSWarner Losh
15237270962aSWarner Losh /**
15247270962aSWarner Losh Converts a text device path node to UART Flow Control device path structure.
15257270962aSWarner Losh
15267270962aSWarner Losh @param TextDeviceNode The input Text device path node.
15277270962aSWarner Losh
15287270962aSWarner Losh @return A pointer to the newly-created UART Flow Control device path structure.
15297270962aSWarner Losh
15307270962aSWarner Losh **/
15317270962aSWarner Losh static
15327270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUartFlowCtrl(IN CHAR16 * TextDeviceNode)15337270962aSWarner Losh DevPathFromTextUartFlowCtrl (
15347270962aSWarner Losh IN CHAR16 *TextDeviceNode
15357270962aSWarner Losh )
15367270962aSWarner Losh {
15377270962aSWarner Losh CHAR16 *ValueStr;
15387270962aSWarner Losh UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
15397270962aSWarner Losh
15407270962aSWarner Losh ValueStr = GetNextParamStr (&TextDeviceNode);
15417270962aSWarner Losh UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *)CreateDeviceNode (
15427270962aSWarner Losh MESSAGING_DEVICE_PATH,
15437270962aSWarner Losh MSG_VENDOR_DP,
15447270962aSWarner Losh (UINT16)sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
15457270962aSWarner Losh );
15467270962aSWarner Losh
15477270962aSWarner Losh CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);
15487270962aSWarner Losh if (StrCmp (ValueStr, "XonXoff") == 0) {
15497270962aSWarner Losh UartFlowControl->FlowControlMap = 2;
15507270962aSWarner Losh } else if (StrCmp (ValueStr, "Hardware") == 0) {
15517270962aSWarner Losh UartFlowControl->FlowControlMap = 1;
15527270962aSWarner Losh } else {
15537270962aSWarner Losh UartFlowControl->FlowControlMap = 0;
15547270962aSWarner Losh }
15557270962aSWarner Losh
15567270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)UartFlowControl;
15577270962aSWarner Losh }
15587270962aSWarner Losh
15597270962aSWarner Losh /**
15607270962aSWarner Losh Converts a text device path node to Serial Attached SCSI device path structure.
15617270962aSWarner Losh
15627270962aSWarner Losh @param TextDeviceNode The input Text device path node.
15637270962aSWarner Losh
15647270962aSWarner Losh @return A pointer to the newly-created Serial Attached SCSI device path structure.
15657270962aSWarner Losh
15667270962aSWarner Losh **/
15677270962aSWarner Losh static
15687270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSAS(IN CHAR16 * TextDeviceNode)15697270962aSWarner Losh DevPathFromTextSAS (
15707270962aSWarner Losh IN CHAR16 *TextDeviceNode
15717270962aSWarner Losh )
15727270962aSWarner Losh {
15737270962aSWarner Losh CHAR16 *AddressStr;
15747270962aSWarner Losh CHAR16 *LunStr;
15757270962aSWarner Losh CHAR16 *RTPStr;
15767270962aSWarner Losh CHAR16 *SASSATAStr;
15777270962aSWarner Losh CHAR16 *LocationStr;
15787270962aSWarner Losh CHAR16 *ConnectStr;
15797270962aSWarner Losh CHAR16 *DriveBayStr;
15807270962aSWarner Losh CHAR16 *ReservedStr;
15817270962aSWarner Losh UINT16 Info;
15827270962aSWarner Losh UINT16 Uint16;
15837270962aSWarner Losh SAS_DEVICE_PATH *Sas;
15847270962aSWarner Losh
15857270962aSWarner Losh AddressStr = GetNextParamStr (&TextDeviceNode);
15867270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
15877270962aSWarner Losh RTPStr = GetNextParamStr (&TextDeviceNode);
15887270962aSWarner Losh SASSATAStr = GetNextParamStr (&TextDeviceNode);
15897270962aSWarner Losh LocationStr = GetNextParamStr (&TextDeviceNode);
15907270962aSWarner Losh ConnectStr = GetNextParamStr (&TextDeviceNode);
15917270962aSWarner Losh DriveBayStr = GetNextParamStr (&TextDeviceNode);
15927270962aSWarner Losh ReservedStr = GetNextParamStr (&TextDeviceNode);
15937270962aSWarner Losh Sas = (SAS_DEVICE_PATH *)CreateDeviceNode (
15947270962aSWarner Losh MESSAGING_DEVICE_PATH,
15957270962aSWarner Losh MSG_VENDOR_DP,
15967270962aSWarner Losh (UINT16)sizeof (SAS_DEVICE_PATH)
15977270962aSWarner Losh );
15987270962aSWarner Losh
15997270962aSWarner Losh CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);
16007270962aSWarner Losh Strtoi64 (AddressStr, &Sas->SasAddress);
16017270962aSWarner Losh Strtoi64 (LunStr, &Sas->Lun);
16027270962aSWarner Losh Sas->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
16037270962aSWarner Losh
16047270962aSWarner Losh if (StrCmp (SASSATAStr, "NoTopology") == 0) {
16057270962aSWarner Losh Info = 0x0;
16067270962aSWarner Losh } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
16077270962aSWarner Losh Uint16 = (UINT16)Strtoi (DriveBayStr);
16087270962aSWarner Losh if (Uint16 == 0) {
16097270962aSWarner Losh Info = 0x1;
16107270962aSWarner Losh } else {
16117270962aSWarner Losh Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
16127270962aSWarner Losh }
16137270962aSWarner Losh
16147270962aSWarner Losh if (StrCmp (SASSATAStr, "SATA") == 0) {
16157270962aSWarner Losh Info |= BIT4;
16167270962aSWarner Losh }
16177270962aSWarner Losh
16187270962aSWarner Losh //
16197270962aSWarner Losh // Location is an integer between 0 and 1 or else
16207270962aSWarner Losh // the keyword Internal (0) or External (1).
16217270962aSWarner Losh //
16227270962aSWarner Losh if (StrCmp (LocationStr, "External") == 0) {
16237270962aSWarner Losh Uint16 = 1;
16247270962aSWarner Losh } else if (StrCmp (LocationStr, "Internal") == 0) {
16257270962aSWarner Losh Uint16 = 0;
16267270962aSWarner Losh } else {
16277270962aSWarner Losh Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
16287270962aSWarner Losh }
16295754f582SJose Luis Duran
16307270962aSWarner Losh Info |= (Uint16 << 5);
16317270962aSWarner Losh
16327270962aSWarner Losh //
16337270962aSWarner Losh // Connect is an integer between 0 and 3 or else
16347270962aSWarner Losh // the keyword Direct (0) or Expanded (1).
16357270962aSWarner Losh //
16367270962aSWarner Losh if (StrCmp (ConnectStr, "Expanded") == 0) {
16377270962aSWarner Losh Uint16 = 1;
16387270962aSWarner Losh } else if (StrCmp (ConnectStr, "Direct") == 0) {
16397270962aSWarner Losh Uint16 = 0;
16407270962aSWarner Losh } else {
16417270962aSWarner Losh Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
16427270962aSWarner Losh }
16437270962aSWarner Losh
16445754f582SJose Luis Duran Info |= (Uint16 << 6);
16457270962aSWarner Losh } else {
16467270962aSWarner Losh Info = (UINT16)Strtoi (SASSATAStr);
16477270962aSWarner Losh }
16487270962aSWarner Losh
16497270962aSWarner Losh Sas->DeviceTopology = Info;
16507270962aSWarner Losh Sas->Reserved = (UINT32)Strtoi (ReservedStr);
16517270962aSWarner Losh
16527270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Sas;
16537270962aSWarner Losh }
16547270962aSWarner Losh
16557270962aSWarner Losh /**
16567270962aSWarner Losh Converts a text device path node to Serial Attached SCSI Ex device path structure.
16577270962aSWarner Losh
16587270962aSWarner Losh @param TextDeviceNode The input Text device path node.
16597270962aSWarner Losh
16607270962aSWarner Losh @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.
16617270962aSWarner Losh
16627270962aSWarner Losh **/
16637270962aSWarner Losh static
16647270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSasEx(IN CHAR16 * TextDeviceNode)16657270962aSWarner Losh DevPathFromTextSasEx (
16667270962aSWarner Losh IN CHAR16 *TextDeviceNode
16677270962aSWarner Losh )
16687270962aSWarner Losh {
16697270962aSWarner Losh CHAR16 *AddressStr;
16707270962aSWarner Losh CHAR16 *LunStr;
16717270962aSWarner Losh CHAR16 *RTPStr;
16727270962aSWarner Losh CHAR16 *SASSATAStr;
16737270962aSWarner Losh CHAR16 *LocationStr;
16747270962aSWarner Losh CHAR16 *ConnectStr;
16757270962aSWarner Losh CHAR16 *DriveBayStr;
16767270962aSWarner Losh UINT16 Info;
16777270962aSWarner Losh UINT16 Uint16;
16787270962aSWarner Losh UINT64 SasAddress;
16797270962aSWarner Losh UINT64 Lun;
16807270962aSWarner Losh SASEX_DEVICE_PATH *SasEx;
16817270962aSWarner Losh
16827270962aSWarner Losh AddressStr = GetNextParamStr (&TextDeviceNode);
16837270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
16847270962aSWarner Losh RTPStr = GetNextParamStr (&TextDeviceNode);
16857270962aSWarner Losh SASSATAStr = GetNextParamStr (&TextDeviceNode);
16867270962aSWarner Losh LocationStr = GetNextParamStr (&TextDeviceNode);
16877270962aSWarner Losh ConnectStr = GetNextParamStr (&TextDeviceNode);
16887270962aSWarner Losh DriveBayStr = GetNextParamStr (&TextDeviceNode);
16897270962aSWarner Losh SasEx = (SASEX_DEVICE_PATH *)CreateDeviceNode (
16907270962aSWarner Losh MESSAGING_DEVICE_PATH,
16917270962aSWarner Losh MSG_SASEX_DP,
16927270962aSWarner Losh (UINT16)sizeof (SASEX_DEVICE_PATH)
16937270962aSWarner Losh );
16947270962aSWarner Losh
16957270962aSWarner Losh Strtoi64 (AddressStr, &SasAddress);
16967270962aSWarner Losh Strtoi64 (LunStr, &Lun);
16977270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&SasEx->SasAddress, SwapBytes64 (SasAddress));
16987270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&SasEx->Lun, SwapBytes64 (Lun));
16997270962aSWarner Losh SasEx->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
17007270962aSWarner Losh
17017270962aSWarner Losh if (StrCmp (SASSATAStr, "NoTopology") == 0) {
17027270962aSWarner Losh Info = 0x0;
17037270962aSWarner Losh } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
17047270962aSWarner Losh Uint16 = (UINT16)Strtoi (DriveBayStr);
17057270962aSWarner Losh if (Uint16 == 0) {
17067270962aSWarner Losh Info = 0x1;
17077270962aSWarner Losh } else {
17087270962aSWarner Losh Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
17097270962aSWarner Losh }
17107270962aSWarner Losh
17117270962aSWarner Losh if (StrCmp (SASSATAStr, "SATA") == 0) {
17127270962aSWarner Losh Info |= BIT4;
17137270962aSWarner Losh }
17147270962aSWarner Losh
17157270962aSWarner Losh //
17167270962aSWarner Losh // Location is an integer between 0 and 1 or else
17177270962aSWarner Losh // the keyword Internal (0) or External (1).
17187270962aSWarner Losh //
17197270962aSWarner Losh if (StrCmp (LocationStr, "External") == 0) {
17207270962aSWarner Losh Uint16 = 1;
17217270962aSWarner Losh } else if (StrCmp (LocationStr, "Internal") == 0) {
17227270962aSWarner Losh Uint16 = 0;
17237270962aSWarner Losh } else {
17247270962aSWarner Losh Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
17257270962aSWarner Losh }
17265754f582SJose Luis Duran
17277270962aSWarner Losh Info |= (Uint16 << 5);
17287270962aSWarner Losh
17297270962aSWarner Losh //
17307270962aSWarner Losh // Connect is an integer between 0 and 3 or else
17317270962aSWarner Losh // the keyword Direct (0) or Expanded (1).
17327270962aSWarner Losh //
17337270962aSWarner Losh if (StrCmp (ConnectStr, "Expanded") == 0) {
17347270962aSWarner Losh Uint16 = 1;
17357270962aSWarner Losh } else if (StrCmp (ConnectStr, "Direct") == 0) {
17367270962aSWarner Losh Uint16 = 0;
17377270962aSWarner Losh } else {
17387270962aSWarner Losh Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
17397270962aSWarner Losh }
17407270962aSWarner Losh
17415754f582SJose Luis Duran Info |= (Uint16 << 6);
17427270962aSWarner Losh } else {
17437270962aSWarner Losh Info = (UINT16)Strtoi (SASSATAStr);
17447270962aSWarner Losh }
17457270962aSWarner Losh
17467270962aSWarner Losh SasEx->DeviceTopology = Info;
17477270962aSWarner Losh
17487270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)SasEx;
17497270962aSWarner Losh }
17507270962aSWarner Losh
17517270962aSWarner Losh /**
17527270962aSWarner Losh Converts a text device path node to NVM Express Namespace device path structure.
17537270962aSWarner Losh
17547270962aSWarner Losh @param TextDeviceNode The input Text device path node.
17557270962aSWarner Losh
17567270962aSWarner Losh @return A pointer to the newly-created NVM Express Namespace device path structure.
17577270962aSWarner Losh
17587270962aSWarner Losh **/
17597270962aSWarner Losh static
17607270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextNVMe(IN CHAR16 * TextDeviceNode)17617270962aSWarner Losh DevPathFromTextNVMe (
17627270962aSWarner Losh IN CHAR16 *TextDeviceNode
17637270962aSWarner Losh )
17647270962aSWarner Losh {
17657270962aSWarner Losh CHAR16 *NamespaceIdStr;
17667270962aSWarner Losh CHAR16 *NamespaceUuidStr;
17677270962aSWarner Losh NVME_NAMESPACE_DEVICE_PATH *Nvme;
17687270962aSWarner Losh UINT8 *Uuid;
17697270962aSWarner Losh UINTN Index;
17707270962aSWarner Losh
17717270962aSWarner Losh NamespaceIdStr = GetNextParamStr (&TextDeviceNode);
17727270962aSWarner Losh NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);
17737270962aSWarner Losh Nvme = (NVME_NAMESPACE_DEVICE_PATH *)CreateDeviceNode (
17747270962aSWarner Losh MESSAGING_DEVICE_PATH,
17757270962aSWarner Losh MSG_NVME_NAMESPACE_DP,
17767270962aSWarner Losh (UINT16)sizeof (NVME_NAMESPACE_DEVICE_PATH)
17777270962aSWarner Losh );
17787270962aSWarner Losh
17797270962aSWarner Losh Nvme->NamespaceId = (UINT32)Strtoi (NamespaceIdStr);
17807270962aSWarner Losh Uuid = (UINT8 *)&Nvme->NamespaceUuid;
17817270962aSWarner Losh
17827270962aSWarner Losh Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);
17837270962aSWarner Losh while (Index-- != 0) {
17847270962aSWarner Losh Uuid[Index] = (UINT8)StrHexToUintn (SplitStr (&NamespaceUuidStr, '-'));
17857270962aSWarner Losh }
17867270962aSWarner Losh
17877270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Nvme;
17887270962aSWarner Losh }
17897270962aSWarner Losh
17907270962aSWarner Losh /**
17917270962aSWarner Losh Converts a text device path node to UFS device path structure.
17927270962aSWarner Losh
17937270962aSWarner Losh @param TextDeviceNode The input Text device path node.
17947270962aSWarner Losh
17957270962aSWarner Losh @return A pointer to the newly-created UFS device path structure.
17967270962aSWarner Losh
17977270962aSWarner Losh **/
17987270962aSWarner Losh static
17997270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUfs(IN CHAR16 * TextDeviceNode)18007270962aSWarner Losh DevPathFromTextUfs (
18017270962aSWarner Losh IN CHAR16 *TextDeviceNode
18027270962aSWarner Losh )
18037270962aSWarner Losh {
18047270962aSWarner Losh CHAR16 *PunStr;
18057270962aSWarner Losh CHAR16 *LunStr;
18067270962aSWarner Losh UFS_DEVICE_PATH *Ufs;
18077270962aSWarner Losh
18087270962aSWarner Losh PunStr = GetNextParamStr (&TextDeviceNode);
18097270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
18107270962aSWarner Losh Ufs = (UFS_DEVICE_PATH *)CreateDeviceNode (
18117270962aSWarner Losh MESSAGING_DEVICE_PATH,
18127270962aSWarner Losh MSG_UFS_DP,
18137270962aSWarner Losh (UINT16)sizeof (UFS_DEVICE_PATH)
18147270962aSWarner Losh );
18157270962aSWarner Losh
18167270962aSWarner Losh Ufs->Pun = (UINT8)Strtoi (PunStr);
18177270962aSWarner Losh Ufs->Lun = (UINT8)Strtoi (LunStr);
18187270962aSWarner Losh
18197270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Ufs;
18207270962aSWarner Losh }
18217270962aSWarner Losh
18227270962aSWarner Losh /**
18237270962aSWarner Losh Converts a text device path node to SD (Secure Digital) device path structure.
18247270962aSWarner Losh
18257270962aSWarner Losh @param TextDeviceNode The input Text device path node.
18267270962aSWarner Losh
18277270962aSWarner Losh @return A pointer to the newly-created SD device path structure.
18287270962aSWarner Losh
18297270962aSWarner Losh **/
18307270962aSWarner Losh static
18317270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSd(IN CHAR16 * TextDeviceNode)18327270962aSWarner Losh DevPathFromTextSd (
18337270962aSWarner Losh IN CHAR16 *TextDeviceNode
18347270962aSWarner Losh )
18357270962aSWarner Losh {
18367270962aSWarner Losh CHAR16 *SlotNumberStr;
18377270962aSWarner Losh SD_DEVICE_PATH *Sd;
18387270962aSWarner Losh
18397270962aSWarner Losh SlotNumberStr = GetNextParamStr (&TextDeviceNode);
18407270962aSWarner Losh Sd = (SD_DEVICE_PATH *)CreateDeviceNode (
18417270962aSWarner Losh MESSAGING_DEVICE_PATH,
18427270962aSWarner Losh MSG_SD_DP,
18437270962aSWarner Losh (UINT16)sizeof (SD_DEVICE_PATH)
18447270962aSWarner Losh );
18457270962aSWarner Losh
18467270962aSWarner Losh Sd->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
18477270962aSWarner Losh
18487270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Sd;
18497270962aSWarner Losh }
18507270962aSWarner Losh
18517270962aSWarner Losh /**
18527270962aSWarner Losh Converts a text device path node to EMMC (Embedded MMC) device path structure.
18537270962aSWarner Losh
18547270962aSWarner Losh @param TextDeviceNode The input Text device path node.
18557270962aSWarner Losh
18567270962aSWarner Losh @return A pointer to the newly-created EMMC device path structure.
18577270962aSWarner Losh
18587270962aSWarner Losh **/
18597270962aSWarner Losh static
18607270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextEmmc(IN CHAR16 * TextDeviceNode)18617270962aSWarner Losh DevPathFromTextEmmc (
18627270962aSWarner Losh IN CHAR16 *TextDeviceNode
18637270962aSWarner Losh )
18647270962aSWarner Losh {
18657270962aSWarner Losh CHAR16 *SlotNumberStr;
18667270962aSWarner Losh EMMC_DEVICE_PATH *Emmc;
18677270962aSWarner Losh
18687270962aSWarner Losh SlotNumberStr = GetNextParamStr (&TextDeviceNode);
18697270962aSWarner Losh Emmc = (EMMC_DEVICE_PATH *)CreateDeviceNode (
18707270962aSWarner Losh MESSAGING_DEVICE_PATH,
18717270962aSWarner Losh MSG_EMMC_DP,
18727270962aSWarner Losh (UINT16)sizeof (EMMC_DEVICE_PATH)
18737270962aSWarner Losh );
18747270962aSWarner Losh
18757270962aSWarner Losh Emmc->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
18767270962aSWarner Losh
18777270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Emmc;
18787270962aSWarner Losh }
18797270962aSWarner Losh
18807270962aSWarner Losh /**
18817270962aSWarner Losh Converts a text device path node to Debug Port device path structure.
18827270962aSWarner Losh
18837270962aSWarner Losh @param TextDeviceNode The input Text device path node.
18847270962aSWarner Losh
18857270962aSWarner Losh @return A pointer to the newly-created Debug Port device path structure.
18867270962aSWarner Losh
18877270962aSWarner Losh **/
18887270962aSWarner Losh static
18897270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextDebugPort(IN CHAR16 * TextDeviceNode)18907270962aSWarner Losh DevPathFromTextDebugPort (
18917270962aSWarner Losh IN CHAR16 *TextDeviceNode
18927270962aSWarner Losh )
18937270962aSWarner Losh {
18949a62aa93SJose Luis Duran VENDOR_DEVICE_PATH *Vend;
18957270962aSWarner Losh
18969a62aa93SJose Luis Duran Vend = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
18977270962aSWarner Losh MESSAGING_DEVICE_PATH,
18987270962aSWarner Losh MSG_VENDOR_DP,
18999a62aa93SJose Luis Duran (UINT16)sizeof (VENDOR_DEVICE_PATH)
19007270962aSWarner Losh );
19017270962aSWarner Losh
19027270962aSWarner Losh CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
19037270962aSWarner Losh
19047270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vend;
19057270962aSWarner Losh }
19067270962aSWarner Losh
19077270962aSWarner Losh /**
19087270962aSWarner Losh Converts a text device path node to MAC device path structure.
19097270962aSWarner Losh
19107270962aSWarner Losh @param TextDeviceNode The input Text device path node.
19117270962aSWarner Losh
19127270962aSWarner Losh @return A pointer to the newly-created MAC device path structure.
19137270962aSWarner Losh
19147270962aSWarner Losh **/
19157270962aSWarner Losh static
19167270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMAC(IN CHAR16 * TextDeviceNode)19177270962aSWarner Losh DevPathFromTextMAC (
19187270962aSWarner Losh IN CHAR16 *TextDeviceNode
19197270962aSWarner Losh )
19207270962aSWarner Losh {
19217270962aSWarner Losh CHAR16 *AddressStr;
19227270962aSWarner Losh CHAR16 *IfTypeStr;
19237270962aSWarner Losh UINTN Length;
19247270962aSWarner Losh MAC_ADDR_DEVICE_PATH *MACDevPath;
19257270962aSWarner Losh
19267270962aSWarner Losh AddressStr = GetNextParamStr (&TextDeviceNode);
19277270962aSWarner Losh IfTypeStr = GetNextParamStr (&TextDeviceNode);
19287270962aSWarner Losh MACDevPath = (MAC_ADDR_DEVICE_PATH *)CreateDeviceNode (
19297270962aSWarner Losh MESSAGING_DEVICE_PATH,
19307270962aSWarner Losh MSG_MAC_ADDR_DP,
19317270962aSWarner Losh (UINT16)sizeof (MAC_ADDR_DEVICE_PATH)
19327270962aSWarner Losh );
19337270962aSWarner Losh
19347270962aSWarner Losh MACDevPath->IfType = (UINT8)Strtoi (IfTypeStr);
19357270962aSWarner Losh
19367270962aSWarner Losh Length = sizeof (EFI_MAC_ADDRESS);
19375754f582SJose Luis Duran if ((MACDevPath->IfType == 0x01) || (MACDevPath->IfType == 0x00)) {
193881a659e3SJose Luis Duran Length = 6;
193981a659e3SJose Luis Duran }
194081a659e3SJose Luis Duran
19417270962aSWarner Losh StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);
19427270962aSWarner Losh
19437270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)MACDevPath;
19447270962aSWarner Losh }
19457270962aSWarner Losh
19467270962aSWarner Losh /**
19477270962aSWarner Losh Converts a text format to the network protocol ID.
19487270962aSWarner Losh
19497270962aSWarner Losh @param Text String of protocol field.
19507270962aSWarner Losh
19517270962aSWarner Losh @return Network protocol ID .
19527270962aSWarner Losh
19537270962aSWarner Losh **/
19547270962aSWarner Losh static
19557270962aSWarner Losh UINTN
NetworkProtocolFromText(IN CHAR16 * Text)19567270962aSWarner Losh NetworkProtocolFromText (
19577270962aSWarner Losh IN CHAR16 *Text
19587270962aSWarner Losh )
19597270962aSWarner Losh {
19607270962aSWarner Losh if (StrCmp (Text, "UDP") == 0) {
19617270962aSWarner Losh return RFC_1700_UDP_PROTOCOL;
19627270962aSWarner Losh }
19637270962aSWarner Losh
19647270962aSWarner Losh if (StrCmp (Text, "TCP") == 0) {
19657270962aSWarner Losh return RFC_1700_TCP_PROTOCOL;
19667270962aSWarner Losh }
19677270962aSWarner Losh
19687270962aSWarner Losh return Strtoi (Text);
19697270962aSWarner Losh }
19707270962aSWarner Losh
19717270962aSWarner Losh /**
19727270962aSWarner Losh Converts a text device path node to IPV4 device path structure.
19737270962aSWarner Losh
19747270962aSWarner Losh @param TextDeviceNode The input Text device path node.
19757270962aSWarner Losh
19767270962aSWarner Losh @return A pointer to the newly-created IPV4 device path structure.
19777270962aSWarner Losh
19787270962aSWarner Losh **/
19797270962aSWarner Losh static
19807270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv4(IN CHAR16 * TextDeviceNode)19817270962aSWarner Losh DevPathFromTextIPv4 (
19827270962aSWarner Losh IN CHAR16 *TextDeviceNode
19837270962aSWarner Losh )
19847270962aSWarner Losh {
19857270962aSWarner Losh CHAR16 *RemoteIPStr;
19867270962aSWarner Losh CHAR16 *ProtocolStr;
19877270962aSWarner Losh CHAR16 *TypeStr;
19887270962aSWarner Losh CHAR16 *LocalIPStr;
19897270962aSWarner Losh CHAR16 *GatewayIPStr;
19907270962aSWarner Losh CHAR16 *SubnetMaskStr;
19917270962aSWarner Losh IPv4_DEVICE_PATH *IPv4;
19927270962aSWarner Losh
19937270962aSWarner Losh RemoteIPStr = GetNextParamStr (&TextDeviceNode);
19947270962aSWarner Losh ProtocolStr = GetNextParamStr (&TextDeviceNode);
19957270962aSWarner Losh TypeStr = GetNextParamStr (&TextDeviceNode);
19967270962aSWarner Losh LocalIPStr = GetNextParamStr (&TextDeviceNode);
19977270962aSWarner Losh GatewayIPStr = GetNextParamStr (&TextDeviceNode);
19987270962aSWarner Losh SubnetMaskStr = GetNextParamStr (&TextDeviceNode);
19997270962aSWarner Losh IPv4 = (IPv4_DEVICE_PATH *)CreateDeviceNode (
20007270962aSWarner Losh MESSAGING_DEVICE_PATH,
20017270962aSWarner Losh MSG_IPv4_DP,
20027270962aSWarner Losh (UINT16)sizeof (IPv4_DEVICE_PATH)
20037270962aSWarner Losh );
20047270962aSWarner Losh
20057270962aSWarner Losh StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);
20067270962aSWarner Losh IPv4->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
20077270962aSWarner Losh if (StrCmp (TypeStr, "Static") == 0) {
20087270962aSWarner Losh IPv4->StaticIpAddress = TRUE;
20097270962aSWarner Losh } else {
20107270962aSWarner Losh IPv4->StaticIpAddress = FALSE;
20117270962aSWarner Losh }
20127270962aSWarner Losh
20137270962aSWarner Losh StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);
20147270962aSWarner Losh if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {
20157270962aSWarner Losh StrToIpv4Address (GatewayIPStr, NULL, &IPv4->GatewayIpAddress, NULL);
20167270962aSWarner Losh StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask, NULL);
20177270962aSWarner Losh } else {
20187270962aSWarner Losh ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));
20197270962aSWarner Losh ZeroMem (&IPv4->SubnetMask, sizeof (IPv4->SubnetMask));
20207270962aSWarner Losh }
20217270962aSWarner Losh
20227270962aSWarner Losh IPv4->LocalPort = 0;
20237270962aSWarner Losh IPv4->RemotePort = 0;
20247270962aSWarner Losh
20257270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)IPv4;
20267270962aSWarner Losh }
20277270962aSWarner Losh
20287270962aSWarner Losh /**
20297270962aSWarner Losh Converts a text device path node to IPV6 device path structure.
20307270962aSWarner Losh
20317270962aSWarner Losh @param TextDeviceNode The input Text device path node.
20327270962aSWarner Losh
20337270962aSWarner Losh @return A pointer to the newly-created IPV6 device path structure.
20347270962aSWarner Losh
20357270962aSWarner Losh **/
20367270962aSWarner Losh static
20377270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv6(IN CHAR16 * TextDeviceNode)20387270962aSWarner Losh DevPathFromTextIPv6 (
20397270962aSWarner Losh IN CHAR16 *TextDeviceNode
20407270962aSWarner Losh )
20417270962aSWarner Losh {
20427270962aSWarner Losh CHAR16 *RemoteIPStr;
20437270962aSWarner Losh CHAR16 *ProtocolStr;
20447270962aSWarner Losh CHAR16 *TypeStr;
20457270962aSWarner Losh CHAR16 *LocalIPStr;
20467270962aSWarner Losh CHAR16 *GatewayIPStr;
20477270962aSWarner Losh CHAR16 *PrefixLengthStr;
20487270962aSWarner Losh IPv6_DEVICE_PATH *IPv6;
20497270962aSWarner Losh
20507270962aSWarner Losh RemoteIPStr = GetNextParamStr (&TextDeviceNode);
20517270962aSWarner Losh ProtocolStr = GetNextParamStr (&TextDeviceNode);
20527270962aSWarner Losh TypeStr = GetNextParamStr (&TextDeviceNode);
20537270962aSWarner Losh LocalIPStr = GetNextParamStr (&TextDeviceNode);
20547270962aSWarner Losh PrefixLengthStr = GetNextParamStr (&TextDeviceNode);
20557270962aSWarner Losh GatewayIPStr = GetNextParamStr (&TextDeviceNode);
20567270962aSWarner Losh IPv6 = (IPv6_DEVICE_PATH *)CreateDeviceNode (
20577270962aSWarner Losh MESSAGING_DEVICE_PATH,
20587270962aSWarner Losh MSG_IPv6_DP,
20597270962aSWarner Losh (UINT16)sizeof (IPv6_DEVICE_PATH)
20607270962aSWarner Losh );
20617270962aSWarner Losh
20627270962aSWarner Losh StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);
20637270962aSWarner Losh IPv6->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
20647270962aSWarner Losh if (StrCmp (TypeStr, "Static") == 0) {
20657270962aSWarner Losh IPv6->IpAddressOrigin = 0;
20667270962aSWarner Losh } else if (StrCmp (TypeStr, "StatelessAutoConfigure") == 0) {
20677270962aSWarner Losh IPv6->IpAddressOrigin = 1;
20687270962aSWarner Losh } else {
20697270962aSWarner Losh IPv6->IpAddressOrigin = 2;
20707270962aSWarner Losh }
20717270962aSWarner Losh
20727270962aSWarner Losh StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);
20737270962aSWarner Losh if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {
20747270962aSWarner Losh StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);
20757270962aSWarner Losh IPv6->PrefixLength = (UINT8)Strtoi (PrefixLengthStr);
20767270962aSWarner Losh } else {
20777270962aSWarner Losh ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));
20787270962aSWarner Losh IPv6->PrefixLength = 0;
20797270962aSWarner Losh }
20807270962aSWarner Losh
20817270962aSWarner Losh IPv6->LocalPort = 0;
20827270962aSWarner Losh IPv6->RemotePort = 0;
20837270962aSWarner Losh
20847270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)IPv6;
20857270962aSWarner Losh }
20867270962aSWarner Losh
20877270962aSWarner Losh /**
20887270962aSWarner Losh Converts a text device path node to UART device path structure.
20897270962aSWarner Losh
20907270962aSWarner Losh @param TextDeviceNode The input Text device path node.
20917270962aSWarner Losh
20927270962aSWarner Losh @return A pointer to the newly-created UART device path structure.
20937270962aSWarner Losh
20947270962aSWarner Losh **/
20957270962aSWarner Losh static
20967270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUart(IN CHAR16 * TextDeviceNode)20977270962aSWarner Losh DevPathFromTextUart (
20987270962aSWarner Losh IN CHAR16 *TextDeviceNode
20997270962aSWarner Losh )
21007270962aSWarner Losh {
21017270962aSWarner Losh CHAR16 *BaudStr;
21027270962aSWarner Losh CHAR16 *DataBitsStr;
21037270962aSWarner Losh CHAR16 *ParityStr;
21047270962aSWarner Losh CHAR16 *StopBitsStr;
21057270962aSWarner Losh UART_DEVICE_PATH *Uart;
21067270962aSWarner Losh
21077270962aSWarner Losh BaudStr = GetNextParamStr (&TextDeviceNode);
21087270962aSWarner Losh DataBitsStr = GetNextParamStr (&TextDeviceNode);
21097270962aSWarner Losh ParityStr = GetNextParamStr (&TextDeviceNode);
21107270962aSWarner Losh StopBitsStr = GetNextParamStr (&TextDeviceNode);
21117270962aSWarner Losh Uart = (UART_DEVICE_PATH *)CreateDeviceNode (
21127270962aSWarner Losh MESSAGING_DEVICE_PATH,
21137270962aSWarner Losh MSG_UART_DP,
21147270962aSWarner Losh (UINT16)sizeof (UART_DEVICE_PATH)
21157270962aSWarner Losh );
21167270962aSWarner Losh
21177270962aSWarner Losh if (StrCmp (BaudStr, "DEFAULT") == 0) {
21187270962aSWarner Losh Uart->BaudRate = 115200;
21197270962aSWarner Losh } else {
21207270962aSWarner Losh Strtoi64 (BaudStr, &Uart->BaudRate);
21217270962aSWarner Losh }
21225754f582SJose Luis Duran
21237270962aSWarner Losh Uart->DataBits = (UINT8)((StrCmp (DataBitsStr, "DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
21247270962aSWarner Losh switch (*ParityStr) {
21257270962aSWarner Losh case 'D':
21267270962aSWarner Losh Uart->Parity = 0;
21277270962aSWarner Losh break;
21287270962aSWarner Losh
21297270962aSWarner Losh case 'N':
21307270962aSWarner Losh Uart->Parity = 1;
21317270962aSWarner Losh break;
21327270962aSWarner Losh
21337270962aSWarner Losh case 'E':
21347270962aSWarner Losh Uart->Parity = 2;
21357270962aSWarner Losh break;
21367270962aSWarner Losh
21377270962aSWarner Losh case 'O':
21387270962aSWarner Losh Uart->Parity = 3;
21397270962aSWarner Losh break;
21407270962aSWarner Losh
21417270962aSWarner Losh case 'M':
21427270962aSWarner Losh Uart->Parity = 4;
21437270962aSWarner Losh break;
21447270962aSWarner Losh
21457270962aSWarner Losh case 'S':
21467270962aSWarner Losh Uart->Parity = 5;
21477270962aSWarner Losh break;
21487270962aSWarner Losh
21497270962aSWarner Losh default:
21507270962aSWarner Losh Uart->Parity = (UINT8)Strtoi (ParityStr);
21517270962aSWarner Losh break;
21527270962aSWarner Losh }
21537270962aSWarner Losh
21547270962aSWarner Losh if (StrCmp (StopBitsStr, "D") == 0) {
21557270962aSWarner Losh Uart->StopBits = (UINT8)0;
21567270962aSWarner Losh } else if (StrCmp (StopBitsStr, "1") == 0) {
21577270962aSWarner Losh Uart->StopBits = (UINT8)1;
21587270962aSWarner Losh } else if (StrCmp (StopBitsStr, "1.5") == 0) {
21597270962aSWarner Losh Uart->StopBits = (UINT8)2;
21607270962aSWarner Losh } else if (StrCmp (StopBitsStr, "2") == 0) {
21617270962aSWarner Losh Uart->StopBits = (UINT8)3;
21627270962aSWarner Losh } else {
21637270962aSWarner Losh Uart->StopBits = (UINT8)Strtoi (StopBitsStr);
21647270962aSWarner Losh }
21657270962aSWarner Losh
21667270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Uart;
21677270962aSWarner Losh }
21687270962aSWarner Losh
21697270962aSWarner Losh /**
21707270962aSWarner Losh Converts a text device path node to USB class device path structure.
21717270962aSWarner Losh
21727270962aSWarner Losh @param TextDeviceNode The input Text device path node.
21737270962aSWarner Losh @param UsbClassText A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.
21747270962aSWarner Losh
21757270962aSWarner Losh @return A pointer to the newly-created USB class device path structure.
21767270962aSWarner Losh
21777270962aSWarner Losh **/
21787270962aSWarner Losh static
21797270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextUsbClass(IN CHAR16 * TextDeviceNode,IN USB_CLASS_TEXT * UsbClassText)21807270962aSWarner Losh ConvertFromTextUsbClass (
21817270962aSWarner Losh IN CHAR16 *TextDeviceNode,
21827270962aSWarner Losh IN USB_CLASS_TEXT *UsbClassText
21837270962aSWarner Losh )
21847270962aSWarner Losh {
21857270962aSWarner Losh CHAR16 *VIDStr;
21867270962aSWarner Losh CHAR16 *PIDStr;
21877270962aSWarner Losh CHAR16 *ClassStr;
21887270962aSWarner Losh CHAR16 *SubClassStr;
21897270962aSWarner Losh CHAR16 *ProtocolStr;
21907270962aSWarner Losh USB_CLASS_DEVICE_PATH *UsbClass;
21917270962aSWarner Losh
21927270962aSWarner Losh UsbClass = (USB_CLASS_DEVICE_PATH *)CreateDeviceNode (
21937270962aSWarner Losh MESSAGING_DEVICE_PATH,
21947270962aSWarner Losh MSG_USB_CLASS_DP,
21957270962aSWarner Losh (UINT16)sizeof (USB_CLASS_DEVICE_PATH)
21967270962aSWarner Losh );
21977270962aSWarner Losh
21987270962aSWarner Losh VIDStr = GetNextParamStr (&TextDeviceNode);
21997270962aSWarner Losh PIDStr = GetNextParamStr (&TextDeviceNode);
22007270962aSWarner Losh if (UsbClassText->ClassExist) {
22017270962aSWarner Losh ClassStr = GetNextParamStr (&TextDeviceNode);
2202965f8527SJose Luis Duran if (*ClassStr == '\0') {
2203965f8527SJose Luis Duran UsbClass->DeviceClass = 0xFF;
2204965f8527SJose Luis Duran } else {
22057270962aSWarner Losh UsbClass->DeviceClass = (UINT8)Strtoi (ClassStr);
2206965f8527SJose Luis Duran }
22077270962aSWarner Losh } else {
22087270962aSWarner Losh UsbClass->DeviceClass = UsbClassText->Class;
22097270962aSWarner Losh }
22105754f582SJose Luis Duran
22117270962aSWarner Losh if (UsbClassText->SubClassExist) {
22127270962aSWarner Losh SubClassStr = GetNextParamStr (&TextDeviceNode);
2213965f8527SJose Luis Duran if (*SubClassStr == '\0') {
2214965f8527SJose Luis Duran UsbClass->DeviceSubClass = 0xFF;
2215965f8527SJose Luis Duran } else {
22167270962aSWarner Losh UsbClass->DeviceSubClass = (UINT8)Strtoi (SubClassStr);
2217965f8527SJose Luis Duran }
22187270962aSWarner Losh } else {
22197270962aSWarner Losh UsbClass->DeviceSubClass = UsbClassText->SubClass;
22207270962aSWarner Losh }
22217270962aSWarner Losh
22227270962aSWarner Losh ProtocolStr = GetNextParamStr (&TextDeviceNode);
22237270962aSWarner Losh
2224965f8527SJose Luis Duran if (*VIDStr == '\0') {
2225965f8527SJose Luis Duran UsbClass->VendorId = 0xFFFF;
2226965f8527SJose Luis Duran } else {
22277270962aSWarner Losh UsbClass->VendorId = (UINT16)Strtoi (VIDStr);
2228965f8527SJose Luis Duran }
22295754f582SJose Luis Duran
2230965f8527SJose Luis Duran if (*PIDStr == '\0') {
2231965f8527SJose Luis Duran UsbClass->ProductId = 0xFFFF;
2232965f8527SJose Luis Duran } else {
22337270962aSWarner Losh UsbClass->ProductId = (UINT16)Strtoi (PIDStr);
2234965f8527SJose Luis Duran }
22355754f582SJose Luis Duran
2236965f8527SJose Luis Duran if (*ProtocolStr == '\0') {
2237965f8527SJose Luis Duran UsbClass->DeviceProtocol = 0xFF;
2238965f8527SJose Luis Duran } else {
22397270962aSWarner Losh UsbClass->DeviceProtocol = (UINT8)Strtoi (ProtocolStr);
2240965f8527SJose Luis Duran }
22417270962aSWarner Losh
22427270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)UsbClass;
22437270962aSWarner Losh }
22447270962aSWarner Losh
22457270962aSWarner Losh /**
22467270962aSWarner Losh Converts a text device path node to USB class device path structure.
22477270962aSWarner Losh
22487270962aSWarner Losh @param TextDeviceNode The input Text device path node.
22497270962aSWarner Losh
22507270962aSWarner Losh @return A pointer to the newly-created USB class device path structure.
22517270962aSWarner Losh
22527270962aSWarner Losh **/
22537270962aSWarner Losh static
22547270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbClass(IN CHAR16 * TextDeviceNode)22557270962aSWarner Losh DevPathFromTextUsbClass (
22567270962aSWarner Losh IN CHAR16 *TextDeviceNode
22577270962aSWarner Losh )
22587270962aSWarner Losh {
22597270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
22607270962aSWarner Losh
22617270962aSWarner Losh UsbClassText.ClassExist = TRUE;
22627270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
22637270962aSWarner Losh
22647270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
22657270962aSWarner Losh }
22667270962aSWarner Losh
22677270962aSWarner Losh /**
22687270962aSWarner Losh Converts a text device path node to USB audio device path structure.
22697270962aSWarner Losh
22707270962aSWarner Losh @param TextDeviceNode The input Text device path node.
22717270962aSWarner Losh
22727270962aSWarner Losh @return A pointer to the newly-created USB audio device path structure.
22737270962aSWarner Losh
22747270962aSWarner Losh **/
22757270962aSWarner Losh static
22767270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbAudio(IN CHAR16 * TextDeviceNode)22777270962aSWarner Losh DevPathFromTextUsbAudio (
22787270962aSWarner Losh IN CHAR16 *TextDeviceNode
22797270962aSWarner Losh )
22807270962aSWarner Losh {
22817270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
22827270962aSWarner Losh
22837270962aSWarner Losh UsbClassText.ClassExist = FALSE;
22847270962aSWarner Losh UsbClassText.Class = USB_CLASS_AUDIO;
22857270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
22867270962aSWarner Losh
22877270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
22887270962aSWarner Losh }
22897270962aSWarner Losh
22907270962aSWarner Losh /**
22917270962aSWarner Losh Converts a text device path node to USB CDC Control device path structure.
22927270962aSWarner Losh
22937270962aSWarner Losh @param TextDeviceNode The input Text device path node.
22947270962aSWarner Losh
22957270962aSWarner Losh @return A pointer to the newly-created USB CDC Control device path structure.
22967270962aSWarner Losh
22977270962aSWarner Losh **/
22987270962aSWarner Losh static
22997270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCControl(IN CHAR16 * TextDeviceNode)23007270962aSWarner Losh DevPathFromTextUsbCDCControl (
23017270962aSWarner Losh IN CHAR16 *TextDeviceNode
23027270962aSWarner Losh )
23037270962aSWarner Losh {
23047270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
23057270962aSWarner Losh
23067270962aSWarner Losh UsbClassText.ClassExist = FALSE;
23077270962aSWarner Losh UsbClassText.Class = USB_CLASS_CDCCONTROL;
23087270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
23097270962aSWarner Losh
23107270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23117270962aSWarner Losh }
23127270962aSWarner Losh
23137270962aSWarner Losh /**
23147270962aSWarner Losh Converts a text device path node to USB HID device path structure.
23157270962aSWarner Losh
23167270962aSWarner Losh @param TextDeviceNode The input Text device path node.
23177270962aSWarner Losh
23187270962aSWarner Losh @return A pointer to the newly-created USB HID device path structure.
23197270962aSWarner Losh
23207270962aSWarner Losh **/
23217270962aSWarner Losh static
23227270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHID(IN CHAR16 * TextDeviceNode)23237270962aSWarner Losh DevPathFromTextUsbHID (
23247270962aSWarner Losh IN CHAR16 *TextDeviceNode
23257270962aSWarner Losh )
23267270962aSWarner Losh {
23277270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
23287270962aSWarner Losh
23297270962aSWarner Losh UsbClassText.ClassExist = FALSE;
23307270962aSWarner Losh UsbClassText.Class = USB_CLASS_HID;
23317270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
23327270962aSWarner Losh
23337270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23347270962aSWarner Losh }
23357270962aSWarner Losh
23367270962aSWarner Losh /**
23377270962aSWarner Losh Converts a text device path node to USB Image device path structure.
23387270962aSWarner Losh
23397270962aSWarner Losh @param TextDeviceNode The input Text device path node.
23407270962aSWarner Losh
23417270962aSWarner Losh @return A pointer to the newly-created USB Image device path structure.
23427270962aSWarner Losh
23437270962aSWarner Losh **/
23447270962aSWarner Losh static
23457270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbImage(IN CHAR16 * TextDeviceNode)23467270962aSWarner Losh DevPathFromTextUsbImage (
23477270962aSWarner Losh IN CHAR16 *TextDeviceNode
23487270962aSWarner Losh )
23497270962aSWarner Losh {
23507270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
23517270962aSWarner Losh
23527270962aSWarner Losh UsbClassText.ClassExist = FALSE;
23537270962aSWarner Losh UsbClassText.Class = USB_CLASS_IMAGE;
23547270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
23557270962aSWarner Losh
23567270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23577270962aSWarner Losh }
23587270962aSWarner Losh
23597270962aSWarner Losh /**
23607270962aSWarner Losh Converts a text device path node to USB Print device path structure.
23617270962aSWarner Losh
23627270962aSWarner Losh @param TextDeviceNode The input Text device path node.
23637270962aSWarner Losh
23647270962aSWarner Losh @return A pointer to the newly-created USB Print device path structure.
23657270962aSWarner Losh
23667270962aSWarner Losh **/
23677270962aSWarner Losh static
23687270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbPrinter(IN CHAR16 * TextDeviceNode)23697270962aSWarner Losh DevPathFromTextUsbPrinter (
23707270962aSWarner Losh IN CHAR16 *TextDeviceNode
23717270962aSWarner Losh )
23727270962aSWarner Losh {
23737270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
23747270962aSWarner Losh
23757270962aSWarner Losh UsbClassText.ClassExist = FALSE;
23767270962aSWarner Losh UsbClassText.Class = USB_CLASS_PRINTER;
23777270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
23787270962aSWarner Losh
23797270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23807270962aSWarner Losh }
23817270962aSWarner Losh
23827270962aSWarner Losh /**
23837270962aSWarner Losh Converts a text device path node to USB mass storage device path structure.
23847270962aSWarner Losh
23857270962aSWarner Losh @param TextDeviceNode The input Text device path node.
23867270962aSWarner Losh
23877270962aSWarner Losh @return A pointer to the newly-created USB mass storage device path structure.
23887270962aSWarner Losh
23897270962aSWarner Losh **/
23907270962aSWarner Losh static
23917270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbMassStorage(IN CHAR16 * TextDeviceNode)23927270962aSWarner Losh DevPathFromTextUsbMassStorage (
23937270962aSWarner Losh IN CHAR16 *TextDeviceNode
23947270962aSWarner Losh )
23957270962aSWarner Losh {
23967270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
23977270962aSWarner Losh
23987270962aSWarner Losh UsbClassText.ClassExist = FALSE;
23997270962aSWarner Losh UsbClassText.Class = USB_CLASS_MASS_STORAGE;
24007270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
24017270962aSWarner Losh
24027270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24037270962aSWarner Losh }
24047270962aSWarner Losh
24057270962aSWarner Losh /**
24067270962aSWarner Losh Converts a text device path node to USB HUB device path structure.
24077270962aSWarner Losh
24087270962aSWarner Losh @param TextDeviceNode The input Text device path node.
24097270962aSWarner Losh
24107270962aSWarner Losh @return A pointer to the newly-created USB HUB device path structure.
24117270962aSWarner Losh
24127270962aSWarner Losh **/
24137270962aSWarner Losh static
24147270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHub(IN CHAR16 * TextDeviceNode)24157270962aSWarner Losh DevPathFromTextUsbHub (
24167270962aSWarner Losh IN CHAR16 *TextDeviceNode
24177270962aSWarner Losh )
24187270962aSWarner Losh {
24197270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
24207270962aSWarner Losh
24217270962aSWarner Losh UsbClassText.ClassExist = FALSE;
24227270962aSWarner Losh UsbClassText.Class = USB_CLASS_HUB;
24237270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
24247270962aSWarner Losh
24257270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24267270962aSWarner Losh }
24277270962aSWarner Losh
24287270962aSWarner Losh /**
24297270962aSWarner Losh Converts a text device path node to USB CDC data device path structure.
24307270962aSWarner Losh
24317270962aSWarner Losh @param TextDeviceNode The input Text device path node.
24327270962aSWarner Losh
24337270962aSWarner Losh @return A pointer to the newly-created USB CDC data device path structure.
24347270962aSWarner Losh
24357270962aSWarner Losh **/
24367270962aSWarner Losh static
24377270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCData(IN CHAR16 * TextDeviceNode)24387270962aSWarner Losh DevPathFromTextUsbCDCData (
24397270962aSWarner Losh IN CHAR16 *TextDeviceNode
24407270962aSWarner Losh )
24417270962aSWarner Losh {
24427270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
24437270962aSWarner Losh
24447270962aSWarner Losh UsbClassText.ClassExist = FALSE;
24457270962aSWarner Losh UsbClassText.Class = USB_CLASS_CDCDATA;
24467270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
24477270962aSWarner Losh
24487270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24497270962aSWarner Losh }
24507270962aSWarner Losh
24517270962aSWarner Losh /**
24527270962aSWarner Losh Converts a text device path node to USB smart card device path structure.
24537270962aSWarner Losh
24547270962aSWarner Losh @param TextDeviceNode The input Text device path node.
24557270962aSWarner Losh
24567270962aSWarner Losh @return A pointer to the newly-created USB smart card device path structure.
24577270962aSWarner Losh
24587270962aSWarner Losh **/
24597270962aSWarner Losh static
24607270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbSmartCard(IN CHAR16 * TextDeviceNode)24617270962aSWarner Losh DevPathFromTextUsbSmartCard (
24627270962aSWarner Losh IN CHAR16 *TextDeviceNode
24637270962aSWarner Losh )
24647270962aSWarner Losh {
24657270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
24667270962aSWarner Losh
24677270962aSWarner Losh UsbClassText.ClassExist = FALSE;
24687270962aSWarner Losh UsbClassText.Class = USB_CLASS_SMART_CARD;
24697270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
24707270962aSWarner Losh
24717270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24727270962aSWarner Losh }
24737270962aSWarner Losh
24747270962aSWarner Losh /**
24757270962aSWarner Losh Converts a text device path node to USB video device path structure.
24767270962aSWarner Losh
24777270962aSWarner Losh @param TextDeviceNode The input Text device path node.
24787270962aSWarner Losh
24797270962aSWarner Losh @return A pointer to the newly-created USB video device path structure.
24807270962aSWarner Losh
24817270962aSWarner Losh **/
24827270962aSWarner Losh static
24837270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbVideo(IN CHAR16 * TextDeviceNode)24847270962aSWarner Losh DevPathFromTextUsbVideo (
24857270962aSWarner Losh IN CHAR16 *TextDeviceNode
24867270962aSWarner Losh )
24877270962aSWarner Losh {
24887270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
24897270962aSWarner Losh
24907270962aSWarner Losh UsbClassText.ClassExist = FALSE;
24917270962aSWarner Losh UsbClassText.Class = USB_CLASS_VIDEO;
24927270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
24937270962aSWarner Losh
24947270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24957270962aSWarner Losh }
24967270962aSWarner Losh
24977270962aSWarner Losh /**
24987270962aSWarner Losh Converts a text device path node to USB diagnostic device path structure.
24997270962aSWarner Losh
25007270962aSWarner Losh @param TextDeviceNode The input Text device path node.
25017270962aSWarner Losh
25027270962aSWarner Losh @return A pointer to the newly-created USB diagnostic device path structure.
25037270962aSWarner Losh
25047270962aSWarner Losh **/
25057270962aSWarner Losh static
25067270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDiagnostic(IN CHAR16 * TextDeviceNode)25077270962aSWarner Losh DevPathFromTextUsbDiagnostic (
25087270962aSWarner Losh IN CHAR16 *TextDeviceNode
25097270962aSWarner Losh )
25107270962aSWarner Losh {
25117270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
25127270962aSWarner Losh
25137270962aSWarner Losh UsbClassText.ClassExist = FALSE;
25147270962aSWarner Losh UsbClassText.Class = USB_CLASS_DIAGNOSTIC;
25157270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
25167270962aSWarner Losh
25177270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25187270962aSWarner Losh }
25197270962aSWarner Losh
25207270962aSWarner Losh /**
25217270962aSWarner Losh Converts a text device path node to USB wireless device path structure.
25227270962aSWarner Losh
25237270962aSWarner Losh @param TextDeviceNode The input Text device path node.
25247270962aSWarner Losh
25257270962aSWarner Losh @return A pointer to the newly-created USB wireless device path structure.
25267270962aSWarner Losh
25277270962aSWarner Losh **/
25287270962aSWarner Losh static
25297270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWireless(IN CHAR16 * TextDeviceNode)25307270962aSWarner Losh DevPathFromTextUsbWireless (
25317270962aSWarner Losh IN CHAR16 *TextDeviceNode
25327270962aSWarner Losh )
25337270962aSWarner Losh {
25347270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
25357270962aSWarner Losh
25367270962aSWarner Losh UsbClassText.ClassExist = FALSE;
25377270962aSWarner Losh UsbClassText.Class = USB_CLASS_WIRELESS;
25387270962aSWarner Losh UsbClassText.SubClassExist = TRUE;
25397270962aSWarner Losh
25407270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25417270962aSWarner Losh }
25427270962aSWarner Losh
25437270962aSWarner Losh /**
25447270962aSWarner Losh Converts a text device path node to USB device firmware update device path structure.
25457270962aSWarner Losh
25467270962aSWarner Losh @param TextDeviceNode The input Text device path node.
25477270962aSWarner Losh
25487270962aSWarner Losh @return A pointer to the newly-created USB device firmware update device path structure.
25497270962aSWarner Losh
25507270962aSWarner Losh **/
25517270962aSWarner Losh static
25527270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDeviceFirmwareUpdate(IN CHAR16 * TextDeviceNode)25537270962aSWarner Losh DevPathFromTextUsbDeviceFirmwareUpdate (
25547270962aSWarner Losh IN CHAR16 *TextDeviceNode
25557270962aSWarner Losh )
25567270962aSWarner Losh {
25577270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
25587270962aSWarner Losh
25597270962aSWarner Losh UsbClassText.ClassExist = FALSE;
25607270962aSWarner Losh UsbClassText.Class = USB_CLASS_RESERVE;
25617270962aSWarner Losh UsbClassText.SubClassExist = FALSE;
25627270962aSWarner Losh UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;
25637270962aSWarner Losh
25647270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25657270962aSWarner Losh }
25667270962aSWarner Losh
25677270962aSWarner Losh /**
25687270962aSWarner Losh Converts a text device path node to USB IRDA bridge device path structure.
25697270962aSWarner Losh
25707270962aSWarner Losh @param TextDeviceNode The input Text device path node.
25717270962aSWarner Losh
25727270962aSWarner Losh @return A pointer to the newly-created USB IRDA bridge device path structure.
25737270962aSWarner Losh
25747270962aSWarner Losh **/
25757270962aSWarner Losh static
25767270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbIrdaBridge(IN CHAR16 * TextDeviceNode)25777270962aSWarner Losh DevPathFromTextUsbIrdaBridge (
25787270962aSWarner Losh IN CHAR16 *TextDeviceNode
25797270962aSWarner Losh )
25807270962aSWarner Losh {
25817270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
25827270962aSWarner Losh
25837270962aSWarner Losh UsbClassText.ClassExist = FALSE;
25847270962aSWarner Losh UsbClassText.Class = USB_CLASS_RESERVE;
25857270962aSWarner Losh UsbClassText.SubClassExist = FALSE;
25867270962aSWarner Losh UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;
25877270962aSWarner Losh
25887270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25897270962aSWarner Losh }
25907270962aSWarner Losh
25917270962aSWarner Losh /**
25927270962aSWarner Losh Converts a text device path node to USB text and measurement device path structure.
25937270962aSWarner Losh
25947270962aSWarner Losh @param TextDeviceNode The input Text device path node.
25957270962aSWarner Losh
25967270962aSWarner Losh @return A pointer to the newly-created USB text and measurement device path structure.
25977270962aSWarner Losh
25987270962aSWarner Losh **/
25997270962aSWarner Losh static
26007270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbTestAndMeasurement(IN CHAR16 * TextDeviceNode)26017270962aSWarner Losh DevPathFromTextUsbTestAndMeasurement (
26027270962aSWarner Losh IN CHAR16 *TextDeviceNode
26037270962aSWarner Losh )
26047270962aSWarner Losh {
26057270962aSWarner Losh USB_CLASS_TEXT UsbClassText;
26067270962aSWarner Losh
26077270962aSWarner Losh UsbClassText.ClassExist = FALSE;
26087270962aSWarner Losh UsbClassText.Class = USB_CLASS_RESERVE;
26097270962aSWarner Losh UsbClassText.SubClassExist = FALSE;
26107270962aSWarner Losh UsbClassText.SubClass = USB_SUBCLASS_TEST;
26117270962aSWarner Losh
26127270962aSWarner Losh return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
26137270962aSWarner Losh }
26147270962aSWarner Losh
26157270962aSWarner Losh /**
26167270962aSWarner Losh Converts a text device path node to USB WWID device path structure.
26177270962aSWarner Losh
26187270962aSWarner Losh @param TextDeviceNode The input Text device path node.
26197270962aSWarner Losh
26207270962aSWarner Losh @return A pointer to the newly-created USB WWID device path structure.
26217270962aSWarner Losh
26227270962aSWarner Losh **/
26237270962aSWarner Losh static
26247270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWwid(IN CHAR16 * TextDeviceNode)26257270962aSWarner Losh DevPathFromTextUsbWwid (
26267270962aSWarner Losh IN CHAR16 *TextDeviceNode
26277270962aSWarner Losh )
26287270962aSWarner Losh {
26297270962aSWarner Losh CHAR16 *VIDStr;
26307270962aSWarner Losh CHAR16 *PIDStr;
26317270962aSWarner Losh CHAR16 *InterfaceNumStr;
26327270962aSWarner Losh CHAR16 *SerialNumberStr;
26337270962aSWarner Losh USB_WWID_DEVICE_PATH *UsbWwid;
26347270962aSWarner Losh UINTN SerialNumberStrLen;
26357270962aSWarner Losh
26367270962aSWarner Losh VIDStr = GetNextParamStr (&TextDeviceNode);
26377270962aSWarner Losh PIDStr = GetNextParamStr (&TextDeviceNode);
26387270962aSWarner Losh InterfaceNumStr = GetNextParamStr (&TextDeviceNode);
26397270962aSWarner Losh SerialNumberStr = GetNextParamStr (&TextDeviceNode);
26407270962aSWarner Losh SerialNumberStrLen = StrLen (SerialNumberStr);
26415754f582SJose Luis Duran if ((SerialNumberStrLen >= 2) &&
26425754f582SJose Luis Duran (SerialNumberStr[0] == '\"') &&
26435754f582SJose Luis Duran (SerialNumberStr[SerialNumberStrLen - 1] == '\"')
26445754f582SJose Luis Duran )
26455754f582SJose Luis Duran {
26467270962aSWarner Losh SerialNumberStr[SerialNumberStrLen - 1] = '\0';
26477270962aSWarner Losh SerialNumberStr++;
26487270962aSWarner Losh SerialNumberStrLen -= 2;
26497270962aSWarner Losh }
26505754f582SJose Luis Duran
26517270962aSWarner Losh UsbWwid = (USB_WWID_DEVICE_PATH *)CreateDeviceNode (
26527270962aSWarner Losh MESSAGING_DEVICE_PATH,
26537270962aSWarner Losh MSG_USB_WWID_DP,
26547270962aSWarner Losh (UINT16)(sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
26557270962aSWarner Losh );
26567270962aSWarner Losh UsbWwid->VendorId = (UINT16)Strtoi (VIDStr);
26577270962aSWarner Losh UsbWwid->ProductId = (UINT16)Strtoi (PIDStr);
26587270962aSWarner Losh UsbWwid->InterfaceNumber = (UINT16)Strtoi (InterfaceNumStr);
26597270962aSWarner Losh
26607270962aSWarner Losh //
26617270962aSWarner Losh // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.
26627270962aSWarner Losh // Therefore, the '\0' will not be copied.
26637270962aSWarner Losh //
26647270962aSWarner Losh CopyMem (
26657270962aSWarner Losh (UINT8 *)UsbWwid + sizeof (USB_WWID_DEVICE_PATH),
26667270962aSWarner Losh SerialNumberStr,
26677270962aSWarner Losh SerialNumberStrLen * sizeof (CHAR16)
26687270962aSWarner Losh );
26697270962aSWarner Losh
26707270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)UsbWwid;
26717270962aSWarner Losh }
26727270962aSWarner Losh
26737270962aSWarner Losh /**
26747270962aSWarner Losh Converts a text device path node to Logic Unit device path structure.
26757270962aSWarner Losh
26767270962aSWarner Losh @param TextDeviceNode The input Text device path node.
26777270962aSWarner Losh
26787270962aSWarner Losh @return A pointer to the newly-created Logic Unit device path structure.
26797270962aSWarner Losh
26807270962aSWarner Losh **/
26817270962aSWarner Losh static
26827270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUnit(IN CHAR16 * TextDeviceNode)26837270962aSWarner Losh DevPathFromTextUnit (
26847270962aSWarner Losh IN CHAR16 *TextDeviceNode
26857270962aSWarner Losh )
26867270962aSWarner Losh {
26877270962aSWarner Losh CHAR16 *LunStr;
26887270962aSWarner Losh DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
26897270962aSWarner Losh
26907270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
26917270962aSWarner Losh LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *)CreateDeviceNode (
26927270962aSWarner Losh MESSAGING_DEVICE_PATH,
26937270962aSWarner Losh MSG_DEVICE_LOGICAL_UNIT_DP,
26947270962aSWarner Losh (UINT16)sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
26957270962aSWarner Losh );
26967270962aSWarner Losh
26977270962aSWarner Losh LogicalUnit->Lun = (UINT8)Strtoi (LunStr);
26987270962aSWarner Losh
26997270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)LogicalUnit;
27007270962aSWarner Losh }
27017270962aSWarner Losh
27027270962aSWarner Losh /**
27037270962aSWarner Losh Converts a text device path node to iSCSI device path structure.
27047270962aSWarner Losh
27057270962aSWarner Losh @param TextDeviceNode The input Text device path node.
27067270962aSWarner Losh
27077270962aSWarner Losh @return A pointer to the newly-created iSCSI device path structure.
27087270962aSWarner Losh
27097270962aSWarner Losh **/
27107270962aSWarner Losh static
27117270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextiSCSI(IN CHAR16 * TextDeviceNode)27127270962aSWarner Losh DevPathFromTextiSCSI (
27137270962aSWarner Losh IN CHAR16 *TextDeviceNode
27147270962aSWarner Losh )
27157270962aSWarner Losh {
27167270962aSWarner Losh UINT16 Options;
27177270962aSWarner Losh CHAR16 *NameStr;
27187270962aSWarner Losh CHAR16 *PortalGroupStr;
27197270962aSWarner Losh CHAR16 *LunStr;
27207270962aSWarner Losh CHAR16 *HeaderDigestStr;
27217270962aSWarner Losh CHAR16 *DataDigestStr;
27227270962aSWarner Losh CHAR16 *AuthenticationStr;
27237270962aSWarner Losh CHAR16 *ProtocolStr;
27247270962aSWarner Losh CHAR8 *AsciiStr;
27257270962aSWarner Losh ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;
2726acfee013SJose Luis Duran UINT64 Lun;
27277270962aSWarner Losh
27287270962aSWarner Losh NameStr = GetNextParamStr (&TextDeviceNode);
27297270962aSWarner Losh PortalGroupStr = GetNextParamStr (&TextDeviceNode);
27307270962aSWarner Losh LunStr = GetNextParamStr (&TextDeviceNode);
27317270962aSWarner Losh HeaderDigestStr = GetNextParamStr (&TextDeviceNode);
27327270962aSWarner Losh DataDigestStr = GetNextParamStr (&TextDeviceNode);
27337270962aSWarner Losh AuthenticationStr = GetNextParamStr (&TextDeviceNode);
27347270962aSWarner Losh ProtocolStr = GetNextParamStr (&TextDeviceNode);
27357270962aSWarner Losh ISCSIDevPath = (ISCSI_DEVICE_PATH_WITH_NAME *)CreateDeviceNode (
27367270962aSWarner Losh MESSAGING_DEVICE_PATH,
27377270962aSWarner Losh MSG_ISCSI_DP,
27387270962aSWarner Losh (UINT16)(sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))
27397270962aSWarner Losh );
27407270962aSWarner Losh
27417270962aSWarner Losh AsciiStr = ISCSIDevPath->TargetName;
27427270962aSWarner Losh StrToAscii (NameStr, &AsciiStr);
27437270962aSWarner Losh
27447270962aSWarner Losh ISCSIDevPath->TargetPortalGroupTag = (UINT16)Strtoi (PortalGroupStr);
2745acfee013SJose Luis Duran Strtoi64 (LunStr, &Lun);
2746acfee013SJose Luis Duran WriteUnaligned64 ((UINT64 *)&ISCSIDevPath->Lun, SwapBytes64 (Lun));
27477270962aSWarner Losh
27487270962aSWarner Losh Options = 0x0000;
27497270962aSWarner Losh if (StrCmp (HeaderDigestStr, "CRC32C") == 0) {
27507270962aSWarner Losh Options |= 0x0002;
27517270962aSWarner Losh }
27527270962aSWarner Losh
27537270962aSWarner Losh if (StrCmp (DataDigestStr, "CRC32C") == 0) {
27547270962aSWarner Losh Options |= 0x0008;
27557270962aSWarner Losh }
27567270962aSWarner Losh
27577270962aSWarner Losh if (StrCmp (AuthenticationStr, "None") == 0) {
27587270962aSWarner Losh Options |= 0x0800;
27597270962aSWarner Losh }
27607270962aSWarner Losh
27617270962aSWarner Losh if (StrCmp (AuthenticationStr, "CHAP_UNI") == 0) {
27627270962aSWarner Losh Options |= 0x1000;
27637270962aSWarner Losh }
27647270962aSWarner Losh
27657270962aSWarner Losh ISCSIDevPath->LoginOption = (UINT16)Options;
27667270962aSWarner Losh
276776ed5f1bSJose Luis Duran if (IS_NULL (*ProtocolStr) || (StrCmp (ProtocolStr, "TCP") == 0)) {
27687ca6daffSJose Luis Duran ISCSIDevPath->NetworkProtocol = 0;
27697ca6daffSJose Luis Duran } else {
27707ca6daffSJose Luis Duran //
27717ca6daffSJose Luis Duran // Undefined and reserved.
27727ca6daffSJose Luis Duran //
27737ca6daffSJose Luis Duran ISCSIDevPath->NetworkProtocol = 1;
27747ca6daffSJose Luis Duran }
27757270962aSWarner Losh
27767270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)ISCSIDevPath;
27777270962aSWarner Losh }
27787270962aSWarner Losh
27797270962aSWarner Losh /**
27807270962aSWarner Losh Converts a text device path node to VLAN device path structure.
27817270962aSWarner Losh
27827270962aSWarner Losh @param TextDeviceNode The input Text device path node.
27837270962aSWarner Losh
27847270962aSWarner Losh @return A pointer to the newly-created VLAN device path structure.
27857270962aSWarner Losh
27867270962aSWarner Losh **/
27877270962aSWarner Losh static
27887270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVlan(IN CHAR16 * TextDeviceNode)27897270962aSWarner Losh DevPathFromTextVlan (
27907270962aSWarner Losh IN CHAR16 *TextDeviceNode
27917270962aSWarner Losh )
27927270962aSWarner Losh {
27937270962aSWarner Losh CHAR16 *VlanStr;
27947270962aSWarner Losh VLAN_DEVICE_PATH *Vlan;
27957270962aSWarner Losh
27967270962aSWarner Losh VlanStr = GetNextParamStr (&TextDeviceNode);
27977270962aSWarner Losh Vlan = (VLAN_DEVICE_PATH *)CreateDeviceNode (
27987270962aSWarner Losh MESSAGING_DEVICE_PATH,
27997270962aSWarner Losh MSG_VLAN_DP,
28007270962aSWarner Losh (UINT16)sizeof (VLAN_DEVICE_PATH)
28017270962aSWarner Losh );
28027270962aSWarner Losh
28037270962aSWarner Losh Vlan->VlanId = (UINT16)Strtoi (VlanStr);
28047270962aSWarner Losh
28057270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Vlan;
28067270962aSWarner Losh }
28077270962aSWarner Losh
28087270962aSWarner Losh /**
28097270962aSWarner Losh Converts a text device path node to Bluetooth device path structure.
28107270962aSWarner Losh
28117270962aSWarner Losh @param TextDeviceNode The input Text device path node.
28127270962aSWarner Losh
28137270962aSWarner Losh @return A pointer to the newly-created Bluetooth device path structure.
28147270962aSWarner Losh
28157270962aSWarner Losh **/
28167270962aSWarner Losh static
28177270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBluetooth(IN CHAR16 * TextDeviceNode)28187270962aSWarner Losh DevPathFromTextBluetooth (
28197270962aSWarner Losh IN CHAR16 *TextDeviceNode
28207270962aSWarner Losh )
28217270962aSWarner Losh {
28227270962aSWarner Losh CHAR16 *BluetoothStr;
28237270962aSWarner Losh BLUETOOTH_DEVICE_PATH *BluetoothDp;
28247270962aSWarner Losh
28257270962aSWarner Losh BluetoothStr = GetNextParamStr (&TextDeviceNode);
28267270962aSWarner Losh BluetoothDp = (BLUETOOTH_DEVICE_PATH *)CreateDeviceNode (
28277270962aSWarner Losh MESSAGING_DEVICE_PATH,
28287270962aSWarner Losh MSG_BLUETOOTH_DP,
28297270962aSWarner Losh (UINT16)sizeof (BLUETOOTH_DEVICE_PATH)
28307270962aSWarner Losh );
283100816383SJose Luis Duran StrHexToBytes (
283200816383SJose Luis Duran BluetoothStr,
283300816383SJose Luis Duran sizeof (BLUETOOTH_ADDRESS) * 2,
283400816383SJose Luis Duran BluetoothDp->BD_ADDR.Address,
283500816383SJose Luis Duran sizeof (BLUETOOTH_ADDRESS)
283600816383SJose Luis Duran );
28377270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothDp;
28387270962aSWarner Losh }
28397270962aSWarner Losh
28407270962aSWarner Losh /**
28417270962aSWarner Losh Converts a text device path node to Wi-Fi device path structure.
28427270962aSWarner Losh
28437270962aSWarner Losh @param TextDeviceNode The input Text device path node.
28447270962aSWarner Losh
28457270962aSWarner Losh @return A pointer to the newly-created Wi-Fi device path structure.
28467270962aSWarner Losh
28477270962aSWarner Losh **/
28487270962aSWarner Losh static
28497270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextWiFi(IN CHAR16 * TextDeviceNode)28507270962aSWarner Losh DevPathFromTextWiFi (
28517270962aSWarner Losh IN CHAR16 *TextDeviceNode
28527270962aSWarner Losh )
28537270962aSWarner Losh {
28547270962aSWarner Losh CHAR16 *SSIdStr;
28557270962aSWarner Losh CHAR8 AsciiStr[33];
28567270962aSWarner Losh UINTN DataLen;
28577270962aSWarner Losh WIFI_DEVICE_PATH *WiFiDp;
28587270962aSWarner Losh
28597270962aSWarner Losh SSIdStr = GetNextParamStr (&TextDeviceNode);
28607270962aSWarner Losh WiFiDp = (WIFI_DEVICE_PATH *)CreateDeviceNode (
28617270962aSWarner Losh MESSAGING_DEVICE_PATH,
28627270962aSWarner Losh MSG_WIFI_DP,
28637270962aSWarner Losh (UINT16)sizeof (WIFI_DEVICE_PATH)
28647270962aSWarner Losh );
28657270962aSWarner Losh
28667270962aSWarner Losh if (NULL != SSIdStr) {
28677270962aSWarner Losh DataLen = StrLen (SSIdStr);
28687270962aSWarner Losh if (StrLen (SSIdStr) > 32) {
28697270962aSWarner Losh SSIdStr[32] = '\0';
28707270962aSWarner Losh DataLen = 32;
28717270962aSWarner Losh }
28727270962aSWarner Losh
28737270962aSWarner Losh UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));
28747270962aSWarner Losh CopyMem (WiFiDp->SSId, AsciiStr, DataLen);
28757270962aSWarner Losh }
28767270962aSWarner Losh
28777270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)WiFiDp;
28787270962aSWarner Losh }
28797270962aSWarner Losh
28807270962aSWarner Losh /**
2881e8fc7f11SJose Luis Duran Converts a text device path node to Bluetooth LE device path structure.
2882e8fc7f11SJose Luis Duran
2883e8fc7f11SJose Luis Duran @param TextDeviceNode The input Text device path node.
2884e8fc7f11SJose Luis Duran
2885e8fc7f11SJose Luis Duran @return A pointer to the newly-created Bluetooth LE device path structure.
2886e8fc7f11SJose Luis Duran
2887e8fc7f11SJose Luis Duran **/
2888e8fc7f11SJose Luis Duran static
2889e8fc7f11SJose Luis Duran EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBluetoothLE(IN CHAR16 * TextDeviceNode)2890e8fc7f11SJose Luis Duran DevPathFromTextBluetoothLE (
2891e8fc7f11SJose Luis Duran IN CHAR16 *TextDeviceNode
2892e8fc7f11SJose Luis Duran )
2893e8fc7f11SJose Luis Duran {
2894e8fc7f11SJose Luis Duran CHAR16 *BluetoothLeAddrStr;
2895e8fc7f11SJose Luis Duran CHAR16 *BluetoothLeAddrTypeStr;
2896e8fc7f11SJose Luis Duran BLUETOOTH_LE_DEVICE_PATH *BluetoothLeDp;
2897e8fc7f11SJose Luis Duran
2898e8fc7f11SJose Luis Duran BluetoothLeAddrStr = GetNextParamStr (&TextDeviceNode);
2899e8fc7f11SJose Luis Duran BluetoothLeAddrTypeStr = GetNextParamStr (&TextDeviceNode);
2900e8fc7f11SJose Luis Duran BluetoothLeDp = (BLUETOOTH_LE_DEVICE_PATH *)CreateDeviceNode (
2901e8fc7f11SJose Luis Duran MESSAGING_DEVICE_PATH,
2902e8fc7f11SJose Luis Duran MSG_BLUETOOTH_LE_DP,
2903e8fc7f11SJose Luis Duran (UINT16)sizeof (BLUETOOTH_LE_DEVICE_PATH)
2904e8fc7f11SJose Luis Duran );
2905e8fc7f11SJose Luis Duran
2906e8fc7f11SJose Luis Duran BluetoothLeDp->Address.Type = (UINT8)Strtoi (BluetoothLeAddrTypeStr);
2907e8fc7f11SJose Luis Duran StrHexToBytes (
29085754f582SJose Luis Duran BluetoothLeAddrStr,
29095754f582SJose Luis Duran sizeof (BluetoothLeDp->Address.Address) * 2,
29105754f582SJose Luis Duran BluetoothLeDp->Address.Address,
29115754f582SJose Luis Duran sizeof (BluetoothLeDp->Address.Address)
2912e8fc7f11SJose Luis Duran );
2913e8fc7f11SJose Luis Duran return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothLeDp;
2914e8fc7f11SJose Luis Duran }
2915e8fc7f11SJose Luis Duran
2916e8fc7f11SJose Luis Duran /**
2917d9d1a1e7SJose Luis Duran Converts a text device path node to DNS device path structure.
2918d9d1a1e7SJose Luis Duran
2919d9d1a1e7SJose Luis Duran @param TextDeviceNode The input Text device path node.
2920d9d1a1e7SJose Luis Duran
2921d9d1a1e7SJose Luis Duran @return A pointer to the newly-created DNS device path structure.
2922d9d1a1e7SJose Luis Duran
2923d9d1a1e7SJose Luis Duran **/
2924d9d1a1e7SJose Luis Duran static
2925d9d1a1e7SJose Luis Duran EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextDns(IN CHAR16 * TextDeviceNode)2926d9d1a1e7SJose Luis Duran DevPathFromTextDns (
2927d9d1a1e7SJose Luis Duran IN CHAR16 *TextDeviceNode
2928d9d1a1e7SJose Luis Duran )
2929d9d1a1e7SJose Luis Duran {
2930d9d1a1e7SJose Luis Duran CHAR16 *DeviceNodeStr;
2931d9d1a1e7SJose Luis Duran CHAR16 *DeviceNodeStrPtr;
2932d9d1a1e7SJose Luis Duran UINT32 DnsServerIpCount;
2933d9d1a1e7SJose Luis Duran UINT16 DnsDeviceNodeLength;
2934d9d1a1e7SJose Luis Duran DNS_DEVICE_PATH *DnsDeviceNode;
2935d9d1a1e7SJose Luis Duran UINT32 DnsServerIpIndex;
2936d9d1a1e7SJose Luis Duran CHAR16 *DnsServerIp;
2937d9d1a1e7SJose Luis Duran
2938d9d1a1e7SJose Luis Duran //
2939d9d1a1e7SJose Luis Duran // Count the DNS server address number.
2940d9d1a1e7SJose Luis Duran //
2941d9d1a1e7SJose Luis Duran DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
2942d9d1a1e7SJose Luis Duran if (DeviceNodeStr == NULL) {
2943d9d1a1e7SJose Luis Duran return NULL;
2944d9d1a1e7SJose Luis Duran }
2945d9d1a1e7SJose Luis Duran
2946d9d1a1e7SJose Luis Duran DeviceNodeStrPtr = DeviceNodeStr;
2947d9d1a1e7SJose Luis Duran
2948d9d1a1e7SJose Luis Duran DnsServerIpCount = 0;
2949d9d1a1e7SJose Luis Duran while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != '\0') {
2950d9d1a1e7SJose Luis Duran GetNextParamStr (&DeviceNodeStrPtr);
2951d9d1a1e7SJose Luis Duran DnsServerIpCount++;
2952d9d1a1e7SJose Luis Duran }
2953d9d1a1e7SJose Luis Duran
2954d9d1a1e7SJose Luis Duran FreePool (DeviceNodeStr);
2955d9d1a1e7SJose Luis Duran DeviceNodeStr = NULL;
2956d9d1a1e7SJose Luis Duran
2957d9d1a1e7SJose Luis Duran //
2958d9d1a1e7SJose Luis Duran // One or more instances of the DNS server address in EFI_IP_ADDRESS,
2959d9d1a1e7SJose Luis Duran // otherwise, NULL will be returned.
2960d9d1a1e7SJose Luis Duran //
2961d9d1a1e7SJose Luis Duran if (DnsServerIpCount == 0) {
2962d9d1a1e7SJose Luis Duran return NULL;
2963d9d1a1e7SJose Luis Duran }
2964d9d1a1e7SJose Luis Duran
2965d9d1a1e7SJose Luis Duran //
2966d9d1a1e7SJose Luis Duran // Create the DNS DeviceNode.
2967d9d1a1e7SJose Luis Duran //
2968d9d1a1e7SJose Luis Duran DnsDeviceNodeLength = (UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
2969d9d1a1e7SJose Luis Duran DnsDeviceNode = (DNS_DEVICE_PATH *)CreateDeviceNode (
2970d9d1a1e7SJose Luis Duran MESSAGING_DEVICE_PATH,
2971d9d1a1e7SJose Luis Duran MSG_DNS_DP,
2972d9d1a1e7SJose Luis Duran DnsDeviceNodeLength
2973d9d1a1e7SJose Luis Duran );
2974d9d1a1e7SJose Luis Duran if (DnsDeviceNode == NULL) {
2975d9d1a1e7SJose Luis Duran return NULL;
2976d9d1a1e7SJose Luis Duran }
2977d9d1a1e7SJose Luis Duran
2978d9d1a1e7SJose Luis Duran //
2979d9d1a1e7SJose Luis Duran // Confirm the DNS server address is IPv4 or IPv6 type.
2980d9d1a1e7SJose Luis Duran //
2981d9d1a1e7SJose Luis Duran DeviceNodeStrPtr = TextDeviceNode;
2982d9d1a1e7SJose Luis Duran while (!IS_NULL (*DeviceNodeStrPtr)) {
2983d9d1a1e7SJose Luis Duran if (*DeviceNodeStrPtr == '.') {
2984d9d1a1e7SJose Luis Duran DnsDeviceNode->IsIPv6 = 0x00;
2985d9d1a1e7SJose Luis Duran break;
2986d9d1a1e7SJose Luis Duran }
2987d9d1a1e7SJose Luis Duran
2988d9d1a1e7SJose Luis Duran if (*DeviceNodeStrPtr == ':') {
2989d9d1a1e7SJose Luis Duran DnsDeviceNode->IsIPv6 = 0x01;
2990d9d1a1e7SJose Luis Duran break;
2991d9d1a1e7SJose Luis Duran }
2992d9d1a1e7SJose Luis Duran
2993d9d1a1e7SJose Luis Duran DeviceNodeStrPtr++;
2994d9d1a1e7SJose Luis Duran }
2995d9d1a1e7SJose Luis Duran
2996d9d1a1e7SJose Luis Duran for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
2997d9d1a1e7SJose Luis Duran DnsServerIp = GetNextParamStr (&TextDeviceNode);
2998d9d1a1e7SJose Luis Duran if (DnsDeviceNode->IsIPv6 == 0x00) {
2999d9d1a1e7SJose Luis Duran StrToIpv4Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
3000d9d1a1e7SJose Luis Duran } else {
3001d9d1a1e7SJose Luis Duran StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
3002d9d1a1e7SJose Luis Duran }
3003d9d1a1e7SJose Luis Duran }
3004d9d1a1e7SJose Luis Duran
3005d9d1a1e7SJose Luis Duran return (EFI_DEVICE_PATH_PROTOCOL *)DnsDeviceNode;
3006d9d1a1e7SJose Luis Duran }
3007d9d1a1e7SJose Luis Duran
3008d9d1a1e7SJose Luis Duran /**
30097270962aSWarner Losh Converts a text device path node to URI device path structure.
30107270962aSWarner Losh
30117270962aSWarner Losh @param TextDeviceNode The input Text device path node.
30127270962aSWarner Losh
30137270962aSWarner Losh @return A pointer to the newly-created URI device path structure.
30147270962aSWarner Losh
30157270962aSWarner Losh **/
30167270962aSWarner Losh static
30177270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUri(IN CHAR16 * TextDeviceNode)30187270962aSWarner Losh DevPathFromTextUri (
30197270962aSWarner Losh IN CHAR16 *TextDeviceNode
30207270962aSWarner Losh )
30217270962aSWarner Losh {
30227270962aSWarner Losh CHAR16 *UriStr;
30237270962aSWarner Losh UINTN UriLength;
30247270962aSWarner Losh URI_DEVICE_PATH *Uri;
30257270962aSWarner Losh
30267270962aSWarner Losh UriStr = GetNextParamStr (&TextDeviceNode);
30277270962aSWarner Losh UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));
30287270962aSWarner Losh Uri = (URI_DEVICE_PATH *)CreateDeviceNode (
30297270962aSWarner Losh MESSAGING_DEVICE_PATH,
30307270962aSWarner Losh MSG_URI_DP,
30317270962aSWarner Losh (UINT16)(sizeof (URI_DEVICE_PATH) + UriLength)
30327270962aSWarner Losh );
30337270962aSWarner Losh
30347270962aSWarner Losh while (UriLength-- != 0) {
30357270962aSWarner Losh Uri->Uri[UriLength] = (CHAR8)UriStr[UriLength];
30367270962aSWarner Losh }
30377270962aSWarner Losh
30387270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Uri;
30397270962aSWarner Losh }
30407270962aSWarner Losh
30417270962aSWarner Losh /**
30427270962aSWarner Losh Converts a media text device path node to media device path structure.
30437270962aSWarner Losh
30447270962aSWarner Losh @param TextDeviceNode The input Text device path node.
30457270962aSWarner Losh
30467270962aSWarner Losh @return A pointer to media device path structure.
30477270962aSWarner Losh
30487270962aSWarner Losh **/
30497270962aSWarner Losh static
30507270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMediaPath(IN CHAR16 * TextDeviceNode)30517270962aSWarner Losh DevPathFromTextMediaPath (
30527270962aSWarner Losh IN CHAR16 *TextDeviceNode
30537270962aSWarner Losh )
30547270962aSWarner Losh {
30557270962aSWarner Losh return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);
30567270962aSWarner Losh }
30577270962aSWarner Losh
30587270962aSWarner Losh /**
30597270962aSWarner Losh Converts a text device path node to HD device path structure.
30607270962aSWarner Losh
30617270962aSWarner Losh @param TextDeviceNode The input Text device path node.
30627270962aSWarner Losh
30637270962aSWarner Losh @return A pointer to the newly-created HD device path structure.
30647270962aSWarner Losh
30657270962aSWarner Losh **/
30667270962aSWarner Losh static
30677270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHD(IN CHAR16 * TextDeviceNode)30687270962aSWarner Losh DevPathFromTextHD (
30697270962aSWarner Losh IN CHAR16 *TextDeviceNode
30707270962aSWarner Losh )
30717270962aSWarner Losh {
30727270962aSWarner Losh CHAR16 *PartitionStr;
30737270962aSWarner Losh CHAR16 *TypeStr;
30747270962aSWarner Losh CHAR16 *SignatureStr;
30757270962aSWarner Losh CHAR16 *StartStr;
30767270962aSWarner Losh CHAR16 *SizeStr;
30777270962aSWarner Losh UINT32 Signature32;
30787270962aSWarner Losh HARDDRIVE_DEVICE_PATH *Hd;
30797270962aSWarner Losh
30807270962aSWarner Losh PartitionStr = GetNextParamStr (&TextDeviceNode);
30817270962aSWarner Losh TypeStr = GetNextParamStr (&TextDeviceNode);
30827270962aSWarner Losh SignatureStr = GetNextParamStr (&TextDeviceNode);
30837270962aSWarner Losh StartStr = GetNextParamStr (&TextDeviceNode);
30847270962aSWarner Losh SizeStr = GetNextParamStr (&TextDeviceNode);
30857270962aSWarner Losh Hd = (HARDDRIVE_DEVICE_PATH *)CreateDeviceNode (
30867270962aSWarner Losh MEDIA_DEVICE_PATH,
30877270962aSWarner Losh MEDIA_HARDDRIVE_DP,
30887270962aSWarner Losh (UINT16)sizeof (HARDDRIVE_DEVICE_PATH)
30897270962aSWarner Losh );
30907270962aSWarner Losh
30917270962aSWarner Losh Hd->PartitionNumber = (UINT32)Strtoi (PartitionStr);
30927270962aSWarner Losh
30937270962aSWarner Losh ZeroMem (Hd->Signature, 16);
30947270962aSWarner Losh Hd->MBRType = (UINT8)0;
30957270962aSWarner Losh
30967270962aSWarner Losh if (StrCmp (TypeStr, "MBR") == 0) {
30977270962aSWarner Losh Hd->SignatureType = SIGNATURE_TYPE_MBR;
30987270962aSWarner Losh Hd->MBRType = 0x01;
30997270962aSWarner Losh
31007270962aSWarner Losh Signature32 = (UINT32)Strtoi (SignatureStr);
31017270962aSWarner Losh CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
31027270962aSWarner Losh } else if (StrCmp (TypeStr, "GPT") == 0) {
31037270962aSWarner Losh Hd->SignatureType = SIGNATURE_TYPE_GUID;
31047270962aSWarner Losh Hd->MBRType = 0x02;
31057270962aSWarner Losh
31067270962aSWarner Losh StrToGuid (SignatureStr, (EFI_GUID *)Hd->Signature);
31077270962aSWarner Losh } else {
31087270962aSWarner Losh Hd->SignatureType = (UINT8)Strtoi (TypeStr);
31097270962aSWarner Losh }
31107270962aSWarner Losh
31117270962aSWarner Losh Strtoi64 (StartStr, &Hd->PartitionStart);
31127270962aSWarner Losh Strtoi64 (SizeStr, &Hd->PartitionSize);
31137270962aSWarner Losh
31147270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Hd;
31157270962aSWarner Losh }
31167270962aSWarner Losh
31177270962aSWarner Losh /**
31187270962aSWarner Losh Converts a text device path node to CDROM device path structure.
31197270962aSWarner Losh
31207270962aSWarner Losh @param TextDeviceNode The input Text device path node.
31217270962aSWarner Losh
31227270962aSWarner Losh @return A pointer to the newly-created CDROM device path structure.
31237270962aSWarner Losh
31247270962aSWarner Losh **/
31257270962aSWarner Losh static
31267270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCDROM(IN CHAR16 * TextDeviceNode)31277270962aSWarner Losh DevPathFromTextCDROM (
31287270962aSWarner Losh IN CHAR16 *TextDeviceNode
31297270962aSWarner Losh )
31307270962aSWarner Losh {
31317270962aSWarner Losh CHAR16 *EntryStr;
31327270962aSWarner Losh CHAR16 *StartStr;
31337270962aSWarner Losh CHAR16 *SizeStr;
31347270962aSWarner Losh CDROM_DEVICE_PATH *CDROMDevPath;
31357270962aSWarner Losh
31367270962aSWarner Losh EntryStr = GetNextParamStr (&TextDeviceNode);
31377270962aSWarner Losh StartStr = GetNextParamStr (&TextDeviceNode);
31387270962aSWarner Losh SizeStr = GetNextParamStr (&TextDeviceNode);
31397270962aSWarner Losh CDROMDevPath = (CDROM_DEVICE_PATH *)CreateDeviceNode (
31407270962aSWarner Losh MEDIA_DEVICE_PATH,
31417270962aSWarner Losh MEDIA_CDROM_DP,
31427270962aSWarner Losh (UINT16)sizeof (CDROM_DEVICE_PATH)
31437270962aSWarner Losh );
31447270962aSWarner Losh
31457270962aSWarner Losh CDROMDevPath->BootEntry = (UINT32)Strtoi (EntryStr);
31467270962aSWarner Losh Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);
31477270962aSWarner Losh Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);
31487270962aSWarner Losh
31497270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)CDROMDevPath;
31507270962aSWarner Losh }
31517270962aSWarner Losh
31527270962aSWarner Losh /**
31537270962aSWarner Losh Converts a text device path node to Vendor-defined media device path structure.
31547270962aSWarner Losh
31557270962aSWarner Losh @param TextDeviceNode The input Text device path node.
31567270962aSWarner Losh
31577270962aSWarner Losh @return A pointer to the newly-created Vendor-defined media device path structure.
31587270962aSWarner Losh
31597270962aSWarner Losh **/
31607270962aSWarner Losh static
31617270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMedia(IN CHAR16 * TextDeviceNode)31627270962aSWarner Losh DevPathFromTextVenMedia (
31637270962aSWarner Losh IN CHAR16 *TextDeviceNode
31647270962aSWarner Losh )
31657270962aSWarner Losh {
31667270962aSWarner Losh return ConvertFromTextVendor (
31677270962aSWarner Losh TextDeviceNode,
31687270962aSWarner Losh MEDIA_DEVICE_PATH,
31697270962aSWarner Losh MEDIA_VENDOR_DP
31707270962aSWarner Losh );
31717270962aSWarner Losh }
31727270962aSWarner Losh
31737270962aSWarner Losh /**
31747270962aSWarner Losh Converts a text device path node to File device path structure.
31757270962aSWarner Losh
31767270962aSWarner Losh @param TextDeviceNode The input Text device path node.
31777270962aSWarner Losh
31787270962aSWarner Losh @return A pointer to the newly-created File device path structure.
31797270962aSWarner Losh
31807270962aSWarner Losh **/
31817270962aSWarner Losh static
31827270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFilePath(IN CHAR16 * TextDeviceNode)31837270962aSWarner Losh DevPathFromTextFilePath (
31847270962aSWarner Losh IN CHAR16 *TextDeviceNode
31857270962aSWarner Losh )
31867270962aSWarner Losh {
31877270962aSWarner Losh FILEPATH_DEVICE_PATH *File;
31887270962aSWarner Losh
3189d780e059SWarner Losh #ifndef __FreeBSD__
31907270962aSWarner Losh File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
31917270962aSWarner Losh MEDIA_DEVICE_PATH,
31927270962aSWarner Losh MEDIA_FILEPATH_DP,
31937270962aSWarner Losh (UINT16)(sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)
31947270962aSWarner Losh );
31957270962aSWarner Losh
31967270962aSWarner Losh StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);
3197d780e059SWarner Losh #else
3198ae3adc06SWarner Losh size_t len = (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2);
3199ae3adc06SWarner Losh efi_char *v;
3200d780e059SWarner Losh File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
3201d780e059SWarner Losh MEDIA_DEVICE_PATH,
3202d780e059SWarner Losh MEDIA_FILEPATH_DP,
3203ae3adc06SWarner Losh (UINT16)len
3204d780e059SWarner Losh );
3205ae3adc06SWarner Losh v = File->PathName;
3206ae3adc06SWarner Losh utf8_to_ucs2(TextDeviceNode, &v, &len);
3207d780e059SWarner Losh #endif
32087270962aSWarner Losh
32097270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)File;
32107270962aSWarner Losh }
32117270962aSWarner Losh
32127270962aSWarner Losh /**
32137270962aSWarner Losh Converts a text device path node to Media protocol device path structure.
32147270962aSWarner Losh
32157270962aSWarner Losh @param TextDeviceNode The input Text device path node.
32167270962aSWarner Losh
32177270962aSWarner Losh @return A pointer to the newly-created Media protocol device path structure.
32187270962aSWarner Losh
32197270962aSWarner Losh **/
32207270962aSWarner Losh static
32217270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMedia(IN CHAR16 * TextDeviceNode)32227270962aSWarner Losh DevPathFromTextMedia (
32237270962aSWarner Losh IN CHAR16 *TextDeviceNode
32247270962aSWarner Losh )
32257270962aSWarner Losh {
32267270962aSWarner Losh CHAR16 *GuidStr;
32277270962aSWarner Losh MEDIA_PROTOCOL_DEVICE_PATH *Media;
32287270962aSWarner Losh
32297270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
32307270962aSWarner Losh Media = (MEDIA_PROTOCOL_DEVICE_PATH *)CreateDeviceNode (
32317270962aSWarner Losh MEDIA_DEVICE_PATH,
32327270962aSWarner Losh MEDIA_PROTOCOL_DP,
32337270962aSWarner Losh (UINT16)sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
32347270962aSWarner Losh );
32357270962aSWarner Losh
32367270962aSWarner Losh StrToGuid (GuidStr, &Media->Protocol);
32377270962aSWarner Losh
32387270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Media;
32397270962aSWarner Losh }
32407270962aSWarner Losh
32417270962aSWarner Losh /**
32427270962aSWarner Losh Converts a text device path node to firmware volume device path structure.
32437270962aSWarner Losh
32447270962aSWarner Losh @param TextDeviceNode The input Text device path node.
32457270962aSWarner Losh
32467270962aSWarner Losh @return A pointer to the newly-created firmware volume device path structure.
32477270962aSWarner Losh
32487270962aSWarner Losh **/
32497270962aSWarner Losh static
32507270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFv(IN CHAR16 * TextDeviceNode)32517270962aSWarner Losh DevPathFromTextFv (
32527270962aSWarner Losh IN CHAR16 *TextDeviceNode
32537270962aSWarner Losh )
32547270962aSWarner Losh {
32557270962aSWarner Losh CHAR16 *GuidStr;
32567270962aSWarner Losh MEDIA_FW_VOL_DEVICE_PATH *Fv;
32577270962aSWarner Losh
32587270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
32597270962aSWarner Losh Fv = (MEDIA_FW_VOL_DEVICE_PATH *)CreateDeviceNode (
32607270962aSWarner Losh MEDIA_DEVICE_PATH,
32617270962aSWarner Losh MEDIA_PIWG_FW_VOL_DP,
32627270962aSWarner Losh (UINT16)sizeof (MEDIA_FW_VOL_DEVICE_PATH)
32637270962aSWarner Losh );
32647270962aSWarner Losh
32657270962aSWarner Losh StrToGuid (GuidStr, &Fv->FvName);
32667270962aSWarner Losh
32677270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Fv;
32687270962aSWarner Losh }
32697270962aSWarner Losh
32707270962aSWarner Losh /**
32717270962aSWarner Losh Converts a text device path node to firmware file device path structure.
32727270962aSWarner Losh
32737270962aSWarner Losh @param TextDeviceNode The input Text device path node.
32747270962aSWarner Losh
32757270962aSWarner Losh @return A pointer to the newly-created firmware file device path structure.
32767270962aSWarner Losh
32777270962aSWarner Losh **/
32787270962aSWarner Losh static
32797270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFvFile(IN CHAR16 * TextDeviceNode)32807270962aSWarner Losh DevPathFromTextFvFile (
32817270962aSWarner Losh IN CHAR16 *TextDeviceNode
32827270962aSWarner Losh )
32837270962aSWarner Losh {
32847270962aSWarner Losh CHAR16 *GuidStr;
32857270962aSWarner Losh MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;
32867270962aSWarner Losh
32877270962aSWarner Losh GuidStr = GetNextParamStr (&TextDeviceNode);
32887270962aSWarner Losh FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)CreateDeviceNode (
32897270962aSWarner Losh MEDIA_DEVICE_PATH,
32907270962aSWarner Losh MEDIA_PIWG_FW_FILE_DP,
32917270962aSWarner Losh (UINT16)sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)
32927270962aSWarner Losh );
32937270962aSWarner Losh
32947270962aSWarner Losh StrToGuid (GuidStr, &FvFile->FvFileName);
32957270962aSWarner Losh
32967270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)FvFile;
32977270962aSWarner Losh }
32987270962aSWarner Losh
32997270962aSWarner Losh /**
33007270962aSWarner Losh Converts a text device path node to text relative offset device path structure.
33017270962aSWarner Losh
33027270962aSWarner Losh @param TextDeviceNode The input Text device path node.
33037270962aSWarner Losh
33047270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
33057270962aSWarner Losh
33067270962aSWarner Losh **/
33077270962aSWarner Losh static
33087270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRelativeOffsetRange(IN CHAR16 * TextDeviceNode)33097270962aSWarner Losh DevPathFromTextRelativeOffsetRange (
33107270962aSWarner Losh IN CHAR16 *TextDeviceNode
33117270962aSWarner Losh )
33127270962aSWarner Losh {
33137270962aSWarner Losh CHAR16 *StartingOffsetStr;
33147270962aSWarner Losh CHAR16 *EndingOffsetStr;
33157270962aSWarner Losh MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
33167270962aSWarner Losh
33177270962aSWarner Losh StartingOffsetStr = GetNextParamStr (&TextDeviceNode);
33187270962aSWarner Losh EndingOffsetStr = GetNextParamStr (&TextDeviceNode);
33197270962aSWarner Losh Offset = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *)CreateDeviceNode (
33207270962aSWarner Losh MEDIA_DEVICE_PATH,
33217270962aSWarner Losh MEDIA_RELATIVE_OFFSET_RANGE_DP,
33227270962aSWarner Losh (UINT16)sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)
33237270962aSWarner Losh );
33247270962aSWarner Losh
33257270962aSWarner Losh Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);
33267270962aSWarner Losh Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);
33277270962aSWarner Losh
33287270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Offset;
33297270962aSWarner Losh }
33307270962aSWarner Losh
33317270962aSWarner Losh /**
33327270962aSWarner Losh Converts a text device path node to text ram disk device path structure.
33337270962aSWarner Losh
33347270962aSWarner Losh @param TextDeviceNode The input Text device path node.
33357270962aSWarner Losh
33367270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
33377270962aSWarner Losh
33387270962aSWarner Losh **/
33397270962aSWarner Losh static
33407270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRamDisk(IN CHAR16 * TextDeviceNode)33417270962aSWarner Losh DevPathFromTextRamDisk (
33427270962aSWarner Losh IN CHAR16 *TextDeviceNode
33437270962aSWarner Losh )
33447270962aSWarner Losh {
33457270962aSWarner Losh CHAR16 *StartingAddrStr;
33467270962aSWarner Losh CHAR16 *EndingAddrStr;
33477270962aSWarner Losh CHAR16 *TypeGuidStr;
33487270962aSWarner Losh CHAR16 *InstanceStr;
33497270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
33507270962aSWarner Losh UINT64 StartingAddr;
33517270962aSWarner Losh UINT64 EndingAddr;
33527270962aSWarner Losh
33537270962aSWarner Losh StartingAddrStr = GetNextParamStr (&TextDeviceNode);
33547270962aSWarner Losh EndingAddrStr = GetNextParamStr (&TextDeviceNode);
33557270962aSWarner Losh InstanceStr = GetNextParamStr (&TextDeviceNode);
33567270962aSWarner Losh TypeGuidStr = GetNextParamStr (&TextDeviceNode);
33577270962aSWarner Losh RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
33587270962aSWarner Losh MEDIA_DEVICE_PATH,
33597270962aSWarner Losh MEDIA_RAM_DISK_DP,
33607270962aSWarner Losh (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
33617270962aSWarner Losh );
33627270962aSWarner Losh
33637270962aSWarner Losh Strtoi64 (StartingAddrStr, &StartingAddr);
33647270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
33657270962aSWarner Losh Strtoi64 (EndingAddrStr, &EndingAddr);
33667270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
33677270962aSWarner Losh RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
33687270962aSWarner Losh StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);
33697270962aSWarner Losh
33707270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
33717270962aSWarner Losh }
33727270962aSWarner Losh
33737270962aSWarner Losh /**
33747270962aSWarner Losh Converts a text device path node to text virtual disk device path structure.
33757270962aSWarner Losh
33767270962aSWarner Losh @param TextDeviceNode The input Text device path node.
33777270962aSWarner Losh
33787270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
33797270962aSWarner Losh
33807270962aSWarner Losh **/
33817270962aSWarner Losh static
33827270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualDisk(IN CHAR16 * TextDeviceNode)33837270962aSWarner Losh DevPathFromTextVirtualDisk (
33847270962aSWarner Losh IN CHAR16 *TextDeviceNode
33857270962aSWarner Losh )
33867270962aSWarner Losh {
33877270962aSWarner Losh CHAR16 *StartingAddrStr;
33887270962aSWarner Losh CHAR16 *EndingAddrStr;
33897270962aSWarner Losh CHAR16 *InstanceStr;
33907270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
33917270962aSWarner Losh UINT64 StartingAddr;
33927270962aSWarner Losh UINT64 EndingAddr;
33937270962aSWarner Losh
33947270962aSWarner Losh StartingAddrStr = GetNextParamStr (&TextDeviceNode);
33957270962aSWarner Losh EndingAddrStr = GetNextParamStr (&TextDeviceNode);
33967270962aSWarner Losh InstanceStr = GetNextParamStr (&TextDeviceNode);
33977270962aSWarner Losh
33987270962aSWarner Losh RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
33997270962aSWarner Losh MEDIA_DEVICE_PATH,
34007270962aSWarner Losh MEDIA_RAM_DISK_DP,
34017270962aSWarner Losh (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
34027270962aSWarner Losh );
34037270962aSWarner Losh
34047270962aSWarner Losh Strtoi64 (StartingAddrStr, &StartingAddr);
34057270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
34067270962aSWarner Losh Strtoi64 (EndingAddrStr, &EndingAddr);
34077270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
34087270962aSWarner Losh RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
34097270962aSWarner Losh CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);
34107270962aSWarner Losh
34117270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
34127270962aSWarner Losh }
34137270962aSWarner Losh
34147270962aSWarner Losh /**
34157270962aSWarner Losh Converts a text device path node to text virtual cd device path structure.
34167270962aSWarner Losh
34177270962aSWarner Losh @param TextDeviceNode The input Text device path node.
34187270962aSWarner Losh
34197270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
34207270962aSWarner Losh
34217270962aSWarner Losh **/
34227270962aSWarner Losh static
34237270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualCd(IN CHAR16 * TextDeviceNode)34247270962aSWarner Losh DevPathFromTextVirtualCd (
34257270962aSWarner Losh IN CHAR16 *TextDeviceNode
34267270962aSWarner Losh )
34277270962aSWarner Losh {
34287270962aSWarner Losh CHAR16 *StartingAddrStr;
34297270962aSWarner Losh CHAR16 *EndingAddrStr;
34307270962aSWarner Losh CHAR16 *InstanceStr;
34317270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
34327270962aSWarner Losh UINT64 StartingAddr;
34337270962aSWarner Losh UINT64 EndingAddr;
34347270962aSWarner Losh
34357270962aSWarner Losh StartingAddrStr = GetNextParamStr (&TextDeviceNode);
34367270962aSWarner Losh EndingAddrStr = GetNextParamStr (&TextDeviceNode);
34377270962aSWarner Losh InstanceStr = GetNextParamStr (&TextDeviceNode);
34387270962aSWarner Losh
34397270962aSWarner Losh RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
34407270962aSWarner Losh MEDIA_DEVICE_PATH,
34417270962aSWarner Losh MEDIA_RAM_DISK_DP,
34427270962aSWarner Losh (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
34437270962aSWarner Losh );
34447270962aSWarner Losh
34457270962aSWarner Losh Strtoi64 (StartingAddrStr, &StartingAddr);
34467270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
34477270962aSWarner Losh Strtoi64 (EndingAddrStr, &EndingAddr);
34487270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
34497270962aSWarner Losh RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
34507270962aSWarner Losh CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);
34517270962aSWarner Losh
34527270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
34537270962aSWarner Losh }
34547270962aSWarner Losh
34557270962aSWarner Losh /**
34567270962aSWarner Losh Converts a text device path node to text persistent virtual disk device path structure.
34577270962aSWarner Losh
34587270962aSWarner Losh @param TextDeviceNode The input Text device path node.
34597270962aSWarner Losh
34607270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
34617270962aSWarner Losh
34627270962aSWarner Losh **/
34637270962aSWarner Losh static
34647270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualDisk(IN CHAR16 * TextDeviceNode)34657270962aSWarner Losh DevPathFromTextPersistentVirtualDisk (
34667270962aSWarner Losh IN CHAR16 *TextDeviceNode
34677270962aSWarner Losh )
34687270962aSWarner Losh {
34697270962aSWarner Losh CHAR16 *StartingAddrStr;
34707270962aSWarner Losh CHAR16 *EndingAddrStr;
34717270962aSWarner Losh CHAR16 *InstanceStr;
34727270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
34737270962aSWarner Losh UINT64 StartingAddr;
34747270962aSWarner Losh UINT64 EndingAddr;
34757270962aSWarner Losh
34767270962aSWarner Losh StartingAddrStr = GetNextParamStr (&TextDeviceNode);
34777270962aSWarner Losh EndingAddrStr = GetNextParamStr (&TextDeviceNode);
34787270962aSWarner Losh InstanceStr = GetNextParamStr (&TextDeviceNode);
34797270962aSWarner Losh
34807270962aSWarner Losh RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
34817270962aSWarner Losh MEDIA_DEVICE_PATH,
34827270962aSWarner Losh MEDIA_RAM_DISK_DP,
34837270962aSWarner Losh (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
34847270962aSWarner Losh );
34857270962aSWarner Losh
34867270962aSWarner Losh Strtoi64 (StartingAddrStr, &StartingAddr);
34877270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
34887270962aSWarner Losh Strtoi64 (EndingAddrStr, &EndingAddr);
34897270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
34907270962aSWarner Losh RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
34917270962aSWarner Losh CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);
34927270962aSWarner Losh
34937270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
34947270962aSWarner Losh }
34957270962aSWarner Losh
34967270962aSWarner Losh /**
34977270962aSWarner Losh Converts a text device path node to text persistent virtual cd device path structure.
34987270962aSWarner Losh
34997270962aSWarner Losh @param TextDeviceNode The input Text device path node.
35007270962aSWarner Losh
35017270962aSWarner Losh @return A pointer to the newly-created Text device path structure.
35027270962aSWarner Losh
35037270962aSWarner Losh **/
35047270962aSWarner Losh static
35057270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualCd(IN CHAR16 * TextDeviceNode)35067270962aSWarner Losh DevPathFromTextPersistentVirtualCd (
35077270962aSWarner Losh IN CHAR16 *TextDeviceNode
35087270962aSWarner Losh )
35097270962aSWarner Losh {
35107270962aSWarner Losh CHAR16 *StartingAddrStr;
35117270962aSWarner Losh CHAR16 *EndingAddrStr;
35127270962aSWarner Losh CHAR16 *InstanceStr;
35137270962aSWarner Losh MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
35147270962aSWarner Losh UINT64 StartingAddr;
35157270962aSWarner Losh UINT64 EndingAddr;
35167270962aSWarner Losh
35177270962aSWarner Losh StartingAddrStr = GetNextParamStr (&TextDeviceNode);
35187270962aSWarner Losh EndingAddrStr = GetNextParamStr (&TextDeviceNode);
35197270962aSWarner Losh InstanceStr = GetNextParamStr (&TextDeviceNode);
35207270962aSWarner Losh
35217270962aSWarner Losh RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
35227270962aSWarner Losh MEDIA_DEVICE_PATH,
35237270962aSWarner Losh MEDIA_RAM_DISK_DP,
35247270962aSWarner Losh (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
35257270962aSWarner Losh );
35267270962aSWarner Losh
35277270962aSWarner Losh Strtoi64 (StartingAddrStr, &StartingAddr);
35287270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
35297270962aSWarner Losh Strtoi64 (EndingAddrStr, &EndingAddr);
35307270962aSWarner Losh WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
35317270962aSWarner Losh RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
35327270962aSWarner Losh CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);
35337270962aSWarner Losh
35347270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
35357270962aSWarner Losh }
35367270962aSWarner Losh
35377270962aSWarner Losh /**
35387270962aSWarner Losh Converts a BBS text device path node to BBS device path structure.
35397270962aSWarner Losh
35407270962aSWarner Losh @param TextDeviceNode The input Text device path node.
35417270962aSWarner Losh
35427270962aSWarner Losh @return A pointer to BBS device path structure.
35437270962aSWarner Losh
35447270962aSWarner Losh **/
35457270962aSWarner Losh static
35467270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBbsPath(IN CHAR16 * TextDeviceNode)35477270962aSWarner Losh DevPathFromTextBbsPath (
35487270962aSWarner Losh IN CHAR16 *TextDeviceNode
35497270962aSWarner Losh )
35507270962aSWarner Losh {
35517270962aSWarner Losh return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);
35527270962aSWarner Losh }
35537270962aSWarner Losh
35547270962aSWarner Losh /**
35557270962aSWarner Losh Converts a text device path node to BIOS Boot Specification device path structure.
35567270962aSWarner Losh
35577270962aSWarner Losh @param TextDeviceNode The input Text device path node.
35587270962aSWarner Losh
35597270962aSWarner Losh @return A pointer to the newly-created BIOS Boot Specification device path structure.
35607270962aSWarner Losh
35617270962aSWarner Losh **/
35627270962aSWarner Losh static
35637270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBBS(IN CHAR16 * TextDeviceNode)35647270962aSWarner Losh DevPathFromTextBBS (
35657270962aSWarner Losh IN CHAR16 *TextDeviceNode
35667270962aSWarner Losh )
35677270962aSWarner Losh {
35687270962aSWarner Losh CHAR16 *TypeStr;
35697270962aSWarner Losh CHAR16 *IdStr;
35707270962aSWarner Losh CHAR16 *FlagsStr;
35717270962aSWarner Losh CHAR8 *AsciiStr;
35727270962aSWarner Losh BBS_BBS_DEVICE_PATH *Bbs;
35737270962aSWarner Losh
35747270962aSWarner Losh TypeStr = GetNextParamStr (&TextDeviceNode);
35757270962aSWarner Losh IdStr = GetNextParamStr (&TextDeviceNode);
35767270962aSWarner Losh FlagsStr = GetNextParamStr (&TextDeviceNode);
35777270962aSWarner Losh Bbs = (BBS_BBS_DEVICE_PATH *)CreateDeviceNode (
35787270962aSWarner Losh BBS_DEVICE_PATH,
35797270962aSWarner Losh BBS_BBS_DP,
35807270962aSWarner Losh (UINT16)(sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))
35817270962aSWarner Losh );
35827270962aSWarner Losh
35837270962aSWarner Losh if (StrCmp (TypeStr, "Floppy") == 0) {
35847270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_FLOPPY;
35857270962aSWarner Losh } else if (StrCmp (TypeStr, "HD") == 0) {
35867270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
35877270962aSWarner Losh } else if (StrCmp (TypeStr, "CDROM") == 0) {
35887270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_CDROM;
35897270962aSWarner Losh } else if (StrCmp (TypeStr, "PCMCIA") == 0) {
35907270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_PCMCIA;
35917270962aSWarner Losh } else if (StrCmp (TypeStr, "USB") == 0) {
35927270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_USB;
35937270962aSWarner Losh } else if (StrCmp (TypeStr, "Network") == 0) {
35947270962aSWarner Losh Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
35957270962aSWarner Losh } else {
35967270962aSWarner Losh Bbs->DeviceType = (UINT16)Strtoi (TypeStr);
35977270962aSWarner Losh }
35987270962aSWarner Losh
35997270962aSWarner Losh AsciiStr = Bbs->String;
36007270962aSWarner Losh StrToAscii (IdStr, &AsciiStr);
36017270962aSWarner Losh
36027270962aSWarner Losh Bbs->StatusFlag = (UINT16)Strtoi (FlagsStr);
36037270962aSWarner Losh
36047270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Bbs;
36057270962aSWarner Losh }
36067270962aSWarner Losh
36077270962aSWarner Losh /**
36087270962aSWarner Losh Converts a text device path node to SATA device path structure.
36097270962aSWarner Losh
36107270962aSWarner Losh @param TextDeviceNode The input Text device path node.
36117270962aSWarner Losh
36127270962aSWarner Losh @return A pointer to the newly-created SATA device path structure.
36137270962aSWarner Losh
36147270962aSWarner Losh **/
36157270962aSWarner Losh static
36167270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSata(IN CHAR16 * TextDeviceNode)36177270962aSWarner Losh DevPathFromTextSata (
36187270962aSWarner Losh IN CHAR16 *TextDeviceNode
36197270962aSWarner Losh )
36207270962aSWarner Losh {
36217270962aSWarner Losh SATA_DEVICE_PATH *Sata;
36227270962aSWarner Losh CHAR16 *Param1;
36237270962aSWarner Losh CHAR16 *Param2;
36247270962aSWarner Losh CHAR16 *Param3;
36257270962aSWarner Losh
36267270962aSWarner Losh Param1 = GetNextParamStr (&TextDeviceNode);
36277270962aSWarner Losh Param2 = GetNextParamStr (&TextDeviceNode);
36287270962aSWarner Losh Param3 = GetNextParamStr (&TextDeviceNode);
36297270962aSWarner Losh
36307270962aSWarner Losh Sata = (SATA_DEVICE_PATH *)CreateDeviceNode (
36317270962aSWarner Losh MESSAGING_DEVICE_PATH,
36327270962aSWarner Losh MSG_SATA_DP,
36337270962aSWarner Losh (UINT16)sizeof (SATA_DEVICE_PATH)
36347270962aSWarner Losh );
36357270962aSWarner Losh Sata->HBAPortNumber = (UINT16)Strtoi (Param1);
36364e83ac7dSJose Luis Duran
36374e83ac7dSJose Luis Duran //
36384e83ac7dSJose Luis Duran // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF
36394e83ac7dSJose Luis Duran //
36404e83ac7dSJose Luis Duran if (*Param2 == '\0' ) {
36414e83ac7dSJose Luis Duran Sata->PortMultiplierPortNumber = 0xFFFF;
36424e83ac7dSJose Luis Duran } else {
36437270962aSWarner Losh Sata->PortMultiplierPortNumber = (UINT16)Strtoi (Param2);
36444e83ac7dSJose Luis Duran }
36455754f582SJose Luis Duran
36467270962aSWarner Losh Sata->Lun = (UINT16)Strtoi (Param3);
36477270962aSWarner Losh
36487270962aSWarner Losh return (EFI_DEVICE_PATH_PROTOCOL *)Sata;
36497270962aSWarner Losh }
36507270962aSWarner Losh
36517270962aSWarner Losh GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {
36527270962aSWarner Losh { "Path", DevPathFromTextPath },
36537270962aSWarner Losh
36547270962aSWarner Losh { "HardwarePath", DevPathFromTextHardwarePath },
36557270962aSWarner Losh { "Pci", DevPathFromTextPci },
36567270962aSWarner Losh { "PcCard", DevPathFromTextPcCard },
36577270962aSWarner Losh { "MemoryMapped", DevPathFromTextMemoryMapped },
36587270962aSWarner Losh { "VenHw", DevPathFromTextVenHw },
36597270962aSWarner Losh { "Ctrl", DevPathFromTextCtrl },
36607270962aSWarner Losh { "BMC", DevPathFromTextBmc },
36617270962aSWarner Losh
36627270962aSWarner Losh { "AcpiPath", DevPathFromTextAcpiPath },
36637270962aSWarner Losh { "Acpi", DevPathFromTextAcpi },
36647270962aSWarner Losh { "PciRoot", DevPathFromTextPciRoot },
36657270962aSWarner Losh { "PcieRoot", DevPathFromTextPcieRoot },
36667270962aSWarner Losh { "Floppy", DevPathFromTextFloppy },
36677270962aSWarner Losh { "Keyboard", DevPathFromTextKeyboard },
36687270962aSWarner Losh { "Serial", DevPathFromTextSerial },
36697270962aSWarner Losh { "ParallelPort", DevPathFromTextParallelPort },
36707270962aSWarner Losh { "AcpiEx", DevPathFromTextAcpiEx },
36717270962aSWarner Losh { "AcpiExp", DevPathFromTextAcpiExp },
36727270962aSWarner Losh { "AcpiAdr", DevPathFromTextAcpiAdr },
36737270962aSWarner Losh
36747270962aSWarner Losh { "Msg", DevPathFromTextMsg },
36757270962aSWarner Losh { "Ata", DevPathFromTextAta },
36767270962aSWarner Losh { "Scsi", DevPathFromTextScsi },
36777270962aSWarner Losh { "Fibre", DevPathFromTextFibre },
36787270962aSWarner Losh { "FibreEx", DevPathFromTextFibreEx },
36797270962aSWarner Losh { "I1394", DevPathFromText1394 },
36807270962aSWarner Losh { "USB", DevPathFromTextUsb },
36817270962aSWarner Losh { "I2O", DevPathFromTextI2O },
36827270962aSWarner Losh { "Infiniband", DevPathFromTextInfiniband },
36837270962aSWarner Losh { "VenMsg", DevPathFromTextVenMsg },
36847270962aSWarner Losh { "VenPcAnsi", DevPathFromTextVenPcAnsi },
36857270962aSWarner Losh { "VenVt100", DevPathFromTextVenVt100 },
36867270962aSWarner Losh { "VenVt100Plus", DevPathFromTextVenVt100Plus },
36877270962aSWarner Losh { "VenUtf8", DevPathFromTextVenUtf8 },
36887270962aSWarner Losh { "UartFlowCtrl", DevPathFromTextUartFlowCtrl },
36897270962aSWarner Losh { "SAS", DevPathFromTextSAS },
36907270962aSWarner Losh { "SasEx", DevPathFromTextSasEx },
36917270962aSWarner Losh { "NVMe", DevPathFromTextNVMe },
36927270962aSWarner Losh { "UFS", DevPathFromTextUfs },
36937270962aSWarner Losh { "SD", DevPathFromTextSd },
36947270962aSWarner Losh { "eMMC", DevPathFromTextEmmc },
36957270962aSWarner Losh { "DebugPort", DevPathFromTextDebugPort },
36967270962aSWarner Losh { "MAC", DevPathFromTextMAC },
36977270962aSWarner Losh { "IPv4", DevPathFromTextIPv4 },
36987270962aSWarner Losh { "IPv6", DevPathFromTextIPv6 },
36997270962aSWarner Losh { "Uart", DevPathFromTextUart },
37007270962aSWarner Losh { "UsbClass", DevPathFromTextUsbClass },
37017270962aSWarner Losh { "UsbAudio", DevPathFromTextUsbAudio },
37027270962aSWarner Losh { "UsbCDCControl", DevPathFromTextUsbCDCControl },
37037270962aSWarner Losh { "UsbHID", DevPathFromTextUsbHID },
37047270962aSWarner Losh { "UsbImage", DevPathFromTextUsbImage },
37057270962aSWarner Losh { "UsbPrinter", DevPathFromTextUsbPrinter },
37067270962aSWarner Losh { "UsbMassStorage", DevPathFromTextUsbMassStorage },
37077270962aSWarner Losh { "UsbHub", DevPathFromTextUsbHub },
37087270962aSWarner Losh { "UsbCDCData", DevPathFromTextUsbCDCData },
37097270962aSWarner Losh { "UsbSmartCard", DevPathFromTextUsbSmartCard },
37107270962aSWarner Losh { "UsbVideo", DevPathFromTextUsbVideo },
37117270962aSWarner Losh { "UsbDiagnostic", DevPathFromTextUsbDiagnostic },
37127270962aSWarner Losh { "UsbWireless", DevPathFromTextUsbWireless },
37137270962aSWarner Losh { "UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },
37147270962aSWarner Losh { "UsbIrdaBridge", DevPathFromTextUsbIrdaBridge },
37157270962aSWarner Losh { "UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement },
37167270962aSWarner Losh { "UsbWwid", DevPathFromTextUsbWwid },
37177270962aSWarner Losh { "Unit", DevPathFromTextUnit },
37187270962aSWarner Losh { "iSCSI", DevPathFromTextiSCSI },
37197270962aSWarner Losh { "Vlan", DevPathFromTextVlan },
3720d9d1a1e7SJose Luis Duran { "Dns", DevPathFromTextDns },
37217270962aSWarner Losh { "Uri", DevPathFromTextUri },
37227270962aSWarner Losh { "Bluetooth", DevPathFromTextBluetooth },
37237270962aSWarner Losh { "Wi-Fi", DevPathFromTextWiFi },
3724e8fc7f11SJose Luis Duran { "BluetoothLE", DevPathFromTextBluetoothLE },
37257270962aSWarner Losh { "MediaPath", DevPathFromTextMediaPath },
37267270962aSWarner Losh { "HD", DevPathFromTextHD },
37277270962aSWarner Losh { "CDROM", DevPathFromTextCDROM },
37287270962aSWarner Losh { "VenMedia", DevPathFromTextVenMedia },
37297270962aSWarner Losh { "Media", DevPathFromTextMedia },
37307270962aSWarner Losh { "Fv", DevPathFromTextFv },
37317270962aSWarner Losh { "FvFile", DevPathFromTextFvFile },
3732ae3adc06SWarner Losh { "File", DevPathFromTextFilePath },
37337270962aSWarner Losh { "Offset", DevPathFromTextRelativeOffsetRange },
37347270962aSWarner Losh { "RamDisk", DevPathFromTextRamDisk },
37357270962aSWarner Losh { "VirtualDisk", DevPathFromTextVirtualDisk },
37367270962aSWarner Losh { "VirtualCD", DevPathFromTextVirtualCd },
37377270962aSWarner Losh { "PersistentVirtualDisk", DevPathFromTextPersistentVirtualDisk },
37387270962aSWarner Losh { "PersistentVirtualCD", DevPathFromTextPersistentVirtualCd },
37397270962aSWarner Losh
37407270962aSWarner Losh { "BbsPath", DevPathFromTextBbsPath },
37417270962aSWarner Losh { "BBS", DevPathFromTextBBS },
37427270962aSWarner Losh { "Sata", DevPathFromTextSata },
37437270962aSWarner Losh { NULL, NULL }
37447270962aSWarner Losh };
37457270962aSWarner Losh
37467270962aSWarner Losh /**
37477270962aSWarner Losh Convert text to the binary representation of a device node.
37487270962aSWarner Losh
37497270962aSWarner Losh @param TextDeviceNode TextDeviceNode points to the text representation of a device
37507270962aSWarner Losh node. Conversion starts with the first character and continues
37517270962aSWarner Losh until the first non-device node character.
37527270962aSWarner Losh
37537270962aSWarner Losh @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
37547270962aSWarner Losh insufficient memory or text unsupported.
37557270962aSWarner Losh
37567270962aSWarner Losh **/
37577270962aSWarner Losh static
37587270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
37597270962aSWarner Losh EFIAPI
UefiDevicePathLibConvertTextToDeviceNode(IN CONST CHAR16 * TextDeviceNode)37607270962aSWarner Losh UefiDevicePathLibConvertTextToDeviceNode (
37617270962aSWarner Losh IN CONST CHAR16 *TextDeviceNode
37627270962aSWarner Losh )
37637270962aSWarner Losh {
37647270962aSWarner Losh DEVICE_PATH_FROM_TEXT FromText;
37657270962aSWarner Losh CHAR16 *ParamStr;
37667270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
37677270962aSWarner Losh CHAR16 *DeviceNodeStr;
37687270962aSWarner Losh UINTN Index;
37697270962aSWarner Losh
37707270962aSWarner Losh if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
37717270962aSWarner Losh return NULL;
37727270962aSWarner Losh }
37737270962aSWarner Losh
37747270962aSWarner Losh ParamStr = NULL;
37757270962aSWarner Losh FromText = NULL;
37767270962aSWarner Losh DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
37777270962aSWarner Losh ASSERT (DeviceNodeStr != NULL);
37787270962aSWarner Losh
37797270962aSWarner Losh for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {
37807270962aSWarner Losh ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);
37817270962aSWarner Losh if (ParamStr != NULL) {
37827270962aSWarner Losh FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;
37837270962aSWarner Losh break;
37847270962aSWarner Losh }
37857270962aSWarner Losh }
37867270962aSWarner Losh
37877270962aSWarner Losh if (FromText == NULL) {
37887270962aSWarner Losh //
37897270962aSWarner Losh // A file path
37907270962aSWarner Losh //
37917270962aSWarner Losh FromText = DevPathFromTextFilePath;
37927270962aSWarner Losh DeviceNode = FromText (DeviceNodeStr);
37937270962aSWarner Losh } else {
37947270962aSWarner Losh DeviceNode = FromText (ParamStr);
37957270962aSWarner Losh FreePool (ParamStr);
37967270962aSWarner Losh }
37977270962aSWarner Losh
37987270962aSWarner Losh FreePool (DeviceNodeStr);
37997270962aSWarner Losh
38007270962aSWarner Losh return DeviceNode;
38017270962aSWarner Losh }
38027270962aSWarner Losh
38037270962aSWarner Losh /**
38047270962aSWarner Losh Convert text to the binary representation of a device path.
38057270962aSWarner Losh
38067270962aSWarner Losh
38077270962aSWarner Losh @param TextDevicePath TextDevicePath points to the text representation of a device
38087270962aSWarner Losh path. Conversion starts with the first character and continues
38097270962aSWarner Losh until the first non-device node character.
38107270962aSWarner Losh
38117270962aSWarner Losh @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
38127270962aSWarner Losh there was insufficient memory.
38137270962aSWarner Losh
38147270962aSWarner Losh **/
38157270962aSWarner Losh static
38167270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
38177270962aSWarner Losh EFIAPI
UefiDevicePathLibConvertTextToDevicePath(IN CONST CHAR16 * TextDevicePath)38187270962aSWarner Losh UefiDevicePathLibConvertTextToDevicePath (
38197270962aSWarner Losh IN CONST CHAR16 *TextDevicePath
38207270962aSWarner Losh )
38217270962aSWarner Losh {
38227270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
38237270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
38247270962aSWarner Losh CHAR16 *DevicePathStr;
38257270962aSWarner Losh CHAR16 *Str;
38267270962aSWarner Losh CHAR16 *DeviceNodeStr;
38277270962aSWarner Losh BOOLEAN IsInstanceEnd;
38287270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *DevicePath;
38297270962aSWarner Losh
38307270962aSWarner Losh if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
38317270962aSWarner Losh return NULL;
38327270962aSWarner Losh }
38337270962aSWarner Losh
38347270962aSWarner Losh DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
38357270962aSWarner Losh ASSERT (DevicePath != NULL);
38367270962aSWarner Losh SetDevicePathEndNode (DevicePath);
38377270962aSWarner Losh
38387270962aSWarner Losh DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);
38397270962aSWarner Losh
38407270962aSWarner Losh Str = DevicePathStr;
38417270962aSWarner Losh while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
38427270962aSWarner Losh DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);
38437270962aSWarner Losh
38447270962aSWarner Losh NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
38457270962aSWarner Losh FreePool (DevicePath);
38467270962aSWarner Losh FreePool (DeviceNode);
38477270962aSWarner Losh DevicePath = NewDevicePath;
38487270962aSWarner Losh
38497270962aSWarner Losh if (IsInstanceEnd) {
38507270962aSWarner Losh DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
38517270962aSWarner Losh ASSERT (DeviceNode != NULL);
38527270962aSWarner Losh SetDevicePathEndNode (DeviceNode);
38537270962aSWarner Losh DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
38547270962aSWarner Losh
38557270962aSWarner Losh NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
38567270962aSWarner Losh FreePool (DevicePath);
38577270962aSWarner Losh FreePool (DeviceNode);
38587270962aSWarner Losh DevicePath = NewDevicePath;
38597270962aSWarner Losh }
38607270962aSWarner Losh }
38617270962aSWarner Losh
38627270962aSWarner Losh FreePool (DevicePathStr);
38637270962aSWarner Losh return DevicePath;
38647270962aSWarner Losh }
38657270962aSWarner Losh
38667270962aSWarner Losh ssize_t
efidp_parse_device_path(char * path,efidp out,size_t max)38677270962aSWarner Losh efidp_parse_device_path(char *path, efidp out, size_t max)
38687270962aSWarner Losh {
38697270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *dp;
38707270962aSWarner Losh UINTN len;
38717270962aSWarner Losh
38727270962aSWarner Losh dp = UefiDevicePathLibConvertTextToDevicePath (path);
38737270962aSWarner Losh if (dp == NULL)
38747270962aSWarner Losh return -1;
38757270962aSWarner Losh len = GetDevicePathSize(dp);
38767270962aSWarner Losh if (len > max) {
38777270962aSWarner Losh free(dp);
38787270962aSWarner Losh return -1;
38797270962aSWarner Losh }
38807270962aSWarner Losh memcpy(out, dp, len);
38817270962aSWarner Losh free(dp);
38827270962aSWarner Losh
38837270962aSWarner Losh return len;
38847270962aSWarner Losh }
3885