xref: /dragonfly/lib/libefivar/efivar-dp-parse.c (revision 4661c169)
1*4661c169SSascha Wildner /*-
2*4661c169SSascha Wildner  * Copyright (c) 2017 Netflix, Inc.
3*4661c169SSascha Wildner  *
4*4661c169SSascha Wildner  * Redistribution and use in source and binary forms, with or without
5*4661c169SSascha Wildner  * modification, are permitted provided that the following conditions
6*4661c169SSascha Wildner  * are met:
7*4661c169SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
8*4661c169SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
9*4661c169SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
10*4661c169SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
11*4661c169SSascha Wildner  *    documentation and/or other materials provided with the distribution.
12*4661c169SSascha Wildner  *
13*4661c169SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14*4661c169SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15*4661c169SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16*4661c169SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17*4661c169SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18*4661c169SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19*4661c169SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20*4661c169SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21*4661c169SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22*4661c169SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23*4661c169SSascha Wildner  * SUCH DAMAGE.
24*4661c169SSascha Wildner  *
25*4661c169SSascha Wildner  * $FreeBSD: head/lib/libefivar/efivar-dp-parse.c 343755 2019-02-04 21:28:25Z imp $
26*4661c169SSascha Wildner  */
27*4661c169SSascha Wildner 
28*4661c169SSascha Wildner /*
29*4661c169SSascha Wildner  * Routines to format EFI_DEVICE_PATHs from the UEFI standard. Much of
30*4661c169SSascha Wildner  * this file is taken from EDK2 and rototilled.
31*4661c169SSascha Wildner  */
32*4661c169SSascha Wildner 
33*4661c169SSascha Wildner #include <ctype.h>
34*4661c169SSascha Wildner #include <efivar.h>
35*4661c169SSascha Wildner #include <stdio.h>
36*4661c169SSascha Wildner #include <string.h>
37*4661c169SSascha Wildner #include <wchar.h>
38*4661c169SSascha Wildner 
39*4661c169SSascha Wildner #include "libefivar_int.h"
40*4661c169SSascha Wildner 
41*4661c169SSascha Wildner #include "efi-osdep.h"
42*4661c169SSascha Wildner #include "efivar-dp.h"
43*4661c169SSascha Wildner 
44*4661c169SSascha Wildner #include "uefi-dplib.h"
45*4661c169SSascha Wildner 
46*4661c169SSascha Wildner /* XXX STUBS -- this stuff doesn't work yet */
47*4661c169SSascha Wildner #define StrToIpv4Address(str, unk, ipv4ptr, unk2)
48*4661c169SSascha Wildner #define StrToIpv6Address(str, unk, ipv6ptr, unk2)
49*4661c169SSascha Wildner 
50*4661c169SSascha Wildner /*
51*4661c169SSascha Wildner  * OK. Now this is evil. Can't typedef it again. Sure beats changing them all.
52*4661c169SSascha Wildner  * Since we're doing it all as narrow characters since wchar_t can't be used on
53*4661c169SSascha Wildner  * FreeBSD and CHAR16 strings generally aren't a good fit. Since this parsing
54*4661c169SSascha Wildner  * doesn't need Unicode for anything, this works out well.
55*4661c169SSascha Wildner  */
56*4661c169SSascha Wildner #define CHAR16 char
57*4661c169SSascha Wildner 
58*4661c169SSascha Wildner /*
59*4661c169SSascha Wildner  * Taken from MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
60*4661c169SSascha Wildner  * hash a11928f3310518ab1c6fd34e8d0fdbb72de9602c 2017-Mar-01
61*4661c169SSascha Wildner  */
62*4661c169SSascha Wildner 
63*4661c169SSascha Wildner /** @file
64*4661c169SSascha Wildner   DevicePathFromText protocol as defined in the UEFI 2.0 specification.
65*4661c169SSascha Wildner 
66*4661c169SSascha Wildner Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>
67*4661c169SSascha Wildner This program and the accompanying materials
68*4661c169SSascha Wildner are licensed and made available under the terms and conditions of the BSD License
69*4661c169SSascha Wildner which accompanies this distribution.  The full text of the license may be found at
70*4661c169SSascha Wildner http://opensource.org/licenses/bsd-license.php
71*4661c169SSascha Wildner 
72*4661c169SSascha Wildner THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
73*4661c169SSascha Wildner WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
74*4661c169SSascha Wildner 
75*4661c169SSascha Wildner **/
76*4661c169SSascha Wildner 
77*4661c169SSascha Wildner // #include "UefiDevicePathLib.h"
78*4661c169SSascha Wildner 
79*4661c169SSascha Wildner /**
80*4661c169SSascha Wildner 
81*4661c169SSascha Wildner   Duplicates a string.
82*4661c169SSascha Wildner 
83*4661c169SSascha Wildner   @param  Src  Source string.
84*4661c169SSascha Wildner 
85*4661c169SSascha Wildner   @return The duplicated string.
86*4661c169SSascha Wildner 
87*4661c169SSascha Wildner **/
88*4661c169SSascha Wildner static
89*4661c169SSascha Wildner CHAR16 *
UefiDevicePathLibStrDuplicate(IN CONST CHAR16 * Src)90*4661c169SSascha Wildner UefiDevicePathLibStrDuplicate (
91*4661c169SSascha Wildner   IN CONST CHAR16  *Src
92*4661c169SSascha Wildner   )
93*4661c169SSascha Wildner {
94*4661c169SSascha Wildner   return AllocateCopyPool (StrSize (Src), Src);
95*4661c169SSascha Wildner }
96*4661c169SSascha Wildner 
97*4661c169SSascha Wildner /**
98*4661c169SSascha Wildner 
99*4661c169SSascha Wildner   Get parameter in a pair of parentheses follow the given node name.
100*4661c169SSascha Wildner   For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
101*4661c169SSascha Wildner 
102*4661c169SSascha Wildner   @param  Str      Device Path Text.
103*4661c169SSascha Wildner   @param  NodeName Name of the node.
104*4661c169SSascha Wildner 
105*4661c169SSascha Wildner   @return Parameter text for the node.
106*4661c169SSascha Wildner 
107*4661c169SSascha Wildner **/
108*4661c169SSascha Wildner static
109*4661c169SSascha Wildner CHAR16 *
GetParamByNodeName(IN CHAR16 * Str,IN const CHAR16 * NodeName)110*4661c169SSascha Wildner GetParamByNodeName (
111*4661c169SSascha Wildner   IN CHAR16 *Str,
112*4661c169SSascha Wildner   IN const CHAR16 *NodeName
113*4661c169SSascha Wildner   )
114*4661c169SSascha Wildner {
115*4661c169SSascha Wildner   CHAR16  *ParamStr;
116*4661c169SSascha Wildner   CHAR16  *StrPointer;
117*4661c169SSascha Wildner   UINTN   NodeNameLength;
118*4661c169SSascha Wildner   UINTN   ParameterLength;
119*4661c169SSascha Wildner 
120*4661c169SSascha Wildner   //
121*4661c169SSascha Wildner   // Check whether the node name matchs
122*4661c169SSascha Wildner   //
123*4661c169SSascha Wildner   NodeNameLength = StrLen (NodeName);
124*4661c169SSascha Wildner   if (StrnCmp (Str, NodeName, NodeNameLength) != 0) {
125*4661c169SSascha Wildner     return NULL;
126*4661c169SSascha Wildner   }
127*4661c169SSascha Wildner 
128*4661c169SSascha Wildner   ParamStr = Str + NodeNameLength;
129*4661c169SSascha Wildner   if (!IS_LEFT_PARENTH (*ParamStr)) {
130*4661c169SSascha Wildner     return NULL;
131*4661c169SSascha Wildner   }
132*4661c169SSascha Wildner 
133*4661c169SSascha Wildner   //
134*4661c169SSascha Wildner   // Skip the found '(' and find first occurrence of ')'
135*4661c169SSascha Wildner   //
136*4661c169SSascha Wildner   ParamStr++;
137*4661c169SSascha Wildner   ParameterLength = 0;
138*4661c169SSascha Wildner   StrPointer = ParamStr;
139*4661c169SSascha Wildner   while (!IS_NULL (*StrPointer)) {
140*4661c169SSascha Wildner     if (IS_RIGHT_PARENTH (*StrPointer)) {
141*4661c169SSascha Wildner       break;
142*4661c169SSascha Wildner     }
143*4661c169SSascha Wildner     StrPointer++;
144*4661c169SSascha Wildner     ParameterLength++;
145*4661c169SSascha Wildner   }
146*4661c169SSascha Wildner   if (IS_NULL (*StrPointer)) {
147*4661c169SSascha Wildner     //
148*4661c169SSascha Wildner     // ')' not found
149*4661c169SSascha Wildner     //
150*4661c169SSascha Wildner     return NULL;
151*4661c169SSascha Wildner   }
152*4661c169SSascha Wildner 
153*4661c169SSascha Wildner   ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
154*4661c169SSascha Wildner   if (ParamStr == NULL) {
155*4661c169SSascha Wildner     return NULL;
156*4661c169SSascha Wildner   }
157*4661c169SSascha Wildner   //
158*4661c169SSascha Wildner   // Terminate the parameter string
159*4661c169SSascha Wildner   //
160*4661c169SSascha Wildner   ParamStr[ParameterLength] = '\0';
161*4661c169SSascha Wildner 
162*4661c169SSascha Wildner   return ParamStr;
163*4661c169SSascha Wildner }
164*4661c169SSascha Wildner 
165*4661c169SSascha Wildner /**
166*4661c169SSascha Wildner   Gets current sub-string from a string list, before return
167*4661c169SSascha Wildner   the list header is moved to next sub-string. The sub-string is separated
168*4661c169SSascha Wildner   by the specified character. For example, the separator is ',', the string
169*4661c169SSascha Wildner   list is "2,0,3", it returns "2", the remain list move to "0,3"
170*4661c169SSascha Wildner 
171*4661c169SSascha Wildner   @param  List        A string list separated by the specified separator
172*4661c169SSascha Wildner   @param  Separator   The separator character
173*4661c169SSascha Wildner 
174*4661c169SSascha Wildner   @return A pointer to the current sub-string
175*4661c169SSascha Wildner 
176*4661c169SSascha Wildner **/
177*4661c169SSascha Wildner static
178*4661c169SSascha Wildner CHAR16 *
SplitStr(IN OUT CHAR16 ** List,IN CHAR16 Separator)179*4661c169SSascha Wildner SplitStr (
180*4661c169SSascha Wildner   IN OUT CHAR16 **List,
181*4661c169SSascha Wildner   IN     CHAR16 Separator
182*4661c169SSascha Wildner   )
183*4661c169SSascha Wildner {
184*4661c169SSascha Wildner   CHAR16  *Str;
185*4661c169SSascha Wildner   CHAR16  *ReturnStr;
186*4661c169SSascha Wildner 
187*4661c169SSascha Wildner   Str = *List;
188*4661c169SSascha Wildner   ReturnStr = Str;
189*4661c169SSascha Wildner 
190*4661c169SSascha Wildner   if (IS_NULL (*Str)) {
191*4661c169SSascha Wildner     return ReturnStr;
192*4661c169SSascha Wildner   }
193*4661c169SSascha Wildner 
194*4661c169SSascha Wildner   //
195*4661c169SSascha Wildner   // Find first occurrence of the separator
196*4661c169SSascha Wildner   //
197*4661c169SSascha Wildner   while (!IS_NULL (*Str)) {
198*4661c169SSascha Wildner     if (*Str == Separator) {
199*4661c169SSascha Wildner       break;
200*4661c169SSascha Wildner     }
201*4661c169SSascha Wildner     Str++;
202*4661c169SSascha Wildner   }
203*4661c169SSascha Wildner 
204*4661c169SSascha Wildner   if (*Str == Separator) {
205*4661c169SSascha Wildner     //
206*4661c169SSascha Wildner     // Find a sub-string, terminate it
207*4661c169SSascha Wildner     //
208*4661c169SSascha Wildner     *Str = '\0';
209*4661c169SSascha Wildner     Str++;
210*4661c169SSascha Wildner   }
211*4661c169SSascha Wildner 
212*4661c169SSascha Wildner   //
213*4661c169SSascha Wildner   // Move to next sub-string
214*4661c169SSascha Wildner   //
215*4661c169SSascha Wildner   *List = Str;
216*4661c169SSascha Wildner 
217*4661c169SSascha Wildner   return ReturnStr;
218*4661c169SSascha Wildner }
219*4661c169SSascha Wildner 
220*4661c169SSascha Wildner /**
221*4661c169SSascha Wildner   Gets the next parameter string from the list.
222*4661c169SSascha Wildner 
223*4661c169SSascha Wildner   @param List            A string list separated by the specified separator
224*4661c169SSascha Wildner 
225*4661c169SSascha Wildner   @return A pointer to the current sub-string
226*4661c169SSascha Wildner 
227*4661c169SSascha Wildner **/
228*4661c169SSascha Wildner static
229*4661c169SSascha Wildner CHAR16 *
GetNextParamStr(IN OUT CHAR16 ** List)230*4661c169SSascha Wildner GetNextParamStr (
231*4661c169SSascha Wildner   IN OUT CHAR16 **List
232*4661c169SSascha Wildner   )
233*4661c169SSascha Wildner {
234*4661c169SSascha Wildner   //
235*4661c169SSascha Wildner   // The separator is comma
236*4661c169SSascha Wildner   //
237*4661c169SSascha Wildner   return SplitStr (List, ',');
238*4661c169SSascha Wildner }
239*4661c169SSascha Wildner 
240*4661c169SSascha Wildner /**
241*4661c169SSascha Wildner   Get one device node from entire device path text.
242*4661c169SSascha Wildner 
243*4661c169SSascha Wildner   @param DevicePath      On input, the current Device Path node; on output, the next device path node
244*4661c169SSascha Wildner   @param IsInstanceEnd   This node is the end of a device path instance
245*4661c169SSascha Wildner 
246*4661c169SSascha Wildner   @return A device node text or NULL if no more device node available
247*4661c169SSascha Wildner 
248*4661c169SSascha Wildner **/
249*4661c169SSascha Wildner static
250*4661c169SSascha Wildner CHAR16 *
GetNextDeviceNodeStr(IN OUT CHAR16 ** DevicePath,OUT BOOLEAN * IsInstanceEnd)251*4661c169SSascha Wildner GetNextDeviceNodeStr (
252*4661c169SSascha Wildner   IN OUT CHAR16   **DevicePath,
253*4661c169SSascha Wildner   OUT    BOOLEAN  *IsInstanceEnd
254*4661c169SSascha Wildner   )
255*4661c169SSascha Wildner {
256*4661c169SSascha Wildner   CHAR16  *Str;
257*4661c169SSascha Wildner   CHAR16  *ReturnStr;
258*4661c169SSascha Wildner   UINTN   ParenthesesStack;
259*4661c169SSascha Wildner 
260*4661c169SSascha Wildner   Str = *DevicePath;
261*4661c169SSascha Wildner   if (IS_NULL (*Str)) {
262*4661c169SSascha Wildner     return NULL;
263*4661c169SSascha Wildner   }
264*4661c169SSascha Wildner 
265*4661c169SSascha Wildner   //
266*4661c169SSascha Wildner   // Skip the leading '/', '(', ')' and ','
267*4661c169SSascha Wildner   //
268*4661c169SSascha Wildner   while (!IS_NULL (*Str)) {
269*4661c169SSascha Wildner     if (!IS_SLASH (*Str) &&
270*4661c169SSascha Wildner         !IS_COMMA (*Str) &&
271*4661c169SSascha Wildner         !IS_LEFT_PARENTH (*Str) &&
272*4661c169SSascha Wildner         !IS_RIGHT_PARENTH (*Str)) {
273*4661c169SSascha Wildner       break;
274*4661c169SSascha Wildner     }
275*4661c169SSascha Wildner     Str++;
276*4661c169SSascha Wildner   }
277*4661c169SSascha Wildner 
278*4661c169SSascha Wildner   ReturnStr = Str;
279*4661c169SSascha Wildner 
280*4661c169SSascha Wildner   //
281*4661c169SSascha Wildner   // Scan for the separator of this device node, '/' or ','
282*4661c169SSascha Wildner   //
283*4661c169SSascha Wildner   ParenthesesStack = 0;
284*4661c169SSascha Wildner   while (!IS_NULL (*Str)) {
285*4661c169SSascha Wildner     if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
286*4661c169SSascha Wildner       break;
287*4661c169SSascha Wildner     }
288*4661c169SSascha Wildner 
289*4661c169SSascha Wildner     if (IS_LEFT_PARENTH (*Str)) {
290*4661c169SSascha Wildner       ParenthesesStack++;
291*4661c169SSascha Wildner     } else if (IS_RIGHT_PARENTH (*Str)) {
292*4661c169SSascha Wildner       ParenthesesStack--;
293*4661c169SSascha Wildner     }
294*4661c169SSascha Wildner 
295*4661c169SSascha Wildner     Str++;
296*4661c169SSascha Wildner   }
297*4661c169SSascha Wildner 
298*4661c169SSascha Wildner   if (ParenthesesStack != 0) {
299*4661c169SSascha Wildner     //
300*4661c169SSascha Wildner     // The '(' doesn't pair with ')', invalid device path text
301*4661c169SSascha Wildner     //
302*4661c169SSascha Wildner     return NULL;
303*4661c169SSascha Wildner   }
304*4661c169SSascha Wildner 
305*4661c169SSascha Wildner   if (IS_COMMA (*Str)) {
306*4661c169SSascha Wildner     *IsInstanceEnd = TRUE;
307*4661c169SSascha Wildner     *Str = '\0';
308*4661c169SSascha Wildner     Str++;
309*4661c169SSascha Wildner   } else {
310*4661c169SSascha Wildner     *IsInstanceEnd = FALSE;
311*4661c169SSascha Wildner     if (!IS_NULL (*Str)) {
312*4661c169SSascha Wildner       *Str = '\0';
313*4661c169SSascha Wildner       Str++;
314*4661c169SSascha Wildner     }
315*4661c169SSascha Wildner   }
316*4661c169SSascha Wildner 
317*4661c169SSascha Wildner   *DevicePath = Str;
318*4661c169SSascha Wildner 
319*4661c169SSascha Wildner   return ReturnStr;
320*4661c169SSascha Wildner }
321*4661c169SSascha Wildner 
322*4661c169SSascha Wildner 
323*4661c169SSascha Wildner #ifndef __DragonFly__
324*4661c169SSascha Wildner /**
325*4661c169SSascha Wildner   Return whether the integer string is a hex string.
326*4661c169SSascha Wildner 
327*4661c169SSascha Wildner   @param Str             The integer string
328*4661c169SSascha Wildner 
329*4661c169SSascha Wildner   @retval TRUE   Hex string
330*4661c169SSascha Wildner   @retval FALSE  Decimal string
331*4661c169SSascha Wildner 
332*4661c169SSascha Wildner **/
333*4661c169SSascha Wildner static
334*4661c169SSascha Wildner BOOLEAN
IsHexStr(IN CHAR16 * Str)335*4661c169SSascha Wildner IsHexStr (
336*4661c169SSascha Wildner   IN CHAR16   *Str
337*4661c169SSascha Wildner   )
338*4661c169SSascha Wildner {
339*4661c169SSascha Wildner   //
340*4661c169SSascha Wildner   // skip preceeding white space
341*4661c169SSascha Wildner   //
342*4661c169SSascha Wildner   while ((*Str != 0) && *Str == ' ') {
343*4661c169SSascha Wildner     Str ++;
344*4661c169SSascha Wildner   }
345*4661c169SSascha Wildner   //
346*4661c169SSascha Wildner   // skip preceeding zeros
347*4661c169SSascha Wildner   //
348*4661c169SSascha Wildner   while ((*Str != 0) && *Str == '0') {
349*4661c169SSascha Wildner     Str ++;
350*4661c169SSascha Wildner   }
351*4661c169SSascha Wildner 
352*4661c169SSascha Wildner   return (BOOLEAN) (*Str == 'x' || *Str == 'X');
353*4661c169SSascha Wildner }
354*4661c169SSascha Wildner 
355*4661c169SSascha Wildner /**
356*4661c169SSascha Wildner 
357*4661c169SSascha Wildner   Convert integer string to uint.
358*4661c169SSascha Wildner 
359*4661c169SSascha Wildner   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
360*4661c169SSascha Wildner 
361*4661c169SSascha Wildner   @return A UINTN value represented by Str
362*4661c169SSascha Wildner 
363*4661c169SSascha Wildner **/
364*4661c169SSascha Wildner static
365*4661c169SSascha Wildner UINTN
Strtoi(IN CHAR16 * Str)366*4661c169SSascha Wildner Strtoi (
367*4661c169SSascha Wildner   IN CHAR16  *Str
368*4661c169SSascha Wildner   )
369*4661c169SSascha Wildner {
370*4661c169SSascha Wildner   if (IsHexStr (Str)) {
371*4661c169SSascha Wildner     return StrHexToUintn (Str);
372*4661c169SSascha Wildner   } else {
373*4661c169SSascha Wildner     return StrDecimalToUintn (Str);
374*4661c169SSascha Wildner   }
375*4661c169SSascha Wildner }
376*4661c169SSascha Wildner 
377*4661c169SSascha Wildner /**
378*4661c169SSascha Wildner 
379*4661c169SSascha Wildner   Convert integer string to 64 bit data.
380*4661c169SSascha Wildner 
381*4661c169SSascha Wildner   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
382*4661c169SSascha Wildner   @param Data            A pointer to the UINT64 value represented by Str
383*4661c169SSascha Wildner 
384*4661c169SSascha Wildner **/
385*4661c169SSascha Wildner static
386*4661c169SSascha Wildner VOID
Strtoi64(IN CHAR16 * Str,OUT UINT64 * Data)387*4661c169SSascha Wildner Strtoi64 (
388*4661c169SSascha Wildner   IN  CHAR16  *Str,
389*4661c169SSascha Wildner   OUT UINT64  *Data
390*4661c169SSascha Wildner   )
391*4661c169SSascha Wildner {
392*4661c169SSascha Wildner   if (IsHexStr (Str)) {
393*4661c169SSascha Wildner     *Data = StrHexToUint64 (Str);
394*4661c169SSascha Wildner   } else {
395*4661c169SSascha Wildner     *Data = StrDecimalToUint64 (Str);
396*4661c169SSascha Wildner   }
397*4661c169SSascha Wildner }
398*4661c169SSascha Wildner #endif
399*4661c169SSascha Wildner 
400*4661c169SSascha Wildner /**
401*4661c169SSascha Wildner   Converts a Unicode string to ASCII string.
402*4661c169SSascha Wildner 
403*4661c169SSascha Wildner   @param Str             The equivalent Unicode string
404*4661c169SSascha Wildner   @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points
405*4661c169SSascha Wildner                          to the next ASCII string next to it
406*4661c169SSascha Wildner 
407*4661c169SSascha Wildner **/
408*4661c169SSascha Wildner static
409*4661c169SSascha Wildner VOID
StrToAscii(IN CHAR16 * Str,IN OUT CHAR8 ** AsciiStr)410*4661c169SSascha Wildner StrToAscii (
411*4661c169SSascha Wildner   IN     CHAR16 *Str,
412*4661c169SSascha Wildner   IN OUT CHAR8  **AsciiStr
413*4661c169SSascha Wildner   )
414*4661c169SSascha Wildner {
415*4661c169SSascha Wildner   CHAR8 *Dest;
416*4661c169SSascha Wildner 
417*4661c169SSascha Wildner   Dest = *AsciiStr;
418*4661c169SSascha Wildner   while (!IS_NULL (*Str)) {
419*4661c169SSascha Wildner     *(Dest++) = (CHAR8) *(Str++);
420*4661c169SSascha Wildner   }
421*4661c169SSascha Wildner   *Dest = 0;
422*4661c169SSascha Wildner 
423*4661c169SSascha Wildner   //
424*4661c169SSascha Wildner   // Return the string next to it
425*4661c169SSascha Wildner   //
426*4661c169SSascha Wildner   *AsciiStr = Dest + 1;
427*4661c169SSascha Wildner }
428*4661c169SSascha Wildner 
429*4661c169SSascha Wildner /**
430*4661c169SSascha Wildner   Converts a generic text device path node to device path structure.
431*4661c169SSascha Wildner 
432*4661c169SSascha Wildner   @param Type            The type of the device path node.
433*4661c169SSascha Wildner   @param TextDeviceNode  The input text device path node.
434*4661c169SSascha Wildner 
435*4661c169SSascha Wildner   @return A pointer to device path structure.
436*4661c169SSascha Wildner **/
437*4661c169SSascha Wildner static
438*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextGenericPath(IN UINT8 Type,IN CHAR16 * TextDeviceNode)439*4661c169SSascha Wildner DevPathFromTextGenericPath (
440*4661c169SSascha Wildner   IN UINT8  Type,
441*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
442*4661c169SSascha Wildner   )
443*4661c169SSascha Wildner {
444*4661c169SSascha Wildner   EFI_DEVICE_PATH_PROTOCOL *Node;
445*4661c169SSascha Wildner   CHAR16                   *SubtypeStr;
446*4661c169SSascha Wildner   CHAR16                   *DataStr;
447*4661c169SSascha Wildner   UINTN                    DataLength;
448*4661c169SSascha Wildner 
449*4661c169SSascha Wildner   SubtypeStr = GetNextParamStr (&TextDeviceNode);
450*4661c169SSascha Wildner   DataStr    = GetNextParamStr (&TextDeviceNode);
451*4661c169SSascha Wildner 
452*4661c169SSascha Wildner   if (DataStr == NULL) {
453*4661c169SSascha Wildner     DataLength = 0;
454*4661c169SSascha Wildner   } else {
455*4661c169SSascha Wildner     DataLength = StrLen (DataStr) / 2;
456*4661c169SSascha Wildner   }
457*4661c169SSascha Wildner   Node = CreateDeviceNode (
458*4661c169SSascha Wildner            Type,
459*4661c169SSascha Wildner            (UINT8) Strtoi (SubtypeStr),
460*4661c169SSascha Wildner            (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)
461*4661c169SSascha Wildner            );
462*4661c169SSascha Wildner 
463*4661c169SSascha Wildner   StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);
464*4661c169SSascha Wildner   return Node;
465*4661c169SSascha Wildner }
466*4661c169SSascha Wildner 
467*4661c169SSascha Wildner /**
468*4661c169SSascha Wildner   Converts a generic text device path node to device path structure.
469*4661c169SSascha Wildner 
470*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
471*4661c169SSascha Wildner 
472*4661c169SSascha Wildner   @return A pointer to device path structure.
473*4661c169SSascha Wildner 
474*4661c169SSascha Wildner **/
475*4661c169SSascha Wildner static
476*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPath(IN CHAR16 * TextDeviceNode)477*4661c169SSascha Wildner DevPathFromTextPath (
478*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
479*4661c169SSascha Wildner   )
480*4661c169SSascha Wildner {
481*4661c169SSascha Wildner   CHAR16                   *TypeStr;
482*4661c169SSascha Wildner 
483*4661c169SSascha Wildner   TypeStr    = GetNextParamStr (&TextDeviceNode);
484*4661c169SSascha Wildner 
485*4661c169SSascha Wildner   return DevPathFromTextGenericPath ((UINT8) Strtoi (TypeStr), TextDeviceNode);
486*4661c169SSascha Wildner }
487*4661c169SSascha Wildner 
488*4661c169SSascha Wildner /**
489*4661c169SSascha Wildner   Converts a generic hardware text device path node to Hardware device path structure.
490*4661c169SSascha Wildner 
491*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
492*4661c169SSascha Wildner 
493*4661c169SSascha Wildner   @return A pointer to Hardware device path structure.
494*4661c169SSascha Wildner 
495*4661c169SSascha Wildner **/
496*4661c169SSascha Wildner static
497*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHardwarePath(IN CHAR16 * TextDeviceNode)498*4661c169SSascha Wildner DevPathFromTextHardwarePath (
499*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
500*4661c169SSascha Wildner   )
501*4661c169SSascha Wildner {
502*4661c169SSascha Wildner   return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);
503*4661c169SSascha Wildner }
504*4661c169SSascha Wildner 
505*4661c169SSascha Wildner /**
506*4661c169SSascha Wildner   Converts a text device path node to Hardware PCI device path structure.
507*4661c169SSascha Wildner 
508*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
509*4661c169SSascha Wildner 
510*4661c169SSascha Wildner   @return A pointer to Hardware PCI device path structure.
511*4661c169SSascha Wildner 
512*4661c169SSascha Wildner **/
513*4661c169SSascha Wildner static
514*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPci(IN CHAR16 * TextDeviceNode)515*4661c169SSascha Wildner DevPathFromTextPci (
516*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
517*4661c169SSascha Wildner   )
518*4661c169SSascha Wildner {
519*4661c169SSascha Wildner   CHAR16          *FunctionStr;
520*4661c169SSascha Wildner   CHAR16          *DeviceStr;
521*4661c169SSascha Wildner   PCI_DEVICE_PATH *Pci;
522*4661c169SSascha Wildner 
523*4661c169SSascha Wildner   DeviceStr   = GetNextParamStr (&TextDeviceNode);
524*4661c169SSascha Wildner   FunctionStr = GetNextParamStr (&TextDeviceNode);
525*4661c169SSascha Wildner   Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (
526*4661c169SSascha Wildner                                       HARDWARE_DEVICE_PATH,
527*4661c169SSascha Wildner                                       HW_PCI_DP,
528*4661c169SSascha Wildner                                       (UINT16) sizeof (PCI_DEVICE_PATH)
529*4661c169SSascha Wildner                                       );
530*4661c169SSascha Wildner 
531*4661c169SSascha Wildner   Pci->Function = (UINT8) Strtoi (FunctionStr);
532*4661c169SSascha Wildner   Pci->Device   = (UINT8) Strtoi (DeviceStr);
533*4661c169SSascha Wildner 
534*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Pci;
535*4661c169SSascha Wildner }
536*4661c169SSascha Wildner 
537*4661c169SSascha Wildner /**
538*4661c169SSascha Wildner   Converts a text device path node to Hardware PC card device path structure.
539*4661c169SSascha Wildner 
540*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
541*4661c169SSascha Wildner 
542*4661c169SSascha Wildner   @return A pointer to Hardware PC card device path structure.
543*4661c169SSascha Wildner 
544*4661c169SSascha Wildner **/
545*4661c169SSascha Wildner static
546*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcCard(IN CHAR16 * TextDeviceNode)547*4661c169SSascha Wildner DevPathFromTextPcCard (
548*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
549*4661c169SSascha Wildner   )
550*4661c169SSascha Wildner {
551*4661c169SSascha Wildner   CHAR16              *FunctionNumberStr;
552*4661c169SSascha Wildner   PCCARD_DEVICE_PATH  *Pccard;
553*4661c169SSascha Wildner 
554*4661c169SSascha Wildner   FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
555*4661c169SSascha Wildner   Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (
556*4661c169SSascha Wildner                                                HARDWARE_DEVICE_PATH,
557*4661c169SSascha Wildner                                                HW_PCCARD_DP,
558*4661c169SSascha Wildner                                                (UINT16) sizeof (PCCARD_DEVICE_PATH)
559*4661c169SSascha Wildner                                                );
560*4661c169SSascha Wildner 
561*4661c169SSascha Wildner   Pccard->FunctionNumber  = (UINT8) Strtoi (FunctionNumberStr);
562*4661c169SSascha Wildner 
563*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;
564*4661c169SSascha Wildner }
565*4661c169SSascha Wildner 
566*4661c169SSascha Wildner /**
567*4661c169SSascha Wildner   Converts a text device path node to Hardware memory map device path structure.
568*4661c169SSascha Wildner 
569*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
570*4661c169SSascha Wildner 
571*4661c169SSascha Wildner   @return A pointer to Hardware memory map device path structure.
572*4661c169SSascha Wildner 
573*4661c169SSascha Wildner **/
574*4661c169SSascha Wildner static
575*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMemoryMapped(IN CHAR16 * TextDeviceNode)576*4661c169SSascha Wildner DevPathFromTextMemoryMapped (
577*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
578*4661c169SSascha Wildner   )
579*4661c169SSascha Wildner {
580*4661c169SSascha Wildner   CHAR16              *MemoryTypeStr;
581*4661c169SSascha Wildner   CHAR16              *StartingAddressStr;
582*4661c169SSascha Wildner   CHAR16              *EndingAddressStr;
583*4661c169SSascha Wildner   MEMMAP_DEVICE_PATH  *MemMap;
584*4661c169SSascha Wildner 
585*4661c169SSascha Wildner   MemoryTypeStr      = GetNextParamStr (&TextDeviceNode);
586*4661c169SSascha Wildner   StartingAddressStr = GetNextParamStr (&TextDeviceNode);
587*4661c169SSascha Wildner   EndingAddressStr   = GetNextParamStr (&TextDeviceNode);
588*4661c169SSascha Wildner   MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (
589*4661c169SSascha Wildner                                                HARDWARE_DEVICE_PATH,
590*4661c169SSascha Wildner                                                HW_MEMMAP_DP,
591*4661c169SSascha Wildner                                                (UINT16) sizeof (MEMMAP_DEVICE_PATH)
592*4661c169SSascha Wildner                                                );
593*4661c169SSascha Wildner 
594*4661c169SSascha Wildner   MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);
595*4661c169SSascha Wildner   Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);
596*4661c169SSascha Wildner   Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);
597*4661c169SSascha Wildner 
598*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;
599*4661c169SSascha Wildner }
600*4661c169SSascha Wildner 
601*4661c169SSascha Wildner /**
602*4661c169SSascha Wildner   Converts a text device path node to Vendor device path structure based on the input Type
603*4661c169SSascha Wildner   and SubType.
604*4661c169SSascha Wildner 
605*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
606*4661c169SSascha Wildner   @param Type            The type of device path node.
607*4661c169SSascha Wildner   @param SubType         The subtype of device path node.
608*4661c169SSascha Wildner 
609*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor device path structure.
610*4661c169SSascha Wildner 
611*4661c169SSascha Wildner **/
612*4661c169SSascha Wildner static
613*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextVendor(IN CHAR16 * TextDeviceNode,IN UINT8 Type,IN UINT8 SubType)614*4661c169SSascha Wildner ConvertFromTextVendor (
615*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode,
616*4661c169SSascha Wildner   IN UINT8  Type,
617*4661c169SSascha Wildner   IN UINT8  SubType
618*4661c169SSascha Wildner   )
619*4661c169SSascha Wildner {
620*4661c169SSascha Wildner   CHAR16              *GuidStr;
621*4661c169SSascha Wildner   CHAR16              *DataStr;
622*4661c169SSascha Wildner   UINTN               Length;
623*4661c169SSascha Wildner   VENDOR_DEVICE_PATH  *Vendor;
624*4661c169SSascha Wildner 
625*4661c169SSascha Wildner   GuidStr = GetNextParamStr (&TextDeviceNode);
626*4661c169SSascha Wildner 
627*4661c169SSascha Wildner   DataStr = GetNextParamStr (&TextDeviceNode);
628*4661c169SSascha Wildner   Length  = StrLen (DataStr);
629*4661c169SSascha Wildner   //
630*4661c169SSascha Wildner   // Two hex characters make up 1 buffer byte
631*4661c169SSascha Wildner   //
632*4661c169SSascha Wildner   Length  = (Length + 1) / 2;
633*4661c169SSascha Wildner 
634*4661c169SSascha Wildner   Vendor  = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
635*4661c169SSascha Wildner                                      Type,
636*4661c169SSascha Wildner                                      SubType,
637*4661c169SSascha Wildner                                      (UINT16) (sizeof (VENDOR_DEVICE_PATH) + Length)
638*4661c169SSascha Wildner                                      );
639*4661c169SSascha Wildner 
640*4661c169SSascha Wildner   StrToGuid (GuidStr, &Vendor->Guid);
641*4661c169SSascha Wildner   StrHexToBytes (DataStr, Length * 2, (UINT8 *) (Vendor + 1), Length);
642*4661c169SSascha Wildner 
643*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
644*4661c169SSascha Wildner }
645*4661c169SSascha Wildner 
646*4661c169SSascha Wildner /**
647*4661c169SSascha Wildner   Converts a text device path node to Vendor Hardware device path structure.
648*4661c169SSascha Wildner 
649*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
650*4661c169SSascha Wildner 
651*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor Hardware device path structure.
652*4661c169SSascha Wildner 
653*4661c169SSascha Wildner **/
654*4661c169SSascha Wildner static
655*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenHw(IN CHAR16 * TextDeviceNode)656*4661c169SSascha Wildner DevPathFromTextVenHw (
657*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
658*4661c169SSascha Wildner   )
659*4661c169SSascha Wildner {
660*4661c169SSascha Wildner   return ConvertFromTextVendor (
661*4661c169SSascha Wildner            TextDeviceNode,
662*4661c169SSascha Wildner            HARDWARE_DEVICE_PATH,
663*4661c169SSascha Wildner            HW_VENDOR_DP
664*4661c169SSascha Wildner            );
665*4661c169SSascha Wildner }
666*4661c169SSascha Wildner 
667*4661c169SSascha Wildner /**
668*4661c169SSascha Wildner   Converts a text device path node to Hardware Controller device path structure.
669*4661c169SSascha Wildner 
670*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
671*4661c169SSascha Wildner 
672*4661c169SSascha Wildner   @return A pointer to the newly-created Hardware Controller device path structure.
673*4661c169SSascha Wildner 
674*4661c169SSascha Wildner **/
675*4661c169SSascha Wildner static
676*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCtrl(IN CHAR16 * TextDeviceNode)677*4661c169SSascha Wildner DevPathFromTextCtrl (
678*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
679*4661c169SSascha Wildner   )
680*4661c169SSascha Wildner {
681*4661c169SSascha Wildner   CHAR16                  *ControllerStr;
682*4661c169SSascha Wildner   CONTROLLER_DEVICE_PATH  *Controller;
683*4661c169SSascha Wildner 
684*4661c169SSascha Wildner   ControllerStr = GetNextParamStr (&TextDeviceNode);
685*4661c169SSascha Wildner   Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (
686*4661c169SSascha Wildner                                                HARDWARE_DEVICE_PATH,
687*4661c169SSascha Wildner                                                HW_CONTROLLER_DP,
688*4661c169SSascha Wildner                                                (UINT16) sizeof (CONTROLLER_DEVICE_PATH)
689*4661c169SSascha Wildner                                                );
690*4661c169SSascha Wildner   Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);
691*4661c169SSascha Wildner 
692*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Controller;
693*4661c169SSascha Wildner }
694*4661c169SSascha Wildner 
695*4661c169SSascha Wildner /**
696*4661c169SSascha Wildner   Converts a text device path node to BMC device path structure.
697*4661c169SSascha Wildner 
698*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
699*4661c169SSascha Wildner 
700*4661c169SSascha Wildner   @return A pointer to the newly-created BMC device path structure.
701*4661c169SSascha Wildner 
702*4661c169SSascha Wildner **/
703*4661c169SSascha Wildner static
704*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBmc(IN CHAR16 * TextDeviceNode)705*4661c169SSascha Wildner DevPathFromTextBmc (
706*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
707*4661c169SSascha Wildner   )
708*4661c169SSascha Wildner {
709*4661c169SSascha Wildner   CHAR16                *InterfaceTypeStr;
710*4661c169SSascha Wildner   CHAR16                *BaseAddressStr;
711*4661c169SSascha Wildner   BMC_DEVICE_PATH       *BmcDp;
712*4661c169SSascha Wildner 
713*4661c169SSascha Wildner   InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);
714*4661c169SSascha Wildner   BaseAddressStr   = GetNextParamStr (&TextDeviceNode);
715*4661c169SSascha Wildner   BmcDp            = (BMC_DEVICE_PATH *) CreateDeviceNode (
716*4661c169SSascha Wildner                                            HARDWARE_DEVICE_PATH,
717*4661c169SSascha Wildner                                            HW_BMC_DP,
718*4661c169SSascha Wildner                                            (UINT16) sizeof (BMC_DEVICE_PATH)
719*4661c169SSascha Wildner                                            );
720*4661c169SSascha Wildner 
721*4661c169SSascha Wildner   BmcDp->InterfaceType = (UINT8) Strtoi (InterfaceTypeStr);
722*4661c169SSascha Wildner   WriteUnaligned64 (
723*4661c169SSascha Wildner     (UINT64 *) (&BmcDp->BaseAddress),
724*4661c169SSascha Wildner     StrHexToUint64 (BaseAddressStr)
725*4661c169SSascha Wildner     );
726*4661c169SSascha Wildner 
727*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) BmcDp;
728*4661c169SSascha Wildner }
729*4661c169SSascha Wildner 
730*4661c169SSascha Wildner /**
731*4661c169SSascha Wildner   Converts a generic ACPI text device path node to ACPI device path structure.
732*4661c169SSascha Wildner 
733*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
734*4661c169SSascha Wildner 
735*4661c169SSascha Wildner   @return A pointer to ACPI device path structure.
736*4661c169SSascha Wildner 
737*4661c169SSascha Wildner **/
738*4661c169SSascha Wildner static
739*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiPath(IN CHAR16 * TextDeviceNode)740*4661c169SSascha Wildner DevPathFromTextAcpiPath (
741*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
742*4661c169SSascha Wildner   )
743*4661c169SSascha Wildner {
744*4661c169SSascha Wildner   return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);
745*4661c169SSascha Wildner }
746*4661c169SSascha Wildner 
747*4661c169SSascha Wildner /**
748*4661c169SSascha Wildner   Converts a string to EisaId.
749*4661c169SSascha Wildner 
750*4661c169SSascha Wildner   @param Text   The input string.
751*4661c169SSascha Wildner 
752*4661c169SSascha Wildner   @return UINT32 EISA ID.
753*4661c169SSascha Wildner **/
754*4661c169SSascha Wildner static
755*4661c169SSascha Wildner UINT32
EisaIdFromText(IN CHAR16 * Text)756*4661c169SSascha Wildner EisaIdFromText (
757*4661c169SSascha Wildner   IN CHAR16 *Text
758*4661c169SSascha Wildner   )
759*4661c169SSascha Wildner {
760*4661c169SSascha Wildner   return (((Text[0] - 'A' + 1) & 0x1f) << 10)
761*4661c169SSascha Wildner        + (((Text[1] - 'A' + 1) & 0x1f) <<  5)
762*4661c169SSascha Wildner        + (((Text[2] - 'A' + 1) & 0x1f) <<  0)
763*4661c169SSascha Wildner        + (UINT32) (StrHexToUintn (&Text[3]) << 16)
764*4661c169SSascha Wildner        ;
765*4661c169SSascha Wildner }
766*4661c169SSascha Wildner 
767*4661c169SSascha Wildner /**
768*4661c169SSascha Wildner   Converts a text device path node to ACPI HID device path structure.
769*4661c169SSascha Wildner 
770*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
771*4661c169SSascha Wildner 
772*4661c169SSascha Wildner   @return A pointer to the newly-created ACPI HID device path structure.
773*4661c169SSascha Wildner 
774*4661c169SSascha Wildner **/
775*4661c169SSascha Wildner static
776*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpi(IN CHAR16 * TextDeviceNode)777*4661c169SSascha Wildner DevPathFromTextAcpi (
778*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
779*4661c169SSascha Wildner   )
780*4661c169SSascha Wildner {
781*4661c169SSascha Wildner   CHAR16                *HIDStr;
782*4661c169SSascha Wildner   CHAR16                *UIDStr;
783*4661c169SSascha Wildner   ACPI_HID_DEVICE_PATH  *Acpi;
784*4661c169SSascha Wildner 
785*4661c169SSascha Wildner   HIDStr = GetNextParamStr (&TextDeviceNode);
786*4661c169SSascha Wildner   UIDStr = GetNextParamStr (&TextDeviceNode);
787*4661c169SSascha Wildner   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
788*4661c169SSascha Wildner                                       ACPI_DEVICE_PATH,
789*4661c169SSascha Wildner                                       ACPI_DP,
790*4661c169SSascha Wildner                                       (UINT16) sizeof (ACPI_HID_DEVICE_PATH)
791*4661c169SSascha Wildner                                       );
792*4661c169SSascha Wildner 
793*4661c169SSascha Wildner   Acpi->HID = EisaIdFromText (HIDStr);
794*4661c169SSascha Wildner   Acpi->UID = (UINT32) Strtoi (UIDStr);
795*4661c169SSascha Wildner 
796*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
797*4661c169SSascha Wildner }
798*4661c169SSascha Wildner 
799*4661c169SSascha Wildner /**
800*4661c169SSascha Wildner   Converts a text device path node to ACPI HID device path structure.
801*4661c169SSascha Wildner 
802*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
803*4661c169SSascha Wildner   @param PnPId           The input plug and play identification.
804*4661c169SSascha Wildner 
805*4661c169SSascha Wildner   @return A pointer to the newly-created ACPI HID device path structure.
806*4661c169SSascha Wildner 
807*4661c169SSascha Wildner **/
808*4661c169SSascha Wildner static
809*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextAcpi(IN CHAR16 * TextDeviceNode,IN UINT32 PnPId)810*4661c169SSascha Wildner ConvertFromTextAcpi (
811*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode,
812*4661c169SSascha Wildner   IN UINT32  PnPId
813*4661c169SSascha Wildner   )
814*4661c169SSascha Wildner {
815*4661c169SSascha Wildner   CHAR16                *UIDStr;
816*4661c169SSascha Wildner   ACPI_HID_DEVICE_PATH  *Acpi;
817*4661c169SSascha Wildner 
818*4661c169SSascha Wildner   UIDStr = GetNextParamStr (&TextDeviceNode);
819*4661c169SSascha Wildner   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
820*4661c169SSascha Wildner                                       ACPI_DEVICE_PATH,
821*4661c169SSascha Wildner                                       ACPI_DP,
822*4661c169SSascha Wildner                                       (UINT16) sizeof (ACPI_HID_DEVICE_PATH)
823*4661c169SSascha Wildner                                       );
824*4661c169SSascha Wildner 
825*4661c169SSascha Wildner   Acpi->HID = EFI_PNP_ID (PnPId);
826*4661c169SSascha Wildner   Acpi->UID = (UINT32) Strtoi (UIDStr);
827*4661c169SSascha Wildner 
828*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
829*4661c169SSascha Wildner }
830*4661c169SSascha Wildner 
831*4661c169SSascha Wildner /**
832*4661c169SSascha Wildner   Converts a text device path node to PCI root device path structure.
833*4661c169SSascha Wildner 
834*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
835*4661c169SSascha Wildner 
836*4661c169SSascha Wildner   @return A pointer to the newly-created PCI root device path structure.
837*4661c169SSascha Wildner 
838*4661c169SSascha Wildner **/
839*4661c169SSascha Wildner static
840*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPciRoot(IN CHAR16 * TextDeviceNode)841*4661c169SSascha Wildner DevPathFromTextPciRoot (
842*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
843*4661c169SSascha Wildner   )
844*4661c169SSascha Wildner {
845*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);
846*4661c169SSascha Wildner }
847*4661c169SSascha Wildner 
848*4661c169SSascha Wildner /**
849*4661c169SSascha Wildner   Converts a text device path node to PCIE root device path structure.
850*4661c169SSascha Wildner 
851*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
852*4661c169SSascha Wildner 
853*4661c169SSascha Wildner   @return A pointer to the newly-created PCIE root device path structure.
854*4661c169SSascha Wildner 
855*4661c169SSascha Wildner **/
856*4661c169SSascha Wildner static
857*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPcieRoot(IN CHAR16 * TextDeviceNode)858*4661c169SSascha Wildner DevPathFromTextPcieRoot (
859*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
860*4661c169SSascha Wildner   )
861*4661c169SSascha Wildner {
862*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);
863*4661c169SSascha Wildner }
864*4661c169SSascha Wildner 
865*4661c169SSascha Wildner /**
866*4661c169SSascha Wildner   Converts a text device path node to Floppy device path structure.
867*4661c169SSascha Wildner 
868*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
869*4661c169SSascha Wildner 
870*4661c169SSascha Wildner   @return A pointer to the newly-created Floppy device path structure.
871*4661c169SSascha Wildner 
872*4661c169SSascha Wildner **/
873*4661c169SSascha Wildner static
874*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFloppy(IN CHAR16 * TextDeviceNode)875*4661c169SSascha Wildner DevPathFromTextFloppy (
876*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
877*4661c169SSascha Wildner   )
878*4661c169SSascha Wildner {
879*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0604);
880*4661c169SSascha Wildner }
881*4661c169SSascha Wildner 
882*4661c169SSascha Wildner /**
883*4661c169SSascha Wildner   Converts a text device path node to Keyboard device path structure.
884*4661c169SSascha Wildner 
885*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
886*4661c169SSascha Wildner 
887*4661c169SSascha Wildner   @return A pointer to the newly-created  Keyboard device path structure.
888*4661c169SSascha Wildner 
889*4661c169SSascha Wildner **/
890*4661c169SSascha Wildner static
891*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextKeyboard(IN CHAR16 * TextDeviceNode)892*4661c169SSascha Wildner DevPathFromTextKeyboard (
893*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
894*4661c169SSascha Wildner   )
895*4661c169SSascha Wildner {
896*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0301);
897*4661c169SSascha Wildner }
898*4661c169SSascha Wildner 
899*4661c169SSascha Wildner /**
900*4661c169SSascha Wildner   Converts a text device path node to Serial device path structure.
901*4661c169SSascha Wildner 
902*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
903*4661c169SSascha Wildner 
904*4661c169SSascha Wildner   @return A pointer to the newly-created Serial device path structure.
905*4661c169SSascha Wildner 
906*4661c169SSascha Wildner **/
907*4661c169SSascha Wildner static
908*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSerial(IN CHAR16 * TextDeviceNode)909*4661c169SSascha Wildner DevPathFromTextSerial (
910*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
911*4661c169SSascha Wildner   )
912*4661c169SSascha Wildner {
913*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0501);
914*4661c169SSascha Wildner }
915*4661c169SSascha Wildner 
916*4661c169SSascha Wildner /**
917*4661c169SSascha Wildner   Converts a text device path node to Parallel Port device path structure.
918*4661c169SSascha Wildner 
919*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
920*4661c169SSascha Wildner 
921*4661c169SSascha Wildner   @return A pointer to the newly-created Parallel Port device path structure.
922*4661c169SSascha Wildner 
923*4661c169SSascha Wildner **/
924*4661c169SSascha Wildner static
925*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextParallelPort(IN CHAR16 * TextDeviceNode)926*4661c169SSascha Wildner DevPathFromTextParallelPort (
927*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
928*4661c169SSascha Wildner   )
929*4661c169SSascha Wildner {
930*4661c169SSascha Wildner   return ConvertFromTextAcpi (TextDeviceNode, 0x0401);
931*4661c169SSascha Wildner }
932*4661c169SSascha Wildner 
933*4661c169SSascha Wildner /**
934*4661c169SSascha Wildner   Converts a text device path node to ACPI extension device path structure.
935*4661c169SSascha Wildner 
936*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
937*4661c169SSascha Wildner 
938*4661c169SSascha Wildner   @return A pointer to the newly-created ACPI extension device path structure.
939*4661c169SSascha Wildner 
940*4661c169SSascha Wildner **/
941*4661c169SSascha Wildner static
942*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiEx(IN CHAR16 * TextDeviceNode)943*4661c169SSascha Wildner DevPathFromTextAcpiEx (
944*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
945*4661c169SSascha Wildner   )
946*4661c169SSascha Wildner {
947*4661c169SSascha Wildner   CHAR16                         *HIDStr;
948*4661c169SSascha Wildner   CHAR16                         *CIDStr;
949*4661c169SSascha Wildner   CHAR16                         *UIDStr;
950*4661c169SSascha Wildner   CHAR16                         *HIDSTRStr;
951*4661c169SSascha Wildner   CHAR16                         *CIDSTRStr;
952*4661c169SSascha Wildner   CHAR16                         *UIDSTRStr;
953*4661c169SSascha Wildner   CHAR8                          *AsciiStr;
954*4661c169SSascha Wildner   UINT16                         Length;
955*4661c169SSascha Wildner   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
956*4661c169SSascha Wildner 
957*4661c169SSascha Wildner   HIDStr    = GetNextParamStr (&TextDeviceNode);
958*4661c169SSascha Wildner   CIDStr    = GetNextParamStr (&TextDeviceNode);
959*4661c169SSascha Wildner   UIDStr    = GetNextParamStr (&TextDeviceNode);
960*4661c169SSascha Wildner   HIDSTRStr = GetNextParamStr (&TextDeviceNode);
961*4661c169SSascha Wildner   CIDSTRStr = GetNextParamStr (&TextDeviceNode);
962*4661c169SSascha Wildner   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
963*4661c169SSascha Wildner 
964*4661c169SSascha Wildner   Length    = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
965*4661c169SSascha Wildner   Length    = (UINT16) (Length + StrLen (UIDSTRStr) + 1);
966*4661c169SSascha Wildner   Length    = (UINT16) (Length + StrLen (CIDSTRStr) + 1);
967*4661c169SSascha Wildner   AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (
968*4661c169SSascha Wildner                                                ACPI_DEVICE_PATH,
969*4661c169SSascha Wildner                                                ACPI_EXTENDED_DP,
970*4661c169SSascha Wildner                                                Length
971*4661c169SSascha Wildner                                                );
972*4661c169SSascha Wildner 
973*4661c169SSascha Wildner   AcpiEx->HID = EisaIdFromText (HIDStr);
974*4661c169SSascha Wildner   AcpiEx->CID = EisaIdFromText (CIDStr);
975*4661c169SSascha Wildner   AcpiEx->UID = (UINT32) Strtoi (UIDStr);
976*4661c169SSascha Wildner 
977*4661c169SSascha Wildner   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
978*4661c169SSascha Wildner   StrToAscii (HIDSTRStr, &AsciiStr);
979*4661c169SSascha Wildner   StrToAscii (UIDSTRStr, &AsciiStr);
980*4661c169SSascha Wildner   StrToAscii (CIDSTRStr, &AsciiStr);
981*4661c169SSascha Wildner 
982*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;
983*4661c169SSascha Wildner }
984*4661c169SSascha Wildner 
985*4661c169SSascha Wildner /**
986*4661c169SSascha Wildner   Converts a text device path node to ACPI extension device path structure.
987*4661c169SSascha Wildner 
988*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
989*4661c169SSascha Wildner 
990*4661c169SSascha Wildner   @return A pointer to the newly-created ACPI extension device path structure.
991*4661c169SSascha Wildner 
992*4661c169SSascha Wildner **/
993*4661c169SSascha Wildner static
994*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiExp(IN CHAR16 * TextDeviceNode)995*4661c169SSascha Wildner DevPathFromTextAcpiExp (
996*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
997*4661c169SSascha Wildner   )
998*4661c169SSascha Wildner {
999*4661c169SSascha Wildner   CHAR16                         *HIDStr;
1000*4661c169SSascha Wildner   CHAR16                         *CIDStr;
1001*4661c169SSascha Wildner   CHAR16                         *UIDSTRStr;
1002*4661c169SSascha Wildner   CHAR8                          *AsciiStr;
1003*4661c169SSascha Wildner   UINT16                         Length;
1004*4661c169SSascha Wildner   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
1005*4661c169SSascha Wildner 
1006*4661c169SSascha Wildner   HIDStr    = GetNextParamStr (&TextDeviceNode);
1007*4661c169SSascha Wildner   CIDStr    = GetNextParamStr (&TextDeviceNode);
1008*4661c169SSascha Wildner   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
1009*4661c169SSascha Wildner   Length    = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);
1010*4661c169SSascha Wildner   AcpiEx    = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (
1011*4661c169SSascha Wildner                                                   ACPI_DEVICE_PATH,
1012*4661c169SSascha Wildner                                                   ACPI_EXTENDED_DP,
1013*4661c169SSascha Wildner                                                   Length
1014*4661c169SSascha Wildner                                                   );
1015*4661c169SSascha Wildner 
1016*4661c169SSascha Wildner   AcpiEx->HID = EisaIdFromText (HIDStr);
1017*4661c169SSascha Wildner   AcpiEx->CID = EisaIdFromText (CIDStr);
1018*4661c169SSascha Wildner   AcpiEx->UID = 0;
1019*4661c169SSascha Wildner 
1020*4661c169SSascha Wildner   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
1021*4661c169SSascha Wildner   //
1022*4661c169SSascha Wildner   // HID string is NULL
1023*4661c169SSascha Wildner   //
1024*4661c169SSascha Wildner   *AsciiStr = '\0';
1025*4661c169SSascha Wildner   //
1026*4661c169SSascha Wildner   // Convert UID string
1027*4661c169SSascha Wildner   //
1028*4661c169SSascha Wildner   AsciiStr++;
1029*4661c169SSascha Wildner   StrToAscii (UIDSTRStr, &AsciiStr);
1030*4661c169SSascha Wildner   //
1031*4661c169SSascha Wildner   // CID string is NULL
1032*4661c169SSascha Wildner   //
1033*4661c169SSascha Wildner   *AsciiStr = '\0';
1034*4661c169SSascha Wildner 
1035*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;
1036*4661c169SSascha Wildner }
1037*4661c169SSascha Wildner 
1038*4661c169SSascha Wildner /**
1039*4661c169SSascha Wildner   Converts a text device path node to ACPI _ADR device path structure.
1040*4661c169SSascha Wildner 
1041*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1042*4661c169SSascha Wildner 
1043*4661c169SSascha Wildner   @return A pointer to the newly-created ACPI _ADR device path structure.
1044*4661c169SSascha Wildner 
1045*4661c169SSascha Wildner **/
1046*4661c169SSascha Wildner static
1047*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAcpiAdr(IN CHAR16 * TextDeviceNode)1048*4661c169SSascha Wildner DevPathFromTextAcpiAdr (
1049*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1050*4661c169SSascha Wildner   )
1051*4661c169SSascha Wildner {
1052*4661c169SSascha Wildner   CHAR16                *DisplayDeviceStr;
1053*4661c169SSascha Wildner   ACPI_ADR_DEVICE_PATH  *AcpiAdr;
1054*4661c169SSascha Wildner   UINTN                 Index;
1055*4661c169SSascha Wildner   UINTN                 Length;
1056*4661c169SSascha Wildner 
1057*4661c169SSascha Wildner   AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (
1058*4661c169SSascha Wildner                                        ACPI_DEVICE_PATH,
1059*4661c169SSascha Wildner                                        ACPI_ADR_DP,
1060*4661c169SSascha Wildner                                        (UINT16) sizeof (ACPI_ADR_DEVICE_PATH)
1061*4661c169SSascha Wildner                                        );
1062*4661c169SSascha Wildner   ASSERT (AcpiAdr != NULL);
1063*4661c169SSascha Wildner 
1064*4661c169SSascha Wildner   for (Index = 0; ; Index++) {
1065*4661c169SSascha Wildner     DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);
1066*4661c169SSascha Wildner     if (IS_NULL (*DisplayDeviceStr)) {
1067*4661c169SSascha Wildner       break;
1068*4661c169SSascha Wildner     }
1069*4661c169SSascha Wildner     if (Index > 0) {
1070*4661c169SSascha Wildner       Length  = DevicePathNodeLength (AcpiAdr);
1071*4661c169SSascha Wildner       AcpiAdr = ReallocatePool (
1072*4661c169SSascha Wildner                   Length,
1073*4661c169SSascha Wildner                   Length + sizeof (UINT32),
1074*4661c169SSascha Wildner                   AcpiAdr
1075*4661c169SSascha Wildner                   );
1076*4661c169SSascha Wildner       ASSERT (AcpiAdr != NULL);
1077*4661c169SSascha Wildner       SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));
1078*4661c169SSascha Wildner     }
1079*4661c169SSascha Wildner 
1080*4661c169SSascha Wildner     (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);
1081*4661c169SSascha Wildner   }
1082*4661c169SSascha Wildner 
1083*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;
1084*4661c169SSascha Wildner }
1085*4661c169SSascha Wildner 
1086*4661c169SSascha Wildner /**
1087*4661c169SSascha Wildner   Converts a generic messaging text device path node to messaging device path structure.
1088*4661c169SSascha Wildner 
1089*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1090*4661c169SSascha Wildner 
1091*4661c169SSascha Wildner   @return A pointer to messaging device path structure.
1092*4661c169SSascha Wildner 
1093*4661c169SSascha Wildner **/
1094*4661c169SSascha Wildner static
1095*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMsg(IN CHAR16 * TextDeviceNode)1096*4661c169SSascha Wildner DevPathFromTextMsg (
1097*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1098*4661c169SSascha Wildner   )
1099*4661c169SSascha Wildner {
1100*4661c169SSascha Wildner   return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);
1101*4661c169SSascha Wildner }
1102*4661c169SSascha Wildner 
1103*4661c169SSascha Wildner /**
1104*4661c169SSascha Wildner   Converts a text device path node to Parallel Port device path structure.
1105*4661c169SSascha Wildner 
1106*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1107*4661c169SSascha Wildner 
1108*4661c169SSascha Wildner   @return A pointer to the newly-created Parallel Port device path structure.
1109*4661c169SSascha Wildner 
1110*4661c169SSascha Wildner **/
1111*4661c169SSascha Wildner static
1112*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAta(IN CHAR16 * TextDeviceNode)1113*4661c169SSascha Wildner DevPathFromTextAta (
1114*4661c169SSascha Wildner IN CHAR16 *TextDeviceNode
1115*4661c169SSascha Wildner )
1116*4661c169SSascha Wildner {
1117*4661c169SSascha Wildner   CHAR16            *PrimarySecondaryStr;
1118*4661c169SSascha Wildner   CHAR16            *SlaveMasterStr;
1119*4661c169SSascha Wildner   CHAR16            *LunStr;
1120*4661c169SSascha Wildner   ATAPI_DEVICE_PATH *Atapi;
1121*4661c169SSascha Wildner 
1122*4661c169SSascha Wildner   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (
1123*4661c169SSascha Wildner     MESSAGING_DEVICE_PATH,
1124*4661c169SSascha Wildner     MSG_ATAPI_DP,
1125*4661c169SSascha Wildner     (UINT16) sizeof (ATAPI_DEVICE_PATH)
1126*4661c169SSascha Wildner     );
1127*4661c169SSascha Wildner 
1128*4661c169SSascha Wildner   PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);
1129*4661c169SSascha Wildner   SlaveMasterStr      = GetNextParamStr (&TextDeviceNode);
1130*4661c169SSascha Wildner   LunStr              = GetNextParamStr (&TextDeviceNode);
1131*4661c169SSascha Wildner 
1132*4661c169SSascha Wildner   if (StrCmp (PrimarySecondaryStr, "Primary") == 0) {
1133*4661c169SSascha Wildner     Atapi->PrimarySecondary = 0;
1134*4661c169SSascha Wildner   } else if (StrCmp (PrimarySecondaryStr, "Secondary") == 0) {
1135*4661c169SSascha Wildner     Atapi->PrimarySecondary = 1;
1136*4661c169SSascha Wildner   } else {
1137*4661c169SSascha Wildner     Atapi->PrimarySecondary = (UINT8) Strtoi (PrimarySecondaryStr);
1138*4661c169SSascha Wildner   }
1139*4661c169SSascha Wildner   if (StrCmp (SlaveMasterStr, "Master") == 0) {
1140*4661c169SSascha Wildner     Atapi->SlaveMaster      = 0;
1141*4661c169SSascha Wildner   } else if (StrCmp (SlaveMasterStr, "Slave") == 0) {
1142*4661c169SSascha Wildner     Atapi->SlaveMaster      = 1;
1143*4661c169SSascha Wildner   } else {
1144*4661c169SSascha Wildner     Atapi->SlaveMaster      = (UINT8) Strtoi (SlaveMasterStr);
1145*4661c169SSascha Wildner   }
1146*4661c169SSascha Wildner 
1147*4661c169SSascha Wildner   Atapi->Lun                = (UINT16) Strtoi (LunStr);
1148*4661c169SSascha Wildner 
1149*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
1150*4661c169SSascha Wildner }
1151*4661c169SSascha Wildner 
1152*4661c169SSascha Wildner /**
1153*4661c169SSascha Wildner   Converts a text device path node to SCSI device path structure.
1154*4661c169SSascha Wildner 
1155*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1156*4661c169SSascha Wildner 
1157*4661c169SSascha Wildner   @return A pointer to the newly-created SCSI device path structure.
1158*4661c169SSascha Wildner 
1159*4661c169SSascha Wildner **/
1160*4661c169SSascha Wildner static
1161*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextScsi(IN CHAR16 * TextDeviceNode)1162*4661c169SSascha Wildner DevPathFromTextScsi (
1163*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1164*4661c169SSascha Wildner   )
1165*4661c169SSascha Wildner {
1166*4661c169SSascha Wildner   CHAR16            *PunStr;
1167*4661c169SSascha Wildner   CHAR16            *LunStr;
1168*4661c169SSascha Wildner   SCSI_DEVICE_PATH  *Scsi;
1169*4661c169SSascha Wildner 
1170*4661c169SSascha Wildner   PunStr = GetNextParamStr (&TextDeviceNode);
1171*4661c169SSascha Wildner   LunStr = GetNextParamStr (&TextDeviceNode);
1172*4661c169SSascha Wildner   Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (
1173*4661c169SSascha Wildner                                    MESSAGING_DEVICE_PATH,
1174*4661c169SSascha Wildner                                    MSG_SCSI_DP,
1175*4661c169SSascha Wildner                                    (UINT16) sizeof (SCSI_DEVICE_PATH)
1176*4661c169SSascha Wildner                                    );
1177*4661c169SSascha Wildner 
1178*4661c169SSascha Wildner   Scsi->Pun = (UINT16) Strtoi (PunStr);
1179*4661c169SSascha Wildner   Scsi->Lun = (UINT16) Strtoi (LunStr);
1180*4661c169SSascha Wildner 
1181*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;
1182*4661c169SSascha Wildner }
1183*4661c169SSascha Wildner 
1184*4661c169SSascha Wildner /**
1185*4661c169SSascha Wildner   Converts a text device path node to Fibre device path structure.
1186*4661c169SSascha Wildner 
1187*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1188*4661c169SSascha Wildner 
1189*4661c169SSascha Wildner   @return A pointer to the newly-created Fibre device path structure.
1190*4661c169SSascha Wildner 
1191*4661c169SSascha Wildner **/
1192*4661c169SSascha Wildner static
1193*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibre(IN CHAR16 * TextDeviceNode)1194*4661c169SSascha Wildner DevPathFromTextFibre (
1195*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1196*4661c169SSascha Wildner   )
1197*4661c169SSascha Wildner {
1198*4661c169SSascha Wildner   CHAR16                    *WWNStr;
1199*4661c169SSascha Wildner   CHAR16                    *LunStr;
1200*4661c169SSascha Wildner   FIBRECHANNEL_DEVICE_PATH  *Fibre;
1201*4661c169SSascha Wildner 
1202*4661c169SSascha Wildner   WWNStr = GetNextParamStr (&TextDeviceNode);
1203*4661c169SSascha Wildner   LunStr = GetNextParamStr (&TextDeviceNode);
1204*4661c169SSascha Wildner   Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (
1205*4661c169SSascha Wildner                                           MESSAGING_DEVICE_PATH,
1206*4661c169SSascha Wildner                                           MSG_FIBRECHANNEL_DP,
1207*4661c169SSascha Wildner                                           (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)
1208*4661c169SSascha Wildner                                           );
1209*4661c169SSascha Wildner 
1210*4661c169SSascha Wildner   Fibre->Reserved = 0;
1211*4661c169SSascha Wildner   Strtoi64 (WWNStr, &Fibre->WWN);
1212*4661c169SSascha Wildner   Strtoi64 (LunStr, &Fibre->Lun);
1213*4661c169SSascha Wildner 
1214*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;
1215*4661c169SSascha Wildner }
1216*4661c169SSascha Wildner 
1217*4661c169SSascha Wildner /**
1218*4661c169SSascha Wildner   Converts a text device path node to FibreEx device path structure.
1219*4661c169SSascha Wildner 
1220*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1221*4661c169SSascha Wildner 
1222*4661c169SSascha Wildner   @return A pointer to the newly-created FibreEx device path structure.
1223*4661c169SSascha Wildner 
1224*4661c169SSascha Wildner **/
1225*4661c169SSascha Wildner static
1226*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFibreEx(IN CHAR16 * TextDeviceNode)1227*4661c169SSascha Wildner DevPathFromTextFibreEx (
1228*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1229*4661c169SSascha Wildner   )
1230*4661c169SSascha Wildner {
1231*4661c169SSascha Wildner   CHAR16                      *WWNStr;
1232*4661c169SSascha Wildner   CHAR16                      *LunStr;
1233*4661c169SSascha Wildner   FIBRECHANNELEX_DEVICE_PATH  *FibreEx;
1234*4661c169SSascha Wildner 
1235*4661c169SSascha Wildner   WWNStr  = GetNextParamStr (&TextDeviceNode);
1236*4661c169SSascha Wildner   LunStr  = GetNextParamStr (&TextDeviceNode);
1237*4661c169SSascha Wildner   FibreEx = (FIBRECHANNELEX_DEVICE_PATH *) CreateDeviceNode (
1238*4661c169SSascha Wildner                                              MESSAGING_DEVICE_PATH,
1239*4661c169SSascha Wildner                                              MSG_FIBRECHANNELEX_DP,
1240*4661c169SSascha Wildner                                              (UINT16) sizeof (FIBRECHANNELEX_DEVICE_PATH)
1241*4661c169SSascha Wildner                                              );
1242*4661c169SSascha Wildner 
1243*4661c169SSascha Wildner   FibreEx->Reserved = 0;
1244*4661c169SSascha Wildner   Strtoi64 (WWNStr, (UINT64 *) (&FibreEx->WWN));
1245*4661c169SSascha Wildner   Strtoi64 (LunStr, (UINT64 *) (&FibreEx->Lun));
1246*4661c169SSascha Wildner 
1247*4661c169SSascha Wildner   *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));
1248*4661c169SSascha Wildner   *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));
1249*4661c169SSascha Wildner 
1250*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;
1251*4661c169SSascha Wildner }
1252*4661c169SSascha Wildner 
1253*4661c169SSascha Wildner /**
1254*4661c169SSascha Wildner   Converts a text device path node to 1394 device path structure.
1255*4661c169SSascha Wildner 
1256*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1257*4661c169SSascha Wildner 
1258*4661c169SSascha Wildner   @return A pointer to the newly-created 1394 device path structure.
1259*4661c169SSascha Wildner 
1260*4661c169SSascha Wildner **/
1261*4661c169SSascha Wildner static
1262*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromText1394(IN CHAR16 * TextDeviceNode)1263*4661c169SSascha Wildner DevPathFromText1394 (
1264*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1265*4661c169SSascha Wildner   )
1266*4661c169SSascha Wildner {
1267*4661c169SSascha Wildner   CHAR16            *GuidStr;
1268*4661c169SSascha Wildner   F1394_DEVICE_PATH *F1394DevPath;
1269*4661c169SSascha Wildner 
1270*4661c169SSascha Wildner   GuidStr = GetNextParamStr (&TextDeviceNode);
1271*4661c169SSascha Wildner   F1394DevPath  = (F1394_DEVICE_PATH *) CreateDeviceNode (
1272*4661c169SSascha Wildner                                           MESSAGING_DEVICE_PATH,
1273*4661c169SSascha Wildner                                           MSG_1394_DP,
1274*4661c169SSascha Wildner                                           (UINT16) sizeof (F1394_DEVICE_PATH)
1275*4661c169SSascha Wildner                                           );
1276*4661c169SSascha Wildner 
1277*4661c169SSascha Wildner   F1394DevPath->Reserved = 0;
1278*4661c169SSascha Wildner   F1394DevPath->Guid     = StrHexToUint64 (GuidStr);
1279*4661c169SSascha Wildner 
1280*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;
1281*4661c169SSascha Wildner }
1282*4661c169SSascha Wildner 
1283*4661c169SSascha Wildner /**
1284*4661c169SSascha Wildner   Converts a text device path node to USB device path structure.
1285*4661c169SSascha Wildner 
1286*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1287*4661c169SSascha Wildner 
1288*4661c169SSascha Wildner   @return A pointer to the newly-created USB device path structure.
1289*4661c169SSascha Wildner 
1290*4661c169SSascha Wildner **/
1291*4661c169SSascha Wildner static
1292*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsb(IN CHAR16 * TextDeviceNode)1293*4661c169SSascha Wildner DevPathFromTextUsb (
1294*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1295*4661c169SSascha Wildner   )
1296*4661c169SSascha Wildner {
1297*4661c169SSascha Wildner   CHAR16          *PortStr;
1298*4661c169SSascha Wildner   CHAR16          *InterfaceStr;
1299*4661c169SSascha Wildner   USB_DEVICE_PATH *Usb;
1300*4661c169SSascha Wildner 
1301*4661c169SSascha Wildner   PortStr               = GetNextParamStr (&TextDeviceNode);
1302*4661c169SSascha Wildner   InterfaceStr          = GetNextParamStr (&TextDeviceNode);
1303*4661c169SSascha Wildner   Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (
1304*4661c169SSascha Wildner                                                 MESSAGING_DEVICE_PATH,
1305*4661c169SSascha Wildner                                                 MSG_USB_DP,
1306*4661c169SSascha Wildner                                                 (UINT16) sizeof (USB_DEVICE_PATH)
1307*4661c169SSascha Wildner                                                 );
1308*4661c169SSascha Wildner 
1309*4661c169SSascha Wildner   Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);
1310*4661c169SSascha Wildner   Usb->InterfaceNumber  = (UINT8) Strtoi (InterfaceStr);
1311*4661c169SSascha Wildner 
1312*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Usb;
1313*4661c169SSascha Wildner }
1314*4661c169SSascha Wildner 
1315*4661c169SSascha Wildner /**
1316*4661c169SSascha Wildner   Converts a text device path node to I20 device path structure.
1317*4661c169SSascha Wildner 
1318*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1319*4661c169SSascha Wildner 
1320*4661c169SSascha Wildner   @return A pointer to the newly-created I20 device path structure.
1321*4661c169SSascha Wildner 
1322*4661c169SSascha Wildner **/
1323*4661c169SSascha Wildner static
1324*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextI2O(IN CHAR16 * TextDeviceNode)1325*4661c169SSascha Wildner DevPathFromTextI2O (
1326*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1327*4661c169SSascha Wildner   )
1328*4661c169SSascha Wildner {
1329*4661c169SSascha Wildner   CHAR16          *TIDStr;
1330*4661c169SSascha Wildner   I2O_DEVICE_PATH *I2ODevPath;
1331*4661c169SSascha Wildner 
1332*4661c169SSascha Wildner   TIDStr     = GetNextParamStr (&TextDeviceNode);
1333*4661c169SSascha Wildner   I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (
1334*4661c169SSascha Wildner                                     MESSAGING_DEVICE_PATH,
1335*4661c169SSascha Wildner                                     MSG_I2O_DP,
1336*4661c169SSascha Wildner                                     (UINT16) sizeof (I2O_DEVICE_PATH)
1337*4661c169SSascha Wildner                                     );
1338*4661c169SSascha Wildner 
1339*4661c169SSascha Wildner   I2ODevPath->Tid  = (UINT32) Strtoi (TIDStr);
1340*4661c169SSascha Wildner 
1341*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;
1342*4661c169SSascha Wildner }
1343*4661c169SSascha Wildner 
1344*4661c169SSascha Wildner /**
1345*4661c169SSascha Wildner   Converts a text device path node to Infini Band device path structure.
1346*4661c169SSascha Wildner 
1347*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1348*4661c169SSascha Wildner 
1349*4661c169SSascha Wildner   @return A pointer to the newly-created Infini Band device path structure.
1350*4661c169SSascha Wildner 
1351*4661c169SSascha Wildner **/
1352*4661c169SSascha Wildner static
1353*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextInfiniband(IN CHAR16 * TextDeviceNode)1354*4661c169SSascha Wildner DevPathFromTextInfiniband (
1355*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1356*4661c169SSascha Wildner   )
1357*4661c169SSascha Wildner {
1358*4661c169SSascha Wildner   CHAR16                  *FlagsStr;
1359*4661c169SSascha Wildner   CHAR16                  *GuidStr;
1360*4661c169SSascha Wildner   CHAR16                  *SidStr;
1361*4661c169SSascha Wildner   CHAR16                  *TidStr;
1362*4661c169SSascha Wildner   CHAR16                  *DidStr;
1363*4661c169SSascha Wildner   INFINIBAND_DEVICE_PATH  *InfiniBand;
1364*4661c169SSascha Wildner 
1365*4661c169SSascha Wildner   FlagsStr   = GetNextParamStr (&TextDeviceNode);
1366*4661c169SSascha Wildner   GuidStr    = GetNextParamStr (&TextDeviceNode);
1367*4661c169SSascha Wildner   SidStr     = GetNextParamStr (&TextDeviceNode);
1368*4661c169SSascha Wildner   TidStr     = GetNextParamStr (&TextDeviceNode);
1369*4661c169SSascha Wildner   DidStr     = GetNextParamStr (&TextDeviceNode);
1370*4661c169SSascha Wildner   InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (
1371*4661c169SSascha Wildner                                             MESSAGING_DEVICE_PATH,
1372*4661c169SSascha Wildner                                             MSG_INFINIBAND_DP,
1373*4661c169SSascha Wildner                                             (UINT16) sizeof (INFINIBAND_DEVICE_PATH)
1374*4661c169SSascha Wildner                                             );
1375*4661c169SSascha Wildner 
1376*4661c169SSascha Wildner   InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);
1377*4661c169SSascha Wildner   StrToGuid (GuidStr, (EFI_GUID *) InfiniBand->PortGid);
1378*4661c169SSascha Wildner   Strtoi64 (SidStr, &InfiniBand->ServiceId);
1379*4661c169SSascha Wildner   Strtoi64 (TidStr, &InfiniBand->TargetPortId);
1380*4661c169SSascha Wildner   Strtoi64 (DidStr, &InfiniBand->DeviceId);
1381*4661c169SSascha Wildner 
1382*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;
1383*4661c169SSascha Wildner }
1384*4661c169SSascha Wildner 
1385*4661c169SSascha Wildner /**
1386*4661c169SSascha Wildner   Converts a text device path node to Vendor-Defined Messaging device path structure.
1387*4661c169SSascha Wildner 
1388*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1389*4661c169SSascha Wildner 
1390*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor-Defined Messaging device path structure.
1391*4661c169SSascha Wildner 
1392*4661c169SSascha Wildner **/
1393*4661c169SSascha Wildner static
1394*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMsg(IN CHAR16 * TextDeviceNode)1395*4661c169SSascha Wildner DevPathFromTextVenMsg (
1396*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1397*4661c169SSascha Wildner   )
1398*4661c169SSascha Wildner {
1399*4661c169SSascha Wildner   return ConvertFromTextVendor (
1400*4661c169SSascha Wildner             TextDeviceNode,
1401*4661c169SSascha Wildner             MESSAGING_DEVICE_PATH,
1402*4661c169SSascha Wildner             MSG_VENDOR_DP
1403*4661c169SSascha Wildner             );
1404*4661c169SSascha Wildner }
1405*4661c169SSascha Wildner 
1406*4661c169SSascha Wildner /**
1407*4661c169SSascha Wildner   Converts a text device path node to Vendor defined PC-ANSI device path structure.
1408*4661c169SSascha Wildner 
1409*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1410*4661c169SSascha Wildner 
1411*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.
1412*4661c169SSascha Wildner 
1413*4661c169SSascha Wildner **/
1414*4661c169SSascha Wildner static
1415*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenPcAnsi(IN CHAR16 * TextDeviceNode)1416*4661c169SSascha Wildner DevPathFromTextVenPcAnsi (
1417*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1418*4661c169SSascha Wildner   )
1419*4661c169SSascha Wildner {
1420*4661c169SSascha Wildner   VENDOR_DEVICE_PATH  *Vendor;
1421*4661c169SSascha Wildner 
1422*4661c169SSascha Wildner   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
1423*4661c169SSascha Wildner                                     MESSAGING_DEVICE_PATH,
1424*4661c169SSascha Wildner                                     MSG_VENDOR_DP,
1425*4661c169SSascha Wildner                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
1426*4661c169SSascha Wildner   CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
1427*4661c169SSascha Wildner 
1428*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
1429*4661c169SSascha Wildner }
1430*4661c169SSascha Wildner 
1431*4661c169SSascha Wildner /**
1432*4661c169SSascha Wildner   Converts a text device path node to Vendor defined VT100 device path structure.
1433*4661c169SSascha Wildner 
1434*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1435*4661c169SSascha Wildner 
1436*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor defined VT100 device path structure.
1437*4661c169SSascha Wildner 
1438*4661c169SSascha Wildner **/
1439*4661c169SSascha Wildner static
1440*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100(IN CHAR16 * TextDeviceNode)1441*4661c169SSascha Wildner DevPathFromTextVenVt100 (
1442*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1443*4661c169SSascha Wildner   )
1444*4661c169SSascha Wildner {
1445*4661c169SSascha Wildner   VENDOR_DEVICE_PATH  *Vendor;
1446*4661c169SSascha Wildner 
1447*4661c169SSascha Wildner   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
1448*4661c169SSascha Wildner                                     MESSAGING_DEVICE_PATH,
1449*4661c169SSascha Wildner                                     MSG_VENDOR_DP,
1450*4661c169SSascha Wildner                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
1451*4661c169SSascha Wildner   CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
1452*4661c169SSascha Wildner 
1453*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
1454*4661c169SSascha Wildner }
1455*4661c169SSascha Wildner 
1456*4661c169SSascha Wildner /**
1457*4661c169SSascha Wildner   Converts a text device path node to Vendor defined VT100 Plus device path structure.
1458*4661c169SSascha Wildner 
1459*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1460*4661c169SSascha Wildner 
1461*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.
1462*4661c169SSascha Wildner 
1463*4661c169SSascha Wildner **/
1464*4661c169SSascha Wildner static
1465*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenVt100Plus(IN CHAR16 * TextDeviceNode)1466*4661c169SSascha Wildner DevPathFromTextVenVt100Plus (
1467*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1468*4661c169SSascha Wildner   )
1469*4661c169SSascha Wildner {
1470*4661c169SSascha Wildner   VENDOR_DEVICE_PATH  *Vendor;
1471*4661c169SSascha Wildner 
1472*4661c169SSascha Wildner   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
1473*4661c169SSascha Wildner                                     MESSAGING_DEVICE_PATH,
1474*4661c169SSascha Wildner                                     MSG_VENDOR_DP,
1475*4661c169SSascha Wildner                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
1476*4661c169SSascha Wildner   CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
1477*4661c169SSascha Wildner 
1478*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
1479*4661c169SSascha Wildner }
1480*4661c169SSascha Wildner 
1481*4661c169SSascha Wildner /**
1482*4661c169SSascha Wildner   Converts a text device path node to Vendor defined UTF8 device path structure.
1483*4661c169SSascha Wildner 
1484*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1485*4661c169SSascha Wildner 
1486*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor defined UTF8 device path structure.
1487*4661c169SSascha Wildner 
1488*4661c169SSascha Wildner **/
1489*4661c169SSascha Wildner static
1490*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenUtf8(IN CHAR16 * TextDeviceNode)1491*4661c169SSascha Wildner DevPathFromTextVenUtf8 (
1492*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1493*4661c169SSascha Wildner   )
1494*4661c169SSascha Wildner {
1495*4661c169SSascha Wildner   VENDOR_DEVICE_PATH  *Vendor;
1496*4661c169SSascha Wildner 
1497*4661c169SSascha Wildner   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
1498*4661c169SSascha Wildner                                     MESSAGING_DEVICE_PATH,
1499*4661c169SSascha Wildner                                     MSG_VENDOR_DP,
1500*4661c169SSascha Wildner                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
1501*4661c169SSascha Wildner   CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
1502*4661c169SSascha Wildner 
1503*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
1504*4661c169SSascha Wildner }
1505*4661c169SSascha Wildner 
1506*4661c169SSascha Wildner /**
1507*4661c169SSascha Wildner   Converts a text device path node to UART Flow Control device path structure.
1508*4661c169SSascha Wildner 
1509*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1510*4661c169SSascha Wildner 
1511*4661c169SSascha Wildner   @return A pointer to the newly-created UART Flow Control device path structure.
1512*4661c169SSascha Wildner 
1513*4661c169SSascha Wildner **/
1514*4661c169SSascha Wildner static
1515*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUartFlowCtrl(IN CHAR16 * TextDeviceNode)1516*4661c169SSascha Wildner DevPathFromTextUartFlowCtrl (
1517*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1518*4661c169SSascha Wildner   )
1519*4661c169SSascha Wildner {
1520*4661c169SSascha Wildner   CHAR16                        *ValueStr;
1521*4661c169SSascha Wildner   UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
1522*4661c169SSascha Wildner 
1523*4661c169SSascha Wildner   ValueStr        = GetNextParamStr (&TextDeviceNode);
1524*4661c169SSascha Wildner   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (
1525*4661c169SSascha Wildner                                                         MESSAGING_DEVICE_PATH,
1526*4661c169SSascha Wildner                                                         MSG_VENDOR_DP,
1527*4661c169SSascha Wildner                                                         (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
1528*4661c169SSascha Wildner                                                         );
1529*4661c169SSascha Wildner 
1530*4661c169SSascha Wildner   CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);
1531*4661c169SSascha Wildner   if (StrCmp (ValueStr, "XonXoff") == 0) {
1532*4661c169SSascha Wildner     UartFlowControl->FlowControlMap = 2;
1533*4661c169SSascha Wildner   } else if (StrCmp (ValueStr, "Hardware") == 0) {
1534*4661c169SSascha Wildner     UartFlowControl->FlowControlMap = 1;
1535*4661c169SSascha Wildner   } else {
1536*4661c169SSascha Wildner     UartFlowControl->FlowControlMap = 0;
1537*4661c169SSascha Wildner   }
1538*4661c169SSascha Wildner 
1539*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;
1540*4661c169SSascha Wildner }
1541*4661c169SSascha Wildner 
1542*4661c169SSascha Wildner /**
1543*4661c169SSascha Wildner   Converts a text device path node to Serial Attached SCSI device path structure.
1544*4661c169SSascha Wildner 
1545*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1546*4661c169SSascha Wildner 
1547*4661c169SSascha Wildner   @return A pointer to the newly-created Serial Attached SCSI device path structure.
1548*4661c169SSascha Wildner 
1549*4661c169SSascha Wildner **/
1550*4661c169SSascha Wildner static
1551*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSAS(IN CHAR16 * TextDeviceNode)1552*4661c169SSascha Wildner DevPathFromTextSAS (
1553*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1554*4661c169SSascha Wildner   )
1555*4661c169SSascha Wildner {
1556*4661c169SSascha Wildner   CHAR16          *AddressStr;
1557*4661c169SSascha Wildner   CHAR16          *LunStr;
1558*4661c169SSascha Wildner   CHAR16          *RTPStr;
1559*4661c169SSascha Wildner   CHAR16          *SASSATAStr;
1560*4661c169SSascha Wildner   CHAR16          *LocationStr;
1561*4661c169SSascha Wildner   CHAR16          *ConnectStr;
1562*4661c169SSascha Wildner   CHAR16          *DriveBayStr;
1563*4661c169SSascha Wildner   CHAR16          *ReservedStr;
1564*4661c169SSascha Wildner   UINT16          Info;
1565*4661c169SSascha Wildner   UINT16          Uint16;
1566*4661c169SSascha Wildner   SAS_DEVICE_PATH *Sas;
1567*4661c169SSascha Wildner 
1568*4661c169SSascha Wildner   AddressStr  = GetNextParamStr (&TextDeviceNode);
1569*4661c169SSascha Wildner   LunStr      = GetNextParamStr (&TextDeviceNode);
1570*4661c169SSascha Wildner   RTPStr      = GetNextParamStr (&TextDeviceNode);
1571*4661c169SSascha Wildner   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
1572*4661c169SSascha Wildner   LocationStr = GetNextParamStr (&TextDeviceNode);
1573*4661c169SSascha Wildner   ConnectStr  = GetNextParamStr (&TextDeviceNode);
1574*4661c169SSascha Wildner   DriveBayStr = GetNextParamStr (&TextDeviceNode);
1575*4661c169SSascha Wildner   ReservedStr = GetNextParamStr (&TextDeviceNode);
1576*4661c169SSascha Wildner   Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (
1577*4661c169SSascha Wildner                                        MESSAGING_DEVICE_PATH,
1578*4661c169SSascha Wildner                                        MSG_VENDOR_DP,
1579*4661c169SSascha Wildner                                        (UINT16) sizeof (SAS_DEVICE_PATH)
1580*4661c169SSascha Wildner                                        );
1581*4661c169SSascha Wildner 
1582*4661c169SSascha Wildner   CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);
1583*4661c169SSascha Wildner   Strtoi64 (AddressStr, &Sas->SasAddress);
1584*4661c169SSascha Wildner   Strtoi64 (LunStr, &Sas->Lun);
1585*4661c169SSascha Wildner   Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);
1586*4661c169SSascha Wildner 
1587*4661c169SSascha Wildner   if (StrCmp (SASSATAStr, "NoTopology") == 0) {
1588*4661c169SSascha Wildner     Info = 0x0;
1589*4661c169SSascha Wildner 
1590*4661c169SSascha Wildner   } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
1591*4661c169SSascha Wildner 
1592*4661c169SSascha Wildner     Uint16 = (UINT16) Strtoi (DriveBayStr);
1593*4661c169SSascha Wildner     if (Uint16 == 0) {
1594*4661c169SSascha Wildner       Info = 0x1;
1595*4661c169SSascha Wildner     } else {
1596*4661c169SSascha Wildner       Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));
1597*4661c169SSascha Wildner     }
1598*4661c169SSascha Wildner 
1599*4661c169SSascha Wildner     if (StrCmp (SASSATAStr, "SATA") == 0) {
1600*4661c169SSascha Wildner       Info |= BIT4;
1601*4661c169SSascha Wildner     }
1602*4661c169SSascha Wildner 
1603*4661c169SSascha Wildner     //
1604*4661c169SSascha Wildner     // Location is an integer between 0 and 1 or else
1605*4661c169SSascha Wildner     // the keyword Internal (0) or External (1).
1606*4661c169SSascha Wildner     //
1607*4661c169SSascha Wildner     if (StrCmp (LocationStr, "External") == 0) {
1608*4661c169SSascha Wildner       Uint16 = 1;
1609*4661c169SSascha Wildner     } else if (StrCmp (LocationStr, "Internal") == 0) {
1610*4661c169SSascha Wildner       Uint16 = 0;
1611*4661c169SSascha Wildner     } else {
1612*4661c169SSascha Wildner       Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);
1613*4661c169SSascha Wildner     }
1614*4661c169SSascha Wildner     Info |= (Uint16 << 5);
1615*4661c169SSascha Wildner 
1616*4661c169SSascha Wildner     //
1617*4661c169SSascha Wildner     // Connect is an integer between 0 and 3 or else
1618*4661c169SSascha Wildner     // the keyword Direct (0) or Expanded (1).
1619*4661c169SSascha Wildner     //
1620*4661c169SSascha Wildner     if (StrCmp (ConnectStr, "Expanded") == 0) {
1621*4661c169SSascha Wildner       Uint16 = 1;
1622*4661c169SSascha Wildner     } else if (StrCmp (ConnectStr, "Direct") == 0) {
1623*4661c169SSascha Wildner       Uint16 = 0;
1624*4661c169SSascha Wildner     } else {
1625*4661c169SSascha Wildner       Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));
1626*4661c169SSascha Wildner     }
1627*4661c169SSascha Wildner     Info |= (Uint16 << 6);
1628*4661c169SSascha Wildner 
1629*4661c169SSascha Wildner   } else {
1630*4661c169SSascha Wildner     Info = (UINT16) Strtoi (SASSATAStr);
1631*4661c169SSascha Wildner   }
1632*4661c169SSascha Wildner 
1633*4661c169SSascha Wildner   Sas->DeviceTopology = Info;
1634*4661c169SSascha Wildner   Sas->Reserved       = (UINT32) Strtoi (ReservedStr);
1635*4661c169SSascha Wildner 
1636*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Sas;
1637*4661c169SSascha Wildner }
1638*4661c169SSascha Wildner 
1639*4661c169SSascha Wildner /**
1640*4661c169SSascha Wildner   Converts a text device path node to Serial Attached SCSI Ex device path structure.
1641*4661c169SSascha Wildner 
1642*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1643*4661c169SSascha Wildner 
1644*4661c169SSascha Wildner   @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.
1645*4661c169SSascha Wildner 
1646*4661c169SSascha Wildner **/
1647*4661c169SSascha Wildner static
1648*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSasEx(IN CHAR16 * TextDeviceNode)1649*4661c169SSascha Wildner DevPathFromTextSasEx (
1650*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1651*4661c169SSascha Wildner   )
1652*4661c169SSascha Wildner {
1653*4661c169SSascha Wildner   CHAR16            *AddressStr;
1654*4661c169SSascha Wildner   CHAR16            *LunStr;
1655*4661c169SSascha Wildner   CHAR16            *RTPStr;
1656*4661c169SSascha Wildner   CHAR16            *SASSATAStr;
1657*4661c169SSascha Wildner   CHAR16            *LocationStr;
1658*4661c169SSascha Wildner   CHAR16            *ConnectStr;
1659*4661c169SSascha Wildner   CHAR16            *DriveBayStr;
1660*4661c169SSascha Wildner   UINT16            Info;
1661*4661c169SSascha Wildner   UINT16            Uint16;
1662*4661c169SSascha Wildner   UINT64            SasAddress;
1663*4661c169SSascha Wildner   UINT64            Lun;
1664*4661c169SSascha Wildner   SASEX_DEVICE_PATH *SasEx;
1665*4661c169SSascha Wildner 
1666*4661c169SSascha Wildner   AddressStr  = GetNextParamStr (&TextDeviceNode);
1667*4661c169SSascha Wildner   LunStr      = GetNextParamStr (&TextDeviceNode);
1668*4661c169SSascha Wildner   RTPStr      = GetNextParamStr (&TextDeviceNode);
1669*4661c169SSascha Wildner   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
1670*4661c169SSascha Wildner   LocationStr = GetNextParamStr (&TextDeviceNode);
1671*4661c169SSascha Wildner   ConnectStr  = GetNextParamStr (&TextDeviceNode);
1672*4661c169SSascha Wildner   DriveBayStr = GetNextParamStr (&TextDeviceNode);
1673*4661c169SSascha Wildner   SasEx       = (SASEX_DEVICE_PATH *) CreateDeviceNode (
1674*4661c169SSascha Wildner                                         MESSAGING_DEVICE_PATH,
1675*4661c169SSascha Wildner                                         MSG_SASEX_DP,
1676*4661c169SSascha Wildner                                         (UINT16) sizeof (SASEX_DEVICE_PATH)
1677*4661c169SSascha Wildner                                         );
1678*4661c169SSascha Wildner 
1679*4661c169SSascha Wildner   Strtoi64 (AddressStr, &SasAddress);
1680*4661c169SSascha Wildner   Strtoi64 (LunStr,     &Lun);
1681*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &SasEx->SasAddress, SwapBytes64 (SasAddress));
1682*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &SasEx->Lun,        SwapBytes64 (Lun));
1683*4661c169SSascha Wildner   SasEx->RelativeTargetPort      = (UINT16) Strtoi (RTPStr);
1684*4661c169SSascha Wildner 
1685*4661c169SSascha Wildner   if (StrCmp (SASSATAStr, "NoTopology") == 0) {
1686*4661c169SSascha Wildner     Info = 0x0;
1687*4661c169SSascha Wildner 
1688*4661c169SSascha Wildner   } else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
1689*4661c169SSascha Wildner 
1690*4661c169SSascha Wildner     Uint16 = (UINT16) Strtoi (DriveBayStr);
1691*4661c169SSascha Wildner     if (Uint16 == 0) {
1692*4661c169SSascha Wildner       Info = 0x1;
1693*4661c169SSascha Wildner     } else {
1694*4661c169SSascha Wildner       Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));
1695*4661c169SSascha Wildner     }
1696*4661c169SSascha Wildner 
1697*4661c169SSascha Wildner     if (StrCmp (SASSATAStr, "SATA") == 0) {
1698*4661c169SSascha Wildner       Info |= BIT4;
1699*4661c169SSascha Wildner     }
1700*4661c169SSascha Wildner 
1701*4661c169SSascha Wildner     //
1702*4661c169SSascha Wildner     // Location is an integer between 0 and 1 or else
1703*4661c169SSascha Wildner     // the keyword Internal (0) or External (1).
1704*4661c169SSascha Wildner     //
1705*4661c169SSascha Wildner     if (StrCmp (LocationStr, "External") == 0) {
1706*4661c169SSascha Wildner       Uint16 = 1;
1707*4661c169SSascha Wildner     } else if (StrCmp (LocationStr, "Internal") == 0) {
1708*4661c169SSascha Wildner       Uint16 = 0;
1709*4661c169SSascha Wildner     } else {
1710*4661c169SSascha Wildner       Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);
1711*4661c169SSascha Wildner     }
1712*4661c169SSascha Wildner     Info |= (Uint16 << 5);
1713*4661c169SSascha Wildner 
1714*4661c169SSascha Wildner     //
1715*4661c169SSascha Wildner     // Connect is an integer between 0 and 3 or else
1716*4661c169SSascha Wildner     // the keyword Direct (0) or Expanded (1).
1717*4661c169SSascha Wildner     //
1718*4661c169SSascha Wildner     if (StrCmp (ConnectStr, "Expanded") == 0) {
1719*4661c169SSascha Wildner       Uint16 = 1;
1720*4661c169SSascha Wildner     } else if (StrCmp (ConnectStr, "Direct") == 0) {
1721*4661c169SSascha Wildner       Uint16 = 0;
1722*4661c169SSascha Wildner     } else {
1723*4661c169SSascha Wildner       Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));
1724*4661c169SSascha Wildner     }
1725*4661c169SSascha Wildner     Info |= (Uint16 << 6);
1726*4661c169SSascha Wildner 
1727*4661c169SSascha Wildner   } else {
1728*4661c169SSascha Wildner     Info = (UINT16) Strtoi (SASSATAStr);
1729*4661c169SSascha Wildner   }
1730*4661c169SSascha Wildner 
1731*4661c169SSascha Wildner   SasEx->DeviceTopology = Info;
1732*4661c169SSascha Wildner 
1733*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;
1734*4661c169SSascha Wildner }
1735*4661c169SSascha Wildner 
1736*4661c169SSascha Wildner /**
1737*4661c169SSascha Wildner   Converts a text device path node to NVM Express Namespace device path structure.
1738*4661c169SSascha Wildner 
1739*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1740*4661c169SSascha Wildner 
1741*4661c169SSascha Wildner   @return A pointer to the newly-created NVM Express Namespace device path structure.
1742*4661c169SSascha Wildner 
1743*4661c169SSascha Wildner **/
1744*4661c169SSascha Wildner static
1745*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextNVMe(IN CHAR16 * TextDeviceNode)1746*4661c169SSascha Wildner DevPathFromTextNVMe (
1747*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1748*4661c169SSascha Wildner   )
1749*4661c169SSascha Wildner {
1750*4661c169SSascha Wildner   CHAR16                     *NamespaceIdStr;
1751*4661c169SSascha Wildner   CHAR16                     *NamespaceUuidStr;
1752*4661c169SSascha Wildner   NVME_NAMESPACE_DEVICE_PATH *Nvme;
1753*4661c169SSascha Wildner   UINT8                      *Uuid;
1754*4661c169SSascha Wildner   UINTN                      Index;
1755*4661c169SSascha Wildner 
1756*4661c169SSascha Wildner   NamespaceIdStr   = GetNextParamStr (&TextDeviceNode);
1757*4661c169SSascha Wildner   NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);
1758*4661c169SSascha Wildner   Nvme = (NVME_NAMESPACE_DEVICE_PATH *) CreateDeviceNode (
1759*4661c169SSascha Wildner     MESSAGING_DEVICE_PATH,
1760*4661c169SSascha Wildner     MSG_NVME_NAMESPACE_DP,
1761*4661c169SSascha Wildner     (UINT16) sizeof (NVME_NAMESPACE_DEVICE_PATH)
1762*4661c169SSascha Wildner     );
1763*4661c169SSascha Wildner 
1764*4661c169SSascha Wildner   Nvme->NamespaceId = (UINT32) Strtoi (NamespaceIdStr);
1765*4661c169SSascha Wildner   Uuid = (UINT8 *) &Nvme->NamespaceUuid;
1766*4661c169SSascha Wildner 
1767*4661c169SSascha Wildner   Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);
1768*4661c169SSascha Wildner   while (Index-- != 0) {
1769*4661c169SSascha Wildner     Uuid[Index] = (UINT8) StrHexToUintn (SplitStr (&NamespaceUuidStr, '-'));
1770*4661c169SSascha Wildner   }
1771*4661c169SSascha Wildner 
1772*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Nvme;
1773*4661c169SSascha Wildner }
1774*4661c169SSascha Wildner 
1775*4661c169SSascha Wildner /**
1776*4661c169SSascha Wildner   Converts a text device path node to UFS device path structure.
1777*4661c169SSascha Wildner 
1778*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1779*4661c169SSascha Wildner 
1780*4661c169SSascha Wildner   @return A pointer to the newly-created UFS device path structure.
1781*4661c169SSascha Wildner 
1782*4661c169SSascha Wildner **/
1783*4661c169SSascha Wildner static
1784*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUfs(IN CHAR16 * TextDeviceNode)1785*4661c169SSascha Wildner DevPathFromTextUfs (
1786*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1787*4661c169SSascha Wildner   )
1788*4661c169SSascha Wildner {
1789*4661c169SSascha Wildner   CHAR16            *PunStr;
1790*4661c169SSascha Wildner   CHAR16            *LunStr;
1791*4661c169SSascha Wildner   UFS_DEVICE_PATH   *Ufs;
1792*4661c169SSascha Wildner 
1793*4661c169SSascha Wildner   PunStr = GetNextParamStr (&TextDeviceNode);
1794*4661c169SSascha Wildner   LunStr = GetNextParamStr (&TextDeviceNode);
1795*4661c169SSascha Wildner   Ufs    = (UFS_DEVICE_PATH *) CreateDeviceNode (
1796*4661c169SSascha Wildner                                  MESSAGING_DEVICE_PATH,
1797*4661c169SSascha Wildner                                  MSG_UFS_DP,
1798*4661c169SSascha Wildner                                  (UINT16) sizeof (UFS_DEVICE_PATH)
1799*4661c169SSascha Wildner                                  );
1800*4661c169SSascha Wildner 
1801*4661c169SSascha Wildner   Ufs->Pun = (UINT8) Strtoi (PunStr);
1802*4661c169SSascha Wildner   Ufs->Lun = (UINT8) Strtoi (LunStr);
1803*4661c169SSascha Wildner 
1804*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Ufs;
1805*4661c169SSascha Wildner }
1806*4661c169SSascha Wildner 
1807*4661c169SSascha Wildner /**
1808*4661c169SSascha Wildner   Converts a text device path node to SD (Secure Digital) device path structure.
1809*4661c169SSascha Wildner 
1810*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1811*4661c169SSascha Wildner 
1812*4661c169SSascha Wildner   @return A pointer to the newly-created SD device path structure.
1813*4661c169SSascha Wildner 
1814*4661c169SSascha Wildner **/
1815*4661c169SSascha Wildner static
1816*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSd(IN CHAR16 * TextDeviceNode)1817*4661c169SSascha Wildner DevPathFromTextSd (
1818*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1819*4661c169SSascha Wildner   )
1820*4661c169SSascha Wildner {
1821*4661c169SSascha Wildner   CHAR16            *SlotNumberStr;
1822*4661c169SSascha Wildner   SD_DEVICE_PATH    *Sd;
1823*4661c169SSascha Wildner 
1824*4661c169SSascha Wildner   SlotNumberStr = GetNextParamStr (&TextDeviceNode);
1825*4661c169SSascha Wildner   Sd            = (SD_DEVICE_PATH *) CreateDeviceNode (
1826*4661c169SSascha Wildner                                        MESSAGING_DEVICE_PATH,
1827*4661c169SSascha Wildner                                        MSG_SD_DP,
1828*4661c169SSascha Wildner                                        (UINT16) sizeof (SD_DEVICE_PATH)
1829*4661c169SSascha Wildner                                        );
1830*4661c169SSascha Wildner 
1831*4661c169SSascha Wildner   Sd->SlotNumber = (UINT8) Strtoi (SlotNumberStr);
1832*4661c169SSascha Wildner 
1833*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Sd;
1834*4661c169SSascha Wildner }
1835*4661c169SSascha Wildner 
1836*4661c169SSascha Wildner /**
1837*4661c169SSascha Wildner   Converts a text device path node to EMMC (Embedded MMC) device path structure.
1838*4661c169SSascha Wildner 
1839*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1840*4661c169SSascha Wildner 
1841*4661c169SSascha Wildner   @return A pointer to the newly-created EMMC device path structure.
1842*4661c169SSascha Wildner 
1843*4661c169SSascha Wildner **/
1844*4661c169SSascha Wildner static
1845*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextEmmc(IN CHAR16 * TextDeviceNode)1846*4661c169SSascha Wildner DevPathFromTextEmmc (
1847*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1848*4661c169SSascha Wildner   )
1849*4661c169SSascha Wildner {
1850*4661c169SSascha Wildner   CHAR16            *SlotNumberStr;
1851*4661c169SSascha Wildner   EMMC_DEVICE_PATH  *Emmc;
1852*4661c169SSascha Wildner 
1853*4661c169SSascha Wildner   SlotNumberStr = GetNextParamStr (&TextDeviceNode);
1854*4661c169SSascha Wildner   Emmc          = (EMMC_DEVICE_PATH *) CreateDeviceNode (
1855*4661c169SSascha Wildner                                        MESSAGING_DEVICE_PATH,
1856*4661c169SSascha Wildner                                        MSG_EMMC_DP,
1857*4661c169SSascha Wildner                                        (UINT16) sizeof (EMMC_DEVICE_PATH)
1858*4661c169SSascha Wildner                                        );
1859*4661c169SSascha Wildner 
1860*4661c169SSascha Wildner   Emmc->SlotNumber = (UINT8) Strtoi (SlotNumberStr);
1861*4661c169SSascha Wildner 
1862*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Emmc;
1863*4661c169SSascha Wildner }
1864*4661c169SSascha Wildner 
1865*4661c169SSascha Wildner /**
1866*4661c169SSascha Wildner   Converts a text device path node to Debug Port device path structure.
1867*4661c169SSascha Wildner 
1868*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1869*4661c169SSascha Wildner 
1870*4661c169SSascha Wildner   @return A pointer to the newly-created Debug Port device path structure.
1871*4661c169SSascha Wildner 
1872*4661c169SSascha Wildner **/
1873*4661c169SSascha Wildner static
1874*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextDebugPort(IN CHAR16 * TextDeviceNode)1875*4661c169SSascha Wildner DevPathFromTextDebugPort (
1876*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1877*4661c169SSascha Wildner   )
1878*4661c169SSascha Wildner {
1879*4661c169SSascha Wildner   VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;
1880*4661c169SSascha Wildner 
1881*4661c169SSascha Wildner   Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (
1882*4661c169SSascha Wildner                                                     MESSAGING_DEVICE_PATH,
1883*4661c169SSascha Wildner                                                     MSG_VENDOR_DP,
1884*4661c169SSascha Wildner                                                     (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)
1885*4661c169SSascha Wildner                                                     );
1886*4661c169SSascha Wildner 
1887*4661c169SSascha Wildner   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
1888*4661c169SSascha Wildner 
1889*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vend;
1890*4661c169SSascha Wildner }
1891*4661c169SSascha Wildner 
1892*4661c169SSascha Wildner /**
1893*4661c169SSascha Wildner   Converts a text device path node to MAC device path structure.
1894*4661c169SSascha Wildner 
1895*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1896*4661c169SSascha Wildner 
1897*4661c169SSascha Wildner   @return A pointer to the newly-created MAC device path structure.
1898*4661c169SSascha Wildner 
1899*4661c169SSascha Wildner **/
1900*4661c169SSascha Wildner static
1901*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMAC(IN CHAR16 * TextDeviceNode)1902*4661c169SSascha Wildner DevPathFromTextMAC (
1903*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1904*4661c169SSascha Wildner   )
1905*4661c169SSascha Wildner {
1906*4661c169SSascha Wildner   CHAR16                *AddressStr;
1907*4661c169SSascha Wildner   CHAR16                *IfTypeStr;
1908*4661c169SSascha Wildner   UINTN                 Length;
1909*4661c169SSascha Wildner   MAC_ADDR_DEVICE_PATH  *MACDevPath;
1910*4661c169SSascha Wildner 
1911*4661c169SSascha Wildner   AddressStr    = GetNextParamStr (&TextDeviceNode);
1912*4661c169SSascha Wildner   IfTypeStr     = GetNextParamStr (&TextDeviceNode);
1913*4661c169SSascha Wildner   MACDevPath    = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (
1914*4661c169SSascha Wildner                                               MESSAGING_DEVICE_PATH,
1915*4661c169SSascha Wildner                                               MSG_MAC_ADDR_DP,
1916*4661c169SSascha Wildner                                               (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)
1917*4661c169SSascha Wildner                                               );
1918*4661c169SSascha Wildner 
1919*4661c169SSascha Wildner   MACDevPath->IfType   = (UINT8) Strtoi (IfTypeStr);
1920*4661c169SSascha Wildner 
1921*4661c169SSascha Wildner   Length = sizeof (EFI_MAC_ADDRESS);
1922*4661c169SSascha Wildner   StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);
1923*4661c169SSascha Wildner 
1924*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;
1925*4661c169SSascha Wildner }
1926*4661c169SSascha Wildner 
1927*4661c169SSascha Wildner 
1928*4661c169SSascha Wildner /**
1929*4661c169SSascha Wildner   Converts a text format to the network protocol ID.
1930*4661c169SSascha Wildner 
1931*4661c169SSascha Wildner   @param Text  String of protocol field.
1932*4661c169SSascha Wildner 
1933*4661c169SSascha Wildner   @return Network protocol ID .
1934*4661c169SSascha Wildner 
1935*4661c169SSascha Wildner **/
1936*4661c169SSascha Wildner static
1937*4661c169SSascha Wildner UINTN
NetworkProtocolFromText(IN CHAR16 * Text)1938*4661c169SSascha Wildner NetworkProtocolFromText (
1939*4661c169SSascha Wildner   IN CHAR16 *Text
1940*4661c169SSascha Wildner   )
1941*4661c169SSascha Wildner {
1942*4661c169SSascha Wildner   if (StrCmp (Text, "UDP") == 0) {
1943*4661c169SSascha Wildner     return RFC_1700_UDP_PROTOCOL;
1944*4661c169SSascha Wildner   }
1945*4661c169SSascha Wildner 
1946*4661c169SSascha Wildner   if (StrCmp (Text, "TCP") == 0) {
1947*4661c169SSascha Wildner     return RFC_1700_TCP_PROTOCOL;
1948*4661c169SSascha Wildner   }
1949*4661c169SSascha Wildner 
1950*4661c169SSascha Wildner   return Strtoi (Text);
1951*4661c169SSascha Wildner }
1952*4661c169SSascha Wildner 
1953*4661c169SSascha Wildner 
1954*4661c169SSascha Wildner /**
1955*4661c169SSascha Wildner   Converts a text device path node to IPV4 device path structure.
1956*4661c169SSascha Wildner 
1957*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
1958*4661c169SSascha Wildner 
1959*4661c169SSascha Wildner   @return A pointer to the newly-created IPV4 device path structure.
1960*4661c169SSascha Wildner 
1961*4661c169SSascha Wildner **/
1962*4661c169SSascha Wildner static
1963*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv4(IN CHAR16 * TextDeviceNode)1964*4661c169SSascha Wildner DevPathFromTextIPv4 (
1965*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
1966*4661c169SSascha Wildner   )
1967*4661c169SSascha Wildner {
1968*4661c169SSascha Wildner   CHAR16            *RemoteIPStr;
1969*4661c169SSascha Wildner   CHAR16            *ProtocolStr;
1970*4661c169SSascha Wildner   CHAR16            *TypeStr;
1971*4661c169SSascha Wildner   CHAR16            *LocalIPStr;
1972*4661c169SSascha Wildner   CHAR16            *GatewayIPStr;
1973*4661c169SSascha Wildner   CHAR16            *SubnetMaskStr;
1974*4661c169SSascha Wildner   IPv4_DEVICE_PATH  *IPv4;
1975*4661c169SSascha Wildner 
1976*4661c169SSascha Wildner   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
1977*4661c169SSascha Wildner   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
1978*4661c169SSascha Wildner   TypeStr               = GetNextParamStr (&TextDeviceNode);
1979*4661c169SSascha Wildner   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
1980*4661c169SSascha Wildner   GatewayIPStr          = GetNextParamStr (&TextDeviceNode);
1981*4661c169SSascha Wildner   SubnetMaskStr         = GetNextParamStr (&TextDeviceNode);
1982*4661c169SSascha Wildner   IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (
1983*4661c169SSascha Wildner                                                  MESSAGING_DEVICE_PATH,
1984*4661c169SSascha Wildner                                                  MSG_IPv4_DP,
1985*4661c169SSascha Wildner                                                  (UINT16) sizeof (IPv4_DEVICE_PATH)
1986*4661c169SSascha Wildner                                                  );
1987*4661c169SSascha Wildner 
1988*4661c169SSascha Wildner   StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);
1989*4661c169SSascha Wildner   IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);
1990*4661c169SSascha Wildner   if (StrCmp (TypeStr, "Static") == 0) {
1991*4661c169SSascha Wildner     IPv4->StaticIpAddress = TRUE;
1992*4661c169SSascha Wildner   } else {
1993*4661c169SSascha Wildner     IPv4->StaticIpAddress = FALSE;
1994*4661c169SSascha Wildner   }
1995*4661c169SSascha Wildner 
1996*4661c169SSascha Wildner   StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);
1997*4661c169SSascha Wildner   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {
1998*4661c169SSascha Wildner     StrToIpv4Address (GatewayIPStr,  NULL, &IPv4->GatewayIpAddress, NULL);
1999*4661c169SSascha Wildner     StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask,       NULL);
2000*4661c169SSascha Wildner   } else {
2001*4661c169SSascha Wildner     ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));
2002*4661c169SSascha Wildner     ZeroMem (&IPv4->SubnetMask,    sizeof (IPv4->SubnetMask));
2003*4661c169SSascha Wildner   }
2004*4661c169SSascha Wildner 
2005*4661c169SSascha Wildner   IPv4->LocalPort       = 0;
2006*4661c169SSascha Wildner   IPv4->RemotePort      = 0;
2007*4661c169SSascha Wildner 
2008*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;
2009*4661c169SSascha Wildner }
2010*4661c169SSascha Wildner 
2011*4661c169SSascha Wildner /**
2012*4661c169SSascha Wildner   Converts a text device path node to IPV6 device path structure.
2013*4661c169SSascha Wildner 
2014*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2015*4661c169SSascha Wildner 
2016*4661c169SSascha Wildner   @return A pointer to the newly-created IPV6 device path structure.
2017*4661c169SSascha Wildner 
2018*4661c169SSascha Wildner **/
2019*4661c169SSascha Wildner static
2020*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextIPv6(IN CHAR16 * TextDeviceNode)2021*4661c169SSascha Wildner DevPathFromTextIPv6 (
2022*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2023*4661c169SSascha Wildner   )
2024*4661c169SSascha Wildner {
2025*4661c169SSascha Wildner   CHAR16            *RemoteIPStr;
2026*4661c169SSascha Wildner   CHAR16            *ProtocolStr;
2027*4661c169SSascha Wildner   CHAR16            *TypeStr;
2028*4661c169SSascha Wildner   CHAR16            *LocalIPStr;
2029*4661c169SSascha Wildner   CHAR16            *GatewayIPStr;
2030*4661c169SSascha Wildner   CHAR16            *PrefixLengthStr;
2031*4661c169SSascha Wildner   IPv6_DEVICE_PATH  *IPv6;
2032*4661c169SSascha Wildner 
2033*4661c169SSascha Wildner   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
2034*4661c169SSascha Wildner   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
2035*4661c169SSascha Wildner   TypeStr               = GetNextParamStr (&TextDeviceNode);
2036*4661c169SSascha Wildner   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
2037*4661c169SSascha Wildner   PrefixLengthStr       = GetNextParamStr (&TextDeviceNode);
2038*4661c169SSascha Wildner   GatewayIPStr          = GetNextParamStr (&TextDeviceNode);
2039*4661c169SSascha Wildner   IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (
2040*4661c169SSascha Wildner                                                  MESSAGING_DEVICE_PATH,
2041*4661c169SSascha Wildner                                                  MSG_IPv6_DP,
2042*4661c169SSascha Wildner                                                  (UINT16) sizeof (IPv6_DEVICE_PATH)
2043*4661c169SSascha Wildner                                                  );
2044*4661c169SSascha Wildner 
2045*4661c169SSascha Wildner   StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);
2046*4661c169SSascha Wildner   IPv6->Protocol        = (UINT16) NetworkProtocolFromText (ProtocolStr);
2047*4661c169SSascha Wildner   if (StrCmp (TypeStr, "Static") == 0) {
2048*4661c169SSascha Wildner     IPv6->IpAddressOrigin = 0;
2049*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "StatelessAutoConfigure") == 0) {
2050*4661c169SSascha Wildner     IPv6->IpAddressOrigin = 1;
2051*4661c169SSascha Wildner   } else {
2052*4661c169SSascha Wildner     IPv6->IpAddressOrigin = 2;
2053*4661c169SSascha Wildner   }
2054*4661c169SSascha Wildner 
2055*4661c169SSascha Wildner   StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);
2056*4661c169SSascha Wildner   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {
2057*4661c169SSascha Wildner     StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);
2058*4661c169SSascha Wildner     IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);
2059*4661c169SSascha Wildner   } else {
2060*4661c169SSascha Wildner     ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));
2061*4661c169SSascha Wildner     IPv6->PrefixLength = 0;
2062*4661c169SSascha Wildner   }
2063*4661c169SSascha Wildner 
2064*4661c169SSascha Wildner   IPv6->LocalPort       = 0;
2065*4661c169SSascha Wildner   IPv6->RemotePort      = 0;
2066*4661c169SSascha Wildner 
2067*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;
2068*4661c169SSascha Wildner }
2069*4661c169SSascha Wildner 
2070*4661c169SSascha Wildner /**
2071*4661c169SSascha Wildner   Converts a text device path node to UART device path structure.
2072*4661c169SSascha Wildner 
2073*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2074*4661c169SSascha Wildner 
2075*4661c169SSascha Wildner   @return A pointer to the newly-created UART device path structure.
2076*4661c169SSascha Wildner 
2077*4661c169SSascha Wildner **/
2078*4661c169SSascha Wildner static
2079*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUart(IN CHAR16 * TextDeviceNode)2080*4661c169SSascha Wildner DevPathFromTextUart (
2081*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2082*4661c169SSascha Wildner   )
2083*4661c169SSascha Wildner {
2084*4661c169SSascha Wildner   CHAR16            *BaudStr;
2085*4661c169SSascha Wildner   CHAR16            *DataBitsStr;
2086*4661c169SSascha Wildner   CHAR16            *ParityStr;
2087*4661c169SSascha Wildner   CHAR16            *StopBitsStr;
2088*4661c169SSascha Wildner   UART_DEVICE_PATH  *Uart;
2089*4661c169SSascha Wildner 
2090*4661c169SSascha Wildner   BaudStr         = GetNextParamStr (&TextDeviceNode);
2091*4661c169SSascha Wildner   DataBitsStr     = GetNextParamStr (&TextDeviceNode);
2092*4661c169SSascha Wildner   ParityStr       = GetNextParamStr (&TextDeviceNode);
2093*4661c169SSascha Wildner   StopBitsStr     = GetNextParamStr (&TextDeviceNode);
2094*4661c169SSascha Wildner   Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (
2095*4661c169SSascha Wildner                                            MESSAGING_DEVICE_PATH,
2096*4661c169SSascha Wildner                                            MSG_UART_DP,
2097*4661c169SSascha Wildner                                            (UINT16) sizeof (UART_DEVICE_PATH)
2098*4661c169SSascha Wildner                                            );
2099*4661c169SSascha Wildner 
2100*4661c169SSascha Wildner   if (StrCmp (BaudStr, "DEFAULT") == 0) {
2101*4661c169SSascha Wildner     Uart->BaudRate = 115200;
2102*4661c169SSascha Wildner   } else {
2103*4661c169SSascha Wildner     Strtoi64 (BaudStr, &Uart->BaudRate);
2104*4661c169SSascha Wildner   }
2105*4661c169SSascha Wildner   Uart->DataBits  = (UINT8) ((StrCmp (DataBitsStr, "DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
2106*4661c169SSascha Wildner   switch (*ParityStr) {
2107*4661c169SSascha Wildner   case 'D':
2108*4661c169SSascha Wildner     Uart->Parity = 0;
2109*4661c169SSascha Wildner     break;
2110*4661c169SSascha Wildner 
2111*4661c169SSascha Wildner   case 'N':
2112*4661c169SSascha Wildner     Uart->Parity = 1;
2113*4661c169SSascha Wildner     break;
2114*4661c169SSascha Wildner 
2115*4661c169SSascha Wildner   case 'E':
2116*4661c169SSascha Wildner     Uart->Parity = 2;
2117*4661c169SSascha Wildner     break;
2118*4661c169SSascha Wildner 
2119*4661c169SSascha Wildner   case 'O':
2120*4661c169SSascha Wildner     Uart->Parity = 3;
2121*4661c169SSascha Wildner     break;
2122*4661c169SSascha Wildner 
2123*4661c169SSascha Wildner   case 'M':
2124*4661c169SSascha Wildner     Uart->Parity = 4;
2125*4661c169SSascha Wildner     break;
2126*4661c169SSascha Wildner 
2127*4661c169SSascha Wildner   case 'S':
2128*4661c169SSascha Wildner     Uart->Parity = 5;
2129*4661c169SSascha Wildner     break;
2130*4661c169SSascha Wildner 
2131*4661c169SSascha Wildner   default:
2132*4661c169SSascha Wildner     Uart->Parity = (UINT8) Strtoi (ParityStr);
2133*4661c169SSascha Wildner     break;
2134*4661c169SSascha Wildner   }
2135*4661c169SSascha Wildner 
2136*4661c169SSascha Wildner   if (StrCmp (StopBitsStr, "D") == 0) {
2137*4661c169SSascha Wildner     Uart->StopBits = (UINT8) 0;
2138*4661c169SSascha Wildner   } else if (StrCmp (StopBitsStr, "1") == 0) {
2139*4661c169SSascha Wildner     Uart->StopBits = (UINT8) 1;
2140*4661c169SSascha Wildner   } else if (StrCmp (StopBitsStr, "1.5") == 0) {
2141*4661c169SSascha Wildner     Uart->StopBits = (UINT8) 2;
2142*4661c169SSascha Wildner   } else if (StrCmp (StopBitsStr, "2") == 0) {
2143*4661c169SSascha Wildner     Uart->StopBits = (UINT8) 3;
2144*4661c169SSascha Wildner   } else {
2145*4661c169SSascha Wildner     Uart->StopBits = (UINT8) Strtoi (StopBitsStr);
2146*4661c169SSascha Wildner   }
2147*4661c169SSascha Wildner 
2148*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Uart;
2149*4661c169SSascha Wildner }
2150*4661c169SSascha Wildner 
2151*4661c169SSascha Wildner /**
2152*4661c169SSascha Wildner   Converts a text device path node to USB class device path structure.
2153*4661c169SSascha Wildner 
2154*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2155*4661c169SSascha Wildner   @param UsbClassText    A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.
2156*4661c169SSascha Wildner 
2157*4661c169SSascha Wildner   @return A pointer to the newly-created USB class device path structure.
2158*4661c169SSascha Wildner 
2159*4661c169SSascha Wildner **/
2160*4661c169SSascha Wildner static
2161*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
ConvertFromTextUsbClass(IN CHAR16 * TextDeviceNode,IN USB_CLASS_TEXT * UsbClassText)2162*4661c169SSascha Wildner ConvertFromTextUsbClass (
2163*4661c169SSascha Wildner   IN CHAR16         *TextDeviceNode,
2164*4661c169SSascha Wildner   IN USB_CLASS_TEXT *UsbClassText
2165*4661c169SSascha Wildner   )
2166*4661c169SSascha Wildner {
2167*4661c169SSascha Wildner   CHAR16                *VIDStr;
2168*4661c169SSascha Wildner   CHAR16                *PIDStr;
2169*4661c169SSascha Wildner   CHAR16                *ClassStr;
2170*4661c169SSascha Wildner   CHAR16                *SubClassStr;
2171*4661c169SSascha Wildner   CHAR16                *ProtocolStr;
2172*4661c169SSascha Wildner   USB_CLASS_DEVICE_PATH *UsbClass;
2173*4661c169SSascha Wildner 
2174*4661c169SSascha Wildner   UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (
2175*4661c169SSascha Wildner                                             MESSAGING_DEVICE_PATH,
2176*4661c169SSascha Wildner                                             MSG_USB_CLASS_DP,
2177*4661c169SSascha Wildner                                             (UINT16) sizeof (USB_CLASS_DEVICE_PATH)
2178*4661c169SSascha Wildner                                             );
2179*4661c169SSascha Wildner 
2180*4661c169SSascha Wildner   VIDStr      = GetNextParamStr (&TextDeviceNode);
2181*4661c169SSascha Wildner   PIDStr      = GetNextParamStr (&TextDeviceNode);
2182*4661c169SSascha Wildner   if (UsbClassText->ClassExist) {
2183*4661c169SSascha Wildner     ClassStr = GetNextParamStr (&TextDeviceNode);
2184*4661c169SSascha Wildner     UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);
2185*4661c169SSascha Wildner   } else {
2186*4661c169SSascha Wildner     UsbClass->DeviceClass = UsbClassText->Class;
2187*4661c169SSascha Wildner   }
2188*4661c169SSascha Wildner   if (UsbClassText->SubClassExist) {
2189*4661c169SSascha Wildner     SubClassStr = GetNextParamStr (&TextDeviceNode);
2190*4661c169SSascha Wildner     UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);
2191*4661c169SSascha Wildner   } else {
2192*4661c169SSascha Wildner     UsbClass->DeviceSubClass = UsbClassText->SubClass;
2193*4661c169SSascha Wildner   }
2194*4661c169SSascha Wildner 
2195*4661c169SSascha Wildner   ProtocolStr = GetNextParamStr (&TextDeviceNode);
2196*4661c169SSascha Wildner 
2197*4661c169SSascha Wildner   UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);
2198*4661c169SSascha Wildner   UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);
2199*4661c169SSascha Wildner   UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);
2200*4661c169SSascha Wildner 
2201*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;
2202*4661c169SSascha Wildner }
2203*4661c169SSascha Wildner 
2204*4661c169SSascha Wildner 
2205*4661c169SSascha Wildner /**
2206*4661c169SSascha Wildner   Converts a text device path node to USB class device path structure.
2207*4661c169SSascha Wildner 
2208*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2209*4661c169SSascha Wildner 
2210*4661c169SSascha Wildner   @return A pointer to the newly-created USB class device path structure.
2211*4661c169SSascha Wildner 
2212*4661c169SSascha Wildner **/
2213*4661c169SSascha Wildner static
2214*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbClass(IN CHAR16 * TextDeviceNode)2215*4661c169SSascha Wildner DevPathFromTextUsbClass (
2216*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2217*4661c169SSascha Wildner   )
2218*4661c169SSascha Wildner {
2219*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2220*4661c169SSascha Wildner 
2221*4661c169SSascha Wildner   UsbClassText.ClassExist    = TRUE;
2222*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2223*4661c169SSascha Wildner 
2224*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2225*4661c169SSascha Wildner }
2226*4661c169SSascha Wildner 
2227*4661c169SSascha Wildner /**
2228*4661c169SSascha Wildner   Converts a text device path node to USB audio device path structure.
2229*4661c169SSascha Wildner 
2230*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2231*4661c169SSascha Wildner 
2232*4661c169SSascha Wildner   @return A pointer to the newly-created USB audio device path structure.
2233*4661c169SSascha Wildner 
2234*4661c169SSascha Wildner **/
2235*4661c169SSascha Wildner static
2236*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbAudio(IN CHAR16 * TextDeviceNode)2237*4661c169SSascha Wildner DevPathFromTextUsbAudio (
2238*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2239*4661c169SSascha Wildner   )
2240*4661c169SSascha Wildner {
2241*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2242*4661c169SSascha Wildner 
2243*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2244*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_AUDIO;
2245*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2246*4661c169SSascha Wildner 
2247*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2248*4661c169SSascha Wildner }
2249*4661c169SSascha Wildner 
2250*4661c169SSascha Wildner /**
2251*4661c169SSascha Wildner   Converts a text device path node to USB CDC Control device path structure.
2252*4661c169SSascha Wildner 
2253*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2254*4661c169SSascha Wildner 
2255*4661c169SSascha Wildner   @return A pointer to the newly-created USB CDC Control device path structure.
2256*4661c169SSascha Wildner 
2257*4661c169SSascha Wildner **/
2258*4661c169SSascha Wildner static
2259*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCControl(IN CHAR16 * TextDeviceNode)2260*4661c169SSascha Wildner DevPathFromTextUsbCDCControl (
2261*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2262*4661c169SSascha Wildner   )
2263*4661c169SSascha Wildner {
2264*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2265*4661c169SSascha Wildner 
2266*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2267*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_CDCCONTROL;
2268*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2269*4661c169SSascha Wildner 
2270*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2271*4661c169SSascha Wildner }
2272*4661c169SSascha Wildner 
2273*4661c169SSascha Wildner /**
2274*4661c169SSascha Wildner   Converts a text device path node to USB HID device path structure.
2275*4661c169SSascha Wildner 
2276*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2277*4661c169SSascha Wildner 
2278*4661c169SSascha Wildner   @return A pointer to the newly-created USB HID device path structure.
2279*4661c169SSascha Wildner 
2280*4661c169SSascha Wildner **/
2281*4661c169SSascha Wildner static
2282*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHID(IN CHAR16 * TextDeviceNode)2283*4661c169SSascha Wildner DevPathFromTextUsbHID (
2284*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2285*4661c169SSascha Wildner   )
2286*4661c169SSascha Wildner {
2287*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2288*4661c169SSascha Wildner 
2289*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2290*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_HID;
2291*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2292*4661c169SSascha Wildner 
2293*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2294*4661c169SSascha Wildner }
2295*4661c169SSascha Wildner 
2296*4661c169SSascha Wildner /**
2297*4661c169SSascha Wildner   Converts a text device path node to USB Image device path structure.
2298*4661c169SSascha Wildner 
2299*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2300*4661c169SSascha Wildner 
2301*4661c169SSascha Wildner   @return A pointer to the newly-created USB Image device path structure.
2302*4661c169SSascha Wildner 
2303*4661c169SSascha Wildner **/
2304*4661c169SSascha Wildner static
2305*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbImage(IN CHAR16 * TextDeviceNode)2306*4661c169SSascha Wildner DevPathFromTextUsbImage (
2307*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2308*4661c169SSascha Wildner   )
2309*4661c169SSascha Wildner {
2310*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2311*4661c169SSascha Wildner 
2312*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2313*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_IMAGE;
2314*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2315*4661c169SSascha Wildner 
2316*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2317*4661c169SSascha Wildner }
2318*4661c169SSascha Wildner 
2319*4661c169SSascha Wildner /**
2320*4661c169SSascha Wildner   Converts a text device path node to USB Print device path structure.
2321*4661c169SSascha Wildner 
2322*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2323*4661c169SSascha Wildner 
2324*4661c169SSascha Wildner   @return A pointer to the newly-created USB Print device path structure.
2325*4661c169SSascha Wildner 
2326*4661c169SSascha Wildner **/
2327*4661c169SSascha Wildner static
2328*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbPrinter(IN CHAR16 * TextDeviceNode)2329*4661c169SSascha Wildner DevPathFromTextUsbPrinter (
2330*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2331*4661c169SSascha Wildner   )
2332*4661c169SSascha Wildner {
2333*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2334*4661c169SSascha Wildner 
2335*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2336*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_PRINTER;
2337*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2338*4661c169SSascha Wildner 
2339*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2340*4661c169SSascha Wildner }
2341*4661c169SSascha Wildner 
2342*4661c169SSascha Wildner /**
2343*4661c169SSascha Wildner   Converts a text device path node to USB mass storage device path structure.
2344*4661c169SSascha Wildner 
2345*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2346*4661c169SSascha Wildner 
2347*4661c169SSascha Wildner   @return A pointer to the newly-created USB mass storage device path structure.
2348*4661c169SSascha Wildner 
2349*4661c169SSascha Wildner **/
2350*4661c169SSascha Wildner static
2351*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbMassStorage(IN CHAR16 * TextDeviceNode)2352*4661c169SSascha Wildner DevPathFromTextUsbMassStorage (
2353*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2354*4661c169SSascha Wildner   )
2355*4661c169SSascha Wildner {
2356*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2357*4661c169SSascha Wildner 
2358*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2359*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_MASS_STORAGE;
2360*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2361*4661c169SSascha Wildner 
2362*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2363*4661c169SSascha Wildner }
2364*4661c169SSascha Wildner 
2365*4661c169SSascha Wildner /**
2366*4661c169SSascha Wildner   Converts a text device path node to USB HUB device path structure.
2367*4661c169SSascha Wildner 
2368*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2369*4661c169SSascha Wildner 
2370*4661c169SSascha Wildner   @return A pointer to the newly-created USB HUB device path structure.
2371*4661c169SSascha Wildner 
2372*4661c169SSascha Wildner **/
2373*4661c169SSascha Wildner static
2374*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbHub(IN CHAR16 * TextDeviceNode)2375*4661c169SSascha Wildner DevPathFromTextUsbHub (
2376*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2377*4661c169SSascha Wildner   )
2378*4661c169SSascha Wildner {
2379*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2380*4661c169SSascha Wildner 
2381*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2382*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_HUB;
2383*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2384*4661c169SSascha Wildner 
2385*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2386*4661c169SSascha Wildner }
2387*4661c169SSascha Wildner 
2388*4661c169SSascha Wildner /**
2389*4661c169SSascha Wildner   Converts a text device path node to USB CDC data device path structure.
2390*4661c169SSascha Wildner 
2391*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2392*4661c169SSascha Wildner 
2393*4661c169SSascha Wildner   @return A pointer to the newly-created USB CDC data device path structure.
2394*4661c169SSascha Wildner 
2395*4661c169SSascha Wildner **/
2396*4661c169SSascha Wildner static
2397*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbCDCData(IN CHAR16 * TextDeviceNode)2398*4661c169SSascha Wildner DevPathFromTextUsbCDCData (
2399*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2400*4661c169SSascha Wildner   )
2401*4661c169SSascha Wildner {
2402*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2403*4661c169SSascha Wildner 
2404*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2405*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_CDCDATA;
2406*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2407*4661c169SSascha Wildner 
2408*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2409*4661c169SSascha Wildner }
2410*4661c169SSascha Wildner 
2411*4661c169SSascha Wildner /**
2412*4661c169SSascha Wildner   Converts a text device path node to USB smart card device path structure.
2413*4661c169SSascha Wildner 
2414*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2415*4661c169SSascha Wildner 
2416*4661c169SSascha Wildner   @return A pointer to the newly-created USB smart card device path structure.
2417*4661c169SSascha Wildner 
2418*4661c169SSascha Wildner **/
2419*4661c169SSascha Wildner static
2420*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbSmartCard(IN CHAR16 * TextDeviceNode)2421*4661c169SSascha Wildner DevPathFromTextUsbSmartCard (
2422*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2423*4661c169SSascha Wildner   )
2424*4661c169SSascha Wildner {
2425*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2426*4661c169SSascha Wildner 
2427*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2428*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_SMART_CARD;
2429*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2430*4661c169SSascha Wildner 
2431*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2432*4661c169SSascha Wildner }
2433*4661c169SSascha Wildner 
2434*4661c169SSascha Wildner /**
2435*4661c169SSascha Wildner   Converts a text device path node to USB video device path structure.
2436*4661c169SSascha Wildner 
2437*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2438*4661c169SSascha Wildner 
2439*4661c169SSascha Wildner   @return A pointer to the newly-created USB video device path structure.
2440*4661c169SSascha Wildner 
2441*4661c169SSascha Wildner **/
2442*4661c169SSascha Wildner static
2443*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbVideo(IN CHAR16 * TextDeviceNode)2444*4661c169SSascha Wildner DevPathFromTextUsbVideo (
2445*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2446*4661c169SSascha Wildner   )
2447*4661c169SSascha Wildner {
2448*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2449*4661c169SSascha Wildner 
2450*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2451*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_VIDEO;
2452*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2453*4661c169SSascha Wildner 
2454*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2455*4661c169SSascha Wildner }
2456*4661c169SSascha Wildner 
2457*4661c169SSascha Wildner /**
2458*4661c169SSascha Wildner   Converts a text device path node to USB diagnostic device path structure.
2459*4661c169SSascha Wildner 
2460*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2461*4661c169SSascha Wildner 
2462*4661c169SSascha Wildner   @return A pointer to the newly-created USB diagnostic device path structure.
2463*4661c169SSascha Wildner 
2464*4661c169SSascha Wildner **/
2465*4661c169SSascha Wildner static
2466*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDiagnostic(IN CHAR16 * TextDeviceNode)2467*4661c169SSascha Wildner DevPathFromTextUsbDiagnostic (
2468*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2469*4661c169SSascha Wildner   )
2470*4661c169SSascha Wildner {
2471*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2472*4661c169SSascha Wildner 
2473*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2474*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;
2475*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2476*4661c169SSascha Wildner 
2477*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2478*4661c169SSascha Wildner }
2479*4661c169SSascha Wildner 
2480*4661c169SSascha Wildner /**
2481*4661c169SSascha Wildner   Converts a text device path node to USB wireless device path structure.
2482*4661c169SSascha Wildner 
2483*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2484*4661c169SSascha Wildner 
2485*4661c169SSascha Wildner   @return A pointer to the newly-created USB wireless device path structure.
2486*4661c169SSascha Wildner 
2487*4661c169SSascha Wildner **/
2488*4661c169SSascha Wildner static
2489*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWireless(IN CHAR16 * TextDeviceNode)2490*4661c169SSascha Wildner DevPathFromTextUsbWireless (
2491*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2492*4661c169SSascha Wildner   )
2493*4661c169SSascha Wildner {
2494*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2495*4661c169SSascha Wildner 
2496*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2497*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_WIRELESS;
2498*4661c169SSascha Wildner   UsbClassText.SubClassExist = TRUE;
2499*4661c169SSascha Wildner 
2500*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2501*4661c169SSascha Wildner }
2502*4661c169SSascha Wildner 
2503*4661c169SSascha Wildner /**
2504*4661c169SSascha Wildner   Converts a text device path node to USB device firmware update device path structure.
2505*4661c169SSascha Wildner 
2506*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2507*4661c169SSascha Wildner 
2508*4661c169SSascha Wildner   @return A pointer to the newly-created USB device firmware update device path structure.
2509*4661c169SSascha Wildner 
2510*4661c169SSascha Wildner **/
2511*4661c169SSascha Wildner static
2512*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbDeviceFirmwareUpdate(IN CHAR16 * TextDeviceNode)2513*4661c169SSascha Wildner DevPathFromTextUsbDeviceFirmwareUpdate (
2514*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2515*4661c169SSascha Wildner   )
2516*4661c169SSascha Wildner {
2517*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2518*4661c169SSascha Wildner 
2519*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2520*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_RESERVE;
2521*4661c169SSascha Wildner   UsbClassText.SubClassExist = FALSE;
2522*4661c169SSascha Wildner   UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;
2523*4661c169SSascha Wildner 
2524*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2525*4661c169SSascha Wildner }
2526*4661c169SSascha Wildner 
2527*4661c169SSascha Wildner /**
2528*4661c169SSascha Wildner   Converts a text device path node to USB IRDA bridge device path structure.
2529*4661c169SSascha Wildner 
2530*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2531*4661c169SSascha Wildner 
2532*4661c169SSascha Wildner   @return A pointer to the newly-created USB IRDA bridge device path structure.
2533*4661c169SSascha Wildner 
2534*4661c169SSascha Wildner **/
2535*4661c169SSascha Wildner static
2536*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbIrdaBridge(IN CHAR16 * TextDeviceNode)2537*4661c169SSascha Wildner DevPathFromTextUsbIrdaBridge (
2538*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2539*4661c169SSascha Wildner   )
2540*4661c169SSascha Wildner {
2541*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2542*4661c169SSascha Wildner 
2543*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2544*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_RESERVE;
2545*4661c169SSascha Wildner   UsbClassText.SubClassExist = FALSE;
2546*4661c169SSascha Wildner   UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;
2547*4661c169SSascha Wildner 
2548*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2549*4661c169SSascha Wildner }
2550*4661c169SSascha Wildner 
2551*4661c169SSascha Wildner /**
2552*4661c169SSascha Wildner   Converts a text device path node to USB text and measurement device path structure.
2553*4661c169SSascha Wildner 
2554*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2555*4661c169SSascha Wildner 
2556*4661c169SSascha Wildner   @return A pointer to the newly-created USB text and measurement device path structure.
2557*4661c169SSascha Wildner 
2558*4661c169SSascha Wildner **/
2559*4661c169SSascha Wildner static
2560*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbTestAndMeasurement(IN CHAR16 * TextDeviceNode)2561*4661c169SSascha Wildner DevPathFromTextUsbTestAndMeasurement (
2562*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2563*4661c169SSascha Wildner   )
2564*4661c169SSascha Wildner {
2565*4661c169SSascha Wildner   USB_CLASS_TEXT  UsbClassText;
2566*4661c169SSascha Wildner 
2567*4661c169SSascha Wildner   UsbClassText.ClassExist    = FALSE;
2568*4661c169SSascha Wildner   UsbClassText.Class         = USB_CLASS_RESERVE;
2569*4661c169SSascha Wildner   UsbClassText.SubClassExist = FALSE;
2570*4661c169SSascha Wildner   UsbClassText.SubClass      = USB_SUBCLASS_TEST;
2571*4661c169SSascha Wildner 
2572*4661c169SSascha Wildner   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2573*4661c169SSascha Wildner }
2574*4661c169SSascha Wildner 
2575*4661c169SSascha Wildner /**
2576*4661c169SSascha Wildner   Converts a text device path node to USB WWID device path structure.
2577*4661c169SSascha Wildner 
2578*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2579*4661c169SSascha Wildner 
2580*4661c169SSascha Wildner   @return A pointer to the newly-created USB WWID device path structure.
2581*4661c169SSascha Wildner 
2582*4661c169SSascha Wildner **/
2583*4661c169SSascha Wildner static
2584*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUsbWwid(IN CHAR16 * TextDeviceNode)2585*4661c169SSascha Wildner DevPathFromTextUsbWwid (
2586*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2587*4661c169SSascha Wildner   )
2588*4661c169SSascha Wildner {
2589*4661c169SSascha Wildner   CHAR16                *VIDStr;
2590*4661c169SSascha Wildner   CHAR16                *PIDStr;
2591*4661c169SSascha Wildner   CHAR16                *InterfaceNumStr;
2592*4661c169SSascha Wildner   CHAR16                *SerialNumberStr;
2593*4661c169SSascha Wildner   USB_WWID_DEVICE_PATH  *UsbWwid;
2594*4661c169SSascha Wildner   UINTN                 SerialNumberStrLen;
2595*4661c169SSascha Wildner 
2596*4661c169SSascha Wildner   VIDStr                   = GetNextParamStr (&TextDeviceNode);
2597*4661c169SSascha Wildner   PIDStr                   = GetNextParamStr (&TextDeviceNode);
2598*4661c169SSascha Wildner   InterfaceNumStr          = GetNextParamStr (&TextDeviceNode);
2599*4661c169SSascha Wildner   SerialNumberStr          = GetNextParamStr (&TextDeviceNode);
2600*4661c169SSascha Wildner   SerialNumberStrLen       = StrLen (SerialNumberStr);
2601*4661c169SSascha Wildner   if (SerialNumberStrLen >= 2 &&
2602*4661c169SSascha Wildner       SerialNumberStr[0] == '\"' &&
2603*4661c169SSascha Wildner       SerialNumberStr[SerialNumberStrLen - 1] == '\"'
2604*4661c169SSascha Wildner     ) {
2605*4661c169SSascha Wildner     SerialNumberStr[SerialNumberStrLen - 1] = '\0';
2606*4661c169SSascha Wildner     SerialNumberStr++;
2607*4661c169SSascha Wildner     SerialNumberStrLen -= 2;
2608*4661c169SSascha Wildner   }
2609*4661c169SSascha Wildner   UsbWwid                  = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (
2610*4661c169SSascha Wildner                                                          MESSAGING_DEVICE_PATH,
2611*4661c169SSascha Wildner                                                          MSG_USB_WWID_DP,
2612*4661c169SSascha Wildner                                                          (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
2613*4661c169SSascha Wildner                                                          );
2614*4661c169SSascha Wildner   UsbWwid->VendorId        = (UINT16) Strtoi (VIDStr);
2615*4661c169SSascha Wildner   UsbWwid->ProductId       = (UINT16) Strtoi (PIDStr);
2616*4661c169SSascha Wildner   UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);
2617*4661c169SSascha Wildner 
2618*4661c169SSascha Wildner   //
2619*4661c169SSascha Wildner   // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.
2620*4661c169SSascha Wildner   // Therefore, the '\0' will not be copied.
2621*4661c169SSascha Wildner   //
2622*4661c169SSascha Wildner   CopyMem (
2623*4661c169SSascha Wildner     (UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH),
2624*4661c169SSascha Wildner     SerialNumberStr,
2625*4661c169SSascha Wildner     SerialNumberStrLen * sizeof (CHAR16)
2626*4661c169SSascha Wildner     );
2627*4661c169SSascha Wildner 
2628*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;
2629*4661c169SSascha Wildner }
2630*4661c169SSascha Wildner 
2631*4661c169SSascha Wildner /**
2632*4661c169SSascha Wildner   Converts a text device path node to Logic Unit device path structure.
2633*4661c169SSascha Wildner 
2634*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2635*4661c169SSascha Wildner 
2636*4661c169SSascha Wildner   @return A pointer to the newly-created Logic Unit device path structure.
2637*4661c169SSascha Wildner 
2638*4661c169SSascha Wildner **/
2639*4661c169SSascha Wildner static
2640*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUnit(IN CHAR16 * TextDeviceNode)2641*4661c169SSascha Wildner DevPathFromTextUnit (
2642*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2643*4661c169SSascha Wildner   )
2644*4661c169SSascha Wildner {
2645*4661c169SSascha Wildner   CHAR16                          *LunStr;
2646*4661c169SSascha Wildner   DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
2647*4661c169SSascha Wildner 
2648*4661c169SSascha Wildner   LunStr      = GetNextParamStr (&TextDeviceNode);
2649*4661c169SSascha Wildner   LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (
2650*4661c169SSascha Wildner                                                       MESSAGING_DEVICE_PATH,
2651*4661c169SSascha Wildner                                                       MSG_DEVICE_LOGICAL_UNIT_DP,
2652*4661c169SSascha Wildner                                                       (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
2653*4661c169SSascha Wildner                                                       );
2654*4661c169SSascha Wildner 
2655*4661c169SSascha Wildner   LogicalUnit->Lun  = (UINT8) Strtoi (LunStr);
2656*4661c169SSascha Wildner 
2657*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;
2658*4661c169SSascha Wildner }
2659*4661c169SSascha Wildner 
2660*4661c169SSascha Wildner /**
2661*4661c169SSascha Wildner   Converts a text device path node to iSCSI device path structure.
2662*4661c169SSascha Wildner 
2663*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2664*4661c169SSascha Wildner 
2665*4661c169SSascha Wildner   @return A pointer to the newly-created iSCSI device path structure.
2666*4661c169SSascha Wildner 
2667*4661c169SSascha Wildner **/
2668*4661c169SSascha Wildner static
2669*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextiSCSI(IN CHAR16 * TextDeviceNode)2670*4661c169SSascha Wildner DevPathFromTextiSCSI (
2671*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2672*4661c169SSascha Wildner   )
2673*4661c169SSascha Wildner {
2674*4661c169SSascha Wildner   UINT16                      Options;
2675*4661c169SSascha Wildner   CHAR16                      *NameStr;
2676*4661c169SSascha Wildner   CHAR16                      *PortalGroupStr;
2677*4661c169SSascha Wildner   CHAR16                      *LunStr;
2678*4661c169SSascha Wildner   CHAR16                      *HeaderDigestStr;
2679*4661c169SSascha Wildner   CHAR16                      *DataDigestStr;
2680*4661c169SSascha Wildner   CHAR16                      *AuthenticationStr;
2681*4661c169SSascha Wildner   CHAR16                      *ProtocolStr;
2682*4661c169SSascha Wildner   CHAR8                       *AsciiStr;
2683*4661c169SSascha Wildner   ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;
2684*4661c169SSascha Wildner 
2685*4661c169SSascha Wildner   NameStr           = GetNextParamStr (&TextDeviceNode);
2686*4661c169SSascha Wildner   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);
2687*4661c169SSascha Wildner   LunStr            = GetNextParamStr (&TextDeviceNode);
2688*4661c169SSascha Wildner   HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);
2689*4661c169SSascha Wildner   DataDigestStr     = GetNextParamStr (&TextDeviceNode);
2690*4661c169SSascha Wildner   AuthenticationStr = GetNextParamStr (&TextDeviceNode);
2691*4661c169SSascha Wildner   ProtocolStr       = GetNextParamStr (&TextDeviceNode);
2692*4661c169SSascha Wildner   ISCSIDevPath      = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (
2693*4661c169SSascha Wildner                                                         MESSAGING_DEVICE_PATH,
2694*4661c169SSascha Wildner                                                         MSG_ISCSI_DP,
2695*4661c169SSascha Wildner                                                         (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))
2696*4661c169SSascha Wildner                                                         );
2697*4661c169SSascha Wildner 
2698*4661c169SSascha Wildner   AsciiStr = ISCSIDevPath->TargetName;
2699*4661c169SSascha Wildner   StrToAscii (NameStr, &AsciiStr);
2700*4661c169SSascha Wildner 
2701*4661c169SSascha Wildner   ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);
2702*4661c169SSascha Wildner   Strtoi64 (LunStr, &ISCSIDevPath->Lun);
2703*4661c169SSascha Wildner 
2704*4661c169SSascha Wildner   Options = 0x0000;
2705*4661c169SSascha Wildner   if (StrCmp (HeaderDigestStr, "CRC32C") == 0) {
2706*4661c169SSascha Wildner     Options |= 0x0002;
2707*4661c169SSascha Wildner   }
2708*4661c169SSascha Wildner 
2709*4661c169SSascha Wildner   if (StrCmp (DataDigestStr, "CRC32C") == 0) {
2710*4661c169SSascha Wildner     Options |= 0x0008;
2711*4661c169SSascha Wildner   }
2712*4661c169SSascha Wildner 
2713*4661c169SSascha Wildner   if (StrCmp (AuthenticationStr, "None") == 0) {
2714*4661c169SSascha Wildner     Options |= 0x0800;
2715*4661c169SSascha Wildner   }
2716*4661c169SSascha Wildner 
2717*4661c169SSascha Wildner   if (StrCmp (AuthenticationStr, "CHAP_UNI") == 0) {
2718*4661c169SSascha Wildner     Options |= 0x1000;
2719*4661c169SSascha Wildner   }
2720*4661c169SSascha Wildner 
2721*4661c169SSascha Wildner   ISCSIDevPath->LoginOption      = (UINT16) Options;
2722*4661c169SSascha Wildner 
2723*4661c169SSascha Wildner   ISCSIDevPath->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, "TCP");
2724*4661c169SSascha Wildner 
2725*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;
2726*4661c169SSascha Wildner }
2727*4661c169SSascha Wildner 
2728*4661c169SSascha Wildner /**
2729*4661c169SSascha Wildner   Converts a text device path node to VLAN device path structure.
2730*4661c169SSascha Wildner 
2731*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2732*4661c169SSascha Wildner 
2733*4661c169SSascha Wildner   @return A pointer to the newly-created VLAN device path structure.
2734*4661c169SSascha Wildner 
2735*4661c169SSascha Wildner **/
2736*4661c169SSascha Wildner static
2737*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVlan(IN CHAR16 * TextDeviceNode)2738*4661c169SSascha Wildner DevPathFromTextVlan (
2739*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2740*4661c169SSascha Wildner   )
2741*4661c169SSascha Wildner {
2742*4661c169SSascha Wildner   CHAR16            *VlanStr;
2743*4661c169SSascha Wildner   VLAN_DEVICE_PATH  *Vlan;
2744*4661c169SSascha Wildner 
2745*4661c169SSascha Wildner   VlanStr = GetNextParamStr (&TextDeviceNode);
2746*4661c169SSascha Wildner   Vlan    = (VLAN_DEVICE_PATH *) CreateDeviceNode (
2747*4661c169SSascha Wildner                                    MESSAGING_DEVICE_PATH,
2748*4661c169SSascha Wildner                                    MSG_VLAN_DP,
2749*4661c169SSascha Wildner                                    (UINT16) sizeof (VLAN_DEVICE_PATH)
2750*4661c169SSascha Wildner                                    );
2751*4661c169SSascha Wildner 
2752*4661c169SSascha Wildner   Vlan->VlanId = (UINT16) Strtoi (VlanStr);
2753*4661c169SSascha Wildner 
2754*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;
2755*4661c169SSascha Wildner }
2756*4661c169SSascha Wildner 
2757*4661c169SSascha Wildner /**
2758*4661c169SSascha Wildner   Converts a text device path node to Bluetooth device path structure.
2759*4661c169SSascha Wildner 
2760*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2761*4661c169SSascha Wildner 
2762*4661c169SSascha Wildner   @return A pointer to the newly-created Bluetooth device path structure.
2763*4661c169SSascha Wildner 
2764*4661c169SSascha Wildner **/
2765*4661c169SSascha Wildner static
2766*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBluetooth(IN CHAR16 * TextDeviceNode)2767*4661c169SSascha Wildner DevPathFromTextBluetooth (
2768*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2769*4661c169SSascha Wildner   )
2770*4661c169SSascha Wildner {
2771*4661c169SSascha Wildner   CHAR16                  *BluetoothStr;
2772*4661c169SSascha Wildner   CHAR16                  *Walker;
2773*4661c169SSascha Wildner   CHAR16                  *TempNumBuffer;
2774*4661c169SSascha Wildner   UINTN                   TempBufferSize;
2775*4661c169SSascha Wildner   INT32                   Index;
2776*4661c169SSascha Wildner   BLUETOOTH_DEVICE_PATH   *BluetoothDp;
2777*4661c169SSascha Wildner 
2778*4661c169SSascha Wildner   BluetoothStr = GetNextParamStr (&TextDeviceNode);
2779*4661c169SSascha Wildner   BluetoothDp = (BLUETOOTH_DEVICE_PATH *) CreateDeviceNode (
2780*4661c169SSascha Wildner                                    MESSAGING_DEVICE_PATH,
2781*4661c169SSascha Wildner                                    MSG_BLUETOOTH_DP,
2782*4661c169SSascha Wildner                                    (UINT16) sizeof (BLUETOOTH_DEVICE_PATH)
2783*4661c169SSascha Wildner                                    );
2784*4661c169SSascha Wildner 
2785*4661c169SSascha Wildner   Index = sizeof (BLUETOOTH_ADDRESS) - 1;
2786*4661c169SSascha Wildner   Walker = BluetoothStr;
2787*4661c169SSascha Wildner   while (!IS_NULL(*Walker) && Index >= 0) {
2788*4661c169SSascha Wildner     TempBufferSize = 2 * sizeof(CHAR16) + StrSize("0x");
2789*4661c169SSascha Wildner     TempNumBuffer = AllocateZeroPool (TempBufferSize);
2790*4661c169SSascha Wildner     if (TempNumBuffer == NULL) {
2791*4661c169SSascha Wildner       break;
2792*4661c169SSascha Wildner     }
2793*4661c169SSascha Wildner     StrCpyS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), "0x");
2794*4661c169SSascha Wildner     StrnCatS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), Walker, 2);
2795*4661c169SSascha Wildner     BluetoothDp->BD_ADDR.Address[Index] = (UINT8)Strtoi (TempNumBuffer);
2796*4661c169SSascha Wildner     FreePool (TempNumBuffer);
2797*4661c169SSascha Wildner     Walker += 2;
2798*4661c169SSascha Wildner     Index--;
2799*4661c169SSascha Wildner   }
2800*4661c169SSascha Wildner 
2801*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothDp;
2802*4661c169SSascha Wildner }
2803*4661c169SSascha Wildner 
2804*4661c169SSascha Wildner /**
2805*4661c169SSascha Wildner   Converts a text device path node to Wi-Fi device path structure.
2806*4661c169SSascha Wildner 
2807*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2808*4661c169SSascha Wildner 
2809*4661c169SSascha Wildner   @return A pointer to the newly-created Wi-Fi device path structure.
2810*4661c169SSascha Wildner 
2811*4661c169SSascha Wildner **/
2812*4661c169SSascha Wildner static
2813*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextWiFi(IN CHAR16 * TextDeviceNode)2814*4661c169SSascha Wildner DevPathFromTextWiFi (
2815*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2816*4661c169SSascha Wildner   )
2817*4661c169SSascha Wildner {
2818*4661c169SSascha Wildner   CHAR16                *SSIdStr;
2819*4661c169SSascha Wildner   CHAR8                 AsciiStr[33];
2820*4661c169SSascha Wildner   UINTN                 DataLen;
2821*4661c169SSascha Wildner   WIFI_DEVICE_PATH      *WiFiDp;
2822*4661c169SSascha Wildner 
2823*4661c169SSascha Wildner   SSIdStr = GetNextParamStr (&TextDeviceNode);
2824*4661c169SSascha Wildner   WiFiDp  = (WIFI_DEVICE_PATH *) CreateDeviceNode (
2825*4661c169SSascha Wildner                                    MESSAGING_DEVICE_PATH,
2826*4661c169SSascha Wildner                                    MSG_WIFI_DP,
2827*4661c169SSascha Wildner                                    (UINT16) sizeof (WIFI_DEVICE_PATH)
2828*4661c169SSascha Wildner                                    );
2829*4661c169SSascha Wildner 
2830*4661c169SSascha Wildner   if (NULL != SSIdStr) {
2831*4661c169SSascha Wildner     DataLen = StrLen (SSIdStr);
2832*4661c169SSascha Wildner     if (StrLen (SSIdStr) > 32) {
2833*4661c169SSascha Wildner       SSIdStr[32] = '\0';
2834*4661c169SSascha Wildner       DataLen     = 32;
2835*4661c169SSascha Wildner     }
2836*4661c169SSascha Wildner 
2837*4661c169SSascha Wildner     UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));
2838*4661c169SSascha Wildner     CopyMem (WiFiDp->SSId, AsciiStr, DataLen);
2839*4661c169SSascha Wildner   }
2840*4661c169SSascha Wildner 
2841*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;
2842*4661c169SSascha Wildner }
2843*4661c169SSascha Wildner 
2844*4661c169SSascha Wildner /**
2845*4661c169SSascha Wildner   Converts a text device path node to URI device path structure.
2846*4661c169SSascha Wildner 
2847*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2848*4661c169SSascha Wildner 
2849*4661c169SSascha Wildner   @return A pointer to the newly-created URI device path structure.
2850*4661c169SSascha Wildner 
2851*4661c169SSascha Wildner **/
2852*4661c169SSascha Wildner static
2853*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextUri(IN CHAR16 * TextDeviceNode)2854*4661c169SSascha Wildner DevPathFromTextUri (
2855*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2856*4661c169SSascha Wildner   )
2857*4661c169SSascha Wildner {
2858*4661c169SSascha Wildner   CHAR16           *UriStr;
2859*4661c169SSascha Wildner   UINTN            UriLength;
2860*4661c169SSascha Wildner   URI_DEVICE_PATH  *Uri;
2861*4661c169SSascha Wildner 
2862*4661c169SSascha Wildner   UriStr = GetNextParamStr (&TextDeviceNode);
2863*4661c169SSascha Wildner   UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));
2864*4661c169SSascha Wildner   Uri    = (URI_DEVICE_PATH *) CreateDeviceNode (
2865*4661c169SSascha Wildner                                  MESSAGING_DEVICE_PATH,
2866*4661c169SSascha Wildner                                  MSG_URI_DP,
2867*4661c169SSascha Wildner                                  (UINT16) (sizeof (URI_DEVICE_PATH) + UriLength)
2868*4661c169SSascha Wildner                                  );
2869*4661c169SSascha Wildner 
2870*4661c169SSascha Wildner   while (UriLength-- != 0) {
2871*4661c169SSascha Wildner     Uri->Uri[UriLength] = (CHAR8) UriStr[UriLength];
2872*4661c169SSascha Wildner   }
2873*4661c169SSascha Wildner 
2874*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Uri;
2875*4661c169SSascha Wildner }
2876*4661c169SSascha Wildner 
2877*4661c169SSascha Wildner /**
2878*4661c169SSascha Wildner   Converts a media text device path node to media device path structure.
2879*4661c169SSascha Wildner 
2880*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2881*4661c169SSascha Wildner 
2882*4661c169SSascha Wildner   @return A pointer to media device path structure.
2883*4661c169SSascha Wildner 
2884*4661c169SSascha Wildner **/
2885*4661c169SSascha Wildner static
2886*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMediaPath(IN CHAR16 * TextDeviceNode)2887*4661c169SSascha Wildner DevPathFromTextMediaPath (
2888*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2889*4661c169SSascha Wildner   )
2890*4661c169SSascha Wildner {
2891*4661c169SSascha Wildner   return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);
2892*4661c169SSascha Wildner }
2893*4661c169SSascha Wildner 
2894*4661c169SSascha Wildner /**
2895*4661c169SSascha Wildner   Converts a text device path node to HD device path structure.
2896*4661c169SSascha Wildner 
2897*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2898*4661c169SSascha Wildner 
2899*4661c169SSascha Wildner   @return A pointer to the newly-created HD device path structure.
2900*4661c169SSascha Wildner 
2901*4661c169SSascha Wildner **/
2902*4661c169SSascha Wildner static
2903*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextHD(IN CHAR16 * TextDeviceNode)2904*4661c169SSascha Wildner DevPathFromTextHD (
2905*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2906*4661c169SSascha Wildner   )
2907*4661c169SSascha Wildner {
2908*4661c169SSascha Wildner   CHAR16                *PartitionStr;
2909*4661c169SSascha Wildner   CHAR16                *TypeStr;
2910*4661c169SSascha Wildner   CHAR16                *SignatureStr;
2911*4661c169SSascha Wildner   CHAR16                *StartStr;
2912*4661c169SSascha Wildner   CHAR16                *SizeStr;
2913*4661c169SSascha Wildner   UINT32                Signature32;
2914*4661c169SSascha Wildner   HARDDRIVE_DEVICE_PATH *Hd;
2915*4661c169SSascha Wildner 
2916*4661c169SSascha Wildner   PartitionStr        = GetNextParamStr (&TextDeviceNode);
2917*4661c169SSascha Wildner   TypeStr             = GetNextParamStr (&TextDeviceNode);
2918*4661c169SSascha Wildner   SignatureStr        = GetNextParamStr (&TextDeviceNode);
2919*4661c169SSascha Wildner   StartStr            = GetNextParamStr (&TextDeviceNode);
2920*4661c169SSascha Wildner   SizeStr             = GetNextParamStr (&TextDeviceNode);
2921*4661c169SSascha Wildner   Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (
2922*4661c169SSascha Wildner                                                     MEDIA_DEVICE_PATH,
2923*4661c169SSascha Wildner                                                     MEDIA_HARDDRIVE_DP,
2924*4661c169SSascha Wildner                                                     (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)
2925*4661c169SSascha Wildner                                                     );
2926*4661c169SSascha Wildner 
2927*4661c169SSascha Wildner   Hd->PartitionNumber = (UINT32) Strtoi (PartitionStr);
2928*4661c169SSascha Wildner 
2929*4661c169SSascha Wildner   ZeroMem (Hd->Signature, 16);
2930*4661c169SSascha Wildner   Hd->MBRType = (UINT8) 0;
2931*4661c169SSascha Wildner 
2932*4661c169SSascha Wildner   if (StrCmp (TypeStr, "MBR") == 0) {
2933*4661c169SSascha Wildner     Hd->SignatureType = SIGNATURE_TYPE_MBR;
2934*4661c169SSascha Wildner     Hd->MBRType       = 0x01;
2935*4661c169SSascha Wildner 
2936*4661c169SSascha Wildner     Signature32       = (UINT32) Strtoi (SignatureStr);
2937*4661c169SSascha Wildner     CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
2938*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "GPT") == 0) {
2939*4661c169SSascha Wildner     Hd->SignatureType = SIGNATURE_TYPE_GUID;
2940*4661c169SSascha Wildner     Hd->MBRType       = 0x02;
2941*4661c169SSascha Wildner 
2942*4661c169SSascha Wildner     StrToGuid (SignatureStr, (EFI_GUID *) Hd->Signature);
2943*4661c169SSascha Wildner   } else {
2944*4661c169SSascha Wildner     Hd->SignatureType = (UINT8) Strtoi (TypeStr);
2945*4661c169SSascha Wildner   }
2946*4661c169SSascha Wildner 
2947*4661c169SSascha Wildner   Strtoi64 (StartStr, &Hd->PartitionStart);
2948*4661c169SSascha Wildner   Strtoi64 (SizeStr, &Hd->PartitionSize);
2949*4661c169SSascha Wildner 
2950*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Hd;
2951*4661c169SSascha Wildner }
2952*4661c169SSascha Wildner 
2953*4661c169SSascha Wildner /**
2954*4661c169SSascha Wildner   Converts a text device path node to CDROM device path structure.
2955*4661c169SSascha Wildner 
2956*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2957*4661c169SSascha Wildner 
2958*4661c169SSascha Wildner   @return A pointer to the newly-created CDROM device path structure.
2959*4661c169SSascha Wildner 
2960*4661c169SSascha Wildner **/
2961*4661c169SSascha Wildner static
2962*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextCDROM(IN CHAR16 * TextDeviceNode)2963*4661c169SSascha Wildner DevPathFromTextCDROM (
2964*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
2965*4661c169SSascha Wildner   )
2966*4661c169SSascha Wildner {
2967*4661c169SSascha Wildner   CHAR16            *EntryStr;
2968*4661c169SSascha Wildner   CHAR16            *StartStr;
2969*4661c169SSascha Wildner   CHAR16            *SizeStr;
2970*4661c169SSascha Wildner   CDROM_DEVICE_PATH *CDROMDevPath;
2971*4661c169SSascha Wildner 
2972*4661c169SSascha Wildner   EntryStr              = GetNextParamStr (&TextDeviceNode);
2973*4661c169SSascha Wildner   StartStr              = GetNextParamStr (&TextDeviceNode);
2974*4661c169SSascha Wildner   SizeStr               = GetNextParamStr (&TextDeviceNode);
2975*4661c169SSascha Wildner   CDROMDevPath          = (CDROM_DEVICE_PATH *) CreateDeviceNode (
2976*4661c169SSascha Wildner                                                   MEDIA_DEVICE_PATH,
2977*4661c169SSascha Wildner                                                   MEDIA_CDROM_DP,
2978*4661c169SSascha Wildner                                                   (UINT16) sizeof (CDROM_DEVICE_PATH)
2979*4661c169SSascha Wildner                                                   );
2980*4661c169SSascha Wildner 
2981*4661c169SSascha Wildner   CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);
2982*4661c169SSascha Wildner   Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);
2983*4661c169SSascha Wildner   Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);
2984*4661c169SSascha Wildner 
2985*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;
2986*4661c169SSascha Wildner }
2987*4661c169SSascha Wildner 
2988*4661c169SSascha Wildner /**
2989*4661c169SSascha Wildner   Converts a text device path node to Vendor-defined media device path structure.
2990*4661c169SSascha Wildner 
2991*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
2992*4661c169SSascha Wildner 
2993*4661c169SSascha Wildner   @return A pointer to the newly-created Vendor-defined media device path structure.
2994*4661c169SSascha Wildner 
2995*4661c169SSascha Wildner **/
2996*4661c169SSascha Wildner static
2997*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMedia(IN CHAR16 * TextDeviceNode)2998*4661c169SSascha Wildner DevPathFromTextVenMedia (
2999*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3000*4661c169SSascha Wildner   )
3001*4661c169SSascha Wildner {
3002*4661c169SSascha Wildner   return ConvertFromTextVendor (
3003*4661c169SSascha Wildner            TextDeviceNode,
3004*4661c169SSascha Wildner            MEDIA_DEVICE_PATH,
3005*4661c169SSascha Wildner            MEDIA_VENDOR_DP
3006*4661c169SSascha Wildner            );
3007*4661c169SSascha Wildner }
3008*4661c169SSascha Wildner 
3009*4661c169SSascha Wildner /**
3010*4661c169SSascha Wildner   Converts a text device path node to File device path structure.
3011*4661c169SSascha Wildner 
3012*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3013*4661c169SSascha Wildner 
3014*4661c169SSascha Wildner   @return A pointer to the newly-created File device path structure.
3015*4661c169SSascha Wildner 
3016*4661c169SSascha Wildner **/
3017*4661c169SSascha Wildner static
3018*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFilePath(IN CHAR16 * TextDeviceNode)3019*4661c169SSascha Wildner DevPathFromTextFilePath (
3020*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3021*4661c169SSascha Wildner   )
3022*4661c169SSascha Wildner {
3023*4661c169SSascha Wildner   FILEPATH_DEVICE_PATH  *File;
3024*4661c169SSascha Wildner 
3025*4661c169SSascha Wildner #ifndef __DragonFly__
3026*4661c169SSascha Wildner   File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (
3027*4661c169SSascha Wildner                                     MEDIA_DEVICE_PATH,
3028*4661c169SSascha Wildner                                     MEDIA_FILEPATH_DP,
3029*4661c169SSascha Wildner                                     (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)
3030*4661c169SSascha Wildner                                     );
3031*4661c169SSascha Wildner 
3032*4661c169SSascha Wildner   StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);
3033*4661c169SSascha Wildner #else
3034*4661c169SSascha Wildner   size_t len = (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2);
3035*4661c169SSascha Wildner   efi_char * v;
3036*4661c169SSascha Wildner   File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (
3037*4661c169SSascha Wildner                                     MEDIA_DEVICE_PATH,
3038*4661c169SSascha Wildner                                     MEDIA_FILEPATH_DP,
3039*4661c169SSascha Wildner 				    (UINT16)len
3040*4661c169SSascha Wildner                                     );
3041*4661c169SSascha Wildner   v = File->PathName;
3042*4661c169SSascha Wildner   utf8_to_ucs2(TextDeviceNode, &v, &len);
3043*4661c169SSascha Wildner #endif
3044*4661c169SSascha Wildner 
3045*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) File;
3046*4661c169SSascha Wildner }
3047*4661c169SSascha Wildner 
3048*4661c169SSascha Wildner /**
3049*4661c169SSascha Wildner   Converts a text device path node to Media protocol device path structure.
3050*4661c169SSascha Wildner 
3051*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3052*4661c169SSascha Wildner 
3053*4661c169SSascha Wildner   @return A pointer to the newly-created Media protocol device path structure.
3054*4661c169SSascha Wildner 
3055*4661c169SSascha Wildner **/
3056*4661c169SSascha Wildner static
3057*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextMedia(IN CHAR16 * TextDeviceNode)3058*4661c169SSascha Wildner DevPathFromTextMedia (
3059*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3060*4661c169SSascha Wildner   )
3061*4661c169SSascha Wildner {
3062*4661c169SSascha Wildner   CHAR16                      *GuidStr;
3063*4661c169SSascha Wildner   MEDIA_PROTOCOL_DEVICE_PATH  *Media;
3064*4661c169SSascha Wildner 
3065*4661c169SSascha Wildner   GuidStr = GetNextParamStr (&TextDeviceNode);
3066*4661c169SSascha Wildner   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (
3067*4661c169SSascha Wildner                                              MEDIA_DEVICE_PATH,
3068*4661c169SSascha Wildner                                              MEDIA_PROTOCOL_DP,
3069*4661c169SSascha Wildner                                              (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
3070*4661c169SSascha Wildner                                              );
3071*4661c169SSascha Wildner 
3072*4661c169SSascha Wildner   StrToGuid (GuidStr, &Media->Protocol);
3073*4661c169SSascha Wildner 
3074*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Media;
3075*4661c169SSascha Wildner }
3076*4661c169SSascha Wildner 
3077*4661c169SSascha Wildner /**
3078*4661c169SSascha Wildner   Converts a text device path node to firmware volume device path structure.
3079*4661c169SSascha Wildner 
3080*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3081*4661c169SSascha Wildner 
3082*4661c169SSascha Wildner   @return A pointer to the newly-created firmware volume device path structure.
3083*4661c169SSascha Wildner 
3084*4661c169SSascha Wildner **/
3085*4661c169SSascha Wildner static
3086*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFv(IN CHAR16 * TextDeviceNode)3087*4661c169SSascha Wildner DevPathFromTextFv (
3088*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3089*4661c169SSascha Wildner   )
3090*4661c169SSascha Wildner {
3091*4661c169SSascha Wildner   CHAR16                    *GuidStr;
3092*4661c169SSascha Wildner   MEDIA_FW_VOL_DEVICE_PATH  *Fv;
3093*4661c169SSascha Wildner 
3094*4661c169SSascha Wildner   GuidStr = GetNextParamStr (&TextDeviceNode);
3095*4661c169SSascha Wildner   Fv      = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (
3096*4661c169SSascha Wildner                                            MEDIA_DEVICE_PATH,
3097*4661c169SSascha Wildner                                            MEDIA_PIWG_FW_VOL_DP,
3098*4661c169SSascha Wildner                                            (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)
3099*4661c169SSascha Wildner                                            );
3100*4661c169SSascha Wildner 
3101*4661c169SSascha Wildner   StrToGuid (GuidStr, &Fv->FvName);
3102*4661c169SSascha Wildner 
3103*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Fv;
3104*4661c169SSascha Wildner }
3105*4661c169SSascha Wildner 
3106*4661c169SSascha Wildner /**
3107*4661c169SSascha Wildner   Converts a text device path node to firmware file device path structure.
3108*4661c169SSascha Wildner 
3109*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3110*4661c169SSascha Wildner 
3111*4661c169SSascha Wildner   @return A pointer to the newly-created firmware file device path structure.
3112*4661c169SSascha Wildner 
3113*4661c169SSascha Wildner **/
3114*4661c169SSascha Wildner static
3115*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextFvFile(IN CHAR16 * TextDeviceNode)3116*4661c169SSascha Wildner DevPathFromTextFvFile (
3117*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3118*4661c169SSascha Wildner   )
3119*4661c169SSascha Wildner {
3120*4661c169SSascha Wildner   CHAR16                             *GuidStr;
3121*4661c169SSascha Wildner   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  *FvFile;
3122*4661c169SSascha Wildner 
3123*4661c169SSascha Wildner   GuidStr = GetNextParamStr (&TextDeviceNode);
3124*4661c169SSascha Wildner   FvFile  = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (
3125*4661c169SSascha Wildner                                                     MEDIA_DEVICE_PATH,
3126*4661c169SSascha Wildner                                                     MEDIA_PIWG_FW_FILE_DP,
3127*4661c169SSascha Wildner                                                     (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)
3128*4661c169SSascha Wildner                                                     );
3129*4661c169SSascha Wildner 
3130*4661c169SSascha Wildner   StrToGuid (GuidStr, &FvFile->FvFileName);
3131*4661c169SSascha Wildner 
3132*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;
3133*4661c169SSascha Wildner }
3134*4661c169SSascha Wildner 
3135*4661c169SSascha Wildner /**
3136*4661c169SSascha Wildner   Converts a text device path node to text relative offset device path structure.
3137*4661c169SSascha Wildner 
3138*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3139*4661c169SSascha Wildner 
3140*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3141*4661c169SSascha Wildner 
3142*4661c169SSascha Wildner **/
3143*4661c169SSascha Wildner static
3144*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRelativeOffsetRange(IN CHAR16 * TextDeviceNode)3145*4661c169SSascha Wildner DevPathFromTextRelativeOffsetRange (
3146*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3147*4661c169SSascha Wildner   )
3148*4661c169SSascha Wildner {
3149*4661c169SSascha Wildner   CHAR16                                  *StartingOffsetStr;
3150*4661c169SSascha Wildner   CHAR16                                  *EndingOffsetStr;
3151*4661c169SSascha Wildner   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
3152*4661c169SSascha Wildner 
3153*4661c169SSascha Wildner   StartingOffsetStr = GetNextParamStr (&TextDeviceNode);
3154*4661c169SSascha Wildner   EndingOffsetStr   = GetNextParamStr (&TextDeviceNode);
3155*4661c169SSascha Wildner   Offset            = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (
3156*4661c169SSascha Wildner                                                                     MEDIA_DEVICE_PATH,
3157*4661c169SSascha Wildner                                                                     MEDIA_RELATIVE_OFFSET_RANGE_DP,
3158*4661c169SSascha Wildner                                                                     (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)
3159*4661c169SSascha Wildner                                                                     );
3160*4661c169SSascha Wildner 
3161*4661c169SSascha Wildner   Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);
3162*4661c169SSascha Wildner   Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);
3163*4661c169SSascha Wildner 
3164*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Offset;
3165*4661c169SSascha Wildner }
3166*4661c169SSascha Wildner 
3167*4661c169SSascha Wildner /**
3168*4661c169SSascha Wildner   Converts a text device path node to text ram disk device path structure.
3169*4661c169SSascha Wildner 
3170*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3171*4661c169SSascha Wildner 
3172*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3173*4661c169SSascha Wildner 
3174*4661c169SSascha Wildner **/
3175*4661c169SSascha Wildner static
3176*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextRamDisk(IN CHAR16 * TextDeviceNode)3177*4661c169SSascha Wildner DevPathFromTextRamDisk (
3178*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3179*4661c169SSascha Wildner   )
3180*4661c169SSascha Wildner {
3181*4661c169SSascha Wildner   CHAR16                                  *StartingAddrStr;
3182*4661c169SSascha Wildner   CHAR16                                  *EndingAddrStr;
3183*4661c169SSascha Wildner   CHAR16                                  *TypeGuidStr;
3184*4661c169SSascha Wildner   CHAR16                                  *InstanceStr;
3185*4661c169SSascha Wildner   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
3186*4661c169SSascha Wildner   UINT64                                  StartingAddr;
3187*4661c169SSascha Wildner   UINT64                                  EndingAddr;
3188*4661c169SSascha Wildner 
3189*4661c169SSascha Wildner   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3190*4661c169SSascha Wildner   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
3191*4661c169SSascha Wildner   InstanceStr     = GetNextParamStr (&TextDeviceNode);
3192*4661c169SSascha Wildner   TypeGuidStr     = GetNextParamStr (&TextDeviceNode);
3193*4661c169SSascha Wildner   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
3194*4661c169SSascha Wildner                                                      MEDIA_DEVICE_PATH,
3195*4661c169SSascha Wildner                                                      MEDIA_RAM_DISK_DP,
3196*4661c169SSascha Wildner                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3197*4661c169SSascha Wildner                                                      );
3198*4661c169SSascha Wildner 
3199*4661c169SSascha Wildner   Strtoi64 (StartingAddrStr, &StartingAddr);
3200*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
3201*4661c169SSascha Wildner   Strtoi64 (EndingAddrStr, &EndingAddr);
3202*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
3203*4661c169SSascha Wildner   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
3204*4661c169SSascha Wildner   StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);
3205*4661c169SSascha Wildner 
3206*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
3207*4661c169SSascha Wildner }
3208*4661c169SSascha Wildner 
3209*4661c169SSascha Wildner /**
3210*4661c169SSascha Wildner   Converts a text device path node to text virtual disk device path structure.
3211*4661c169SSascha Wildner 
3212*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3213*4661c169SSascha Wildner 
3214*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3215*4661c169SSascha Wildner 
3216*4661c169SSascha Wildner **/
3217*4661c169SSascha Wildner static
3218*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualDisk(IN CHAR16 * TextDeviceNode)3219*4661c169SSascha Wildner DevPathFromTextVirtualDisk (
3220*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3221*4661c169SSascha Wildner   )
3222*4661c169SSascha Wildner {
3223*4661c169SSascha Wildner   CHAR16                                  *StartingAddrStr;
3224*4661c169SSascha Wildner   CHAR16                                  *EndingAddrStr;
3225*4661c169SSascha Wildner   CHAR16                                  *InstanceStr;
3226*4661c169SSascha Wildner   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
3227*4661c169SSascha Wildner   UINT64                                  StartingAddr;
3228*4661c169SSascha Wildner   UINT64                                  EndingAddr;
3229*4661c169SSascha Wildner 
3230*4661c169SSascha Wildner   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3231*4661c169SSascha Wildner   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
3232*4661c169SSascha Wildner   InstanceStr     = GetNextParamStr (&TextDeviceNode);
3233*4661c169SSascha Wildner 
3234*4661c169SSascha Wildner   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
3235*4661c169SSascha Wildner                                                      MEDIA_DEVICE_PATH,
3236*4661c169SSascha Wildner                                                      MEDIA_RAM_DISK_DP,
3237*4661c169SSascha Wildner                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3238*4661c169SSascha Wildner                                                      );
3239*4661c169SSascha Wildner 
3240*4661c169SSascha Wildner   Strtoi64 (StartingAddrStr, &StartingAddr);
3241*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
3242*4661c169SSascha Wildner   Strtoi64 (EndingAddrStr, &EndingAddr);
3243*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
3244*4661c169SSascha Wildner   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
3245*4661c169SSascha Wildner   CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);
3246*4661c169SSascha Wildner 
3247*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
3248*4661c169SSascha Wildner }
3249*4661c169SSascha Wildner 
3250*4661c169SSascha Wildner /**
3251*4661c169SSascha Wildner   Converts a text device path node to text virtual cd device path structure.
3252*4661c169SSascha Wildner 
3253*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3254*4661c169SSascha Wildner 
3255*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3256*4661c169SSascha Wildner 
3257*4661c169SSascha Wildner **/
3258*4661c169SSascha Wildner static
3259*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVirtualCd(IN CHAR16 * TextDeviceNode)3260*4661c169SSascha Wildner DevPathFromTextVirtualCd (
3261*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3262*4661c169SSascha Wildner   )
3263*4661c169SSascha Wildner {
3264*4661c169SSascha Wildner   CHAR16                                  *StartingAddrStr;
3265*4661c169SSascha Wildner   CHAR16                                  *EndingAddrStr;
3266*4661c169SSascha Wildner   CHAR16                                  *InstanceStr;
3267*4661c169SSascha Wildner   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
3268*4661c169SSascha Wildner   UINT64                                  StartingAddr;
3269*4661c169SSascha Wildner   UINT64                                  EndingAddr;
3270*4661c169SSascha Wildner 
3271*4661c169SSascha Wildner   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3272*4661c169SSascha Wildner   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
3273*4661c169SSascha Wildner   InstanceStr     = GetNextParamStr (&TextDeviceNode);
3274*4661c169SSascha Wildner 
3275*4661c169SSascha Wildner   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
3276*4661c169SSascha Wildner                                                      MEDIA_DEVICE_PATH,
3277*4661c169SSascha Wildner                                                      MEDIA_RAM_DISK_DP,
3278*4661c169SSascha Wildner                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3279*4661c169SSascha Wildner                                                      );
3280*4661c169SSascha Wildner 
3281*4661c169SSascha Wildner   Strtoi64 (StartingAddrStr, &StartingAddr);
3282*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
3283*4661c169SSascha Wildner   Strtoi64 (EndingAddrStr, &EndingAddr);
3284*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
3285*4661c169SSascha Wildner   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
3286*4661c169SSascha Wildner   CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);
3287*4661c169SSascha Wildner 
3288*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
3289*4661c169SSascha Wildner }
3290*4661c169SSascha Wildner 
3291*4661c169SSascha Wildner /**
3292*4661c169SSascha Wildner   Converts a text device path node to text persistent virtual disk device path structure.
3293*4661c169SSascha Wildner 
3294*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3295*4661c169SSascha Wildner 
3296*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3297*4661c169SSascha Wildner 
3298*4661c169SSascha Wildner **/
3299*4661c169SSascha Wildner static
3300*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualDisk(IN CHAR16 * TextDeviceNode)3301*4661c169SSascha Wildner DevPathFromTextPersistentVirtualDisk (
3302*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3303*4661c169SSascha Wildner   )
3304*4661c169SSascha Wildner {
3305*4661c169SSascha Wildner   CHAR16                                  *StartingAddrStr;
3306*4661c169SSascha Wildner   CHAR16                                  *EndingAddrStr;
3307*4661c169SSascha Wildner   CHAR16                                  *InstanceStr;
3308*4661c169SSascha Wildner   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
3309*4661c169SSascha Wildner   UINT64                                  StartingAddr;
3310*4661c169SSascha Wildner   UINT64                                  EndingAddr;
3311*4661c169SSascha Wildner 
3312*4661c169SSascha Wildner   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3313*4661c169SSascha Wildner   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
3314*4661c169SSascha Wildner   InstanceStr     = GetNextParamStr (&TextDeviceNode);
3315*4661c169SSascha Wildner 
3316*4661c169SSascha Wildner   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
3317*4661c169SSascha Wildner                                                      MEDIA_DEVICE_PATH,
3318*4661c169SSascha Wildner                                                      MEDIA_RAM_DISK_DP,
3319*4661c169SSascha Wildner                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3320*4661c169SSascha Wildner                                                      );
3321*4661c169SSascha Wildner 
3322*4661c169SSascha Wildner   Strtoi64 (StartingAddrStr, &StartingAddr);
3323*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
3324*4661c169SSascha Wildner   Strtoi64 (EndingAddrStr, &EndingAddr);
3325*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
3326*4661c169SSascha Wildner   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
3327*4661c169SSascha Wildner   CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);
3328*4661c169SSascha Wildner 
3329*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
3330*4661c169SSascha Wildner }
3331*4661c169SSascha Wildner 
3332*4661c169SSascha Wildner /**
3333*4661c169SSascha Wildner   Converts a text device path node to text persistent virtual cd device path structure.
3334*4661c169SSascha Wildner 
3335*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3336*4661c169SSascha Wildner 
3337*4661c169SSascha Wildner   @return A pointer to the newly-created Text device path structure.
3338*4661c169SSascha Wildner 
3339*4661c169SSascha Wildner **/
3340*4661c169SSascha Wildner static
3341*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextPersistentVirtualCd(IN CHAR16 * TextDeviceNode)3342*4661c169SSascha Wildner DevPathFromTextPersistentVirtualCd (
3343*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3344*4661c169SSascha Wildner   )
3345*4661c169SSascha Wildner {
3346*4661c169SSascha Wildner   CHAR16                                  *StartingAddrStr;
3347*4661c169SSascha Wildner   CHAR16                                  *EndingAddrStr;
3348*4661c169SSascha Wildner   CHAR16                                  *InstanceStr;
3349*4661c169SSascha Wildner   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
3350*4661c169SSascha Wildner   UINT64                                  StartingAddr;
3351*4661c169SSascha Wildner   UINT64                                  EndingAddr;
3352*4661c169SSascha Wildner 
3353*4661c169SSascha Wildner   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3354*4661c169SSascha Wildner   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
3355*4661c169SSascha Wildner   InstanceStr     = GetNextParamStr (&TextDeviceNode);
3356*4661c169SSascha Wildner 
3357*4661c169SSascha Wildner   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
3358*4661c169SSascha Wildner                                                      MEDIA_DEVICE_PATH,
3359*4661c169SSascha Wildner                                                      MEDIA_RAM_DISK_DP,
3360*4661c169SSascha Wildner                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3361*4661c169SSascha Wildner                                                      );
3362*4661c169SSascha Wildner 
3363*4661c169SSascha Wildner   Strtoi64 (StartingAddrStr, &StartingAddr);
3364*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
3365*4661c169SSascha Wildner   Strtoi64 (EndingAddrStr, &EndingAddr);
3366*4661c169SSascha Wildner   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
3367*4661c169SSascha Wildner   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
3368*4661c169SSascha Wildner   CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);
3369*4661c169SSascha Wildner 
3370*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
3371*4661c169SSascha Wildner }
3372*4661c169SSascha Wildner 
3373*4661c169SSascha Wildner /**
3374*4661c169SSascha Wildner   Converts a BBS text device path node to BBS device path structure.
3375*4661c169SSascha Wildner 
3376*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3377*4661c169SSascha Wildner 
3378*4661c169SSascha Wildner   @return A pointer to BBS device path structure.
3379*4661c169SSascha Wildner 
3380*4661c169SSascha Wildner **/
3381*4661c169SSascha Wildner static
3382*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBbsPath(IN CHAR16 * TextDeviceNode)3383*4661c169SSascha Wildner DevPathFromTextBbsPath (
3384*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3385*4661c169SSascha Wildner   )
3386*4661c169SSascha Wildner {
3387*4661c169SSascha Wildner   return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);
3388*4661c169SSascha Wildner }
3389*4661c169SSascha Wildner 
3390*4661c169SSascha Wildner /**
3391*4661c169SSascha Wildner   Converts a text device path node to BIOS Boot Specification device path structure.
3392*4661c169SSascha Wildner 
3393*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3394*4661c169SSascha Wildner 
3395*4661c169SSascha Wildner   @return A pointer to the newly-created BIOS Boot Specification device path structure.
3396*4661c169SSascha Wildner 
3397*4661c169SSascha Wildner **/
3398*4661c169SSascha Wildner static
3399*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextBBS(IN CHAR16 * TextDeviceNode)3400*4661c169SSascha Wildner DevPathFromTextBBS (
3401*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3402*4661c169SSascha Wildner   )
3403*4661c169SSascha Wildner {
3404*4661c169SSascha Wildner   CHAR16              *TypeStr;
3405*4661c169SSascha Wildner   CHAR16              *IdStr;
3406*4661c169SSascha Wildner   CHAR16              *FlagsStr;
3407*4661c169SSascha Wildner   CHAR8               *AsciiStr;
3408*4661c169SSascha Wildner   BBS_BBS_DEVICE_PATH *Bbs;
3409*4661c169SSascha Wildner 
3410*4661c169SSascha Wildner   TypeStr   = GetNextParamStr (&TextDeviceNode);
3411*4661c169SSascha Wildner   IdStr     = GetNextParamStr (&TextDeviceNode);
3412*4661c169SSascha Wildner   FlagsStr  = GetNextParamStr (&TextDeviceNode);
3413*4661c169SSascha Wildner   Bbs       = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (
3414*4661c169SSascha Wildner                                         BBS_DEVICE_PATH,
3415*4661c169SSascha Wildner                                         BBS_BBS_DP,
3416*4661c169SSascha Wildner                                         (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))
3417*4661c169SSascha Wildner                                         );
3418*4661c169SSascha Wildner 
3419*4661c169SSascha Wildner   if (StrCmp (TypeStr, "Floppy") == 0) {
3420*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_FLOPPY;
3421*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "HD") == 0) {
3422*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
3423*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "CDROM") == 0) {
3424*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_CDROM;
3425*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "PCMCIA") == 0) {
3426*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_PCMCIA;
3427*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "USB") == 0) {
3428*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_USB;
3429*4661c169SSascha Wildner   } else if (StrCmp (TypeStr, "Network") == 0) {
3430*4661c169SSascha Wildner     Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
3431*4661c169SSascha Wildner   } else {
3432*4661c169SSascha Wildner     Bbs->DeviceType = (UINT16) Strtoi (TypeStr);
3433*4661c169SSascha Wildner   }
3434*4661c169SSascha Wildner 
3435*4661c169SSascha Wildner   AsciiStr = Bbs->String;
3436*4661c169SSascha Wildner   StrToAscii (IdStr, &AsciiStr);
3437*4661c169SSascha Wildner 
3438*4661c169SSascha Wildner   Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);
3439*4661c169SSascha Wildner 
3440*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;
3441*4661c169SSascha Wildner }
3442*4661c169SSascha Wildner 
3443*4661c169SSascha Wildner /**
3444*4661c169SSascha Wildner   Converts a text device path node to SATA device path structure.
3445*4661c169SSascha Wildner 
3446*4661c169SSascha Wildner   @param TextDeviceNode  The input Text device path node.
3447*4661c169SSascha Wildner 
3448*4661c169SSascha Wildner   @return A pointer to the newly-created SATA device path structure.
3449*4661c169SSascha Wildner 
3450*4661c169SSascha Wildner **/
3451*4661c169SSascha Wildner static
3452*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextSata(IN CHAR16 * TextDeviceNode)3453*4661c169SSascha Wildner DevPathFromTextSata (
3454*4661c169SSascha Wildner   IN CHAR16 *TextDeviceNode
3455*4661c169SSascha Wildner   )
3456*4661c169SSascha Wildner {
3457*4661c169SSascha Wildner   SATA_DEVICE_PATH *Sata;
3458*4661c169SSascha Wildner   CHAR16           *Param1;
3459*4661c169SSascha Wildner   CHAR16           *Param2;
3460*4661c169SSascha Wildner   CHAR16           *Param3;
3461*4661c169SSascha Wildner 
3462*4661c169SSascha Wildner   Param1 = GetNextParamStr (&TextDeviceNode);
3463*4661c169SSascha Wildner   Param2 = GetNextParamStr (&TextDeviceNode);
3464*4661c169SSascha Wildner   Param3 = GetNextParamStr (&TextDeviceNode);
3465*4661c169SSascha Wildner 
3466*4661c169SSascha Wildner   Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (
3467*4661c169SSascha Wildner                                 MESSAGING_DEVICE_PATH,
3468*4661c169SSascha Wildner                                 MSG_SATA_DP,
3469*4661c169SSascha Wildner                                 (UINT16) sizeof (SATA_DEVICE_PATH)
3470*4661c169SSascha Wildner                                 );
3471*4661c169SSascha Wildner   Sata->HBAPortNumber            = (UINT16) Strtoi (Param1);
3472*4661c169SSascha Wildner   Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);
3473*4661c169SSascha Wildner   Sata->Lun                      = (UINT16) Strtoi (Param3);
3474*4661c169SSascha Wildner 
3475*4661c169SSascha Wildner   return (EFI_DEVICE_PATH_PROTOCOL *) Sata;
3476*4661c169SSascha Wildner }
3477*4661c169SSascha Wildner 
3478*4661c169SSascha Wildner GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {
3479*4661c169SSascha Wildner   {"Path",                    DevPathFromTextPath                    },
3480*4661c169SSascha Wildner 
3481*4661c169SSascha Wildner   {"HardwarePath",            DevPathFromTextHardwarePath            },
3482*4661c169SSascha Wildner   {"Pci",                     DevPathFromTextPci                     },
3483*4661c169SSascha Wildner   {"PcCard",                  DevPathFromTextPcCard                  },
3484*4661c169SSascha Wildner   {"MemoryMapped",            DevPathFromTextMemoryMapped            },
3485*4661c169SSascha Wildner   {"VenHw",                   DevPathFromTextVenHw                   },
3486*4661c169SSascha Wildner   {"Ctrl",                    DevPathFromTextCtrl                    },
3487*4661c169SSascha Wildner   {"BMC",                     DevPathFromTextBmc                     },
3488*4661c169SSascha Wildner 
3489*4661c169SSascha Wildner   {"AcpiPath",                DevPathFromTextAcpiPath                },
3490*4661c169SSascha Wildner   {"Acpi",                    DevPathFromTextAcpi                    },
3491*4661c169SSascha Wildner   {"PciRoot",                 DevPathFromTextPciRoot                 },
3492*4661c169SSascha Wildner   {"PcieRoot",                DevPathFromTextPcieRoot                },
3493*4661c169SSascha Wildner   {"Floppy",                  DevPathFromTextFloppy                  },
3494*4661c169SSascha Wildner   {"Keyboard",                DevPathFromTextKeyboard                },
3495*4661c169SSascha Wildner   {"Serial",                  DevPathFromTextSerial                  },
3496*4661c169SSascha Wildner   {"ParallelPort",            DevPathFromTextParallelPort            },
3497*4661c169SSascha Wildner   {"AcpiEx",                  DevPathFromTextAcpiEx                  },
3498*4661c169SSascha Wildner   {"AcpiExp",                 DevPathFromTextAcpiExp                 },
3499*4661c169SSascha Wildner   {"AcpiAdr",                 DevPathFromTextAcpiAdr                 },
3500*4661c169SSascha Wildner 
3501*4661c169SSascha Wildner   {"Msg",                     DevPathFromTextMsg                     },
3502*4661c169SSascha Wildner   {"Ata",                     DevPathFromTextAta                     },
3503*4661c169SSascha Wildner   {"Scsi",                    DevPathFromTextScsi                    },
3504*4661c169SSascha Wildner   {"Fibre",                   DevPathFromTextFibre                   },
3505*4661c169SSascha Wildner   {"FibreEx",                 DevPathFromTextFibreEx                 },
3506*4661c169SSascha Wildner   {"I1394",                   DevPathFromText1394                    },
3507*4661c169SSascha Wildner   {"USB",                     DevPathFromTextUsb                     },
3508*4661c169SSascha Wildner   {"I2O",                     DevPathFromTextI2O                     },
3509*4661c169SSascha Wildner   {"Infiniband",              DevPathFromTextInfiniband              },
3510*4661c169SSascha Wildner   {"VenMsg",                  DevPathFromTextVenMsg                  },
3511*4661c169SSascha Wildner   {"VenPcAnsi",               DevPathFromTextVenPcAnsi               },
3512*4661c169SSascha Wildner   {"VenVt100",                DevPathFromTextVenVt100                },
3513*4661c169SSascha Wildner   {"VenVt100Plus",            DevPathFromTextVenVt100Plus            },
3514*4661c169SSascha Wildner   {"VenUtf8",                 DevPathFromTextVenUtf8                 },
3515*4661c169SSascha Wildner   {"UartFlowCtrl",            DevPathFromTextUartFlowCtrl            },
3516*4661c169SSascha Wildner   {"SAS",                     DevPathFromTextSAS                     },
3517*4661c169SSascha Wildner   {"SasEx",                   DevPathFromTextSasEx                   },
3518*4661c169SSascha Wildner   {"NVMe",                    DevPathFromTextNVMe                    },
3519*4661c169SSascha Wildner   {"UFS",                     DevPathFromTextUfs                     },
3520*4661c169SSascha Wildner   {"SD",                      DevPathFromTextSd                      },
3521*4661c169SSascha Wildner   {"eMMC",                    DevPathFromTextEmmc                    },
3522*4661c169SSascha Wildner   {"DebugPort",               DevPathFromTextDebugPort               },
3523*4661c169SSascha Wildner   {"MAC",                     DevPathFromTextMAC                     },
3524*4661c169SSascha Wildner   {"IPv4",                    DevPathFromTextIPv4                    },
3525*4661c169SSascha Wildner   {"IPv6",                    DevPathFromTextIPv6                    },
3526*4661c169SSascha Wildner   {"Uart",                    DevPathFromTextUart                    },
3527*4661c169SSascha Wildner   {"UsbClass",                DevPathFromTextUsbClass                },
3528*4661c169SSascha Wildner   {"UsbAudio",                DevPathFromTextUsbAudio                },
3529*4661c169SSascha Wildner   {"UsbCDCControl",           DevPathFromTextUsbCDCControl           },
3530*4661c169SSascha Wildner   {"UsbHID",                  DevPathFromTextUsbHID                  },
3531*4661c169SSascha Wildner   {"UsbImage",                DevPathFromTextUsbImage                },
3532*4661c169SSascha Wildner   {"UsbPrinter",              DevPathFromTextUsbPrinter              },
3533*4661c169SSascha Wildner   {"UsbMassStorage",          DevPathFromTextUsbMassStorage          },
3534*4661c169SSascha Wildner   {"UsbHub",                  DevPathFromTextUsbHub                  },
3535*4661c169SSascha Wildner   {"UsbCDCData",              DevPathFromTextUsbCDCData              },
3536*4661c169SSascha Wildner   {"UsbSmartCard",            DevPathFromTextUsbSmartCard            },
3537*4661c169SSascha Wildner   {"UsbVideo",                DevPathFromTextUsbVideo                },
3538*4661c169SSascha Wildner   {"UsbDiagnostic",           DevPathFromTextUsbDiagnostic           },
3539*4661c169SSascha Wildner   {"UsbWireless",             DevPathFromTextUsbWireless             },
3540*4661c169SSascha Wildner   {"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },
3541*4661c169SSascha Wildner   {"UsbIrdaBridge",           DevPathFromTextUsbIrdaBridge           },
3542*4661c169SSascha Wildner   {"UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
3543*4661c169SSascha Wildner   {"UsbWwid",                 DevPathFromTextUsbWwid                 },
3544*4661c169SSascha Wildner   {"Unit",                    DevPathFromTextUnit                    },
3545*4661c169SSascha Wildner   {"iSCSI",                   DevPathFromTextiSCSI                   },
3546*4661c169SSascha Wildner   {"Vlan",                    DevPathFromTextVlan                    },
3547*4661c169SSascha Wildner   {"Uri",                     DevPathFromTextUri                     },
3548*4661c169SSascha Wildner   {"Bluetooth",               DevPathFromTextBluetooth               },
3549*4661c169SSascha Wildner   {"Wi-Fi",                   DevPathFromTextWiFi                    },
3550*4661c169SSascha Wildner   {"MediaPath",               DevPathFromTextMediaPath               },
3551*4661c169SSascha Wildner   {"HD",                      DevPathFromTextHD                      },
3552*4661c169SSascha Wildner   {"CDROM",                   DevPathFromTextCDROM                   },
3553*4661c169SSascha Wildner   {"VenMedia",                DevPathFromTextVenMedia                },
3554*4661c169SSascha Wildner   {"Media",                   DevPathFromTextMedia                   },
3555*4661c169SSascha Wildner   {"Fv",                      DevPathFromTextFv                      },
3556*4661c169SSascha Wildner   {"FvFile",                  DevPathFromTextFvFile                  },
3557*4661c169SSascha Wildner   {"File",                    DevPathFromTextFilePath                },
3558*4661c169SSascha Wildner   {"Offset",                  DevPathFromTextRelativeOffsetRange     },
3559*4661c169SSascha Wildner   {"RamDisk",                 DevPathFromTextRamDisk                 },
3560*4661c169SSascha Wildner   {"VirtualDisk",             DevPathFromTextVirtualDisk             },
3561*4661c169SSascha Wildner   {"VirtualCD",               DevPathFromTextVirtualCd               },
3562*4661c169SSascha Wildner   {"PersistentVirtualDisk",   DevPathFromTextPersistentVirtualDisk   },
3563*4661c169SSascha Wildner   {"PersistentVirtualCD",     DevPathFromTextPersistentVirtualCd     },
3564*4661c169SSascha Wildner 
3565*4661c169SSascha Wildner   {"BbsPath",                 DevPathFromTextBbsPath                 },
3566*4661c169SSascha Wildner   {"BBS",                     DevPathFromTextBBS                     },
3567*4661c169SSascha Wildner   {"Sata",                    DevPathFromTextSata                    },
3568*4661c169SSascha Wildner   {NULL, NULL}
3569*4661c169SSascha Wildner };
3570*4661c169SSascha Wildner 
3571*4661c169SSascha Wildner /**
3572*4661c169SSascha Wildner   Convert text to the binary representation of a device node.
3573*4661c169SSascha Wildner 
3574*4661c169SSascha Wildner   @param TextDeviceNode  TextDeviceNode points to the text representation of a device
3575*4661c169SSascha Wildner                          node. Conversion starts with the first character and continues
3576*4661c169SSascha Wildner                          until the first non-device node character.
3577*4661c169SSascha Wildner 
3578*4661c169SSascha Wildner   @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
3579*4661c169SSascha Wildner           insufficient memory or text unsupported.
3580*4661c169SSascha Wildner 
3581*4661c169SSascha Wildner **/
3582*4661c169SSascha Wildner static
3583*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
3584*4661c169SSascha Wildner EFIAPI
UefiDevicePathLibConvertTextToDeviceNode(IN CONST CHAR16 * TextDeviceNode)3585*4661c169SSascha Wildner UefiDevicePathLibConvertTextToDeviceNode (
3586*4661c169SSascha Wildner   IN CONST CHAR16 *TextDeviceNode
3587*4661c169SSascha Wildner   )
3588*4661c169SSascha Wildner {
3589*4661c169SSascha Wildner   DEVICE_PATH_FROM_TEXT    FromText;
3590*4661c169SSascha Wildner   CHAR16                   *ParamStr;
3591*4661c169SSascha Wildner   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
3592*4661c169SSascha Wildner   CHAR16                   *DeviceNodeStr;
3593*4661c169SSascha Wildner   UINTN                    Index;
3594*4661c169SSascha Wildner 
3595*4661c169SSascha Wildner   if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
3596*4661c169SSascha Wildner     return NULL;
3597*4661c169SSascha Wildner   }
3598*4661c169SSascha Wildner 
3599*4661c169SSascha Wildner   ParamStr      = NULL;
3600*4661c169SSascha Wildner   FromText      = NULL;
3601*4661c169SSascha Wildner   DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
3602*4661c169SSascha Wildner   ASSERT (DeviceNodeStr != NULL);
3603*4661c169SSascha Wildner 
3604*4661c169SSascha Wildner   for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {
3605*4661c169SSascha Wildner     ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);
3606*4661c169SSascha Wildner     if (ParamStr != NULL) {
3607*4661c169SSascha Wildner       FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;
3608*4661c169SSascha Wildner       break;
3609*4661c169SSascha Wildner     }
3610*4661c169SSascha Wildner   }
3611*4661c169SSascha Wildner 
3612*4661c169SSascha Wildner   if (FromText == NULL) {
3613*4661c169SSascha Wildner     //
3614*4661c169SSascha Wildner     // A file path
3615*4661c169SSascha Wildner     //
3616*4661c169SSascha Wildner     FromText = DevPathFromTextFilePath;
3617*4661c169SSascha Wildner     DeviceNode = FromText (DeviceNodeStr);
3618*4661c169SSascha Wildner   } else {
3619*4661c169SSascha Wildner     DeviceNode = FromText (ParamStr);
3620*4661c169SSascha Wildner     FreePool (ParamStr);
3621*4661c169SSascha Wildner   }
3622*4661c169SSascha Wildner 
3623*4661c169SSascha Wildner   FreePool (DeviceNodeStr);
3624*4661c169SSascha Wildner 
3625*4661c169SSascha Wildner   return DeviceNode;
3626*4661c169SSascha Wildner }
3627*4661c169SSascha Wildner 
3628*4661c169SSascha Wildner /**
3629*4661c169SSascha Wildner   Convert text to the binary representation of a device path.
3630*4661c169SSascha Wildner 
3631*4661c169SSascha Wildner 
3632*4661c169SSascha Wildner   @param TextDevicePath  TextDevicePath points to the text representation of a device
3633*4661c169SSascha Wildner                          path. Conversion starts with the first character and continues
3634*4661c169SSascha Wildner                          until the first non-device node character.
3635*4661c169SSascha Wildner 
3636*4661c169SSascha Wildner   @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
3637*4661c169SSascha Wildner           there was insufficient memory.
3638*4661c169SSascha Wildner 
3639*4661c169SSascha Wildner **/
3640*4661c169SSascha Wildner static
3641*4661c169SSascha Wildner EFI_DEVICE_PATH_PROTOCOL *
3642*4661c169SSascha Wildner EFIAPI
UefiDevicePathLibConvertTextToDevicePath(IN CONST CHAR16 * TextDevicePath)3643*4661c169SSascha Wildner UefiDevicePathLibConvertTextToDevicePath (
3644*4661c169SSascha Wildner   IN CONST CHAR16 *TextDevicePath
3645*4661c169SSascha Wildner   )
3646*4661c169SSascha Wildner {
3647*4661c169SSascha Wildner   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
3648*4661c169SSascha Wildner   EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
3649*4661c169SSascha Wildner   CHAR16                   *DevicePathStr;
3650*4661c169SSascha Wildner   CHAR16                   *Str;
3651*4661c169SSascha Wildner   CHAR16                   *DeviceNodeStr;
3652*4661c169SSascha Wildner   BOOLEAN                  IsInstanceEnd;
3653*4661c169SSascha Wildner   EFI_DEVICE_PATH_PROTOCOL *DevicePath;
3654*4661c169SSascha Wildner 
3655*4661c169SSascha Wildner   if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
3656*4661c169SSascha Wildner     return NULL;
3657*4661c169SSascha Wildner   }
3658*4661c169SSascha Wildner 
3659*4661c169SSascha Wildner   DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
3660*4661c169SSascha Wildner   ASSERT (DevicePath != NULL);
3661*4661c169SSascha Wildner   SetDevicePathEndNode (DevicePath);
3662*4661c169SSascha Wildner 
3663*4661c169SSascha Wildner   DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);
3664*4661c169SSascha Wildner 
3665*4661c169SSascha Wildner   Str           = DevicePathStr;
3666*4661c169SSascha Wildner   while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
3667*4661c169SSascha Wildner     DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);
3668*4661c169SSascha Wildner 
3669*4661c169SSascha Wildner     NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
3670*4661c169SSascha Wildner     FreePool (DevicePath);
3671*4661c169SSascha Wildner     FreePool (DeviceNode);
3672*4661c169SSascha Wildner     DevicePath = NewDevicePath;
3673*4661c169SSascha Wildner 
3674*4661c169SSascha Wildner     if (IsInstanceEnd) {
3675*4661c169SSascha Wildner       DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
3676*4661c169SSascha Wildner       ASSERT (DeviceNode != NULL);
3677*4661c169SSascha Wildner       SetDevicePathEndNode (DeviceNode);
3678*4661c169SSascha Wildner       // Fix from https://bugzilla.tianocore.org/show_bug.cgi?id=419
3679*4661c169SSascha Wildner       DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
3680*4661c169SSascha Wildner 
3681*4661c169SSascha Wildner       NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
3682*4661c169SSascha Wildner       FreePool (DevicePath);
3683*4661c169SSascha Wildner       FreePool (DeviceNode);
3684*4661c169SSascha Wildner       DevicePath = NewDevicePath;
3685*4661c169SSascha Wildner     }
3686*4661c169SSascha Wildner   }
3687*4661c169SSascha Wildner 
3688*4661c169SSascha Wildner   FreePool (DevicePathStr);
3689*4661c169SSascha Wildner   return DevicePath;
3690*4661c169SSascha Wildner }
3691*4661c169SSascha Wildner 
3692*4661c169SSascha Wildner ssize_t
efidp_parse_device_path(char * path,efidp out,size_t max)3693*4661c169SSascha Wildner efidp_parse_device_path(char *path, efidp out, size_t max)
3694*4661c169SSascha Wildner {
3695*4661c169SSascha Wildner 	EFI_DEVICE_PATH_PROTOCOL *dp;
3696*4661c169SSascha Wildner 	UINTN len;
3697*4661c169SSascha Wildner 
3698*4661c169SSascha Wildner 	dp = UefiDevicePathLibConvertTextToDevicePath (path);
3699*4661c169SSascha Wildner 	if (dp == NULL)
3700*4661c169SSascha Wildner 		return -1;
3701*4661c169SSascha Wildner 	len = GetDevicePathSize(dp);
3702*4661c169SSascha Wildner 	if (len > max) {
3703*4661c169SSascha Wildner 		free(dp);
3704*4661c169SSascha Wildner 		return -1;
3705*4661c169SSascha Wildner 	}
3706*4661c169SSascha Wildner 	memcpy(out, dp, len);
3707*4661c169SSascha Wildner 	free(dp);
3708*4661c169SSascha Wildner 
3709*4661c169SSascha Wildner 	return len;
3710*4661c169SSascha Wildner }
3711