]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DevicePathDxe/DevicePathFromText.c
Update ISID to fixed value: first 3 bytes are derived from MAC address while the...
[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
b36653bc 1156 UINTN Length;\r
5b84091f
RN
1157\r
1158 AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (\r
1159 ACPI_DEVICE_PATH,\r
1160 ACPI_ADR_DP,\r
1161 sizeof (ACPI_ADR_DEVICE_PATH)\r
1162 );\r
1163 ASSERT (AcpiAdr != NULL);\r
1164\r
1165 for (Index = 0; ; Index++) {\r
1166 DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);\r
1167 if (IS_NULL (*DisplayDeviceStr)) {\r
1168 break;\r
1169 }\r
1170 if (Index > 0) {\r
b36653bc 1171 Length = DevicePathNodeLength (AcpiAdr);\r
5b84091f 1172 AcpiAdr = ReallocatePool (\r
b36653bc
RN
1173 Length,\r
1174 Length + sizeof (UINT32),\r
5b84091f
RN
1175 AcpiAdr\r
1176 );\r
1177 ASSERT (AcpiAdr != NULL);\r
b36653bc 1178 SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
5b84091f
RN
1179 }\r
1180 \r
1181 (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
1182 }\r
1183\r
1184 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
1185}\r
1186\r
572f5d8a 1187/**\r
1188 Converts a text device path node to Parallel Port device path structure.\r
1189\r
1190 @param TextDeviceNode The input Text device path node.\r
1191\r
1192 @return A pointer to the newly-created Parallel Port device path structure.\r
1193\r
1194**/\r
95276127 1195EFI_DEVICE_PATH_PROTOCOL *\r
1196DevPathFromTextAta (\r
1197 IN CHAR16 *TextDeviceNode\r
1198 )\r
1199{\r
1200 CHAR16 *PrimarySecondaryStr;\r
1201 CHAR16 *SlaveMasterStr;\r
1202 CHAR16 *LunStr;\r
1203 ATAPI_DEVICE_PATH *Atapi;\r
1204\r
1205 Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
1206 MESSAGING_DEVICE_PATH,\r
1207 MSG_ATAPI_DP,\r
c9325700 1208 (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
95276127 1209 );\r
1210\r
1211 PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
1212 SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
1213 LunStr = GetNextParamStr (&TextDeviceNode);\r
1214\r
1215 Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);\r
1216 Atapi->SlaveMaster = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);\r
cf40f28a 1217 Atapi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1218\r
1219 return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
1220}\r
1221\r
572f5d8a 1222/**\r
1223 Converts a text device path node to SCSI device path structure.\r
1224\r
1225 @param TextDeviceNode The input Text device path node.\r
1226\r
1227 @return A pointer to the newly-created SCSI device path structure.\r
1228\r
1229**/\r
95276127 1230EFI_DEVICE_PATH_PROTOCOL *\r
1231DevPathFromTextScsi (\r
1232 IN CHAR16 *TextDeviceNode\r
1233 )\r
1234{\r
1235 CHAR16 *PunStr;\r
1236 CHAR16 *LunStr;\r
1237 SCSI_DEVICE_PATH *Scsi;\r
1238\r
1239 PunStr = GetNextParamStr (&TextDeviceNode);\r
1240 LunStr = GetNextParamStr (&TextDeviceNode);\r
1241 Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
1242 MESSAGING_DEVICE_PATH,\r
1243 MSG_SCSI_DP,\r
c9325700 1244 (UINT16) sizeof (SCSI_DEVICE_PATH)\r
95276127 1245 );\r
1246\r
cf40f28a 1247 Scsi->Pun = (UINT16) Strtoi (PunStr);\r
1248 Scsi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1249\r
1250 return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
1251}\r
1252\r
572f5d8a 1253/**\r
1254 Converts a text device path node to Fibre device path structure.\r
1255\r
1256 @param TextDeviceNode The input Text device path node.\r
1257\r
1258 @return A pointer to the newly-created Fibre device path structure.\r
1259\r
1260**/\r
95276127 1261EFI_DEVICE_PATH_PROTOCOL *\r
1262DevPathFromTextFibre (\r
1263 IN CHAR16 *TextDeviceNode\r
1264 )\r
1265{\r
1266 CHAR16 *WWNStr;\r
1267 CHAR16 *LunStr;\r
1268 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
1269\r
1270 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1271 LunStr = GetNextParamStr (&TextDeviceNode);\r
1272 Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
1273 MESSAGING_DEVICE_PATH,\r
1274 MSG_FIBRECHANNEL_DP,\r
c9325700 1275 (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
95276127 1276 );\r
1277\r
1278 Fibre->Reserved = 0;\r
cf40f28a 1279 Strtoi64 (WWNStr, &Fibre->WWN);\r
1280 Strtoi64 (LunStr, &Fibre->Lun);\r
95276127 1281\r
1282 return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
1283}\r
1284\r
572f5d8a 1285/**\r
1286 Converts a text device path node to 1394 device path structure.\r
1287\r
1288 @param TextDeviceNode The input Text device path node.\r
1289\r
1290 @return A pointer to the newly-created 1394 device path structure.\r
1291\r
1292**/\r
95276127 1293EFI_DEVICE_PATH_PROTOCOL *\r
1294DevPathFromText1394 (\r
1295 IN CHAR16 *TextDeviceNode\r
1296 )\r
1297{\r
1298 CHAR16 *GuidStr;\r
572f5d8a 1299 F1394_DEVICE_PATH *F1394DevPath;\r
95276127 1300\r
1301 GuidStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1302 F1394DevPath = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
1303 MESSAGING_DEVICE_PATH,\r
1304 MSG_1394_DP,\r
c9325700 1305 (UINT16) sizeof (F1394_DEVICE_PATH)\r
572f5d8a 1306 );\r
95276127 1307\r
572f5d8a 1308 F1394DevPath->Reserved = 0;\r
1309 Xtoi64 (GuidStr, &F1394DevPath->Guid);\r
95276127 1310\r
572f5d8a 1311 return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;\r
95276127 1312}\r
1313\r
572f5d8a 1314/**\r
1315 Converts a text device path node to USB device path structure.\r
1316\r
1317 @param TextDeviceNode The input Text device path node.\r
1318\r
1319 @return A pointer to the newly-created USB device path structure.\r
1320\r
1321**/\r
95276127 1322EFI_DEVICE_PATH_PROTOCOL *\r
1323DevPathFromTextUsb (\r
1324 IN CHAR16 *TextDeviceNode\r
1325 )\r
1326{\r
1327 CHAR16 *PortStr;\r
1328 CHAR16 *InterfaceStr;\r
1329 USB_DEVICE_PATH *Usb;\r
1330\r
1331 PortStr = GetNextParamStr (&TextDeviceNode);\r
1332 InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
1333 Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
1334 MESSAGING_DEVICE_PATH,\r
1335 MSG_USB_DP,\r
c9325700 1336 (UINT16) sizeof (USB_DEVICE_PATH)\r
95276127 1337 );\r
1338\r
cf40f28a 1339 Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
1340 Usb->InterfaceNumber = (UINT8) Strtoi (InterfaceStr);\r
95276127 1341\r
1342 return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
1343}\r
1344\r
572f5d8a 1345/**\r
1346 Converts a text device path node to I20 device path structure.\r
1347\r
1348 @param TextDeviceNode The input Text device path node.\r
1349\r
1350 @return A pointer to the newly-created I20 device path structure.\r
1351\r
1352**/\r
95276127 1353EFI_DEVICE_PATH_PROTOCOL *\r
1354DevPathFromTextI2O (\r
1355 IN CHAR16 *TextDeviceNode\r
1356 )\r
1357{\r
1358 CHAR16 *TIDStr;\r
572f5d8a 1359 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1360\r
572f5d8a 1361 TIDStr = GetNextParamStr (&TextDeviceNode);\r
1362 I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1363 MESSAGING_DEVICE_PATH,\r
1364 MSG_I2O_DP,\r
c9325700 1365 (UINT16) sizeof (I2O_DEVICE_PATH)\r
95276127 1366 );\r
1367\r
572f5d8a 1368 I2ODevPath->Tid = (UINT32) Strtoi (TIDStr);\r
95276127 1369\r
572f5d8a 1370 return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;\r
95276127 1371}\r
1372\r
572f5d8a 1373/**\r
1374 Converts a text device path node to Infini Band device path structure.\r
1375\r
1376 @param TextDeviceNode The input Text device path node.\r
1377\r
1378 @return A pointer to the newly-created Infini Band device path structure.\r
1379\r
1380**/\r
95276127 1381EFI_DEVICE_PATH_PROTOCOL *\r
1382DevPathFromTextInfiniband (\r
1383 IN CHAR16 *TextDeviceNode\r
1384 )\r
1385{\r
1386 CHAR16 *FlagsStr;\r
1387 CHAR16 *GuidStr;\r
1388 CHAR16 *SidStr;\r
1389 CHAR16 *TidStr;\r
1390 CHAR16 *DidStr;\r
1391 EFI_GUID PortGid;\r
1392 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1393\r
1394 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
1395 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1396 SidStr = GetNextParamStr (&TextDeviceNode);\r
1397 TidStr = GetNextParamStr (&TextDeviceNode);\r
1398 DidStr = GetNextParamStr (&TextDeviceNode);\r
1399 InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
1400 MESSAGING_DEVICE_PATH,\r
1401 MSG_INFINIBAND_DP,\r
c9325700 1402 (UINT16) sizeof (INFINIBAND_DEVICE_PATH)\r
95276127 1403 );\r
1404\r
cf40f28a 1405 InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
95276127 1406 StrToGuid (GuidStr, &PortGid);\r
1407 CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
cf40f28a 1408 Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
1409 Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
1410 Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
95276127 1411\r
1412 return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
1413}\r
1414\r
572f5d8a 1415/**\r
1416 Converts a text device path node to Vendor-Defined Messaging device path structure.\r
1417\r
1418 @param TextDeviceNode The input Text device path node.\r
1419\r
1420 @return A pointer to the newly-created Vendor-Defined Messaging device path structure.\r
1421\r
1422**/\r
95276127 1423EFI_DEVICE_PATH_PROTOCOL *\r
1424DevPathFromTextVenMsg (\r
1425 IN CHAR16 *TextDeviceNode\r
1426 )\r
1427{\r
1428 return ConvertFromTextVendor (\r
1429 TextDeviceNode,\r
1430 MESSAGING_DEVICE_PATH,\r
1431 MSG_VENDOR_DP\r
1432 );\r
1433}\r
1434\r
572f5d8a 1435/**\r
1436 Converts a text device path node to Vendor defined PC-ANSI device path structure.\r
1437\r
1438 @param TextDeviceNode The input Text device path node.\r
1439\r
1440 @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.\r
1441\r
1442**/\r
95276127 1443EFI_DEVICE_PATH_PROTOCOL *\r
1444DevPathFromTextVenPcAnsi (\r
1445 IN CHAR16 *TextDeviceNode\r
1446 )\r
1447{\r
1448 VENDOR_DEVICE_PATH *Vendor;\r
1449\r
1450 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1451 MESSAGING_DEVICE_PATH,\r
1452 MSG_VENDOR_DP,\r
c9325700 1453 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1454 CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
1455\r
1456 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1457}\r
1458\r
572f5d8a 1459/**\r
1460 Converts a text device path node to Vendor defined VT100 device path structure.\r
1461\r
1462 @param TextDeviceNode The input Text device path node.\r
1463\r
1464 @return A pointer to the newly-created Vendor defined VT100 device path structure.\r
1465\r
1466**/\r
95276127 1467EFI_DEVICE_PATH_PROTOCOL *\r
1468DevPathFromTextVenVt100 (\r
1469 IN CHAR16 *TextDeviceNode\r
1470 )\r
1471{\r
1472 VENDOR_DEVICE_PATH *Vendor;\r
1473\r
1474 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1475 MESSAGING_DEVICE_PATH,\r
1476 MSG_VENDOR_DP,\r
c9325700 1477 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1478 CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
1479\r
1480 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1481}\r
1482\r
572f5d8a 1483/**\r
1484 Converts a text device path node to Vendor defined VT100 Plus device path structure.\r
1485\r
1486 @param TextDeviceNode The input Text device path node.\r
1487\r
1488 @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.\r
1489\r
1490**/\r
95276127 1491EFI_DEVICE_PATH_PROTOCOL *\r
1492DevPathFromTextVenVt100Plus (\r
1493 IN CHAR16 *TextDeviceNode\r
1494 )\r
1495{\r
1496 VENDOR_DEVICE_PATH *Vendor;\r
1497\r
1498 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1499 MESSAGING_DEVICE_PATH,\r
1500 MSG_VENDOR_DP,\r
c9325700 1501 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1502 CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
1503\r
1504 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1505}\r
1506\r
572f5d8a 1507/**\r
1508 Converts a text device path node to Vendor defined UTF8 device path structure.\r
1509\r
1510 @param TextDeviceNode The input Text device path node.\r
1511\r
1512 @return A pointer to the newly-created Vendor defined UTF8 device path structure.\r
1513\r
1514**/\r
95276127 1515EFI_DEVICE_PATH_PROTOCOL *\r
1516DevPathFromTextVenUtf8 (\r
1517 IN CHAR16 *TextDeviceNode\r
1518 )\r
1519{\r
1520 VENDOR_DEVICE_PATH *Vendor;\r
1521\r
1522 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1523 MESSAGING_DEVICE_PATH,\r
1524 MSG_VENDOR_DP,\r
c9325700 1525 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1526 CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
1527\r
1528 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1529}\r
1530\r
572f5d8a 1531/**\r
1532 Converts a text device path node to UART Flow Control device path structure.\r
1533\r
1534 @param TextDeviceNode The input Text device path node.\r
1535\r
1536 @return A pointer to the newly-created UART Flow Control device path structure.\r
1537\r
1538**/\r
95276127 1539EFI_DEVICE_PATH_PROTOCOL *\r
1540DevPathFromTextUartFlowCtrl (\r
1541 IN CHAR16 *TextDeviceNode\r
1542 )\r
1543{\r
1544 CHAR16 *ValueStr;\r
1545 UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
1546\r
1547 ValueStr = GetNextParamStr (&TextDeviceNode);\r
1548 UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
1549 MESSAGING_DEVICE_PATH,\r
1550 MSG_VENDOR_DP,\r
c9325700 1551 (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
95276127 1552 );\r
1553\r
48557c65 1554 CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);\r
95276127 1555 if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
1556 UartFlowControl->FlowControlMap = 2;\r
1557 } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
1558 UartFlowControl->FlowControlMap = 1;\r
1559 } else {\r
1560 UartFlowControl->FlowControlMap = 0;\r
1561 }\r
1562\r
1563 return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
1564}\r
1565\r
572f5d8a 1566/**\r
1567 Converts a text device path node to Serial Attached SCSI device path structure.\r
1568\r
1569 @param TextDeviceNode The input Text device path node.\r
1570\r
1571 @return A pointer to the newly-created Serial Attached SCSI device path structure.\r
1572\r
1573**/\r
95276127 1574EFI_DEVICE_PATH_PROTOCOL *\r
1575DevPathFromTextSAS (\r
1576 IN CHAR16 *TextDeviceNode\r
1577 )\r
1578{\r
1579 CHAR16 *AddressStr;\r
1580 CHAR16 *LunStr;\r
1581 CHAR16 *RTPStr;\r
1582 CHAR16 *SASSATAStr;\r
1583 CHAR16 *LocationStr;\r
1584 CHAR16 *ConnectStr;\r
1585 CHAR16 *DriveBayStr;\r
1586 CHAR16 *ReservedStr;\r
1587 UINT16 Info;\r
1588 SAS_DEVICE_PATH *Sas;\r
1589\r
1590 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1591 LunStr = GetNextParamStr (&TextDeviceNode);\r
1592 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1593 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1594 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1595 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1596 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
1597 ReservedStr = GetNextParamStr (&TextDeviceNode);\r
1598 Info = 0x0000;\r
1599 Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
1600 MESSAGING_DEVICE_PATH,\r
1601 MSG_VENDOR_DP,\r
c9325700 1602 (UINT16) sizeof (SAS_DEVICE_PATH)\r
95276127 1603 );\r
1604\r
48557c65 1605 CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);\r
cf40f28a 1606 Strtoi64 (AddressStr, &Sas->SasAddress);\r
1607 Strtoi64 (LunStr, &Sas->Lun);\r
1608 Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
1609 if (StrCmp (SASSATAStr, L"NoTopology") != 0) {\r
95276127 1610 if (StrCmp (DriveBayStr, L"0") == 0) {\r
1611 Info |= 0x0001;\r
1612 } else {\r
1613 Info |= 0x0002;\r
cf40f28a 1614 Info = (UINT16) (Info | (Strtoi (DriveBayStr) << 8));\r
95276127 1615 }\r
1616\r
1617 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
1618 Info |= 0x0010;\r
1619 }\r
1620\r
1621 if (StrCmp (LocationStr, L"External") == 0) {\r
1622 Info |= 0x0020;\r
1623 }\r
1624\r
1625 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
1626 Info |= 0x0040;\r
1627 }\r
1628 }\r
1629\r
1630 Sas->DeviceTopology = Info;\r
cf40f28a 1631 Sas->Reserved = (UINT32) Strtoi (ReservedStr);\r
95276127 1632\r
1633 return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
1634}\r
1635\r
572f5d8a 1636/**\r
1637 Converts a text device path node to Debug Port device path structure.\r
1638\r
1639 @param TextDeviceNode The input Text device path node.\r
1640\r
1641 @return A pointer to the newly-created Debug Port device path structure.\r
1642\r
1643**/\r
95276127 1644EFI_DEVICE_PATH_PROTOCOL *\r
1645DevPathFromTextDebugPort (\r
1646 IN CHAR16 *TextDeviceNode\r
1647 )\r
1648{\r
1649 VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
1650\r
1651 Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
1652 MESSAGING_DEVICE_PATH,\r
1653 MSG_VENDOR_DP,\r
c9325700 1654 (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
95276127 1655 );\r
1656\r
1657 CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
1658\r
1659 return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
1660}\r
1661\r
572f5d8a 1662/**\r
1663 Converts a text device path node to MAC device path structure.\r
1664\r
1665 @param TextDeviceNode The input Text device path node.\r
1666\r
1667 @return A pointer to the newly-created MAC device path structure.\r
1668\r
1669**/\r
95276127 1670EFI_DEVICE_PATH_PROTOCOL *\r
1671DevPathFromTextMAC (\r
1672 IN CHAR16 *TextDeviceNode\r
1673 )\r
1674{\r
1675 CHAR16 *AddressStr;\r
1676 CHAR16 *IfTypeStr;\r
1677 UINTN Length;\r
572f5d8a 1678 MAC_ADDR_DEVICE_PATH *MACDevPath;\r
95276127 1679\r
1680 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1681 IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1682 MACDevPath = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1683 MESSAGING_DEVICE_PATH,\r
1684 MSG_MAC_ADDR_DP,\r
c9325700 1685 (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)\r
95276127 1686 );\r
1687\r
572f5d8a 1688 MACDevPath->IfType = (UINT8) Strtoi (IfTypeStr);\r
95276127 1689\r
1690 Length = sizeof (EFI_MAC_ADDRESS);\r
572f5d8a 1691 StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
95276127 1692\r
572f5d8a 1693 return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
95276127 1694}\r
1695\r
052019e1 1696\r
1697/**\r
1698 Converts a text format to the network protocol ID.\r
1699\r
1700 @param Text String of protocol field.\r
1701\r
1702 @return Network protocol ID .\r
1703\r
1704**/\r
1705UINTN\r
1706NetworkProtocolFromText (\r
1707 IN CHAR16 *Text\r
1708 )\r
1709{\r
1710 if (StrCmp (Text, L"UDP") == 0) {\r
1711 return RFC_1700_UDP_PROTOCOL;\r
1712 }\r
1713\r
1714 if (StrCmp (Text, L"TCP") == 0) {\r
1715 return RFC_1700_TCP_PROTOCOL;\r
1716 }\r
1717\r
1718 return Strtoi (Text);\r
1719}\r
1720\r
1721\r
572f5d8a 1722/**\r
1723 Converts a text device path node to IPV4 device path structure.\r
1724\r
1725 @param TextDeviceNode The input Text device path node.\r
1726\r
1727 @return A pointer to the newly-created IPV4 device path structure.\r
1728\r
1729**/\r
95276127 1730EFI_DEVICE_PATH_PROTOCOL *\r
1731DevPathFromTextIPv4 (\r
1732 IN CHAR16 *TextDeviceNode\r
1733 )\r
1734{\r
1735 CHAR16 *RemoteIPStr;\r
1736 CHAR16 *ProtocolStr;\r
1737 CHAR16 *TypeStr;\r
1738 CHAR16 *LocalIPStr;\r
1739 IPv4_DEVICE_PATH *IPv4;\r
1740\r
1741 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1742 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1743 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1744 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1745 IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
1746 MESSAGING_DEVICE_PATH,\r
1747 MSG_IPv4_DP,\r
c9325700 1748 (UINT16) sizeof (IPv4_DEVICE_PATH)\r
95276127 1749 );\r
1750\r
1751 StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
052019e1 1752 IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1753 if (StrCmp (TypeStr, L"Static") == 0) {\r
1754 IPv4->StaticIpAddress = TRUE;\r
1755 } else {\r
1756 IPv4->StaticIpAddress = FALSE;\r
1757 }\r
1758\r
1759 StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
1760\r
cf40f28a 1761 IPv4->LocalPort = 0;\r
1762 IPv4->RemotePort = 0;\r
95276127 1763\r
1764 return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
1765}\r
1766\r
572f5d8a 1767/**\r
1768 Converts a text device path node to IPV6 device path structure.\r
1769\r
1770 @param TextDeviceNode The input Text device path node.\r
1771\r
1772 @return A pointer to the newly-created IPV6 device path structure.\r
1773\r
1774**/\r
95276127 1775EFI_DEVICE_PATH_PROTOCOL *\r
1776DevPathFromTextIPv6 (\r
1777 IN CHAR16 *TextDeviceNode\r
1778 )\r
1779{\r
1780 CHAR16 *RemoteIPStr;\r
1781 CHAR16 *ProtocolStr;\r
1782 CHAR16 *TypeStr;\r
1783 CHAR16 *LocalIPStr;\r
1784 IPv6_DEVICE_PATH *IPv6;\r
1785\r
1786 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1787 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1788 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1789 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1790 IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
1791 MESSAGING_DEVICE_PATH,\r
1792 MSG_IPv6_DP,\r
c9325700 1793 (UINT16) sizeof (IPv6_DEVICE_PATH)\r
95276127 1794 );\r
1795\r
1796 StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
052019e1 1797 IPv6->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1798 if (StrCmp (TypeStr, L"Static") == 0) {\r
1799 IPv6->StaticIpAddress = TRUE;\r
1800 } else {\r
1801 IPv6->StaticIpAddress = FALSE;\r
1802 }\r
1803\r
1804 StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
1805\r
1806 IPv6->LocalPort = 0;\r
1807 IPv6->RemotePort = 0;\r
1808\r
1809 return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
1810}\r
1811\r
572f5d8a 1812/**\r
1813 Converts a text device path node to UART device path structure.\r
1814\r
1815 @param TextDeviceNode The input Text device path node.\r
1816\r
1817 @return A pointer to the newly-created UART device path structure.\r
1818\r
1819**/\r
95276127 1820EFI_DEVICE_PATH_PROTOCOL *\r
1821DevPathFromTextUart (\r
1822 IN CHAR16 *TextDeviceNode\r
1823 )\r
1824{\r
1825 CHAR16 *BaudStr;\r
1826 CHAR16 *DataBitsStr;\r
1827 CHAR16 *ParityStr;\r
1828 CHAR16 *StopBitsStr;\r
1829 UART_DEVICE_PATH *Uart;\r
1830\r
1831 BaudStr = GetNextParamStr (&TextDeviceNode);\r
1832 DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
1833 ParityStr = GetNextParamStr (&TextDeviceNode);\r
1834 StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
1835 Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
1836 MESSAGING_DEVICE_PATH,\r
1837 MSG_UART_DP,\r
c9325700 1838 (UINT16) sizeof (UART_DEVICE_PATH)\r
95276127 1839 );\r
1840\r
cf40f28a 1841 Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr);\r
1842 Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Dtoi (DataBitsStr));\r
95276127 1843 switch (*ParityStr) {\r
1844 case L'D':\r
1845 Uart->Parity = 0;\r
1846 break;\r
1847\r
1848 case L'N':\r
1849 Uart->Parity = 1;\r
1850 break;\r
1851\r
1852 case L'E':\r
1853 Uart->Parity = 2;\r
1854 break;\r
1855\r
1856 case L'O':\r
1857 Uart->Parity = 3;\r
1858 break;\r
1859\r
1860 case L'M':\r
1861 Uart->Parity = 4;\r
1862 break;\r
1863\r
1864 case L'S':\r
1865 Uart->Parity = 5;\r
1866\r
1867 default:\r
1868 Uart->Parity = 0xff;\r
1869 }\r
1870\r
1871 if (StrCmp (StopBitsStr, L"D") == 0) {\r
1872 Uart->StopBits = (UINT8) 0;\r
1873 } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
1874 Uart->StopBits = (UINT8) 1;\r
1875 } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
1876 Uart->StopBits = (UINT8) 2;\r
1877 } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
1878 Uart->StopBits = (UINT8) 3;\r
1879 } else {\r
1880 Uart->StopBits = 0xff;\r
1881 }\r
1882\r
1883 return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
1884}\r
1885\r
572f5d8a 1886/**\r
1887 Converts a text device path node to USB class device path structure.\r
1888\r
1889 @param TextDeviceNode The input Text device path node.\r
1890 @param UsbClassText A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.\r
1891\r
1892 @return A pointer to the newly-created USB class device path structure.\r
1893\r
1894**/\r
95276127 1895EFI_DEVICE_PATH_PROTOCOL *\r
1896ConvertFromTextUsbClass (\r
1897 IN CHAR16 *TextDeviceNode,\r
1898 IN USB_CLASS_TEXT *UsbClassText\r
1899 )\r
1900{\r
1901 CHAR16 *VIDStr;\r
1902 CHAR16 *PIDStr;\r
1903 CHAR16 *ClassStr;\r
1904 CHAR16 *SubClassStr;\r
1905 CHAR16 *ProtocolStr;\r
1906 USB_CLASS_DEVICE_PATH *UsbClass;\r
1907\r
1908 UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
1909 MESSAGING_DEVICE_PATH,\r
1910 MSG_USB_CLASS_DP,\r
c9325700 1911 (UINT16) sizeof (USB_CLASS_DEVICE_PATH)\r
95276127 1912 );\r
1913\r
1914 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1915 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1916 if (UsbClassText->ClassExist) {\r
1917 ClassStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 1918 UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
95276127 1919 } else {\r
1920 UsbClass->DeviceClass = UsbClassText->Class;\r
1921 }\r
1922 if (UsbClassText->SubClassExist) {\r
1923 SubClassStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 1924 UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
95276127 1925 } else {\r
1926 UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
572f5d8a 1927 }\r
95276127 1928\r
1929 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1930\r
cf40f28a 1931 UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
1932 UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
1933 UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
95276127 1934\r
1935 return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
1936}\r
1937\r
1938\r
572f5d8a 1939/**\r
1940 Converts a text device path node to USB class device path structure.\r
1941\r
1942 @param TextDeviceNode The input Text device path node.\r
1943\r
1944 @return A pointer to the newly-created USB class device path structure.\r
1945\r
1946**/\r
95276127 1947EFI_DEVICE_PATH_PROTOCOL *\r
1948DevPathFromTextUsbClass (\r
1949 IN CHAR16 *TextDeviceNode\r
1950 )\r
1951{\r
1952 USB_CLASS_TEXT UsbClassText;\r
1953\r
1954 UsbClassText.ClassExist = TRUE;\r
1955 UsbClassText.SubClassExist = TRUE;\r
1956\r
1957 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1958}\r
1959\r
572f5d8a 1960/**\r
1961 Converts a text device path node to USB audio device path structure.\r
1962\r
1963 @param TextDeviceNode The input Text device path node.\r
1964\r
1965 @return A pointer to the newly-created USB audio device path structure.\r
1966\r
1967**/\r
95276127 1968EFI_DEVICE_PATH_PROTOCOL *\r
1969DevPathFromTextUsbAudio (\r
1970 IN CHAR16 *TextDeviceNode\r
1971 )\r
1972{\r
1973 USB_CLASS_TEXT UsbClassText;\r
1974\r
1975 UsbClassText.ClassExist = FALSE;\r
1976 UsbClassText.Class = USB_CLASS_AUDIO;\r
1977 UsbClassText.SubClassExist = TRUE;\r
1978\r
1979 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1980}\r
1981\r
572f5d8a 1982/**\r
1983 Converts a text device path node to USB CDC Control device path structure.\r
1984\r
1985 @param TextDeviceNode The input Text device path node.\r
1986\r
1987 @return A pointer to the newly-created USB CDC Control device path structure.\r
1988\r
1989**/\r
95276127 1990EFI_DEVICE_PATH_PROTOCOL *\r
1991DevPathFromTextUsbCDCControl (\r
1992 IN CHAR16 *TextDeviceNode\r
1993 )\r
1994{\r
1995 USB_CLASS_TEXT UsbClassText;\r
1996\r
1997 UsbClassText.ClassExist = FALSE;\r
1998 UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
1999 UsbClassText.SubClassExist = TRUE;\r
2000\r
2001 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2002}\r
2003\r
572f5d8a 2004/**\r
2005 Converts a text device path node to USB HID device path structure.\r
2006\r
2007 @param TextDeviceNode The input Text device path node.\r
2008\r
2009 @return A pointer to the newly-created USB HID device path structure.\r
2010\r
2011**/\r
95276127 2012EFI_DEVICE_PATH_PROTOCOL *\r
2013DevPathFromTextUsbHID (\r
2014 IN CHAR16 *TextDeviceNode\r
2015 )\r
2016{\r
2017 USB_CLASS_TEXT UsbClassText;\r
2018\r
2019 UsbClassText.ClassExist = FALSE;\r
2020 UsbClassText.Class = USB_CLASS_HID;\r
2021 UsbClassText.SubClassExist = TRUE;\r
2022\r
2023 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2024}\r
2025\r
572f5d8a 2026/**\r
2027 Converts a text device path node to USB Image device path structure.\r
2028\r
2029 @param TextDeviceNode The input Text device path node.\r
2030\r
2031 @return A pointer to the newly-created USB Image device path structure.\r
2032\r
2033**/\r
95276127 2034EFI_DEVICE_PATH_PROTOCOL *\r
2035DevPathFromTextUsbImage (\r
2036 IN CHAR16 *TextDeviceNode\r
2037 )\r
2038{\r
2039 USB_CLASS_TEXT UsbClassText;\r
2040\r
2041 UsbClassText.ClassExist = FALSE;\r
2042 UsbClassText.Class = USB_CLASS_IMAGE;\r
2043 UsbClassText.SubClassExist = TRUE;\r
2044\r
2045 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2046}\r
2047\r
572f5d8a 2048/**\r
2049 Converts a text device path node to USB Print device path structure.\r
2050\r
2051 @param TextDeviceNode The input Text device path node.\r
2052\r
2053 @return A pointer to the newly-created USB Print device path structure.\r
2054\r
2055**/\r
95276127 2056EFI_DEVICE_PATH_PROTOCOL *\r
2057DevPathFromTextUsbPrinter (\r
2058 IN CHAR16 *TextDeviceNode\r
2059 )\r
2060{\r
2061 USB_CLASS_TEXT UsbClassText;\r
2062\r
2063 UsbClassText.ClassExist = FALSE;\r
2064 UsbClassText.Class = USB_CLASS_PRINTER;\r
2065 UsbClassText.SubClassExist = TRUE;\r
2066\r
2067 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2068}\r
2069\r
572f5d8a 2070/**\r
2071 Converts a text device path node to USB mass storage device path structure.\r
2072\r
2073 @param TextDeviceNode The input Text device path node.\r
2074\r
2075 @return A pointer to the newly-created USB mass storage device path structure.\r
2076\r
2077**/\r
95276127 2078EFI_DEVICE_PATH_PROTOCOL *\r
2079DevPathFromTextUsbMassStorage (\r
2080 IN CHAR16 *TextDeviceNode\r
2081 )\r
2082{\r
2083 USB_CLASS_TEXT UsbClassText;\r
2084\r
2085 UsbClassText.ClassExist = FALSE;\r
2086 UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
2087 UsbClassText.SubClassExist = TRUE;\r
2088\r
2089 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2090}\r
2091\r
572f5d8a 2092/**\r
2093 Converts a text device path node to USB HUB device path structure.\r
2094\r
2095 @param TextDeviceNode The input Text device path node.\r
2096\r
2097 @return A pointer to the newly-created USB HUB device path structure.\r
2098\r
2099**/\r
95276127 2100EFI_DEVICE_PATH_PROTOCOL *\r
2101DevPathFromTextUsbHub (\r
2102 IN CHAR16 *TextDeviceNode\r
2103 )\r
2104{\r
2105 USB_CLASS_TEXT UsbClassText;\r
2106\r
2107 UsbClassText.ClassExist = FALSE;\r
2108 UsbClassText.Class = USB_CLASS_HUB;\r
2109 UsbClassText.SubClassExist = TRUE;\r
2110\r
2111 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2112}\r
2113\r
572f5d8a 2114/**\r
2115 Converts a text device path node to USB CDC data device path structure.\r
2116\r
2117 @param TextDeviceNode The input Text device path node.\r
2118\r
2119 @return A pointer to the newly-created USB CDC data device path structure.\r
2120\r
2121**/\r
95276127 2122EFI_DEVICE_PATH_PROTOCOL *\r
2123DevPathFromTextUsbCDCData (\r
2124 IN CHAR16 *TextDeviceNode\r
2125 )\r
2126{\r
2127 USB_CLASS_TEXT UsbClassText;\r
2128\r
2129 UsbClassText.ClassExist = FALSE;\r
2130 UsbClassText.Class = USB_CLASS_CDCDATA;\r
2131 UsbClassText.SubClassExist = TRUE;\r
2132\r
2133 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2134}\r
2135\r
572f5d8a 2136/**\r
2137 Converts a text device path node to USB smart card device path structure.\r
2138\r
2139 @param TextDeviceNode The input Text device path node.\r
2140\r
2141 @return A pointer to the newly-created USB smart card device path structure.\r
2142\r
2143**/\r
95276127 2144EFI_DEVICE_PATH_PROTOCOL *\r
2145DevPathFromTextUsbSmartCard (\r
2146 IN CHAR16 *TextDeviceNode\r
2147 )\r
2148{\r
2149 USB_CLASS_TEXT UsbClassText;\r
2150\r
2151 UsbClassText.ClassExist = FALSE;\r
2152 UsbClassText.Class = USB_CLASS_SMART_CARD;\r
2153 UsbClassText.SubClassExist = TRUE;\r
2154\r
2155 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2156}\r
2157\r
572f5d8a 2158/**\r
2159 Converts a text device path node to USB video device path structure.\r
2160\r
2161 @param TextDeviceNode The input Text device path node.\r
2162\r
2163 @return A pointer to the newly-created USB video device path structure.\r
2164\r
2165**/\r
95276127 2166EFI_DEVICE_PATH_PROTOCOL *\r
2167DevPathFromTextUsbVideo (\r
2168 IN CHAR16 *TextDeviceNode\r
2169 )\r
2170{\r
2171 USB_CLASS_TEXT UsbClassText;\r
2172\r
2173 UsbClassText.ClassExist = FALSE;\r
2174 UsbClassText.Class = USB_CLASS_VIDEO;\r
2175 UsbClassText.SubClassExist = TRUE;\r
2176\r
2177 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2178}\r
2179\r
572f5d8a 2180/**\r
2181 Converts a text device path node to USB diagnostic device path structure.\r
2182\r
2183 @param TextDeviceNode The input Text device path node.\r
2184\r
2185 @return A pointer to the newly-created USB diagnostic device path structure.\r
2186\r
2187**/\r
95276127 2188EFI_DEVICE_PATH_PROTOCOL *\r
2189DevPathFromTextUsbDiagnostic (\r
2190 IN CHAR16 *TextDeviceNode\r
2191 )\r
2192{\r
2193 USB_CLASS_TEXT UsbClassText;\r
2194\r
2195 UsbClassText.ClassExist = FALSE;\r
2196 UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
2197 UsbClassText.SubClassExist = TRUE;\r
2198\r
2199 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2200}\r
2201\r
572f5d8a 2202/**\r
2203 Converts a text device path node to USB wireless device path structure.\r
2204\r
2205 @param TextDeviceNode The input Text device path node.\r
2206\r
2207 @return A pointer to the newly-created USB wireless device path structure.\r
2208\r
2209**/\r
95276127 2210EFI_DEVICE_PATH_PROTOCOL *\r
2211DevPathFromTextUsbWireless (\r
2212 IN CHAR16 *TextDeviceNode\r
2213 )\r
2214{\r
2215 USB_CLASS_TEXT UsbClassText;\r
2216\r
2217 UsbClassText.ClassExist = FALSE;\r
2218 UsbClassText.Class = USB_CLASS_WIRELESS;\r
2219 UsbClassText.SubClassExist = TRUE;\r
2220\r
2221 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2222}\r
2223\r
572f5d8a 2224/**\r
2225 Converts a text device path node to USB device firmware update device path structure.\r
2226\r
2227 @param TextDeviceNode The input Text device path node.\r
2228\r
2229 @return A pointer to the newly-created USB device firmware update device path structure.\r
2230\r
2231**/\r
95276127 2232EFI_DEVICE_PATH_PROTOCOL *\r
2233DevPathFromTextUsbDeviceFirmwareUpdate (\r
2234 IN CHAR16 *TextDeviceNode\r
2235 )\r
2236{\r
2237 USB_CLASS_TEXT UsbClassText;\r
2238\r
2239 UsbClassText.ClassExist = FALSE;\r
2240 UsbClassText.Class = USB_CLASS_RESERVE;\r
2241 UsbClassText.SubClassExist = FALSE;\r
2242 UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
2243\r
2244 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2245}\r
2246\r
572f5d8a 2247/**\r
2248 Converts a text device path node to USB IRDA bridge device path structure.\r
2249\r
2250 @param TextDeviceNode The input Text device path node.\r
2251\r
2252 @return A pointer to the newly-created USB IRDA bridge device path structure.\r
2253\r
2254**/\r
95276127 2255EFI_DEVICE_PATH_PROTOCOL *\r
2256DevPathFromTextUsbIrdaBridge (\r
2257 IN CHAR16 *TextDeviceNode\r
2258 )\r
2259{\r
2260 USB_CLASS_TEXT UsbClassText;\r
2261\r
2262 UsbClassText.ClassExist = FALSE;\r
2263 UsbClassText.Class = USB_CLASS_RESERVE;\r
2264 UsbClassText.SubClassExist = FALSE;\r
2265 UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
2266\r
2267 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2268}\r
2269\r
572f5d8a 2270/**\r
2271 Converts a text device path node to USB text and measurement device path structure.\r
2272\r
2273 @param TextDeviceNode The input Text device path node.\r
2274\r
2275 @return A pointer to the newly-created USB text and measurement device path structure.\r
2276\r
2277**/\r
95276127 2278EFI_DEVICE_PATH_PROTOCOL *\r
2279DevPathFromTextUsbTestAndMeasurement (\r
2280 IN CHAR16 *TextDeviceNode\r
2281 )\r
2282{\r
2283 USB_CLASS_TEXT UsbClassText;\r
2284\r
2285 UsbClassText.ClassExist = FALSE;\r
2286 UsbClassText.Class = USB_CLASS_RESERVE;\r
2287 UsbClassText.SubClassExist = FALSE;\r
2288 UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
2289\r
2290 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2291}\r
2292\r
572f5d8a 2293/**\r
2294 Converts a text device path node to USB WWID device path structure.\r
2295\r
2296 @param TextDeviceNode The input Text device path node.\r
2297\r
2298 @return A pointer to the newly-created USB WWID device path structure.\r
2299\r
2300**/\r
95276127 2301EFI_DEVICE_PATH_PROTOCOL *\r
2302DevPathFromTextUsbWwid (\r
2303 IN CHAR16 *TextDeviceNode\r
2304 )\r
2305{\r
2306 CHAR16 *VIDStr;\r
2307 CHAR16 *PIDStr;\r
2308 CHAR16 *InterfaceNumStr;\r
cf40f28a 2309 CHAR16 *SerialNumberStr;\r
95276127 2310 USB_WWID_DEVICE_PATH *UsbWwid;\r
2311\r
2312 VIDStr = GetNextParamStr (&TextDeviceNode);\r
2313 PIDStr = GetNextParamStr (&TextDeviceNode);\r
2314 InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 2315 SerialNumberStr = GetNextParamStr (&TextDeviceNode);\r
95276127 2316 UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
2317 MESSAGING_DEVICE_PATH,\r
2318 MSG_USB_WWID_DP,\r
cf40f28a 2319 (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + StrSize (SerialNumberStr))\r
95276127 2320 );\r
2321\r
cf40f28a 2322 UsbWwid->VendorId = (UINT16) Strtoi (VIDStr);\r
2323 UsbWwid->ProductId = (UINT16) Strtoi (PIDStr);\r
2324 UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
2325 StrCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr);\r
95276127 2326\r
2327 return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
2328}\r
2329\r
572f5d8a 2330/**\r
2331 Converts a text device path node to Logic Unit device path structure.\r
2332\r
2333 @param TextDeviceNode The input Text device path node.\r
2334\r
2335 @return A pointer to the newly-created Logic Unit device path structure.\r
2336\r
2337**/\r
95276127 2338EFI_DEVICE_PATH_PROTOCOL *\r
2339DevPathFromTextUnit (\r
2340 IN CHAR16 *TextDeviceNode\r
2341 )\r
2342{\r
2343 CHAR16 *LunStr;\r
2344 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
2345\r
2346 LunStr = GetNextParamStr (&TextDeviceNode);\r
2347 LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
2348 MESSAGING_DEVICE_PATH,\r
2349 MSG_DEVICE_LOGICAL_UNIT_DP,\r
cf40f28a 2350 (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
95276127 2351 );\r
2352\r
cf40f28a 2353 LogicalUnit->Lun = (UINT8) Strtoi (LunStr);\r
95276127 2354\r
2355 return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
2356}\r
2357\r
572f5d8a 2358/**\r
2359 Converts a text device path node to iSCSI device path structure.\r
2360\r
2361 @param TextDeviceNode The input Text device path node.\r
2362\r
2363 @return A pointer to the newly-created iSCSI device path structure.\r
2364\r
2365**/\r
95276127 2366EFI_DEVICE_PATH_PROTOCOL *\r
2367DevPathFromTextiSCSI (\r
2368 IN CHAR16 *TextDeviceNode\r
2369 )\r
2370{\r
2371 UINT16 Options;\r
2372 CHAR16 *NameStr;\r
2373 CHAR16 *PortalGroupStr;\r
2374 CHAR16 *LunStr;\r
2375 CHAR16 *HeaderDigestStr;\r
2376 CHAR16 *DataDigestStr;\r
2377 CHAR16 *AuthenticationStr;\r
2378 CHAR16 *ProtocolStr;\r
cf40f28a 2379 CHAR8 *AsciiStr;\r
572f5d8a 2380 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
95276127 2381\r
2382 NameStr = GetNextParamStr (&TextDeviceNode);\r
2383 PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
2384 LunStr = GetNextParamStr (&TextDeviceNode);\r
2385 HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
2386 DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
2387 AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
2388 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2389 ISCSIDevPath = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
95276127 2390 MESSAGING_DEVICE_PATH,\r
2391 MSG_ISCSI_DP,\r
047c6449 2392 (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
95276127 2393 );\r
2394\r
184f7d83 2395 AsciiStr = ISCSIDevPath->TargetName;\r
cf40f28a 2396 StrToAscii (NameStr, &AsciiStr);\r
2397\r
572f5d8a 2398 ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
2399 Strtoi64 (LunStr, &ISCSIDevPath->Lun);\r
95276127 2400\r
2401 Options = 0x0000;\r
2402 if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
2403 Options |= 0x0002;\r
2404 }\r
2405\r
2406 if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
2407 Options |= 0x0008;\r
2408 }\r
2409\r
2410 if (StrCmp (AuthenticationStr, L"None") == 0) {\r
2411 Options |= 0x0800;\r
2412 }\r
2413\r
2414 if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
2415 Options |= 0x1000;\r
2416 }\r
2417\r
572f5d8a 2418 ISCSIDevPath->LoginOption = (UINT16) Options;\r
95276127 2419\r
572f5d8a 2420 ISCSIDevPath->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
95276127 2421\r
572f5d8a 2422 return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
95276127 2423}\r
2424\r
8f97f911 2425/**\r
2426 Converts a text device path node to VLAN device path structure.\r
2427\r
2428 @param TextDeviceNode The input Text device path node.\r
2429\r
2430 @return A pointer to the newly-created VLAN device path structure.\r
2431\r
2432**/\r
2433EFI_DEVICE_PATH_PROTOCOL *\r
2434DevPathFromTextVlan (\r
2435 IN CHAR16 *TextDeviceNode\r
2436 )\r
2437{\r
2438 CHAR16 *VlanStr;\r
2439 VLAN_DEVICE_PATH *Vlan;\r
2440\r
2441 VlanStr = GetNextParamStr (&TextDeviceNode);\r
2442 Vlan = (VLAN_DEVICE_PATH *) CreateDeviceNode (\r
2443 MESSAGING_DEVICE_PATH,\r
2444 MSG_VLAN_DP,\r
c9325700 2445 (UINT16) sizeof (VLAN_DEVICE_PATH)\r
8f97f911 2446 );\r
2447\r
2448 Vlan->VlanId = (UINT16) Strtoi (VlanStr);\r
2449\r
2450 return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
2451}\r
2452\r
572f5d8a 2453/**\r
2454 Converts a text device path node to HD device path structure.\r
2455\r
2456 @param TextDeviceNode The input Text device path node.\r
2457\r
2458 @return A pointer to the newly-created HD device path structure.\r
2459\r
2460**/\r
95276127 2461EFI_DEVICE_PATH_PROTOCOL *\r
2462DevPathFromTextHD (\r
2463 IN CHAR16 *TextDeviceNode\r
2464 )\r
2465{\r
2466 CHAR16 *PartitionStr;\r
2467 CHAR16 *TypeStr;\r
2468 CHAR16 *SignatureStr;\r
2469 CHAR16 *StartStr;\r
2470 CHAR16 *SizeStr;\r
2471 UINT32 Signature32;\r
2472 EFI_GUID SignatureGuid;\r
2473 HARDDRIVE_DEVICE_PATH *Hd;\r
2474\r
2475 PartitionStr = GetNextParamStr (&TextDeviceNode);\r
2476 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2477 SignatureStr = GetNextParamStr (&TextDeviceNode);\r
2478 StartStr = GetNextParamStr (&TextDeviceNode);\r
2479 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2480 Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
2481 MEDIA_DEVICE_PATH,\r
2482 MEDIA_HARDDRIVE_DP,\r
c9325700 2483 (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
95276127 2484 );\r
2485\r
cf40f28a 2486 Hd->PartitionNumber = (UINT32) Dtoi (PartitionStr);\r
95276127 2487\r
2488 ZeroMem (Hd->Signature, 16);\r
2489 Hd->MBRType = (UINT8) 0;\r
2490\r
cf40f28a 2491 if (StrCmp (TypeStr, L"MBR") == 0) {\r
95276127 2492 Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
2493 Hd->MBRType = 0x01;\r
2494\r
cf40f28a 2495 Signature32 = (UINT32) Strtoi (SignatureStr);\r
95276127 2496 CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
cf40f28a 2497 } else if (StrCmp (TypeStr, L"GPT") == 0) {\r
95276127 2498 Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
2499 Hd->MBRType = 0x02;\r
2500\r
2501 StrToGuid (SignatureStr, &SignatureGuid);\r
2502 CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
2503 } else {\r
cf40f28a 2504 Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
95276127 2505 }\r
2506\r
cf40f28a 2507 Strtoi64 (StartStr, &Hd->PartitionStart);\r
2508 Strtoi64 (SizeStr, &Hd->PartitionSize);\r
95276127 2509\r
2510 return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
2511}\r
2512\r
572f5d8a 2513/**\r
2514 Converts a text device path node to CDROM device path structure.\r
2515\r
2516 @param TextDeviceNode The input Text device path node.\r
2517\r
2518 @return A pointer to the newly-created CDROM device path structure.\r
2519\r
2520**/\r
95276127 2521EFI_DEVICE_PATH_PROTOCOL *\r
2522DevPathFromTextCDROM (\r
2523 IN CHAR16 *TextDeviceNode\r
2524 )\r
2525{\r
2526 CHAR16 *EntryStr;\r
2527 CHAR16 *StartStr;\r
2528 CHAR16 *SizeStr;\r
572f5d8a 2529 CDROM_DEVICE_PATH *CDROMDevPath;\r
95276127 2530\r
2531 EntryStr = GetNextParamStr (&TextDeviceNode);\r
2532 StartStr = GetNextParamStr (&TextDeviceNode);\r
2533 SizeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2534 CDROMDevPath = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
95276127 2535 MEDIA_DEVICE_PATH,\r
2536 MEDIA_CDROM_DP,\r
c9325700 2537 (UINT16) sizeof (CDROM_DEVICE_PATH)\r
95276127 2538 );\r
2539\r
572f5d8a 2540 CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);\r
2541 Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);\r
2542 Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);\r
95276127 2543\r
572f5d8a 2544 return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;\r
95276127 2545}\r
2546\r
572f5d8a 2547/**\r
2548 Converts a text device path node to Vendor-defined media device path structure.\r
2549\r
2550 @param TextDeviceNode The input Text device path node.\r
2551\r
2552 @return A pointer to the newly-created Vendor-defined media device path structure.\r
2553\r
2554**/\r
95276127 2555EFI_DEVICE_PATH_PROTOCOL *\r
2556DevPathFromTextVenMEDIA (\r
2557 IN CHAR16 *TextDeviceNode\r
2558 )\r
2559{\r
2560 return ConvertFromTextVendor (\r
2561 TextDeviceNode,\r
2562 MEDIA_DEVICE_PATH,\r
2563 MEDIA_VENDOR_DP\r
2564 );\r
2565}\r
2566\r
572f5d8a 2567/**\r
2568 Converts a text device path node to File device path structure.\r
2569\r
2570 @param TextDeviceNode The input Text device path node.\r
2571\r
2572 @return A pointer to the newly-created File device path structure.\r
2573\r
2574**/\r
95276127 2575EFI_DEVICE_PATH_PROTOCOL *\r
2576DevPathFromTextFilePath (\r
2577 IN CHAR16 *TextDeviceNode\r
2578 )\r
2579{\r
2580 FILEPATH_DEVICE_PATH *File;\r
2581\r
2582 File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2583 MEDIA_DEVICE_PATH,\r
2584 MEDIA_FILEPATH_DP,\r
d074a8e1 2585 (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
95276127 2586 );\r
2587\r
2588 StrCpy (File->PathName, TextDeviceNode);\r
2589\r
2590 return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
2591}\r
2592\r
572f5d8a 2593/**\r
2594 Converts a text device path node to Media protocol device path structure.\r
2595\r
2596 @param TextDeviceNode The input Text device path node.\r
2597\r
2598 @return A pointer to the newly-created Media protocol device path structure.\r
2599\r
2600**/\r
95276127 2601EFI_DEVICE_PATH_PROTOCOL *\r
2602DevPathFromTextMedia (\r
2603 IN CHAR16 *TextDeviceNode\r
2604 )\r
2605{\r
2606 CHAR16 *GuidStr;\r
2607 MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
2608\r
2609 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2610 Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
2611 MEDIA_DEVICE_PATH,\r
2612 MEDIA_PROTOCOL_DP,\r
c9325700 2613 (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
95276127 2614 );\r
2615\r
2616 StrToGuid (GuidStr, &Media->Protocol);\r
2617\r
2618 return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
2619}\r
2620\r
572f5d8a 2621/**\r
2622 Converts a text device path node to firmware volume device path structure.\r
2623\r
2624 @param TextDeviceNode The input Text device path node.\r
2625\r
2626 @return A pointer to the newly-created firmware volume device path structure.\r
2627\r
2628**/\r
cf40f28a 2629EFI_DEVICE_PATH_PROTOCOL *\r
2630DevPathFromTextFv (\r
2631 IN CHAR16 *TextDeviceNode\r
2632 )\r
2633{\r
2634 CHAR16 *GuidStr;\r
2635 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
2636\r
2637 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2638 Fv = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
2639 MEDIA_DEVICE_PATH,\r
2640 MEDIA_PIWG_FW_VOL_DP,\r
c9325700 2641 (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
cf40f28a 2642 );\r
2643\r
2644 StrToGuid (GuidStr, &Fv->FvName);\r
2645\r
2646 return (EFI_DEVICE_PATH_PROTOCOL *) Fv;\r
2647}\r
2648\r
572f5d8a 2649/**\r
2650 Converts a text device path node to firmware file device path structure.\r
2651\r
2652 @param TextDeviceNode The input Text device path node.\r
2653\r
2654 @return A pointer to the newly-created firmware file device path structure.\r
2655\r
2656**/\r
cf40f28a 2657EFI_DEVICE_PATH_PROTOCOL *\r
2658DevPathFromTextFvFile (\r
2659 IN CHAR16 *TextDeviceNode\r
2660 )\r
2661{\r
2662 CHAR16 *GuidStr;\r
2663 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
2664\r
2665 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2666 FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2667 MEDIA_DEVICE_PATH,\r
2668 MEDIA_PIWG_FW_FILE_DP,\r
c9325700 2669 (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
cf40f28a 2670 );\r
2671\r
2672 StrToGuid (GuidStr, &FvFile->FvFileName);\r
2673\r
2674 return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;\r
2675}\r
2676\r
192b057b 2677/**\r
2678 Converts a text device path node to text relative offset device path structure.\r
2679\r
2680 @param TextDeviceNode The input Text device path node.\r
2681\r
2682 @return A pointer to the newly-created Text device path structure.\r
2683\r
2684**/\r
2685EFI_DEVICE_PATH_PROTOCOL *\r
2686DevPathFromTextRelativeOffsetRange (\r
2687 IN CHAR16 *TextDeviceNode\r
2688 )\r
2689{\r
395ed063 2690 CHAR16 *StartingOffsetStr;\r
2691 CHAR16 *EndingOffsetStr;\r
2692 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
192b057b 2693\r
2694 StartingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
2695 EndingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
395ed063 2696 Offset = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (\r
2697 MEDIA_DEVICE_PATH,\r
2698 MEDIA_RELATIVE_OFFSET_RANGE_DP,\r
c9325700 2699 (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
395ed063 2700 );\r
2701\r
792a1534 2702 Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);\r
2703 Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);\r
192b057b 2704\r
2705 return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
2706}\r
2707\r
572f5d8a 2708/**\r
2709 Converts a text device path node to BIOS Boot Specification device path structure.\r
2710\r
2711 @param TextDeviceNode The input Text device path node.\r
2712\r
5755841f 2713 @return A pointer to the newly-created BIOS Boot Specification device path structure.\r
572f5d8a 2714\r
2715**/\r
95276127 2716EFI_DEVICE_PATH_PROTOCOL *\r
2717DevPathFromTextBBS (\r
2718 IN CHAR16 *TextDeviceNode\r
2719 )\r
2720{\r
2721 CHAR16 *TypeStr;\r
2722 CHAR16 *IdStr;\r
2723 CHAR16 *FlagsStr;\r
cf40f28a 2724 CHAR8 *AsciiStr;\r
95276127 2725 BBS_BBS_DEVICE_PATH *Bbs;\r
2726\r
2727 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2728 IdStr = GetNextParamStr (&TextDeviceNode);\r
2729 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
2730 Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
2731 BBS_DEVICE_PATH,\r
2732 BBS_BBS_DP,\r
d074a8e1 2733 (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))\r
95276127 2734 );\r
2735\r
2736 if (StrCmp (TypeStr, L"Floppy") == 0) {\r
2737 Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
2738 } else if (StrCmp (TypeStr, L"HD") == 0) {\r
2739 Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
2740 } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
2741 Bbs->DeviceType = BBS_TYPE_CDROM;\r
2742 } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
2743 Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
2744 } else if (StrCmp (TypeStr, L"USB") == 0) {\r
2745 Bbs->DeviceType = BBS_TYPE_USB;\r
2746 } else if (StrCmp (TypeStr, L"Network") == 0) {\r
2747 Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
2748 } else {\r
cf40f28a 2749 Bbs->DeviceType = (UINT16) Strtoi (TypeStr);\r
95276127 2750 }\r
2751\r
cf40f28a 2752 AsciiStr = Bbs->String;\r
2753 StrToAscii (IdStr, &AsciiStr);\r
95276127 2754\r
cf40f28a 2755 Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);\r
95276127 2756\r
2757 return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
2758}\r
2759\r
572f5d8a 2760/**\r
2761 Converts a text device path node to SATA device path structure.\r
2762\r
2763 @param TextDeviceNode The input Text device path node.\r
2764\r
2765 @return A pointer to the newly-created SATA device path structure.\r
2766\r
2767**/\r
cf40f28a 2768EFI_DEVICE_PATH_PROTOCOL *\r
2769DevPathFromTextSata (\r
2770 IN CHAR16 *TextDeviceNode\r
2771 )\r
2772{\r
2773 SATA_DEVICE_PATH *Sata;\r
2774 CHAR16 *Param1;\r
2775 CHAR16 *Param2;\r
2776 CHAR16 *Param3;\r
2777\r
2778 //\r
2779 // The PMPN is optional.\r
2780 //\r
2781 Param1 = GetNextParamStr (&TextDeviceNode);\r
2782 Param2 = GetNextParamStr (&TextDeviceNode);\r
2783 Param3 = NULL;\r
2784 if (!IS_NULL (TextDeviceNode)) {\r
2785 Param3 = GetNextParamStr (&TextDeviceNode);\r
2786 }\r
2787\r
2788 Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
2789 MESSAGING_DEVICE_PATH,\r
2790 MSG_SATA_DP,\r
c9325700 2791 (UINT16) sizeof (SATA_DEVICE_PATH)\r
cf40f28a 2792 );\r
93e3992d 2793 Sata->HBAPortNumber = (UINT16) Xtoi (Param1);\r
cf40f28a 2794 if (Param3 != NULL) {\r
93e3992d 2795 Sata->PortMultiplierPortNumber = (UINT16) Xtoi (Param2);\r
cf40f28a 2796 Param2 = Param3;\r
2797 } else {\r
186ca8b0 2798 Sata->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;\r
cf40f28a 2799 }\r
93e3992d 2800 Sata->Lun = (UINT16) Xtoi (Param2);\r
cf40f28a 2801\r
2802 return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r
2803}\r
2804\r
95276127 2805GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
2806 {L"Pci", DevPathFromTextPci},\r
2807 {L"PcCard", DevPathFromTextPcCard},\r
2808 {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
2809 {L"VenHw", DevPathFromTextVenHw},\r
2810 {L"Ctrl", DevPathFromTextCtrl},\r
2811 {L"Acpi", DevPathFromTextAcpi},\r
2812 {L"PciRoot", DevPathFromTextPciRoot},\r
2813 {L"Floppy", DevPathFromTextFloppy},\r
2814 {L"Keyboard", DevPathFromTextKeyboard},\r
2815 {L"Serial", DevPathFromTextSerial},\r
2816 {L"ParallelPort", DevPathFromTextParallelPort},\r
2817 {L"AcpiEx", DevPathFromTextAcpiEx},\r
2818 {L"AcpiExp", DevPathFromTextAcpiExp},\r
5b84091f 2819 {L"AcpiAdr", DevPathFromTextAcpiAdr},\r
95276127 2820 {L"Ata", DevPathFromTextAta},\r
2821 {L"Scsi", DevPathFromTextScsi},\r
2822 {L"Fibre", DevPathFromTextFibre},\r
2823 {L"I1394", DevPathFromText1394},\r
2824 {L"USB", DevPathFromTextUsb},\r
2825 {L"I2O", DevPathFromTextI2O},\r
2826 {L"Infiniband", DevPathFromTextInfiniband},\r
2827 {L"VenMsg", DevPathFromTextVenMsg},\r
2828 {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
2829 {L"VenVt100", DevPathFromTextVenVt100},\r
2830 {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
2831 {L"VenUtf8", DevPathFromTextVenUtf8},\r
2832 {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
2833 {L"SAS", DevPathFromTextSAS},\r
2834 {L"DebugPort", DevPathFromTextDebugPort},\r
2835 {L"MAC", DevPathFromTextMAC},\r
2836 {L"IPv4", DevPathFromTextIPv4},\r
2837 {L"IPv6", DevPathFromTextIPv6},\r
2838 {L"Uart", DevPathFromTextUart},\r
2839 {L"UsbClass", DevPathFromTextUsbClass},\r
2840 {L"UsbAudio", DevPathFromTextUsbAudio},\r
2841 {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
2842 {L"UsbHID", DevPathFromTextUsbHID},\r
2843 {L"UsbImage", DevPathFromTextUsbImage},\r
2844 {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
2845 {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
2846 {L"UsbHub", DevPathFromTextUsbHub},\r
2847 {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
2848 {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
2849 {L"UsbVideo", DevPathFromTextUsbVideo},\r
2850 {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
2851 {L"UsbWireless", DevPathFromTextUsbWireless},\r
2852 {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
2853 {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
2854 {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
2855 {L"UsbWwid", DevPathFromTextUsbWwid},\r
2856 {L"Unit", DevPathFromTextUnit},\r
2857 {L"iSCSI", DevPathFromTextiSCSI},\r
8f97f911 2858 {L"Vlan", DevPathFromTextVlan},\r
95276127 2859 {L"HD", DevPathFromTextHD},\r
2860 {L"CDROM", DevPathFromTextCDROM},\r
2861 {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
2862 {L"Media", DevPathFromTextMedia},\r
cf40f28a 2863 {L"Fv", DevPathFromTextFv},\r
2864 {L"FvFile", DevPathFromTextFvFile},\r
192b057b 2865 {L"Offset", DevPathFromTextRelativeOffsetRange},\r
95276127 2866 {L"BBS", DevPathFromTextBBS},\r
cf40f28a 2867 {L"Sata", DevPathFromTextSata},\r
95276127 2868 {NULL, NULL}\r
2869};\r
2870\r
572f5d8a 2871/**\r
2872 Convert text to the binary representation of a device node.\r
95276127 2873\r
572f5d8a 2874 @param TextDeviceNode TextDeviceNode points to the text representation of a device\r
95276127 2875 node. Conversion starts with the first character and continues\r
2876 until the first non-device node character.\r
2877\r
572f5d8a 2878 @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was\r
2879 insufficient memory or text unsupported.\r
95276127 2880\r
572f5d8a 2881**/\r
2882EFI_DEVICE_PATH_PROTOCOL *\r
2883EFIAPI\r
2884ConvertTextToDeviceNode (\r
2885 IN CONST CHAR16 *TextDeviceNode\r
2886 )\r
95276127 2887{\r
572f5d8a 2888 DUMP_NODE DumpNode;\r
95276127 2889 CHAR16 *ParamStr;\r
2890 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2891 CHAR16 *DeviceNodeStr;\r
2892 UINTN Index;\r
2893\r
2894 if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
2895 return NULL;\r
2896 }\r
2897\r
2898 ParamStr = NULL;\r
2899 DumpNode = NULL;\r
2900 DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
3069bc19 2901 ASSERT (DeviceNodeStr != NULL);\r
95276127 2902\r
7ae9c1ce 2903 for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
95276127 2904 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2905 if (ParamStr != NULL) {\r
2906 DumpNode = DevPathFromTextTable[Index].Function;\r
2907 break;\r
2908 }\r
2909 }\r
2910\r
2911 if (DumpNode == NULL) {\r
2912 //\r
2913 // A file path\r
2914 //\r
2915 DumpNode = DevPathFromTextFilePath;\r
2916 DeviceNode = DumpNode (DeviceNodeStr);\r
2917 } else {\r
2918 DeviceNode = DumpNode (ParamStr);\r
2919 FreePool (ParamStr);\r
2920 }\r
2921\r
2922 FreePool (DeviceNodeStr);\r
2923\r
2924 return DeviceNode;\r
2925}\r
2926\r
572f5d8a 2927/**\r
2928 Convert text to the binary representation of a device path.\r
95276127 2929\r
95276127 2930\r
572f5d8a 2931 @param TextDevicePath TextDevicePath points to the text representation of a device\r
95276127 2932 path. Conversion starts with the first character and continues\r
2933 until the first non-device node character.\r
2934\r
572f5d8a 2935 @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or\r
2936 there was insufficient memory.\r
95276127 2937\r
572f5d8a 2938**/\r
2939EFI_DEVICE_PATH_PROTOCOL *\r
2940EFIAPI\r
2941ConvertTextToDevicePath (\r
2942 IN CONST CHAR16 *TextDevicePath\r
2943 )\r
95276127 2944{\r
572f5d8a 2945 DUMP_NODE DumpNode;\r
95276127 2946 CHAR16 *ParamStr;\r
2947 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2948 UINTN Index;\r
2949 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
2950 CHAR16 *DevicePathStr;\r
2951 CHAR16 *Str;\r
2952 CHAR16 *DeviceNodeStr;\r
2953 UINT8 IsInstanceEnd;\r
2954 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
2955\r
2956 if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
2957 return NULL;\r
2958 }\r
2959\r
2960 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 2961 ASSERT (DevicePath != NULL);\r
95276127 2962 SetDevicePathEndNode (DevicePath);\r
2963\r
2964 ParamStr = NULL;\r
2965 DeviceNodeStr = NULL;\r
2966 DevicePathStr = StrDuplicate (TextDevicePath);\r
2967\r
2968 Str = DevicePathStr;\r
2969 while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
2970 DumpNode = NULL;\r
7ae9c1ce 2971 for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
95276127 2972 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2973 if (ParamStr != NULL) {\r
2974 DumpNode = DevPathFromTextTable[Index].Function;\r
2975 break;\r
2976 }\r
2977 }\r
2978\r
2979 if (DumpNode == NULL) {\r
2980 //\r
2981 // A file path\r
2982 //\r
2983 DumpNode = DevPathFromTextFilePath;\r
2984 DeviceNode = DumpNode (DeviceNodeStr);\r
2985 } else {\r
2986 DeviceNode = DumpNode (ParamStr);\r
2987 FreePool (ParamStr);\r
2988 }\r
2989\r
2990 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2991 FreePool (DevicePath);\r
2992 FreePool (DeviceNode);\r
2993 DevicePath = NewDevicePath;\r
2994\r
572f5d8a 2995 if (IsInstanceEnd != 0) {\r
95276127 2996 DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 2997 ASSERT (DeviceNode != NULL);\r
572f5d8a 2998 SET_DEVICE_PATH_INSTANCE_END_NODE (DeviceNode);\r
95276127 2999\r
3000 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
3001 FreePool (DevicePath);\r
3002 FreePool (DeviceNode);\r
3003 DevicePath = NewDevicePath;\r
3004 }\r
3005 }\r
3006\r
3007 FreePool (DevicePathStr);\r
3008 return DevicePath;\r
3009}\r