xref: /freebsd/lib/libefivar/efivar-dp-parse.c (revision 259eac0149f0d2c01e1fcbeba3be1ba6fca6f8e1)
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 <ctype.h>
327270962aSWarner Losh #include <efivar.h>
337270962aSWarner Losh #include <stdio.h>
347270962aSWarner Losh #include <string.h>
357270962aSWarner Losh #include <wchar.h>
367270962aSWarner Losh 
37ae3adc06SWarner Losh #include "efichar.h"
38ae3adc06SWarner Losh 
397270962aSWarner Losh #include "efi-osdep.h"
407270962aSWarner Losh #include "efivar-dp.h"
417270962aSWarner Losh 
427270962aSWarner Losh #include "uefi-dplib.h"
437270962aSWarner Losh 
447270962aSWarner Losh /* XXX STUBS -- this stuff doesn't work yet */
45ccfd87feSJohn Baldwin #define StrToIpv4Address(str, unk, ipv4ptr, unk2)	(void)(str)
46ccfd87feSJohn Baldwin #define StrToIpv6Address(str, unk, ipv6ptr, unk2)	(void)(str)
477270962aSWarner Losh 
487270962aSWarner Losh /*
497270962aSWarner Losh  * OK. Now this is evil. Can't typedef it again. Sure beats changing them all.
507270962aSWarner Losh  * Since we're doing it all as narrow characters since wchar_t can't be used on
517270962aSWarner Losh  * FreeBSD and CHAR16 strings generally aren't a good fit. Since this parsing
527270962aSWarner Losh  * doesn't need Unicode for anything, this works out well.
537270962aSWarner Losh  */
547270962aSWarner Losh #define CHAR16 char
557270962aSWarner Losh 
567270962aSWarner Losh /*
577270962aSWarner Losh  * Taken from MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
587270962aSWarner Losh  */
597270962aSWarner Losh 
607270962aSWarner Losh /** @file
617270962aSWarner Losh   DevicePathFromText protocol as defined in the UEFI 2.0 specification.
627270962aSWarner Losh 
6376ed5f1bSJose Luis Duran Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
6411a9ff5bSJose Luis Duran SPDX-License-Identifier: BSD-2-Clause-Patent
657270962aSWarner Losh 
667270962aSWarner Losh **/
677270962aSWarner Losh 
687270962aSWarner Losh // #include "UefiDevicePathLib.h"
697270962aSWarner Losh 
707270962aSWarner Losh /**
717270962aSWarner Losh 
727270962aSWarner Losh   Duplicates a string.
737270962aSWarner Losh 
747270962aSWarner Losh   @param  Src  Source string.
757270962aSWarner Losh 
767270962aSWarner Losh   @return The duplicated string.
777270962aSWarner Losh 
787270962aSWarner Losh **/
797270962aSWarner Losh static
807270962aSWarner Losh CHAR16 *
UefiDevicePathLibStrDuplicate(IN CONST CHAR16 * Src)817270962aSWarner Losh UefiDevicePathLibStrDuplicate (
827270962aSWarner Losh   IN CONST CHAR16  *Src
837270962aSWarner Losh   )
847270962aSWarner Losh {
857270962aSWarner Losh   return AllocateCopyPool (StrSize (Src), Src);
867270962aSWarner Losh }
877270962aSWarner Losh 
887270962aSWarner Losh /**
897270962aSWarner Losh 
907270962aSWarner Losh   Get parameter in a pair of parentheses follow the given node name.
917270962aSWarner Losh   For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
927270962aSWarner Losh 
937270962aSWarner Losh   @param  Str      Device Path Text.
947270962aSWarner Losh   @param  NodeName Name of the node.
957270962aSWarner Losh 
967270962aSWarner Losh   @return Parameter text for the node.
977270962aSWarner Losh 
987270962aSWarner Losh **/
997270962aSWarner Losh static
1007270962aSWarner Losh CHAR16 *
GetParamByNodeName(IN CHAR16 * Str,IN const CHAR16 * NodeName)1017270962aSWarner Losh GetParamByNodeName (
1027270962aSWarner Losh   IN CHAR16  *Str,
1037270962aSWarner Losh   IN const CHAR16  *NodeName
1047270962aSWarner Losh   )
1057270962aSWarner Losh {
1067270962aSWarner Losh   CHAR16  *ParamStr;
1077270962aSWarner Losh   CHAR16  *StrPointer;
1087270962aSWarner Losh   UINTN   NodeNameLength;
1097270962aSWarner Losh   UINTN   ParameterLength;
1107270962aSWarner Losh 
1117270962aSWarner Losh   //
1127270962aSWarner Losh   // Check whether the node name matchs
1137270962aSWarner Losh   //
1147270962aSWarner Losh   NodeNameLength = StrLen (NodeName);
1157270962aSWarner Losh   if (StrnCmp (Str, NodeName, NodeNameLength) != 0) {
1167270962aSWarner Losh     return NULL;
1177270962aSWarner Losh   }
1187270962aSWarner Losh 
1197270962aSWarner Losh   ParamStr = Str + NodeNameLength;
1207270962aSWarner Losh   if (!IS_LEFT_PARENTH (*ParamStr)) {
1217270962aSWarner Losh     return NULL;
1227270962aSWarner Losh   }
1237270962aSWarner Losh 
1247270962aSWarner Losh   //
1257270962aSWarner Losh   // Skip the found '(' and find first occurrence of ')'
1267270962aSWarner Losh   //
1277270962aSWarner Losh   ParamStr++;
1287270962aSWarner Losh   ParameterLength = 0;
1297270962aSWarner Losh   StrPointer      = ParamStr;
1307270962aSWarner Losh   while (!IS_NULL (*StrPointer)) {
1317270962aSWarner Losh     if (IS_RIGHT_PARENTH (*StrPointer)) {
1327270962aSWarner Losh       break;
1337270962aSWarner Losh     }
1345754f582SJose Luis Duran 
1357270962aSWarner Losh     StrPointer++;
1367270962aSWarner Losh     ParameterLength++;
1377270962aSWarner Losh   }
1385754f582SJose Luis Duran 
1397270962aSWarner Losh   if (IS_NULL (*StrPointer)) {
1407270962aSWarner Losh     //
1417270962aSWarner Losh     // ')' not found
1427270962aSWarner Losh     //
1437270962aSWarner Losh     return NULL;
1447270962aSWarner Losh   }
1457270962aSWarner Losh 
1467270962aSWarner Losh   ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
1477270962aSWarner Losh   if (ParamStr == NULL) {
1487270962aSWarner Losh     return NULL;
1497270962aSWarner Losh   }
1505754f582SJose Luis Duran 
1517270962aSWarner Losh   //
1527270962aSWarner Losh   // Terminate the parameter string
1537270962aSWarner Losh   //
1547270962aSWarner Losh   ParamStr[ParameterLength] = '\0';
1557270962aSWarner Losh 
1567270962aSWarner Losh   return ParamStr;
1577270962aSWarner Losh }
1587270962aSWarner Losh 
1597270962aSWarner Losh /**
1607270962aSWarner Losh   Gets current sub-string from a string list, before return
1617270962aSWarner Losh   the list header is moved to next sub-string. The sub-string is separated
1627270962aSWarner Losh   by the specified character. For example, the separator is ',', the string
1637270962aSWarner Losh   list is "2,0,3", it returns "2", the remain list move to "0,3"
1647270962aSWarner Losh 
1657270962aSWarner Losh   @param  List        A string list separated by the specified separator
1667270962aSWarner Losh   @param  Separator   The separator character
1677270962aSWarner Losh 
1687270962aSWarner Losh   @return A pointer to the current sub-string
1697270962aSWarner Losh 
1707270962aSWarner Losh **/
1717270962aSWarner Losh static
1727270962aSWarner Losh CHAR16 *
SplitStr(IN OUT CHAR16 ** List,IN CHAR16 Separator)1737270962aSWarner Losh SplitStr (
1747270962aSWarner Losh   IN OUT CHAR16  **List,
1757270962aSWarner Losh   IN     CHAR16  Separator
1767270962aSWarner Losh   )
1777270962aSWarner Losh {
1787270962aSWarner Losh   CHAR16  *Str;
1797270962aSWarner Losh   CHAR16  *ReturnStr;
1807270962aSWarner Losh 
1817270962aSWarner Losh   Str       = *List;
1827270962aSWarner Losh   ReturnStr = Str;
1837270962aSWarner Losh 
1847270962aSWarner Losh   if (IS_NULL (*Str)) {
1857270962aSWarner Losh     return ReturnStr;
1867270962aSWarner Losh   }
1877270962aSWarner Losh 
1887270962aSWarner Losh   //
1897270962aSWarner Losh   // Find first occurrence of the separator
1907270962aSWarner Losh   //
1917270962aSWarner Losh   while (!IS_NULL (*Str)) {
1927270962aSWarner Losh     if (*Str == Separator) {
1937270962aSWarner Losh       break;
1947270962aSWarner Losh     }
1955754f582SJose Luis Duran 
1967270962aSWarner Losh     Str++;
1977270962aSWarner Losh   }
1987270962aSWarner Losh 
1997270962aSWarner Losh   if (*Str == Separator) {
2007270962aSWarner Losh     //
2017270962aSWarner Losh     // Find a sub-string, terminate it
2027270962aSWarner Losh     //
2037270962aSWarner Losh     *Str = '\0';
2047270962aSWarner Losh     Str++;
2057270962aSWarner Losh   }
2067270962aSWarner Losh 
2077270962aSWarner Losh   //
2087270962aSWarner Losh   // Move to next sub-string
2097270962aSWarner Losh   //
2107270962aSWarner Losh   *List = Str;
2117270962aSWarner Losh 
2127270962aSWarner Losh   return ReturnStr;
2137270962aSWarner Losh }
2147270962aSWarner Losh 
2157270962aSWarner Losh /**
2167270962aSWarner Losh   Gets the next parameter string from the list.
2177270962aSWarner Losh 
2187270962aSWarner Losh   @param List            A string list separated by the specified separator
2197270962aSWarner Losh 
2207270962aSWarner Losh   @return A pointer to the current sub-string
2217270962aSWarner Losh 
2227270962aSWarner Losh **/
2237270962aSWarner Losh static
2247270962aSWarner Losh CHAR16 *
GetNextParamStr(IN OUT CHAR16 ** List)2257270962aSWarner Losh GetNextParamStr (
2267270962aSWarner Losh   IN OUT CHAR16  **List
2277270962aSWarner Losh   )
2287270962aSWarner Losh {
2297270962aSWarner Losh   //
2307270962aSWarner Losh   // The separator is comma
2317270962aSWarner Losh   //
2327270962aSWarner Losh   return SplitStr (List, ',');
2337270962aSWarner Losh }
2347270962aSWarner Losh 
2357270962aSWarner Losh /**
2367270962aSWarner Losh   Get one device node from entire device path text.
2377270962aSWarner Losh 
2387270962aSWarner Losh   @param DevicePath      On input, the current Device Path node; on output, the next device path node
2397270962aSWarner Losh   @param IsInstanceEnd   This node is the end of a device path instance
2407270962aSWarner Losh 
2417270962aSWarner Losh   @return A device node text or NULL if no more device node available
2427270962aSWarner Losh 
2437270962aSWarner Losh **/
2447270962aSWarner Losh static
2457270962aSWarner Losh CHAR16 *
GetNextDeviceNodeStr(IN OUT CHAR16 ** DevicePath,OUT BOOLEAN * IsInstanceEnd)2467270962aSWarner Losh GetNextDeviceNodeStr (
2477270962aSWarner Losh   IN OUT CHAR16   **DevicePath,
2487270962aSWarner Losh   OUT    BOOLEAN  *IsInstanceEnd
2497270962aSWarner Losh   )
2507270962aSWarner Losh {
2517270962aSWarner Losh   CHAR16  *Str;
2527270962aSWarner Losh   CHAR16  *ReturnStr;
2537270962aSWarner Losh   UINTN   ParenthesesStack;
2547270962aSWarner Losh 
2557270962aSWarner Losh   Str = *DevicePath;
2567270962aSWarner Losh   if (IS_NULL (*Str)) {
2577270962aSWarner Losh     return NULL;
2587270962aSWarner Losh   }
2597270962aSWarner Losh 
2607270962aSWarner Losh   //
2617270962aSWarner Losh   // Skip the leading '/', '(', ')' and ','
2627270962aSWarner Losh   //
2637270962aSWarner Losh   while (!IS_NULL (*Str)) {
2647270962aSWarner Losh     if (!IS_SLASH (*Str) &&
2657270962aSWarner Losh         !IS_COMMA (*Str) &&
2667270962aSWarner Losh         !IS_LEFT_PARENTH (*Str) &&
2675754f582SJose Luis Duran         !IS_RIGHT_PARENTH (*Str))
2685754f582SJose Luis Duran     {
2697270962aSWarner Losh       break;
2707270962aSWarner Losh     }
2715754f582SJose Luis Duran 
2727270962aSWarner Losh     Str++;
2737270962aSWarner Losh   }
2747270962aSWarner Losh 
2757270962aSWarner Losh   ReturnStr = Str;
2767270962aSWarner Losh 
2777270962aSWarner Losh   //
2787270962aSWarner Losh   // Scan for the separator of this device node, '/' or ','
2797270962aSWarner Losh   //
2807270962aSWarner Losh   ParenthesesStack = 0;
2817270962aSWarner Losh   while (!IS_NULL (*Str)) {
2827270962aSWarner Losh     if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
2837270962aSWarner Losh       break;
2847270962aSWarner Losh     }
2857270962aSWarner Losh 
2867270962aSWarner Losh     if (IS_LEFT_PARENTH (*Str)) {
2877270962aSWarner Losh       ParenthesesStack++;
2887270962aSWarner Losh     } else if (IS_RIGHT_PARENTH (*Str)) {
2897270962aSWarner Losh       ParenthesesStack--;
2907270962aSWarner Losh     }
2917270962aSWarner Losh 
2927270962aSWarner Losh     Str++;
2937270962aSWarner Losh   }
2947270962aSWarner Losh 
2957270962aSWarner Losh   if (ParenthesesStack != 0) {
2967270962aSWarner Losh     //
2977270962aSWarner Losh     // The '(' doesn't pair with ')', invalid device path text
2987270962aSWarner Losh     //
2997270962aSWarner Losh     return NULL;
3007270962aSWarner Losh   }
3017270962aSWarner Losh 
3027270962aSWarner Losh   if (IS_COMMA (*Str)) {
3037270962aSWarner Losh     *IsInstanceEnd = TRUE;
3047270962aSWarner Losh     *Str           = '\0';
3057270962aSWarner Losh     Str++;
3067270962aSWarner Losh   } else {
3077270962aSWarner Losh     *IsInstanceEnd = FALSE;
3087270962aSWarner Losh     if (!IS_NULL (*Str)) {
3097270962aSWarner Losh       *Str = '\0';
3107270962aSWarner Losh       Str++;
3117270962aSWarner Losh     }
3127270962aSWarner Losh   }
3137270962aSWarner Losh 
3147270962aSWarner Losh   *DevicePath = Str;
3157270962aSWarner Losh 
3167270962aSWarner Losh   return ReturnStr;
3177270962aSWarner Losh }
3187270962aSWarner Losh 
3197270962aSWarner Losh 
3207270962aSWarner Losh #ifndef __FreeBSD__
3217270962aSWarner Losh /**
3227270962aSWarner Losh   Return whether the integer string is a hex string.
3237270962aSWarner Losh 
3247270962aSWarner Losh   @param Str             The integer string
3257270962aSWarner Losh 
3267270962aSWarner Losh   @retval TRUE   Hex string
3277270962aSWarner Losh   @retval FALSE  Decimal string
3287270962aSWarner Losh 
3297270962aSWarner Losh **/
3307270962aSWarner Losh static
3317270962aSWarner Losh BOOLEAN
IsHexStr(IN CHAR16 * Str)3327270962aSWarner Losh IsHexStr (
3337270962aSWarner Losh   IN CHAR16  *Str
3347270962aSWarner Losh   )
3357270962aSWarner Losh {
3367270962aSWarner Losh   //
3377270962aSWarner Losh   // skip preceeding white space
3387270962aSWarner Losh   //
339*05653fc7SJose Luis Duran   while (*Str == ' ') {
3407270962aSWarner Losh     Str++;
3417270962aSWarner Losh   }
3425754f582SJose Luis Duran 
3437270962aSWarner Losh   //
3447270962aSWarner Losh   // skip preceeding zeros
3457270962aSWarner Losh   //
346*05653fc7SJose Luis Duran   while (*Str == '0') {
3477270962aSWarner Losh     Str++;
3487270962aSWarner Losh   }
3497270962aSWarner Losh 
3507270962aSWarner Losh   return (BOOLEAN)(*Str == 'x' || *Str == 'X');
3517270962aSWarner Losh }
3527270962aSWarner Losh 
3537270962aSWarner Losh /**
3547270962aSWarner Losh 
3557270962aSWarner Losh   Convert integer string to uint.
3567270962aSWarner Losh 
3577270962aSWarner Losh   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
3587270962aSWarner Losh 
3597270962aSWarner Losh   @return A UINTN value represented by Str
3607270962aSWarner Losh 
3617270962aSWarner Losh **/
3627270962aSWarner Losh static
3637270962aSWarner Losh UINTN
Strtoi(IN CHAR16 * Str)3647270962aSWarner Losh Strtoi (
3657270962aSWarner Losh   IN CHAR16  *Str
3667270962aSWarner Losh   )
3677270962aSWarner Losh {
3687270962aSWarner Losh   if (IsHexStr (Str)) {
3697270962aSWarner Losh     return StrHexToUintn (Str);
3707270962aSWarner Losh   } else {
3717270962aSWarner Losh     return StrDecimalToUintn (Str);
3727270962aSWarner Losh   }
3737270962aSWarner Losh }
3747270962aSWarner Losh 
3757270962aSWarner Losh /**
3767270962aSWarner Losh 
3777270962aSWarner Losh   Convert integer string to 64 bit data.
3787270962aSWarner Losh 
3797270962aSWarner Losh   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
3807270962aSWarner Losh   @param Data            A pointer to the UINT64 value represented by Str
3817270962aSWarner Losh 
3827270962aSWarner Losh **/
3837270962aSWarner Losh static
3847270962aSWarner Losh VOID
Strtoi64(IN CHAR16 * Str,OUT UINT64 * Data)3857270962aSWarner Losh Strtoi64 (
3867270962aSWarner Losh   IN  CHAR16  *Str,
3877270962aSWarner Losh   OUT UINT64  *Data
3887270962aSWarner Losh   )
3897270962aSWarner Losh {
3907270962aSWarner Losh   if (IsHexStr (Str)) {
3917270962aSWarner Losh     *Data = StrHexToUint64 (Str);
3927270962aSWarner Losh   } else {
3937270962aSWarner Losh     *Data = StrDecimalToUint64 (Str);
3947270962aSWarner Losh   }
3957270962aSWarner Losh }
3967270962aSWarner Losh #endif
3977270962aSWarner Losh 
3987270962aSWarner Losh /**
3997270962aSWarner Losh   Converts a Unicode string to ASCII string.
4007270962aSWarner Losh 
4017270962aSWarner Losh   @param Str             The equivalent Unicode string
4027270962aSWarner Losh   @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points
4037270962aSWarner Losh                          to the next ASCII string next to it
4047270962aSWarner Losh 
4057270962aSWarner Losh **/
4067270962aSWarner Losh static
4077270962aSWarner Losh VOID
StrToAscii(IN CHAR16 * Str,IN OUT CHAR8 ** AsciiStr)4087270962aSWarner Losh StrToAscii (
4097270962aSWarner Losh   IN     CHAR16  *Str,
4107270962aSWarner Losh   IN OUT CHAR8   **AsciiStr
4117270962aSWarner Losh   )
4127270962aSWarner Losh {
4137270962aSWarner Losh   CHAR8  *Dest;
4147270962aSWarner Losh 
4157270962aSWarner Losh   Dest = *AsciiStr;
4167270962aSWarner Losh   while (!IS_NULL (*Str)) {
4177270962aSWarner Losh     *(Dest++) = (CHAR8)*(Str++);
4187270962aSWarner Losh   }
4195754f582SJose Luis Duran 
4207270962aSWarner Losh   *Dest = 0;
4217270962aSWarner Losh 
4227270962aSWarner Losh   //
4237270962aSWarner Losh   // Return the string next to it
4247270962aSWarner Losh   //
4257270962aSWarner Losh   *AsciiStr = Dest + 1;
4267270962aSWarner Losh }
4277270962aSWarner Losh 
4287270962aSWarner Losh /**
4297270962aSWarner Losh   Converts a generic text device path node to device path structure.
4307270962aSWarner Losh 
4317270962aSWarner Losh   @param Type            The type of the device path node.
4327270962aSWarner Losh   @param TextDeviceNode  The input text device path node.
4337270962aSWarner Losh 
4347270962aSWarner Losh   @return A pointer to device path structure.
4357270962aSWarner Losh **/
4367270962aSWarner Losh static
4377270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextGenericPath(IN UINT8 Type,IN CHAR16 * TextDeviceNode)4387270962aSWarner Losh DevPathFromTextGenericPath (
4397270962aSWarner Losh   IN UINT8   Type,
4407270962aSWarner Losh   IN CHAR16  *TextDeviceNode
4417270962aSWarner Losh   )
4427270962aSWarner Losh {
4437270962aSWarner Losh   EFI_DEVICE_PATH_PROTOCOL  *Node;
4447270962aSWarner Losh   CHAR16                    *SubtypeStr;
4457270962aSWarner Losh   CHAR16                    *DataStr;
4467270962aSWarner Losh   UINTN                     DataLength;
4477270962aSWarner Losh 
4487270962aSWarner Losh   SubtypeStr = GetNextParamStr (&TextDeviceNode);
4497270962aSWarner Losh   DataStr    = GetNextParamStr (&TextDeviceNode);
4507270962aSWarner Losh 
4517270962aSWarner Losh   if (DataStr == NULL) {
4527270962aSWarner Losh     DataLength = 0;
4537270962aSWarner Losh   } else {
4547270962aSWarner Losh     DataLength = StrLen (DataStr) / 2;
4557270962aSWarner Losh   }
4565754f582SJose Luis Duran 
4577270962aSWarner Losh   Node = CreateDeviceNode (
4587270962aSWarner Losh            Type,
4597270962aSWarner Losh            (UINT8)Strtoi (SubtypeStr),
4607270962aSWarner Losh            (UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)
4617270962aSWarner Losh            );
4627270962aSWarner Losh 
463*05653fc7SJose Luis Duran   if (Node != NULL) {
4647270962aSWarner Losh     StrHexToBytes (DataStr, DataLength * 2, (UINT8 *)(Node + 1), DataLength);
465*05653fc7SJose Luis Duran   }
466*05653fc7SJose Luis Duran 
4677270962aSWarner Losh   return Node;
4687270962aSWarner Losh }
4697270962aSWarner Losh 
4707270962aSWarner Losh /**
4717270962aSWarner Losh   Converts a generic text device path node to device path structure.
4727270962aSWarner Losh 
4737270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
4747270962aSWarner Losh 
4757270962aSWarner Losh   @return A pointer to device path structure.
4767270962aSWarner Losh 
4777270962aSWarner Losh **/
4787270962aSWarner Losh static
4797270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPath(IN CHAR16 * TextDeviceNode)4807270962aSWarner Losh DevPathFromTextPath (
4817270962aSWarner Losh   IN CHAR16  *TextDeviceNode
4827270962aSWarner Losh   )
4837270962aSWarner Losh {
4847270962aSWarner Losh   CHAR16  *TypeStr;
4857270962aSWarner Losh 
4867270962aSWarner Losh   TypeStr = GetNextParamStr (&TextDeviceNode);
4877270962aSWarner Losh 
4887270962aSWarner Losh   return DevPathFromTextGenericPath ((UINT8)Strtoi (TypeStr), TextDeviceNode);
4897270962aSWarner Losh }
4907270962aSWarner Losh 
4917270962aSWarner Losh /**
4927270962aSWarner Losh   Converts a generic hardware text device path node to Hardware device path structure.
4937270962aSWarner Losh 
4947270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
4957270962aSWarner Losh 
4967270962aSWarner Losh   @return A pointer to Hardware device path structure.
4977270962aSWarner Losh 
4987270962aSWarner Losh **/
4997270962aSWarner Losh static
5007270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHardwarePath(IN CHAR16 * TextDeviceNode)5017270962aSWarner Losh DevPathFromTextHardwarePath (
5027270962aSWarner Losh   IN CHAR16  *TextDeviceNode
5037270962aSWarner Losh   )
5047270962aSWarner Losh {
5057270962aSWarner Losh   return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);
5067270962aSWarner Losh }
5077270962aSWarner Losh 
5087270962aSWarner Losh /**
5097270962aSWarner Losh   Converts a text device path node to Hardware PCI device path structure.
5107270962aSWarner Losh 
5117270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
5127270962aSWarner Losh 
5137270962aSWarner Losh   @return A pointer to Hardware PCI device path structure.
5147270962aSWarner Losh 
5157270962aSWarner Losh **/
5167270962aSWarner Losh static
5177270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPci(IN CHAR16 * TextDeviceNode)5187270962aSWarner Losh DevPathFromTextPci (
5197270962aSWarner Losh   IN CHAR16  *TextDeviceNode
5207270962aSWarner Losh   )
5217270962aSWarner Losh {
5227270962aSWarner Losh   CHAR16           *FunctionStr;
5237270962aSWarner Losh   CHAR16           *DeviceStr;
5247270962aSWarner Losh   PCI_DEVICE_PATH  *Pci;
5257270962aSWarner Losh 
5267270962aSWarner Losh   DeviceStr   = GetNextParamStr (&TextDeviceNode);
5277270962aSWarner Losh   FunctionStr = GetNextParamStr (&TextDeviceNode);
5287270962aSWarner Losh   Pci         = (PCI_DEVICE_PATH *)CreateDeviceNode (
5297270962aSWarner Losh                                      HARDWARE_DEVICE_PATH,
5307270962aSWarner Losh                                      HW_PCI_DP,
5317270962aSWarner Losh                                      (UINT16)sizeof (PCI_DEVICE_PATH)
5327270962aSWarner Losh                                      );
5337270962aSWarner Losh 
534*05653fc7SJose Luis Duran   if (Pci != NULL) {
5357270962aSWarner Losh     Pci->Function = (UINT8)Strtoi (FunctionStr);
5367270962aSWarner Losh     Pci->Device   = (UINT8)Strtoi (DeviceStr);
537*05653fc7SJose Luis Duran   }
5387270962aSWarner Losh 
5397270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Pci;
5407270962aSWarner Losh }
5417270962aSWarner Losh 
5427270962aSWarner Losh /**
5437270962aSWarner Losh   Converts a text device path node to Hardware PC card device path structure.
5447270962aSWarner Losh 
5457270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
5467270962aSWarner Losh 
5477270962aSWarner Losh   @return A pointer to Hardware PC card device path structure.
5487270962aSWarner Losh 
5497270962aSWarner Losh **/
5507270962aSWarner Losh static
5517270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcCard(IN CHAR16 * TextDeviceNode)5527270962aSWarner Losh DevPathFromTextPcCard (
5537270962aSWarner Losh   IN CHAR16  *TextDeviceNode
5547270962aSWarner Losh   )
5557270962aSWarner Losh {
5567270962aSWarner Losh   CHAR16              *FunctionNumberStr;
5577270962aSWarner Losh   PCCARD_DEVICE_PATH  *Pccard;
5587270962aSWarner Losh 
5597270962aSWarner Losh   FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
5607270962aSWarner Losh   Pccard            = (PCCARD_DEVICE_PATH *)CreateDeviceNode (
5617270962aSWarner Losh                                               HARDWARE_DEVICE_PATH,
5627270962aSWarner Losh                                               HW_PCCARD_DP,
5637270962aSWarner Losh                                               (UINT16)sizeof (PCCARD_DEVICE_PATH)
5647270962aSWarner Losh                                               );
5657270962aSWarner Losh 
566*05653fc7SJose Luis Duran   if (Pccard != NULL) {
5677270962aSWarner Losh     Pccard->FunctionNumber = (UINT8)Strtoi (FunctionNumberStr);
568*05653fc7SJose Luis Duran   }
5697270962aSWarner Losh 
5707270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Pccard;
5717270962aSWarner Losh }
5727270962aSWarner Losh 
5737270962aSWarner Losh /**
5747270962aSWarner Losh   Converts a text device path node to Hardware memory map device path structure.
5757270962aSWarner Losh 
5767270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
5777270962aSWarner Losh 
5787270962aSWarner Losh   @return A pointer to Hardware memory map device path structure.
5797270962aSWarner Losh 
5807270962aSWarner Losh **/
5817270962aSWarner Losh static
5827270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMemoryMapped(IN CHAR16 * TextDeviceNode)5837270962aSWarner Losh DevPathFromTextMemoryMapped (
5847270962aSWarner Losh   IN CHAR16  *TextDeviceNode
5857270962aSWarner Losh   )
5867270962aSWarner Losh {
5877270962aSWarner Losh   CHAR16              *MemoryTypeStr;
5887270962aSWarner Losh   CHAR16              *StartingAddressStr;
5897270962aSWarner Losh   CHAR16              *EndingAddressStr;
5907270962aSWarner Losh   MEMMAP_DEVICE_PATH  *MemMap;
5917270962aSWarner Losh 
5927270962aSWarner Losh   MemoryTypeStr      = GetNextParamStr (&TextDeviceNode);
5937270962aSWarner Losh   StartingAddressStr = GetNextParamStr (&TextDeviceNode);
5947270962aSWarner Losh   EndingAddressStr   = GetNextParamStr (&TextDeviceNode);
5957270962aSWarner Losh   MemMap             = (MEMMAP_DEVICE_PATH *)CreateDeviceNode (
5967270962aSWarner Losh                                                HARDWARE_DEVICE_PATH,
5977270962aSWarner Losh                                                HW_MEMMAP_DP,
5987270962aSWarner Losh                                                (UINT16)sizeof (MEMMAP_DEVICE_PATH)
5997270962aSWarner Losh                                                );
6007270962aSWarner Losh 
601*05653fc7SJose Luis Duran   if (MemMap != NULL) {
6027270962aSWarner Losh     MemMap->MemoryType = (UINT32)Strtoi (MemoryTypeStr);
6037270962aSWarner Losh     Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);
6047270962aSWarner Losh     Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);
605*05653fc7SJose Luis Duran   }
6067270962aSWarner Losh 
6077270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)MemMap;
6087270962aSWarner Losh }
6097270962aSWarner Losh 
6107270962aSWarner Losh /**
6117270962aSWarner Losh   Converts a text device path node to Vendor device path structure based on the input Type
6127270962aSWarner Losh   and SubType.
6137270962aSWarner Losh 
6147270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
6157270962aSWarner Losh   @param Type            The type of device path node.
6167270962aSWarner Losh   @param SubType         The subtype of device path node.
6177270962aSWarner Losh 
6187270962aSWarner Losh   @return A pointer to the newly-created Vendor device path structure.
6197270962aSWarner Losh 
6207270962aSWarner Losh **/
6217270962aSWarner Losh static
6227270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextVendor(IN CHAR16 * TextDeviceNode,IN UINT8 Type,IN UINT8 SubType)6237270962aSWarner Losh ConvertFromTextVendor (
6247270962aSWarner Losh   IN CHAR16  *TextDeviceNode,
6257270962aSWarner Losh   IN UINT8   Type,
6267270962aSWarner Losh   IN UINT8   SubType
6277270962aSWarner Losh   )
6287270962aSWarner Losh {
6297270962aSWarner Losh   CHAR16              *GuidStr;
6307270962aSWarner Losh   CHAR16              *DataStr;
6317270962aSWarner Losh   UINTN               Length;
6327270962aSWarner Losh   VENDOR_DEVICE_PATH  *Vendor;
6337270962aSWarner Losh 
6347270962aSWarner Losh   GuidStr = GetNextParamStr (&TextDeviceNode);
6357270962aSWarner Losh 
6367270962aSWarner Losh   DataStr = GetNextParamStr (&TextDeviceNode);
6377270962aSWarner Losh   Length  = StrLen (DataStr);
6387270962aSWarner Losh   //
6397270962aSWarner Losh   // Two hex characters make up 1 buffer byte
6407270962aSWarner Losh   //
6417270962aSWarner Losh   Length = (Length + 1) / 2;
6427270962aSWarner Losh 
6437270962aSWarner Losh   Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
6447270962aSWarner Losh                                    Type,
6457270962aSWarner Losh                                    SubType,
6467270962aSWarner Losh                                    (UINT16)(sizeof (VENDOR_DEVICE_PATH) + Length)
6477270962aSWarner Losh                                    );
6487270962aSWarner Losh 
649*05653fc7SJose Luis Duran   if (Vendor != NULL) {
6507270962aSWarner Losh     StrToGuid (GuidStr, &Vendor->Guid);
6517270962aSWarner Losh     StrHexToBytes (DataStr, Length * 2, (UINT8 *)(Vendor + 1), Length);
652*05653fc7SJose Luis Duran   }
6537270962aSWarner Losh 
6547270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
6557270962aSWarner Losh }
6567270962aSWarner Losh 
6577270962aSWarner Losh /**
6587270962aSWarner Losh   Converts a text device path node to Vendor Hardware device path structure.
6597270962aSWarner Losh 
6607270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
6617270962aSWarner Losh 
6627270962aSWarner Losh   @return A pointer to the newly-created Vendor Hardware device path structure.
6637270962aSWarner Losh 
6647270962aSWarner Losh **/
6657270962aSWarner Losh static
6667270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenHw(IN CHAR16 * TextDeviceNode)6677270962aSWarner Losh DevPathFromTextVenHw (
6687270962aSWarner Losh   IN CHAR16  *TextDeviceNode
6697270962aSWarner Losh   )
6707270962aSWarner Losh {
6717270962aSWarner Losh   return ConvertFromTextVendor (
6727270962aSWarner Losh            TextDeviceNode,
6737270962aSWarner Losh            HARDWARE_DEVICE_PATH,
6747270962aSWarner Losh            HW_VENDOR_DP
6757270962aSWarner Losh            );
6767270962aSWarner Losh }
6777270962aSWarner Losh 
6787270962aSWarner Losh /**
6797270962aSWarner Losh   Converts a text device path node to Hardware Controller device path structure.
6807270962aSWarner Losh 
6817270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
6827270962aSWarner Losh 
6837270962aSWarner Losh   @return A pointer to the newly-created Hardware Controller device path structure.
6847270962aSWarner Losh 
6857270962aSWarner Losh **/
6867270962aSWarner Losh static
6877270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCtrl(IN CHAR16 * TextDeviceNode)6887270962aSWarner Losh DevPathFromTextCtrl (
6897270962aSWarner Losh   IN CHAR16  *TextDeviceNode
6907270962aSWarner Losh   )
6917270962aSWarner Losh {
6927270962aSWarner Losh   CHAR16                  *ControllerStr;
6937270962aSWarner Losh   CONTROLLER_DEVICE_PATH  *Controller;
6947270962aSWarner Losh 
6957270962aSWarner Losh   ControllerStr = GetNextParamStr (&TextDeviceNode);
6967270962aSWarner Losh   Controller    = (CONTROLLER_DEVICE_PATH *)CreateDeviceNode (
6977270962aSWarner Losh                                               HARDWARE_DEVICE_PATH,
6987270962aSWarner Losh                                               HW_CONTROLLER_DP,
6997270962aSWarner Losh                                               (UINT16)sizeof (CONTROLLER_DEVICE_PATH)
7007270962aSWarner Losh                                               );
701*05653fc7SJose Luis Duran 
702*05653fc7SJose Luis Duran   if (Controller != NULL) {
7037270962aSWarner Losh     Controller->ControllerNumber = (UINT32)Strtoi (ControllerStr);
704*05653fc7SJose Luis Duran   }
7057270962aSWarner Losh 
7067270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Controller;
7077270962aSWarner Losh }
7087270962aSWarner Losh 
7097270962aSWarner Losh /**
7107270962aSWarner Losh   Converts a text device path node to BMC device path structure.
7117270962aSWarner Losh 
7127270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
7137270962aSWarner Losh 
7147270962aSWarner Losh   @return A pointer to the newly-created BMC device path structure.
7157270962aSWarner Losh 
7167270962aSWarner Losh **/
7177270962aSWarner Losh static
7187270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBmc(IN CHAR16 * TextDeviceNode)7197270962aSWarner Losh DevPathFromTextBmc (
7207270962aSWarner Losh   IN CHAR16  *TextDeviceNode
7217270962aSWarner Losh   )
7227270962aSWarner Losh {
7237270962aSWarner Losh   CHAR16           *InterfaceTypeStr;
7247270962aSWarner Losh   CHAR16           *BaseAddressStr;
7257270962aSWarner Losh   BMC_DEVICE_PATH  *BmcDp;
7267270962aSWarner Losh 
7277270962aSWarner Losh   InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);
7287270962aSWarner Losh   BaseAddressStr   = GetNextParamStr (&TextDeviceNode);
7297270962aSWarner Losh   BmcDp            = (BMC_DEVICE_PATH *)CreateDeviceNode (
7307270962aSWarner Losh                                           HARDWARE_DEVICE_PATH,
7317270962aSWarner Losh                                           HW_BMC_DP,
7327270962aSWarner Losh                                           (UINT16)sizeof (BMC_DEVICE_PATH)
7337270962aSWarner Losh                                           );
7347270962aSWarner Losh 
735*05653fc7SJose Luis Duran   if (BmcDp != NULL) {
7367270962aSWarner Losh     BmcDp->InterfaceType = (UINT8)Strtoi (InterfaceTypeStr);
7377270962aSWarner Losh     WriteUnaligned64 (
7387270962aSWarner Losh       (UINT64 *)(&BmcDp->BaseAddress),
7397270962aSWarner Losh       StrHexToUint64 (BaseAddressStr)
7407270962aSWarner Losh       );
741*05653fc7SJose Luis Duran   }
7427270962aSWarner Losh 
7437270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)BmcDp;
7447270962aSWarner Losh }
7457270962aSWarner Losh 
7467270962aSWarner Losh /**
7477270962aSWarner Losh   Converts a generic ACPI text device path node to ACPI device path structure.
7487270962aSWarner Losh 
7497270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
7507270962aSWarner Losh 
7517270962aSWarner Losh   @return A pointer to ACPI device path structure.
7527270962aSWarner Losh 
7537270962aSWarner Losh **/
7547270962aSWarner Losh static
7557270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiPath(IN CHAR16 * TextDeviceNode)7567270962aSWarner Losh DevPathFromTextAcpiPath (
7577270962aSWarner Losh   IN CHAR16  *TextDeviceNode
7587270962aSWarner Losh   )
7597270962aSWarner Losh {
7607270962aSWarner Losh   return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);
7617270962aSWarner Losh }
7627270962aSWarner Losh 
7637270962aSWarner Losh /**
7647270962aSWarner Losh   Converts a string to EisaId.
7657270962aSWarner Losh 
7667270962aSWarner Losh   @param Text   The input string.
7677270962aSWarner Losh 
7687270962aSWarner Losh   @return UINT32 EISA ID.
7697270962aSWarner Losh **/
7707270962aSWarner Losh static
7717270962aSWarner Losh UINT32
EisaIdFromText(IN CHAR16 * Text)7727270962aSWarner Losh EisaIdFromText (
7737270962aSWarner Losh   IN CHAR16  *Text
7747270962aSWarner Losh   )
7757270962aSWarner Losh {
7767270962aSWarner Losh   return (((Text[0] - 'A' + 1) & 0x1f) << 10)
7777270962aSWarner Losh          + (((Text[1] - 'A' + 1) & 0x1f) <<  5)
7787270962aSWarner Losh          + (((Text[2] - 'A' + 1) & 0x1f) <<  0)
7797270962aSWarner Losh          + (UINT32)(StrHexToUintn (&Text[3]) << 16)
7807270962aSWarner Losh   ;
7817270962aSWarner Losh }
7827270962aSWarner Losh 
7837270962aSWarner Losh /**
7847270962aSWarner Losh   Converts a text device path node to ACPI HID device path structure.
7857270962aSWarner Losh 
7867270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
7877270962aSWarner Losh 
7887270962aSWarner Losh   @return A pointer to the newly-created ACPI HID device path structure.
7897270962aSWarner Losh 
7907270962aSWarner Losh **/
7917270962aSWarner Losh static
7927270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpi(IN CHAR16 * TextDeviceNode)7937270962aSWarner Losh DevPathFromTextAcpi (
7947270962aSWarner Losh   IN CHAR16  *TextDeviceNode
7957270962aSWarner Losh   )
7967270962aSWarner Losh {
7977270962aSWarner Losh   CHAR16                *HIDStr;
7987270962aSWarner Losh   CHAR16                *UIDStr;
7997270962aSWarner Losh   ACPI_HID_DEVICE_PATH  *Acpi;
8007270962aSWarner Losh 
8017270962aSWarner Losh   HIDStr = GetNextParamStr (&TextDeviceNode);
8027270962aSWarner Losh   UIDStr = GetNextParamStr (&TextDeviceNode);
8037270962aSWarner Losh   Acpi   = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
8047270962aSWarner Losh                                      ACPI_DEVICE_PATH,
8057270962aSWarner Losh                                      ACPI_DP,
8067270962aSWarner Losh                                      (UINT16)sizeof (ACPI_HID_DEVICE_PATH)
8077270962aSWarner Losh                                      );
8087270962aSWarner Losh 
809*05653fc7SJose Luis Duran   if (Acpi != NULL) {
8107270962aSWarner Losh     Acpi->HID = EisaIdFromText (HIDStr);
8117270962aSWarner Losh     Acpi->UID = (UINT32)Strtoi (UIDStr);
812*05653fc7SJose Luis Duran   }
8137270962aSWarner Losh 
8147270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
8157270962aSWarner Losh }
8167270962aSWarner Losh 
8177270962aSWarner Losh /**
8187270962aSWarner Losh   Converts a text device path node to ACPI HID device path structure.
8197270962aSWarner Losh 
8207270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
8217270962aSWarner Losh   @param PnPId           The input plug and play identification.
8227270962aSWarner Losh 
8237270962aSWarner Losh   @return A pointer to the newly-created ACPI HID device path structure.
8247270962aSWarner Losh 
8257270962aSWarner Losh **/
8267270962aSWarner Losh static
8277270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextAcpi(IN CHAR16 * TextDeviceNode,IN UINT32 PnPId)8287270962aSWarner Losh ConvertFromTextAcpi (
8297270962aSWarner Losh   IN CHAR16  *TextDeviceNode,
8307270962aSWarner Losh   IN UINT32  PnPId
8317270962aSWarner Losh   )
8327270962aSWarner Losh {
8337270962aSWarner Losh   CHAR16                *UIDStr;
8347270962aSWarner Losh   ACPI_HID_DEVICE_PATH  *Acpi;
8357270962aSWarner Losh 
8367270962aSWarner Losh   UIDStr = GetNextParamStr (&TextDeviceNode);
8377270962aSWarner Losh   Acpi   = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
8387270962aSWarner Losh                                      ACPI_DEVICE_PATH,
8397270962aSWarner Losh                                      ACPI_DP,
8407270962aSWarner Losh                                      (UINT16)sizeof (ACPI_HID_DEVICE_PATH)
8417270962aSWarner Losh                                      );
8427270962aSWarner Losh 
843*05653fc7SJose Luis Duran   if (Acpi != NULL) {
8447270962aSWarner Losh     Acpi->HID = EFI_PNP_ID (PnPId);
8457270962aSWarner Losh     Acpi->UID = (UINT32)Strtoi (UIDStr);
846*05653fc7SJose Luis Duran   }
8477270962aSWarner Losh 
8487270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
8497270962aSWarner Losh }
8507270962aSWarner Losh 
8517270962aSWarner Losh /**
8527270962aSWarner Losh   Converts a text device path node to PCI root device path structure.
8537270962aSWarner Losh 
8547270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
8557270962aSWarner Losh 
8567270962aSWarner Losh   @return A pointer to the newly-created PCI root device path structure.
8577270962aSWarner Losh 
8587270962aSWarner Losh **/
8597270962aSWarner Losh static
8607270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPciRoot(IN CHAR16 * TextDeviceNode)8617270962aSWarner Losh DevPathFromTextPciRoot (
8627270962aSWarner Losh   IN CHAR16  *TextDeviceNode
8637270962aSWarner Losh   )
8647270962aSWarner Losh {
8657270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);
8667270962aSWarner Losh }
8677270962aSWarner Losh 
8687270962aSWarner Losh /**
8697270962aSWarner Losh   Converts a text device path node to PCIE root device path structure.
8707270962aSWarner Losh 
8717270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
8727270962aSWarner Losh 
8737270962aSWarner Losh   @return A pointer to the newly-created PCIE root device path structure.
8747270962aSWarner Losh 
8757270962aSWarner Losh **/
8767270962aSWarner Losh static
8777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcieRoot(IN CHAR16 * TextDeviceNode)8787270962aSWarner Losh DevPathFromTextPcieRoot (
8797270962aSWarner Losh   IN CHAR16  *TextDeviceNode
8807270962aSWarner Losh   )
8817270962aSWarner Losh {
8827270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);
8837270962aSWarner Losh }
8847270962aSWarner Losh 
8857270962aSWarner Losh /**
8867270962aSWarner Losh   Converts a text device path node to Floppy device path structure.
8877270962aSWarner Losh 
8887270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
8897270962aSWarner Losh 
8907270962aSWarner Losh   @return A pointer to the newly-created Floppy device path structure.
8917270962aSWarner Losh 
8927270962aSWarner Losh **/
8937270962aSWarner Losh static
8947270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFloppy(IN CHAR16 * TextDeviceNode)8957270962aSWarner Losh DevPathFromTextFloppy (
8967270962aSWarner Losh   IN CHAR16  *TextDeviceNode
8977270962aSWarner Losh   )
8987270962aSWarner Losh {
8997270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0604);
9007270962aSWarner Losh }
9017270962aSWarner Losh 
9027270962aSWarner Losh /**
9037270962aSWarner Losh   Converts a text device path node to Keyboard device path structure.
9047270962aSWarner Losh 
9057270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
9067270962aSWarner Losh 
9077270962aSWarner Losh   @return A pointer to the newly-created  Keyboard device path structure.
9087270962aSWarner Losh 
9097270962aSWarner Losh **/
9107270962aSWarner Losh static
9117270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextKeyboard(IN CHAR16 * TextDeviceNode)9127270962aSWarner Losh DevPathFromTextKeyboard (
9137270962aSWarner Losh   IN CHAR16  *TextDeviceNode
9147270962aSWarner Losh   )
9157270962aSWarner Losh {
9167270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0301);
9177270962aSWarner Losh }
9187270962aSWarner Losh 
9197270962aSWarner Losh /**
9207270962aSWarner Losh   Converts a text device path node to Serial device path structure.
9217270962aSWarner Losh 
9227270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
9237270962aSWarner Losh 
9247270962aSWarner Losh   @return A pointer to the newly-created Serial device path structure.
9257270962aSWarner Losh 
9267270962aSWarner Losh **/
9277270962aSWarner Losh static
9287270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSerial(IN CHAR16 * TextDeviceNode)9297270962aSWarner Losh DevPathFromTextSerial (
9307270962aSWarner Losh   IN CHAR16  *TextDeviceNode
9317270962aSWarner Losh   )
9327270962aSWarner Losh {
9337270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0501);
9347270962aSWarner Losh }
9357270962aSWarner Losh 
9367270962aSWarner Losh /**
9377270962aSWarner Losh   Converts a text device path node to Parallel Port device path structure.
9387270962aSWarner Losh 
9397270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
9407270962aSWarner Losh 
9417270962aSWarner Losh   @return A pointer to the newly-created Parallel Port device path structure.
9427270962aSWarner Losh 
9437270962aSWarner Losh **/
9447270962aSWarner Losh static
9457270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextParallelPort(IN CHAR16 * TextDeviceNode)9467270962aSWarner Losh DevPathFromTextParallelPort (
9477270962aSWarner Losh   IN CHAR16  *TextDeviceNode
9487270962aSWarner Losh   )
9497270962aSWarner Losh {
9507270962aSWarner Losh   return ConvertFromTextAcpi (TextDeviceNode, 0x0401);
9517270962aSWarner Losh }
9527270962aSWarner Losh 
9537270962aSWarner Losh /**
9547270962aSWarner Losh   Converts a text device path node to ACPI extension device path structure.
9557270962aSWarner Losh 
9567270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
9577270962aSWarner Losh 
9587270962aSWarner Losh   @return A pointer to the newly-created ACPI extension device path structure.
9597270962aSWarner Losh 
9607270962aSWarner Losh **/
9617270962aSWarner Losh static
9627270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiEx(IN CHAR16 * TextDeviceNode)9637270962aSWarner Losh DevPathFromTextAcpiEx (
9647270962aSWarner Losh   IN CHAR16  *TextDeviceNode
9657270962aSWarner Losh   )
9667270962aSWarner Losh {
9677270962aSWarner Losh   CHAR16                         *HIDStr;
9687270962aSWarner Losh   CHAR16                         *CIDStr;
9697270962aSWarner Losh   CHAR16                         *UIDStr;
9707270962aSWarner Losh   CHAR16                         *HIDSTRStr;
9717270962aSWarner Losh   CHAR16                         *CIDSTRStr;
9727270962aSWarner Losh   CHAR16                         *UIDSTRStr;
9737270962aSWarner Losh   CHAR8                          *AsciiStr;
9747270962aSWarner Losh   UINT16                         Length;
9757270962aSWarner Losh   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
9767270962aSWarner Losh 
9777270962aSWarner Losh   HIDStr    = GetNextParamStr (&TextDeviceNode);
9787270962aSWarner Losh   CIDStr    = GetNextParamStr (&TextDeviceNode);
9797270962aSWarner Losh   UIDStr    = GetNextParamStr (&TextDeviceNode);
9807270962aSWarner Losh   HIDSTRStr = GetNextParamStr (&TextDeviceNode);
9817270962aSWarner Losh   CIDSTRStr = GetNextParamStr (&TextDeviceNode);
9827270962aSWarner Losh   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
9837270962aSWarner Losh 
9847270962aSWarner Losh   Length = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
9857270962aSWarner Losh   Length = (UINT16)(Length + StrLen (UIDSTRStr) + 1);
9867270962aSWarner Losh   Length = (UINT16)(Length + StrLen (CIDSTRStr) + 1);
9877270962aSWarner Losh   AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
9887270962aSWarner Losh                                               ACPI_DEVICE_PATH,
9897270962aSWarner Losh                                               ACPI_EXTENDED_DP,
9907270962aSWarner Losh                                               Length
9917270962aSWarner Losh                                               );
9927270962aSWarner Losh 
993*05653fc7SJose Luis Duran   if (AcpiEx != NULL) {
9947270962aSWarner Losh     AcpiEx->HID = EisaIdFromText (HIDStr);
9957270962aSWarner Losh     AcpiEx->CID = EisaIdFromText (CIDStr);
9967270962aSWarner Losh     AcpiEx->UID = (UINT32)Strtoi (UIDStr);
9977270962aSWarner Losh 
9987270962aSWarner Losh     AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
9997270962aSWarner Losh     StrToAscii (HIDSTRStr, &AsciiStr);
10007270962aSWarner Losh     StrToAscii (UIDSTRStr, &AsciiStr);
10017270962aSWarner Losh     StrToAscii (CIDSTRStr, &AsciiStr);
1002*05653fc7SJose Luis Duran   }
10037270962aSWarner Losh 
10047270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
10057270962aSWarner Losh }
10067270962aSWarner Losh 
10077270962aSWarner Losh /**
10087270962aSWarner Losh   Converts a text device path node to ACPI extension device path structure.
10097270962aSWarner Losh 
10107270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
10117270962aSWarner Losh 
10127270962aSWarner Losh   @return A pointer to the newly-created ACPI extension device path structure.
10137270962aSWarner Losh 
10147270962aSWarner Losh **/
10157270962aSWarner Losh static
10167270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiExp(IN CHAR16 * TextDeviceNode)10177270962aSWarner Losh DevPathFromTextAcpiExp (
10187270962aSWarner Losh   IN CHAR16  *TextDeviceNode
10197270962aSWarner Losh   )
10207270962aSWarner Losh {
10217270962aSWarner Losh   CHAR16                         *HIDStr;
10227270962aSWarner Losh   CHAR16                         *CIDStr;
10237270962aSWarner Losh   CHAR16                         *UIDSTRStr;
10247270962aSWarner Losh   CHAR8                          *AsciiStr;
10257270962aSWarner Losh   UINT16                         Length;
10267270962aSWarner Losh   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
10277270962aSWarner Losh 
10287270962aSWarner Losh   HIDStr    = GetNextParamStr (&TextDeviceNode);
10297270962aSWarner Losh   CIDStr    = GetNextParamStr (&TextDeviceNode);
10307270962aSWarner Losh   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
10317270962aSWarner Losh   Length    = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);
10327270962aSWarner Losh   AcpiEx    = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
10337270962aSWarner Losh                                                  ACPI_DEVICE_PATH,
10347270962aSWarner Losh                                                  ACPI_EXTENDED_DP,
10357270962aSWarner Losh                                                  Length
10367270962aSWarner Losh                                                  );
10377270962aSWarner Losh 
1038*05653fc7SJose Luis Duran   if (AcpiEx == NULL) {
1039*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
1040*05653fc7SJose Luis Duran   }
1041*05653fc7SJose Luis Duran 
10427270962aSWarner Losh   AcpiEx->HID = EisaIdFromText (HIDStr);
1043492d9953SJose Luis Duran   //
1044492d9953SJose Luis Duran   // According to UEFI spec, the CID parameter is optional and has a default value of 0.
1045492d9953SJose Luis Duran   // So when the CID parameter is not specified or specified as 0 in the text device node.
1046492d9953SJose Luis Duran   // Set the CID to 0 in the ACPI extension device path structure.
1047492d9953SJose Luis Duran   //
10485754f582SJose Luis Duran   if ((*CIDStr == '\0') || (*CIDStr == '0')) {
1049492d9953SJose Luis Duran     AcpiEx->CID = 0;
1050492d9953SJose Luis Duran   } else {
10517270962aSWarner Losh     AcpiEx->CID = EisaIdFromText (CIDStr);
1052492d9953SJose Luis Duran   }
10535754f582SJose Luis Duran 
10547270962aSWarner Losh   AcpiEx->UID = 0;
10557270962aSWarner Losh 
10567270962aSWarner Losh   AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
10577270962aSWarner Losh   //
10587270962aSWarner Losh   // HID string is NULL
10597270962aSWarner Losh   //
10607270962aSWarner Losh   *AsciiStr = '\0';
10617270962aSWarner Losh   //
10627270962aSWarner Losh   // Convert UID string
10637270962aSWarner Losh   //
10647270962aSWarner Losh   AsciiStr++;
10657270962aSWarner Losh   StrToAscii (UIDSTRStr, &AsciiStr);
10667270962aSWarner Losh   //
10677270962aSWarner Losh   // CID string is NULL
10687270962aSWarner Losh   //
10697270962aSWarner Losh   *AsciiStr = '\0';
10707270962aSWarner Losh 
10717270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
10727270962aSWarner Losh }
10737270962aSWarner Losh 
10747270962aSWarner Losh /**
10757270962aSWarner Losh   Converts a text device path node to ACPI _ADR device path structure.
10767270962aSWarner Losh 
10777270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
10787270962aSWarner Losh 
10797270962aSWarner Losh   @return A pointer to the newly-created ACPI _ADR device path structure.
10807270962aSWarner Losh 
10817270962aSWarner Losh **/
10827270962aSWarner Losh static
10837270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiAdr(IN CHAR16 * TextDeviceNode)10847270962aSWarner Losh DevPathFromTextAcpiAdr (
10857270962aSWarner Losh   IN CHAR16  *TextDeviceNode
10867270962aSWarner Losh   )
10877270962aSWarner Losh {
10887270962aSWarner Losh   CHAR16                *DisplayDeviceStr;
10897270962aSWarner Losh   ACPI_ADR_DEVICE_PATH  *AcpiAdr;
10907270962aSWarner Losh   UINTN                 Index;
10917270962aSWarner Losh   UINTN                 Length;
10927270962aSWarner Losh 
10937270962aSWarner Losh   AcpiAdr = (ACPI_ADR_DEVICE_PATH *)CreateDeviceNode (
10947270962aSWarner Losh                                       ACPI_DEVICE_PATH,
10957270962aSWarner Losh                                       ACPI_ADR_DP,
10967270962aSWarner Losh                                       (UINT16)sizeof (ACPI_ADR_DEVICE_PATH)
10977270962aSWarner Losh                                       );
1098*05653fc7SJose Luis Duran   if (AcpiAdr == NULL) {
10997270962aSWarner Losh     ASSERT (AcpiAdr != NULL);
1100*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
1101*05653fc7SJose Luis Duran   }
11027270962aSWarner Losh 
11037270962aSWarner Losh   for (Index = 0; ; Index++) {
11047270962aSWarner Losh     DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);
11057270962aSWarner Losh     if (IS_NULL (*DisplayDeviceStr)) {
11067270962aSWarner Losh       break;
11077270962aSWarner Losh     }
11085754f582SJose Luis Duran 
11097270962aSWarner Losh     if (Index > 0) {
11107270962aSWarner Losh       Length  = DevicePathNodeLength (AcpiAdr);
11117270962aSWarner Losh       AcpiAdr = ReallocatePool (
11127270962aSWarner Losh                   Length,
11137270962aSWarner Losh                   Length + sizeof (UINT32),
11147270962aSWarner Losh                   AcpiAdr
11157270962aSWarner Losh                   );
1116*05653fc7SJose Luis Duran 
1117*05653fc7SJose Luis Duran       if (AcpiAdr == NULL) {
11187270962aSWarner Losh         ASSERT (AcpiAdr != NULL);
1119*05653fc7SJose Luis Duran         return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
1120*05653fc7SJose Luis Duran       }
1121*05653fc7SJose Luis Duran 
11227270962aSWarner Losh       SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));
11237270962aSWarner Losh     }
11247270962aSWarner Losh 
11257270962aSWarner Losh     (&AcpiAdr->ADR)[Index] = (UINT32)Strtoi (DisplayDeviceStr);
11267270962aSWarner Losh   }
11277270962aSWarner Losh 
11287270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
11297270962aSWarner Losh }
11307270962aSWarner Losh 
11317270962aSWarner Losh /**
11327270962aSWarner Losh   Converts a generic messaging text device path node to messaging device path structure.
11337270962aSWarner Losh 
11347270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
11357270962aSWarner Losh 
11367270962aSWarner Losh   @return A pointer to messaging device path structure.
11377270962aSWarner Losh 
11387270962aSWarner Losh **/
11397270962aSWarner Losh static
11407270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMsg(IN CHAR16 * TextDeviceNode)11417270962aSWarner Losh DevPathFromTextMsg (
11427270962aSWarner Losh   IN CHAR16  *TextDeviceNode
11437270962aSWarner Losh   )
11447270962aSWarner Losh {
11457270962aSWarner Losh   return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);
11467270962aSWarner Losh }
11477270962aSWarner Losh 
11487270962aSWarner Losh /**
11497270962aSWarner Losh   Converts a text device path node to Parallel Port device path structure.
11507270962aSWarner Losh 
11517270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
11527270962aSWarner Losh 
11537270962aSWarner Losh   @return A pointer to the newly-created Parallel Port device path structure.
11547270962aSWarner Losh 
11557270962aSWarner Losh **/
11567270962aSWarner Losh static
11577270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAta(IN CHAR16 * TextDeviceNode)11587270962aSWarner Losh DevPathFromTextAta (
11597270962aSWarner Losh   IN CHAR16  *TextDeviceNode
11607270962aSWarner Losh   )
11617270962aSWarner Losh {
11627270962aSWarner Losh   CHAR16             *PrimarySecondaryStr;
11637270962aSWarner Losh   CHAR16             *SlaveMasterStr;
11647270962aSWarner Losh   CHAR16             *LunStr;
11657270962aSWarner Losh   ATAPI_DEVICE_PATH  *Atapi;
11667270962aSWarner Losh 
11677270962aSWarner Losh   Atapi = (ATAPI_DEVICE_PATH *)CreateDeviceNode (
11687270962aSWarner Losh                                  MESSAGING_DEVICE_PATH,
11697270962aSWarner Losh                                  MSG_ATAPI_DP,
11707270962aSWarner Losh                                  (UINT16)sizeof (ATAPI_DEVICE_PATH)
11717270962aSWarner Losh                                  );
11727270962aSWarner Losh 
1173*05653fc7SJose Luis Duran   if (Atapi == NULL) {
1174*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Atapi;
1175*05653fc7SJose Luis Duran   }
1176*05653fc7SJose Luis Duran 
11777270962aSWarner Losh   PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);
11787270962aSWarner Losh   SlaveMasterStr      = GetNextParamStr (&TextDeviceNode);
11797270962aSWarner Losh   LunStr              = GetNextParamStr (&TextDeviceNode);
11807270962aSWarner Losh 
11817270962aSWarner Losh   if (StrCmp (PrimarySecondaryStr, "Primary") == 0) {
11827270962aSWarner Losh     Atapi->PrimarySecondary = 0;
11837270962aSWarner Losh   } else if (StrCmp (PrimarySecondaryStr, "Secondary") == 0) {
11847270962aSWarner Losh     Atapi->PrimarySecondary = 1;
11857270962aSWarner Losh   } else {
11867270962aSWarner Losh     Atapi->PrimarySecondary = (UINT8)Strtoi (PrimarySecondaryStr);
11877270962aSWarner Losh   }
11885754f582SJose Luis Duran 
11897270962aSWarner Losh   if (StrCmp (SlaveMasterStr, "Master") == 0) {
11907270962aSWarner Losh     Atapi->SlaveMaster = 0;
11917270962aSWarner Losh   } else if (StrCmp (SlaveMasterStr, "Slave") == 0) {
11927270962aSWarner Losh     Atapi->SlaveMaster = 1;
11937270962aSWarner Losh   } else {
11947270962aSWarner Losh     Atapi->SlaveMaster = (UINT8)Strtoi (SlaveMasterStr);
11957270962aSWarner Losh   }
11967270962aSWarner Losh 
11977270962aSWarner Losh   Atapi->Lun = (UINT16)Strtoi (LunStr);
11987270962aSWarner Losh 
11997270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Atapi;
12007270962aSWarner Losh }
12017270962aSWarner Losh 
12027270962aSWarner Losh /**
12037270962aSWarner Losh   Converts a text device path node to SCSI device path structure.
12047270962aSWarner Losh 
12057270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
12067270962aSWarner Losh 
12077270962aSWarner Losh   @return A pointer to the newly-created SCSI device path structure.
12087270962aSWarner Losh 
12097270962aSWarner Losh **/
12107270962aSWarner Losh static
12117270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextScsi(IN CHAR16 * TextDeviceNode)12127270962aSWarner Losh DevPathFromTextScsi (
12137270962aSWarner Losh   IN CHAR16  *TextDeviceNode
12147270962aSWarner Losh   )
12157270962aSWarner Losh {
12167270962aSWarner Losh   CHAR16            *PunStr;
12177270962aSWarner Losh   CHAR16            *LunStr;
12187270962aSWarner Losh   SCSI_DEVICE_PATH  *Scsi;
12197270962aSWarner Losh 
12207270962aSWarner Losh   PunStr = GetNextParamStr (&TextDeviceNode);
12217270962aSWarner Losh   LunStr = GetNextParamStr (&TextDeviceNode);
12227270962aSWarner Losh   Scsi   = (SCSI_DEVICE_PATH *)CreateDeviceNode (
12237270962aSWarner Losh                                  MESSAGING_DEVICE_PATH,
12247270962aSWarner Losh                                  MSG_SCSI_DP,
12257270962aSWarner Losh                                  (UINT16)sizeof (SCSI_DEVICE_PATH)
12267270962aSWarner Losh                                  );
12277270962aSWarner Losh 
1228*05653fc7SJose Luis Duran   if (Scsi != NULL) {
12297270962aSWarner Losh     Scsi->Pun = (UINT16)Strtoi (PunStr);
12307270962aSWarner Losh     Scsi->Lun = (UINT16)Strtoi (LunStr);
1231*05653fc7SJose Luis Duran   }
12327270962aSWarner Losh 
12337270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Scsi;
12347270962aSWarner Losh }
12357270962aSWarner Losh 
12367270962aSWarner Losh /**
12377270962aSWarner Losh   Converts a text device path node to Fibre device path structure.
12387270962aSWarner Losh 
12397270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
12407270962aSWarner Losh 
12417270962aSWarner Losh   @return A pointer to the newly-created Fibre device path structure.
12427270962aSWarner Losh 
12437270962aSWarner Losh **/
12447270962aSWarner Losh static
12457270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibre(IN CHAR16 * TextDeviceNode)12467270962aSWarner Losh DevPathFromTextFibre (
12477270962aSWarner Losh   IN CHAR16  *TextDeviceNode
12487270962aSWarner Losh   )
12497270962aSWarner Losh {
12507270962aSWarner Losh   CHAR16                    *WWNStr;
12517270962aSWarner Losh   CHAR16                    *LunStr;
12527270962aSWarner Losh   FIBRECHANNEL_DEVICE_PATH  *Fibre;
12537270962aSWarner Losh 
12547270962aSWarner Losh   WWNStr = GetNextParamStr (&TextDeviceNode);
12557270962aSWarner Losh   LunStr = GetNextParamStr (&TextDeviceNode);
12567270962aSWarner Losh   Fibre  = (FIBRECHANNEL_DEVICE_PATH *)CreateDeviceNode (
12577270962aSWarner Losh                                          MESSAGING_DEVICE_PATH,
12587270962aSWarner Losh                                          MSG_FIBRECHANNEL_DP,
12597270962aSWarner Losh                                          (UINT16)sizeof (FIBRECHANNEL_DEVICE_PATH)
12607270962aSWarner Losh                                          );
12617270962aSWarner Losh 
1262*05653fc7SJose Luis Duran   if (Fibre != NULL) {
12637270962aSWarner Losh     Fibre->Reserved = 0;
12647270962aSWarner Losh     Strtoi64 (WWNStr, &Fibre->WWN);
12657270962aSWarner Losh     Strtoi64 (LunStr, &Fibre->Lun);
1266*05653fc7SJose Luis Duran   }
12677270962aSWarner Losh 
12687270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Fibre;
12697270962aSWarner Losh }
12707270962aSWarner Losh 
12717270962aSWarner Losh /**
12727270962aSWarner Losh   Converts a text device path node to FibreEx device path structure.
12737270962aSWarner Losh 
12747270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
12757270962aSWarner Losh 
12767270962aSWarner Losh   @return A pointer to the newly-created FibreEx device path structure.
12777270962aSWarner Losh 
12787270962aSWarner Losh **/
12797270962aSWarner Losh static
12807270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibreEx(IN CHAR16 * TextDeviceNode)12817270962aSWarner Losh DevPathFromTextFibreEx (
12827270962aSWarner Losh   IN CHAR16  *TextDeviceNode
12837270962aSWarner Losh   )
12847270962aSWarner Losh {
12857270962aSWarner Losh   CHAR16                      *WWNStr;
12867270962aSWarner Losh   CHAR16                      *LunStr;
12877270962aSWarner Losh   FIBRECHANNELEX_DEVICE_PATH  *FibreEx;
12887270962aSWarner Losh 
12897270962aSWarner Losh   WWNStr  = GetNextParamStr (&TextDeviceNode);
12907270962aSWarner Losh   LunStr  = GetNextParamStr (&TextDeviceNode);
12917270962aSWarner Losh   FibreEx = (FIBRECHANNELEX_DEVICE_PATH *)CreateDeviceNode (
12927270962aSWarner Losh                                             MESSAGING_DEVICE_PATH,
12937270962aSWarner Losh                                             MSG_FIBRECHANNELEX_DP,
12947270962aSWarner Losh                                             (UINT16)sizeof (FIBRECHANNELEX_DEVICE_PATH)
12957270962aSWarner Losh                                             );
12967270962aSWarner Losh 
1297*05653fc7SJose Luis Duran   if (FibreEx != NULL) {
12987270962aSWarner Losh     FibreEx->Reserved = 0;
12997270962aSWarner Losh     Strtoi64 (WWNStr, (UINT64 *)(&FibreEx->WWN));
13007270962aSWarner Losh     Strtoi64 (LunStr, (UINT64 *)(&FibreEx->Lun));
13017270962aSWarner Losh 
13027270962aSWarner Losh     *(UINT64 *)(&FibreEx->WWN) = SwapBytes64 (*(UINT64 *)(&FibreEx->WWN));
13037270962aSWarner Losh     *(UINT64 *)(&FibreEx->Lun) = SwapBytes64 (*(UINT64 *)(&FibreEx->Lun));
1304*05653fc7SJose Luis Duran   }
13057270962aSWarner Losh 
13067270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)FibreEx;
13077270962aSWarner Losh }
13087270962aSWarner Losh 
13097270962aSWarner Losh /**
13107270962aSWarner Losh   Converts a text device path node to 1394 device path structure.
13117270962aSWarner Losh 
13127270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
13137270962aSWarner Losh 
13147270962aSWarner Losh   @return A pointer to the newly-created 1394 device path structure.
13157270962aSWarner Losh 
13167270962aSWarner Losh **/
13177270962aSWarner Losh static
13187270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromText1394(IN CHAR16 * TextDeviceNode)13197270962aSWarner Losh DevPathFromText1394 (
13207270962aSWarner Losh   IN CHAR16  *TextDeviceNode
13217270962aSWarner Losh   )
13227270962aSWarner Losh {
13237270962aSWarner Losh   CHAR16             *GuidStr;
13247270962aSWarner Losh   F1394_DEVICE_PATH  *F1394DevPath;
13257270962aSWarner Losh 
13267270962aSWarner Losh   GuidStr      = GetNextParamStr (&TextDeviceNode);
13277270962aSWarner Losh   F1394DevPath = (F1394_DEVICE_PATH *)CreateDeviceNode (
13287270962aSWarner Losh                                         MESSAGING_DEVICE_PATH,
13297270962aSWarner Losh                                         MSG_1394_DP,
13307270962aSWarner Losh                                         (UINT16)sizeof (F1394_DEVICE_PATH)
13317270962aSWarner Losh                                         );
13327270962aSWarner Losh 
1333*05653fc7SJose Luis Duran   if (F1394DevPath != NULL) {
13347270962aSWarner Losh     F1394DevPath->Reserved = 0;
13357270962aSWarner Losh     F1394DevPath->Guid     = StrHexToUint64 (GuidStr);
1336*05653fc7SJose Luis Duran   }
13377270962aSWarner Losh 
13387270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)F1394DevPath;
13397270962aSWarner Losh }
13407270962aSWarner Losh 
13417270962aSWarner Losh /**
13427270962aSWarner Losh   Converts a text device path node to USB device path structure.
13437270962aSWarner Losh 
13447270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
13457270962aSWarner Losh 
13467270962aSWarner Losh   @return A pointer to the newly-created USB device path structure.
13477270962aSWarner Losh 
13487270962aSWarner Losh **/
13497270962aSWarner Losh static
13507270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsb(IN CHAR16 * TextDeviceNode)13517270962aSWarner Losh DevPathFromTextUsb (
13527270962aSWarner Losh   IN CHAR16  *TextDeviceNode
13537270962aSWarner Losh   )
13547270962aSWarner Losh {
13557270962aSWarner Losh   CHAR16           *PortStr;
13567270962aSWarner Losh   CHAR16           *InterfaceStr;
13577270962aSWarner Losh   USB_DEVICE_PATH  *Usb;
13587270962aSWarner Losh 
13597270962aSWarner Losh   PortStr      = GetNextParamStr (&TextDeviceNode);
13607270962aSWarner Losh   InterfaceStr = GetNextParamStr (&TextDeviceNode);
13617270962aSWarner Losh   Usb          = (USB_DEVICE_PATH *)CreateDeviceNode (
13627270962aSWarner Losh                                       MESSAGING_DEVICE_PATH,
13637270962aSWarner Losh                                       MSG_USB_DP,
13647270962aSWarner Losh                                       (UINT16)sizeof (USB_DEVICE_PATH)
13657270962aSWarner Losh                                       );
13667270962aSWarner Losh 
1367*05653fc7SJose Luis Duran   if (Usb != NULL) {
13687270962aSWarner Losh     Usb->ParentPortNumber = (UINT8)Strtoi (PortStr);
13697270962aSWarner Losh     Usb->InterfaceNumber  = (UINT8)Strtoi (InterfaceStr);
1370*05653fc7SJose Luis Duran   }
13717270962aSWarner Losh 
13727270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Usb;
13737270962aSWarner Losh }
13747270962aSWarner Losh 
13757270962aSWarner Losh /**
13767270962aSWarner Losh   Converts a text device path node to I20 device path structure.
13777270962aSWarner Losh 
13787270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
13797270962aSWarner Losh 
13807270962aSWarner Losh   @return A pointer to the newly-created I20 device path structure.
13817270962aSWarner Losh 
13827270962aSWarner Losh **/
13837270962aSWarner Losh static
13847270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextI2O(IN CHAR16 * TextDeviceNode)13857270962aSWarner Losh DevPathFromTextI2O (
13867270962aSWarner Losh   IN CHAR16  *TextDeviceNode
13877270962aSWarner Losh   )
13887270962aSWarner Losh {
13897270962aSWarner Losh   CHAR16           *TIDStr;
13907270962aSWarner Losh   I2O_DEVICE_PATH  *I2ODevPath;
13917270962aSWarner Losh 
13927270962aSWarner Losh   TIDStr     = GetNextParamStr (&TextDeviceNode);
13937270962aSWarner Losh   I2ODevPath = (I2O_DEVICE_PATH *)CreateDeviceNode (
13947270962aSWarner Losh                                     MESSAGING_DEVICE_PATH,
13957270962aSWarner Losh                                     MSG_I2O_DP,
13967270962aSWarner Losh                                     (UINT16)sizeof (I2O_DEVICE_PATH)
13977270962aSWarner Losh                                     );
13987270962aSWarner Losh 
1399*05653fc7SJose Luis Duran   if (I2ODevPath != NULL) {
14007270962aSWarner Losh     I2ODevPath->Tid = (UINT32)Strtoi (TIDStr);
1401*05653fc7SJose Luis Duran   }
14027270962aSWarner Losh 
14037270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)I2ODevPath;
14047270962aSWarner Losh }
14057270962aSWarner Losh 
14067270962aSWarner Losh /**
14077270962aSWarner Losh   Converts a text device path node to Infini Band device path structure.
14087270962aSWarner Losh 
14097270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
14107270962aSWarner Losh 
14117270962aSWarner Losh   @return A pointer to the newly-created Infini Band device path structure.
14127270962aSWarner Losh 
14137270962aSWarner Losh **/
14147270962aSWarner Losh static
14157270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextInfiniband(IN CHAR16 * TextDeviceNode)14167270962aSWarner Losh DevPathFromTextInfiniband (
14177270962aSWarner Losh   IN CHAR16  *TextDeviceNode
14187270962aSWarner Losh   )
14197270962aSWarner Losh {
14207270962aSWarner Losh   CHAR16                  *FlagsStr;
14217270962aSWarner Losh   CHAR16                  *GuidStr;
14227270962aSWarner Losh   CHAR16                  *SidStr;
14237270962aSWarner Losh   CHAR16                  *TidStr;
14247270962aSWarner Losh   CHAR16                  *DidStr;
14257270962aSWarner Losh   INFINIBAND_DEVICE_PATH  *InfiniBand;
14267270962aSWarner Losh 
14277270962aSWarner Losh   FlagsStr   = GetNextParamStr (&TextDeviceNode);
14287270962aSWarner Losh   GuidStr    = GetNextParamStr (&TextDeviceNode);
14297270962aSWarner Losh   SidStr     = GetNextParamStr (&TextDeviceNode);
14307270962aSWarner Losh   TidStr     = GetNextParamStr (&TextDeviceNode);
14317270962aSWarner Losh   DidStr     = GetNextParamStr (&TextDeviceNode);
14327270962aSWarner Losh   InfiniBand = (INFINIBAND_DEVICE_PATH *)CreateDeviceNode (
14337270962aSWarner Losh                                            MESSAGING_DEVICE_PATH,
14347270962aSWarner Losh                                            MSG_INFINIBAND_DP,
14357270962aSWarner Losh                                            (UINT16)sizeof (INFINIBAND_DEVICE_PATH)
14367270962aSWarner Losh                                            );
14377270962aSWarner Losh 
1438*05653fc7SJose Luis Duran   if (InfiniBand != NULL) {
14397270962aSWarner Losh     InfiniBand->ResourceFlags = (UINT32)Strtoi (FlagsStr);
14407270962aSWarner Losh     StrToGuid (GuidStr, (EFI_GUID *)InfiniBand->PortGid);
14417270962aSWarner Losh     Strtoi64 (SidStr, &InfiniBand->ServiceId);
14427270962aSWarner Losh     Strtoi64 (TidStr, &InfiniBand->TargetPortId);
14437270962aSWarner Losh     Strtoi64 (DidStr, &InfiniBand->DeviceId);
1444*05653fc7SJose Luis Duran   }
14457270962aSWarner Losh 
14467270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)InfiniBand;
14477270962aSWarner Losh }
14487270962aSWarner Losh 
14497270962aSWarner Losh /**
14507270962aSWarner Losh   Converts a text device path node to Vendor-Defined Messaging device path structure.
14517270962aSWarner Losh 
14527270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
14537270962aSWarner Losh 
14547270962aSWarner Losh   @return A pointer to the newly-created Vendor-Defined Messaging device path structure.
14557270962aSWarner Losh 
14567270962aSWarner Losh **/
14577270962aSWarner Losh static
14587270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMsg(IN CHAR16 * TextDeviceNode)14597270962aSWarner Losh DevPathFromTextVenMsg (
14607270962aSWarner Losh   IN CHAR16  *TextDeviceNode
14617270962aSWarner Losh   )
14627270962aSWarner Losh {
14637270962aSWarner Losh   return ConvertFromTextVendor (
14647270962aSWarner Losh            TextDeviceNode,
14657270962aSWarner Losh            MESSAGING_DEVICE_PATH,
14667270962aSWarner Losh            MSG_VENDOR_DP
14677270962aSWarner Losh            );
14687270962aSWarner Losh }
14697270962aSWarner Losh 
14707270962aSWarner Losh /**
14717270962aSWarner Losh   Converts a text device path node to Vendor defined PC-ANSI device path structure.
14727270962aSWarner Losh 
14737270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
14747270962aSWarner Losh 
14757270962aSWarner Losh   @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.
14767270962aSWarner Losh 
14777270962aSWarner Losh **/
14787270962aSWarner Losh static
14797270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenPcAnsi(IN CHAR16 * TextDeviceNode)14807270962aSWarner Losh DevPathFromTextVenPcAnsi (
14817270962aSWarner Losh   IN CHAR16  *TextDeviceNode
14827270962aSWarner Losh   )
14837270962aSWarner Losh {
14847270962aSWarner Losh   VENDOR_DEVICE_PATH  *Vendor;
14857270962aSWarner Losh 
14867270962aSWarner Losh   Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
14877270962aSWarner Losh                                    MESSAGING_DEVICE_PATH,
14887270962aSWarner Losh                                    MSG_VENDOR_DP,
14895754f582SJose Luis Duran                                    (UINT16)sizeof (VENDOR_DEVICE_PATH)
14905754f582SJose Luis Duran                                    );
1491*05653fc7SJose Luis Duran 
1492*05653fc7SJose Luis Duran   if (Vendor != NULL) {
14937270962aSWarner Losh     CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
1494*05653fc7SJose Luis Duran   }
14957270962aSWarner Losh 
14967270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
14977270962aSWarner Losh }
14987270962aSWarner Losh 
14997270962aSWarner Losh /**
15007270962aSWarner Losh   Converts a text device path node to Vendor defined VT100 device path structure.
15017270962aSWarner Losh 
15027270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
15037270962aSWarner Losh 
15047270962aSWarner Losh   @return A pointer to the newly-created Vendor defined VT100 device path structure.
15057270962aSWarner Losh 
15067270962aSWarner Losh **/
15077270962aSWarner Losh static
15087270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100(IN CHAR16 * TextDeviceNode)15097270962aSWarner Losh DevPathFromTextVenVt100 (
15107270962aSWarner Losh   IN CHAR16  *TextDeviceNode
15117270962aSWarner Losh   )
15127270962aSWarner Losh {
15137270962aSWarner Losh   VENDOR_DEVICE_PATH  *Vendor;
15147270962aSWarner Losh 
15157270962aSWarner Losh   Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
15167270962aSWarner Losh                                    MESSAGING_DEVICE_PATH,
15177270962aSWarner Losh                                    MSG_VENDOR_DP,
15185754f582SJose Luis Duran                                    (UINT16)sizeof (VENDOR_DEVICE_PATH)
15195754f582SJose Luis Duran                                    );
1520*05653fc7SJose Luis Duran 
1521*05653fc7SJose Luis Duran   if (Vendor != NULL) {
15227270962aSWarner Losh     CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
1523*05653fc7SJose Luis Duran   }
15247270962aSWarner Losh 
15257270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
15267270962aSWarner Losh }
15277270962aSWarner Losh 
15287270962aSWarner Losh /**
15297270962aSWarner Losh   Converts a text device path node to Vendor defined VT100 Plus device path structure.
15307270962aSWarner Losh 
15317270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
15327270962aSWarner Losh 
15337270962aSWarner Losh   @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.
15347270962aSWarner Losh 
15357270962aSWarner Losh **/
15367270962aSWarner Losh static
15377270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100Plus(IN CHAR16 * TextDeviceNode)15387270962aSWarner Losh DevPathFromTextVenVt100Plus (
15397270962aSWarner Losh   IN CHAR16  *TextDeviceNode
15407270962aSWarner Losh   )
15417270962aSWarner Losh {
15427270962aSWarner Losh   VENDOR_DEVICE_PATH  *Vendor;
15437270962aSWarner Losh 
15447270962aSWarner Losh   Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
15457270962aSWarner Losh                                    MESSAGING_DEVICE_PATH,
15467270962aSWarner Losh                                    MSG_VENDOR_DP,
15475754f582SJose Luis Duran                                    (UINT16)sizeof (VENDOR_DEVICE_PATH)
15485754f582SJose Luis Duran                                    );
1549*05653fc7SJose Luis Duran 
1550*05653fc7SJose Luis Duran   if (Vendor != NULL) {
15517270962aSWarner Losh     CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
1552*05653fc7SJose Luis Duran   }
15537270962aSWarner Losh 
15547270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
15557270962aSWarner Losh }
15567270962aSWarner Losh 
15577270962aSWarner Losh /**
15587270962aSWarner Losh   Converts a text device path node to Vendor defined UTF8 device path structure.
15597270962aSWarner Losh 
15607270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
15617270962aSWarner Losh 
15627270962aSWarner Losh   @return A pointer to the newly-created Vendor defined UTF8 device path structure.
15637270962aSWarner Losh 
15647270962aSWarner Losh **/
15657270962aSWarner Losh static
15667270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenUtf8(IN CHAR16 * TextDeviceNode)15677270962aSWarner Losh DevPathFromTextVenUtf8 (
15687270962aSWarner Losh   IN CHAR16  *TextDeviceNode
15697270962aSWarner Losh   )
15707270962aSWarner Losh {
15717270962aSWarner Losh   VENDOR_DEVICE_PATH  *Vendor;
15727270962aSWarner Losh 
15737270962aSWarner Losh   Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
15747270962aSWarner Losh                                    MESSAGING_DEVICE_PATH,
15757270962aSWarner Losh                                    MSG_VENDOR_DP,
15765754f582SJose Luis Duran                                    (UINT16)sizeof (VENDOR_DEVICE_PATH)
15775754f582SJose Luis Duran                                    );
1578*05653fc7SJose Luis Duran 
1579*05653fc7SJose Luis Duran   if (Vendor != NULL) {
15807270962aSWarner Losh     CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
1581*05653fc7SJose Luis Duran   }
15827270962aSWarner Losh 
15837270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
15847270962aSWarner Losh }
15857270962aSWarner Losh 
15867270962aSWarner Losh /**
15877270962aSWarner Losh   Converts a text device path node to UART Flow Control device path structure.
15887270962aSWarner Losh 
15897270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
15907270962aSWarner Losh 
15917270962aSWarner Losh   @return A pointer to the newly-created UART Flow Control device path structure.
15927270962aSWarner Losh 
15937270962aSWarner Losh **/
15947270962aSWarner Losh static
15957270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUartFlowCtrl(IN CHAR16 * TextDeviceNode)15967270962aSWarner Losh DevPathFromTextUartFlowCtrl (
15977270962aSWarner Losh   IN CHAR16  *TextDeviceNode
15987270962aSWarner Losh   )
15997270962aSWarner Losh {
16007270962aSWarner Losh   CHAR16                         *ValueStr;
16017270962aSWarner Losh   UART_FLOW_CONTROL_DEVICE_PATH  *UartFlowControl;
16027270962aSWarner Losh 
16037270962aSWarner Losh   ValueStr        = GetNextParamStr (&TextDeviceNode);
16047270962aSWarner Losh   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *)CreateDeviceNode (
16057270962aSWarner Losh                                                        MESSAGING_DEVICE_PATH,
16067270962aSWarner Losh                                                        MSG_VENDOR_DP,
16077270962aSWarner Losh                                                        (UINT16)sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
16087270962aSWarner Losh                                                        );
16097270962aSWarner Losh 
1610*05653fc7SJose Luis Duran   if (UartFlowControl != NULL) {
16117270962aSWarner Losh     CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);
16127270962aSWarner Losh     if (StrCmp (ValueStr, "XonXoff") == 0) {
16137270962aSWarner Losh       UartFlowControl->FlowControlMap = 2;
16147270962aSWarner Losh     } else if (StrCmp (ValueStr, "Hardware") == 0) {
16157270962aSWarner Losh       UartFlowControl->FlowControlMap = 1;
16167270962aSWarner Losh     } else {
16177270962aSWarner Losh       UartFlowControl->FlowControlMap = 0;
16187270962aSWarner Losh     }
1619*05653fc7SJose Luis Duran   }
16207270962aSWarner Losh 
16217270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)UartFlowControl;
16227270962aSWarner Losh }
16237270962aSWarner Losh 
16247270962aSWarner Losh /**
16257270962aSWarner Losh   Converts a text device path node to Serial Attached SCSI device path structure.
16267270962aSWarner Losh 
16277270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
16287270962aSWarner Losh 
16297270962aSWarner Losh   @return A pointer to the newly-created Serial Attached SCSI device path structure.
16307270962aSWarner Losh 
16317270962aSWarner Losh **/
16327270962aSWarner Losh static
16337270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSAS(IN CHAR16 * TextDeviceNode)16347270962aSWarner Losh DevPathFromTextSAS (
16357270962aSWarner Losh   IN CHAR16  *TextDeviceNode
16367270962aSWarner Losh   )
16377270962aSWarner Losh {
16387270962aSWarner Losh   CHAR16           *AddressStr;
16397270962aSWarner Losh   CHAR16           *LunStr;
16407270962aSWarner Losh   CHAR16           *RTPStr;
16417270962aSWarner Losh   CHAR16           *SASSATAStr;
16427270962aSWarner Losh   CHAR16           *LocationStr;
16437270962aSWarner Losh   CHAR16           *ConnectStr;
16447270962aSWarner Losh   CHAR16           *DriveBayStr;
16457270962aSWarner Losh   CHAR16           *ReservedStr;
16467270962aSWarner Losh   UINT16           Info;
16477270962aSWarner Losh   UINT16           Uint16;
16487270962aSWarner Losh   SAS_DEVICE_PATH  *Sas;
16497270962aSWarner Losh 
16507270962aSWarner Losh   AddressStr  = GetNextParamStr (&TextDeviceNode);
16517270962aSWarner Losh   LunStr      = GetNextParamStr (&TextDeviceNode);
16527270962aSWarner Losh   RTPStr      = GetNextParamStr (&TextDeviceNode);
16537270962aSWarner Losh   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
16547270962aSWarner Losh   LocationStr = GetNextParamStr (&TextDeviceNode);
16557270962aSWarner Losh   ConnectStr  = GetNextParamStr (&TextDeviceNode);
16567270962aSWarner Losh   DriveBayStr = GetNextParamStr (&TextDeviceNode);
16577270962aSWarner Losh   ReservedStr = GetNextParamStr (&TextDeviceNode);
16587270962aSWarner Losh   Sas         = (SAS_DEVICE_PATH *)CreateDeviceNode (
16597270962aSWarner Losh                                      MESSAGING_DEVICE_PATH,
16607270962aSWarner Losh                                      MSG_VENDOR_DP,
16617270962aSWarner Losh                                      (UINT16)sizeof (SAS_DEVICE_PATH)
16627270962aSWarner Losh                                      );
16637270962aSWarner Losh 
1664*05653fc7SJose Luis Duran   if (Sas == NULL) {
1665*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Sas;
1666*05653fc7SJose Luis Duran   }
1667*05653fc7SJose Luis Duran 
16687270962aSWarner Losh   CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);
16697270962aSWarner Losh   Strtoi64 (AddressStr, &Sas->SasAddress);
16707270962aSWarner Losh   Strtoi64 (LunStr, &Sas->Lun);
16717270962aSWarner Losh   Sas->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
16727270962aSWarner Losh 
16737270962aSWarner Losh   if (StrCmp (SASSATAStr, "NoTopology") == 0) {
16747270962aSWarner Losh     Info = 0x0;
16757270962aSWarner Losh   } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
16767270962aSWarner Losh     Uint16 = (UINT16)Strtoi (DriveBayStr);
16777270962aSWarner Losh     if (Uint16 == 0) {
16787270962aSWarner Losh       Info = 0x1;
16797270962aSWarner Losh     } else {
16807270962aSWarner Losh       Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
16817270962aSWarner Losh     }
16827270962aSWarner Losh 
16837270962aSWarner Losh     if (StrCmp (SASSATAStr, "SATA") == 0) {
16847270962aSWarner Losh       Info |= BIT4;
16857270962aSWarner Losh     }
16867270962aSWarner Losh 
16877270962aSWarner Losh     //
16887270962aSWarner Losh     // Location is an integer between 0 and 1 or else
16897270962aSWarner Losh     // the keyword Internal (0) or External (1).
16907270962aSWarner Losh     //
16917270962aSWarner Losh     if (StrCmp (LocationStr, "External") == 0) {
16927270962aSWarner Losh       Uint16 = 1;
16937270962aSWarner Losh     } else if (StrCmp (LocationStr, "Internal") == 0) {
16947270962aSWarner Losh       Uint16 = 0;
16957270962aSWarner Losh     } else {
16967270962aSWarner Losh       Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
16977270962aSWarner Losh     }
16985754f582SJose Luis Duran 
16997270962aSWarner Losh     Info |= (Uint16 << 5);
17007270962aSWarner Losh 
17017270962aSWarner Losh     //
17027270962aSWarner Losh     // Connect is an integer between 0 and 3 or else
17037270962aSWarner Losh     // the keyword Direct (0) or Expanded (1).
17047270962aSWarner Losh     //
17057270962aSWarner Losh     if (StrCmp (ConnectStr, "Expanded") == 0) {
17067270962aSWarner Losh       Uint16 = 1;
17077270962aSWarner Losh     } else if (StrCmp (ConnectStr, "Direct") == 0) {
17087270962aSWarner Losh       Uint16 = 0;
17097270962aSWarner Losh     } else {
17107270962aSWarner Losh       Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
17117270962aSWarner Losh     }
17127270962aSWarner Losh 
17135754f582SJose Luis Duran     Info |= (Uint16 << 6);
17147270962aSWarner Losh   } else {
17157270962aSWarner Losh     Info = (UINT16)Strtoi (SASSATAStr);
17167270962aSWarner Losh   }
17177270962aSWarner Losh 
17187270962aSWarner Losh   Sas->DeviceTopology = Info;
17197270962aSWarner Losh   Sas->Reserved       = (UINT32)Strtoi (ReservedStr);
17207270962aSWarner Losh 
17217270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Sas;
17227270962aSWarner Losh }
17237270962aSWarner Losh 
17247270962aSWarner Losh /**
17257270962aSWarner Losh   Converts a text device path node to Serial Attached SCSI Ex device path structure.
17267270962aSWarner Losh 
17277270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
17287270962aSWarner Losh 
17297270962aSWarner Losh   @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.
17307270962aSWarner Losh 
17317270962aSWarner Losh **/
17327270962aSWarner Losh static
17337270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSasEx(IN CHAR16 * TextDeviceNode)17347270962aSWarner Losh DevPathFromTextSasEx (
17357270962aSWarner Losh   IN CHAR16  *TextDeviceNode
17367270962aSWarner Losh   )
17377270962aSWarner Losh {
17387270962aSWarner Losh   CHAR16             *AddressStr;
17397270962aSWarner Losh   CHAR16             *LunStr;
17407270962aSWarner Losh   CHAR16             *RTPStr;
17417270962aSWarner Losh   CHAR16             *SASSATAStr;
17427270962aSWarner Losh   CHAR16             *LocationStr;
17437270962aSWarner Losh   CHAR16             *ConnectStr;
17447270962aSWarner Losh   CHAR16             *DriveBayStr;
17457270962aSWarner Losh   UINT16             Info;
17467270962aSWarner Losh   UINT16             Uint16;
17477270962aSWarner Losh   UINT64             SasAddress;
17487270962aSWarner Losh   UINT64             Lun;
17497270962aSWarner Losh   SASEX_DEVICE_PATH  *SasEx;
17507270962aSWarner Losh 
17517270962aSWarner Losh   AddressStr  = GetNextParamStr (&TextDeviceNode);
17527270962aSWarner Losh   LunStr      = GetNextParamStr (&TextDeviceNode);
17537270962aSWarner Losh   RTPStr      = GetNextParamStr (&TextDeviceNode);
17547270962aSWarner Losh   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
17557270962aSWarner Losh   LocationStr = GetNextParamStr (&TextDeviceNode);
17567270962aSWarner Losh   ConnectStr  = GetNextParamStr (&TextDeviceNode);
17577270962aSWarner Losh   DriveBayStr = GetNextParamStr (&TextDeviceNode);
17587270962aSWarner Losh   SasEx       = (SASEX_DEVICE_PATH *)CreateDeviceNode (
17597270962aSWarner Losh                                        MESSAGING_DEVICE_PATH,
17607270962aSWarner Losh                                        MSG_SASEX_DP,
17617270962aSWarner Losh                                        (UINT16)sizeof (SASEX_DEVICE_PATH)
17627270962aSWarner Losh                                        );
17637270962aSWarner Losh 
1764*05653fc7SJose Luis Duran   if (SasEx == NULL) {
1765*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)SasEx;
1766*05653fc7SJose Luis Duran   }
1767*05653fc7SJose Luis Duran 
17687270962aSWarner Losh   Strtoi64 (AddressStr, &SasAddress);
17697270962aSWarner Losh   Strtoi64 (LunStr, &Lun);
17707270962aSWarner Losh   WriteUnaligned64 ((UINT64 *)&SasEx->SasAddress, SwapBytes64 (SasAddress));
17717270962aSWarner Losh   WriteUnaligned64 ((UINT64 *)&SasEx->Lun, SwapBytes64 (Lun));
17727270962aSWarner Losh   SasEx->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
17737270962aSWarner Losh 
17747270962aSWarner Losh   if (StrCmp (SASSATAStr, "NoTopology") == 0) {
17757270962aSWarner Losh     Info = 0x0;
17767270962aSWarner Losh   } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
17777270962aSWarner Losh     Uint16 = (UINT16)Strtoi (DriveBayStr);
17787270962aSWarner Losh     if (Uint16 == 0) {
17797270962aSWarner Losh       Info = 0x1;
17807270962aSWarner Losh     } else {
17817270962aSWarner Losh       Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
17827270962aSWarner Losh     }
17837270962aSWarner Losh 
17847270962aSWarner Losh     if (StrCmp (SASSATAStr, "SATA") == 0) {
17857270962aSWarner Losh       Info |= BIT4;
17867270962aSWarner Losh     }
17877270962aSWarner Losh 
17887270962aSWarner Losh     //
17897270962aSWarner Losh     // Location is an integer between 0 and 1 or else
17907270962aSWarner Losh     // the keyword Internal (0) or External (1).
17917270962aSWarner Losh     //
17927270962aSWarner Losh     if (StrCmp (LocationStr, "External") == 0) {
17937270962aSWarner Losh       Uint16 = 1;
17947270962aSWarner Losh     } else if (StrCmp (LocationStr, "Internal") == 0) {
17957270962aSWarner Losh       Uint16 = 0;
17967270962aSWarner Losh     } else {
17977270962aSWarner Losh       Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
17987270962aSWarner Losh     }
17995754f582SJose Luis Duran 
18007270962aSWarner Losh     Info |= (Uint16 << 5);
18017270962aSWarner Losh 
18027270962aSWarner Losh     //
18037270962aSWarner Losh     // Connect is an integer between 0 and 3 or else
18047270962aSWarner Losh     // the keyword Direct (0) or Expanded (1).
18057270962aSWarner Losh     //
18067270962aSWarner Losh     if (StrCmp (ConnectStr, "Expanded") == 0) {
18077270962aSWarner Losh       Uint16 = 1;
18087270962aSWarner Losh     } else if (StrCmp (ConnectStr, "Direct") == 0) {
18097270962aSWarner Losh       Uint16 = 0;
18107270962aSWarner Losh     } else {
18117270962aSWarner Losh       Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
18127270962aSWarner Losh     }
18137270962aSWarner Losh 
18145754f582SJose Luis Duran     Info |= (Uint16 << 6);
18157270962aSWarner Losh   } else {
18167270962aSWarner Losh     Info = (UINT16)Strtoi (SASSATAStr);
18177270962aSWarner Losh   }
18187270962aSWarner Losh 
18197270962aSWarner Losh   SasEx->DeviceTopology = Info;
18207270962aSWarner Losh 
18217270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)SasEx;
18227270962aSWarner Losh }
18237270962aSWarner Losh 
18247270962aSWarner Losh /**
18257270962aSWarner Losh   Converts a text device path node to NVM Express Namespace device path structure.
18267270962aSWarner Losh 
18277270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
18287270962aSWarner Losh 
18297270962aSWarner Losh   @return A pointer to the newly-created NVM Express Namespace device path structure.
18307270962aSWarner Losh 
18317270962aSWarner Losh **/
18327270962aSWarner Losh static
18337270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextNVMe(IN CHAR16 * TextDeviceNode)18347270962aSWarner Losh DevPathFromTextNVMe (
18357270962aSWarner Losh   IN CHAR16  *TextDeviceNode
18367270962aSWarner Losh   )
18377270962aSWarner Losh {
18387270962aSWarner Losh   CHAR16                      *NamespaceIdStr;
18397270962aSWarner Losh   CHAR16                      *NamespaceUuidStr;
18407270962aSWarner Losh   NVME_NAMESPACE_DEVICE_PATH  *Nvme;
18417270962aSWarner Losh   UINT8                       *Uuid;
18427270962aSWarner Losh   UINTN                       Index;
18437270962aSWarner Losh 
18447270962aSWarner Losh   NamespaceIdStr   = GetNextParamStr (&TextDeviceNode);
18457270962aSWarner Losh   NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);
18467270962aSWarner Losh   Nvme             = (NVME_NAMESPACE_DEVICE_PATH *)CreateDeviceNode (
18477270962aSWarner Losh                                                      MESSAGING_DEVICE_PATH,
18487270962aSWarner Losh                                                      MSG_NVME_NAMESPACE_DP,
18497270962aSWarner Losh                                                      (UINT16)sizeof (NVME_NAMESPACE_DEVICE_PATH)
18507270962aSWarner Losh                                                      );
18517270962aSWarner Losh 
1852*05653fc7SJose Luis Duran   if (Nvme != NULL) {
18537270962aSWarner Losh     Nvme->NamespaceId = (UINT32)Strtoi (NamespaceIdStr);
18547270962aSWarner Losh     Uuid              = (UINT8 *)&Nvme->NamespaceUuid;
18557270962aSWarner Losh 
18567270962aSWarner Losh     Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);
18577270962aSWarner Losh     while (Index-- != 0) {
18587270962aSWarner Losh       Uuid[Index] = (UINT8)StrHexToUintn (SplitStr (&NamespaceUuidStr, '-'));
18597270962aSWarner Losh     }
1860*05653fc7SJose Luis Duran   }
18617270962aSWarner Losh 
18627270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Nvme;
18637270962aSWarner Losh }
18647270962aSWarner Losh 
18657270962aSWarner Losh /**
18667270962aSWarner Losh   Converts a text device path node to UFS device path structure.
18677270962aSWarner Losh 
18687270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
18697270962aSWarner Losh 
18707270962aSWarner Losh   @return A pointer to the newly-created UFS device path structure.
18717270962aSWarner Losh 
18727270962aSWarner Losh **/
18737270962aSWarner Losh static
18747270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUfs(IN CHAR16 * TextDeviceNode)18757270962aSWarner Losh DevPathFromTextUfs (
18767270962aSWarner Losh   IN CHAR16  *TextDeviceNode
18777270962aSWarner Losh   )
18787270962aSWarner Losh {
18797270962aSWarner Losh   CHAR16           *PunStr;
18807270962aSWarner Losh   CHAR16           *LunStr;
18817270962aSWarner Losh   UFS_DEVICE_PATH  *Ufs;
18827270962aSWarner Losh 
18837270962aSWarner Losh   PunStr = GetNextParamStr (&TextDeviceNode);
18847270962aSWarner Losh   LunStr = GetNextParamStr (&TextDeviceNode);
18857270962aSWarner Losh   Ufs    = (UFS_DEVICE_PATH *)CreateDeviceNode (
18867270962aSWarner Losh                                 MESSAGING_DEVICE_PATH,
18877270962aSWarner Losh                                 MSG_UFS_DP,
18887270962aSWarner Losh                                 (UINT16)sizeof (UFS_DEVICE_PATH)
18897270962aSWarner Losh                                 );
18907270962aSWarner Losh 
1891*05653fc7SJose Luis Duran   if (Ufs != NULL) {
18927270962aSWarner Losh     Ufs->Pun = (UINT8)Strtoi (PunStr);
18937270962aSWarner Losh     Ufs->Lun = (UINT8)Strtoi (LunStr);
1894*05653fc7SJose Luis Duran   }
18957270962aSWarner Losh 
18967270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Ufs;
18977270962aSWarner Losh }
18987270962aSWarner Losh 
18997270962aSWarner Losh /**
19007270962aSWarner Losh   Converts a text device path node to SD (Secure Digital) device path structure.
19017270962aSWarner Losh 
19027270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
19037270962aSWarner Losh 
19047270962aSWarner Losh   @return A pointer to the newly-created SD device path structure.
19057270962aSWarner Losh 
19067270962aSWarner Losh **/
19077270962aSWarner Losh static
19087270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSd(IN CHAR16 * TextDeviceNode)19097270962aSWarner Losh DevPathFromTextSd (
19107270962aSWarner Losh   IN CHAR16  *TextDeviceNode
19117270962aSWarner Losh   )
19127270962aSWarner Losh {
19137270962aSWarner Losh   CHAR16          *SlotNumberStr;
19147270962aSWarner Losh   SD_DEVICE_PATH  *Sd;
19157270962aSWarner Losh 
19167270962aSWarner Losh   SlotNumberStr = GetNextParamStr (&TextDeviceNode);
19177270962aSWarner Losh   Sd            = (SD_DEVICE_PATH *)CreateDeviceNode (
19187270962aSWarner Losh                                       MESSAGING_DEVICE_PATH,
19197270962aSWarner Losh                                       MSG_SD_DP,
19207270962aSWarner Losh                                       (UINT16)sizeof (SD_DEVICE_PATH)
19217270962aSWarner Losh                                       );
19227270962aSWarner Losh 
1923*05653fc7SJose Luis Duran   if (Sd != NULL) {
19247270962aSWarner Losh     Sd->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
1925*05653fc7SJose Luis Duran   }
19267270962aSWarner Losh 
19277270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Sd;
19287270962aSWarner Losh }
19297270962aSWarner Losh 
19307270962aSWarner Losh /**
19317270962aSWarner Losh   Converts a text device path node to EMMC (Embedded MMC) device path structure.
19327270962aSWarner Losh 
19337270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
19347270962aSWarner Losh 
19357270962aSWarner Losh   @return A pointer to the newly-created EMMC device path structure.
19367270962aSWarner Losh 
19377270962aSWarner Losh **/
19387270962aSWarner Losh static
19397270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextEmmc(IN CHAR16 * TextDeviceNode)19407270962aSWarner Losh DevPathFromTextEmmc (
19417270962aSWarner Losh   IN CHAR16  *TextDeviceNode
19427270962aSWarner Losh   )
19437270962aSWarner Losh {
19447270962aSWarner Losh   CHAR16            *SlotNumberStr;
19457270962aSWarner Losh   EMMC_DEVICE_PATH  *Emmc;
19467270962aSWarner Losh 
19477270962aSWarner Losh   SlotNumberStr = GetNextParamStr (&TextDeviceNode);
19487270962aSWarner Losh   Emmc          = (EMMC_DEVICE_PATH *)CreateDeviceNode (
19497270962aSWarner Losh                                         MESSAGING_DEVICE_PATH,
19507270962aSWarner Losh                                         MSG_EMMC_DP,
19517270962aSWarner Losh                                         (UINT16)sizeof (EMMC_DEVICE_PATH)
19527270962aSWarner Losh                                         );
19537270962aSWarner Losh 
1954*05653fc7SJose Luis Duran   if (Emmc != NULL) {
19557270962aSWarner Losh     Emmc->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
1956*05653fc7SJose Luis Duran   }
19577270962aSWarner Losh 
19587270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Emmc;
19597270962aSWarner Losh }
19607270962aSWarner Losh 
19617270962aSWarner Losh /**
19627270962aSWarner Losh   Converts a text device path node to Debug Port device path structure.
19637270962aSWarner Losh 
19647270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
19657270962aSWarner Losh 
19667270962aSWarner Losh   @return A pointer to the newly-created Debug Port device path structure.
19677270962aSWarner Losh 
19687270962aSWarner Losh **/
19697270962aSWarner Losh static
19707270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextDebugPort(IN CHAR16 * TextDeviceNode)19717270962aSWarner Losh DevPathFromTextDebugPort (
19727270962aSWarner Losh   IN CHAR16  *TextDeviceNode
19737270962aSWarner Losh   )
19747270962aSWarner Losh {
19759a62aa93SJose Luis Duran   VENDOR_DEVICE_PATH  *Vend;
19767270962aSWarner Losh 
19779a62aa93SJose Luis Duran   Vend = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
19787270962aSWarner Losh                                  MESSAGING_DEVICE_PATH,
19797270962aSWarner Losh                                  MSG_VENDOR_DP,
19809a62aa93SJose Luis Duran                                  (UINT16)sizeof (VENDOR_DEVICE_PATH)
19817270962aSWarner Losh                                  );
19827270962aSWarner Losh 
1983*05653fc7SJose Luis Duran   if (Vend != NULL) {
19847270962aSWarner Losh     CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
1985*05653fc7SJose Luis Duran   }
19867270962aSWarner Losh 
19877270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vend;
19887270962aSWarner Losh }
19897270962aSWarner Losh 
19907270962aSWarner Losh /**
19917270962aSWarner Losh   Converts a text device path node to MAC device path structure.
19927270962aSWarner Losh 
19937270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
19947270962aSWarner Losh 
19957270962aSWarner Losh   @return A pointer to the newly-created MAC device path structure.
19967270962aSWarner Losh 
19977270962aSWarner Losh **/
19987270962aSWarner Losh static
19997270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMAC(IN CHAR16 * TextDeviceNode)20007270962aSWarner Losh DevPathFromTextMAC (
20017270962aSWarner Losh   IN CHAR16  *TextDeviceNode
20027270962aSWarner Losh   )
20037270962aSWarner Losh {
20047270962aSWarner Losh   CHAR16                *AddressStr;
20057270962aSWarner Losh   CHAR16                *IfTypeStr;
20067270962aSWarner Losh   UINTN                 Length;
20077270962aSWarner Losh   MAC_ADDR_DEVICE_PATH  *MACDevPath;
20087270962aSWarner Losh 
20097270962aSWarner Losh   AddressStr = GetNextParamStr (&TextDeviceNode);
20107270962aSWarner Losh   IfTypeStr  = GetNextParamStr (&TextDeviceNode);
20117270962aSWarner Losh   MACDevPath = (MAC_ADDR_DEVICE_PATH *)CreateDeviceNode (
20127270962aSWarner Losh                                          MESSAGING_DEVICE_PATH,
20137270962aSWarner Losh                                          MSG_MAC_ADDR_DP,
20147270962aSWarner Losh                                          (UINT16)sizeof (MAC_ADDR_DEVICE_PATH)
20157270962aSWarner Losh                                          );
20167270962aSWarner Losh 
2017*05653fc7SJose Luis Duran   if (MACDevPath != NULL) {
20187270962aSWarner Losh     MACDevPath->IfType = (UINT8)Strtoi (IfTypeStr);
20197270962aSWarner Losh 
20207270962aSWarner Losh     Length = sizeof (EFI_MAC_ADDRESS);
20215754f582SJose Luis Duran     if ((MACDevPath->IfType == 0x01) || (MACDevPath->IfType == 0x00)) {
202281a659e3SJose Luis Duran       Length = 6;
202381a659e3SJose Luis Duran     }
202481a659e3SJose Luis Duran 
20257270962aSWarner Losh     StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);
2026*05653fc7SJose Luis Duran   }
20277270962aSWarner Losh 
20287270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)MACDevPath;
20297270962aSWarner Losh }
20307270962aSWarner Losh 
20317270962aSWarner Losh /**
20327270962aSWarner Losh   Converts a text format to the network protocol ID.
20337270962aSWarner Losh 
20347270962aSWarner Losh   @param Text  String of protocol field.
20357270962aSWarner Losh 
20367270962aSWarner Losh   @return Network protocol ID .
20377270962aSWarner Losh 
20387270962aSWarner Losh **/
20397270962aSWarner Losh static
20407270962aSWarner Losh UINTN
NetworkProtocolFromText(IN CHAR16 * Text)20417270962aSWarner Losh NetworkProtocolFromText (
20427270962aSWarner Losh   IN CHAR16  *Text
20437270962aSWarner Losh   )
20447270962aSWarner Losh {
20457270962aSWarner Losh   if (StrCmp (Text, "UDP") == 0) {
20467270962aSWarner Losh     return RFC_1700_UDP_PROTOCOL;
20477270962aSWarner Losh   }
20487270962aSWarner Losh 
20497270962aSWarner Losh   if (StrCmp (Text, "TCP") == 0) {
20507270962aSWarner Losh     return RFC_1700_TCP_PROTOCOL;
20517270962aSWarner Losh   }
20527270962aSWarner Losh 
20537270962aSWarner Losh   return Strtoi (Text);
20547270962aSWarner Losh }
20557270962aSWarner Losh 
20567270962aSWarner Losh /**
20577270962aSWarner Losh   Converts a text device path node to IPV4 device path structure.
20587270962aSWarner Losh 
20597270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
20607270962aSWarner Losh 
20617270962aSWarner Losh   @return A pointer to the newly-created IPV4 device path structure.
20627270962aSWarner Losh 
20637270962aSWarner Losh **/
20647270962aSWarner Losh static
20657270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv4(IN CHAR16 * TextDeviceNode)20667270962aSWarner Losh DevPathFromTextIPv4 (
20677270962aSWarner Losh   IN CHAR16  *TextDeviceNode
20687270962aSWarner Losh   )
20697270962aSWarner Losh {
20707270962aSWarner Losh   CHAR16            *RemoteIPStr;
20717270962aSWarner Losh   CHAR16            *ProtocolStr;
20727270962aSWarner Losh   CHAR16            *TypeStr;
20737270962aSWarner Losh   CHAR16            *LocalIPStr;
20747270962aSWarner Losh   CHAR16            *GatewayIPStr;
20757270962aSWarner Losh   CHAR16            *SubnetMaskStr;
20767270962aSWarner Losh   IPv4_DEVICE_PATH  *IPv4;
20777270962aSWarner Losh 
20787270962aSWarner Losh   RemoteIPStr   = GetNextParamStr (&TextDeviceNode);
20797270962aSWarner Losh   ProtocolStr   = GetNextParamStr (&TextDeviceNode);
20807270962aSWarner Losh   TypeStr       = GetNextParamStr (&TextDeviceNode);
20817270962aSWarner Losh   LocalIPStr    = GetNextParamStr (&TextDeviceNode);
20827270962aSWarner Losh   GatewayIPStr  = GetNextParamStr (&TextDeviceNode);
20837270962aSWarner Losh   SubnetMaskStr = GetNextParamStr (&TextDeviceNode);
20847270962aSWarner Losh   IPv4          = (IPv4_DEVICE_PATH *)CreateDeviceNode (
20857270962aSWarner Losh                                         MESSAGING_DEVICE_PATH,
20867270962aSWarner Losh                                         MSG_IPv4_DP,
20877270962aSWarner Losh                                         (UINT16)sizeof (IPv4_DEVICE_PATH)
20887270962aSWarner Losh                                         );
20897270962aSWarner Losh 
2090*05653fc7SJose Luis Duran   if (IPv4 == NULL) {
2091*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)IPv4;
2092*05653fc7SJose Luis Duran   }
2093*05653fc7SJose Luis Duran 
20947270962aSWarner Losh   StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);
20957270962aSWarner Losh   IPv4->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
20967270962aSWarner Losh   if (StrCmp (TypeStr, "Static") == 0) {
20977270962aSWarner Losh     IPv4->StaticIpAddress = TRUE;
20987270962aSWarner Losh   } else {
20997270962aSWarner Losh     IPv4->StaticIpAddress = FALSE;
21007270962aSWarner Losh   }
21017270962aSWarner Losh 
21027270962aSWarner Losh   StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);
21037270962aSWarner Losh   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {
21047270962aSWarner Losh     StrToIpv4Address (GatewayIPStr, NULL, &IPv4->GatewayIpAddress, NULL);
21057270962aSWarner Losh     StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask, NULL);
21067270962aSWarner Losh   } else {
21077270962aSWarner Losh     ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));
21087270962aSWarner Losh     ZeroMem (&IPv4->SubnetMask, sizeof (IPv4->SubnetMask));
21097270962aSWarner Losh   }
21107270962aSWarner Losh 
21117270962aSWarner Losh   IPv4->LocalPort  = 0;
21127270962aSWarner Losh   IPv4->RemotePort = 0;
21137270962aSWarner Losh 
21147270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)IPv4;
21157270962aSWarner Losh }
21167270962aSWarner Losh 
21177270962aSWarner Losh /**
21187270962aSWarner Losh   Converts a text device path node to IPV6 device path structure.
21197270962aSWarner Losh 
21207270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
21217270962aSWarner Losh 
21227270962aSWarner Losh   @return A pointer to the newly-created IPV6 device path structure.
21237270962aSWarner Losh 
21247270962aSWarner Losh **/
21257270962aSWarner Losh static
21267270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv6(IN CHAR16 * TextDeviceNode)21277270962aSWarner Losh DevPathFromTextIPv6 (
21287270962aSWarner Losh   IN CHAR16  *TextDeviceNode
21297270962aSWarner Losh   )
21307270962aSWarner Losh {
21317270962aSWarner Losh   CHAR16            *RemoteIPStr;
21327270962aSWarner Losh   CHAR16            *ProtocolStr;
21337270962aSWarner Losh   CHAR16            *TypeStr;
21347270962aSWarner Losh   CHAR16            *LocalIPStr;
21357270962aSWarner Losh   CHAR16            *GatewayIPStr;
21367270962aSWarner Losh   CHAR16            *PrefixLengthStr;
21377270962aSWarner Losh   IPv6_DEVICE_PATH  *IPv6;
21387270962aSWarner Losh 
21397270962aSWarner Losh   RemoteIPStr     = GetNextParamStr (&TextDeviceNode);
21407270962aSWarner Losh   ProtocolStr     = GetNextParamStr (&TextDeviceNode);
21417270962aSWarner Losh   TypeStr         = GetNextParamStr (&TextDeviceNode);
21427270962aSWarner Losh   LocalIPStr      = GetNextParamStr (&TextDeviceNode);
21437270962aSWarner Losh   PrefixLengthStr = GetNextParamStr (&TextDeviceNode);
21447270962aSWarner Losh   GatewayIPStr    = GetNextParamStr (&TextDeviceNode);
21457270962aSWarner Losh   IPv6            = (IPv6_DEVICE_PATH *)CreateDeviceNode (
21467270962aSWarner Losh                                           MESSAGING_DEVICE_PATH,
21477270962aSWarner Losh                                           MSG_IPv6_DP,
21487270962aSWarner Losh                                           (UINT16)sizeof (IPv6_DEVICE_PATH)
21497270962aSWarner Losh                                           );
21507270962aSWarner Losh 
2151*05653fc7SJose Luis Duran   if (IPv6 == NULL) {
2152*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)IPv6;
2153*05653fc7SJose Luis Duran   }
2154*05653fc7SJose Luis Duran 
21557270962aSWarner Losh   StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);
21567270962aSWarner Losh   IPv6->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
21577270962aSWarner Losh   if (StrCmp (TypeStr, "Static") == 0) {
21587270962aSWarner Losh     IPv6->IpAddressOrigin = 0;
21597270962aSWarner Losh   } else if (StrCmp (TypeStr, "StatelessAutoConfigure") == 0) {
21607270962aSWarner Losh     IPv6->IpAddressOrigin = 1;
21617270962aSWarner Losh   } else {
21627270962aSWarner Losh     IPv6->IpAddressOrigin = 2;
21637270962aSWarner Losh   }
21647270962aSWarner Losh 
21657270962aSWarner Losh   StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);
21667270962aSWarner Losh   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {
21677270962aSWarner Losh     StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);
21687270962aSWarner Losh     IPv6->PrefixLength = (UINT8)Strtoi (PrefixLengthStr);
21697270962aSWarner Losh   } else {
21707270962aSWarner Losh     ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));
21717270962aSWarner Losh     IPv6->PrefixLength = 0;
21727270962aSWarner Losh   }
21737270962aSWarner Losh 
21747270962aSWarner Losh   IPv6->LocalPort  = 0;
21757270962aSWarner Losh   IPv6->RemotePort = 0;
21767270962aSWarner Losh 
21777270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)IPv6;
21787270962aSWarner Losh }
21797270962aSWarner Losh 
21807270962aSWarner Losh /**
21817270962aSWarner Losh   Converts a text device path node to UART device path structure.
21827270962aSWarner Losh 
21837270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
21847270962aSWarner Losh 
21857270962aSWarner Losh   @return A pointer to the newly-created UART device path structure.
21867270962aSWarner Losh 
21877270962aSWarner Losh **/
21887270962aSWarner Losh static
21897270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUart(IN CHAR16 * TextDeviceNode)21907270962aSWarner Losh DevPathFromTextUart (
21917270962aSWarner Losh   IN CHAR16  *TextDeviceNode
21927270962aSWarner Losh   )
21937270962aSWarner Losh {
21947270962aSWarner Losh   CHAR16            *BaudStr;
21957270962aSWarner Losh   CHAR16            *DataBitsStr;
21967270962aSWarner Losh   CHAR16            *ParityStr;
21977270962aSWarner Losh   CHAR16            *StopBitsStr;
21987270962aSWarner Losh   UART_DEVICE_PATH  *Uart;
21997270962aSWarner Losh 
22007270962aSWarner Losh   BaudStr     = GetNextParamStr (&TextDeviceNode);
22017270962aSWarner Losh   DataBitsStr = GetNextParamStr (&TextDeviceNode);
22027270962aSWarner Losh   ParityStr   = GetNextParamStr (&TextDeviceNode);
22037270962aSWarner Losh   StopBitsStr = GetNextParamStr (&TextDeviceNode);
22047270962aSWarner Losh   Uart        = (UART_DEVICE_PATH *)CreateDeviceNode (
22057270962aSWarner Losh                                       MESSAGING_DEVICE_PATH,
22067270962aSWarner Losh                                       MSG_UART_DP,
22077270962aSWarner Losh                                       (UINT16)sizeof (UART_DEVICE_PATH)
22087270962aSWarner Losh                                       );
22097270962aSWarner Losh 
2210*05653fc7SJose Luis Duran   if (Uart == NULL) {
2211*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Uart;
2212*05653fc7SJose Luis Duran   }
2213*05653fc7SJose Luis Duran 
22147270962aSWarner Losh   if (StrCmp (BaudStr, "DEFAULT") == 0) {
22157270962aSWarner Losh     Uart->BaudRate = 115200;
22167270962aSWarner Losh   } else {
22177270962aSWarner Losh     Strtoi64 (BaudStr, &Uart->BaudRate);
22187270962aSWarner Losh   }
22195754f582SJose Luis Duran 
22207270962aSWarner Losh   Uart->DataBits = (UINT8)((StrCmp (DataBitsStr, "DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
22217270962aSWarner Losh   switch (*ParityStr) {
22227270962aSWarner Losh     case 'D':
22237270962aSWarner Losh       Uart->Parity = 0;
22247270962aSWarner Losh       break;
22257270962aSWarner Losh 
22267270962aSWarner Losh     case 'N':
22277270962aSWarner Losh       Uart->Parity = 1;
22287270962aSWarner Losh       break;
22297270962aSWarner Losh 
22307270962aSWarner Losh     case 'E':
22317270962aSWarner Losh       Uart->Parity = 2;
22327270962aSWarner Losh       break;
22337270962aSWarner Losh 
22347270962aSWarner Losh     case 'O':
22357270962aSWarner Losh       Uart->Parity = 3;
22367270962aSWarner Losh       break;
22377270962aSWarner Losh 
22387270962aSWarner Losh     case 'M':
22397270962aSWarner Losh       Uart->Parity = 4;
22407270962aSWarner Losh       break;
22417270962aSWarner Losh 
22427270962aSWarner Losh     case 'S':
22437270962aSWarner Losh       Uart->Parity = 5;
22447270962aSWarner Losh       break;
22457270962aSWarner Losh 
22467270962aSWarner Losh     default:
22477270962aSWarner Losh       Uart->Parity = (UINT8)Strtoi (ParityStr);
22487270962aSWarner Losh       break;
22497270962aSWarner Losh   }
22507270962aSWarner Losh 
22517270962aSWarner Losh   if (StrCmp (StopBitsStr, "D") == 0) {
22527270962aSWarner Losh     Uart->StopBits = (UINT8)0;
22537270962aSWarner Losh   } else if (StrCmp (StopBitsStr, "1") == 0) {
22547270962aSWarner Losh     Uart->StopBits = (UINT8)1;
22557270962aSWarner Losh   } else if (StrCmp (StopBitsStr, "1.5") == 0) {
22567270962aSWarner Losh     Uart->StopBits = (UINT8)2;
22577270962aSWarner Losh   } else if (StrCmp (StopBitsStr, "2") == 0) {
22587270962aSWarner Losh     Uart->StopBits = (UINT8)3;
22597270962aSWarner Losh   } else {
22607270962aSWarner Losh     Uart->StopBits = (UINT8)Strtoi (StopBitsStr);
22617270962aSWarner Losh   }
22627270962aSWarner Losh 
22637270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Uart;
22647270962aSWarner Losh }
22657270962aSWarner Losh 
22667270962aSWarner Losh /**
22677270962aSWarner Losh   Converts a text device path node to USB class device path structure.
22687270962aSWarner Losh 
22697270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
22707270962aSWarner Losh   @param UsbClassText    A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.
22717270962aSWarner Losh 
22727270962aSWarner Losh   @return A pointer to the newly-created USB class device path structure.
22737270962aSWarner Losh 
22747270962aSWarner Losh **/
22757270962aSWarner Losh static
22767270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextUsbClass(IN CHAR16 * TextDeviceNode,IN USB_CLASS_TEXT * UsbClassText)22777270962aSWarner Losh ConvertFromTextUsbClass (
22787270962aSWarner Losh   IN CHAR16          *TextDeviceNode,
22797270962aSWarner Losh   IN USB_CLASS_TEXT  *UsbClassText
22807270962aSWarner Losh   )
22817270962aSWarner Losh {
22827270962aSWarner Losh   CHAR16                 *VIDStr;
22837270962aSWarner Losh   CHAR16                 *PIDStr;
22847270962aSWarner Losh   CHAR16                 *ClassStr;
22857270962aSWarner Losh   CHAR16                 *SubClassStr;
22867270962aSWarner Losh   CHAR16                 *ProtocolStr;
22877270962aSWarner Losh   USB_CLASS_DEVICE_PATH  *UsbClass;
22887270962aSWarner Losh 
22897270962aSWarner Losh   UsbClass = (USB_CLASS_DEVICE_PATH *)CreateDeviceNode (
22907270962aSWarner Losh                                         MESSAGING_DEVICE_PATH,
22917270962aSWarner Losh                                         MSG_USB_CLASS_DP,
22927270962aSWarner Losh                                         (UINT16)sizeof (USB_CLASS_DEVICE_PATH)
22937270962aSWarner Losh                                         );
22947270962aSWarner Losh 
2295*05653fc7SJose Luis Duran   if (UsbClass == NULL) {
2296*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)UsbClass;
2297*05653fc7SJose Luis Duran   }
2298*05653fc7SJose Luis Duran 
22997270962aSWarner Losh   VIDStr = GetNextParamStr (&TextDeviceNode);
23007270962aSWarner Losh   PIDStr = GetNextParamStr (&TextDeviceNode);
23017270962aSWarner Losh   if (UsbClassText->ClassExist) {
23027270962aSWarner Losh     ClassStr = GetNextParamStr (&TextDeviceNode);
2303965f8527SJose Luis Duran     if (*ClassStr == '\0') {
2304965f8527SJose Luis Duran       UsbClass->DeviceClass = 0xFF;
2305965f8527SJose Luis Duran     } else {
23067270962aSWarner Losh       UsbClass->DeviceClass = (UINT8)Strtoi (ClassStr);
2307965f8527SJose Luis Duran     }
23087270962aSWarner Losh   } else {
23097270962aSWarner Losh     UsbClass->DeviceClass = UsbClassText->Class;
23107270962aSWarner Losh   }
23115754f582SJose Luis Duran 
23127270962aSWarner Losh   if (UsbClassText->SubClassExist) {
23137270962aSWarner Losh     SubClassStr = GetNextParamStr (&TextDeviceNode);
2314965f8527SJose Luis Duran     if (*SubClassStr == '\0') {
2315965f8527SJose Luis Duran       UsbClass->DeviceSubClass = 0xFF;
2316965f8527SJose Luis Duran     } else {
23177270962aSWarner Losh       UsbClass->DeviceSubClass = (UINT8)Strtoi (SubClassStr);
2318965f8527SJose Luis Duran     }
23197270962aSWarner Losh   } else {
23207270962aSWarner Losh     UsbClass->DeviceSubClass = UsbClassText->SubClass;
23217270962aSWarner Losh   }
23227270962aSWarner Losh 
23237270962aSWarner Losh   ProtocolStr = GetNextParamStr (&TextDeviceNode);
23247270962aSWarner Losh 
2325965f8527SJose Luis Duran   if (*VIDStr == '\0') {
2326965f8527SJose Luis Duran     UsbClass->VendorId = 0xFFFF;
2327965f8527SJose Luis Duran   } else {
23287270962aSWarner Losh     UsbClass->VendorId = (UINT16)Strtoi (VIDStr);
2329965f8527SJose Luis Duran   }
23305754f582SJose Luis Duran 
2331965f8527SJose Luis Duran   if (*PIDStr == '\0') {
2332965f8527SJose Luis Duran     UsbClass->ProductId = 0xFFFF;
2333965f8527SJose Luis Duran   } else {
23347270962aSWarner Losh     UsbClass->ProductId = (UINT16)Strtoi (PIDStr);
2335965f8527SJose Luis Duran   }
23365754f582SJose Luis Duran 
2337965f8527SJose Luis Duran   if (*ProtocolStr == '\0') {
2338965f8527SJose Luis Duran     UsbClass->DeviceProtocol = 0xFF;
2339965f8527SJose Luis Duran   } else {
23407270962aSWarner Losh     UsbClass->DeviceProtocol = (UINT8)Strtoi (ProtocolStr);
2341965f8527SJose Luis Duran   }
23427270962aSWarner Losh 
23437270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)UsbClass;
23447270962aSWarner Losh }
23457270962aSWarner Losh 
23467270962aSWarner Losh /**
23477270962aSWarner Losh   Converts a text device path node to USB class device path structure.
23487270962aSWarner Losh 
23497270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
23507270962aSWarner Losh 
23517270962aSWarner Losh   @return A pointer to the newly-created USB class device path structure.
23527270962aSWarner Losh 
23537270962aSWarner Losh **/
23547270962aSWarner Losh static
23557270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbClass(IN CHAR16 * TextDeviceNode)23567270962aSWarner Losh DevPathFromTextUsbClass (
23577270962aSWarner Losh   IN CHAR16  *TextDeviceNode
23587270962aSWarner Losh   )
23597270962aSWarner Losh {
23607270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
23617270962aSWarner Losh 
23627270962aSWarner Losh   UsbClassText.ClassExist    = TRUE;
23637270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
23647270962aSWarner Losh 
23657270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23667270962aSWarner Losh }
23677270962aSWarner Losh 
23687270962aSWarner Losh /**
23697270962aSWarner Losh   Converts a text device path node to USB audio device path structure.
23707270962aSWarner Losh 
23717270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
23727270962aSWarner Losh 
23737270962aSWarner Losh   @return A pointer to the newly-created USB audio device path structure.
23747270962aSWarner Losh 
23757270962aSWarner Losh **/
23767270962aSWarner Losh static
23777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbAudio(IN CHAR16 * TextDeviceNode)23787270962aSWarner Losh DevPathFromTextUsbAudio (
23797270962aSWarner Losh   IN CHAR16  *TextDeviceNode
23807270962aSWarner Losh   )
23817270962aSWarner Losh {
23827270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
23837270962aSWarner Losh 
23847270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
23857270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_AUDIO;
23867270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
23877270962aSWarner Losh 
23887270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
23897270962aSWarner Losh }
23907270962aSWarner Losh 
23917270962aSWarner Losh /**
23927270962aSWarner Losh   Converts a text device path node to USB CDC Control device path structure.
23937270962aSWarner Losh 
23947270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
23957270962aSWarner Losh 
23967270962aSWarner Losh   @return A pointer to the newly-created USB CDC Control device path structure.
23977270962aSWarner Losh 
23987270962aSWarner Losh **/
23997270962aSWarner Losh static
24007270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCControl(IN CHAR16 * TextDeviceNode)24017270962aSWarner Losh DevPathFromTextUsbCDCControl (
24027270962aSWarner Losh   IN CHAR16  *TextDeviceNode
24037270962aSWarner Losh   )
24047270962aSWarner Losh {
24057270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
24067270962aSWarner Losh 
24077270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
24087270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_CDCCONTROL;
24097270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
24107270962aSWarner Losh 
24117270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24127270962aSWarner Losh }
24137270962aSWarner Losh 
24147270962aSWarner Losh /**
24157270962aSWarner Losh   Converts a text device path node to USB HID device path structure.
24167270962aSWarner Losh 
24177270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
24187270962aSWarner Losh 
24197270962aSWarner Losh   @return A pointer to the newly-created USB HID device path structure.
24207270962aSWarner Losh 
24217270962aSWarner Losh **/
24227270962aSWarner Losh static
24237270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHID(IN CHAR16 * TextDeviceNode)24247270962aSWarner Losh DevPathFromTextUsbHID (
24257270962aSWarner Losh   IN CHAR16  *TextDeviceNode
24267270962aSWarner Losh   )
24277270962aSWarner Losh {
24287270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
24297270962aSWarner Losh 
24307270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
24317270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_HID;
24327270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
24337270962aSWarner Losh 
24347270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24357270962aSWarner Losh }
24367270962aSWarner Losh 
24377270962aSWarner Losh /**
24387270962aSWarner Losh   Converts a text device path node to USB Image device path structure.
24397270962aSWarner Losh 
24407270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
24417270962aSWarner Losh 
24427270962aSWarner Losh   @return A pointer to the newly-created USB Image device path structure.
24437270962aSWarner Losh 
24447270962aSWarner Losh **/
24457270962aSWarner Losh static
24467270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbImage(IN CHAR16 * TextDeviceNode)24477270962aSWarner Losh DevPathFromTextUsbImage (
24487270962aSWarner Losh   IN CHAR16  *TextDeviceNode
24497270962aSWarner Losh   )
24507270962aSWarner Losh {
24517270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
24527270962aSWarner Losh 
24537270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
24547270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_IMAGE;
24557270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
24567270962aSWarner Losh 
24577270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24587270962aSWarner Losh }
24597270962aSWarner Losh 
24607270962aSWarner Losh /**
24617270962aSWarner Losh   Converts a text device path node to USB Print device path structure.
24627270962aSWarner Losh 
24637270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
24647270962aSWarner Losh 
24657270962aSWarner Losh   @return A pointer to the newly-created USB Print device path structure.
24667270962aSWarner Losh 
24677270962aSWarner Losh **/
24687270962aSWarner Losh static
24697270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbPrinter(IN CHAR16 * TextDeviceNode)24707270962aSWarner Losh DevPathFromTextUsbPrinter (
24717270962aSWarner Losh   IN CHAR16  *TextDeviceNode
24727270962aSWarner Losh   )
24737270962aSWarner Losh {
24747270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
24757270962aSWarner Losh 
24767270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
24777270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_PRINTER;
24787270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
24797270962aSWarner Losh 
24807270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
24817270962aSWarner Losh }
24827270962aSWarner Losh 
24837270962aSWarner Losh /**
24847270962aSWarner Losh   Converts a text device path node to USB mass storage device path structure.
24857270962aSWarner Losh 
24867270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
24877270962aSWarner Losh 
24887270962aSWarner Losh   @return A pointer to the newly-created USB mass storage device path structure.
24897270962aSWarner Losh 
24907270962aSWarner Losh **/
24917270962aSWarner Losh static
24927270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbMassStorage(IN CHAR16 * TextDeviceNode)24937270962aSWarner Losh DevPathFromTextUsbMassStorage (
24947270962aSWarner Losh   IN CHAR16  *TextDeviceNode
24957270962aSWarner Losh   )
24967270962aSWarner Losh {
24977270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
24987270962aSWarner Losh 
24997270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
25007270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_MASS_STORAGE;
25017270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
25027270962aSWarner Losh 
25037270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25047270962aSWarner Losh }
25057270962aSWarner Losh 
25067270962aSWarner Losh /**
25077270962aSWarner Losh   Converts a text device path node to USB HUB device path structure.
25087270962aSWarner Losh 
25097270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
25107270962aSWarner Losh 
25117270962aSWarner Losh   @return A pointer to the newly-created USB HUB device path structure.
25127270962aSWarner Losh 
25137270962aSWarner Losh **/
25147270962aSWarner Losh static
25157270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHub(IN CHAR16 * TextDeviceNode)25167270962aSWarner Losh DevPathFromTextUsbHub (
25177270962aSWarner Losh   IN CHAR16  *TextDeviceNode
25187270962aSWarner Losh   )
25197270962aSWarner Losh {
25207270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
25217270962aSWarner Losh 
25227270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
25237270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_HUB;
25247270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
25257270962aSWarner Losh 
25267270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25277270962aSWarner Losh }
25287270962aSWarner Losh 
25297270962aSWarner Losh /**
25307270962aSWarner Losh   Converts a text device path node to USB CDC data device path structure.
25317270962aSWarner Losh 
25327270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
25337270962aSWarner Losh 
25347270962aSWarner Losh   @return A pointer to the newly-created USB CDC data device path structure.
25357270962aSWarner Losh 
25367270962aSWarner Losh **/
25377270962aSWarner Losh static
25387270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCData(IN CHAR16 * TextDeviceNode)25397270962aSWarner Losh DevPathFromTextUsbCDCData (
25407270962aSWarner Losh   IN CHAR16  *TextDeviceNode
25417270962aSWarner Losh   )
25427270962aSWarner Losh {
25437270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
25447270962aSWarner Losh 
25457270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
25467270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_CDCDATA;
25477270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
25487270962aSWarner Losh 
25497270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25507270962aSWarner Losh }
25517270962aSWarner Losh 
25527270962aSWarner Losh /**
25537270962aSWarner Losh   Converts a text device path node to USB smart card device path structure.
25547270962aSWarner Losh 
25557270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
25567270962aSWarner Losh 
25577270962aSWarner Losh   @return A pointer to the newly-created USB smart card device path structure.
25587270962aSWarner Losh 
25597270962aSWarner Losh **/
25607270962aSWarner Losh static
25617270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbSmartCard(IN CHAR16 * TextDeviceNode)25627270962aSWarner Losh DevPathFromTextUsbSmartCard (
25637270962aSWarner Losh   IN CHAR16  *TextDeviceNode
25647270962aSWarner Losh   )
25657270962aSWarner Losh {
25667270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
25677270962aSWarner Losh 
25687270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
25697270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_SMART_CARD;
25707270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
25717270962aSWarner Losh 
25727270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25737270962aSWarner Losh }
25747270962aSWarner Losh 
25757270962aSWarner Losh /**
25767270962aSWarner Losh   Converts a text device path node to USB video device path structure.
25777270962aSWarner Losh 
25787270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
25797270962aSWarner Losh 
25807270962aSWarner Losh   @return A pointer to the newly-created USB video device path structure.
25817270962aSWarner Losh 
25827270962aSWarner Losh **/
25837270962aSWarner Losh static
25847270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbVideo(IN CHAR16 * TextDeviceNode)25857270962aSWarner Losh DevPathFromTextUsbVideo (
25867270962aSWarner Losh   IN CHAR16  *TextDeviceNode
25877270962aSWarner Losh   )
25887270962aSWarner Losh {
25897270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
25907270962aSWarner Losh 
25917270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
25927270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_VIDEO;
25937270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
25947270962aSWarner Losh 
25957270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
25967270962aSWarner Losh }
25977270962aSWarner Losh 
25987270962aSWarner Losh /**
25997270962aSWarner Losh   Converts a text device path node to USB diagnostic device path structure.
26007270962aSWarner Losh 
26017270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
26027270962aSWarner Losh 
26037270962aSWarner Losh   @return A pointer to the newly-created USB diagnostic device path structure.
26047270962aSWarner Losh 
26057270962aSWarner Losh **/
26067270962aSWarner Losh static
26077270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDiagnostic(IN CHAR16 * TextDeviceNode)26087270962aSWarner Losh DevPathFromTextUsbDiagnostic (
26097270962aSWarner Losh   IN CHAR16  *TextDeviceNode
26107270962aSWarner Losh   )
26117270962aSWarner Losh {
26127270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
26137270962aSWarner Losh 
26147270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
26157270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;
26167270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
26177270962aSWarner Losh 
26187270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
26197270962aSWarner Losh }
26207270962aSWarner Losh 
26217270962aSWarner Losh /**
26227270962aSWarner Losh   Converts a text device path node to USB wireless device path structure.
26237270962aSWarner Losh 
26247270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
26257270962aSWarner Losh 
26267270962aSWarner Losh   @return A pointer to the newly-created USB wireless device path structure.
26277270962aSWarner Losh 
26287270962aSWarner Losh **/
26297270962aSWarner Losh static
26307270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWireless(IN CHAR16 * TextDeviceNode)26317270962aSWarner Losh DevPathFromTextUsbWireless (
26327270962aSWarner Losh   IN CHAR16  *TextDeviceNode
26337270962aSWarner Losh   )
26347270962aSWarner Losh {
26357270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
26367270962aSWarner Losh 
26377270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
26387270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_WIRELESS;
26397270962aSWarner Losh   UsbClassText.SubClassExist = TRUE;
26407270962aSWarner Losh 
26417270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
26427270962aSWarner Losh }
26437270962aSWarner Losh 
26447270962aSWarner Losh /**
26457270962aSWarner Losh   Converts a text device path node to USB device firmware update device path structure.
26467270962aSWarner Losh 
26477270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
26487270962aSWarner Losh 
26497270962aSWarner Losh   @return A pointer to the newly-created USB device firmware update device path structure.
26507270962aSWarner Losh 
26517270962aSWarner Losh **/
26527270962aSWarner Losh static
26537270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDeviceFirmwareUpdate(IN CHAR16 * TextDeviceNode)26547270962aSWarner Losh DevPathFromTextUsbDeviceFirmwareUpdate (
26557270962aSWarner Losh   IN CHAR16  *TextDeviceNode
26567270962aSWarner Losh   )
26577270962aSWarner Losh {
26587270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
26597270962aSWarner Losh 
26607270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
26617270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_RESERVE;
26627270962aSWarner Losh   UsbClassText.SubClassExist = FALSE;
26637270962aSWarner Losh   UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;
26647270962aSWarner Losh 
26657270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
26667270962aSWarner Losh }
26677270962aSWarner Losh 
26687270962aSWarner Losh /**
26697270962aSWarner Losh   Converts a text device path node to USB IRDA bridge device path structure.
26707270962aSWarner Losh 
26717270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
26727270962aSWarner Losh 
26737270962aSWarner Losh   @return A pointer to the newly-created USB IRDA bridge device path structure.
26747270962aSWarner Losh 
26757270962aSWarner Losh **/
26767270962aSWarner Losh static
26777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbIrdaBridge(IN CHAR16 * TextDeviceNode)26787270962aSWarner Losh DevPathFromTextUsbIrdaBridge (
26797270962aSWarner Losh   IN CHAR16  *TextDeviceNode
26807270962aSWarner Losh   )
26817270962aSWarner Losh {
26827270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
26837270962aSWarner Losh 
26847270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
26857270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_RESERVE;
26867270962aSWarner Losh   UsbClassText.SubClassExist = FALSE;
26877270962aSWarner Losh   UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;
26887270962aSWarner Losh 
26897270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
26907270962aSWarner Losh }
26917270962aSWarner Losh 
26927270962aSWarner Losh /**
26937270962aSWarner Losh   Converts a text device path node to USB text and measurement device path structure.
26947270962aSWarner Losh 
26957270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
26967270962aSWarner Losh 
26977270962aSWarner Losh   @return A pointer to the newly-created USB text and measurement device path structure.
26987270962aSWarner Losh 
26997270962aSWarner Losh **/
27007270962aSWarner Losh static
27017270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbTestAndMeasurement(IN CHAR16 * TextDeviceNode)27027270962aSWarner Losh DevPathFromTextUsbTestAndMeasurement (
27037270962aSWarner Losh   IN CHAR16  *TextDeviceNode
27047270962aSWarner Losh   )
27057270962aSWarner Losh {
27067270962aSWarner Losh   USB_CLASS_TEXT  UsbClassText;
27077270962aSWarner Losh 
27087270962aSWarner Losh   UsbClassText.ClassExist    = FALSE;
27097270962aSWarner Losh   UsbClassText.Class         = USB_CLASS_RESERVE;
27107270962aSWarner Losh   UsbClassText.SubClassExist = FALSE;
27117270962aSWarner Losh   UsbClassText.SubClass      = USB_SUBCLASS_TEST;
27127270962aSWarner Losh 
27137270962aSWarner Losh   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
27147270962aSWarner Losh }
27157270962aSWarner Losh 
27167270962aSWarner Losh /**
27177270962aSWarner Losh   Converts a text device path node to USB WWID device path structure.
27187270962aSWarner Losh 
27197270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
27207270962aSWarner Losh 
27217270962aSWarner Losh   @return A pointer to the newly-created USB WWID device path structure.
27227270962aSWarner Losh 
27237270962aSWarner Losh **/
27247270962aSWarner Losh static
27257270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWwid(IN CHAR16 * TextDeviceNode)27267270962aSWarner Losh DevPathFromTextUsbWwid (
27277270962aSWarner Losh   IN CHAR16  *TextDeviceNode
27287270962aSWarner Losh   )
27297270962aSWarner Losh {
27307270962aSWarner Losh   CHAR16                *VIDStr;
27317270962aSWarner Losh   CHAR16                *PIDStr;
27327270962aSWarner Losh   CHAR16                *InterfaceNumStr;
27337270962aSWarner Losh   CHAR16                *SerialNumberStr;
27347270962aSWarner Losh   USB_WWID_DEVICE_PATH  *UsbWwid;
27357270962aSWarner Losh   UINTN                 SerialNumberStrLen;
27367270962aSWarner Losh 
27377270962aSWarner Losh   VIDStr             = GetNextParamStr (&TextDeviceNode);
27387270962aSWarner Losh   PIDStr             = GetNextParamStr (&TextDeviceNode);
27397270962aSWarner Losh   InterfaceNumStr    = GetNextParamStr (&TextDeviceNode);
27407270962aSWarner Losh   SerialNumberStr    = GetNextParamStr (&TextDeviceNode);
27417270962aSWarner Losh   SerialNumberStrLen = StrLen (SerialNumberStr);
27425754f582SJose Luis Duran   if ((SerialNumberStrLen >= 2) &&
27435754f582SJose Luis Duran       (SerialNumberStr[0] == '\"') &&
27445754f582SJose Luis Duran       (SerialNumberStr[SerialNumberStrLen - 1] == '\"')
27455754f582SJose Luis Duran       )
27465754f582SJose Luis Duran   {
27477270962aSWarner Losh     SerialNumberStr[SerialNumberStrLen - 1] = '\0';
27487270962aSWarner Losh     SerialNumberStr++;
27497270962aSWarner Losh     SerialNumberStrLen -= 2;
27507270962aSWarner Losh   }
27515754f582SJose Luis Duran 
27527270962aSWarner Losh   UsbWwid = (USB_WWID_DEVICE_PATH *)CreateDeviceNode (
27537270962aSWarner Losh                                       MESSAGING_DEVICE_PATH,
27547270962aSWarner Losh                                       MSG_USB_WWID_DP,
27557270962aSWarner Losh                                       (UINT16)(sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
27567270962aSWarner Losh                                       );
2757*05653fc7SJose Luis Duran 
2758*05653fc7SJose Luis Duran   if (UsbWwid != NULL) {
27597270962aSWarner Losh     UsbWwid->VendorId        = (UINT16)Strtoi (VIDStr);
27607270962aSWarner Losh     UsbWwid->ProductId       = (UINT16)Strtoi (PIDStr);
27617270962aSWarner Losh     UsbWwid->InterfaceNumber = (UINT16)Strtoi (InterfaceNumStr);
27627270962aSWarner Losh 
27637270962aSWarner Losh     //
27647270962aSWarner Losh     // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.
27657270962aSWarner Losh     // Therefore, the '\0' will not be copied.
27667270962aSWarner Losh     //
27677270962aSWarner Losh     CopyMem (
27687270962aSWarner Losh       (UINT8 *)UsbWwid + sizeof (USB_WWID_DEVICE_PATH),
27697270962aSWarner Losh       SerialNumberStr,
27707270962aSWarner Losh       SerialNumberStrLen * sizeof (CHAR16)
27717270962aSWarner Losh       );
2772*05653fc7SJose Luis Duran   }
27737270962aSWarner Losh 
27747270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)UsbWwid;
27757270962aSWarner Losh }
27767270962aSWarner Losh 
27777270962aSWarner Losh /**
27787270962aSWarner Losh   Converts a text device path node to Logic Unit device path structure.
27797270962aSWarner Losh 
27807270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
27817270962aSWarner Losh 
27827270962aSWarner Losh   @return A pointer to the newly-created Logic Unit device path structure.
27837270962aSWarner Losh 
27847270962aSWarner Losh **/
27857270962aSWarner Losh static
27867270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUnit(IN CHAR16 * TextDeviceNode)27877270962aSWarner Losh DevPathFromTextUnit (
27887270962aSWarner Losh   IN CHAR16  *TextDeviceNode
27897270962aSWarner Losh   )
27907270962aSWarner Losh {
27917270962aSWarner Losh   CHAR16                           *LunStr;
27927270962aSWarner Losh   DEVICE_LOGICAL_UNIT_DEVICE_PATH  *LogicalUnit;
27937270962aSWarner Losh 
27947270962aSWarner Losh   LunStr      = GetNextParamStr (&TextDeviceNode);
27957270962aSWarner Losh   LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *)CreateDeviceNode (
27967270962aSWarner Losh                                                      MESSAGING_DEVICE_PATH,
27977270962aSWarner Losh                                                      MSG_DEVICE_LOGICAL_UNIT_DP,
27987270962aSWarner Losh                                                      (UINT16)sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
27997270962aSWarner Losh                                                      );
28007270962aSWarner Losh 
2801*05653fc7SJose Luis Duran   if (LogicalUnit != NULL) {
28027270962aSWarner Losh     LogicalUnit->Lun = (UINT8)Strtoi (LunStr);
2803*05653fc7SJose Luis Duran   }
28047270962aSWarner Losh 
28057270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)LogicalUnit;
28067270962aSWarner Losh }
28077270962aSWarner Losh 
28087270962aSWarner Losh /**
28097270962aSWarner Losh   Converts a text device path node to iSCSI 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 iSCSI device path structure.
28147270962aSWarner Losh 
28157270962aSWarner Losh **/
28167270962aSWarner Losh static
28177270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextiSCSI(IN CHAR16 * TextDeviceNode)28187270962aSWarner Losh DevPathFromTextiSCSI (
28197270962aSWarner Losh   IN CHAR16  *TextDeviceNode
28207270962aSWarner Losh   )
28217270962aSWarner Losh {
28227270962aSWarner Losh   UINT16                       Options;
28237270962aSWarner Losh   CHAR16                       *NameStr;
28247270962aSWarner Losh   CHAR16                       *PortalGroupStr;
28257270962aSWarner Losh   CHAR16                       *LunStr;
28267270962aSWarner Losh   CHAR16                       *HeaderDigestStr;
28277270962aSWarner Losh   CHAR16                       *DataDigestStr;
28287270962aSWarner Losh   CHAR16                       *AuthenticationStr;
28297270962aSWarner Losh   CHAR16                       *ProtocolStr;
28307270962aSWarner Losh   CHAR8                        *AsciiStr;
28317270962aSWarner Losh   ISCSI_DEVICE_PATH_WITH_NAME  *ISCSIDevPath;
2832acfee013SJose Luis Duran   UINT64                       Lun;
28337270962aSWarner Losh 
28347270962aSWarner Losh   NameStr           = GetNextParamStr (&TextDeviceNode);
28357270962aSWarner Losh   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);
28367270962aSWarner Losh   LunStr            = GetNextParamStr (&TextDeviceNode);
28377270962aSWarner Losh   HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);
28387270962aSWarner Losh   DataDigestStr     = GetNextParamStr (&TextDeviceNode);
28397270962aSWarner Losh   AuthenticationStr = GetNextParamStr (&TextDeviceNode);
28407270962aSWarner Losh   ProtocolStr       = GetNextParamStr (&TextDeviceNode);
28417270962aSWarner Losh   ISCSIDevPath      = (ISCSI_DEVICE_PATH_WITH_NAME *)CreateDeviceNode (
28427270962aSWarner Losh                                                        MESSAGING_DEVICE_PATH,
28437270962aSWarner Losh                                                        MSG_ISCSI_DP,
28447270962aSWarner Losh                                                        (UINT16)(sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))
28457270962aSWarner Losh                                                        );
28467270962aSWarner Losh 
2847*05653fc7SJose Luis Duran   if (ISCSIDevPath == NULL) {
2848*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)ISCSIDevPath;
2849*05653fc7SJose Luis Duran   }
2850*05653fc7SJose Luis Duran 
28517270962aSWarner Losh   AsciiStr = ISCSIDevPath->TargetName;
28527270962aSWarner Losh   StrToAscii (NameStr, &AsciiStr);
28537270962aSWarner Losh 
28547270962aSWarner Losh   ISCSIDevPath->TargetPortalGroupTag = (UINT16)Strtoi (PortalGroupStr);
2855acfee013SJose Luis Duran   Strtoi64 (LunStr, &Lun);
2856acfee013SJose Luis Duran   WriteUnaligned64 ((UINT64 *)&ISCSIDevPath->Lun, SwapBytes64 (Lun));
28577270962aSWarner Losh 
28587270962aSWarner Losh   Options = 0x0000;
28597270962aSWarner Losh   if (StrCmp (HeaderDigestStr, "CRC32C") == 0) {
28607270962aSWarner Losh     Options |= 0x0002;
28617270962aSWarner Losh   }
28627270962aSWarner Losh 
28637270962aSWarner Losh   if (StrCmp (DataDigestStr, "CRC32C") == 0) {
28647270962aSWarner Losh     Options |= 0x0008;
28657270962aSWarner Losh   }
28667270962aSWarner Losh 
28677270962aSWarner Losh   if (StrCmp (AuthenticationStr, "None") == 0) {
28687270962aSWarner Losh     Options |= 0x0800;
28697270962aSWarner Losh   }
28707270962aSWarner Losh 
28717270962aSWarner Losh   if (StrCmp (AuthenticationStr, "CHAP_UNI") == 0) {
28727270962aSWarner Losh     Options |= 0x1000;
28737270962aSWarner Losh   }
28747270962aSWarner Losh 
28757270962aSWarner Losh   ISCSIDevPath->LoginOption = (UINT16)Options;
28767270962aSWarner Losh 
287776ed5f1bSJose Luis Duran   if (IS_NULL (*ProtocolStr) || (StrCmp (ProtocolStr, "TCP") == 0)) {
28787ca6daffSJose Luis Duran     ISCSIDevPath->NetworkProtocol = 0;
28797ca6daffSJose Luis Duran   } else {
28807ca6daffSJose Luis Duran     //
28817ca6daffSJose Luis Duran     // Undefined and reserved.
28827ca6daffSJose Luis Duran     //
28837ca6daffSJose Luis Duran     ISCSIDevPath->NetworkProtocol = 1;
28847ca6daffSJose Luis Duran   }
28857270962aSWarner Losh 
28867270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)ISCSIDevPath;
28877270962aSWarner Losh }
28887270962aSWarner Losh 
28897270962aSWarner Losh /**
28907270962aSWarner Losh   Converts a text device path node to VLAN device path structure.
28917270962aSWarner Losh 
28927270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
28937270962aSWarner Losh 
28947270962aSWarner Losh   @return A pointer to the newly-created VLAN device path structure.
28957270962aSWarner Losh 
28967270962aSWarner Losh **/
28977270962aSWarner Losh static
28987270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVlan(IN CHAR16 * TextDeviceNode)28997270962aSWarner Losh DevPathFromTextVlan (
29007270962aSWarner Losh   IN CHAR16  *TextDeviceNode
29017270962aSWarner Losh   )
29027270962aSWarner Losh {
29037270962aSWarner Losh   CHAR16            *VlanStr;
29047270962aSWarner Losh   VLAN_DEVICE_PATH  *Vlan;
29057270962aSWarner Losh 
29067270962aSWarner Losh   VlanStr = GetNextParamStr (&TextDeviceNode);
29077270962aSWarner Losh   Vlan    = (VLAN_DEVICE_PATH *)CreateDeviceNode (
29087270962aSWarner Losh                                   MESSAGING_DEVICE_PATH,
29097270962aSWarner Losh                                   MSG_VLAN_DP,
29107270962aSWarner Losh                                   (UINT16)sizeof (VLAN_DEVICE_PATH)
29117270962aSWarner Losh                                   );
29127270962aSWarner Losh 
2913*05653fc7SJose Luis Duran   if (Vlan != NULL) {
29147270962aSWarner Losh     Vlan->VlanId = (UINT16)Strtoi (VlanStr);
2915*05653fc7SJose Luis Duran   }
29167270962aSWarner Losh 
29177270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Vlan;
29187270962aSWarner Losh }
29197270962aSWarner Losh 
29207270962aSWarner Losh /**
29217270962aSWarner Losh   Converts a text device path node to Bluetooth device path structure.
29227270962aSWarner Losh 
29237270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
29247270962aSWarner Losh 
29257270962aSWarner Losh   @return A pointer to the newly-created Bluetooth device path structure.
29267270962aSWarner Losh 
29277270962aSWarner Losh **/
29287270962aSWarner Losh static
29297270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBluetooth(IN CHAR16 * TextDeviceNode)29307270962aSWarner Losh DevPathFromTextBluetooth (
29317270962aSWarner Losh   IN CHAR16  *TextDeviceNode
29327270962aSWarner Losh   )
29337270962aSWarner Losh {
29347270962aSWarner Losh   CHAR16                 *BluetoothStr;
29357270962aSWarner Losh   BLUETOOTH_DEVICE_PATH  *BluetoothDp;
29367270962aSWarner Losh 
29377270962aSWarner Losh   BluetoothStr = GetNextParamStr (&TextDeviceNode);
29387270962aSWarner Losh   BluetoothDp  = (BLUETOOTH_DEVICE_PATH *)CreateDeviceNode (
29397270962aSWarner Losh                                             MESSAGING_DEVICE_PATH,
29407270962aSWarner Losh                                             MSG_BLUETOOTH_DP,
29417270962aSWarner Losh                                             (UINT16)sizeof (BLUETOOTH_DEVICE_PATH)
29427270962aSWarner Losh                                             );
2943*05653fc7SJose Luis Duran 
2944*05653fc7SJose Luis Duran   if (BluetoothDp != NULL) {
294500816383SJose Luis Duran     StrHexToBytes (
294600816383SJose Luis Duran       BluetoothStr,
294700816383SJose Luis Duran       sizeof (BLUETOOTH_ADDRESS) * 2,
294800816383SJose Luis Duran       BluetoothDp->BD_ADDR.Address,
294900816383SJose Luis Duran       sizeof (BLUETOOTH_ADDRESS)
295000816383SJose Luis Duran       );
2951*05653fc7SJose Luis Duran   }
2952*05653fc7SJose Luis Duran 
29537270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothDp;
29547270962aSWarner Losh }
29557270962aSWarner Losh 
29567270962aSWarner Losh /**
29577270962aSWarner Losh   Converts a text device path node to Wi-Fi device path structure.
29587270962aSWarner Losh 
29597270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
29607270962aSWarner Losh 
29617270962aSWarner Losh   @return A pointer to the newly-created Wi-Fi device path structure.
29627270962aSWarner Losh 
29637270962aSWarner Losh **/
29647270962aSWarner Losh static
29657270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextWiFi(IN CHAR16 * TextDeviceNode)29667270962aSWarner Losh DevPathFromTextWiFi (
29677270962aSWarner Losh   IN CHAR16  *TextDeviceNode
29687270962aSWarner Losh   )
29697270962aSWarner Losh {
29707270962aSWarner Losh   CHAR16            *SSIdStr;
29717270962aSWarner Losh   CHAR8             AsciiStr[33];
29727270962aSWarner Losh   UINTN             DataLen;
29737270962aSWarner Losh   WIFI_DEVICE_PATH  *WiFiDp;
29747270962aSWarner Losh 
29757270962aSWarner Losh   SSIdStr = GetNextParamStr (&TextDeviceNode);
29767270962aSWarner Losh   WiFiDp  = (WIFI_DEVICE_PATH *)CreateDeviceNode (
29777270962aSWarner Losh                                   MESSAGING_DEVICE_PATH,
29787270962aSWarner Losh                                   MSG_WIFI_DP,
29797270962aSWarner Losh                                   (UINT16)sizeof (WIFI_DEVICE_PATH)
29807270962aSWarner Losh                                   );
29817270962aSWarner Losh 
2982*05653fc7SJose Luis Duran   if ((NULL != SSIdStr) && (NULL != WiFiDp)) {
29837270962aSWarner Losh     DataLen = StrLen (SSIdStr);
29847270962aSWarner Losh     if (StrLen (SSIdStr) > 32) {
29857270962aSWarner Losh       SSIdStr[32] = '\0';
29867270962aSWarner Losh       DataLen     = 32;
29877270962aSWarner Losh     }
29887270962aSWarner Losh 
29897270962aSWarner Losh     UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));
29907270962aSWarner Losh     CopyMem (WiFiDp->SSId, AsciiStr, DataLen);
29917270962aSWarner Losh   }
29927270962aSWarner Losh 
29937270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)WiFiDp;
29947270962aSWarner Losh }
29957270962aSWarner Losh 
29967270962aSWarner Losh /**
2997e8fc7f11SJose Luis Duran   Converts a text device path node to Bluetooth LE device path structure.
2998e8fc7f11SJose Luis Duran 
2999e8fc7f11SJose Luis Duran   @param TextDeviceNode  The input Text device path node.
3000e8fc7f11SJose Luis Duran 
3001e8fc7f11SJose Luis Duran   @return A pointer to the newly-created Bluetooth LE device path structure.
3002e8fc7f11SJose Luis Duran 
3003e8fc7f11SJose Luis Duran **/
3004e8fc7f11SJose Luis Duran static
3005e8fc7f11SJose Luis Duran EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBluetoothLE(IN CHAR16 * TextDeviceNode)3006e8fc7f11SJose Luis Duran DevPathFromTextBluetoothLE (
3007e8fc7f11SJose Luis Duran   IN CHAR16  *TextDeviceNode
3008e8fc7f11SJose Luis Duran   )
3009e8fc7f11SJose Luis Duran {
3010e8fc7f11SJose Luis Duran   CHAR16                    *BluetoothLeAddrStr;
3011e8fc7f11SJose Luis Duran   CHAR16                    *BluetoothLeAddrTypeStr;
3012e8fc7f11SJose Luis Duran   BLUETOOTH_LE_DEVICE_PATH  *BluetoothLeDp;
3013e8fc7f11SJose Luis Duran 
3014e8fc7f11SJose Luis Duran   BluetoothLeAddrStr     = GetNextParamStr (&TextDeviceNode);
3015e8fc7f11SJose Luis Duran   BluetoothLeAddrTypeStr = GetNextParamStr (&TextDeviceNode);
3016e8fc7f11SJose Luis Duran   BluetoothLeDp          = (BLUETOOTH_LE_DEVICE_PATH *)CreateDeviceNode (
3017e8fc7f11SJose Luis Duran                                                          MESSAGING_DEVICE_PATH,
3018e8fc7f11SJose Luis Duran                                                          MSG_BLUETOOTH_LE_DP,
3019e8fc7f11SJose Luis Duran                                                          (UINT16)sizeof (BLUETOOTH_LE_DEVICE_PATH)
3020e8fc7f11SJose Luis Duran                                                          );
3021e8fc7f11SJose Luis Duran 
3022*05653fc7SJose Luis Duran   if (BluetoothLeDp != NULL) {
3023e8fc7f11SJose Luis Duran     BluetoothLeDp->Address.Type = (UINT8)Strtoi (BluetoothLeAddrTypeStr);
3024e8fc7f11SJose Luis Duran     StrHexToBytes (
30255754f582SJose Luis Duran       BluetoothLeAddrStr,
30265754f582SJose Luis Duran       sizeof (BluetoothLeDp->Address.Address) * 2,
30275754f582SJose Luis Duran       BluetoothLeDp->Address.Address,
30285754f582SJose Luis Duran       sizeof (BluetoothLeDp->Address.Address)
3029e8fc7f11SJose Luis Duran       );
3030*05653fc7SJose Luis Duran   }
3031*05653fc7SJose Luis Duran 
3032e8fc7f11SJose Luis Duran   return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothLeDp;
3033e8fc7f11SJose Luis Duran }
3034e8fc7f11SJose Luis Duran 
3035e8fc7f11SJose Luis Duran /**
3036d9d1a1e7SJose Luis Duran   Converts a text device path node to DNS device path structure.
3037d9d1a1e7SJose Luis Duran 
3038d9d1a1e7SJose Luis Duran   @param TextDeviceNode  The input Text device path node.
3039d9d1a1e7SJose Luis Duran 
3040d9d1a1e7SJose Luis Duran   @return A pointer to the newly-created DNS device path structure.
3041d9d1a1e7SJose Luis Duran 
3042d9d1a1e7SJose Luis Duran **/
3043d9d1a1e7SJose Luis Duran static
3044d9d1a1e7SJose Luis Duran EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextDns(IN CHAR16 * TextDeviceNode)3045d9d1a1e7SJose Luis Duran DevPathFromTextDns (
3046d9d1a1e7SJose Luis Duran   IN CHAR16  *TextDeviceNode
3047d9d1a1e7SJose Luis Duran   )
3048d9d1a1e7SJose Luis Duran {
3049d9d1a1e7SJose Luis Duran   CHAR16           *DeviceNodeStr;
3050d9d1a1e7SJose Luis Duran   CHAR16           *DeviceNodeStrPtr;
3051d9d1a1e7SJose Luis Duran   UINT32           DnsServerIpCount;
3052d9d1a1e7SJose Luis Duran   UINT16           DnsDeviceNodeLength;
3053d9d1a1e7SJose Luis Duran   DNS_DEVICE_PATH  *DnsDeviceNode;
3054d9d1a1e7SJose Luis Duran   UINT32           DnsServerIpIndex;
3055d9d1a1e7SJose Luis Duran   CHAR16           *DnsServerIp;
3056d9d1a1e7SJose Luis Duran 
3057d9d1a1e7SJose Luis Duran   //
3058d9d1a1e7SJose Luis Duran   // Count the DNS server address number.
3059d9d1a1e7SJose Luis Duran   //
3060d9d1a1e7SJose Luis Duran   DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
3061d9d1a1e7SJose Luis Duran   if (DeviceNodeStr == NULL) {
3062d9d1a1e7SJose Luis Duran     return NULL;
3063d9d1a1e7SJose Luis Duran   }
3064d9d1a1e7SJose Luis Duran 
3065d9d1a1e7SJose Luis Duran   DeviceNodeStrPtr = DeviceNodeStr;
3066d9d1a1e7SJose Luis Duran 
3067d9d1a1e7SJose Luis Duran   DnsServerIpCount = 0;
3068d9d1a1e7SJose Luis Duran   while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != '\0') {
3069d9d1a1e7SJose Luis Duran     GetNextParamStr (&DeviceNodeStrPtr);
3070d9d1a1e7SJose Luis Duran     DnsServerIpCount++;
3071d9d1a1e7SJose Luis Duran   }
3072d9d1a1e7SJose Luis Duran 
3073d9d1a1e7SJose Luis Duran   FreePool (DeviceNodeStr);
3074d9d1a1e7SJose Luis Duran   DeviceNodeStr = NULL;
3075d9d1a1e7SJose Luis Duran 
3076d9d1a1e7SJose Luis Duran   //
3077d9d1a1e7SJose Luis Duran   // One or more instances of the DNS server address in EFI_IP_ADDRESS,
3078d9d1a1e7SJose Luis Duran   // otherwise, NULL will be returned.
3079d9d1a1e7SJose Luis Duran   //
3080d9d1a1e7SJose Luis Duran   if (DnsServerIpCount == 0) {
3081d9d1a1e7SJose Luis Duran     return NULL;
3082d9d1a1e7SJose Luis Duran   }
3083d9d1a1e7SJose Luis Duran 
3084d9d1a1e7SJose Luis Duran   //
3085d9d1a1e7SJose Luis Duran   // Create the DNS DeviceNode.
3086d9d1a1e7SJose Luis Duran   //
3087d9d1a1e7SJose Luis Duran   DnsDeviceNodeLength = (UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
3088d9d1a1e7SJose Luis Duran   DnsDeviceNode       = (DNS_DEVICE_PATH *)CreateDeviceNode (
3089d9d1a1e7SJose Luis Duran                                              MESSAGING_DEVICE_PATH,
3090d9d1a1e7SJose Luis Duran                                              MSG_DNS_DP,
3091d9d1a1e7SJose Luis Duran                                              DnsDeviceNodeLength
3092d9d1a1e7SJose Luis Duran                                              );
3093d9d1a1e7SJose Luis Duran   if (DnsDeviceNode == NULL) {
3094d9d1a1e7SJose Luis Duran     return NULL;
3095d9d1a1e7SJose Luis Duran   }
3096d9d1a1e7SJose Luis Duran 
3097d9d1a1e7SJose Luis Duran   //
3098d9d1a1e7SJose Luis Duran   // Confirm the DNS server address is IPv4 or IPv6 type.
3099d9d1a1e7SJose Luis Duran   //
3100d9d1a1e7SJose Luis Duran   DeviceNodeStrPtr = TextDeviceNode;
3101d9d1a1e7SJose Luis Duran   while (!IS_NULL (*DeviceNodeStrPtr)) {
3102d9d1a1e7SJose Luis Duran     if (*DeviceNodeStrPtr == '.') {
3103d9d1a1e7SJose Luis Duran       DnsDeviceNode->IsIPv6 = 0x00;
3104d9d1a1e7SJose Luis Duran       break;
3105d9d1a1e7SJose Luis Duran     }
3106d9d1a1e7SJose Luis Duran 
3107d9d1a1e7SJose Luis Duran     if (*DeviceNodeStrPtr == ':') {
3108d9d1a1e7SJose Luis Duran       DnsDeviceNode->IsIPv6 = 0x01;
3109d9d1a1e7SJose Luis Duran       break;
3110d9d1a1e7SJose Luis Duran     }
3111d9d1a1e7SJose Luis Duran 
3112d9d1a1e7SJose Luis Duran     DeviceNodeStrPtr++;
3113d9d1a1e7SJose Luis Duran   }
3114d9d1a1e7SJose Luis Duran 
3115d9d1a1e7SJose Luis Duran   for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
3116d9d1a1e7SJose Luis Duran     DnsServerIp = GetNextParamStr (&TextDeviceNode);
3117d9d1a1e7SJose Luis Duran     if (DnsDeviceNode->IsIPv6 == 0x00) {
3118d9d1a1e7SJose Luis Duran       StrToIpv4Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
3119d9d1a1e7SJose Luis Duran     } else {
3120d9d1a1e7SJose Luis Duran       StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
3121d9d1a1e7SJose Luis Duran     }
3122d9d1a1e7SJose Luis Duran   }
3123d9d1a1e7SJose Luis Duran 
3124d9d1a1e7SJose Luis Duran   return (EFI_DEVICE_PATH_PROTOCOL *)DnsDeviceNode;
3125d9d1a1e7SJose Luis Duran }
3126d9d1a1e7SJose Luis Duran 
3127d9d1a1e7SJose Luis Duran /**
31287270962aSWarner Losh   Converts a text device path node to URI device path structure.
31297270962aSWarner Losh 
31307270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
31317270962aSWarner Losh 
31327270962aSWarner Losh   @return A pointer to the newly-created URI device path structure.
31337270962aSWarner Losh 
31347270962aSWarner Losh **/
31357270962aSWarner Losh static
31367270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUri(IN CHAR16 * TextDeviceNode)31377270962aSWarner Losh DevPathFromTextUri (
31387270962aSWarner Losh   IN CHAR16  *TextDeviceNode
31397270962aSWarner Losh   )
31407270962aSWarner Losh {
31417270962aSWarner Losh   CHAR16           *UriStr;
31427270962aSWarner Losh   UINTN            UriLength;
31437270962aSWarner Losh   URI_DEVICE_PATH  *Uri;
31447270962aSWarner Losh 
31457270962aSWarner Losh   UriStr    = GetNextParamStr (&TextDeviceNode);
31467270962aSWarner Losh   UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));
31477270962aSWarner Losh   Uri       = (URI_DEVICE_PATH *)CreateDeviceNode (
31487270962aSWarner Losh                                    MESSAGING_DEVICE_PATH,
31497270962aSWarner Losh                                    MSG_URI_DP,
31507270962aSWarner Losh                                    (UINT16)(sizeof (URI_DEVICE_PATH) + UriLength)
31517270962aSWarner Losh                                    );
31527270962aSWarner Losh 
3153*05653fc7SJose Luis Duran   while (Uri != NULL && UriLength-- != 0) {
31547270962aSWarner Losh     Uri->Uri[UriLength] = (CHAR8)UriStr[UriLength];
31557270962aSWarner Losh   }
31567270962aSWarner Losh 
31577270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Uri;
31587270962aSWarner Losh }
31597270962aSWarner Losh 
31607270962aSWarner Losh /**
31617270962aSWarner Losh   Converts a media text device path node to media device path structure.
31627270962aSWarner Losh 
31637270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
31647270962aSWarner Losh 
31657270962aSWarner Losh   @return A pointer to media device path structure.
31667270962aSWarner Losh 
31677270962aSWarner Losh **/
31687270962aSWarner Losh static
31697270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMediaPath(IN CHAR16 * TextDeviceNode)31707270962aSWarner Losh DevPathFromTextMediaPath (
31717270962aSWarner Losh   IN CHAR16  *TextDeviceNode
31727270962aSWarner Losh   )
31737270962aSWarner Losh {
31747270962aSWarner Losh   return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);
31757270962aSWarner Losh }
31767270962aSWarner Losh 
31777270962aSWarner Losh /**
31787270962aSWarner Losh   Converts a text device path node to HD device path structure.
31797270962aSWarner Losh 
31807270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
31817270962aSWarner Losh 
31827270962aSWarner Losh   @return A pointer to the newly-created HD device path structure.
31837270962aSWarner Losh 
31847270962aSWarner Losh **/
31857270962aSWarner Losh static
31867270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHD(IN CHAR16 * TextDeviceNode)31877270962aSWarner Losh DevPathFromTextHD (
31887270962aSWarner Losh   IN CHAR16  *TextDeviceNode
31897270962aSWarner Losh   )
31907270962aSWarner Losh {
31917270962aSWarner Losh   CHAR16                 *PartitionStr;
31927270962aSWarner Losh   CHAR16                 *TypeStr;
31937270962aSWarner Losh   CHAR16                 *SignatureStr;
31947270962aSWarner Losh   CHAR16                 *StartStr;
31957270962aSWarner Losh   CHAR16                 *SizeStr;
31967270962aSWarner Losh   UINT32                 Signature32;
31977270962aSWarner Losh   HARDDRIVE_DEVICE_PATH  *Hd;
31987270962aSWarner Losh 
31997270962aSWarner Losh   PartitionStr = GetNextParamStr (&TextDeviceNode);
32007270962aSWarner Losh   TypeStr      = GetNextParamStr (&TextDeviceNode);
32017270962aSWarner Losh   SignatureStr = GetNextParamStr (&TextDeviceNode);
32027270962aSWarner Losh   StartStr     = GetNextParamStr (&TextDeviceNode);
32037270962aSWarner Losh   SizeStr      = GetNextParamStr (&TextDeviceNode);
32047270962aSWarner Losh   Hd           = (HARDDRIVE_DEVICE_PATH *)CreateDeviceNode (
32057270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
32067270962aSWarner Losh                                             MEDIA_HARDDRIVE_DP,
32077270962aSWarner Losh                                             (UINT16)sizeof (HARDDRIVE_DEVICE_PATH)
32087270962aSWarner Losh                                             );
32097270962aSWarner Losh 
3210*05653fc7SJose Luis Duran   if (Hd == NULL) {
3211*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Hd;
3212*05653fc7SJose Luis Duran   }
3213*05653fc7SJose Luis Duran 
32147270962aSWarner Losh   Hd->PartitionNumber = (UINT32)Strtoi (PartitionStr);
32157270962aSWarner Losh 
32167270962aSWarner Losh   ZeroMem (Hd->Signature, 16);
32177270962aSWarner Losh   Hd->MBRType = (UINT8)0;
32187270962aSWarner Losh 
32197270962aSWarner Losh   if (StrCmp (TypeStr, "MBR") == 0) {
32207270962aSWarner Losh     Hd->SignatureType = SIGNATURE_TYPE_MBR;
32217270962aSWarner Losh     Hd->MBRType       = 0x01;
32227270962aSWarner Losh 
32237270962aSWarner Losh     Signature32 = (UINT32)Strtoi (SignatureStr);
32247270962aSWarner Losh     CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
32257270962aSWarner Losh   } else if (StrCmp (TypeStr, "GPT") == 0) {
32267270962aSWarner Losh     Hd->SignatureType = SIGNATURE_TYPE_GUID;
32277270962aSWarner Losh     Hd->MBRType       = 0x02;
32287270962aSWarner Losh 
32297270962aSWarner Losh     StrToGuid (SignatureStr, (EFI_GUID *)Hd->Signature);
32307270962aSWarner Losh   } else {
32317270962aSWarner Losh     Hd->SignatureType = (UINT8)Strtoi (TypeStr);
32327270962aSWarner Losh   }
32337270962aSWarner Losh 
32347270962aSWarner Losh   Strtoi64 (StartStr, &Hd->PartitionStart);
32357270962aSWarner Losh   Strtoi64 (SizeStr, &Hd->PartitionSize);
32367270962aSWarner Losh 
32377270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Hd;
32387270962aSWarner Losh }
32397270962aSWarner Losh 
32407270962aSWarner Losh /**
32417270962aSWarner Losh   Converts a text device path node to CDROM device path structure.
32427270962aSWarner Losh 
32437270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
32447270962aSWarner Losh 
32457270962aSWarner Losh   @return A pointer to the newly-created CDROM device path structure.
32467270962aSWarner Losh 
32477270962aSWarner Losh **/
32487270962aSWarner Losh static
32497270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCDROM(IN CHAR16 * TextDeviceNode)32507270962aSWarner Losh DevPathFromTextCDROM (
32517270962aSWarner Losh   IN CHAR16  *TextDeviceNode
32527270962aSWarner Losh   )
32537270962aSWarner Losh {
32547270962aSWarner Losh   CHAR16             *EntryStr;
32557270962aSWarner Losh   CHAR16             *StartStr;
32567270962aSWarner Losh   CHAR16             *SizeStr;
32577270962aSWarner Losh   CDROM_DEVICE_PATH  *CDROMDevPath;
32587270962aSWarner Losh 
32597270962aSWarner Losh   EntryStr     = GetNextParamStr (&TextDeviceNode);
32607270962aSWarner Losh   StartStr     = GetNextParamStr (&TextDeviceNode);
32617270962aSWarner Losh   SizeStr      = GetNextParamStr (&TextDeviceNode);
32627270962aSWarner Losh   CDROMDevPath = (CDROM_DEVICE_PATH *)CreateDeviceNode (
32637270962aSWarner Losh                                         MEDIA_DEVICE_PATH,
32647270962aSWarner Losh                                         MEDIA_CDROM_DP,
32657270962aSWarner Losh                                         (UINT16)sizeof (CDROM_DEVICE_PATH)
32667270962aSWarner Losh                                         );
32677270962aSWarner Losh 
3268*05653fc7SJose Luis Duran   if (CDROMDevPath != NULL) {
32697270962aSWarner Losh     CDROMDevPath->BootEntry = (UINT32)Strtoi (EntryStr);
32707270962aSWarner Losh     Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);
32717270962aSWarner Losh     Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);
3272*05653fc7SJose Luis Duran   }
32737270962aSWarner Losh 
32747270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)CDROMDevPath;
32757270962aSWarner Losh }
32767270962aSWarner Losh 
32777270962aSWarner Losh /**
32787270962aSWarner Losh   Converts a text device path node to Vendor-defined media device path structure.
32797270962aSWarner Losh 
32807270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
32817270962aSWarner Losh 
32827270962aSWarner Losh   @return A pointer to the newly-created Vendor-defined media device path structure.
32837270962aSWarner Losh 
32847270962aSWarner Losh **/
32857270962aSWarner Losh static
32867270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMedia(IN CHAR16 * TextDeviceNode)32877270962aSWarner Losh DevPathFromTextVenMedia (
32887270962aSWarner Losh   IN CHAR16  *TextDeviceNode
32897270962aSWarner Losh   )
32907270962aSWarner Losh {
32917270962aSWarner Losh   return ConvertFromTextVendor (
32927270962aSWarner Losh            TextDeviceNode,
32937270962aSWarner Losh            MEDIA_DEVICE_PATH,
32947270962aSWarner Losh            MEDIA_VENDOR_DP
32957270962aSWarner Losh            );
32967270962aSWarner Losh }
32977270962aSWarner Losh 
32987270962aSWarner Losh /**
32997270962aSWarner Losh   Converts a text device path node to File device path structure.
33007270962aSWarner Losh 
33017270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
33027270962aSWarner Losh 
33037270962aSWarner Losh   @return A pointer to the newly-created File device path structure.
33047270962aSWarner Losh 
33057270962aSWarner Losh **/
33067270962aSWarner Losh static
33077270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFilePath(IN CHAR16 * TextDeviceNode)33087270962aSWarner Losh DevPathFromTextFilePath (
33097270962aSWarner Losh   IN CHAR16  *TextDeviceNode
33107270962aSWarner Losh   )
33117270962aSWarner Losh {
33127270962aSWarner Losh   FILEPATH_DEVICE_PATH  *File;
33137270962aSWarner Losh 
3314d780e059SWarner Losh #ifndef __FreeBSD__
33157270962aSWarner Losh   File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
33167270962aSWarner Losh                                    MEDIA_DEVICE_PATH,
33177270962aSWarner Losh                                    MEDIA_FILEPATH_DP,
33187270962aSWarner Losh                                    (UINT16)(sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)
33197270962aSWarner Losh                                    );
33207270962aSWarner Losh 
3321*05653fc7SJose Luis Duran   if (File != NULL) {
33227270962aSWarner Losh     StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);
3323*05653fc7SJose Luis Duran   }
3324d780e059SWarner Losh #else
3325ae3adc06SWarner Losh   size_t len = (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2);
3326ae3adc06SWarner Losh   efi_char *v;
3327d780e059SWarner Losh   File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
3328d780e059SWarner Losh                                    MEDIA_DEVICE_PATH,
3329d780e059SWarner Losh                                    MEDIA_FILEPATH_DP,
3330ae3adc06SWarner Losh                                    (UINT16)len
3331d780e059SWarner Losh                                    );
3332*05653fc7SJose Luis Duran   if (File != NULL) {
3333ae3adc06SWarner Losh     v = File->PathName;
3334ae3adc06SWarner Losh     utf8_to_ucs2(TextDeviceNode, &v, &len);
3335*05653fc7SJose Luis Duran   }
3336d780e059SWarner Losh #endif
33377270962aSWarner Losh 
33387270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)File;
33397270962aSWarner Losh }
33407270962aSWarner Losh 
33417270962aSWarner Losh /**
33427270962aSWarner Losh   Converts a text device path node to Media protocol device path structure.
33437270962aSWarner Losh 
33447270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
33457270962aSWarner Losh 
33467270962aSWarner Losh   @return A pointer to the newly-created Media protocol device path structure.
33477270962aSWarner Losh 
33487270962aSWarner Losh **/
33497270962aSWarner Losh static
33507270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMedia(IN CHAR16 * TextDeviceNode)33517270962aSWarner Losh DevPathFromTextMedia (
33527270962aSWarner Losh   IN CHAR16  *TextDeviceNode
33537270962aSWarner Losh   )
33547270962aSWarner Losh {
33557270962aSWarner Losh   CHAR16                      *GuidStr;
33567270962aSWarner Losh   MEDIA_PROTOCOL_DEVICE_PATH  *Media;
33577270962aSWarner Losh 
33587270962aSWarner Losh   GuidStr = GetNextParamStr (&TextDeviceNode);
33597270962aSWarner Losh   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *)CreateDeviceNode (
33607270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
33617270962aSWarner Losh                                             MEDIA_PROTOCOL_DP,
33627270962aSWarner Losh                                             (UINT16)sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
33637270962aSWarner Losh                                             );
33647270962aSWarner Losh 
3365*05653fc7SJose Luis Duran   if (Media != NULL) {
33667270962aSWarner Losh     StrToGuid (GuidStr, &Media->Protocol);
3367*05653fc7SJose Luis Duran   }
33687270962aSWarner Losh 
33697270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Media;
33707270962aSWarner Losh }
33717270962aSWarner Losh 
33727270962aSWarner Losh /**
33737270962aSWarner Losh   Converts a text device path node to firmware volume device path structure.
33747270962aSWarner Losh 
33757270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
33767270962aSWarner Losh 
33777270962aSWarner Losh   @return A pointer to the newly-created firmware volume device path structure.
33787270962aSWarner Losh 
33797270962aSWarner Losh **/
33807270962aSWarner Losh static
33817270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFv(IN CHAR16 * TextDeviceNode)33827270962aSWarner Losh DevPathFromTextFv (
33837270962aSWarner Losh   IN CHAR16  *TextDeviceNode
33847270962aSWarner Losh   )
33857270962aSWarner Losh {
33867270962aSWarner Losh   CHAR16                    *GuidStr;
33877270962aSWarner Losh   MEDIA_FW_VOL_DEVICE_PATH  *Fv;
33887270962aSWarner Losh 
33897270962aSWarner Losh   GuidStr = GetNextParamStr (&TextDeviceNode);
33907270962aSWarner Losh   Fv      = (MEDIA_FW_VOL_DEVICE_PATH *)CreateDeviceNode (
33917270962aSWarner Losh                                           MEDIA_DEVICE_PATH,
33927270962aSWarner Losh                                           MEDIA_PIWG_FW_VOL_DP,
33937270962aSWarner Losh                                           (UINT16)sizeof (MEDIA_FW_VOL_DEVICE_PATH)
33947270962aSWarner Losh                                           );
33957270962aSWarner Losh 
3396*05653fc7SJose Luis Duran   if (Fv != NULL) {
33977270962aSWarner Losh     StrToGuid (GuidStr, &Fv->FvName);
3398*05653fc7SJose Luis Duran   }
33997270962aSWarner Losh 
34007270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Fv;
34017270962aSWarner Losh }
34027270962aSWarner Losh 
34037270962aSWarner Losh /**
34047270962aSWarner Losh   Converts a text device path node to firmware file device path structure.
34057270962aSWarner Losh 
34067270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
34077270962aSWarner Losh 
34087270962aSWarner Losh   @return A pointer to the newly-created firmware file device path structure.
34097270962aSWarner Losh 
34107270962aSWarner Losh **/
34117270962aSWarner Losh static
34127270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFvFile(IN CHAR16 * TextDeviceNode)34137270962aSWarner Losh DevPathFromTextFvFile (
34147270962aSWarner Losh   IN CHAR16  *TextDeviceNode
34157270962aSWarner Losh   )
34167270962aSWarner Losh {
34177270962aSWarner Losh   CHAR16                             *GuidStr;
34187270962aSWarner Losh   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  *FvFile;
34197270962aSWarner Losh 
34207270962aSWarner Losh   GuidStr = GetNextParamStr (&TextDeviceNode);
34217270962aSWarner Losh   FvFile  = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)CreateDeviceNode (
34227270962aSWarner Losh                                                    MEDIA_DEVICE_PATH,
34237270962aSWarner Losh                                                    MEDIA_PIWG_FW_FILE_DP,
34247270962aSWarner Losh                                                    (UINT16)sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)
34257270962aSWarner Losh                                                    );
34267270962aSWarner Losh 
3427*05653fc7SJose Luis Duran   if (FvFile != NULL) {
34287270962aSWarner Losh     StrToGuid (GuidStr, &FvFile->FvFileName);
3429*05653fc7SJose Luis Duran   }
34307270962aSWarner Losh 
34317270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)FvFile;
34327270962aSWarner Losh }
34337270962aSWarner Losh 
34347270962aSWarner Losh /**
34357270962aSWarner Losh   Converts a text device path node to text relative offset device path structure.
34367270962aSWarner Losh 
34377270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
34387270962aSWarner Losh 
34397270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
34407270962aSWarner Losh 
34417270962aSWarner Losh **/
34427270962aSWarner Losh static
34437270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRelativeOffsetRange(IN CHAR16 * TextDeviceNode)34447270962aSWarner Losh DevPathFromTextRelativeOffsetRange (
34457270962aSWarner Losh   IN CHAR16  *TextDeviceNode
34467270962aSWarner Losh   )
34477270962aSWarner Losh {
34487270962aSWarner Losh   CHAR16                                   *StartingOffsetStr;
34497270962aSWarner Losh   CHAR16                                   *EndingOffsetStr;
34507270962aSWarner Losh   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH  *Offset;
34517270962aSWarner Losh 
34527270962aSWarner Losh   StartingOffsetStr = GetNextParamStr (&TextDeviceNode);
34537270962aSWarner Losh   EndingOffsetStr   = GetNextParamStr (&TextDeviceNode);
34547270962aSWarner Losh   Offset            = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *)CreateDeviceNode (
34557270962aSWarner Losh                                                                    MEDIA_DEVICE_PATH,
34567270962aSWarner Losh                                                                    MEDIA_RELATIVE_OFFSET_RANGE_DP,
34577270962aSWarner Losh                                                                    (UINT16)sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)
34587270962aSWarner Losh                                                                    );
34597270962aSWarner Losh 
3460*05653fc7SJose Luis Duran   if (Offset != NULL) {
34617270962aSWarner Losh     Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);
34627270962aSWarner Losh     Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);
3463*05653fc7SJose Luis Duran   }
34647270962aSWarner Losh 
34657270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Offset;
34667270962aSWarner Losh }
34677270962aSWarner Losh 
34687270962aSWarner Losh /**
34697270962aSWarner Losh   Converts a text device path node to text ram disk device path structure.
34707270962aSWarner Losh 
34717270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
34727270962aSWarner Losh 
34737270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
34747270962aSWarner Losh 
34757270962aSWarner Losh **/
34767270962aSWarner Losh static
34777270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRamDisk(IN CHAR16 * TextDeviceNode)34787270962aSWarner Losh DevPathFromTextRamDisk (
34797270962aSWarner Losh   IN CHAR16  *TextDeviceNode
34807270962aSWarner Losh   )
34817270962aSWarner Losh {
34827270962aSWarner Losh   CHAR16                      *StartingAddrStr;
34837270962aSWarner Losh   CHAR16                      *EndingAddrStr;
34847270962aSWarner Losh   CHAR16                      *TypeGuidStr;
34857270962aSWarner Losh   CHAR16                      *InstanceStr;
34867270962aSWarner Losh   MEDIA_RAM_DISK_DEVICE_PATH  *RamDisk;
34877270962aSWarner Losh   UINT64                      StartingAddr;
34887270962aSWarner Losh   UINT64                      EndingAddr;
34897270962aSWarner Losh 
34907270962aSWarner Losh   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
34917270962aSWarner Losh   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
34927270962aSWarner Losh   InstanceStr     = GetNextParamStr (&TextDeviceNode);
34937270962aSWarner Losh   TypeGuidStr     = GetNextParamStr (&TextDeviceNode);
34947270962aSWarner Losh   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
34957270962aSWarner Losh                                                     MEDIA_DEVICE_PATH,
34967270962aSWarner Losh                                                     MEDIA_RAM_DISK_DP,
34977270962aSWarner Losh                                                     (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
34987270962aSWarner Losh                                                     );
34997270962aSWarner Losh 
3500*05653fc7SJose Luis Duran   if (RamDisk != NULL) {
35017270962aSWarner Losh     Strtoi64 (StartingAddrStr, &StartingAddr);
35027270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
35037270962aSWarner Losh     Strtoi64 (EndingAddrStr, &EndingAddr);
35047270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
35057270962aSWarner Losh     RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
35067270962aSWarner Losh     StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);
3507*05653fc7SJose Luis Duran   }
35087270962aSWarner Losh 
35097270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
35107270962aSWarner Losh }
35117270962aSWarner Losh 
35127270962aSWarner Losh /**
35137270962aSWarner Losh   Converts a text device path node to text virtual disk device path structure.
35147270962aSWarner Losh 
35157270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
35167270962aSWarner Losh 
35177270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
35187270962aSWarner Losh 
35197270962aSWarner Losh **/
35207270962aSWarner Losh static
35217270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualDisk(IN CHAR16 * TextDeviceNode)35227270962aSWarner Losh DevPathFromTextVirtualDisk (
35237270962aSWarner Losh   IN CHAR16  *TextDeviceNode
35247270962aSWarner Losh   )
35257270962aSWarner Losh {
35267270962aSWarner Losh   CHAR16                      *StartingAddrStr;
35277270962aSWarner Losh   CHAR16                      *EndingAddrStr;
35287270962aSWarner Losh   CHAR16                      *InstanceStr;
35297270962aSWarner Losh   MEDIA_RAM_DISK_DEVICE_PATH  *RamDisk;
35307270962aSWarner Losh   UINT64                      StartingAddr;
35317270962aSWarner Losh   UINT64                      EndingAddr;
35327270962aSWarner Losh 
35337270962aSWarner Losh   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
35347270962aSWarner Losh   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
35357270962aSWarner Losh   InstanceStr     = GetNextParamStr (&TextDeviceNode);
35367270962aSWarner Losh 
35377270962aSWarner Losh   RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
35387270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
35397270962aSWarner Losh                                             MEDIA_RAM_DISK_DP,
35407270962aSWarner Losh                                             (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
35417270962aSWarner Losh                                             );
35427270962aSWarner Losh 
3543*05653fc7SJose Luis Duran   if (RamDisk != NULL) {
35447270962aSWarner Losh     Strtoi64 (StartingAddrStr, &StartingAddr);
35457270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
35467270962aSWarner Losh     Strtoi64 (EndingAddrStr, &EndingAddr);
35477270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
35487270962aSWarner Losh     RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
35497270962aSWarner Losh     CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);
3550*05653fc7SJose Luis Duran   }
35517270962aSWarner Losh 
35527270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
35537270962aSWarner Losh }
35547270962aSWarner Losh 
35557270962aSWarner Losh /**
35567270962aSWarner Losh   Converts a text device path node to text virtual cd device path structure.
35577270962aSWarner Losh 
35587270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
35597270962aSWarner Losh 
35607270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
35617270962aSWarner Losh 
35627270962aSWarner Losh **/
35637270962aSWarner Losh static
35647270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualCd(IN CHAR16 * TextDeviceNode)35657270962aSWarner Losh DevPathFromTextVirtualCd (
35667270962aSWarner Losh   IN CHAR16  *TextDeviceNode
35677270962aSWarner Losh   )
35687270962aSWarner Losh {
35697270962aSWarner Losh   CHAR16                      *StartingAddrStr;
35707270962aSWarner Losh   CHAR16                      *EndingAddrStr;
35717270962aSWarner Losh   CHAR16                      *InstanceStr;
35727270962aSWarner Losh   MEDIA_RAM_DISK_DEVICE_PATH  *RamDisk;
35737270962aSWarner Losh   UINT64                      StartingAddr;
35747270962aSWarner Losh   UINT64                      EndingAddr;
35757270962aSWarner Losh 
35767270962aSWarner Losh   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
35777270962aSWarner Losh   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
35787270962aSWarner Losh   InstanceStr     = GetNextParamStr (&TextDeviceNode);
35797270962aSWarner Losh 
35807270962aSWarner Losh   RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
35817270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
35827270962aSWarner Losh                                             MEDIA_RAM_DISK_DP,
35837270962aSWarner Losh                                             (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
35847270962aSWarner Losh                                             );
35857270962aSWarner Losh 
3586*05653fc7SJose Luis Duran   if (RamDisk != NULL) {
35877270962aSWarner Losh     Strtoi64 (StartingAddrStr, &StartingAddr);
35887270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
35897270962aSWarner Losh     Strtoi64 (EndingAddrStr, &EndingAddr);
35907270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
35917270962aSWarner Losh     RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
35927270962aSWarner Losh     CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);
3593*05653fc7SJose Luis Duran   }
35947270962aSWarner Losh 
35957270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
35967270962aSWarner Losh }
35977270962aSWarner Losh 
35987270962aSWarner Losh /**
35997270962aSWarner Losh   Converts a text device path node to text persistent virtual disk device path structure.
36007270962aSWarner Losh 
36017270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
36027270962aSWarner Losh 
36037270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
36047270962aSWarner Losh 
36057270962aSWarner Losh **/
36067270962aSWarner Losh static
36077270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualDisk(IN CHAR16 * TextDeviceNode)36087270962aSWarner Losh DevPathFromTextPersistentVirtualDisk (
36097270962aSWarner Losh   IN CHAR16  *TextDeviceNode
36107270962aSWarner Losh   )
36117270962aSWarner Losh {
36127270962aSWarner Losh   CHAR16                      *StartingAddrStr;
36137270962aSWarner Losh   CHAR16                      *EndingAddrStr;
36147270962aSWarner Losh   CHAR16                      *InstanceStr;
36157270962aSWarner Losh   MEDIA_RAM_DISK_DEVICE_PATH  *RamDisk;
36167270962aSWarner Losh   UINT64                      StartingAddr;
36177270962aSWarner Losh   UINT64                      EndingAddr;
36187270962aSWarner Losh 
36197270962aSWarner Losh   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
36207270962aSWarner Losh   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
36217270962aSWarner Losh   InstanceStr     = GetNextParamStr (&TextDeviceNode);
36227270962aSWarner Losh 
36237270962aSWarner Losh   RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
36247270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
36257270962aSWarner Losh                                             MEDIA_RAM_DISK_DP,
36267270962aSWarner Losh                                             (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
36277270962aSWarner Losh                                             );
36287270962aSWarner Losh 
3629*05653fc7SJose Luis Duran   if (RamDisk != NULL) {
36307270962aSWarner Losh     Strtoi64 (StartingAddrStr, &StartingAddr);
36317270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
36327270962aSWarner Losh     Strtoi64 (EndingAddrStr, &EndingAddr);
36337270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
36347270962aSWarner Losh     RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
36357270962aSWarner Losh     CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);
3636*05653fc7SJose Luis Duran   }
36377270962aSWarner Losh 
36387270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
36397270962aSWarner Losh }
36407270962aSWarner Losh 
36417270962aSWarner Losh /**
36427270962aSWarner Losh   Converts a text device path node to text persistent virtual cd device path structure.
36437270962aSWarner Losh 
36447270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
36457270962aSWarner Losh 
36467270962aSWarner Losh   @return A pointer to the newly-created Text device path structure.
36477270962aSWarner Losh 
36487270962aSWarner Losh **/
36497270962aSWarner Losh static
36507270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualCd(IN CHAR16 * TextDeviceNode)36517270962aSWarner Losh DevPathFromTextPersistentVirtualCd (
36527270962aSWarner Losh   IN CHAR16  *TextDeviceNode
36537270962aSWarner Losh   )
36547270962aSWarner Losh {
36557270962aSWarner Losh   CHAR16                      *StartingAddrStr;
36567270962aSWarner Losh   CHAR16                      *EndingAddrStr;
36577270962aSWarner Losh   CHAR16                      *InstanceStr;
36587270962aSWarner Losh   MEDIA_RAM_DISK_DEVICE_PATH  *RamDisk;
36597270962aSWarner Losh   UINT64                      StartingAddr;
36607270962aSWarner Losh   UINT64                      EndingAddr;
36617270962aSWarner Losh 
36627270962aSWarner Losh   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
36637270962aSWarner Losh   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
36647270962aSWarner Losh   InstanceStr     = GetNextParamStr (&TextDeviceNode);
36657270962aSWarner Losh 
36667270962aSWarner Losh   RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
36677270962aSWarner Losh                                             MEDIA_DEVICE_PATH,
36687270962aSWarner Losh                                             MEDIA_RAM_DISK_DP,
36697270962aSWarner Losh                                             (UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
36707270962aSWarner Losh                                             );
36717270962aSWarner Losh 
3672*05653fc7SJose Luis Duran   if (RamDisk != NULL) {
36737270962aSWarner Losh     Strtoi64 (StartingAddrStr, &StartingAddr);
36747270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
36757270962aSWarner Losh     Strtoi64 (EndingAddrStr, &EndingAddr);
36767270962aSWarner Losh     WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
36777270962aSWarner Losh     RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
36787270962aSWarner Losh     CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);
3679*05653fc7SJose Luis Duran   }
36807270962aSWarner Losh 
36817270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
36827270962aSWarner Losh }
36837270962aSWarner Losh 
36847270962aSWarner Losh /**
36857270962aSWarner Losh   Converts a BBS text device path node to BBS device path structure.
36867270962aSWarner Losh 
36877270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
36887270962aSWarner Losh 
36897270962aSWarner Losh   @return A pointer to BBS device path structure.
36907270962aSWarner Losh 
36917270962aSWarner Losh **/
36927270962aSWarner Losh static
36937270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBbsPath(IN CHAR16 * TextDeviceNode)36947270962aSWarner Losh DevPathFromTextBbsPath (
36957270962aSWarner Losh   IN CHAR16  *TextDeviceNode
36967270962aSWarner Losh   )
36977270962aSWarner Losh {
36987270962aSWarner Losh   return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);
36997270962aSWarner Losh }
37007270962aSWarner Losh 
37017270962aSWarner Losh /**
37027270962aSWarner Losh   Converts a text device path node to BIOS Boot Specification device path structure.
37037270962aSWarner Losh 
37047270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
37057270962aSWarner Losh 
37067270962aSWarner Losh   @return A pointer to the newly-created BIOS Boot Specification device path structure.
37077270962aSWarner Losh 
37087270962aSWarner Losh **/
37097270962aSWarner Losh static
37107270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBBS(IN CHAR16 * TextDeviceNode)37117270962aSWarner Losh DevPathFromTextBBS (
37127270962aSWarner Losh   IN CHAR16  *TextDeviceNode
37137270962aSWarner Losh   )
37147270962aSWarner Losh {
37157270962aSWarner Losh   CHAR16               *TypeStr;
37167270962aSWarner Losh   CHAR16               *IdStr;
37177270962aSWarner Losh   CHAR16               *FlagsStr;
37187270962aSWarner Losh   CHAR8                *AsciiStr;
37197270962aSWarner Losh   BBS_BBS_DEVICE_PATH  *Bbs;
37207270962aSWarner Losh 
37217270962aSWarner Losh   TypeStr  = GetNextParamStr (&TextDeviceNode);
37227270962aSWarner Losh   IdStr    = GetNextParamStr (&TextDeviceNode);
37237270962aSWarner Losh   FlagsStr = GetNextParamStr (&TextDeviceNode);
37247270962aSWarner Losh   Bbs      = (BBS_BBS_DEVICE_PATH *)CreateDeviceNode (
37257270962aSWarner Losh                                       BBS_DEVICE_PATH,
37267270962aSWarner Losh                                       BBS_BBS_DP,
37277270962aSWarner Losh                                       (UINT16)(sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))
37287270962aSWarner Losh                                       );
37297270962aSWarner Losh 
3730*05653fc7SJose Luis Duran   if (Bbs == NULL) {
3731*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Bbs;
3732*05653fc7SJose Luis Duran   }
3733*05653fc7SJose Luis Duran 
37347270962aSWarner Losh   if (StrCmp (TypeStr, "Floppy") == 0) {
37357270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_FLOPPY;
37367270962aSWarner Losh   } else if (StrCmp (TypeStr, "HD") == 0) {
37377270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
37387270962aSWarner Losh   } else if (StrCmp (TypeStr, "CDROM") == 0) {
37397270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_CDROM;
37407270962aSWarner Losh   } else if (StrCmp (TypeStr, "PCMCIA") == 0) {
37417270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_PCMCIA;
37427270962aSWarner Losh   } else if (StrCmp (TypeStr, "USB") == 0) {
37437270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_USB;
37447270962aSWarner Losh   } else if (StrCmp (TypeStr, "Network") == 0) {
37457270962aSWarner Losh     Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
37467270962aSWarner Losh   } else {
37477270962aSWarner Losh     Bbs->DeviceType = (UINT16)Strtoi (TypeStr);
37487270962aSWarner Losh   }
37497270962aSWarner Losh 
37507270962aSWarner Losh   AsciiStr = Bbs->String;
37517270962aSWarner Losh   StrToAscii (IdStr, &AsciiStr);
37527270962aSWarner Losh 
37537270962aSWarner Losh   Bbs->StatusFlag = (UINT16)Strtoi (FlagsStr);
37547270962aSWarner Losh 
37557270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Bbs;
37567270962aSWarner Losh }
37577270962aSWarner Losh 
37587270962aSWarner Losh /**
37597270962aSWarner Losh   Converts a text device path node to SATA device path structure.
37607270962aSWarner Losh 
37617270962aSWarner Losh   @param TextDeviceNode  The input Text device path node.
37627270962aSWarner Losh 
37637270962aSWarner Losh   @return A pointer to the newly-created SATA device path structure.
37647270962aSWarner Losh 
37657270962aSWarner Losh **/
37667270962aSWarner Losh static
37677270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSata(IN CHAR16 * TextDeviceNode)37687270962aSWarner Losh DevPathFromTextSata (
37697270962aSWarner Losh   IN CHAR16  *TextDeviceNode
37707270962aSWarner Losh   )
37717270962aSWarner Losh {
37727270962aSWarner Losh   SATA_DEVICE_PATH  *Sata;
37737270962aSWarner Losh   CHAR16            *Param1;
37747270962aSWarner Losh   CHAR16            *Param2;
37757270962aSWarner Losh   CHAR16            *Param3;
37767270962aSWarner Losh 
37777270962aSWarner Losh   Param1 = GetNextParamStr (&TextDeviceNode);
37787270962aSWarner Losh   Param2 = GetNextParamStr (&TextDeviceNode);
37797270962aSWarner Losh   Param3 = GetNextParamStr (&TextDeviceNode);
37807270962aSWarner Losh 
37817270962aSWarner Losh   Sata = (SATA_DEVICE_PATH *)CreateDeviceNode (
37827270962aSWarner Losh                                MESSAGING_DEVICE_PATH,
37837270962aSWarner Losh                                MSG_SATA_DP,
37847270962aSWarner Losh                                (UINT16)sizeof (SATA_DEVICE_PATH)
37857270962aSWarner Losh                                );
3786*05653fc7SJose Luis Duran 
3787*05653fc7SJose Luis Duran   if (Sata == NULL) {
3788*05653fc7SJose Luis Duran     return (EFI_DEVICE_PATH_PROTOCOL *)Sata;
3789*05653fc7SJose Luis Duran   }
3790*05653fc7SJose Luis Duran 
37917270962aSWarner Losh   Sata->HBAPortNumber = (UINT16)Strtoi (Param1);
37924e83ac7dSJose Luis Duran 
37934e83ac7dSJose Luis Duran   //
37944e83ac7dSJose Luis Duran   // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF
37954e83ac7dSJose Luis Duran   //
37964e83ac7dSJose Luis Duran   if (*Param2 == '\0' ) {
37974e83ac7dSJose Luis Duran     Sata->PortMultiplierPortNumber = 0xFFFF;
37984e83ac7dSJose Luis Duran   } else {
37997270962aSWarner Losh     Sata->PortMultiplierPortNumber = (UINT16)Strtoi (Param2);
38004e83ac7dSJose Luis Duran   }
38015754f582SJose Luis Duran 
38027270962aSWarner Losh   Sata->Lun = (UINT16)Strtoi (Param3);
38037270962aSWarner Losh 
38047270962aSWarner Losh   return (EFI_DEVICE_PATH_PROTOCOL *)Sata;
38057270962aSWarner Losh }
38067270962aSWarner Losh 
38077270962aSWarner Losh GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE  mUefiDevicePathLibDevPathFromTextTable[] = {
38087270962aSWarner Losh   { "Path",                    DevPathFromTextPath                    },
38097270962aSWarner Losh 
38107270962aSWarner Losh   { "HardwarePath",            DevPathFromTextHardwarePath            },
38117270962aSWarner Losh   { "Pci",                     DevPathFromTextPci                     },
38127270962aSWarner Losh   { "PcCard",                  DevPathFromTextPcCard                  },
38137270962aSWarner Losh   { "MemoryMapped",            DevPathFromTextMemoryMapped            },
38147270962aSWarner Losh   { "VenHw",                   DevPathFromTextVenHw                   },
38157270962aSWarner Losh   { "Ctrl",                    DevPathFromTextCtrl                    },
38167270962aSWarner Losh   { "BMC",                     DevPathFromTextBmc                     },
38177270962aSWarner Losh 
38187270962aSWarner Losh   { "AcpiPath",                DevPathFromTextAcpiPath                },
38197270962aSWarner Losh   { "Acpi",                    DevPathFromTextAcpi                    },
38207270962aSWarner Losh   { "PciRoot",                 DevPathFromTextPciRoot                 },
38217270962aSWarner Losh   { "PcieRoot",                DevPathFromTextPcieRoot                },
38227270962aSWarner Losh   { "Floppy",                  DevPathFromTextFloppy                  },
38237270962aSWarner Losh   { "Keyboard",                DevPathFromTextKeyboard                },
38247270962aSWarner Losh   { "Serial",                  DevPathFromTextSerial                  },
38257270962aSWarner Losh   { "ParallelPort",            DevPathFromTextParallelPort            },
38267270962aSWarner Losh   { "AcpiEx",                  DevPathFromTextAcpiEx                  },
38277270962aSWarner Losh   { "AcpiExp",                 DevPathFromTextAcpiExp                 },
38287270962aSWarner Losh   { "AcpiAdr",                 DevPathFromTextAcpiAdr                 },
38297270962aSWarner Losh 
38307270962aSWarner Losh   { "Msg",                     DevPathFromTextMsg                     },
38317270962aSWarner Losh   { "Ata",                     DevPathFromTextAta                     },
38327270962aSWarner Losh   { "Scsi",                    DevPathFromTextScsi                    },
38337270962aSWarner Losh   { "Fibre",                   DevPathFromTextFibre                   },
38347270962aSWarner Losh   { "FibreEx",                 DevPathFromTextFibreEx                 },
38357270962aSWarner Losh   { "I1394",                   DevPathFromText1394                    },
38367270962aSWarner Losh   { "USB",                     DevPathFromTextUsb                     },
38377270962aSWarner Losh   { "I2O",                     DevPathFromTextI2O                     },
38387270962aSWarner Losh   { "Infiniband",              DevPathFromTextInfiniband              },
38397270962aSWarner Losh   { "VenMsg",                  DevPathFromTextVenMsg                  },
38407270962aSWarner Losh   { "VenPcAnsi",               DevPathFromTextVenPcAnsi               },
38417270962aSWarner Losh   { "VenVt100",                DevPathFromTextVenVt100                },
38427270962aSWarner Losh   { "VenVt100Plus",            DevPathFromTextVenVt100Plus            },
38437270962aSWarner Losh   { "VenUtf8",                 DevPathFromTextVenUtf8                 },
38447270962aSWarner Losh   { "UartFlowCtrl",            DevPathFromTextUartFlowCtrl            },
38457270962aSWarner Losh   { "SAS",                     DevPathFromTextSAS                     },
38467270962aSWarner Losh   { "SasEx",                   DevPathFromTextSasEx                   },
38477270962aSWarner Losh   { "NVMe",                    DevPathFromTextNVMe                    },
38487270962aSWarner Losh   { "UFS",                     DevPathFromTextUfs                     },
38497270962aSWarner Losh   { "SD",                      DevPathFromTextSd                      },
38507270962aSWarner Losh   { "eMMC",                    DevPathFromTextEmmc                    },
38517270962aSWarner Losh   { "DebugPort",               DevPathFromTextDebugPort               },
38527270962aSWarner Losh   { "MAC",                     DevPathFromTextMAC                     },
38537270962aSWarner Losh   { "IPv4",                    DevPathFromTextIPv4                    },
38547270962aSWarner Losh   { "IPv6",                    DevPathFromTextIPv6                    },
38557270962aSWarner Losh   { "Uart",                    DevPathFromTextUart                    },
38567270962aSWarner Losh   { "UsbClass",                DevPathFromTextUsbClass                },
38577270962aSWarner Losh   { "UsbAudio",                DevPathFromTextUsbAudio                },
38587270962aSWarner Losh   { "UsbCDCControl",           DevPathFromTextUsbCDCControl           },
38597270962aSWarner Losh   { "UsbHID",                  DevPathFromTextUsbHID                  },
38607270962aSWarner Losh   { "UsbImage",                DevPathFromTextUsbImage                },
38617270962aSWarner Losh   { "UsbPrinter",              DevPathFromTextUsbPrinter              },
38627270962aSWarner Losh   { "UsbMassStorage",          DevPathFromTextUsbMassStorage          },
38637270962aSWarner Losh   { "UsbHub",                  DevPathFromTextUsbHub                  },
38647270962aSWarner Losh   { "UsbCDCData",              DevPathFromTextUsbCDCData              },
38657270962aSWarner Losh   { "UsbSmartCard",            DevPathFromTextUsbSmartCard            },
38667270962aSWarner Losh   { "UsbVideo",                DevPathFromTextUsbVideo                },
38677270962aSWarner Losh   { "UsbDiagnostic",           DevPathFromTextUsbDiagnostic           },
38687270962aSWarner Losh   { "UsbWireless",             DevPathFromTextUsbWireless             },
38697270962aSWarner Losh   { "UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },
38707270962aSWarner Losh   { "UsbIrdaBridge",           DevPathFromTextUsbIrdaBridge           },
38717270962aSWarner Losh   { "UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
38727270962aSWarner Losh   { "UsbWwid",                 DevPathFromTextUsbWwid                 },
38737270962aSWarner Losh   { "Unit",                    DevPathFromTextUnit                    },
38747270962aSWarner Losh   { "iSCSI",                   DevPathFromTextiSCSI                   },
38757270962aSWarner Losh   { "Vlan",                    DevPathFromTextVlan                    },
3876d9d1a1e7SJose Luis Duran   { "Dns",                     DevPathFromTextDns                     },
38777270962aSWarner Losh   { "Uri",                     DevPathFromTextUri                     },
38787270962aSWarner Losh   { "Bluetooth",               DevPathFromTextBluetooth               },
38797270962aSWarner Losh   { "Wi-Fi",                   DevPathFromTextWiFi                    },
3880e8fc7f11SJose Luis Duran   { "BluetoothLE",             DevPathFromTextBluetoothLE             },
38817270962aSWarner Losh   { "MediaPath",               DevPathFromTextMediaPath               },
38827270962aSWarner Losh   { "HD",                      DevPathFromTextHD                      },
38837270962aSWarner Losh   { "CDROM",                   DevPathFromTextCDROM                   },
38847270962aSWarner Losh   { "VenMedia",                DevPathFromTextVenMedia                },
38857270962aSWarner Losh   { "Media",                   DevPathFromTextMedia                   },
38867270962aSWarner Losh   { "Fv",                      DevPathFromTextFv                      },
38877270962aSWarner Losh   { "FvFile",                  DevPathFromTextFvFile                  },
3888ae3adc06SWarner Losh   { "File",                    DevPathFromTextFilePath                },
38897270962aSWarner Losh   { "Offset",                  DevPathFromTextRelativeOffsetRange     },
38907270962aSWarner Losh   { "RamDisk",                 DevPathFromTextRamDisk                 },
38917270962aSWarner Losh   { "VirtualDisk",             DevPathFromTextVirtualDisk             },
38927270962aSWarner Losh   { "VirtualCD",               DevPathFromTextVirtualCd               },
38937270962aSWarner Losh   { "PersistentVirtualDisk",   DevPathFromTextPersistentVirtualDisk   },
38947270962aSWarner Losh   { "PersistentVirtualCD",     DevPathFromTextPersistentVirtualCd     },
38957270962aSWarner Losh 
38967270962aSWarner Losh   { "BbsPath",                 DevPathFromTextBbsPath                 },
38977270962aSWarner Losh   { "BBS",                     DevPathFromTextBBS                     },
38987270962aSWarner Losh   { "Sata",                    DevPathFromTextSata                    },
38997270962aSWarner Losh   { NULL,                       NULL                                   }
39007270962aSWarner Losh };
39017270962aSWarner Losh 
39027270962aSWarner Losh /**
39037270962aSWarner Losh   Convert text to the binary representation of a device node.
39047270962aSWarner Losh 
39057270962aSWarner Losh   @param TextDeviceNode  TextDeviceNode points to the text representation of a device
39067270962aSWarner Losh                          node. Conversion starts with the first character and continues
39077270962aSWarner Losh                          until the first non-device node character.
39087270962aSWarner Losh 
39097270962aSWarner Losh   @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
39107270962aSWarner Losh           insufficient memory or text unsupported.
39117270962aSWarner Losh 
39127270962aSWarner Losh **/
39137270962aSWarner Losh static
39147270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
39157270962aSWarner Losh EFIAPI
UefiDevicePathLibConvertTextToDeviceNode(IN CONST CHAR16 * TextDeviceNode)39167270962aSWarner Losh UefiDevicePathLibConvertTextToDeviceNode (
39177270962aSWarner Losh   IN CONST CHAR16  *TextDeviceNode
39187270962aSWarner Losh   )
39197270962aSWarner Losh {
39207270962aSWarner Losh   DEVICE_PATH_FROM_TEXT     FromText;
39217270962aSWarner Losh   CHAR16                    *ParamStr;
39227270962aSWarner Losh   EFI_DEVICE_PATH_PROTOCOL  *DeviceNode;
39237270962aSWarner Losh   CHAR16                    *DeviceNodeStr;
39247270962aSWarner Losh   UINTN                     Index;
39257270962aSWarner Losh 
39267270962aSWarner Losh   if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
39277270962aSWarner Losh     return NULL;
39287270962aSWarner Losh   }
39297270962aSWarner Losh 
39307270962aSWarner Losh   ParamStr      = NULL;
39317270962aSWarner Losh   FromText      = NULL;
39327270962aSWarner Losh   DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
39337270962aSWarner Losh   ASSERT (DeviceNodeStr != NULL);
39347270962aSWarner Losh 
39357270962aSWarner Losh   for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {
39367270962aSWarner Losh     ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);
39377270962aSWarner Losh     if (ParamStr != NULL) {
39387270962aSWarner Losh       FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;
39397270962aSWarner Losh       break;
39407270962aSWarner Losh     }
39417270962aSWarner Losh   }
39427270962aSWarner Losh 
39437270962aSWarner Losh   if (FromText == NULL) {
39447270962aSWarner Losh     //
39457270962aSWarner Losh     // A file path
39467270962aSWarner Losh     //
39477270962aSWarner Losh     FromText   = DevPathFromTextFilePath;
39487270962aSWarner Losh     DeviceNode = FromText (DeviceNodeStr);
39497270962aSWarner Losh   } else {
39507270962aSWarner Losh     DeviceNode = FromText (ParamStr);
39517270962aSWarner Losh     FreePool (ParamStr);
39527270962aSWarner Losh   }
39537270962aSWarner Losh 
39547270962aSWarner Losh   FreePool (DeviceNodeStr);
39557270962aSWarner Losh 
39567270962aSWarner Losh   return DeviceNode;
39577270962aSWarner Losh }
39587270962aSWarner Losh 
39597270962aSWarner Losh /**
39607270962aSWarner Losh   Convert text to the binary representation of a device path.
39617270962aSWarner Losh 
39627270962aSWarner Losh 
39637270962aSWarner Losh   @param TextDevicePath  TextDevicePath points to the text representation of a device
39647270962aSWarner Losh                          path. Conversion starts with the first character and continues
39657270962aSWarner Losh                          until the first non-device node character.
39667270962aSWarner Losh 
39677270962aSWarner Losh   @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
39687270962aSWarner Losh           there was insufficient memory.
39697270962aSWarner Losh 
39707270962aSWarner Losh **/
39717270962aSWarner Losh static
39727270962aSWarner Losh EFI_DEVICE_PATH_PROTOCOL *
39737270962aSWarner Losh EFIAPI
UefiDevicePathLibConvertTextToDevicePath(IN CONST CHAR16 * TextDevicePath)39747270962aSWarner Losh UefiDevicePathLibConvertTextToDevicePath (
39757270962aSWarner Losh   IN CONST CHAR16  *TextDevicePath
39767270962aSWarner Losh   )
39777270962aSWarner Losh {
39787270962aSWarner Losh   EFI_DEVICE_PATH_PROTOCOL  *DeviceNode;
39797270962aSWarner Losh   EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;
39807270962aSWarner Losh   CHAR16                    *DevicePathStr;
39817270962aSWarner Losh   CHAR16                    *Str;
39827270962aSWarner Losh   CHAR16                    *DeviceNodeStr;
39837270962aSWarner Losh   BOOLEAN                   IsInstanceEnd;
39847270962aSWarner Losh   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
39857270962aSWarner Losh 
39867270962aSWarner Losh   if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
39877270962aSWarner Losh     return NULL;
39887270962aSWarner Losh   }
39897270962aSWarner Losh 
39907270962aSWarner Losh   DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
3991*05653fc7SJose Luis Duran 
3992*05653fc7SJose Luis Duran   if (DevicePath == NULL) {
39937270962aSWarner Losh     ASSERT (DevicePath != NULL);
3994*05653fc7SJose Luis Duran     return NULL;
3995*05653fc7SJose Luis Duran   }
3996*05653fc7SJose Luis Duran 
39977270962aSWarner Losh   SetDevicePathEndNode (DevicePath);
39987270962aSWarner Losh 
39997270962aSWarner Losh   DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);
40007270962aSWarner Losh 
4001*05653fc7SJose Luis Duran   if (DevicePathStr == NULL) {
4002*05653fc7SJose Luis Duran     return NULL;
4003*05653fc7SJose Luis Duran   }
4004*05653fc7SJose Luis Duran 
40057270962aSWarner Losh   Str = DevicePathStr;
40067270962aSWarner Losh   while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
40077270962aSWarner Losh     DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);
40087270962aSWarner Losh 
40097270962aSWarner Losh     NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
4010*05653fc7SJose Luis Duran     if (DevicePath != NULL) {
40117270962aSWarner Losh       FreePool (DevicePath);
4012*05653fc7SJose Luis Duran     }
4013*05653fc7SJose Luis Duran 
4014*05653fc7SJose Luis Duran     if (DeviceNode != NULL) {
40157270962aSWarner Losh       FreePool (DeviceNode);
4016*05653fc7SJose Luis Duran     }
4017*05653fc7SJose Luis Duran 
40187270962aSWarner Losh     DevicePath = NewDevicePath;
40197270962aSWarner Losh 
40207270962aSWarner Losh     if (IsInstanceEnd) {
40217270962aSWarner Losh       DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
4022*05653fc7SJose Luis Duran       if (DeviceNode == NULL) {
40237270962aSWarner Losh         ASSERT (DeviceNode != NULL);
4024*05653fc7SJose Luis Duran         return NULL;
4025*05653fc7SJose Luis Duran       }
4026*05653fc7SJose Luis Duran 
40277270962aSWarner Losh       SetDevicePathEndNode (DeviceNode);
40287270962aSWarner Losh       DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
40297270962aSWarner Losh 
40307270962aSWarner Losh       NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
4031*05653fc7SJose Luis Duran       if (DevicePath != NULL) {
40327270962aSWarner Losh         FreePool (DevicePath);
4033*05653fc7SJose Luis Duran       }
4034*05653fc7SJose Luis Duran 
4035*05653fc7SJose Luis Duran       if (DeviceNode != NULL) {
40367270962aSWarner Losh         FreePool (DeviceNode);
4037*05653fc7SJose Luis Duran       }
4038*05653fc7SJose Luis Duran 
40397270962aSWarner Losh       DevicePath = NewDevicePath;
40407270962aSWarner Losh     }
40417270962aSWarner Losh   }
40427270962aSWarner Losh 
40437270962aSWarner Losh   FreePool (DevicePathStr);
40447270962aSWarner Losh   return DevicePath;
40457270962aSWarner Losh }
40467270962aSWarner Losh 
40477270962aSWarner Losh ssize_t
efidp_parse_device_path(char * path,efidp out,size_t max)40487270962aSWarner Losh efidp_parse_device_path(char *path, efidp out, size_t max)
40497270962aSWarner Losh {
40507270962aSWarner Losh 	EFI_DEVICE_PATH_PROTOCOL *dp;
40517270962aSWarner Losh 	UINTN len;
40527270962aSWarner Losh 
40537270962aSWarner Losh 	dp = UefiDevicePathLibConvertTextToDevicePath (path);
40547270962aSWarner Losh 	if (dp == NULL)
40557270962aSWarner Losh 		return -1;
40567270962aSWarner Losh 	len = GetDevicePathSize(dp);
40577270962aSWarner Losh 	if (len > max) {
40587270962aSWarner Losh 		free(dp);
40597270962aSWarner Losh 		return -1;
40607270962aSWarner Losh 	}
40617270962aSWarner Losh 	memcpy(out, dp, len);
40627270962aSWarner Losh 	free(dp);
40637270962aSWarner Losh 
40647270962aSWarner Losh 	return len;
40657270962aSWarner Losh }
4066