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