]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DevicePathDxe/DevicePathFromText.c
Update inf file to follow spec.
[mirror_edk2.git] / MdeModulePkg / Universal / DevicePathDxe / DevicePathFromText.c
CommitLineData
13d40edd 1/** @file\r
2 DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
95276127 3\r
5b84091f 4Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
13d40edd 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
95276127 9\r
13d40edd 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
95276127 12\r
13d40edd 13**/\r
95276127 14\r
95276127 15#include "DevicePath.h"\r
16\r
95276127 17\r
572f5d8a 18/**\r
95276127 19\r
572f5d8a 20 Duplicates a string.\r
95276127 21\r
572f5d8a 22 @param Src Source string.\r
95276127 23\r
572f5d8a 24 @return The duplicated string.\r
25\r
26**/\r
27CHAR16 *\r
28StrDuplicate (\r
29 IN CONST CHAR16 *Src\r
30 )\r
95276127 31{\r
572f5d8a 32 return AllocateCopyPool (StrSize (Src), Src);\r
33}\r
95276127 34\r
572f5d8a 35/**\r
95276127 36\r
572f5d8a 37 Get parameter in a pair of parentheses follow the given node name.\r
38 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
95276127 39\r
572f5d8a 40 @param Str Device Path Text.\r
41 @param NodeName Name of the node.\r
95276127 42\r
572f5d8a 43 @return Parameter text for the node.\r
44\r
45**/\r
95276127 46CHAR16 *\r
47GetParamByNodeName (\r
48 IN CHAR16 *Str,\r
49 IN CHAR16 *NodeName\r
50 )\r
95276127 51{\r
52 CHAR16 *ParamStr;\r
53 CHAR16 *StrPointer;\r
54 UINTN NodeNameLength;\r
55 UINTN ParameterLength;\r
56\r
57 //\r
58 // Check whether the node name matchs\r
59 //\r
60 NodeNameLength = StrLen (NodeName);\r
61 if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {\r
62 return NULL;\r
63 }\r
64\r
65 ParamStr = Str + NodeNameLength;\r
66 if (!IS_LEFT_PARENTH (*ParamStr)) {\r
67 return NULL;\r
68 }\r
69\r
70 //\r
71 // Skip the found '(' and find first occurrence of ')'\r
72 //\r
73 ParamStr++;\r
74 ParameterLength = 0;\r
75 StrPointer = ParamStr;\r
76 while (!IS_NULL (*StrPointer)) {\r
77 if (IS_RIGHT_PARENTH (*StrPointer)) {\r
78 break;\r
79 }\r
80 StrPointer++;\r
81 ParameterLength++;\r
82 }\r
83 if (IS_NULL (*StrPointer)) {\r
84 //\r
85 // ')' not found\r
86 //\r
87 return NULL;\r
88 }\r
89\r
90 ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);\r
91 if (ParamStr == NULL) {\r
92 return NULL;\r
93 }\r
94 //\r
95 // Terminate the parameter string\r
96 //\r
97 ParamStr[ParameterLength] = L'\0';\r
98\r
99 return ParamStr;\r
100}\r
101\r
572f5d8a 102/**\r
103 Gets current sub-string from a string list, before return\r
104 the list header is moved to next sub-string. The sub-string is separated\r
105 by the specified character. For example, the separator is ',', the string\r
106 list is "2,0,3", it returns "2", the remain list move to "0,3"\r
107\r
108 @param List A string list separated by the specified separator\r
109 @param Separator The separator character\r
110\r
111 @return A pointer to the current sub-string\r
112\r
113**/\r
95276127 114CHAR16 *\r
115SplitStr (\r
116 IN OUT CHAR16 **List,\r
117 IN CHAR16 Separator\r
118 )\r
95276127 119{\r
120 CHAR16 *Str;\r
121 CHAR16 *ReturnStr;\r
122\r
123 Str = *List;\r
124 ReturnStr = Str;\r
125\r
126 if (IS_NULL (*Str)) {\r
127 return ReturnStr;\r
128 }\r
129\r
130 //\r
131 // Find first occurrence of the separator\r
132 //\r
133 while (!IS_NULL (*Str)) {\r
134 if (*Str == Separator) {\r
135 break;\r
136 }\r
137 Str++;\r
138 }\r
139\r
140 if (*Str == Separator) {\r
141 //\r
142 // Find a sub-string, terminate it\r
143 //\r
144 *Str = L'\0';\r
145 Str++;\r
146 }\r
147\r
148 //\r
149 // Move to next sub-string\r
150 //\r
151 *List = Str;\r
152\r
153 return ReturnStr;\r
154}\r
155\r
572f5d8a 156/**\r
157 Gets the next parameter string from the list.\r
158\r
159 @param List A string list separated by the specified separator\r
160\r
161 @return A pointer to the current sub-string\r
162\r
163**/\r
95276127 164CHAR16 *\r
165GetNextParamStr (\r
166 IN OUT CHAR16 **List\r
167 )\r
168{\r
169 //\r
170 // The separator is comma\r
171 //\r
172 return SplitStr (List, L',');\r
173}\r
174\r
572f5d8a 175/**\r
176 Get one device node from entire device path text.\r
177\r
178 @param DevicePath On input, the current Device Path node; on output, the next device path node\r
179 @param IsInstanceEnd This node is the end of a device path instance\r
180\r
181 @return A device node text or NULL if no more device node available\r
182\r
183**/\r
95276127 184CHAR16 *\r
185GetNextDeviceNodeStr (\r
186 IN OUT CHAR16 **DevicePath,\r
187 OUT BOOLEAN *IsInstanceEnd\r
188 )\r
95276127 189{\r
190 CHAR16 *Str;\r
191 CHAR16 *ReturnStr;\r
192 UINTN ParenthesesStack;\r
193\r
194 Str = *DevicePath;\r
195 if (IS_NULL (*Str)) {\r
196 return NULL;\r
197 }\r
198\r
199 //\r
200 // Skip the leading '/', '(', ')' and ','\r
201 //\r
202 while (!IS_NULL (*Str)) {\r
203 if (!IS_SLASH (*Str) &&\r
204 !IS_COMMA (*Str) &&\r
205 !IS_LEFT_PARENTH (*Str) &&\r
206 !IS_RIGHT_PARENTH (*Str)) {\r
207 break;\r
208 }\r
209 Str++;\r
210 }\r
211\r
212 ReturnStr = Str;\r
213\r
214 //\r
215 // Scan for the separator of this device node, '/' or ','\r
216 //\r
217 ParenthesesStack = 0;\r
218 while (!IS_NULL (*Str)) {\r
219 if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {\r
220 break;\r
221 }\r
222\r
223 if (IS_LEFT_PARENTH (*Str)) {\r
224 ParenthesesStack++;\r
225 } else if (IS_RIGHT_PARENTH (*Str)) {\r
226 ParenthesesStack--;\r
227 }\r
228\r
229 Str++;\r
230 }\r
231\r
232 if (ParenthesesStack != 0) {\r
233 //\r
234 // The '(' doesn't pair with ')', invalid device path text\r
235 //\r
236 return NULL;\r
237 }\r
238\r
239 if (IS_COMMA (*Str)) {\r
240 *IsInstanceEnd = TRUE;\r
241 *Str = L'\0';\r
242 Str++;\r
243 } else {\r
244 *IsInstanceEnd = FALSE;\r
245 if (!IS_NULL (*Str)) {\r
246 *Str = L'\0';\r
247 Str++;\r
248 }\r
249 }\r
250\r
251 *DevicePath = Str;\r
252\r
253 return ReturnStr;\r
254}\r
255\r
95276127 256\r
572f5d8a 257/**\r
258 Skip the leading white space and '0x' or '0X' of a integer string\r
259\r
260 @param Str The integer string\r
261 @param IsHex TRUE: Hex string, FALSE: Decimal string\r
262\r
263 @return The trimmed Hex string.\r
264\r
265**/\r
95276127 266CHAR16 *\r
267TrimHexStr (\r
cf40f28a 268 IN CHAR16 *Str,\r
269 OUT BOOLEAN *IsHex\r
95276127 270 )\r
95276127 271{\r
cf40f28a 272 *IsHex = FALSE;\r
273\r
95276127 274 //\r
275 // skip preceeding white space\r
276 //\r
572f5d8a 277 while ((*Str != 0) && *Str == ' ') {\r
95276127 278 Str += 1;\r
279 }\r
280 //\r
281 // skip preceeding zeros\r
282 //\r
572f5d8a 283 while ((*Str != 0) && *Str == '0') {\r
95276127 284 Str += 1;\r
285 }\r
286 //\r
287 // skip preceeding character 'x' or 'X'\r
288 //\r
572f5d8a 289 if ((*Str != 0) && (*Str == 'x' || *Str == 'X')) {\r
95276127 290 Str += 1;\r
cf40f28a 291 *IsHex = TRUE;\r
95276127 292 }\r
293\r
294 return Str;\r
295}\r
296\r
572f5d8a 297/**\r
95276127 298\r
572f5d8a 299 Convert hex string to uint.\r
95276127 300\r
572f5d8a 301 @param Str The hex string\r
95276127 302\r
572f5d8a 303 @return A UINTN value represented by Str\r
95276127 304\r
572f5d8a 305**/\r
306UINTN\r
307Xtoi (\r
308 IN CHAR16 *Str\r
309 )\r
95276127 310{\r
ac7e320c 311 return StrHexToUintn (Str);\r
95276127 312}\r
313\r
572f5d8a 314/**\r
95276127 315\r
316 Convert hex string to 64 bit data.\r
317\r
572f5d8a 318 @param Str The hex string\r
319 @param Data A pointer to the UINT64 value represented by Str\r
95276127 320\r
572f5d8a 321**/\r
322VOID\r
323Xtoi64 (\r
324 IN CHAR16 *Str,\r
325 OUT UINT64 *Data\r
326 )\r
95276127 327{\r
ac7e320c 328 *Data = StrHexToUint64 (Str);\r
95276127 329}\r
330\r
572f5d8a 331/**\r
95276127 332\r
572f5d8a 333 Convert decimal string to uint.\r
95276127 334\r
572f5d8a 335 @param Str The decimal string\r
95276127 336\r
572f5d8a 337 @return A UINTN value represented by Str\r
95276127 338\r
572f5d8a 339**/\r
340UINTN\r
341Dtoi (\r
342 IN CHAR16 *Str\r
343 )\r
95276127 344{\r
345 UINTN Rvalue;\r
346 CHAR16 Char;\r
347 UINTN High;\r
348 UINTN Low;\r
349\r
572f5d8a 350 ASSERT (Str != NULL);\r
95276127 351\r
352 High = (UINTN) -1 / 10;\r
353 Low = (UINTN) -1 % 10;\r
354 //\r
355 // skip preceeding white space\r
356 //\r
572f5d8a 357 while ((*Str != 0) && *Str == ' ') {\r
358 Str += 1;\r
95276127 359 }\r
360 //\r
361 // convert digits\r
362 //\r
363 Rvalue = 0;\r
572f5d8a 364 Char = *(Str++);\r
365 while (Char != 0) {\r
95276127 366 if (Char >= '0' && Char <= '9') {\r
367 if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
368 return (UINTN) -1;\r
369 }\r
370\r
371 Rvalue = (Rvalue * 10) + Char - '0';\r
372 } else {\r
373 break;\r
374 }\r
375\r
572f5d8a 376 Char = *(Str++);\r
95276127 377 }\r
378\r
379 return Rvalue;\r
380}\r
381\r
572f5d8a 382/**\r
383\r
384 Convert decimal string to uint.\r
385\r
386 @param Str The decimal string\r
387 @param Data A pointer to the UINT64 value represented by Str\r
388\r
389**/\r
cf40f28a 390VOID\r
391Dtoi64 (\r
572f5d8a 392 IN CHAR16 *Str,\r
cf40f28a 393 OUT UINT64 *Data\r
394 )\r
cf40f28a 395{\r
396 UINT64 Rvalue;\r
397 CHAR16 Char;\r
398 UINT64 High;\r
399 UINT64 Low;\r
400\r
572f5d8a 401 ASSERT (Str != NULL);\r
cf40f28a 402 ASSERT (Data != NULL);\r
403\r
404 //\r
405 // skip preceeding white space\r
406 //\r
572f5d8a 407 while ((*Str != 0) && *Str == ' ') {\r
408 Str += 1;\r
cf40f28a 409 }\r
410 //\r
411 // convert digits\r
412 //\r
413 Rvalue = 0;\r
572f5d8a 414 Char = *(Str++);\r
415 while (Char != 0) {\r
cf40f28a 416 if (Char >= '0' && Char <= '9') {\r
417 High = LShiftU64 (Rvalue, 3);\r
418 Low = LShiftU64 (Rvalue, 1);\r
419 Rvalue = High + Low + Char - '0';\r
420 } else {\r
421 break;\r
422 }\r
423\r
572f5d8a 424 Char = *(Str++);\r
cf40f28a 425 }\r
426\r
427 *Data = Rvalue;\r
428}\r
429\r
572f5d8a 430/**\r
cf40f28a 431\r
432 Convert integer string to uint.\r
433\r
5755841f 434 @param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.\r
cf40f28a 435\r
572f5d8a 436 @return A UINTN value represented by Str\r
cf40f28a 437\r
572f5d8a 438**/\r
439UINTN\r
440Strtoi (\r
441 IN CHAR16 *Str\r
442 )\r
cf40f28a 443{\r
444 BOOLEAN IsHex;\r
445\r
446 Str = TrimHexStr (Str, &IsHex);\r
447\r
448 if (IsHex) {\r
449 return Xtoi (Str);\r
450 } else {\r
451 return Dtoi (Str);\r
452 }\r
453}\r
454\r
572f5d8a 455/**\r
cf40f28a 456\r
457 Convert integer string to 64 bit data.\r
458\r
5755841f 459 @param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.\r
572f5d8a 460 @param Data A pointer to the UINT64 value represented by Str\r
cf40f28a 461\r
572f5d8a 462**/\r
463VOID\r
464Strtoi64 (\r
465 IN CHAR16 *Str,\r
466 OUT UINT64 *Data\r
467 )\r
cf40f28a 468{\r
469 BOOLEAN IsHex;\r
470\r
471 Str = TrimHexStr (Str, &IsHex);\r
472\r
473 if (IsHex) {\r
474 Xtoi64 (Str, Data);\r
475 } else {\r
476 Dtoi64 (Str, Data);\r
477 }\r
478}\r
479\r
572f5d8a 480/**\r
481 Converts a list of string to a specified buffer.\r
482\r
483 @param Buf The output buffer that contains the string.\r
484 @param BufferLength The length of the buffer\r
485 @param Str The input string that contains the hex number\r
486\r
487 @retval EFI_SUCCESS The string was successfully converted to the buffer.\r
488\r
489**/\r
490EFI_STATUS\r
95276127 491StrToBuf (\r
492 OUT UINT8 *Buf,\r
493 IN UINTN BufferLength,\r
494 IN CHAR16 *Str\r
495 )\r
496{\r
497 UINTN Index;\r
498 UINTN StrLength;\r
499 UINT8 Digit;\r
500 UINT8 Byte;\r
501\r
6ee5bbdd 502 Digit = 0;\r
503\r
95276127 504 //\r
505 // Two hex char make up one byte\r
506 //\r
507 StrLength = BufferLength * sizeof (CHAR16);\r
508\r
509 for(Index = 0; Index < StrLength; Index++, Str++) {\r
510\r
ac7e320c
LG
511 if ((*Str >= L'a') && (*Str <= L'f')) {\r
512 Digit = (UINT8) (*Str - L'a' + 0x0A);\r
513 } else if ((*Str >= L'A') && (*Str <= L'F')) {\r
514 Digit = (UINT8) (*Str - L'A' + 0x0A);\r
515 } else if ((*Str >= L'0') && (*Str <= L'9')) {\r
516 Digit = (UINT8) (*Str - L'0');\r
517 } else {\r
518 return EFI_INVALID_PARAMETER;\r
519 }\r
95276127 520\r
521 //\r
5755841f 522 // For odd characters, write the upper nibble for each buffer byte,\r
95276127 523 // and for even characters, the lower nibble.\r
524 //\r
525 if ((Index & 1) == 0) {\r
526 Byte = (UINT8) (Digit << 4);\r
527 } else {\r
528 Byte = Buf[Index / 2];\r
529 Byte &= 0xF0;\r
530 Byte = (UINT8) (Byte | Digit);\r
531 }\r
532\r
533 Buf[Index / 2] = Byte;\r
534 }\r
535\r
536 return EFI_SUCCESS;\r
537}\r
538\r
572f5d8a 539/**\r
540 Converts a string to GUID value.\r
ac7e320c 541 Guid Format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r
572f5d8a 542\r
543 @param Str The registry format GUID string that contains the GUID value.\r
544 @param Guid A pointer to the converted GUID value.\r
545\r
546 @retval EFI_SUCCESS The GUID string was successfully converted to the GUID value.\r
547 @retval EFI_UNSUPPORTED The input string is not in registry format.\r
548 @return others Some error occurred when converting part of GUID value.\r
549\r
550**/\r
95276127 551EFI_STATUS\r
552StrToGuid (\r
553 IN CHAR16 *Str,\r
554 OUT EFI_GUID *Guid\r
555 )\r
556{\r
ac7e320c
LG
557 //\r
558 // Get the first UINT32 data\r
559 //\r
560 Guid->Data1 = (UINT32) StrHexToUint64 (Str);\r
561 while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
562 Str ++;\r
95276127 563 }\r
ac7e320c 564 \r
95276127 565 if (IS_HYPHEN (*Str)) {\r
572f5d8a 566 Str++;\r
95276127 567 } else {\r
568 return EFI_UNSUPPORTED;\r
569 }\r
ac7e320c
LG
570 \r
571 //\r
572 // Get the second UINT16 data\r
573 //\r
574 Guid->Data2 = (UINT16) StrHexToUint64 (Str);\r
575 while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
576 Str ++;\r
95276127 577 }\r
ac7e320c 578\r
95276127 579 if (IS_HYPHEN (*Str)) {\r
580 Str++;\r
581 } else {\r
582 return EFI_UNSUPPORTED;\r
583 }\r
ac7e320c
LG
584 \r
585 //\r
586 // Get the third UINT16 data\r
587 //\r
588 Guid->Data3 = (UINT16) StrHexToUint64 (Str);\r
589 while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
590 Str ++;\r
95276127 591 }\r
ac7e320c 592\r
95276127 593 if (IS_HYPHEN (*Str)) {\r
594 Str++;\r
595 } else {\r
596 return EFI_UNSUPPORTED;\r
597 }\r
598\r
ac7e320c 599 //\r
5755841f 600 // Get the following 8 bytes data\r
ac7e320c 601 // \r
95276127 602 StrToBuf (&Guid->Data4[0], 2, Str);\r
603 //\r
604 // Skip 2 byte hex chars\r
605 //\r
606 Str += 2 * 2;\r
607\r
608 if (IS_HYPHEN (*Str)) {\r
609 Str++;\r
610 } else {\r
611 return EFI_UNSUPPORTED;\r
612 }\r
613 StrToBuf (&Guid->Data4[2], 6, Str);\r
614\r
615 return EFI_SUCCESS;\r
616}\r
617\r
572f5d8a 618/**\r
619 Converts a string to IPv4 address\r
620\r
621 @param Str A string representation of IPv4 address.\r
622 @param IPv4Addr A pointer to the converted IPv4 address.\r
623\r
624**/\r
95276127 625VOID\r
626StrToIPv4Addr (\r
627 IN OUT CHAR16 **Str,\r
628 OUT EFI_IPv4_ADDRESS *IPv4Addr\r
629 )\r
630{\r
631 UINTN Index;\r
632\r
633 for (Index = 0; Index < 4; Index++) {\r
cf40f28a 634 IPv4Addr->Addr[Index] = (UINT8) Dtoi (SplitStr (Str, L'.'));\r
95276127 635 }\r
636}\r
637\r
572f5d8a 638/**\r
639 Converts a string to IPv4 address\r
640\r
641 @param Str A string representation of IPv6 address.\r
642 @param IPv6Addr A pointer to the converted IPv6 address.\r
643\r
644**/\r
95276127 645VOID\r
646StrToIPv6Addr (\r
647 IN OUT CHAR16 **Str,\r
648 OUT EFI_IPv6_ADDRESS *IPv6Addr\r
649 )\r
650{\r
651 UINTN Index;\r
652 UINT16 Data;\r
653\r
654 for (Index = 0; Index < 8; Index++) {\r
655 Data = (UINT16) Xtoi (SplitStr (Str, L':'));\r
656 IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
657 IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
658 }\r
659}\r
660\r
572f5d8a 661/**\r
662 Converts a Unicode string to ASCII string.\r
663\r
5755841f 664 @param Str The equivalent Unicode string\r
572f5d8a 665 @param AsciiStr On input, it points to destination ASCII string buffer; on output, it points\r
666 to the next ASCII string next to it\r
667\r
668**/\r
95276127 669VOID\r
670StrToAscii (\r
671 IN CHAR16 *Str,\r
672 IN OUT CHAR8 **AsciiStr\r
673 )\r
674{\r
675 CHAR8 *Dest;\r
676\r
677 Dest = *AsciiStr;\r
678 while (!IS_NULL (*Str)) {\r
679 *(Dest++) = (CHAR8) *(Str++);\r
680 }\r
681 *Dest = 0;\r
682\r
683 //\r
684 // Return the string next to it\r
685 //\r
686 *AsciiStr = Dest + 1;\r
687}\r
688\r
572f5d8a 689/**\r
690 Converts a text device path node to Hardware PCI device path structure.\r
691\r
692 @param TextDeviceNode The input Text device path node.\r
693\r
694 @return A pointer to Hardware PCI device path structure.\r
695\r
696**/\r
95276127 697EFI_DEVICE_PATH_PROTOCOL *\r
698DevPathFromTextPci (\r
699 IN CHAR16 *TextDeviceNode\r
700 )\r
701{\r
702 CHAR16 *FunctionStr;\r
703 CHAR16 *DeviceStr;\r
704 PCI_DEVICE_PATH *Pci;\r
705\r
95276127 706 DeviceStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 707 FunctionStr = GetNextParamStr (&TextDeviceNode);\r
95276127 708 Pci = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
709 HARDWARE_DEVICE_PATH,\r
710 HW_PCI_DP,\r
c9325700 711 (UINT16) sizeof (PCI_DEVICE_PATH)\r
95276127 712 );\r
713\r
cf40f28a 714 Pci->Function = (UINT8) Strtoi (FunctionStr);\r
715 Pci->Device = (UINT8) Strtoi (DeviceStr);\r
95276127 716\r
717 return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
718}\r
719\r
572f5d8a 720/**\r
721 Converts a text device path node to Hardware PC card device path structure.\r
722\r
723 @param TextDeviceNode The input Text device path node.\r
724\r
725 @return A pointer to Hardware PC card device path structure.\r
726\r
727**/\r
95276127 728EFI_DEVICE_PATH_PROTOCOL *\r
729DevPathFromTextPcCard (\r
730 IN CHAR16 *TextDeviceNode\r
731 )\r
732{\r
733 CHAR16 *FunctionNumberStr;\r
734 PCCARD_DEVICE_PATH *Pccard;\r
735\r
736 FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
737 Pccard = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
738 HARDWARE_DEVICE_PATH,\r
739 HW_PCCARD_DP,\r
c9325700 740 (UINT16) sizeof (PCCARD_DEVICE_PATH)\r
95276127 741 );\r
742\r
cf40f28a 743 Pccard->FunctionNumber = (UINT8) Strtoi (FunctionNumberStr);\r
95276127 744\r
745 return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
746}\r
747\r
572f5d8a 748/**\r
749 Converts a text device path node to Hardware memory map device path structure.\r
750\r
751 @param TextDeviceNode The input Text device path node.\r
752\r
753 @return A pointer to Hardware memory map device path structure.\r
754\r
755**/\r
95276127 756EFI_DEVICE_PATH_PROTOCOL *\r
757DevPathFromTextMemoryMapped (\r
758 IN CHAR16 *TextDeviceNode\r
759 )\r
760{\r
cf40f28a 761 CHAR16 *MemoryTypeStr;\r
95276127 762 CHAR16 *StartingAddressStr;\r
763 CHAR16 *EndingAddressStr;\r
764 MEMMAP_DEVICE_PATH *MemMap;\r
765\r
cf40f28a 766 MemoryTypeStr = GetNextParamStr (&TextDeviceNode);\r
95276127 767 StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
768 EndingAddressStr = GetNextParamStr (&TextDeviceNode);\r
769 MemMap = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
770 HARDWARE_DEVICE_PATH,\r
771 HW_MEMMAP_DP,\r
c9325700 772 (UINT16) sizeof (MEMMAP_DEVICE_PATH)\r
95276127 773 );\r
774\r
cf40f28a 775 MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);\r
776 Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
777 Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
95276127 778\r
779 return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
780}\r
781\r
572f5d8a 782/**\r
783 Converts a text device path node to Vendor device path structure based on the input Type\r
784 and SubType.\r
785\r
786 @param TextDeviceNode The input Text device path node.\r
787 @param Type The type of device path node.\r
788 @param SubType The subtype of device path node.\r
789\r
790 @return A pointer to the newly-created Vendor device path structure.\r
791\r
792**/\r
95276127 793EFI_DEVICE_PATH_PROTOCOL *\r
794ConvertFromTextVendor (\r
795 IN CHAR16 *TextDeviceNode,\r
796 IN UINT8 Type,\r
797 IN UINT8 SubType\r
798 )\r
799{\r
800 CHAR16 *GuidStr;\r
801 CHAR16 *DataStr;\r
802 UINTN Length;\r
803 VENDOR_DEVICE_PATH *Vendor;\r
804\r
805 GuidStr = GetNextParamStr (&TextDeviceNode);\r
806\r
807 DataStr = GetNextParamStr (&TextDeviceNode);\r
808 Length = StrLen (DataStr);\r
809 //\r
810 // Two hex characters make up 1 buffer byte\r
811 //\r
812 Length = (Length + 1) / 2;\r
813\r
814 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
815 Type,\r
816 SubType,\r
d074a8e1 817 (UINT16) (sizeof (VENDOR_DEVICE_PATH) + Length)\r
95276127 818 );\r
819\r
820 StrToGuid (GuidStr, &Vendor->Guid);\r
821 StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
822\r
823 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
824}\r
825\r
572f5d8a 826/**\r
827 Converts a text device path node to Vendor Hardware device path structure.\r
828\r
829 @param TextDeviceNode The input Text device path node.\r
830\r
831 @return A pointer to the newly-created Vendor Hardware device path structure.\r
832\r
833**/\r
95276127 834EFI_DEVICE_PATH_PROTOCOL *\r
835DevPathFromTextVenHw (\r
836 IN CHAR16 *TextDeviceNode\r
837 )\r
838{\r
839 return ConvertFromTextVendor (\r
840 TextDeviceNode,\r
841 HARDWARE_DEVICE_PATH,\r
842 HW_VENDOR_DP\r
843 );\r
844}\r
845\r
572f5d8a 846/**\r
847 Converts a text device path node to Hardware Controller device path structure.\r
848\r
849 @param TextDeviceNode The input Text device path node.\r
850\r
851 @return A pointer to the newly-created Hardware Controller device path structure.\r
852\r
853**/\r
95276127 854EFI_DEVICE_PATH_PROTOCOL *\r
855DevPathFromTextCtrl (\r
856 IN CHAR16 *TextDeviceNode\r
857 )\r
858{\r
859 CHAR16 *ControllerStr;\r
860 CONTROLLER_DEVICE_PATH *Controller;\r
861\r
862 ControllerStr = GetNextParamStr (&TextDeviceNode);\r
863 Controller = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
864 HARDWARE_DEVICE_PATH,\r
865 HW_CONTROLLER_DP,\r
c9325700 866 (UINT16) sizeof (CONTROLLER_DEVICE_PATH)\r
95276127 867 );\r
cf40f28a 868 Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);\r
95276127 869\r
870 return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
871}\r
872\r
572f5d8a 873/**\r
874 Converts a string to EisaId.\r
875\r
876 @param Text The input string.\r
877 @param EisaId A pointer to the output EisaId.\r
878\r
879**/\r
cf40f28a 880VOID\r
881EisaIdFromText (\r
882 IN CHAR16 *Text,\r
883 OUT UINT32 *EisaId\r
884 )\r
885{\r
886 UINTN PnpId;\r
887\r
888 PnpId = Xtoi (Text + 3);\r
572f5d8a 889 *EisaId = (((Text[0] - '@') & 0x1f) << 10) +\r
890 (((Text[1] - '@') & 0x1f) << 5) +\r
cf40f28a 891 ((Text[2] - '@') & 0x1f) +\r
892 (UINT32) (PnpId << 16);\r
893}\r
894\r
572f5d8a 895/**\r
896 Converts a text device path node to ACPI HID device path structure.\r
897\r
898 @param TextDeviceNode The input Text device path node.\r
899\r
900 @return A pointer to the newly-created ACPI HID device path structure.\r
901\r
902**/\r
95276127 903EFI_DEVICE_PATH_PROTOCOL *\r
904DevPathFromTextAcpi (\r
905 IN CHAR16 *TextDeviceNode\r
906 )\r
907{\r
908 CHAR16 *HIDStr;\r
909 CHAR16 *UIDStr;\r
910 ACPI_HID_DEVICE_PATH *Acpi;\r
911\r
912 HIDStr = GetNextParamStr (&TextDeviceNode);\r
913 UIDStr = GetNextParamStr (&TextDeviceNode);\r
914 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
915 ACPI_DEVICE_PATH,\r
916 ACPI_DP,\r
c9325700 917 (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
95276127 918 );\r
919\r
cf40f28a 920 EisaIdFromText (HIDStr, &Acpi->HID);\r
921 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
95276127 922\r
923 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
924}\r
925\r
572f5d8a 926/**\r
927 Converts a text device path node to ACPI HID device path structure.\r
928\r
929 @param TextDeviceNode The input Text device path node.\r
930 @param PnPId The input plug and play identification.\r
931\r
932 @return A pointer to the newly-created ACPI HID device path structure.\r
933\r
934**/\r
95276127 935EFI_DEVICE_PATH_PROTOCOL *\r
936ConvertFromTextAcpi (\r
937 IN CHAR16 *TextDeviceNode,\r
cf40f28a 938 IN UINT32 PnPId\r
95276127 939 )\r
940{\r
941 CHAR16 *UIDStr;\r
942 ACPI_HID_DEVICE_PATH *Acpi;\r
943\r
944 UIDStr = GetNextParamStr (&TextDeviceNode);\r
945 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
946 ACPI_DEVICE_PATH,\r
947 ACPI_DP,\r
c9325700 948 (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
95276127 949 );\r
950\r
cf40f28a 951 Acpi->HID = EFI_PNP_ID (PnPId);\r
952 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
95276127 953\r
954 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
955}\r
956\r
572f5d8a 957/**\r
958 Converts a text device path node to PCI root device path structure.\r
959\r
960 @param TextDeviceNode The input Text device path node.\r
961\r
962 @return A pointer to the newly-created PCI root device path structure.\r
963\r
964**/\r
95276127 965EFI_DEVICE_PATH_PROTOCOL *\r
966DevPathFromTextPciRoot (\r
967 IN CHAR16 *TextDeviceNode\r
968 )\r
969{\r
cf40f28a 970 return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);\r
95276127 971}\r
972\r
572f5d8a 973/**\r
974 Converts a text device path node to Floppy device path structure.\r
975\r
976 @param TextDeviceNode The input Text device path node.\r
977\r
978 @return A pointer to the newly-created Floppy device path structure.\r
979\r
980**/\r
95276127 981EFI_DEVICE_PATH_PROTOCOL *\r
982DevPathFromTextFloppy (\r
983 IN CHAR16 *TextDeviceNode\r
984 )\r
985{\r
cf40f28a 986 return ConvertFromTextAcpi (TextDeviceNode, 0x0604);\r
95276127 987}\r
988\r
572f5d8a 989/**\r
990 Converts a text device path node to Keyboard device path structure.\r
991\r
992 @param TextDeviceNode The input Text device path node.\r
993\r
994 @return A pointer to the newly-created Keyboard device path structure.\r
995\r
996**/\r
95276127 997EFI_DEVICE_PATH_PROTOCOL *\r
998DevPathFromTextKeyboard (\r
999 IN CHAR16 *TextDeviceNode\r
1000 )\r
1001{\r
cf40f28a 1002 return ConvertFromTextAcpi (TextDeviceNode, 0x0301);\r
95276127 1003}\r
1004\r
572f5d8a 1005/**\r
1006 Converts a text device path node to Serial device path structure.\r
1007\r
1008 @param TextDeviceNode The input Text device path node.\r
1009\r
1010 @return A pointer to the newly-created Serial device path structure.\r
1011\r
1012**/\r
95276127 1013EFI_DEVICE_PATH_PROTOCOL *\r
1014DevPathFromTextSerial (\r
1015 IN CHAR16 *TextDeviceNode\r
1016 )\r
1017{\r
cf40f28a 1018 return ConvertFromTextAcpi (TextDeviceNode, 0x0501);\r
95276127 1019}\r
1020\r
572f5d8a 1021/**\r
1022 Converts a text device path node to Parallel Port device path structure.\r
1023\r
1024 @param TextDeviceNode The input Text device path node.\r
1025\r
1026 @return A pointer to the newly-created Parallel Port device path structure.\r
1027\r
1028**/\r
95276127 1029EFI_DEVICE_PATH_PROTOCOL *\r
1030DevPathFromTextParallelPort (\r
1031 IN CHAR16 *TextDeviceNode\r
1032 )\r
1033{\r
cf40f28a 1034 return ConvertFromTextAcpi (TextDeviceNode, 0x0401);\r
95276127 1035}\r
1036\r
572f5d8a 1037/**\r
5755841f 1038 Converts a text device path node to ACPI extension device path structure.\r
572f5d8a 1039\r
1040 @param TextDeviceNode The input Text device path node.\r
1041\r
5755841f 1042 @return A pointer to the newly-created ACPI extension device path structure.\r
572f5d8a 1043\r
1044**/\r
95276127 1045EFI_DEVICE_PATH_PROTOCOL *\r
1046DevPathFromTextAcpiEx (\r
1047 IN CHAR16 *TextDeviceNode\r
1048 )\r
1049{\r
cf40f28a 1050 CHAR16 *HIDStr;\r
1051 CHAR16 *CIDStr;\r
1052 CHAR16 *UIDStr;\r
1053 CHAR16 *HIDSTRStr;\r
1054 CHAR16 *CIDSTRStr;\r
1055 CHAR16 *UIDSTRStr;\r
1056 CHAR8 *AsciiStr;\r
1057 UINT16 Length;\r
1058 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
95276127 1059\r
1060 HIDStr = GetNextParamStr (&TextDeviceNode);\r
1061 CIDStr = GetNextParamStr (&TextDeviceNode);\r
1062 UIDStr = GetNextParamStr (&TextDeviceNode);\r
1063 HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1064 CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1065 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1066\r
1067 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);\r
1068 Length = (UINT16) (Length + StrLen (UIDSTRStr) + 1);\r
1069 Length = (UINT16) (Length + StrLen (CIDSTRStr) + 1);\r
cf40f28a 1070 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
1071 ACPI_DEVICE_PATH,\r
1072 ACPI_EXTENDED_DP,\r
1073 Length\r
1074 );\r
95276127 1075\r
cf40f28a 1076 EisaIdFromText (HIDStr, &AcpiEx->HID);\r
1077 EisaIdFromText (CIDStr, &AcpiEx->CID);\r
1078 AcpiEx->UID = (UINT32) Strtoi (UIDStr);\r
95276127 1079\r
cf40f28a 1080 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
95276127 1081 StrToAscii (HIDSTRStr, &AsciiStr);\r
1082 StrToAscii (UIDSTRStr, &AsciiStr);\r
1083 StrToAscii (CIDSTRStr, &AsciiStr);\r
cf40f28a 1084\r
1085 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
95276127 1086}\r
1087\r
572f5d8a 1088/**\r
5755841f 1089 Converts a text device path node to ACPI extension device path structure.\r
572f5d8a 1090\r
1091 @param TextDeviceNode The input Text device path node.\r
1092\r
5755841f 1093 @return A pointer to the newly-created ACPI extension device path structure.\r
572f5d8a 1094\r
1095**/\r
95276127 1096EFI_DEVICE_PATH_PROTOCOL *\r
1097DevPathFromTextAcpiExp (\r
1098 IN CHAR16 *TextDeviceNode\r
1099 )\r
1100{\r
cf40f28a 1101 CHAR16 *HIDStr;\r
1102 CHAR16 *CIDStr;\r
1103 CHAR16 *UIDSTRStr;\r
1104 CHAR8 *AsciiStr;\r
1105 UINT16 Length;\r
1106 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
95276127 1107\r
1108 HIDStr = GetNextParamStr (&TextDeviceNode);\r
1109 CIDStr = GetNextParamStr (&TextDeviceNode);\r
1110 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
d074a8e1 1111 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);\r
cf40f28a 1112 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
1113 ACPI_DEVICE_PATH,\r
1114 ACPI_EXTENDED_DP,\r
1115 Length\r
1116 );\r
95276127 1117\r
cf40f28a 1118 EisaIdFromText (HIDStr, &AcpiEx->HID);\r
1119 EisaIdFromText (CIDStr, &AcpiEx->CID);\r
1120 AcpiEx->UID = 0;\r
95276127 1121\r
cf40f28a 1122 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
95276127 1123 //\r
1124 // HID string is NULL\r
1125 //\r
cf40f28a 1126 *AsciiStr = '\0';\r
95276127 1127 //\r
1128 // Convert UID string\r
1129 //\r
1130 AsciiStr++;\r
1131 StrToAscii (UIDSTRStr, &AsciiStr);\r
1132 //\r
1133 // CID string is NULL\r
1134 //\r
cf40f28a 1135 *AsciiStr = '\0';\r
95276127 1136\r
cf40f28a 1137 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
95276127 1138}\r
1139\r
5b84091f
RN
1140/**\r
1141 Converts a text device path node to ACPI _ADR device path structure.\r
1142\r
1143 @param TextDeviceNode The input Text device path node.\r
1144\r
1145 @return A pointer to the newly-created ACPI _ADR device path structure.\r
1146\r
1147**/\r
1148EFI_DEVICE_PATH_PROTOCOL *\r
1149DevPathFromTextAcpiAdr (\r
1150 IN CHAR16 *TextDeviceNode\r
1151 )\r
1152{\r
1153 CHAR16 *DisplayDeviceStr;\r
1154 ACPI_ADR_DEVICE_PATH *AcpiAdr;\r
1155 UINTN Index;\r
1156\r
1157 AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (\r
1158 ACPI_DEVICE_PATH,\r
1159 ACPI_ADR_DP,\r
1160 sizeof (ACPI_ADR_DEVICE_PATH)\r
1161 );\r
1162 ASSERT (AcpiAdr != NULL);\r
1163\r
1164 for (Index = 0; ; Index++) {\r
1165 DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);\r
1166 if (IS_NULL (*DisplayDeviceStr)) {\r
1167 break;\r
1168 }\r
1169 if (Index > 0) {\r
1170 AcpiAdr = ReallocatePool (\r
1171 DevicePathNodeLength (AcpiAdr),\r
1172 DevicePathNodeLength (AcpiAdr) + sizeof (UINT32),\r
1173 AcpiAdr\r
1174 );\r
1175 ASSERT (AcpiAdr != NULL);\r
1176 SetDevicePathNodeLength (AcpiAdr, DevicePathNodeLength (AcpiAdr) + sizeof (UINT32));\r
1177 }\r
1178 \r
1179 (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
1180 }\r
1181\r
1182 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
1183}\r
1184\r
572f5d8a 1185/**\r
1186 Converts a text device path node to Parallel Port device path structure.\r
1187\r
1188 @param TextDeviceNode The input Text device path node.\r
1189\r
1190 @return A pointer to the newly-created Parallel Port device path structure.\r
1191\r
1192**/\r
95276127 1193EFI_DEVICE_PATH_PROTOCOL *\r
1194DevPathFromTextAta (\r
1195 IN CHAR16 *TextDeviceNode\r
1196 )\r
1197{\r
1198 CHAR16 *PrimarySecondaryStr;\r
1199 CHAR16 *SlaveMasterStr;\r
1200 CHAR16 *LunStr;\r
1201 ATAPI_DEVICE_PATH *Atapi;\r
1202\r
1203 Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
1204 MESSAGING_DEVICE_PATH,\r
1205 MSG_ATAPI_DP,\r
c9325700 1206 (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
95276127 1207 );\r
1208\r
1209 PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
1210 SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
1211 LunStr = GetNextParamStr (&TextDeviceNode);\r
1212\r
1213 Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);\r
1214 Atapi->SlaveMaster = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);\r
cf40f28a 1215 Atapi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1216\r
1217 return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
1218}\r
1219\r
572f5d8a 1220/**\r
1221 Converts a text device path node to SCSI device path structure.\r
1222\r
1223 @param TextDeviceNode The input Text device path node.\r
1224\r
1225 @return A pointer to the newly-created SCSI device path structure.\r
1226\r
1227**/\r
95276127 1228EFI_DEVICE_PATH_PROTOCOL *\r
1229DevPathFromTextScsi (\r
1230 IN CHAR16 *TextDeviceNode\r
1231 )\r
1232{\r
1233 CHAR16 *PunStr;\r
1234 CHAR16 *LunStr;\r
1235 SCSI_DEVICE_PATH *Scsi;\r
1236\r
1237 PunStr = GetNextParamStr (&TextDeviceNode);\r
1238 LunStr = GetNextParamStr (&TextDeviceNode);\r
1239 Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
1240 MESSAGING_DEVICE_PATH,\r
1241 MSG_SCSI_DP,\r
c9325700 1242 (UINT16) sizeof (SCSI_DEVICE_PATH)\r
95276127 1243 );\r
1244\r
cf40f28a 1245 Scsi->Pun = (UINT16) Strtoi (PunStr);\r
1246 Scsi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1247\r
1248 return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
1249}\r
1250\r
572f5d8a 1251/**\r
1252 Converts a text device path node to Fibre device path structure.\r
1253\r
1254 @param TextDeviceNode The input Text device path node.\r
1255\r
1256 @return A pointer to the newly-created Fibre device path structure.\r
1257\r
1258**/\r
95276127 1259EFI_DEVICE_PATH_PROTOCOL *\r
1260DevPathFromTextFibre (\r
1261 IN CHAR16 *TextDeviceNode\r
1262 )\r
1263{\r
1264 CHAR16 *WWNStr;\r
1265 CHAR16 *LunStr;\r
1266 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
1267\r
1268 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1269 LunStr = GetNextParamStr (&TextDeviceNode);\r
1270 Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
1271 MESSAGING_DEVICE_PATH,\r
1272 MSG_FIBRECHANNEL_DP,\r
c9325700 1273 (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
95276127 1274 );\r
1275\r
1276 Fibre->Reserved = 0;\r
cf40f28a 1277 Strtoi64 (WWNStr, &Fibre->WWN);\r
1278 Strtoi64 (LunStr, &Fibre->Lun);\r
95276127 1279\r
1280 return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
1281}\r
1282\r
572f5d8a 1283/**\r
1284 Converts a text device path node to 1394 device path structure.\r
1285\r
1286 @param TextDeviceNode The input Text device path node.\r
1287\r
1288 @return A pointer to the newly-created 1394 device path structure.\r
1289\r
1290**/\r
95276127 1291EFI_DEVICE_PATH_PROTOCOL *\r
1292DevPathFromText1394 (\r
1293 IN CHAR16 *TextDeviceNode\r
1294 )\r
1295{\r
1296 CHAR16 *GuidStr;\r
572f5d8a 1297 F1394_DEVICE_PATH *F1394DevPath;\r
95276127 1298\r
1299 GuidStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1300 F1394DevPath = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
1301 MESSAGING_DEVICE_PATH,\r
1302 MSG_1394_DP,\r
c9325700 1303 (UINT16) sizeof (F1394_DEVICE_PATH)\r
572f5d8a 1304 );\r
95276127 1305\r
572f5d8a 1306 F1394DevPath->Reserved = 0;\r
1307 Xtoi64 (GuidStr, &F1394DevPath->Guid);\r
95276127 1308\r
572f5d8a 1309 return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;\r
95276127 1310}\r
1311\r
572f5d8a 1312/**\r
1313 Converts a text device path node to USB device path structure.\r
1314\r
1315 @param TextDeviceNode The input Text device path node.\r
1316\r
1317 @return A pointer to the newly-created USB device path structure.\r
1318\r
1319**/\r
95276127 1320EFI_DEVICE_PATH_PROTOCOL *\r
1321DevPathFromTextUsb (\r
1322 IN CHAR16 *TextDeviceNode\r
1323 )\r
1324{\r
1325 CHAR16 *PortStr;\r
1326 CHAR16 *InterfaceStr;\r
1327 USB_DEVICE_PATH *Usb;\r
1328\r
1329 PortStr = GetNextParamStr (&TextDeviceNode);\r
1330 InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
1331 Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
1332 MESSAGING_DEVICE_PATH,\r
1333 MSG_USB_DP,\r
c9325700 1334 (UINT16) sizeof (USB_DEVICE_PATH)\r
95276127 1335 );\r
1336\r
cf40f28a 1337 Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
1338 Usb->InterfaceNumber = (UINT8) Strtoi (InterfaceStr);\r
95276127 1339\r
1340 return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
1341}\r
1342\r
572f5d8a 1343/**\r
1344 Converts a text device path node to I20 device path structure.\r
1345\r
1346 @param TextDeviceNode The input Text device path node.\r
1347\r
1348 @return A pointer to the newly-created I20 device path structure.\r
1349\r
1350**/\r
95276127 1351EFI_DEVICE_PATH_PROTOCOL *\r
1352DevPathFromTextI2O (\r
1353 IN CHAR16 *TextDeviceNode\r
1354 )\r
1355{\r
1356 CHAR16 *TIDStr;\r
572f5d8a 1357 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1358\r
572f5d8a 1359 TIDStr = GetNextParamStr (&TextDeviceNode);\r
1360 I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1361 MESSAGING_DEVICE_PATH,\r
1362 MSG_I2O_DP,\r
c9325700 1363 (UINT16) sizeof (I2O_DEVICE_PATH)\r
95276127 1364 );\r
1365\r
572f5d8a 1366 I2ODevPath->Tid = (UINT32) Strtoi (TIDStr);\r
95276127 1367\r
572f5d8a 1368 return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;\r
95276127 1369}\r
1370\r
572f5d8a 1371/**\r
1372 Converts a text device path node to Infini Band device path structure.\r
1373\r
1374 @param TextDeviceNode The input Text device path node.\r
1375\r
1376 @return A pointer to the newly-created Infini Band device path structure.\r
1377\r
1378**/\r
95276127 1379EFI_DEVICE_PATH_PROTOCOL *\r
1380DevPathFromTextInfiniband (\r
1381 IN CHAR16 *TextDeviceNode\r
1382 )\r
1383{\r
1384 CHAR16 *FlagsStr;\r
1385 CHAR16 *GuidStr;\r
1386 CHAR16 *SidStr;\r
1387 CHAR16 *TidStr;\r
1388 CHAR16 *DidStr;\r
1389 EFI_GUID PortGid;\r
1390 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1391\r
1392 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
1393 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1394 SidStr = GetNextParamStr (&TextDeviceNode);\r
1395 TidStr = GetNextParamStr (&TextDeviceNode);\r
1396 DidStr = GetNextParamStr (&TextDeviceNode);\r
1397 InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
1398 MESSAGING_DEVICE_PATH,\r
1399 MSG_INFINIBAND_DP,\r
c9325700 1400 (UINT16) sizeof (INFINIBAND_DEVICE_PATH)\r
95276127 1401 );\r
1402\r
cf40f28a 1403 InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
95276127 1404 StrToGuid (GuidStr, &PortGid);\r
1405 CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
cf40f28a 1406 Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
1407 Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
1408 Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
95276127 1409\r
1410 return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
1411}\r
1412\r
572f5d8a 1413/**\r
1414 Converts a text device path node to Vendor-Defined Messaging device path structure.\r
1415\r
1416 @param TextDeviceNode The input Text device path node.\r
1417\r
1418 @return A pointer to the newly-created Vendor-Defined Messaging device path structure.\r
1419\r
1420**/\r
95276127 1421EFI_DEVICE_PATH_PROTOCOL *\r
1422DevPathFromTextVenMsg (\r
1423 IN CHAR16 *TextDeviceNode\r
1424 )\r
1425{\r
1426 return ConvertFromTextVendor (\r
1427 TextDeviceNode,\r
1428 MESSAGING_DEVICE_PATH,\r
1429 MSG_VENDOR_DP\r
1430 );\r
1431}\r
1432\r
572f5d8a 1433/**\r
1434 Converts a text device path node to Vendor defined PC-ANSI device path structure.\r
1435\r
1436 @param TextDeviceNode The input Text device path node.\r
1437\r
1438 @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.\r
1439\r
1440**/\r
95276127 1441EFI_DEVICE_PATH_PROTOCOL *\r
1442DevPathFromTextVenPcAnsi (\r
1443 IN CHAR16 *TextDeviceNode\r
1444 )\r
1445{\r
1446 VENDOR_DEVICE_PATH *Vendor;\r
1447\r
1448 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1449 MESSAGING_DEVICE_PATH,\r
1450 MSG_VENDOR_DP,\r
c9325700 1451 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1452 CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
1453\r
1454 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1455}\r
1456\r
572f5d8a 1457/**\r
1458 Converts a text device path node to Vendor defined VT100 device path structure.\r
1459\r
1460 @param TextDeviceNode The input Text device path node.\r
1461\r
1462 @return A pointer to the newly-created Vendor defined VT100 device path structure.\r
1463\r
1464**/\r
95276127 1465EFI_DEVICE_PATH_PROTOCOL *\r
1466DevPathFromTextVenVt100 (\r
1467 IN CHAR16 *TextDeviceNode\r
1468 )\r
1469{\r
1470 VENDOR_DEVICE_PATH *Vendor;\r
1471\r
1472 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1473 MESSAGING_DEVICE_PATH,\r
1474 MSG_VENDOR_DP,\r
c9325700 1475 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1476 CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
1477\r
1478 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1479}\r
1480\r
572f5d8a 1481/**\r
1482 Converts a text device path node to Vendor defined VT100 Plus device path structure.\r
1483\r
1484 @param TextDeviceNode The input Text device path node.\r
1485\r
1486 @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.\r
1487\r
1488**/\r
95276127 1489EFI_DEVICE_PATH_PROTOCOL *\r
1490DevPathFromTextVenVt100Plus (\r
1491 IN CHAR16 *TextDeviceNode\r
1492 )\r
1493{\r
1494 VENDOR_DEVICE_PATH *Vendor;\r
1495\r
1496 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1497 MESSAGING_DEVICE_PATH,\r
1498 MSG_VENDOR_DP,\r
c9325700 1499 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1500 CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
1501\r
1502 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1503}\r
1504\r
572f5d8a 1505/**\r
1506 Converts a text device path node to Vendor defined UTF8 device path structure.\r
1507\r
1508 @param TextDeviceNode The input Text device path node.\r
1509\r
1510 @return A pointer to the newly-created Vendor defined UTF8 device path structure.\r
1511\r
1512**/\r
95276127 1513EFI_DEVICE_PATH_PROTOCOL *\r
1514DevPathFromTextVenUtf8 (\r
1515 IN CHAR16 *TextDeviceNode\r
1516 )\r
1517{\r
1518 VENDOR_DEVICE_PATH *Vendor;\r
1519\r
1520 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1521 MESSAGING_DEVICE_PATH,\r
1522 MSG_VENDOR_DP,\r
c9325700 1523 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1524 CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
1525\r
1526 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1527}\r
1528\r
572f5d8a 1529/**\r
1530 Converts a text device path node to UART Flow Control device path structure.\r
1531\r
1532 @param TextDeviceNode The input Text device path node.\r
1533\r
1534 @return A pointer to the newly-created UART Flow Control device path structure.\r
1535\r
1536**/\r
95276127 1537EFI_DEVICE_PATH_PROTOCOL *\r
1538DevPathFromTextUartFlowCtrl (\r
1539 IN CHAR16 *TextDeviceNode\r
1540 )\r
1541{\r
1542 CHAR16 *ValueStr;\r
1543 UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
1544\r
1545 ValueStr = GetNextParamStr (&TextDeviceNode);\r
1546 UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
1547 MESSAGING_DEVICE_PATH,\r
1548 MSG_VENDOR_DP,\r
c9325700 1549 (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
95276127 1550 );\r
1551\r
48557c65 1552 CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);\r
95276127 1553 if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
1554 UartFlowControl->FlowControlMap = 2;\r
1555 } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
1556 UartFlowControl->FlowControlMap = 1;\r
1557 } else {\r
1558 UartFlowControl->FlowControlMap = 0;\r
1559 }\r
1560\r
1561 return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
1562}\r
1563\r
572f5d8a 1564/**\r
1565 Converts a text device path node to Serial Attached SCSI device path structure.\r
1566\r
1567 @param TextDeviceNode The input Text device path node.\r
1568\r
1569 @return A pointer to the newly-created Serial Attached SCSI device path structure.\r
1570\r
1571**/\r
95276127 1572EFI_DEVICE_PATH_PROTOCOL *\r
1573DevPathFromTextSAS (\r
1574 IN CHAR16 *TextDeviceNode\r
1575 )\r
1576{\r
1577 CHAR16 *AddressStr;\r
1578 CHAR16 *LunStr;\r
1579 CHAR16 *RTPStr;\r
1580 CHAR16 *SASSATAStr;\r
1581 CHAR16 *LocationStr;\r
1582 CHAR16 *ConnectStr;\r
1583 CHAR16 *DriveBayStr;\r
1584 CHAR16 *ReservedStr;\r
1585 UINT16 Info;\r
1586 SAS_DEVICE_PATH *Sas;\r
1587\r
1588 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1589 LunStr = GetNextParamStr (&TextDeviceNode);\r
1590 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1591 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1592 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1593 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1594 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
1595 ReservedStr = GetNextParamStr (&TextDeviceNode);\r
1596 Info = 0x0000;\r
1597 Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
1598 MESSAGING_DEVICE_PATH,\r
1599 MSG_VENDOR_DP,\r
c9325700 1600 (UINT16) sizeof (SAS_DEVICE_PATH)\r
95276127 1601 );\r
1602\r
48557c65 1603 CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);\r
cf40f28a 1604 Strtoi64 (AddressStr, &Sas->SasAddress);\r
1605 Strtoi64 (LunStr, &Sas->Lun);\r
1606 Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
1607 if (StrCmp (SASSATAStr, L"NoTopology") != 0) {\r
95276127 1608 if (StrCmp (DriveBayStr, L"0") == 0) {\r
1609 Info |= 0x0001;\r
1610 } else {\r
1611 Info |= 0x0002;\r
cf40f28a 1612 Info = (UINT16) (Info | (Strtoi (DriveBayStr) << 8));\r
95276127 1613 }\r
1614\r
1615 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
1616 Info |= 0x0010;\r
1617 }\r
1618\r
1619 if (StrCmp (LocationStr, L"External") == 0) {\r
1620 Info |= 0x0020;\r
1621 }\r
1622\r
1623 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
1624 Info |= 0x0040;\r
1625 }\r
1626 }\r
1627\r
1628 Sas->DeviceTopology = Info;\r
cf40f28a 1629 Sas->Reserved = (UINT32) Strtoi (ReservedStr);\r
95276127 1630\r
1631 return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
1632}\r
1633\r
572f5d8a 1634/**\r
1635 Converts a text device path node to Debug Port device path structure.\r
1636\r
1637 @param TextDeviceNode The input Text device path node.\r
1638\r
1639 @return A pointer to the newly-created Debug Port device path structure.\r
1640\r
1641**/\r
95276127 1642EFI_DEVICE_PATH_PROTOCOL *\r
1643DevPathFromTextDebugPort (\r
1644 IN CHAR16 *TextDeviceNode\r
1645 )\r
1646{\r
1647 VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
1648\r
1649 Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
1650 MESSAGING_DEVICE_PATH,\r
1651 MSG_VENDOR_DP,\r
c9325700 1652 (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
95276127 1653 );\r
1654\r
1655 CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
1656\r
1657 return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
1658}\r
1659\r
572f5d8a 1660/**\r
1661 Converts a text device path node to MAC device path structure.\r
1662\r
1663 @param TextDeviceNode The input Text device path node.\r
1664\r
1665 @return A pointer to the newly-created MAC device path structure.\r
1666\r
1667**/\r
95276127 1668EFI_DEVICE_PATH_PROTOCOL *\r
1669DevPathFromTextMAC (\r
1670 IN CHAR16 *TextDeviceNode\r
1671 )\r
1672{\r
1673 CHAR16 *AddressStr;\r
1674 CHAR16 *IfTypeStr;\r
1675 UINTN Length;\r
572f5d8a 1676 MAC_ADDR_DEVICE_PATH *MACDevPath;\r
95276127 1677\r
1678 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1679 IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1680 MACDevPath = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1681 MESSAGING_DEVICE_PATH,\r
1682 MSG_MAC_ADDR_DP,\r
c9325700 1683 (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)\r
95276127 1684 );\r
1685\r
572f5d8a 1686 MACDevPath->IfType = (UINT8) Strtoi (IfTypeStr);\r
95276127 1687\r
1688 Length = sizeof (EFI_MAC_ADDRESS);\r
572f5d8a 1689 StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
95276127 1690\r
572f5d8a 1691 return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
95276127 1692}\r
1693\r
052019e1 1694\r
1695/**\r
1696 Converts a text format to the network protocol ID.\r
1697\r
1698 @param Text String of protocol field.\r
1699\r
1700 @return Network protocol ID .\r
1701\r
1702**/\r
1703UINTN\r
1704NetworkProtocolFromText (\r
1705 IN CHAR16 *Text\r
1706 )\r
1707{\r
1708 if (StrCmp (Text, L"UDP") == 0) {\r
1709 return RFC_1700_UDP_PROTOCOL;\r
1710 }\r
1711\r
1712 if (StrCmp (Text, L"TCP") == 0) {\r
1713 return RFC_1700_TCP_PROTOCOL;\r
1714 }\r
1715\r
1716 return Strtoi (Text);\r
1717}\r
1718\r
1719\r
572f5d8a 1720/**\r
1721 Converts a text device path node to IPV4 device path structure.\r
1722\r
1723 @param TextDeviceNode The input Text device path node.\r
1724\r
1725 @return A pointer to the newly-created IPV4 device path structure.\r
1726\r
1727**/\r
95276127 1728EFI_DEVICE_PATH_PROTOCOL *\r
1729DevPathFromTextIPv4 (\r
1730 IN CHAR16 *TextDeviceNode\r
1731 )\r
1732{\r
1733 CHAR16 *RemoteIPStr;\r
1734 CHAR16 *ProtocolStr;\r
1735 CHAR16 *TypeStr;\r
1736 CHAR16 *LocalIPStr;\r
1737 IPv4_DEVICE_PATH *IPv4;\r
1738\r
1739 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1740 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1741 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1742 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1743 IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
1744 MESSAGING_DEVICE_PATH,\r
1745 MSG_IPv4_DP,\r
c9325700 1746 (UINT16) sizeof (IPv4_DEVICE_PATH)\r
95276127 1747 );\r
1748\r
1749 StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
052019e1 1750 IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1751 if (StrCmp (TypeStr, L"Static") == 0) {\r
1752 IPv4->StaticIpAddress = TRUE;\r
1753 } else {\r
1754 IPv4->StaticIpAddress = FALSE;\r
1755 }\r
1756\r
1757 StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
1758\r
cf40f28a 1759 IPv4->LocalPort = 0;\r
1760 IPv4->RemotePort = 0;\r
95276127 1761\r
1762 return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
1763}\r
1764\r
572f5d8a 1765/**\r
1766 Converts a text device path node to IPV6 device path structure.\r
1767\r
1768 @param TextDeviceNode The input Text device path node.\r
1769\r
1770 @return A pointer to the newly-created IPV6 device path structure.\r
1771\r
1772**/\r
95276127 1773EFI_DEVICE_PATH_PROTOCOL *\r
1774DevPathFromTextIPv6 (\r
1775 IN CHAR16 *TextDeviceNode\r
1776 )\r
1777{\r
1778 CHAR16 *RemoteIPStr;\r
1779 CHAR16 *ProtocolStr;\r
1780 CHAR16 *TypeStr;\r
1781 CHAR16 *LocalIPStr;\r
1782 IPv6_DEVICE_PATH *IPv6;\r
1783\r
1784 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1785 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1786 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1787 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1788 IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
1789 MESSAGING_DEVICE_PATH,\r
1790 MSG_IPv6_DP,\r
c9325700 1791 (UINT16) sizeof (IPv6_DEVICE_PATH)\r
95276127 1792 );\r
1793\r
1794 StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
052019e1 1795 IPv6->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1796 if (StrCmp (TypeStr, L"Static") == 0) {\r
1797 IPv6->StaticIpAddress = TRUE;\r
1798 } else {\r
1799 IPv6->StaticIpAddress = FALSE;\r
1800 }\r
1801\r
1802 StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
1803\r
1804 IPv6->LocalPort = 0;\r
1805 IPv6->RemotePort = 0;\r
1806\r
1807 return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
1808}\r
1809\r
572f5d8a 1810/**\r
1811 Converts a text device path node to UART device path structure.\r
1812\r
1813 @param TextDeviceNode The input Text device path node.\r
1814\r
1815 @return A pointer to the newly-created UART device path structure.\r
1816\r
1817**/\r
95276127 1818EFI_DEVICE_PATH_PROTOCOL *\r
1819DevPathFromTextUart (\r
1820 IN CHAR16 *TextDeviceNode\r
1821 )\r
1822{\r
1823 CHAR16 *BaudStr;\r
1824 CHAR16 *DataBitsStr;\r
1825 CHAR16 *ParityStr;\r
1826 CHAR16 *StopBitsStr;\r
1827 UART_DEVICE_PATH *Uart;\r
1828\r
1829 BaudStr = GetNextParamStr (&TextDeviceNode);\r
1830 DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
1831 ParityStr = GetNextParamStr (&TextDeviceNode);\r
1832 StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
1833 Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
1834 MESSAGING_DEVICE_PATH,\r
1835 MSG_UART_DP,\r
c9325700 1836 (UINT16) sizeof (UART_DEVICE_PATH)\r
95276127 1837 );\r
1838\r
cf40f28a 1839 Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr);\r
1840 Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Dtoi (DataBitsStr));\r
95276127 1841 switch (*ParityStr) {\r
1842 case L'D':\r
1843 Uart->Parity = 0;\r
1844 break;\r
1845\r
1846 case L'N':\r
1847 Uart->Parity = 1;\r
1848 break;\r
1849\r
1850 case L'E':\r
1851 Uart->Parity = 2;\r
1852 break;\r
1853\r
1854 case L'O':\r
1855 Uart->Parity = 3;\r
1856 break;\r
1857\r
1858 case L'M':\r
1859 Uart->Parity = 4;\r
1860 break;\r
1861\r
1862 case L'S':\r
1863 Uart->Parity = 5;\r
1864\r
1865 default:\r
1866 Uart->Parity = 0xff;\r
1867 }\r
1868\r
1869 if (StrCmp (StopBitsStr, L"D") == 0) {\r
1870 Uart->StopBits = (UINT8) 0;\r
1871 } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
1872 Uart->StopBits = (UINT8) 1;\r
1873 } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
1874 Uart->StopBits = (UINT8) 2;\r
1875 } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
1876 Uart->StopBits = (UINT8) 3;\r
1877 } else {\r
1878 Uart->StopBits = 0xff;\r
1879 }\r
1880\r
1881 return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
1882}\r
1883\r
572f5d8a 1884/**\r
1885 Converts a text device path node to USB class device path structure.\r
1886\r
1887 @param TextDeviceNode The input Text device path node.\r
1888 @param UsbClassText A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.\r
1889\r
1890 @return A pointer to the newly-created USB class device path structure.\r
1891\r
1892**/\r
95276127 1893EFI_DEVICE_PATH_PROTOCOL *\r
1894ConvertFromTextUsbClass (\r
1895 IN CHAR16 *TextDeviceNode,\r
1896 IN USB_CLASS_TEXT *UsbClassText\r
1897 )\r
1898{\r
1899 CHAR16 *VIDStr;\r
1900 CHAR16 *PIDStr;\r
1901 CHAR16 *ClassStr;\r
1902 CHAR16 *SubClassStr;\r
1903 CHAR16 *ProtocolStr;\r
1904 USB_CLASS_DEVICE_PATH *UsbClass;\r
1905\r
1906 UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
1907 MESSAGING_DEVICE_PATH,\r
1908 MSG_USB_CLASS_DP,\r
c9325700 1909 (UINT16) sizeof (USB_CLASS_DEVICE_PATH)\r
95276127 1910 );\r
1911\r
1912 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1913 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1914 if (UsbClassText->ClassExist) {\r
1915 ClassStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 1916 UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
95276127 1917 } else {\r
1918 UsbClass->DeviceClass = UsbClassText->Class;\r
1919 }\r
1920 if (UsbClassText->SubClassExist) {\r
1921 SubClassStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 1922 UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
95276127 1923 } else {\r
1924 UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
572f5d8a 1925 }\r
95276127 1926\r
1927 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1928\r
cf40f28a 1929 UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
1930 UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
1931 UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
95276127 1932\r
1933 return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
1934}\r
1935\r
1936\r
572f5d8a 1937/**\r
1938 Converts a text device path node to USB class device path structure.\r
1939\r
1940 @param TextDeviceNode The input Text device path node.\r
1941\r
1942 @return A pointer to the newly-created USB class device path structure.\r
1943\r
1944**/\r
95276127 1945EFI_DEVICE_PATH_PROTOCOL *\r
1946DevPathFromTextUsbClass (\r
1947 IN CHAR16 *TextDeviceNode\r
1948 )\r
1949{\r
1950 USB_CLASS_TEXT UsbClassText;\r
1951\r
1952 UsbClassText.ClassExist = TRUE;\r
1953 UsbClassText.SubClassExist = TRUE;\r
1954\r
1955 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1956}\r
1957\r
572f5d8a 1958/**\r
1959 Converts a text device path node to USB audio device path structure.\r
1960\r
1961 @param TextDeviceNode The input Text device path node.\r
1962\r
1963 @return A pointer to the newly-created USB audio device path structure.\r
1964\r
1965**/\r
95276127 1966EFI_DEVICE_PATH_PROTOCOL *\r
1967DevPathFromTextUsbAudio (\r
1968 IN CHAR16 *TextDeviceNode\r
1969 )\r
1970{\r
1971 USB_CLASS_TEXT UsbClassText;\r
1972\r
1973 UsbClassText.ClassExist = FALSE;\r
1974 UsbClassText.Class = USB_CLASS_AUDIO;\r
1975 UsbClassText.SubClassExist = TRUE;\r
1976\r
1977 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1978}\r
1979\r
572f5d8a 1980/**\r
1981 Converts a text device path node to USB CDC Control device path structure.\r
1982\r
1983 @param TextDeviceNode The input Text device path node.\r
1984\r
1985 @return A pointer to the newly-created USB CDC Control device path structure.\r
1986\r
1987**/\r
95276127 1988EFI_DEVICE_PATH_PROTOCOL *\r
1989DevPathFromTextUsbCDCControl (\r
1990 IN CHAR16 *TextDeviceNode\r
1991 )\r
1992{\r
1993 USB_CLASS_TEXT UsbClassText;\r
1994\r
1995 UsbClassText.ClassExist = FALSE;\r
1996 UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
1997 UsbClassText.SubClassExist = TRUE;\r
1998\r
1999 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2000}\r
2001\r
572f5d8a 2002/**\r
2003 Converts a text device path node to USB HID device path structure.\r
2004\r
2005 @param TextDeviceNode The input Text device path node.\r
2006\r
2007 @return A pointer to the newly-created USB HID device path structure.\r
2008\r
2009**/\r
95276127 2010EFI_DEVICE_PATH_PROTOCOL *\r
2011DevPathFromTextUsbHID (\r
2012 IN CHAR16 *TextDeviceNode\r
2013 )\r
2014{\r
2015 USB_CLASS_TEXT UsbClassText;\r
2016\r
2017 UsbClassText.ClassExist = FALSE;\r
2018 UsbClassText.Class = USB_CLASS_HID;\r
2019 UsbClassText.SubClassExist = TRUE;\r
2020\r
2021 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2022}\r
2023\r
572f5d8a 2024/**\r
2025 Converts a text device path node to USB Image device path structure.\r
2026\r
2027 @param TextDeviceNode The input Text device path node.\r
2028\r
2029 @return A pointer to the newly-created USB Image device path structure.\r
2030\r
2031**/\r
95276127 2032EFI_DEVICE_PATH_PROTOCOL *\r
2033DevPathFromTextUsbImage (\r
2034 IN CHAR16 *TextDeviceNode\r
2035 )\r
2036{\r
2037 USB_CLASS_TEXT UsbClassText;\r
2038\r
2039 UsbClassText.ClassExist = FALSE;\r
2040 UsbClassText.Class = USB_CLASS_IMAGE;\r
2041 UsbClassText.SubClassExist = TRUE;\r
2042\r
2043 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2044}\r
2045\r
572f5d8a 2046/**\r
2047 Converts a text device path node to USB Print device path structure.\r
2048\r
2049 @param TextDeviceNode The input Text device path node.\r
2050\r
2051 @return A pointer to the newly-created USB Print device path structure.\r
2052\r
2053**/\r
95276127 2054EFI_DEVICE_PATH_PROTOCOL *\r
2055DevPathFromTextUsbPrinter (\r
2056 IN CHAR16 *TextDeviceNode\r
2057 )\r
2058{\r
2059 USB_CLASS_TEXT UsbClassText;\r
2060\r
2061 UsbClassText.ClassExist = FALSE;\r
2062 UsbClassText.Class = USB_CLASS_PRINTER;\r
2063 UsbClassText.SubClassExist = TRUE;\r
2064\r
2065 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2066}\r
2067\r
572f5d8a 2068/**\r
2069 Converts a text device path node to USB mass storage device path structure.\r
2070\r
2071 @param TextDeviceNode The input Text device path node.\r
2072\r
2073 @return A pointer to the newly-created USB mass storage device path structure.\r
2074\r
2075**/\r
95276127 2076EFI_DEVICE_PATH_PROTOCOL *\r
2077DevPathFromTextUsbMassStorage (\r
2078 IN CHAR16 *TextDeviceNode\r
2079 )\r
2080{\r
2081 USB_CLASS_TEXT UsbClassText;\r
2082\r
2083 UsbClassText.ClassExist = FALSE;\r
2084 UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
2085 UsbClassText.SubClassExist = TRUE;\r
2086\r
2087 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2088}\r
2089\r
572f5d8a 2090/**\r
2091 Converts a text device path node to USB HUB device path structure.\r
2092\r
2093 @param TextDeviceNode The input Text device path node.\r
2094\r
2095 @return A pointer to the newly-created USB HUB device path structure.\r
2096\r
2097**/\r
95276127 2098EFI_DEVICE_PATH_PROTOCOL *\r
2099DevPathFromTextUsbHub (\r
2100 IN CHAR16 *TextDeviceNode\r
2101 )\r
2102{\r
2103 USB_CLASS_TEXT UsbClassText;\r
2104\r
2105 UsbClassText.ClassExist = FALSE;\r
2106 UsbClassText.Class = USB_CLASS_HUB;\r
2107 UsbClassText.SubClassExist = TRUE;\r
2108\r
2109 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2110}\r
2111\r
572f5d8a 2112/**\r
2113 Converts a text device path node to USB CDC data device path structure.\r
2114\r
2115 @param TextDeviceNode The input Text device path node.\r
2116\r
2117 @return A pointer to the newly-created USB CDC data device path structure.\r
2118\r
2119**/\r
95276127 2120EFI_DEVICE_PATH_PROTOCOL *\r
2121DevPathFromTextUsbCDCData (\r
2122 IN CHAR16 *TextDeviceNode\r
2123 )\r
2124{\r
2125 USB_CLASS_TEXT UsbClassText;\r
2126\r
2127 UsbClassText.ClassExist = FALSE;\r
2128 UsbClassText.Class = USB_CLASS_CDCDATA;\r
2129 UsbClassText.SubClassExist = TRUE;\r
2130\r
2131 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2132}\r
2133\r
572f5d8a 2134/**\r
2135 Converts a text device path node to USB smart card device path structure.\r
2136\r
2137 @param TextDeviceNode The input Text device path node.\r
2138\r
2139 @return A pointer to the newly-created USB smart card device path structure.\r
2140\r
2141**/\r
95276127 2142EFI_DEVICE_PATH_PROTOCOL *\r
2143DevPathFromTextUsbSmartCard (\r
2144 IN CHAR16 *TextDeviceNode\r
2145 )\r
2146{\r
2147 USB_CLASS_TEXT UsbClassText;\r
2148\r
2149 UsbClassText.ClassExist = FALSE;\r
2150 UsbClassText.Class = USB_CLASS_SMART_CARD;\r
2151 UsbClassText.SubClassExist = TRUE;\r
2152\r
2153 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2154}\r
2155\r
572f5d8a 2156/**\r
2157 Converts a text device path node to USB video device path structure.\r
2158\r
2159 @param TextDeviceNode The input Text device path node.\r
2160\r
2161 @return A pointer to the newly-created USB video device path structure.\r
2162\r
2163**/\r
95276127 2164EFI_DEVICE_PATH_PROTOCOL *\r
2165DevPathFromTextUsbVideo (\r
2166 IN CHAR16 *TextDeviceNode\r
2167 )\r
2168{\r
2169 USB_CLASS_TEXT UsbClassText;\r
2170\r
2171 UsbClassText.ClassExist = FALSE;\r
2172 UsbClassText.Class = USB_CLASS_VIDEO;\r
2173 UsbClassText.SubClassExist = TRUE;\r
2174\r
2175 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2176}\r
2177\r
572f5d8a 2178/**\r
2179 Converts a text device path node to USB diagnostic device path structure.\r
2180\r
2181 @param TextDeviceNode The input Text device path node.\r
2182\r
2183 @return A pointer to the newly-created USB diagnostic device path structure.\r
2184\r
2185**/\r
95276127 2186EFI_DEVICE_PATH_PROTOCOL *\r
2187DevPathFromTextUsbDiagnostic (\r
2188 IN CHAR16 *TextDeviceNode\r
2189 )\r
2190{\r
2191 USB_CLASS_TEXT UsbClassText;\r
2192\r
2193 UsbClassText.ClassExist = FALSE;\r
2194 UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
2195 UsbClassText.SubClassExist = TRUE;\r
2196\r
2197 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2198}\r
2199\r
572f5d8a 2200/**\r
2201 Converts a text device path node to USB wireless device path structure.\r
2202\r
2203 @param TextDeviceNode The input Text device path node.\r
2204\r
2205 @return A pointer to the newly-created USB wireless device path structure.\r
2206\r
2207**/\r
95276127 2208EFI_DEVICE_PATH_PROTOCOL *\r
2209DevPathFromTextUsbWireless (\r
2210 IN CHAR16 *TextDeviceNode\r
2211 )\r
2212{\r
2213 USB_CLASS_TEXT UsbClassText;\r
2214\r
2215 UsbClassText.ClassExist = FALSE;\r
2216 UsbClassText.Class = USB_CLASS_WIRELESS;\r
2217 UsbClassText.SubClassExist = TRUE;\r
2218\r
2219 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2220}\r
2221\r
572f5d8a 2222/**\r
2223 Converts a text device path node to USB device firmware update device path structure.\r
2224\r
2225 @param TextDeviceNode The input Text device path node.\r
2226\r
2227 @return A pointer to the newly-created USB device firmware update device path structure.\r
2228\r
2229**/\r
95276127 2230EFI_DEVICE_PATH_PROTOCOL *\r
2231DevPathFromTextUsbDeviceFirmwareUpdate (\r
2232 IN CHAR16 *TextDeviceNode\r
2233 )\r
2234{\r
2235 USB_CLASS_TEXT UsbClassText;\r
2236\r
2237 UsbClassText.ClassExist = FALSE;\r
2238 UsbClassText.Class = USB_CLASS_RESERVE;\r
2239 UsbClassText.SubClassExist = FALSE;\r
2240 UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
2241\r
2242 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2243}\r
2244\r
572f5d8a 2245/**\r
2246 Converts a text device path node to USB IRDA bridge device path structure.\r
2247\r
2248 @param TextDeviceNode The input Text device path node.\r
2249\r
2250 @return A pointer to the newly-created USB IRDA bridge device path structure.\r
2251\r
2252**/\r
95276127 2253EFI_DEVICE_PATH_PROTOCOL *\r
2254DevPathFromTextUsbIrdaBridge (\r
2255 IN CHAR16 *TextDeviceNode\r
2256 )\r
2257{\r
2258 USB_CLASS_TEXT UsbClassText;\r
2259\r
2260 UsbClassText.ClassExist = FALSE;\r
2261 UsbClassText.Class = USB_CLASS_RESERVE;\r
2262 UsbClassText.SubClassExist = FALSE;\r
2263 UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
2264\r
2265 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2266}\r
2267\r
572f5d8a 2268/**\r
2269 Converts a text device path node to USB text and measurement device path structure.\r
2270\r
2271 @param TextDeviceNode The input Text device path node.\r
2272\r
2273 @return A pointer to the newly-created USB text and measurement device path structure.\r
2274\r
2275**/\r
95276127 2276EFI_DEVICE_PATH_PROTOCOL *\r
2277DevPathFromTextUsbTestAndMeasurement (\r
2278 IN CHAR16 *TextDeviceNode\r
2279 )\r
2280{\r
2281 USB_CLASS_TEXT UsbClassText;\r
2282\r
2283 UsbClassText.ClassExist = FALSE;\r
2284 UsbClassText.Class = USB_CLASS_RESERVE;\r
2285 UsbClassText.SubClassExist = FALSE;\r
2286 UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
2287\r
2288 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2289}\r
2290\r
572f5d8a 2291/**\r
2292 Converts a text device path node to USB WWID device path structure.\r
2293\r
2294 @param TextDeviceNode The input Text device path node.\r
2295\r
2296 @return A pointer to the newly-created USB WWID device path structure.\r
2297\r
2298**/\r
95276127 2299EFI_DEVICE_PATH_PROTOCOL *\r
2300DevPathFromTextUsbWwid (\r
2301 IN CHAR16 *TextDeviceNode\r
2302 )\r
2303{\r
2304 CHAR16 *VIDStr;\r
2305 CHAR16 *PIDStr;\r
2306 CHAR16 *InterfaceNumStr;\r
cf40f28a 2307 CHAR16 *SerialNumberStr;\r
95276127 2308 USB_WWID_DEVICE_PATH *UsbWwid;\r
2309\r
2310 VIDStr = GetNextParamStr (&TextDeviceNode);\r
2311 PIDStr = GetNextParamStr (&TextDeviceNode);\r
2312 InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 2313 SerialNumberStr = GetNextParamStr (&TextDeviceNode);\r
95276127 2314 UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
2315 MESSAGING_DEVICE_PATH,\r
2316 MSG_USB_WWID_DP,\r
cf40f28a 2317 (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + StrSize (SerialNumberStr))\r
95276127 2318 );\r
2319\r
cf40f28a 2320 UsbWwid->VendorId = (UINT16) Strtoi (VIDStr);\r
2321 UsbWwid->ProductId = (UINT16) Strtoi (PIDStr);\r
2322 UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
2323 StrCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr);\r
95276127 2324\r
2325 return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
2326}\r
2327\r
572f5d8a 2328/**\r
2329 Converts a text device path node to Logic Unit device path structure.\r
2330\r
2331 @param TextDeviceNode The input Text device path node.\r
2332\r
2333 @return A pointer to the newly-created Logic Unit device path structure.\r
2334\r
2335**/\r
95276127 2336EFI_DEVICE_PATH_PROTOCOL *\r
2337DevPathFromTextUnit (\r
2338 IN CHAR16 *TextDeviceNode\r
2339 )\r
2340{\r
2341 CHAR16 *LunStr;\r
2342 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
2343\r
2344 LunStr = GetNextParamStr (&TextDeviceNode);\r
2345 LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
2346 MESSAGING_DEVICE_PATH,\r
2347 MSG_DEVICE_LOGICAL_UNIT_DP,\r
cf40f28a 2348 (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
95276127 2349 );\r
2350\r
cf40f28a 2351 LogicalUnit->Lun = (UINT8) Strtoi (LunStr);\r
95276127 2352\r
2353 return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
2354}\r
2355\r
572f5d8a 2356/**\r
2357 Converts a text device path node to iSCSI device path structure.\r
2358\r
2359 @param TextDeviceNode The input Text device path node.\r
2360\r
2361 @return A pointer to the newly-created iSCSI device path structure.\r
2362\r
2363**/\r
95276127 2364EFI_DEVICE_PATH_PROTOCOL *\r
2365DevPathFromTextiSCSI (\r
2366 IN CHAR16 *TextDeviceNode\r
2367 )\r
2368{\r
2369 UINT16 Options;\r
2370 CHAR16 *NameStr;\r
2371 CHAR16 *PortalGroupStr;\r
2372 CHAR16 *LunStr;\r
2373 CHAR16 *HeaderDigestStr;\r
2374 CHAR16 *DataDigestStr;\r
2375 CHAR16 *AuthenticationStr;\r
2376 CHAR16 *ProtocolStr;\r
cf40f28a 2377 CHAR8 *AsciiStr;\r
572f5d8a 2378 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
95276127 2379\r
2380 NameStr = GetNextParamStr (&TextDeviceNode);\r
2381 PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
2382 LunStr = GetNextParamStr (&TextDeviceNode);\r
2383 HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
2384 DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
2385 AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
2386 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2387 ISCSIDevPath = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
95276127 2388 MESSAGING_DEVICE_PATH,\r
2389 MSG_ISCSI_DP,\r
047c6449 2390 (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
95276127 2391 );\r
2392\r
184f7d83 2393 AsciiStr = ISCSIDevPath->TargetName;\r
cf40f28a 2394 StrToAscii (NameStr, &AsciiStr);\r
2395\r
572f5d8a 2396 ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
2397 Strtoi64 (LunStr, &ISCSIDevPath->Lun);\r
95276127 2398\r
2399 Options = 0x0000;\r
2400 if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
2401 Options |= 0x0002;\r
2402 }\r
2403\r
2404 if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
2405 Options |= 0x0008;\r
2406 }\r
2407\r
2408 if (StrCmp (AuthenticationStr, L"None") == 0) {\r
2409 Options |= 0x0800;\r
2410 }\r
2411\r
2412 if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
2413 Options |= 0x1000;\r
2414 }\r
2415\r
572f5d8a 2416 ISCSIDevPath->LoginOption = (UINT16) Options;\r
95276127 2417\r
572f5d8a 2418 ISCSIDevPath->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
95276127 2419\r
572f5d8a 2420 return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
95276127 2421}\r
2422\r
8f97f911 2423/**\r
2424 Converts a text device path node to VLAN device path structure.\r
2425\r
2426 @param TextDeviceNode The input Text device path node.\r
2427\r
2428 @return A pointer to the newly-created VLAN device path structure.\r
2429\r
2430**/\r
2431EFI_DEVICE_PATH_PROTOCOL *\r
2432DevPathFromTextVlan (\r
2433 IN CHAR16 *TextDeviceNode\r
2434 )\r
2435{\r
2436 CHAR16 *VlanStr;\r
2437 VLAN_DEVICE_PATH *Vlan;\r
2438\r
2439 VlanStr = GetNextParamStr (&TextDeviceNode);\r
2440 Vlan = (VLAN_DEVICE_PATH *) CreateDeviceNode (\r
2441 MESSAGING_DEVICE_PATH,\r
2442 MSG_VLAN_DP,\r
c9325700 2443 (UINT16) sizeof (VLAN_DEVICE_PATH)\r
8f97f911 2444 );\r
2445\r
2446 Vlan->VlanId = (UINT16) Strtoi (VlanStr);\r
2447\r
2448 return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
2449}\r
2450\r
572f5d8a 2451/**\r
2452 Converts a text device path node to HD device path structure.\r
2453\r
2454 @param TextDeviceNode The input Text device path node.\r
2455\r
2456 @return A pointer to the newly-created HD device path structure.\r
2457\r
2458**/\r
95276127 2459EFI_DEVICE_PATH_PROTOCOL *\r
2460DevPathFromTextHD (\r
2461 IN CHAR16 *TextDeviceNode\r
2462 )\r
2463{\r
2464 CHAR16 *PartitionStr;\r
2465 CHAR16 *TypeStr;\r
2466 CHAR16 *SignatureStr;\r
2467 CHAR16 *StartStr;\r
2468 CHAR16 *SizeStr;\r
2469 UINT32 Signature32;\r
2470 EFI_GUID SignatureGuid;\r
2471 HARDDRIVE_DEVICE_PATH *Hd;\r
2472\r
2473 PartitionStr = GetNextParamStr (&TextDeviceNode);\r
2474 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2475 SignatureStr = GetNextParamStr (&TextDeviceNode);\r
2476 StartStr = GetNextParamStr (&TextDeviceNode);\r
2477 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2478 Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
2479 MEDIA_DEVICE_PATH,\r
2480 MEDIA_HARDDRIVE_DP,\r
c9325700 2481 (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
95276127 2482 );\r
2483\r
cf40f28a 2484 Hd->PartitionNumber = (UINT32) Dtoi (PartitionStr);\r
95276127 2485\r
2486 ZeroMem (Hd->Signature, 16);\r
2487 Hd->MBRType = (UINT8) 0;\r
2488\r
cf40f28a 2489 if (StrCmp (TypeStr, L"MBR") == 0) {\r
95276127 2490 Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
2491 Hd->MBRType = 0x01;\r
2492\r
cf40f28a 2493 Signature32 = (UINT32) Strtoi (SignatureStr);\r
95276127 2494 CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
cf40f28a 2495 } else if (StrCmp (TypeStr, L"GPT") == 0) {\r
95276127 2496 Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
2497 Hd->MBRType = 0x02;\r
2498\r
2499 StrToGuid (SignatureStr, &SignatureGuid);\r
2500 CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
2501 } else {\r
cf40f28a 2502 Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
95276127 2503 }\r
2504\r
cf40f28a 2505 Strtoi64 (StartStr, &Hd->PartitionStart);\r
2506 Strtoi64 (SizeStr, &Hd->PartitionSize);\r
95276127 2507\r
2508 return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
2509}\r
2510\r
572f5d8a 2511/**\r
2512 Converts a text device path node to CDROM device path structure.\r
2513\r
2514 @param TextDeviceNode The input Text device path node.\r
2515\r
2516 @return A pointer to the newly-created CDROM device path structure.\r
2517\r
2518**/\r
95276127 2519EFI_DEVICE_PATH_PROTOCOL *\r
2520DevPathFromTextCDROM (\r
2521 IN CHAR16 *TextDeviceNode\r
2522 )\r
2523{\r
2524 CHAR16 *EntryStr;\r
2525 CHAR16 *StartStr;\r
2526 CHAR16 *SizeStr;\r
572f5d8a 2527 CDROM_DEVICE_PATH *CDROMDevPath;\r
95276127 2528\r
2529 EntryStr = GetNextParamStr (&TextDeviceNode);\r
2530 StartStr = GetNextParamStr (&TextDeviceNode);\r
2531 SizeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2532 CDROMDevPath = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
95276127 2533 MEDIA_DEVICE_PATH,\r
2534 MEDIA_CDROM_DP,\r
c9325700 2535 (UINT16) sizeof (CDROM_DEVICE_PATH)\r
95276127 2536 );\r
2537\r
572f5d8a 2538 CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);\r
2539 Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);\r
2540 Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);\r
95276127 2541\r
572f5d8a 2542 return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;\r
95276127 2543}\r
2544\r
572f5d8a 2545/**\r
2546 Converts a text device path node to Vendor-defined media device path structure.\r
2547\r
2548 @param TextDeviceNode The input Text device path node.\r
2549\r
2550 @return A pointer to the newly-created Vendor-defined media device path structure.\r
2551\r
2552**/\r
95276127 2553EFI_DEVICE_PATH_PROTOCOL *\r
2554DevPathFromTextVenMEDIA (\r
2555 IN CHAR16 *TextDeviceNode\r
2556 )\r
2557{\r
2558 return ConvertFromTextVendor (\r
2559 TextDeviceNode,\r
2560 MEDIA_DEVICE_PATH,\r
2561 MEDIA_VENDOR_DP\r
2562 );\r
2563}\r
2564\r
572f5d8a 2565/**\r
2566 Converts a text device path node to File device path structure.\r
2567\r
2568 @param TextDeviceNode The input Text device path node.\r
2569\r
2570 @return A pointer to the newly-created File device path structure.\r
2571\r
2572**/\r
95276127 2573EFI_DEVICE_PATH_PROTOCOL *\r
2574DevPathFromTextFilePath (\r
2575 IN CHAR16 *TextDeviceNode\r
2576 )\r
2577{\r
2578 FILEPATH_DEVICE_PATH *File;\r
2579\r
2580 File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2581 MEDIA_DEVICE_PATH,\r
2582 MEDIA_FILEPATH_DP,\r
d074a8e1 2583 (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
95276127 2584 );\r
2585\r
2586 StrCpy (File->PathName, TextDeviceNode);\r
2587\r
2588 return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
2589}\r
2590\r
572f5d8a 2591/**\r
2592 Converts a text device path node to Media protocol device path structure.\r
2593\r
2594 @param TextDeviceNode The input Text device path node.\r
2595\r
2596 @return A pointer to the newly-created Media protocol device path structure.\r
2597\r
2598**/\r
95276127 2599EFI_DEVICE_PATH_PROTOCOL *\r
2600DevPathFromTextMedia (\r
2601 IN CHAR16 *TextDeviceNode\r
2602 )\r
2603{\r
2604 CHAR16 *GuidStr;\r
2605 MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
2606\r
2607 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2608 Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
2609 MEDIA_DEVICE_PATH,\r
2610 MEDIA_PROTOCOL_DP,\r
c9325700 2611 (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
95276127 2612 );\r
2613\r
2614 StrToGuid (GuidStr, &Media->Protocol);\r
2615\r
2616 return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
2617}\r
2618\r
572f5d8a 2619/**\r
2620 Converts a text device path node to firmware volume device path structure.\r
2621\r
2622 @param TextDeviceNode The input Text device path node.\r
2623\r
2624 @return A pointer to the newly-created firmware volume device path structure.\r
2625\r
2626**/\r
cf40f28a 2627EFI_DEVICE_PATH_PROTOCOL *\r
2628DevPathFromTextFv (\r
2629 IN CHAR16 *TextDeviceNode\r
2630 )\r
2631{\r
2632 CHAR16 *GuidStr;\r
2633 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
2634\r
2635 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2636 Fv = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
2637 MEDIA_DEVICE_PATH,\r
2638 MEDIA_PIWG_FW_VOL_DP,\r
c9325700 2639 (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
cf40f28a 2640 );\r
2641\r
2642 StrToGuid (GuidStr, &Fv->FvName);\r
2643\r
2644 return (EFI_DEVICE_PATH_PROTOCOL *) Fv;\r
2645}\r
2646\r
572f5d8a 2647/**\r
2648 Converts a text device path node to firmware file device path structure.\r
2649\r
2650 @param TextDeviceNode The input Text device path node.\r
2651\r
2652 @return A pointer to the newly-created firmware file device path structure.\r
2653\r
2654**/\r
cf40f28a 2655EFI_DEVICE_PATH_PROTOCOL *\r
2656DevPathFromTextFvFile (\r
2657 IN CHAR16 *TextDeviceNode\r
2658 )\r
2659{\r
2660 CHAR16 *GuidStr;\r
2661 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
2662\r
2663 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2664 FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2665 MEDIA_DEVICE_PATH,\r
2666 MEDIA_PIWG_FW_FILE_DP,\r
c9325700 2667 (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
cf40f28a 2668 );\r
2669\r
2670 StrToGuid (GuidStr, &FvFile->FvFileName);\r
2671\r
2672 return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;\r
2673}\r
2674\r
192b057b 2675/**\r
2676 Converts a text device path node to text relative offset device path structure.\r
2677\r
2678 @param TextDeviceNode The input Text device path node.\r
2679\r
2680 @return A pointer to the newly-created Text device path structure.\r
2681\r
2682**/\r
2683EFI_DEVICE_PATH_PROTOCOL *\r
2684DevPathFromTextRelativeOffsetRange (\r
2685 IN CHAR16 *TextDeviceNode\r
2686 )\r
2687{\r
395ed063 2688 CHAR16 *StartingOffsetStr;\r
2689 CHAR16 *EndingOffsetStr;\r
2690 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
192b057b 2691\r
2692 StartingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
2693 EndingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
395ed063 2694 Offset = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (\r
2695 MEDIA_DEVICE_PATH,\r
2696 MEDIA_RELATIVE_OFFSET_RANGE_DP,\r
c9325700 2697 (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
395ed063 2698 );\r
2699\r
792a1534 2700 Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);\r
2701 Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);\r
192b057b 2702\r
2703 return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
2704}\r
2705\r
572f5d8a 2706/**\r
2707 Converts a text device path node to BIOS Boot Specification device path structure.\r
2708\r
2709 @param TextDeviceNode The input Text device path node.\r
2710\r
5755841f 2711 @return A pointer to the newly-created BIOS Boot Specification device path structure.\r
572f5d8a 2712\r
2713**/\r
95276127 2714EFI_DEVICE_PATH_PROTOCOL *\r
2715DevPathFromTextBBS (\r
2716 IN CHAR16 *TextDeviceNode\r
2717 )\r
2718{\r
2719 CHAR16 *TypeStr;\r
2720 CHAR16 *IdStr;\r
2721 CHAR16 *FlagsStr;\r
cf40f28a 2722 CHAR8 *AsciiStr;\r
95276127 2723 BBS_BBS_DEVICE_PATH *Bbs;\r
2724\r
2725 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2726 IdStr = GetNextParamStr (&TextDeviceNode);\r
2727 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
2728 Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
2729 BBS_DEVICE_PATH,\r
2730 BBS_BBS_DP,\r
d074a8e1 2731 (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))\r
95276127 2732 );\r
2733\r
2734 if (StrCmp (TypeStr, L"Floppy") == 0) {\r
2735 Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
2736 } else if (StrCmp (TypeStr, L"HD") == 0) {\r
2737 Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
2738 } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
2739 Bbs->DeviceType = BBS_TYPE_CDROM;\r
2740 } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
2741 Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
2742 } else if (StrCmp (TypeStr, L"USB") == 0) {\r
2743 Bbs->DeviceType = BBS_TYPE_USB;\r
2744 } else if (StrCmp (TypeStr, L"Network") == 0) {\r
2745 Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
2746 } else {\r
cf40f28a 2747 Bbs->DeviceType = (UINT16) Strtoi (TypeStr);\r
95276127 2748 }\r
2749\r
cf40f28a 2750 AsciiStr = Bbs->String;\r
2751 StrToAscii (IdStr, &AsciiStr);\r
95276127 2752\r
cf40f28a 2753 Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);\r
95276127 2754\r
2755 return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
2756}\r
2757\r
572f5d8a 2758/**\r
2759 Converts a text device path node to SATA device path structure.\r
2760\r
2761 @param TextDeviceNode The input Text device path node.\r
2762\r
2763 @return A pointer to the newly-created SATA device path structure.\r
2764\r
2765**/\r
cf40f28a 2766EFI_DEVICE_PATH_PROTOCOL *\r
2767DevPathFromTextSata (\r
2768 IN CHAR16 *TextDeviceNode\r
2769 )\r
2770{\r
2771 SATA_DEVICE_PATH *Sata;\r
2772 CHAR16 *Param1;\r
2773 CHAR16 *Param2;\r
2774 CHAR16 *Param3;\r
2775\r
2776 //\r
2777 // The PMPN is optional.\r
2778 //\r
2779 Param1 = GetNextParamStr (&TextDeviceNode);\r
2780 Param2 = GetNextParamStr (&TextDeviceNode);\r
2781 Param3 = NULL;\r
2782 if (!IS_NULL (TextDeviceNode)) {\r
2783 Param3 = GetNextParamStr (&TextDeviceNode);\r
2784 }\r
2785\r
2786 Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
2787 MESSAGING_DEVICE_PATH,\r
2788 MSG_SATA_DP,\r
c9325700 2789 (UINT16) sizeof (SATA_DEVICE_PATH)\r
cf40f28a 2790 );\r
93e3992d 2791 Sata->HBAPortNumber = (UINT16) Xtoi (Param1);\r
cf40f28a 2792 if (Param3 != NULL) {\r
93e3992d 2793 Sata->PortMultiplierPortNumber = (UINT16) Xtoi (Param2);\r
cf40f28a 2794 Param2 = Param3;\r
2795 } else {\r
186ca8b0 2796 Sata->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;\r
cf40f28a 2797 }\r
93e3992d 2798 Sata->Lun = (UINT16) Xtoi (Param2);\r
cf40f28a 2799\r
2800 return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r
2801}\r
2802\r
95276127 2803GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
2804 {L"Pci", DevPathFromTextPci},\r
2805 {L"PcCard", DevPathFromTextPcCard},\r
2806 {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
2807 {L"VenHw", DevPathFromTextVenHw},\r
2808 {L"Ctrl", DevPathFromTextCtrl},\r
2809 {L"Acpi", DevPathFromTextAcpi},\r
2810 {L"PciRoot", DevPathFromTextPciRoot},\r
2811 {L"Floppy", DevPathFromTextFloppy},\r
2812 {L"Keyboard", DevPathFromTextKeyboard},\r
2813 {L"Serial", DevPathFromTextSerial},\r
2814 {L"ParallelPort", DevPathFromTextParallelPort},\r
2815 {L"AcpiEx", DevPathFromTextAcpiEx},\r
2816 {L"AcpiExp", DevPathFromTextAcpiExp},\r
5b84091f 2817 {L"AcpiAdr", DevPathFromTextAcpiAdr},\r
95276127 2818 {L"Ata", DevPathFromTextAta},\r
2819 {L"Scsi", DevPathFromTextScsi},\r
2820 {L"Fibre", DevPathFromTextFibre},\r
2821 {L"I1394", DevPathFromText1394},\r
2822 {L"USB", DevPathFromTextUsb},\r
2823 {L"I2O", DevPathFromTextI2O},\r
2824 {L"Infiniband", DevPathFromTextInfiniband},\r
2825 {L"VenMsg", DevPathFromTextVenMsg},\r
2826 {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
2827 {L"VenVt100", DevPathFromTextVenVt100},\r
2828 {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
2829 {L"VenUtf8", DevPathFromTextVenUtf8},\r
2830 {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
2831 {L"SAS", DevPathFromTextSAS},\r
2832 {L"DebugPort", DevPathFromTextDebugPort},\r
2833 {L"MAC", DevPathFromTextMAC},\r
2834 {L"IPv4", DevPathFromTextIPv4},\r
2835 {L"IPv6", DevPathFromTextIPv6},\r
2836 {L"Uart", DevPathFromTextUart},\r
2837 {L"UsbClass", DevPathFromTextUsbClass},\r
2838 {L"UsbAudio", DevPathFromTextUsbAudio},\r
2839 {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
2840 {L"UsbHID", DevPathFromTextUsbHID},\r
2841 {L"UsbImage", DevPathFromTextUsbImage},\r
2842 {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
2843 {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
2844 {L"UsbHub", DevPathFromTextUsbHub},\r
2845 {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
2846 {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
2847 {L"UsbVideo", DevPathFromTextUsbVideo},\r
2848 {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
2849 {L"UsbWireless", DevPathFromTextUsbWireless},\r
2850 {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
2851 {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
2852 {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
2853 {L"UsbWwid", DevPathFromTextUsbWwid},\r
2854 {L"Unit", DevPathFromTextUnit},\r
2855 {L"iSCSI", DevPathFromTextiSCSI},\r
8f97f911 2856 {L"Vlan", DevPathFromTextVlan},\r
95276127 2857 {L"HD", DevPathFromTextHD},\r
2858 {L"CDROM", DevPathFromTextCDROM},\r
2859 {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
2860 {L"Media", DevPathFromTextMedia},\r
cf40f28a 2861 {L"Fv", DevPathFromTextFv},\r
2862 {L"FvFile", DevPathFromTextFvFile},\r
192b057b 2863 {L"Offset", DevPathFromTextRelativeOffsetRange},\r
95276127 2864 {L"BBS", DevPathFromTextBBS},\r
cf40f28a 2865 {L"Sata", DevPathFromTextSata},\r
95276127 2866 {NULL, NULL}\r
2867};\r
2868\r
572f5d8a 2869/**\r
2870 Convert text to the binary representation of a device node.\r
95276127 2871\r
572f5d8a 2872 @param TextDeviceNode TextDeviceNode points to the text representation of a device\r
95276127 2873 node. Conversion starts with the first character and continues\r
2874 until the first non-device node character.\r
2875\r
572f5d8a 2876 @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was\r
2877 insufficient memory or text unsupported.\r
95276127 2878\r
572f5d8a 2879**/\r
2880EFI_DEVICE_PATH_PROTOCOL *\r
2881EFIAPI\r
2882ConvertTextToDeviceNode (\r
2883 IN CONST CHAR16 *TextDeviceNode\r
2884 )\r
95276127 2885{\r
572f5d8a 2886 DUMP_NODE DumpNode;\r
95276127 2887 CHAR16 *ParamStr;\r
2888 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2889 CHAR16 *DeviceNodeStr;\r
2890 UINTN Index;\r
2891\r
2892 if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
2893 return NULL;\r
2894 }\r
2895\r
2896 ParamStr = NULL;\r
2897 DumpNode = NULL;\r
2898 DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
3069bc19 2899 ASSERT (DeviceNodeStr != NULL);\r
95276127 2900\r
7ae9c1ce 2901 for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
95276127 2902 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2903 if (ParamStr != NULL) {\r
2904 DumpNode = DevPathFromTextTable[Index].Function;\r
2905 break;\r
2906 }\r
2907 }\r
2908\r
2909 if (DumpNode == NULL) {\r
2910 //\r
2911 // A file path\r
2912 //\r
2913 DumpNode = DevPathFromTextFilePath;\r
2914 DeviceNode = DumpNode (DeviceNodeStr);\r
2915 } else {\r
2916 DeviceNode = DumpNode (ParamStr);\r
2917 FreePool (ParamStr);\r
2918 }\r
2919\r
2920 FreePool (DeviceNodeStr);\r
2921\r
2922 return DeviceNode;\r
2923}\r
2924\r
572f5d8a 2925/**\r
2926 Convert text to the binary representation of a device path.\r
95276127 2927\r
95276127 2928\r
572f5d8a 2929 @param TextDevicePath TextDevicePath points to the text representation of a device\r
95276127 2930 path. Conversion starts with the first character and continues\r
2931 until the first non-device node character.\r
2932\r
572f5d8a 2933 @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or\r
2934 there was insufficient memory.\r
95276127 2935\r
572f5d8a 2936**/\r
2937EFI_DEVICE_PATH_PROTOCOL *\r
2938EFIAPI\r
2939ConvertTextToDevicePath (\r
2940 IN CONST CHAR16 *TextDevicePath\r
2941 )\r
95276127 2942{\r
572f5d8a 2943 DUMP_NODE DumpNode;\r
95276127 2944 CHAR16 *ParamStr;\r
2945 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2946 UINTN Index;\r
2947 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
2948 CHAR16 *DevicePathStr;\r
2949 CHAR16 *Str;\r
2950 CHAR16 *DeviceNodeStr;\r
2951 UINT8 IsInstanceEnd;\r
2952 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
2953\r
2954 if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
2955 return NULL;\r
2956 }\r
2957\r
2958 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 2959 ASSERT (DevicePath != NULL);\r
95276127 2960 SetDevicePathEndNode (DevicePath);\r
2961\r
2962 ParamStr = NULL;\r
2963 DeviceNodeStr = NULL;\r
2964 DevicePathStr = StrDuplicate (TextDevicePath);\r
2965\r
2966 Str = DevicePathStr;\r
2967 while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
2968 DumpNode = NULL;\r
7ae9c1ce 2969 for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
95276127 2970 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2971 if (ParamStr != NULL) {\r
2972 DumpNode = DevPathFromTextTable[Index].Function;\r
2973 break;\r
2974 }\r
2975 }\r
2976\r
2977 if (DumpNode == NULL) {\r
2978 //\r
2979 // A file path\r
2980 //\r
2981 DumpNode = DevPathFromTextFilePath;\r
2982 DeviceNode = DumpNode (DeviceNodeStr);\r
2983 } else {\r
2984 DeviceNode = DumpNode (ParamStr);\r
2985 FreePool (ParamStr);\r
2986 }\r
2987\r
2988 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2989 FreePool (DevicePath);\r
2990 FreePool (DeviceNode);\r
2991 DevicePath = NewDevicePath;\r
2992\r
572f5d8a 2993 if (IsInstanceEnd != 0) {\r
95276127 2994 DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 2995 ASSERT (DeviceNode != NULL);\r
572f5d8a 2996 SET_DEVICE_PATH_INSTANCE_END_NODE (DeviceNode);\r
95276127 2997\r
2998 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2999 FreePool (DevicePath);\r
3000 FreePool (DeviceNode);\r
3001 DevicePath = NewDevicePath;\r
3002 }\r
3003 }\r
3004\r
3005 FreePool (DevicePathStr);\r
3006 return DevicePath;\r
3007}\r