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