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