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