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