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