]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/DevicePath/Dxe/DevicePathFromText.c
1.Fix a typo in DevicePath Driver
[mirror_edk2.git] / EdkModulePkg / Universal / DevicePath / Dxe / DevicePathFromText.c
CommitLineData
511710d6 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 DevicePathFromText.c\r
15\r
16Abstract:\r
17\r
18 DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
19\r
20--*/\r
21\r
22#include "DevicePath.h"\r
23\r
24CHAR16 *\r
25StrDuplicate (\r
26 IN CONST CHAR16 *Src\r
27 )\r
28/*++\r
29\r
30 Routine Description:\r
31 Duplicate a string\r
32\r
33 Arguments:\r
34 Src - Source string\r
35\r
36 Returns:\r
37 Duplicated string\r
38\r
39--*/\r
40{\r
41 UINTN Length;\r
42 CHAR16 *ReturnStr;\r
43\r
44 Length = StrLen ((CHAR16 *) Src);\r
45\r
46 ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);\r
47\r
48 return ReturnStr;\r
49}\r
50\r
51CHAR16 *\r
52GetParamByNodeName (\r
53 IN CHAR16 *Str,\r
54 IN CHAR16 *NodeName\r
55 )\r
56/*++\r
57\r
58 Routine Description:\r
59 Get parameter in a pair of parentheses follow the given node name.\r
60 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
61\r
62 Arguments:\r
63 Str - Device Path Text\r
64 NodeName - Name of the node\r
65\r
66 Returns:\r
67 Parameter text for the node\r
68\r
69--*/\r
70{\r
71 CHAR16 *ParamStr;\r
72 CHAR16 *StrPointer;\r
73 UINTN NodeNameLength;\r
74 UINTN ParameterLength;\r
75\r
76 //\r
77 // Check whether the node name matchs\r
78 //\r
79 NodeNameLength = StrLen (NodeName);\r
80 if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {\r
81 return NULL;\r
82 }\r
83\r
84 ParamStr = Str + NodeNameLength;\r
85 if (!IS_LEFT_PARENTH (*ParamStr)) {\r
86 return NULL;\r
87 }\r
88\r
89 //\r
90 // Skip the found '(' and find first occurrence of ')'\r
91 //\r
92 ParamStr++;\r
93 ParameterLength = 0;\r
94 StrPointer = ParamStr;\r
95 while (!IS_NULL (*StrPointer)) {\r
96 if (IS_RIGHT_PARENTH (*StrPointer)) {\r
97 break;\r
98 }\r
99 StrPointer++;\r
100 ParameterLength++;\r
101 }\r
102 if (IS_NULL (*StrPointer)) {\r
103 //\r
104 // ')' not found\r
105 //\r
106 return NULL;\r
107 }\r
108\r
109 ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);\r
110 if (ParamStr == NULL) {\r
111 return NULL;\r
112 }\r
113 //\r
114 // Terminate the parameter string\r
115 //\r
116 ParamStr[ParameterLength] = L'\0';\r
117\r
118 return ParamStr;\r
119}\r
120\r
121CHAR16 *\r
122SplitStr (\r
123 IN OUT CHAR16 **List,\r
124 IN CHAR16 Separator\r
125 )\r
126/*++\r
127\r
128 Routine Description:\r
129 Get current sub-string from a string list, before return\r
130 the list header is moved to next sub-string. The sub-string is separated\r
131 by the specified character. For example, the separator is ',', the string\r
132 list is "2,0,3", it returns "2", the remain list move to "2,3"\r
133\r
134 Arguments:\r
135 List - A string list separated by the specified separator\r
136 Separator - The separator character\r
137\r
138 Returns:\r
139 pointer - The current sub-string\r
140\r
141--*/\r
142{\r
143 CHAR16 *Str;\r
144 CHAR16 *ReturnStr;\r
145\r
146 Str = *List;\r
147 ReturnStr = Str;\r
148\r
149 if (IS_NULL (*Str)) {\r
150 return ReturnStr;\r
151 }\r
152\r
153 //\r
154 // Find first occurrence of the separator\r
155 //\r
156 while (!IS_NULL (*Str)) {\r
157 if (*Str == Separator) {\r
158 break;\r
159 }\r
160 Str++;\r
161 }\r
162\r
163 if (*Str == Separator) {\r
164 //\r
165 // Find a sub-string, terminate it\r
166 //\r
167 *Str = L'\0';\r
168 Str++;\r
169 }\r
170\r
171 //\r
172 // Move to next sub-string\r
173 //\r
174 *List = Str;\r
175\r
176 return ReturnStr;\r
177}\r
178\r
179CHAR16 *\r
180GetNextParamStr (\r
181 IN OUT CHAR16 **List\r
182 )\r
183{\r
184 //\r
185 // The separator is comma\r
186 //\r
187 return SplitStr (List, L',');\r
188}\r
189\r
190CHAR16 *\r
191GetNextDeviceNodeStr (\r
192 IN OUT CHAR16 **DevicePath,\r
193 OUT BOOLEAN *IsInstanceEnd\r
194 )\r
195/*++\r
196\r
197 Routine Description:\r
198 Get one device node from entire device path text.\r
199\r
200 Arguments:\r
201 Str - The entire device path text string\r
202 IsInstanceEnd - This node is the end of a device path instance\r
203\r
204 Returns:\r
205 a pointer - A device node text\r
206 NULL - No more device node available\r
207\r
208--*/\r
209{\r
210 CHAR16 *Str;\r
211 CHAR16 *ReturnStr;\r
212 UINTN ParenthesesStack;\r
213\r
214 Str = *DevicePath;\r
215 if (IS_NULL (*Str)) {\r
216 return NULL;\r
217 }\r
218\r
219 //\r
220 // Skip the leading '/', '(', ')' and ','\r
221 //\r
222 while (!IS_NULL (*Str)) {\r
223 if (!IS_SLASH (*Str) &&\r
224 !IS_COMMA (*Str) &&\r
225 !IS_LEFT_PARENTH (*Str) &&\r
226 !IS_RIGHT_PARENTH (*Str)) {\r
227 break;\r
228 }\r
229 Str++;\r
230 }\r
231\r
232 ReturnStr = Str;\r
233\r
234 //\r
235 // Scan for the separator of this device node, '/' or ','\r
236 //\r
237 ParenthesesStack = 0;\r
238 while (!IS_NULL (*Str)) {\r
239 if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {\r
240 break;\r
241 }\r
242\r
243 if (IS_LEFT_PARENTH (*Str)) {\r
244 ParenthesesStack++;\r
245 } else if (IS_RIGHT_PARENTH (*Str)) {\r
246 ParenthesesStack--;\r
247 }\r
248\r
249 Str++;\r
250 }\r
251\r
252 if (ParenthesesStack != 0) {\r
253 //\r
254 // The '(' doesn't pair with ')', invalid device path text\r
255 //\r
256 return NULL;\r
257 }\r
258\r
259 if (IS_COMMA (*Str)) {\r
260 *IsInstanceEnd = TRUE;\r
261 *Str = L'\0';\r
262 Str++;\r
263 } else {\r
264 *IsInstanceEnd = FALSE;\r
265 if (!IS_NULL (*Str)) {\r
266 *Str = L'\0';\r
267 Str++;\r
268 }\r
269 }\r
270\r
271 *DevicePath = Str;\r
272\r
273 return ReturnStr;\r
274}\r
275\r
276BOOLEAN\r
277IsHexDigit (\r
278 OUT UINT8 *Digit,\r
279 IN CHAR16 Char\r
280 )\r
281/*++\r
282\r
283 Routine Description:\r
284 Determines if a Unicode character is a hexadecimal digit.\r
285 The test is case insensitive.\r
286\r
287 Arguments:\r
288 Digit - Pointer to byte that receives the value of the hex character.\r
289 Char - Unicode character to test.\r
290\r
291 Returns:\r
292 TRUE - If the character is a hexadecimal digit.\r
293 FALSE - Otherwise.\r
294\r
295--*/\r
296{\r
297 if ((Char >= L'0') && (Char <= L'9')) {\r
298 *Digit = (UINT8) (Char - L'0');\r
299 return TRUE;\r
300 }\r
301\r
302 if ((Char >= L'A') && (Char <= L'F')) {\r
303 *Digit = (UINT8) (Char - L'A' + 0x0A);\r
304 return TRUE;\r
305 }\r
306\r
307 if ((Char >= L'a') && (Char <= L'f')) {\r
308 *Digit = (UINT8) (Char - L'a' + 0x0A);\r
309 return TRUE;\r
310 }\r
311\r
312 return FALSE;\r
313}\r
314\r
315CHAR16\r
316NibbleToHexChar (\r
317 IN UINT8 Nibble\r
318 )\r
319/*++\r
320\r
321 Routine Description:\r
322 Converts the low nibble of a byte to hex unicode character.\r
323\r
324 Arguments:\r
325 Nibble - lower nibble of a byte.\r
326\r
327 Returns:\r
328 Hex unicode character.\r
329\r
330--*/\r
331{\r
332 Nibble &= 0x0F;\r
333 if (Nibble <= 0x9) {\r
334 return (CHAR16)(Nibble + L'0');\r
335 }\r
336\r
337 return (CHAR16)(Nibble - 0xA + L'A');\r
338}\r
339\r
340EFI_STATUS\r
341HexStringToBuf (\r
342 IN OUT UINT8 *Buf, \r
343 IN OUT UINTN *Len,\r
344 IN CHAR16 *Str,\r
345 OUT UINTN *ConvertedStrLen OPTIONAL\r
346 )\r
347/*++\r
348\r
349 Routine Description:\r
350 Converts Unicode string to binary buffer.\r
351 The conversion may be partial.\r
352 The first character in the string that is not hex digit stops the conversion.\r
353 At a minimum, any blob of data could be represented as a hex string.\r
354\r
355 Arguments:\r
356 Buf - Pointer to buffer that receives the data.\r
357 Len - Length in bytes of the buffer to hold converted data.\r
358 If routine return with EFI_SUCCESS, containing length of converted data.\r
359 If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
360 Str - String to be converted from.\r
361 ConvertedStrLen - Length of the Hex String consumed.\r
362\r
363 Returns:\r
364 EFI_SUCCESS: Routine Success.\r
365 EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.\r
366 EFI_\r
367\r
368--*/\r
369{\r
370 UINTN HexCnt;\r
371 UINTN Idx;\r
372 UINTN BufferLength;\r
373 UINT8 Digit;\r
374 UINT8 Byte;\r
375\r
376 //\r
377 // Find out how many hex characters the string has.\r
378 //\r
379 for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);\r
380\r
381 if (HexCnt == 0) {\r
382 *Len = 0;\r
383 return EFI_SUCCESS;\r
384 }\r
385 //\r
386 // Two Unicode characters make up 1 buffer byte. Round up.\r
387 //\r
388 BufferLength = (HexCnt + 1) / 2; \r
389\r
390 //\r
391 // Test if buffer is passed enough.\r
392 //\r
393 if (BufferLength > (*Len)) {\r
394 *Len = BufferLength;\r
395 return EFI_BUFFER_TOO_SMALL;\r
396 }\r
397\r
398 *Len = BufferLength;\r
399\r
400 for (Idx = 0; Idx < HexCnt; Idx++) {\r
401\r
402 IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);\r
403\r
404 //\r
405 // For odd charaters, write the lower nibble for each buffer byte,\r
406 // and for even characters, the upper nibble.\r
407 //\r
408 if ((Idx & 1) == 0) {\r
409 Byte = Digit;\r
410 } else {\r
411 Byte = Buf[Idx / 2];\r
412 Byte &= 0x0F;\r
413 Byte |= Digit << 4;\r
414 }\r
415\r
416 Buf[Idx / 2] = Byte;\r
417 }\r
418\r
419 if (ConvertedStrLen != NULL) {\r
420 *ConvertedStrLen = HexCnt;\r
421 }\r
422\r
423 return EFI_SUCCESS;\r
424}\r
425\r
426EFI_STATUS\r
427BufToHexString (\r
428 IN OUT CHAR16 *Str,\r
429 IN OUT UINTN *HexStringBufferLength,\r
430 IN UINT8 *Buf,\r
431 IN UINTN Len\r
432 )\r
433/*++\r
434\r
435 Routine Description:\r
436 Converts binary buffer to Unicode string.\r
437 At a minimum, any blob of data could be represented as a hex string.\r
438\r
439 Arguments:\r
440 Str - Pointer to the string.\r
441 HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.\r
442 If routine return with EFI_SUCCESS, containing length of hex string buffer.\r
443 If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.\r
444 Buf - Buffer to be converted from.\r
445 Len - Length in bytes of the buffer to be converted.\r
446\r
447 Returns:\r
448 EFI_SUCCESS: Routine success.\r
449 EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.\r
450\r
451--*/\r
452{\r
453 UINTN Idx;\r
454 UINT8 Byte;\r
455 UINTN StrLen;\r
456\r
457 //\r
458 // Make sure string is either passed or allocate enough.\r
459 // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
460 // Plus the Unicode termination character.\r
461 //\r
462 StrLen = Len * 2;\r
463 if (StrLen > ((*HexStringBufferLength) - 1)) {\r
464 *HexStringBufferLength = StrLen + 1;\r
465 return EFI_BUFFER_TOO_SMALL;\r
466 }\r
467\r
468 *HexStringBufferLength = StrLen + 1;\r
469 //\r
470 // Ends the string.\r
471 //\r
472 Str[StrLen] = L'\0'; \r
473\r
474 for (Idx = 0; Idx < Len; Idx++) {\r
475\r
476 Byte = Buf[Idx];\r
477 Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);\r
478 Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));\r
479 }\r
480\r
481 return EFI_SUCCESS;\r
482}\r
483\r
484CHAR16 *\r
485TrimHexStr (\r
486 IN CHAR16 *Str\r
487 )\r
488/*++\r
489\r
490 Routine Description:\r
491 Skip the leading white space and '0x' or '0X' of a hex string\r
492\r
493 Arguments:\r
494 Str - The hex string\r
495\r
496 Returns:\r
497\r
498--*/\r
499{\r
500 //\r
501 // skip preceeding white space\r
502 //\r
503 while (*Str && *Str == ' ') {\r
504 Str += 1;\r
505 }\r
506 //\r
507 // skip preceeding zeros\r
508 //\r
509 while (*Str && *Str == '0') {\r
510 Str += 1;\r
511 }\r
512 //\r
57257e16 513 // skip preceeding character 'x' or 'X'\r
511710d6 514 //\r
515 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
516 Str += 1;\r
517 }\r
518\r
519 return Str;\r
520}\r
521\r
522UINTN\r
523Xtoi (\r
524 IN CHAR16 *Str\r
525 )\r
526/*++\r
527\r
528Routine Description:\r
529\r
530 Convert hex string to uint\r
531\r
532Arguments:\r
533\r
534 Str - The string\r
535 \r
536Returns:\r
537\r
538--*/\r
539{\r
540 UINTN Rvalue;\r
541 UINTN Length;\r
542\r
543 ASSERT (Str != NULL);\r
544\r
545 //\r
546 // convert hex digits\r
547 //\r
548 Rvalue = 0;\r
549 Length = sizeof (UINTN);\r
550 HexStringToBuf ((UINT8 *) &Rvalue, &Length, TrimHexStr (Str), NULL);\r
551\r
552 return Rvalue;\r
553}\r
554\r
555VOID\r
556Xtoi64 (\r
557 IN CHAR16 *Str,\r
558 IN UINT64 *Data\r
559 )\r
560/*++\r
561\r
562Routine Description:\r
563\r
564 Convert hex string to 64 bit data.\r
565\r
566Arguments:\r
567\r
568 Str - The string\r
569 \r
570Returns:\r
571\r
572--*/\r
573{\r
574 UINTN Length;\r
575\r
576 *Data = 0;\r
577 Length = sizeof (UINT64);\r
578 HexStringToBuf ((UINT8 *) Data, &Length, TrimHexStr (Str), NULL);\r
579}\r
580\r
581UINTN\r
582Atoi (\r
583 IN CHAR16 *str\r
584 )\r
585/*++\r
586\r
587Routine Description:\r
588\r
589 Convert decimal string to uint\r
590\r
591Arguments:\r
592\r
593 Str - The string\r
594 \r
595Returns:\r
596\r
597--*/\r
598{\r
599 UINTN Rvalue;\r
600 CHAR16 Char;\r
601 UINTN High;\r
602 UINTN Low;\r
603\r
604 ASSERT (str != NULL);\r
605\r
606 High = (UINTN) -1 / 10;\r
607 Low = (UINTN) -1 % 10;\r
608 //\r
609 // skip preceeding white space\r
610 //\r
611 while (*str && *str == ' ') {\r
612 str += 1;\r
613 }\r
614 //\r
615 // convert digits\r
616 //\r
617 Rvalue = 0;\r
618 Char = *(str++);\r
619 while (Char) {\r
620 if (Char >= '0' && Char <= '9') {\r
621 if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
622 return (UINTN) -1;\r
623 }\r
624\r
625 Rvalue = (Rvalue * 10) + Char - '0';\r
626 } else {\r
627 break;\r
628 }\r
629\r
630 Char = *(str++);\r
631 }\r
632\r
633 return Rvalue;\r
634}\r
635\r
636EFI_STATUS \r
637StrToBuf (\r
638 OUT UINT8 *Buf,\r
639 IN UINTN BufferLength,\r
640 IN CHAR16 *Str\r
641 )\r
642{\r
643 UINTN Index;\r
644 UINTN StrLength;\r
645 UINT8 Digit;\r
646 UINT8 Byte;\r
647\r
648 //\r
649 // Two hex char make up one byte\r
650 //\r
651 StrLength = BufferLength * sizeof (CHAR16);\r
652\r
653 for(Index = 0; Index < StrLength; Index++, Str++) {\r
654\r
655 IsHexDigit (&Digit, *Str);\r
656\r
657 //\r
658 // For odd charaters, write the upper nibble for each buffer byte,\r
659 // and for even characters, the lower nibble.\r
660 //\r
661 if ((Index & 1) == 0) {\r
662 Byte = Digit << 4;\r
663 } else {\r
664 Byte = Buf[Index / 2];\r
665 Byte &= 0xF0;\r
666 Byte |= Digit;\r
667 }\r
668\r
669 Buf[Index / 2] = Byte;\r
670 }\r
671\r
672 return EFI_SUCCESS;\r
673}\r
674\r
675EFI_STATUS\r
676StrToGuid (\r
677 IN CHAR16 *Str,\r
678 OUT EFI_GUID *Guid\r
679 )\r
680{\r
681 UINTN BufferLength;\r
682 UINTN ConvertedStrLen;\r
683 EFI_STATUS Status;\r
684\r
685 BufferLength = sizeof (Guid->Data1);\r
686 Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);\r
687 if (EFI_ERROR (Status)) {\r
688 return Status;\r
689 }\r
690 Str += ConvertedStrLen;\r
691 if (IS_HYPHEN (*Str)) {\r
692 Str++; \r
693 } else {\r
694 return EFI_UNSUPPORTED;\r
695 }\r
696\r
697 BufferLength = sizeof (Guid->Data2);\r
698 Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);\r
699 if (EFI_ERROR (Status)) {\r
700 return Status;\r
701 }\r
702 Str += ConvertedStrLen;\r
703 if (IS_HYPHEN (*Str)) {\r
704 Str++;\r
705 } else {\r
706 return EFI_UNSUPPORTED;\r
707 }\r
708\r
709 BufferLength = sizeof (Guid->Data3);\r
710 Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);\r
711 if (EFI_ERROR (Status)) {\r
712 return Status;\r
713 }\r
714 Str += ConvertedStrLen;\r
715 if (IS_HYPHEN (*Str)) {\r
716 Str++;\r
717 } else {\r
718 return EFI_UNSUPPORTED;\r
719 }\r
720\r
721 StrToBuf (&Guid->Data4[0], 2, Str);\r
722 //\r
723 // Skip 2 byte hex chars\r
724 //\r
725 Str += 2 * 2;\r
726\r
727 if (IS_HYPHEN (*Str)) {\r
728 Str++;\r
729 } else {\r
730 return EFI_UNSUPPORTED;\r
731 }\r
732 StrToBuf (&Guid->Data4[2], 6, Str);\r
733\r
734 return EFI_SUCCESS;\r
735}\r
736\r
737VOID\r
738StrToIPv4Addr (\r
739 IN OUT CHAR16 **Str,\r
740 OUT EFI_IPv4_ADDRESS *IPv4Addr\r
741 )\r
742{\r
743 UINTN Index;\r
744\r
745 for (Index = 0; Index < 4; Index++) {\r
746 IPv4Addr->Addr[Index] = (UINT8) Atoi (SplitStr (Str, L'.'));\r
747 }\r
748}\r
749\r
750VOID\r
751StrToIPv6Addr (\r
752 IN OUT CHAR16 **Str,\r
753 OUT EFI_IPv6_ADDRESS *IPv6Addr\r
754 )\r
755{\r
756 UINTN Index;\r
757 UINT16 Data;\r
758\r
759 for (Index = 0; Index < 8; Index++) {\r
760 Data = (UINT16) Xtoi (SplitStr (Str, L':'));\r
761 IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
762 IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
763 }\r
764}\r
765\r
766VOID\r
767StrToAscii (\r
768 IN CHAR16 *Str,\r
769 IN OUT CHAR8 **AsciiStr\r
770 )\r
771{\r
772 CHAR8 *Dest;\r
773\r
774 Dest = *AsciiStr;\r
775 while (!IS_NULL (*Str)) {\r
776 *(Dest++) = (CHAR8) *(Str++);\r
777 }\r
778 *Dest = 0;\r
779\r
780 //\r
781 // Return the string next to it\r
782 //\r
783 *AsciiStr = Dest + 1;\r
784}\r
785\r
786EFI_DEVICE_PATH_PROTOCOL *\r
787DevPathFromTextPci (\r
788 IN CHAR16 *TextDeviceNode\r
789 )\r
790{\r
791 CHAR16 *FunctionStr;\r
792 CHAR16 *DeviceStr;\r
793 PCI_DEVICE_PATH *Pci;\r
794\r
795 FunctionStr = GetNextParamStr (&TextDeviceNode);\r
796 DeviceStr = GetNextParamStr (&TextDeviceNode);\r
797 Pci = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
798 HARDWARE_DEVICE_PATH,\r
799 HW_PCI_DP,\r
800 sizeof (PCI_DEVICE_PATH)\r
801 );\r
802\r
803 Pci->Function = (UINT8) Xtoi (FunctionStr);\r
804 Pci->Device = (UINT8) Xtoi (DeviceStr);\r
805\r
806 return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
807}\r
808\r
809EFI_DEVICE_PATH_PROTOCOL *\r
810DevPathFromTextPcCard (\r
811 IN CHAR16 *TextDeviceNode\r
812 )\r
813{\r
814 CHAR16 *FunctionNumberStr;\r
815 PCCARD_DEVICE_PATH *Pccard;\r
816\r
817 FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
818 Pccard = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
819 HARDWARE_DEVICE_PATH,\r
820 HW_PCCARD_DP,\r
821 sizeof (PCCARD_DEVICE_PATH)\r
822 );\r
823\r
824 Pccard->FunctionNumber = (UINT8) Xtoi (FunctionNumberStr);\r
825\r
826 return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
827}\r
828\r
829EFI_DEVICE_PATH_PROTOCOL *\r
830DevPathFromTextMemoryMapped (\r
831 IN CHAR16 *TextDeviceNode\r
832 )\r
833{\r
834 CHAR16 *StartingAddressStr;\r
835 CHAR16 *EndingAddressStr;\r
836 MEMMAP_DEVICE_PATH *MemMap;\r
837\r
838 StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
839 EndingAddressStr = GetNextParamStr (&TextDeviceNode);\r
840 MemMap = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
841 HARDWARE_DEVICE_PATH,\r
842 HW_MEMMAP_DP,\r
843 sizeof (MEMMAP_DEVICE_PATH)\r
844 );\r
845\r
846 MemMap->MemoryType = 0;\r
847\r
848 Xtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
849 Xtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
850\r
851 return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
852}\r
853\r
854EFI_DEVICE_PATH_PROTOCOL *\r
855ConvertFromTextVendor (\r
856 IN CHAR16 *TextDeviceNode,\r
857 IN UINT8 Type,\r
858 IN UINT8 SubType\r
859 )\r
860{\r
861 CHAR16 *GuidStr;\r
862 CHAR16 *DataStr;\r
863 UINTN Length;\r
864 VENDOR_DEVICE_PATH *Vendor;\r
865\r
866 GuidStr = GetNextParamStr (&TextDeviceNode);\r
867\r
868 DataStr = GetNextParamStr (&TextDeviceNode);\r
869 Length = StrLen (DataStr);\r
870 //\r
871 // Two hex characters make up 1 buffer byte\r
872 //\r
873 Length = (Length + 1) / 2;\r
874\r
875 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
876 Type,\r
877 SubType,\r
878 sizeof (VENDOR_DEVICE_PATH) + (UINT16) Length\r
879 );\r
880\r
881 StrToGuid (GuidStr, &Vendor->Guid);\r
882 StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
883\r
884 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
885}\r
886\r
887EFI_DEVICE_PATH_PROTOCOL *\r
888DevPathFromTextVenHw (\r
889 IN CHAR16 *TextDeviceNode\r
890 )\r
891{\r
892 return ConvertFromTextVendor (\r
893 TextDeviceNode,\r
894 HARDWARE_DEVICE_PATH,\r
895 HW_VENDOR_DP\r
896 );\r
897}\r
898\r
899EFI_DEVICE_PATH_PROTOCOL *\r
900DevPathFromTextCtrl (\r
901 IN CHAR16 *TextDeviceNode\r
902 )\r
903{\r
904 CHAR16 *ControllerStr;\r
905 CONTROLLER_DEVICE_PATH *Controller;\r
906\r
907 ControllerStr = GetNextParamStr (&TextDeviceNode);\r
908 Controller = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
909 HARDWARE_DEVICE_PATH,\r
910 HW_CONTROLLER_DP,\r
911 sizeof (CONTROLLER_DEVICE_PATH)\r
912 );\r
913 Controller->ControllerNumber = (UINT32) Xtoi (ControllerStr);\r
914\r
915 return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
916}\r
917\r
918EFI_DEVICE_PATH_PROTOCOL *\r
919DevPathFromTextAcpi (\r
920 IN CHAR16 *TextDeviceNode\r
921 )\r
922{\r
923 CHAR16 *HIDStr;\r
924 CHAR16 *UIDStr;\r
925 ACPI_HID_DEVICE_PATH *Acpi;\r
926\r
927 HIDStr = GetNextParamStr (&TextDeviceNode);\r
928 UIDStr = GetNextParamStr (&TextDeviceNode);\r
929 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
930 ACPI_DEVICE_PATH,\r
931 ACPI_DP,\r
932 sizeof (ACPI_HID_DEVICE_PATH)\r
933 );\r
934\r
935 if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
936 HIDStr += 3;\r
937 }\r
938\r
939 Acpi->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
940 Acpi->UID = (UINT32) Xtoi (UIDStr);\r
941\r
942 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
943}\r
944\r
945EFI_DEVICE_PATH_PROTOCOL *\r
946ConvertFromTextAcpi (\r
947 IN CHAR16 *TextDeviceNode,\r
948 IN UINT32 Hid\r
949 )\r
950{\r
951 CHAR16 *UIDStr;\r
952 ACPI_HID_DEVICE_PATH *Acpi;\r
953\r
954 UIDStr = GetNextParamStr (&TextDeviceNode);\r
955 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
956 ACPI_DEVICE_PATH,\r
957 ACPI_DP,\r
958 sizeof (ACPI_HID_DEVICE_PATH)\r
959 );\r
960\r
961 Acpi->HID = Hid;\r
962 Acpi->UID = (UINT32) Xtoi (UIDStr);\r
963\r
964 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
965}\r
966\r
967EFI_DEVICE_PATH_PROTOCOL *\r
968DevPathFromTextPciRoot (\r
969 IN CHAR16 *TextDeviceNode\r
970 )\r
971{\r
972 return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);\r
973}\r
974\r
975EFI_DEVICE_PATH_PROTOCOL *\r
976DevPathFromTextFloppy (\r
977 IN CHAR16 *TextDeviceNode\r
978 )\r
979{\r
980 return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);\r
981}\r
982\r
983EFI_DEVICE_PATH_PROTOCOL *\r
984DevPathFromTextKeyboard (\r
985 IN CHAR16 *TextDeviceNode\r
986 )\r
987{\r
988 return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);\r
989}\r
990\r
991EFI_DEVICE_PATH_PROTOCOL *\r
992DevPathFromTextSerial (\r
993 IN CHAR16 *TextDeviceNode\r
994 )\r
995{\r
996 return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);\r
997}\r
998\r
999EFI_DEVICE_PATH_PROTOCOL *\r
1000DevPathFromTextParallelPort (\r
1001 IN CHAR16 *TextDeviceNode\r
1002 )\r
1003{\r
1004 return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);\r
1005}\r
1006\r
1007EFI_DEVICE_PATH_PROTOCOL *\r
1008DevPathFromTextAcpiEx (\r
1009 IN CHAR16 *TextDeviceNode\r
1010 )\r
1011{\r
1012 CHAR16 *HIDStr;\r
1013 CHAR16 *CIDStr;\r
1014 CHAR16 *UIDStr;\r
1015 CHAR16 *HIDSTRStr;\r
1016 CHAR16 *CIDSTRStr;\r
1017 CHAR16 *UIDSTRStr;\r
1018 CHAR8 *AsciiStr;\r
1019 UINT16 Length;\r
1020 ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *AcpiExt;\r
1021\r
1022 HIDStr = GetNextParamStr (&TextDeviceNode);\r
1023 CIDStr = GetNextParamStr (&TextDeviceNode);\r
1024 UIDStr = GetNextParamStr (&TextDeviceNode);\r
1025 HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1026 CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1027 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1028 Length = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + \r
1029 (UINT16) StrLen (HIDSTRStr) + 1 +\r
1030 (UINT16) StrLen (UIDSTRStr) + 1 +\r
1031 (UINT16) StrLen (CIDSTRStr) + 1;\r
1032 AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
1033 ACPI_DEVICE_PATH,\r
1034 ACPI_EXTENDED_DP,\r
1035 Length\r
1036 );\r
1037\r
1038 if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
1039 HIDStr += 3;\r
1040 AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
1041 } else {\r
1042 AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
1043 }\r
1044\r
1045 AcpiExt->UID = (UINT32) Xtoi (UIDStr);\r
1046 AcpiExt->CID = (UINT32) Xtoi (CIDStr);\r
1047\r
1048 AsciiStr = AcpiExt->HidUidCidStr;\r
1049 StrToAscii (HIDSTRStr, &AsciiStr);\r
1050 StrToAscii (UIDSTRStr, &AsciiStr);\r
1051 StrToAscii (CIDSTRStr, &AsciiStr);\r
1052 \r
1053 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
1054}\r
1055\r
1056EFI_DEVICE_PATH_PROTOCOL *\r
1057DevPathFromTextAcpiExp (\r
1058 IN CHAR16 *TextDeviceNode\r
1059 )\r
1060{\r
1061 CHAR16 *HIDStr;\r
1062 CHAR16 *CIDStr;\r
1063 CHAR16 *UIDSTRStr;\r
1064 CHAR8 *AsciiStr;\r
1065 UINT16 Length;\r
1066 ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *AcpiExt;\r
1067\r
1068 HIDStr = GetNextParamStr (&TextDeviceNode);\r
1069 CIDStr = GetNextParamStr (&TextDeviceNode);\r
1070 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1071 Length = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + (UINT16) StrLen (UIDSTRStr) + 3;\r
1072 AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
1073 ACPI_DEVICE_PATH,\r
1074 ACPI_EXTENDED_DP,\r
1075 Length\r
1076 );\r
1077\r
1078 if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
1079 HIDStr += 3;\r
1080 AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
1081 } else {\r
1082 AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
1083 }\r
1084\r
1085 AcpiExt->UID = 0;\r
1086 AcpiExt->CID = (UINT32) Xtoi (CIDStr);\r
1087\r
1088 AsciiStr = AcpiExt->HidUidCidStr;\r
1089 //\r
1090 // HID string is NULL\r
1091 //\r
1092 *AsciiStr = 0;\r
1093 //\r
1094 // Convert UID string\r
1095 //\r
1096 AsciiStr++;\r
1097 StrToAscii (UIDSTRStr, &AsciiStr);\r
1098 //\r
1099 // CID string is NULL\r
1100 //\r
1101 *AsciiStr = 0;\r
1102\r
1103 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
1104}\r
1105\r
1106EFI_DEVICE_PATH_PROTOCOL *\r
1107DevPathFromTextAta (\r
1108 IN CHAR16 *TextDeviceNode\r
1109 )\r
1110{\r
1111 CHAR16 *PrimarySecondaryStr;\r
1112 CHAR16 *SlaveMasterStr;\r
1113 CHAR16 *LunStr;\r
1114 ATAPI_DEVICE_PATH *Atapi;\r
1115\r
1116 Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
1117 MESSAGING_DEVICE_PATH,\r
1118 MSG_ATAPI_DP,\r
1119 sizeof (ATAPI_DEVICE_PATH)\r
1120 );\r
1121\r
1122 PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
1123 SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
1124 LunStr = GetNextParamStr (&TextDeviceNode);\r
1125\r
1126 Atapi->PrimarySecondary = (StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? (UINT8) 0 : (UINT8) 1;\r
1127 Atapi->SlaveMaster = (StrCmp (SlaveMasterStr, L"Master") == 0) ? (UINT8) 0 : (UINT8) 1;\r
1128 Atapi->Lun = (UINT16) Xtoi (LunStr);\r
1129\r
1130 return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
1131}\r
1132\r
1133EFI_DEVICE_PATH_PROTOCOL *\r
1134DevPathFromTextScsi (\r
1135 IN CHAR16 *TextDeviceNode\r
1136 )\r
1137{\r
1138 CHAR16 *PunStr;\r
1139 CHAR16 *LunStr;\r
1140 SCSI_DEVICE_PATH *Scsi;\r
1141\r
1142 PunStr = GetNextParamStr (&TextDeviceNode);\r
1143 LunStr = GetNextParamStr (&TextDeviceNode);\r
1144 Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
1145 MESSAGING_DEVICE_PATH,\r
1146 MSG_SCSI_DP,\r
1147 sizeof (SCSI_DEVICE_PATH)\r
1148 );\r
1149\r
1150 Scsi->Pun = (UINT16) Xtoi (PunStr);\r
1151 Scsi->Lun = (UINT16) Xtoi (LunStr);\r
1152\r
1153 return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
1154}\r
1155\r
1156EFI_DEVICE_PATH_PROTOCOL *\r
1157DevPathFromTextFibre (\r
1158 IN CHAR16 *TextDeviceNode\r
1159 )\r
1160{\r
1161 CHAR16 *WWNStr;\r
1162 CHAR16 *LunStr;\r
1163 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
1164\r
1165 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1166 LunStr = GetNextParamStr (&TextDeviceNode);\r
1167 Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
1168 MESSAGING_DEVICE_PATH,\r
1169 MSG_FIBRECHANNEL_DP,\r
1170 sizeof (FIBRECHANNEL_DEVICE_PATH)\r
1171 );\r
1172\r
1173 Fibre->Reserved = 0;\r
1174 Xtoi64 (WWNStr, &Fibre->WWN);\r
1175 Xtoi64 (LunStr, &Fibre->Lun);\r
1176\r
1177 return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
1178}\r
1179\r
1180EFI_DEVICE_PATH_PROTOCOL *\r
1181DevPathFromText1394 (\r
1182 IN CHAR16 *TextDeviceNode\r
1183 )\r
1184{\r
1185 CHAR16 *GuidStr;\r
1186 F1394_DEVICE_PATH *F1394;\r
1187\r
1188 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1189 F1394 = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
1190 MESSAGING_DEVICE_PATH,\r
1191 MSG_1394_DP,\r
1192 sizeof (F1394_DEVICE_PATH)\r
1193 );\r
1194\r
1195 F1394->Reserved = 0;\r
1196 Xtoi64 (GuidStr, &F1394->Guid);\r
1197\r
1198 return (EFI_DEVICE_PATH_PROTOCOL *) F1394;\r
1199}\r
1200\r
1201EFI_DEVICE_PATH_PROTOCOL *\r
1202DevPathFromTextUsb (\r
1203 IN CHAR16 *TextDeviceNode\r
1204 )\r
1205{\r
1206 CHAR16 *PortStr;\r
1207 CHAR16 *InterfaceStr;\r
1208 USB_DEVICE_PATH *Usb;\r
1209\r
1210 PortStr = GetNextParamStr (&TextDeviceNode);\r
1211 InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
1212 Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
1213 MESSAGING_DEVICE_PATH,\r
1214 MSG_USB_DP,\r
1215 sizeof (USB_DEVICE_PATH)\r
1216 );\r
1217\r
1218 Usb->ParentPortNumber = (UINT8) Xtoi (PortStr);\r
1219 Usb->InterfaceNumber = (UINT8) Xtoi (InterfaceStr);\r
1220\r
1221 return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
1222}\r
1223\r
1224EFI_DEVICE_PATH_PROTOCOL *\r
1225DevPathFromTextI2O (\r
1226 IN CHAR16 *TextDeviceNode\r
1227 )\r
1228{\r
1229 CHAR16 *TIDStr;\r
1230 I2O_DEVICE_PATH *I2O;\r
1231\r
1232 TIDStr = GetNextParamStr (&TextDeviceNode);\r
1233 I2O = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
1234 MESSAGING_DEVICE_PATH,\r
1235 MSG_I2O_DP,\r
1236 sizeof (I2O_DEVICE_PATH)\r
1237 );\r
1238\r
1239 I2O->Tid = (UINT32) Xtoi (TIDStr);\r
1240\r
1241 return (EFI_DEVICE_PATH_PROTOCOL *) I2O;\r
1242}\r
1243\r
1244EFI_DEVICE_PATH_PROTOCOL *\r
1245DevPathFromTextInfiniband (\r
1246 IN CHAR16 *TextDeviceNode\r
1247 )\r
1248{\r
1249 CHAR16 *FlagsStr;\r
1250 CHAR16 *GuidStr;\r
1251 CHAR16 *SidStr;\r
1252 CHAR16 *TidStr;\r
1253 CHAR16 *DidStr;\r
1254 EFI_GUID PortGid;\r
1255 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1256\r
1257 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
1258 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1259 SidStr = GetNextParamStr (&TextDeviceNode);\r
1260 TidStr = GetNextParamStr (&TextDeviceNode);\r
1261 DidStr = GetNextParamStr (&TextDeviceNode);\r
1262 InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
1263 MESSAGING_DEVICE_PATH,\r
1264 MSG_INFINIBAND_DP,\r
1265 sizeof (INFINIBAND_DEVICE_PATH)\r
1266 );\r
1267\r
1268 InfiniBand->ResourceFlags = (UINT32) Xtoi (FlagsStr);\r
1269 StrToGuid (GuidStr, &PortGid);\r
1270 CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
1271 Xtoi64 (SidStr, &InfiniBand->ServiceId);\r
1272 Xtoi64 (TidStr, &InfiniBand->TargetPortId);\r
1273 Xtoi64 (DidStr, &InfiniBand->DeviceId);\r
1274\r
1275 return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
1276}\r
1277\r
1278EFI_DEVICE_PATH_PROTOCOL *\r
1279DevPathFromTextVenMsg (\r
1280 IN CHAR16 *TextDeviceNode\r
1281 )\r
1282{\r
1283 return ConvertFromTextVendor (\r
1284 TextDeviceNode,\r
1285 MESSAGING_DEVICE_PATH,\r
1286 MSG_VENDOR_DP\r
1287 );\r
1288}\r
1289\r
1290EFI_DEVICE_PATH_PROTOCOL *\r
1291DevPathFromTextVenPcAnsi (\r
1292 IN CHAR16 *TextDeviceNode\r
1293 )\r
1294{\r
1295 VENDOR_DEVICE_PATH *Vendor;\r
1296\r
1297 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1298 MESSAGING_DEVICE_PATH,\r
1299 MSG_VENDOR_DP,\r
1300 sizeof (VENDOR_DEVICE_PATH));\r
1301 CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
1302\r
1303 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1304}\r
1305\r
1306EFI_DEVICE_PATH_PROTOCOL *\r
1307DevPathFromTextVenVt100 (\r
1308 IN CHAR16 *TextDeviceNode\r
1309 )\r
1310{\r
1311 VENDOR_DEVICE_PATH *Vendor;\r
1312\r
1313 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1314 MESSAGING_DEVICE_PATH,\r
1315 MSG_VENDOR_DP,\r
1316 sizeof (VENDOR_DEVICE_PATH));\r
1317 CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
1318\r
1319 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1320}\r
1321\r
1322EFI_DEVICE_PATH_PROTOCOL *\r
1323DevPathFromTextVenVt100Plus (\r
1324 IN CHAR16 *TextDeviceNode\r
1325 )\r
1326{\r
1327 VENDOR_DEVICE_PATH *Vendor;\r
1328\r
1329 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1330 MESSAGING_DEVICE_PATH,\r
1331 MSG_VENDOR_DP,\r
1332 sizeof (VENDOR_DEVICE_PATH));\r
1333 CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
1334\r
1335 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1336}\r
1337\r
1338EFI_DEVICE_PATH_PROTOCOL *\r
1339DevPathFromTextVenUtf8 (\r
1340 IN CHAR16 *TextDeviceNode\r
1341 )\r
1342{\r
1343 VENDOR_DEVICE_PATH *Vendor;\r
1344\r
1345 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1346 MESSAGING_DEVICE_PATH,\r
1347 MSG_VENDOR_DP,\r
1348 sizeof (VENDOR_DEVICE_PATH));\r
1349 CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
1350\r
1351 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1352}\r
1353\r
1354EFI_DEVICE_PATH_PROTOCOL *\r
1355DevPathFromTextUartFlowCtrl (\r
1356 IN CHAR16 *TextDeviceNode\r
1357 )\r
1358{\r
1359 CHAR16 *ValueStr;\r
1360 UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
1361\r
1362 ValueStr = GetNextParamStr (&TextDeviceNode);\r
1363 UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
1364 MESSAGING_DEVICE_PATH,\r
1365 MSG_VENDOR_DP,\r
1366 sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
1367 );\r
1368\r
1369 CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);\r
1370 if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
1371 UartFlowControl->FlowControlMap = 2;\r
1372 } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
1373 UartFlowControl->FlowControlMap = 1;\r
1374 } else {\r
1375 UartFlowControl->FlowControlMap = 0;\r
1376 }\r
1377\r
1378 return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
1379}\r
1380\r
1381EFI_DEVICE_PATH_PROTOCOL *\r
1382DevPathFromTextSAS (\r
1383 IN CHAR16 *TextDeviceNode\r
1384 )\r
1385{\r
1386 CHAR16 *AddressStr;\r
1387 CHAR16 *LunStr;\r
1388 CHAR16 *RTPStr;\r
1389 CHAR16 *SASSATAStr;\r
1390 CHAR16 *LocationStr;\r
1391 CHAR16 *ConnectStr;\r
1392 CHAR16 *DriveBayStr;\r
1393 CHAR16 *ReservedStr;\r
1394 UINT16 Info;\r
1395 SAS_DEVICE_PATH *Sas;\r
1396\r
1397 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1398 LunStr = GetNextParamStr (&TextDeviceNode);\r
1399 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1400 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1401 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1402 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1403 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
1404 ReservedStr = GetNextParamStr (&TextDeviceNode);\r
1405 Info = 0x0000;\r
1406 Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
1407 MESSAGING_DEVICE_PATH,\r
1408 MSG_VENDOR_DP,\r
1409 sizeof (SAS_DEVICE_PATH)\r
1410 );\r
1411\r
1412 CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);\r
1413 Xtoi64 (AddressStr, &Sas->SasAddress);\r
1414 Xtoi64 (LunStr, &Sas->Lun);\r
1415 Sas->RelativeTargetPort = (UINT16) Xtoi (RTPStr);\r
1416 if (StrCmp (SASSATAStr, L"NoTopology") == 0)\r
1417 ;\r
1418 else {\r
1419 if (StrCmp (DriveBayStr, L"0") == 0) {\r
1420 Info |= 0x0001;\r
1421 } else {\r
1422 Info |= 0x0002;\r
1423 Info |= (Xtoi (DriveBayStr) << 8);\r
1424 }\r
1425\r
1426 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
1427 Info |= 0x0010;\r
1428 }\r
1429\r
1430 if (StrCmp (LocationStr, L"External") == 0) {\r
1431 Info |= 0x0020;\r
1432 }\r
1433\r
1434 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
1435 Info |= 0x0040;\r
1436 }\r
1437 }\r
1438\r
1439 Sas->DeviceTopology = Info;\r
1440 Sas->Reserved = (UINT32) Xtoi (ReservedStr);\r
1441\r
1442 return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
1443}\r
1444\r
1445EFI_DEVICE_PATH_PROTOCOL *\r
1446DevPathFromTextDebugPort (\r
1447 IN CHAR16 *TextDeviceNode\r
1448 )\r
1449{\r
1450 VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
1451\r
1452 Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
1453 MESSAGING_DEVICE_PATH,\r
1454 MSG_VENDOR_DP,\r
1455 sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
1456 );\r
1457\r
1458 CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
1459\r
1460 return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
1461}\r
1462\r
1463EFI_DEVICE_PATH_PROTOCOL *\r
1464DevPathFromTextMAC (\r
1465 IN CHAR16 *TextDeviceNode\r
1466 )\r
1467{\r
1468 CHAR16 *AddressStr;\r
1469 CHAR16 *IfTypeStr;\r
1470 UINTN Length;\r
1471 MAC_ADDR_DEVICE_PATH *MAC;\r
1472\r
1473 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1474 IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
1475 MAC = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
1476 MESSAGING_DEVICE_PATH,\r
1477 MSG_MAC_ADDR_DP,\r
1478 sizeof (MAC_ADDR_DEVICE_PATH)\r
1479 );\r
1480\r
1481 MAC->IfType = (UINT8) Xtoi (IfTypeStr);\r
1482\r
1483 Length = sizeof (EFI_MAC_ADDRESS);\r
1484 StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);\r
1485\r
1486 return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\r
1487}\r
1488\r
1489EFI_DEVICE_PATH_PROTOCOL *\r
1490DevPathFromTextIPv4 (\r
1491 IN CHAR16 *TextDeviceNode\r
1492 )\r
1493{\r
1494 CHAR16 *RemoteIPStr;\r
1495 CHAR16 *ProtocolStr;\r
1496 CHAR16 *TypeStr;\r
1497 CHAR16 *LocalIPStr;\r
1498 IPv4_DEVICE_PATH *IPv4;\r
1499\r
1500 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1501 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1502 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1503 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1504 IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
1505 MESSAGING_DEVICE_PATH,\r
1506 MSG_IPv4_DP,\r
1507 sizeof (IPv4_DEVICE_PATH)\r
1508 );\r
1509\r
1510 StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
1511 IPv4->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
1512 if (StrCmp (TypeStr, L"Static") == 0) {\r
1513 IPv4->StaticIpAddress = TRUE;\r
1514 } else {\r
1515 IPv4->StaticIpAddress = FALSE;\r
1516 }\r
1517\r
1518 StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
1519\r
1520 IPv4->LocalPort = 0;\r
1521 IPv4->RemotePort = 0;\r
1522\r
1523 return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
1524}\r
1525\r
1526EFI_DEVICE_PATH_PROTOCOL *\r
1527DevPathFromTextIPv6 (\r
1528 IN CHAR16 *TextDeviceNode\r
1529 )\r
1530{\r
1531 CHAR16 *RemoteIPStr;\r
1532 CHAR16 *ProtocolStr;\r
1533 CHAR16 *TypeStr;\r
1534 CHAR16 *LocalIPStr;\r
1535 IPv6_DEVICE_PATH *IPv6;\r
1536\r
1537 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1538 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1539 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1540 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1541 IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
1542 MESSAGING_DEVICE_PATH,\r
1543 MSG_IPv6_DP,\r
1544 sizeof (IPv6_DEVICE_PATH)\r
1545 );\r
1546\r
1547 StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
1548 IPv6->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
1549 if (StrCmp (TypeStr, L"Static") == 0) {\r
1550 IPv6->StaticIpAddress = TRUE;\r
1551 } else {\r
1552 IPv6->StaticIpAddress = FALSE;\r
1553 }\r
1554\r
1555 StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
1556\r
1557 IPv6->LocalPort = 0;\r
1558 IPv6->RemotePort = 0;\r
1559\r
1560 return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
1561}\r
1562\r
1563EFI_DEVICE_PATH_PROTOCOL *\r
1564DevPathFromTextUart (\r
1565 IN CHAR16 *TextDeviceNode\r
1566 )\r
1567{\r
1568 CHAR16 *BaudStr;\r
1569 CHAR16 *DataBitsStr;\r
1570 CHAR16 *ParityStr;\r
1571 CHAR16 *StopBitsStr;\r
1572 UART_DEVICE_PATH *Uart;\r
1573\r
1574 BaudStr = GetNextParamStr (&TextDeviceNode);\r
1575 DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
1576 ParityStr = GetNextParamStr (&TextDeviceNode);\r
1577 StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
1578 Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
1579 MESSAGING_DEVICE_PATH,\r
1580 MSG_UART_DP,\r
1581 sizeof (UART_DEVICE_PATH)\r
1582 );\r
1583\r
1584 Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Atoi (BaudStr);\r
1585 Uart->DataBits = (StrCmp (DataBitsStr, L"DEFAULT") == 0) ? (UINT8) 8 : (UINT8) Atoi (DataBitsStr);\r
1586 switch (*ParityStr) {\r
1587 case L'D':\r
1588 Uart->Parity = 0;\r
1589 break;\r
1590\r
1591 case L'N':\r
1592 Uart->Parity = 1;\r
1593 break;\r
1594\r
1595 case L'E':\r
1596 Uart->Parity = 2;\r
1597 break;\r
1598\r
1599 case L'O':\r
1600 Uart->Parity = 3;\r
1601 break;\r
1602\r
1603 case L'M':\r
1604 Uart->Parity = 4;\r
1605 break;\r
1606\r
1607 case L'S':\r
1608 Uart->Parity = 5;\r
1609\r
1610 default:\r
1611 Uart->Parity = 0xff;\r
1612 }\r
1613\r
1614 if (StrCmp (StopBitsStr, L"D") == 0) {\r
1615 Uart->StopBits = (UINT8) 0;\r
1616 } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
1617 Uart->StopBits = (UINT8) 1;\r
1618 } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
1619 Uart->StopBits = (UINT8) 2;\r
1620 } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
1621 Uart->StopBits = (UINT8) 3;\r
1622 } else {\r
1623 Uart->StopBits = 0xff;\r
1624 }\r
1625\r
1626 return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
1627}\r
1628\r
1629EFI_DEVICE_PATH_PROTOCOL *\r
1630ConvertFromTextUsbClass (\r
1631 IN CHAR16 *TextDeviceNode,\r
1632 IN USB_CLASS_TEXT *UsbClassText\r
1633 )\r
1634{\r
1635 CHAR16 *VIDStr;\r
1636 CHAR16 *PIDStr;\r
1637 CHAR16 *ClassStr;\r
1638 CHAR16 *SubClassStr;\r
1639 CHAR16 *ProtocolStr;\r
1640 USB_CLASS_DEVICE_PATH *UsbClass;\r
1641\r
1642 UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
1643 MESSAGING_DEVICE_PATH,\r
1644 MSG_USB_CLASS_DP,\r
1645 sizeof (USB_CLASS_DEVICE_PATH)\r
1646 );\r
1647\r
1648 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1649 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1650 if (UsbClassText->ClassExist) {\r
1651 ClassStr = GetNextParamStr (&TextDeviceNode);\r
1652 UsbClass->DeviceClass = (UINT8) Xtoi (ClassStr);\r
1653 } else {\r
1654 UsbClass->DeviceClass = UsbClassText->Class;\r
1655 }\r
1656 if (UsbClassText->SubClassExist) {\r
1657 SubClassStr = GetNextParamStr (&TextDeviceNode);\r
1658 UsbClass->DeviceSubClass = (UINT8) Xtoi (SubClassStr);\r
1659 } else {\r
1660 UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
1661 } \r
1662\r
1663 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1664\r
1665 UsbClass->VendorId = (UINT16) Xtoi (VIDStr);\r
1666 UsbClass->ProductId = (UINT16) Xtoi (PIDStr);\r
1667 UsbClass->DeviceProtocol = (UINT8) Xtoi (ProtocolStr);\r
1668\r
1669 return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
1670}\r
1671\r
1672\r
1673EFI_DEVICE_PATH_PROTOCOL *\r
1674DevPathFromTextUsbClass (\r
1675 IN CHAR16 *TextDeviceNode\r
1676 )\r
1677{\r
1678 USB_CLASS_TEXT UsbClassText;\r
1679\r
1680 UsbClassText.ClassExist = TRUE;\r
1681 UsbClassText.SubClassExist = TRUE;\r
1682\r
1683 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1684}\r
1685\r
1686EFI_DEVICE_PATH_PROTOCOL *\r
1687DevPathFromTextUsbAudio (\r
1688 IN CHAR16 *TextDeviceNode\r
1689 )\r
1690{\r
1691 USB_CLASS_TEXT UsbClassText;\r
1692\r
1693 UsbClassText.ClassExist = FALSE;\r
1694 UsbClassText.Class = USB_CLASS_AUDIO;\r
1695 UsbClassText.SubClassExist = TRUE;\r
1696\r
1697 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1698}\r
1699\r
1700EFI_DEVICE_PATH_PROTOCOL *\r
1701DevPathFromTextUsbCDCControl (\r
1702 IN CHAR16 *TextDeviceNode\r
1703 )\r
1704{\r
1705 USB_CLASS_TEXT UsbClassText;\r
1706\r
1707 UsbClassText.ClassExist = FALSE;\r
1708 UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
1709 UsbClassText.SubClassExist = TRUE;\r
1710\r
1711 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1712}\r
1713\r
1714EFI_DEVICE_PATH_PROTOCOL *\r
1715DevPathFromTextUsbHID (\r
1716 IN CHAR16 *TextDeviceNode\r
1717 )\r
1718{\r
1719 USB_CLASS_TEXT UsbClassText;\r
1720\r
1721 UsbClassText.ClassExist = FALSE;\r
1722 UsbClassText.Class = USB_CLASS_HID;\r
1723 UsbClassText.SubClassExist = TRUE;\r
1724\r
1725 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1726}\r
1727\r
1728EFI_DEVICE_PATH_PROTOCOL *\r
1729DevPathFromTextUsbImage (\r
1730 IN CHAR16 *TextDeviceNode\r
1731 )\r
1732{\r
1733 USB_CLASS_TEXT UsbClassText;\r
1734\r
1735 UsbClassText.ClassExist = FALSE;\r
1736 UsbClassText.Class = USB_CLASS_IMAGE;\r
1737 UsbClassText.SubClassExist = TRUE;\r
1738\r
1739 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1740}\r
1741\r
1742EFI_DEVICE_PATH_PROTOCOL *\r
1743DevPathFromTextUsbPrinter (\r
1744 IN CHAR16 *TextDeviceNode\r
1745 )\r
1746{\r
1747 USB_CLASS_TEXT UsbClassText;\r
1748\r
1749 UsbClassText.ClassExist = FALSE;\r
1750 UsbClassText.Class = USB_CLASS_PRINTER;\r
1751 UsbClassText.SubClassExist = TRUE;\r
1752\r
1753 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1754}\r
1755\r
1756EFI_DEVICE_PATH_PROTOCOL *\r
1757DevPathFromTextUsbMassStorage (\r
1758 IN CHAR16 *TextDeviceNode\r
1759 )\r
1760{\r
1761 USB_CLASS_TEXT UsbClassText;\r
1762\r
1763 UsbClassText.ClassExist = FALSE;\r
1764 UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
1765 UsbClassText.SubClassExist = TRUE;\r
1766\r
1767 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1768}\r
1769\r
1770EFI_DEVICE_PATH_PROTOCOL *\r
1771DevPathFromTextUsbHub (\r
1772 IN CHAR16 *TextDeviceNode\r
1773 )\r
1774{\r
1775 USB_CLASS_TEXT UsbClassText;\r
1776\r
1777 UsbClassText.ClassExist = FALSE;\r
1778 UsbClassText.Class = USB_CLASS_HUB;\r
1779 UsbClassText.SubClassExist = TRUE;\r
1780\r
1781 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1782}\r
1783\r
1784EFI_DEVICE_PATH_PROTOCOL *\r
1785DevPathFromTextUsbCDCData (\r
1786 IN CHAR16 *TextDeviceNode\r
1787 )\r
1788{\r
1789 USB_CLASS_TEXT UsbClassText;\r
1790\r
1791 UsbClassText.ClassExist = FALSE;\r
1792 UsbClassText.Class = USB_CLASS_CDCDATA;\r
1793 UsbClassText.SubClassExist = TRUE;\r
1794\r
1795 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1796}\r
1797\r
1798EFI_DEVICE_PATH_PROTOCOL *\r
1799DevPathFromTextUsbSmartCard (\r
1800 IN CHAR16 *TextDeviceNode\r
1801 )\r
1802{\r
1803 USB_CLASS_TEXT UsbClassText;\r
1804\r
1805 UsbClassText.ClassExist = FALSE;\r
1806 UsbClassText.Class = USB_CLASS_SMART_CARD;\r
1807 UsbClassText.SubClassExist = TRUE;\r
1808\r
1809 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1810}\r
1811\r
1812EFI_DEVICE_PATH_PROTOCOL *\r
1813DevPathFromTextUsbVideo (\r
1814 IN CHAR16 *TextDeviceNode\r
1815 )\r
1816{\r
1817 USB_CLASS_TEXT UsbClassText;\r
1818\r
1819 UsbClassText.ClassExist = FALSE;\r
1820 UsbClassText.Class = USB_CLASS_VIDEO;\r
1821 UsbClassText.SubClassExist = TRUE;\r
1822\r
1823 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1824}\r
1825\r
1826EFI_DEVICE_PATH_PROTOCOL *\r
1827DevPathFromTextUsbDiagnostic (\r
1828 IN CHAR16 *TextDeviceNode\r
1829 )\r
1830{\r
1831 USB_CLASS_TEXT UsbClassText;\r
1832\r
1833 UsbClassText.ClassExist = FALSE;\r
1834 UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
1835 UsbClassText.SubClassExist = TRUE;\r
1836\r
1837 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1838}\r
1839\r
1840EFI_DEVICE_PATH_PROTOCOL *\r
1841DevPathFromTextUsbWireless (\r
1842 IN CHAR16 *TextDeviceNode\r
1843 )\r
1844{\r
1845 USB_CLASS_TEXT UsbClassText;\r
1846\r
1847 UsbClassText.ClassExist = FALSE;\r
1848 UsbClassText.Class = USB_CLASS_WIRELESS;\r
1849 UsbClassText.SubClassExist = TRUE;\r
1850\r
1851 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1852}\r
1853\r
1854EFI_DEVICE_PATH_PROTOCOL *\r
1855DevPathFromTextUsbDeviceFirmwareUpdate (\r
1856 IN CHAR16 *TextDeviceNode\r
1857 )\r
1858{\r
1859 USB_CLASS_TEXT UsbClassText;\r
1860\r
1861 UsbClassText.ClassExist = FALSE;\r
1862 UsbClassText.Class = USB_CLASS_RESERVE;\r
1863 UsbClassText.SubClassExist = FALSE;\r
1864 UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
1865\r
1866 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1867}\r
1868\r
1869EFI_DEVICE_PATH_PROTOCOL *\r
1870DevPathFromTextUsbIrdaBridge (\r
1871 IN CHAR16 *TextDeviceNode\r
1872 )\r
1873{\r
1874 USB_CLASS_TEXT UsbClassText;\r
1875\r
1876 UsbClassText.ClassExist = FALSE;\r
1877 UsbClassText.Class = USB_CLASS_RESERVE;\r
1878 UsbClassText.SubClassExist = FALSE;\r
1879 UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
1880\r
1881 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1882}\r
1883\r
1884EFI_DEVICE_PATH_PROTOCOL *\r
1885DevPathFromTextUsbTestAndMeasurement (\r
1886 IN CHAR16 *TextDeviceNode\r
1887 )\r
1888{\r
1889 USB_CLASS_TEXT UsbClassText;\r
1890\r
1891 UsbClassText.ClassExist = FALSE;\r
1892 UsbClassText.Class = USB_CLASS_RESERVE;\r
1893 UsbClassText.SubClassExist = FALSE;\r
1894 UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
1895\r
1896 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1897}\r
1898\r
1899EFI_DEVICE_PATH_PROTOCOL *\r
1900DevPathFromTextUsbWwid (\r
1901 IN CHAR16 *TextDeviceNode\r
1902 )\r
1903{\r
1904 CHAR16 *VIDStr;\r
1905 CHAR16 *PIDStr;\r
1906 CHAR16 *InterfaceNumStr;\r
1907 USB_WWID_DEVICE_PATH *UsbWwid;\r
1908\r
1909 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1910 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1911 InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
1912 UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
1913 MESSAGING_DEVICE_PATH,\r
1914 MSG_USB_WWID_DP,\r
1915 sizeof (USB_WWID_DEVICE_PATH)\r
1916 );\r
1917\r
1918 UsbWwid->VendorId = (UINT16) Xtoi (VIDStr);\r
1919 UsbWwid->ProductId = (UINT16) Xtoi (PIDStr);\r
1920 UsbWwid->InterfaceNumber = (UINT16) Xtoi (InterfaceNumStr);\r
1921\r
1922 return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
1923}\r
1924\r
1925EFI_DEVICE_PATH_PROTOCOL *\r
1926DevPathFromTextUnit (\r
1927 IN CHAR16 *TextDeviceNode\r
1928 )\r
1929{\r
1930 CHAR16 *LunStr;\r
1931 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
1932\r
1933 LunStr = GetNextParamStr (&TextDeviceNode);\r
1934 LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
1935 MESSAGING_DEVICE_PATH,\r
1936 MSG_DEVICE_LOGICAL_UNIT_DP,\r
1937 sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
1938 );\r
1939\r
1940 LogicalUnit->Lun = (UINT8) Xtoi (LunStr);\r
1941\r
1942 return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
1943}\r
1944\r
1945EFI_DEVICE_PATH_PROTOCOL *\r
1946DevPathFromTextiSCSI (\r
1947 IN CHAR16 *TextDeviceNode\r
1948 )\r
1949{\r
1950 UINT16 Options;\r
1951 CHAR16 *NameStr;\r
1952 CHAR16 *PortalGroupStr;\r
1953 CHAR16 *LunStr;\r
1954 CHAR16 *HeaderDigestStr;\r
1955 CHAR16 *DataDigestStr;\r
1956 CHAR16 *AuthenticationStr;\r
1957 CHAR16 *ProtocolStr;\r
1958 ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;\r
1959\r
1960 NameStr = GetNextParamStr (&TextDeviceNode);\r
1961 PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
1962 LunStr = GetNextParamStr (&TextDeviceNode);\r
1963 HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
1964 DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
1965 AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
1966 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1967 iSCSI = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
1968 MESSAGING_DEVICE_PATH,\r
1969 MSG_ISCSI_DP,\r
1970 sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + (UINT16) (StrLen (NameStr) * 2)\r
1971 );\r
1972\r
1973 StrCpy (iSCSI->iSCSITargetName, NameStr);\r
1974 iSCSI->TargetPortalGroupTag = (UINT16) Xtoi (PortalGroupStr);\r
1975 Xtoi64 (LunStr, &iSCSI->Lun);\r
1976\r
1977 Options = 0x0000;\r
1978 if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
1979 Options |= 0x0002;\r
1980 }\r
1981\r
1982 if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
1983 Options |= 0x0008;\r
1984 }\r
1985\r
1986 if (StrCmp (AuthenticationStr, L"None") == 0) {\r
1987 Options |= 0x0800;\r
1988 }\r
1989\r
1990 if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
1991 Options |= 0x1000;\r
1992 }\r
1993\r
1994 iSCSI->LoginOption = (UINT16) Options;\r
1995\r
1996 iSCSI->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
1997 iSCSI->Reserved = (UINT16) 0;\r
1998\r
1999 return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;\r
2000}\r
2001\r
2002EFI_DEVICE_PATH_PROTOCOL *\r
2003DevPathFromTextHD (\r
2004 IN CHAR16 *TextDeviceNode\r
2005 )\r
2006{\r
2007 CHAR16 *PartitionStr;\r
2008 CHAR16 *TypeStr;\r
2009 CHAR16 *SignatureStr;\r
2010 CHAR16 *StartStr;\r
2011 CHAR16 *SizeStr;\r
2012 UINT32 Signature32;\r
2013 EFI_GUID SignatureGuid;\r
2014 HARDDRIVE_DEVICE_PATH *Hd;\r
2015\r
2016 PartitionStr = GetNextParamStr (&TextDeviceNode);\r
2017 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2018 SignatureStr = GetNextParamStr (&TextDeviceNode);\r
2019 StartStr = GetNextParamStr (&TextDeviceNode);\r
2020 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2021 Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
2022 MEDIA_DEVICE_PATH,\r
2023 MEDIA_HARDDRIVE_DP,\r
2024 sizeof (HARDDRIVE_DEVICE_PATH)\r
2025 );\r
2026\r
2027 Hd->PartitionNumber = (UINT32) Atoi (PartitionStr);\r
2028\r
2029 ZeroMem (Hd->Signature, 16);\r
2030 Hd->MBRType = (UINT8) 0;\r
2031\r
2032 if (StrCmp (TypeStr, L"None") == 0) {\r
2033 Hd->SignatureType = (UINT8) 0;\r
2034 } else if (StrCmp (TypeStr, L"MBR") == 0) {\r
2035 Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
2036 Hd->MBRType = 0x01;\r
2037\r
2038 Signature32 = (UINT32) Xtoi (SignatureStr);\r
2039 CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
2040 } else if (StrCmp (TypeStr, L"GUID") == 0) {\r
2041 Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
2042 Hd->MBRType = 0x02;\r
2043\r
2044 StrToGuid (SignatureStr, &SignatureGuid);\r
2045 CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
2046 } else {\r
2047 Hd->SignatureType = 0xff;\r
2048\r
2049 }\r
2050\r
2051 Xtoi64 (StartStr, &Hd->PartitionStart);\r
2052 Xtoi64 (SizeStr, &Hd->PartitionSize);\r
2053\r
2054 return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
2055}\r
2056\r
2057EFI_DEVICE_PATH_PROTOCOL *\r
2058DevPathFromTextCDROM (\r
2059 IN CHAR16 *TextDeviceNode\r
2060 )\r
2061{\r
2062 CHAR16 *EntryStr;\r
2063 CHAR16 *StartStr;\r
2064 CHAR16 *SizeStr;\r
2065 CDROM_DEVICE_PATH *CDROM;\r
2066\r
2067 EntryStr = GetNextParamStr (&TextDeviceNode);\r
2068 StartStr = GetNextParamStr (&TextDeviceNode);\r
2069 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2070 CDROM = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
2071 MEDIA_DEVICE_PATH,\r
2072 MEDIA_CDROM_DP,\r
2073 sizeof (CDROM_DEVICE_PATH)\r
2074 );\r
2075\r
2076 CDROM->BootEntry = (UINT32) Xtoi (EntryStr);\r
2077 Xtoi64 (StartStr, &CDROM->PartitionStart);\r
2078 Xtoi64 (SizeStr, &CDROM->PartitionSize);\r
2079\r
2080 return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;\r
2081}\r
2082\r
2083EFI_DEVICE_PATH_PROTOCOL *\r
2084DevPathFromTextVenMEDIA (\r
2085 IN CHAR16 *TextDeviceNode\r
2086 )\r
2087{\r
2088 return ConvertFromTextVendor (\r
2089 TextDeviceNode,\r
2090 MEDIA_DEVICE_PATH,\r
2091 MEDIA_VENDOR_DP\r
2092 );\r
2093}\r
2094\r
2095EFI_DEVICE_PATH_PROTOCOL *\r
2096DevPathFromTextFilePath (\r
2097 IN CHAR16 *TextDeviceNode\r
2098 )\r
2099{\r
2100 FILEPATH_DEVICE_PATH *File;\r
2101\r
2102 File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2103 MEDIA_DEVICE_PATH,\r
2104 MEDIA_FILEPATH_DP,\r
2105 sizeof (FILEPATH_DEVICE_PATH) + (UINT16) (StrLen (TextDeviceNode) * 2)\r
2106 );\r
2107\r
2108 StrCpy (File->PathName, TextDeviceNode);\r
2109\r
2110 return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
2111}\r
2112\r
2113EFI_DEVICE_PATH_PROTOCOL *\r
2114DevPathFromTextMedia (\r
2115 IN CHAR16 *TextDeviceNode\r
2116 )\r
2117{\r
2118 CHAR16 *GuidStr;\r
2119 MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
2120\r
2121 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2122 Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
2123 MEDIA_DEVICE_PATH,\r
2124 MEDIA_PROTOCOL_DP,\r
2125 sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
2126 );\r
2127\r
2128 StrToGuid (GuidStr, &Media->Protocol);\r
2129\r
2130 return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
2131}\r
2132\r
2133EFI_DEVICE_PATH_PROTOCOL *\r
2134DevPathFromTextBBS (\r
2135 IN CHAR16 *TextDeviceNode\r
2136 )\r
2137{\r
2138 CHAR16 *TypeStr;\r
2139 CHAR16 *IdStr;\r
2140 CHAR16 *FlagsStr;\r
2141 UINT8 *AsciiStr;\r
2142 BBS_BBS_DEVICE_PATH *Bbs;\r
2143\r
2144 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2145 IdStr = GetNextParamStr (&TextDeviceNode);\r
2146 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
2147 Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
2148 BBS_DEVICE_PATH,\r
2149 BBS_BBS_DP,\r
2150 sizeof (BBS_BBS_DEVICE_PATH) + (UINT16) (StrLen (IdStr))\r
2151 );\r
2152\r
2153 if (StrCmp (TypeStr, L"Floppy") == 0) {\r
2154 Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
2155 } else if (StrCmp (TypeStr, L"HD") == 0) {\r
2156 Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
2157 } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
2158 Bbs->DeviceType = BBS_TYPE_CDROM;\r
2159 } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
2160 Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
2161 } else if (StrCmp (TypeStr, L"USB") == 0) {\r
2162 Bbs->DeviceType = BBS_TYPE_USB;\r
2163 } else if (StrCmp (TypeStr, L"Network") == 0) {\r
2164 Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
2165 } else {\r
2166 Bbs->DeviceType = BBS_TYPE_UNKNOWN;\r
2167 }\r
2168\r
2169 AsciiStr = (UINT8 *) Bbs->String;\r
2170 StrToAscii (IdStr, (CHAR8 **) &AsciiStr);\r
2171\r
2172 Bbs->StatusFlag = (UINT16) Xtoi (FlagsStr);\r
2173\r
2174 return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
2175}\r
2176\r
2177GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
2178 {L"Pci", DevPathFromTextPci},\r
2179 {L"PcCard", DevPathFromTextPcCard},\r
2180 {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
2181 {L"VenHw", DevPathFromTextVenHw},\r
2182 {L"Ctrl", DevPathFromTextCtrl},\r
2183 {L"Acpi", DevPathFromTextAcpi},\r
2184 {L"PciRoot", DevPathFromTextPciRoot},\r
2185 {L"Floppy", DevPathFromTextFloppy},\r
2186 {L"Keyboard", DevPathFromTextKeyboard},\r
2187 {L"Serial", DevPathFromTextSerial},\r
2188 {L"ParallelPort", DevPathFromTextParallelPort},\r
2189 {L"AcpiEx", DevPathFromTextAcpiEx},\r
2190 {L"AcpiExp", DevPathFromTextAcpiExp},\r
2191 {L"Ata", DevPathFromTextAta},\r
2192 {L"Scsi", DevPathFromTextScsi},\r
2193 {L"Fibre", DevPathFromTextFibre},\r
2194 {L"I1394", DevPathFromText1394},\r
2195 {L"USB", DevPathFromTextUsb},\r
2196 {L"I2O", DevPathFromTextI2O},\r
2197 {L"Infiniband", DevPathFromTextInfiniband},\r
2198 {L"VenMsg", DevPathFromTextVenMsg},\r
2199 {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
2200 {L"VenVt100", DevPathFromTextVenVt100},\r
2201 {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
2202 {L"VenUtf8", DevPathFromTextVenUtf8},\r
2203 {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
2204 {L"SAS", DevPathFromTextSAS},\r
2205 {L"DebugPort", DevPathFromTextDebugPort},\r
2206 {L"MAC", DevPathFromTextMAC},\r
2207 {L"IPv4", DevPathFromTextIPv4},\r
2208 {L"IPv6", DevPathFromTextIPv6},\r
2209 {L"Uart", DevPathFromTextUart},\r
2210 {L"UsbClass", DevPathFromTextUsbClass},\r
2211 {L"UsbAudio", DevPathFromTextUsbAudio},\r
2212 {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
2213 {L"UsbHID", DevPathFromTextUsbHID},\r
2214 {L"UsbImage", DevPathFromTextUsbImage},\r
2215 {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
2216 {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
2217 {L"UsbHub", DevPathFromTextUsbHub},\r
2218 {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
2219 {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
2220 {L"UsbVideo", DevPathFromTextUsbVideo},\r
2221 {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
2222 {L"UsbWireless", DevPathFromTextUsbWireless},\r
2223 {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
2224 {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
2225 {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
2226 {L"UsbWwid", DevPathFromTextUsbWwid},\r
2227 {L"Unit", DevPathFromTextUnit},\r
2228 {L"iSCSI", DevPathFromTextiSCSI},\r
2229 {L"HD", DevPathFromTextHD},\r
2230 {L"CDROM", DevPathFromTextCDROM},\r
2231 {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
2232 {L"Media", DevPathFromTextMedia},\r
2233 {L"BBS", DevPathFromTextBBS},\r
2234 {NULL, NULL}\r
2235};\r
2236\r
2237EFI_DEVICE_PATH_PROTOCOL *\r
2238ConvertTextToDeviceNode (\r
2239 IN CONST CHAR16 *TextDeviceNode\r
2240 )\r
2241/*++\r
2242\r
2243 Routine Description:\r
2244 Convert text to the binary representation of a device node.\r
2245\r
2246 Arguments:\r
2247 TextDeviceNode - TextDeviceNode points to the text representation of a device\r
2248 node. Conversion starts with the first character and continues\r
2249 until the first non-device node character.\r
2250\r
2251 Returns:\r
2252 A pointer - Pointer to the EFI device node.\r
2253 NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.\r
2254\r
2255--*/\r
2256{\r
2257 EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
2258 CHAR16 *ParamStr;\r
2259 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2260 CHAR16 *DeviceNodeStr;\r
2261 UINTN Index;\r
2262\r
2263 if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
2264 return NULL;\r
2265 }\r
2266\r
2267 ParamStr = NULL;\r
2268 DumpNode = NULL;\r
2269 DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
2270\r
2271 for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
2272 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2273 if (ParamStr != NULL) {\r
2274 DumpNode = DevPathFromTextTable[Index].Function;\r
2275 break;\r
2276 }\r
2277 }\r
2278\r
2279 if (DumpNode == NULL) {\r
2280 //\r
2281 // A file path\r
2282 //\r
2283 DumpNode = DevPathFromTextFilePath;\r
2284 DeviceNode = DumpNode (DeviceNodeStr);\r
2285 } else {\r
2286 DeviceNode = DumpNode (ParamStr);\r
2287 gBS->FreePool (ParamStr);\r
2288 }\r
2289\r
2290 gBS->FreePool (DeviceNodeStr);\r
2291\r
2292 return DeviceNode;\r
2293}\r
2294\r
2295EFI_DEVICE_PATH_PROTOCOL *\r
2296ConvertTextToDevicePath (\r
2297 IN CONST CHAR16 *TextDevicePath\r
2298 )\r
2299/*++\r
2300\r
2301 Routine Description:\r
2302 Convert text to the binary representation of a device path.\r
2303\r
2304 Arguments:\r
2305 TextDevicePath - TextDevicePath points to the text representation of a device\r
2306 path. Conversion starts with the first character and continues\r
2307 until the first non-device node character.\r
2308\r
2309 Returns:\r
2310 A pointer - Pointer to the allocated device path.\r
2311 NULL - If TextDeviceNode is NULL or there was insufficient memory.\r
2312\r
2313--*/\r
2314{\r
2315 EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
2316 CHAR16 *ParamStr;\r
2317 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2318 UINTN Index;\r
2319 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
2320 CHAR16 *DevicePathStr;\r
2321 CHAR16 *Str;\r
2322 CHAR16 *DeviceNodeStr;\r
2323 UINT8 IsInstanceEnd;\r
2324 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
2325\r
2326 if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
2327 return NULL;\r
2328 }\r
2329\r
2330 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
2331 SetDevicePathEndNode (DevicePath);\r
2332\r
2333 ParamStr = NULL;\r
2334 DeviceNodeStr = NULL;\r
2335 DevicePathStr = StrDuplicate (TextDevicePath);\r
2336\r
2337 Str = DevicePathStr;\r
2338 while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
2339 DumpNode = NULL;\r
2340 for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
2341 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2342 if (ParamStr != NULL) {\r
2343 DumpNode = DevPathFromTextTable[Index].Function;\r
2344 break;\r
2345 }\r
2346 }\r
2347\r
2348 if (DumpNode == NULL) {\r
2349 //\r
2350 // A file path\r
2351 //\r
2352 DumpNode = DevPathFromTextFilePath;\r
2353 DeviceNode = DumpNode (DeviceNodeStr);\r
2354 } else {\r
2355 DeviceNode = DumpNode (ParamStr);\r
2356 gBS->FreePool (ParamStr);\r
2357 }\r
2358\r
2359 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2360 gBS->FreePool (DevicePath);\r
2361 gBS->FreePool (DeviceNode);\r
2362 DevicePath = NewDevicePath;\r
2363\r
2364 if (IsInstanceEnd) {\r
2365 DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
2366 SetDevicePathInstanceEndNode (DeviceNode);\r
2367\r
2368 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2369 gBS->FreePool (DevicePath);\r
2370 gBS->FreePool (DeviceNode);\r
2371 DevicePath = NewDevicePath;\r
2372 }\r
2373 }\r
2374\r
2375 gBS->FreePool (DevicePathStr);\r
2376 return DevicePath;\r
2377}\r