2 DevicePathFromText protocol as defined in the UEFI 2.0 specification.
4 Copyright (c) 2006 - 2008, 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
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.
15 #include "DevicePath.h"
38 Length
= StrLen ((CHAR16
*) Src
);
40 ReturnStr
= AllocateCopyPool ((Length
+ 1) * sizeof (CHAR16
), (VOID
*) Src
);
54 Get parameter in a pair of parentheses follow the given node name.
55 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
58 Str - Device Path Text
59 NodeName - Name of the node
62 Parameter text for the node
69 UINTN ParameterLength
;
72 // Check whether the node name matchs
74 NodeNameLength
= StrLen (NodeName
);
75 if (CompareMem (Str
, NodeName
, NodeNameLength
* sizeof (CHAR16
)) != 0) {
79 ParamStr
= Str
+ NodeNameLength
;
80 if (!IS_LEFT_PARENTH (*ParamStr
)) {
85 // Skip the found '(' and find first occurrence of ')'
89 StrPointer
= ParamStr
;
90 while (!IS_NULL (*StrPointer
)) {
91 if (IS_RIGHT_PARENTH (*StrPointer
)) {
97 if (IS_NULL (*StrPointer
)) {
104 ParamStr
= AllocateCopyPool ((ParameterLength
+ 1) * sizeof (CHAR16
), ParamStr
);
105 if (ParamStr
== NULL
) {
109 // Terminate the parameter string
111 ParamStr
[ParameterLength
] = L
'\0';
119 IN OUT CHAR16
**List
,
125 Get current sub-string from a string list, before return
126 the list header is moved to next sub-string. The sub-string is separated
127 by the specified character. For example, the separator is ',', the string
128 list is "2,0,3", it returns "2", the remain list move to "0,3"
131 List - A string list separated by the specified separator
132 Separator - The separator character
135 pointer - The current sub-string
145 if (IS_NULL (*Str
)) {
150 // Find first occurrence of the separator
152 while (!IS_NULL (*Str
)) {
153 if (*Str
== Separator
) {
159 if (*Str
== Separator
) {
161 // Find a sub-string, terminate it
168 // Move to next sub-string
182 // The separator is comma
184 return SplitStr (List
, L
',');
189 GetNextDeviceNodeStr (
190 IN OUT CHAR16
**DevicePath
,
191 OUT BOOLEAN
*IsInstanceEnd
196 Get one device node from entire device path text.
199 Str - The entire device path text string
200 IsInstanceEnd - This node is the end of a device path instance
203 a pointer - A device node text
204 NULL - No more device node available
210 UINTN ParenthesesStack
;
213 if (IS_NULL (*Str
)) {
218 // Skip the leading '/', '(', ')' and ','
220 while (!IS_NULL (*Str
)) {
221 if (!IS_SLASH (*Str
) &&
223 !IS_LEFT_PARENTH (*Str
) &&
224 !IS_RIGHT_PARENTH (*Str
)) {
233 // Scan for the separator of this device node, '/' or ','
235 ParenthesesStack
= 0;
236 while (!IS_NULL (*Str
)) {
237 if ((IS_COMMA (*Str
) || IS_SLASH (*Str
)) && (ParenthesesStack
== 0)) {
241 if (IS_LEFT_PARENTH (*Str
)) {
243 } else if (IS_RIGHT_PARENTH (*Str
)) {
250 if (ParenthesesStack
!= 0) {
252 // The '(' doesn't pair with ')', invalid device path text
257 if (IS_COMMA (*Str
)) {
258 *IsInstanceEnd
= TRUE
;
262 *IsInstanceEnd
= FALSE
;
263 if (!IS_NULL (*Str
)) {
284 Skip the leading white space and '0x' or '0X' of a integer string
287 Str - The integer string
288 IsHex - 1: Hex string, 0: Decimal string
297 // skip preceeding white space
299 while (*Str
&& *Str
== ' ') {
303 // skip preceeding zeros
305 while (*Str
&& *Str
== '0') {
309 // skip preceeding character 'x' or 'X'
311 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
328 Convert hex string to uint
341 ASSERT (Str
!= NULL
);
344 // convert hex digits
347 Length
= sizeof (UINTN
);
348 HexStringToBuf ((UINT8
*) &Rvalue
, &Length
, Str
, NULL
);
363 Convert hex string to 64 bit data.
376 Length
= sizeof (UINT64
);
377 HexStringToBuf ((UINT8
*) Data
, &Length
, Str
, NULL
);
389 Convert decimal string to uint
404 ASSERT (str
!= NULL
);
406 High
= (UINTN
) -1 / 10;
407 Low
= (UINTN
) -1 % 10;
409 // skip preceeding white space
411 while (*str
&& *str
== ' ') {
420 if (Char
>= '0' && Char
<= '9') {
421 if ((Rvalue
> High
|| Rvalue
== High
) && (Char
- '0' > (INTN
) Low
)) {
425 Rvalue
= (Rvalue
* 10) + Char
- '0';
446 Convert decimal string to uint
461 ASSERT (str
!= NULL
);
462 ASSERT (Data
!= NULL
);
465 // skip preceeding white space
467 while (*str
&& *str
== ' ') {
476 if (Char
>= '0' && Char
<= '9') {
477 High
= LShiftU64 (Rvalue
, 3);
478 Low
= LShiftU64 (Rvalue
, 1);
479 Rvalue
= High
+ Low
+ Char
- '0';
499 Convert integer string to uint.
503 Str - The integer string. If leading with "0x" or "0X", it's heximal.
511 Str
= TrimHexStr (Str
, &IsHex
);
530 Convert integer string to 64 bit data.
534 Str - The integer string. If leading with "0x" or "0X", it's heximal.
542 Str
= TrimHexStr (Str
, &IsHex
);
555 IN UINTN BufferLength
,
567 // Two hex char make up one byte
569 StrLength
= BufferLength
* sizeof (CHAR16
);
571 for(Index
= 0; Index
< StrLength
; Index
++, Str
++) {
573 IsHexDigit (&Digit
, *Str
);
576 // For odd charaters, write the upper nibble for each buffer byte,
577 // and for even characters, the lower nibble.
579 if ((Index
& 1) == 0) {
580 Byte
= (UINT8
) (Digit
<< 4);
582 Byte
= Buf
[Index
/ 2];
584 Byte
= (UINT8
) (Byte
| Digit
);
587 Buf
[Index
/ 2] = Byte
;
601 UINTN ConvertedStrLen
;
604 BufferLength
= sizeof (Guid
->Data1
);
605 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data1
, &BufferLength
, Str
, &ConvertedStrLen
);
606 if (EFI_ERROR (Status
)) {
609 Str
+= ConvertedStrLen
;
610 if (IS_HYPHEN (*Str
)) {
613 return EFI_UNSUPPORTED
;
616 BufferLength
= sizeof (Guid
->Data2
);
617 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data2
, &BufferLength
, Str
, &ConvertedStrLen
);
618 if (EFI_ERROR (Status
)) {
621 Str
+= ConvertedStrLen
;
622 if (IS_HYPHEN (*Str
)) {
625 return EFI_UNSUPPORTED
;
628 BufferLength
= sizeof (Guid
->Data3
);
629 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data3
, &BufferLength
, Str
, &ConvertedStrLen
);
630 if (EFI_ERROR (Status
)) {
633 Str
+= ConvertedStrLen
;
634 if (IS_HYPHEN (*Str
)) {
637 return EFI_UNSUPPORTED
;
640 StrToBuf (&Guid
->Data4
[0], 2, Str
);
642 // Skip 2 byte hex chars
646 if (IS_HYPHEN (*Str
)) {
649 return EFI_UNSUPPORTED
;
651 StrToBuf (&Guid
->Data4
[2], 6, Str
);
660 OUT EFI_IPv4_ADDRESS
*IPv4Addr
665 for (Index
= 0; Index
< 4; Index
++) {
666 IPv4Addr
->Addr
[Index
] = (UINT8
) Dtoi (SplitStr (Str
, L
'.'));
674 OUT EFI_IPv6_ADDRESS
*IPv6Addr
680 for (Index
= 0; Index
< 8; Index
++) {
681 Data
= (UINT16
) Xtoi (SplitStr (Str
, L
':'));
682 IPv6Addr
->Addr
[Index
* 2] = (UINT8
) (Data
>> 8);
683 IPv6Addr
->Addr
[Index
* 2 + 1] = (UINT8
) (Data
& 0xff);
691 IN OUT CHAR8
**AsciiStr
697 while (!IS_NULL (*Str
)) {
698 *(Dest
++) = (CHAR8
) *(Str
++);
703 // Return the string next to it
705 *AsciiStr
= Dest
+ 1;
709 EFI_DEVICE_PATH_PROTOCOL
*
711 IN CHAR16
*TextDeviceNode
716 PCI_DEVICE_PATH
*Pci
;
718 DeviceStr
= GetNextParamStr (&TextDeviceNode
);
719 FunctionStr
= GetNextParamStr (&TextDeviceNode
);
720 Pci
= (PCI_DEVICE_PATH
*) CreateDeviceNode (
721 HARDWARE_DEVICE_PATH
,
723 sizeof (PCI_DEVICE_PATH
)
726 Pci
->Function
= (UINT8
) Strtoi (FunctionStr
);
727 Pci
->Device
= (UINT8
) Strtoi (DeviceStr
);
729 return (EFI_DEVICE_PATH_PROTOCOL
*) Pci
;
733 EFI_DEVICE_PATH_PROTOCOL
*
734 DevPathFromTextPcCard (
735 IN CHAR16
*TextDeviceNode
738 CHAR16
*FunctionNumberStr
;
739 PCCARD_DEVICE_PATH
*Pccard
;
741 FunctionNumberStr
= GetNextParamStr (&TextDeviceNode
);
742 Pccard
= (PCCARD_DEVICE_PATH
*) CreateDeviceNode (
743 HARDWARE_DEVICE_PATH
,
745 sizeof (PCCARD_DEVICE_PATH
)
748 Pccard
->FunctionNumber
= (UINT8
) Strtoi (FunctionNumberStr
);
750 return (EFI_DEVICE_PATH_PROTOCOL
*) Pccard
;
754 EFI_DEVICE_PATH_PROTOCOL
*
755 DevPathFromTextMemoryMapped (
756 IN CHAR16
*TextDeviceNode
759 CHAR16
*MemoryTypeStr
;
760 CHAR16
*StartingAddressStr
;
761 CHAR16
*EndingAddressStr
;
762 MEMMAP_DEVICE_PATH
*MemMap
;
764 MemoryTypeStr
= GetNextParamStr (&TextDeviceNode
);
765 StartingAddressStr
= GetNextParamStr (&TextDeviceNode
);
766 EndingAddressStr
= GetNextParamStr (&TextDeviceNode
);
767 MemMap
= (MEMMAP_DEVICE_PATH
*) CreateDeviceNode (
768 HARDWARE_DEVICE_PATH
,
770 sizeof (MEMMAP_DEVICE_PATH
)
773 MemMap
->MemoryType
= (UINT32
) Strtoi (MemoryTypeStr
);
774 Strtoi64 (StartingAddressStr
, &MemMap
->StartingAddress
);
775 Strtoi64 (EndingAddressStr
, &MemMap
->EndingAddress
);
777 return (EFI_DEVICE_PATH_PROTOCOL
*) MemMap
;
781 EFI_DEVICE_PATH_PROTOCOL
*
782 ConvertFromTextVendor (
783 IN CHAR16
*TextDeviceNode
,
791 VENDOR_DEVICE_PATH
*Vendor
;
793 GuidStr
= GetNextParamStr (&TextDeviceNode
);
795 DataStr
= GetNextParamStr (&TextDeviceNode
);
796 Length
= StrLen (DataStr
);
798 // Two hex characters make up 1 buffer byte
800 Length
= (Length
+ 1) / 2;
802 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
805 (UINT16
) (sizeof (VENDOR_DEVICE_PATH
) + Length
)
808 StrToGuid (GuidStr
, &Vendor
->Guid
);
809 StrToBuf (((UINT8
*) Vendor
) + sizeof (VENDOR_DEVICE_PATH
), Length
, DataStr
);
811 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
815 EFI_DEVICE_PATH_PROTOCOL
*
816 DevPathFromTextVenHw (
817 IN CHAR16
*TextDeviceNode
820 return ConvertFromTextVendor (
822 HARDWARE_DEVICE_PATH
,
828 EFI_DEVICE_PATH_PROTOCOL
*
829 DevPathFromTextCtrl (
830 IN CHAR16
*TextDeviceNode
833 CHAR16
*ControllerStr
;
834 CONTROLLER_DEVICE_PATH
*Controller
;
836 ControllerStr
= GetNextParamStr (&TextDeviceNode
);
837 Controller
= (CONTROLLER_DEVICE_PATH
*) CreateDeviceNode (
838 HARDWARE_DEVICE_PATH
,
840 sizeof (CONTROLLER_DEVICE_PATH
)
842 Controller
->ControllerNumber
= (UINT32
) Strtoi (ControllerStr
);
844 return (EFI_DEVICE_PATH_PROTOCOL
*) Controller
;
856 PnpId
= Xtoi (Text
+ 3);
857 *EisaId
= (((Text
[0] - '@') & 0x1f) << 10) +
858 (((Text
[1] - '@') & 0x1f) << 5) +
859 ((Text
[2] - '@') & 0x1f) +
860 (UINT32
) (PnpId
<< 16);
863 EFI_DEVICE_PATH_PROTOCOL
*
864 DevPathFromTextAcpi (
865 IN CHAR16
*TextDeviceNode
870 ACPI_HID_DEVICE_PATH
*Acpi
;
872 HIDStr
= GetNextParamStr (&TextDeviceNode
);
873 UIDStr
= GetNextParamStr (&TextDeviceNode
);
874 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
877 sizeof (ACPI_HID_DEVICE_PATH
)
880 EisaIdFromText (HIDStr
, &Acpi
->HID
);
881 Acpi
->UID
= (UINT32
) Strtoi (UIDStr
);
883 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
887 EFI_DEVICE_PATH_PROTOCOL
*
888 ConvertFromTextAcpi (
889 IN CHAR16
*TextDeviceNode
,
894 ACPI_HID_DEVICE_PATH
*Acpi
;
896 UIDStr
= GetNextParamStr (&TextDeviceNode
);
897 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
900 sizeof (ACPI_HID_DEVICE_PATH
)
903 Acpi
->HID
= EFI_PNP_ID (PnPId
);
904 Acpi
->UID
= (UINT32
) Strtoi (UIDStr
);
906 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
910 EFI_DEVICE_PATH_PROTOCOL
*
911 DevPathFromTextPciRoot (
912 IN CHAR16
*TextDeviceNode
915 return ConvertFromTextAcpi (TextDeviceNode
, 0x0a03);
919 EFI_DEVICE_PATH_PROTOCOL
*
920 DevPathFromTextFloppy (
921 IN CHAR16
*TextDeviceNode
924 return ConvertFromTextAcpi (TextDeviceNode
, 0x0604);
928 EFI_DEVICE_PATH_PROTOCOL
*
929 DevPathFromTextKeyboard (
930 IN CHAR16
*TextDeviceNode
933 return ConvertFromTextAcpi (TextDeviceNode
, 0x0301);
937 EFI_DEVICE_PATH_PROTOCOL
*
938 DevPathFromTextSerial (
939 IN CHAR16
*TextDeviceNode
942 return ConvertFromTextAcpi (TextDeviceNode
, 0x0501);
946 EFI_DEVICE_PATH_PROTOCOL
*
947 DevPathFromTextParallelPort (
948 IN CHAR16
*TextDeviceNode
951 return ConvertFromTextAcpi (TextDeviceNode
, 0x0401);
955 EFI_DEVICE_PATH_PROTOCOL
*
956 DevPathFromTextAcpiEx (
957 IN CHAR16
*TextDeviceNode
968 ACPI_EXTENDED_HID_DEVICE_PATH
*AcpiEx
;
970 HIDStr
= GetNextParamStr (&TextDeviceNode
);
971 CIDStr
= GetNextParamStr (&TextDeviceNode
);
972 UIDStr
= GetNextParamStr (&TextDeviceNode
);
973 HIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
974 CIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
975 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
977 Length
= (UINT16
) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + StrLen (HIDSTRStr
) + 1);
978 Length
= (UINT16
) (Length
+ StrLen (UIDSTRStr
) + 1);
979 Length
= (UINT16
) (Length
+ StrLen (CIDSTRStr
) + 1);
980 AcpiEx
= (ACPI_EXTENDED_HID_DEVICE_PATH
*) CreateDeviceNode (
986 EisaIdFromText (HIDStr
, &AcpiEx
->HID
);
987 EisaIdFromText (CIDStr
, &AcpiEx
->CID
);
988 AcpiEx
->UID
= (UINT32
) Strtoi (UIDStr
);
990 AsciiStr
= (CHAR8
*) ((UINT8
*)AcpiEx
+ sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
));
991 StrToAscii (HIDSTRStr
, &AsciiStr
);
992 StrToAscii (UIDSTRStr
, &AsciiStr
);
993 StrToAscii (CIDSTRStr
, &AsciiStr
);
995 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiEx
;
999 EFI_DEVICE_PATH_PROTOCOL
*
1000 DevPathFromTextAcpiExp (
1001 IN CHAR16
*TextDeviceNode
1009 ACPI_EXTENDED_HID_DEVICE_PATH
*AcpiEx
;
1011 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1012 CIDStr
= GetNextParamStr (&TextDeviceNode
);
1013 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1014 Length
= (UINT16
) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + StrLen (UIDSTRStr
) + 3);
1015 AcpiEx
= (ACPI_EXTENDED_HID_DEVICE_PATH
*) CreateDeviceNode (
1021 EisaIdFromText (HIDStr
, &AcpiEx
->HID
);
1022 EisaIdFromText (CIDStr
, &AcpiEx
->CID
);
1025 AsciiStr
= (CHAR8
*) ((UINT8
*)AcpiEx
+ sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
));
1027 // HID string is NULL
1031 // Convert UID string
1034 StrToAscii (UIDSTRStr
, &AsciiStr
);
1036 // CID string is NULL
1040 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiEx
;
1044 EFI_DEVICE_PATH_PROTOCOL
*
1045 DevPathFromTextAta (
1046 IN CHAR16
*TextDeviceNode
1049 CHAR16
*PrimarySecondaryStr
;
1050 CHAR16
*SlaveMasterStr
;
1052 ATAPI_DEVICE_PATH
*Atapi
;
1054 Atapi
= (ATAPI_DEVICE_PATH
*) CreateDeviceNode (
1055 MESSAGING_DEVICE_PATH
,
1057 sizeof (ATAPI_DEVICE_PATH
)
1060 PrimarySecondaryStr
= GetNextParamStr (&TextDeviceNode
);
1061 SlaveMasterStr
= GetNextParamStr (&TextDeviceNode
);
1062 LunStr
= GetNextParamStr (&TextDeviceNode
);
1064 Atapi
->PrimarySecondary
= (UINT8
) ((StrCmp (PrimarySecondaryStr
, L
"Primary") == 0) ? 0 : 1);
1065 Atapi
->SlaveMaster
= (UINT8
) ((StrCmp (SlaveMasterStr
, L
"Master") == 0) ? 0 : 1);
1066 Atapi
->Lun
= (UINT16
) Strtoi (LunStr
);
1068 return (EFI_DEVICE_PATH_PROTOCOL
*) Atapi
;
1072 EFI_DEVICE_PATH_PROTOCOL
*
1073 DevPathFromTextScsi (
1074 IN CHAR16
*TextDeviceNode
1079 SCSI_DEVICE_PATH
*Scsi
;
1081 PunStr
= GetNextParamStr (&TextDeviceNode
);
1082 LunStr
= GetNextParamStr (&TextDeviceNode
);
1083 Scsi
= (SCSI_DEVICE_PATH
*) CreateDeviceNode (
1084 MESSAGING_DEVICE_PATH
,
1086 sizeof (SCSI_DEVICE_PATH
)
1089 Scsi
->Pun
= (UINT16
) Strtoi (PunStr
);
1090 Scsi
->Lun
= (UINT16
) Strtoi (LunStr
);
1092 return (EFI_DEVICE_PATH_PROTOCOL
*) Scsi
;
1096 EFI_DEVICE_PATH_PROTOCOL
*
1097 DevPathFromTextFibre (
1098 IN CHAR16
*TextDeviceNode
1103 FIBRECHANNEL_DEVICE_PATH
*Fibre
;
1105 WWNStr
= GetNextParamStr (&TextDeviceNode
);
1106 LunStr
= GetNextParamStr (&TextDeviceNode
);
1107 Fibre
= (FIBRECHANNEL_DEVICE_PATH
*) CreateDeviceNode (
1108 MESSAGING_DEVICE_PATH
,
1109 MSG_FIBRECHANNEL_DP
,
1110 sizeof (FIBRECHANNEL_DEVICE_PATH
)
1113 Fibre
->Reserved
= 0;
1114 Strtoi64 (WWNStr
, &Fibre
->WWN
);
1115 Strtoi64 (LunStr
, &Fibre
->Lun
);
1117 return (EFI_DEVICE_PATH_PROTOCOL
*) Fibre
;
1121 EFI_DEVICE_PATH_PROTOCOL
*
1122 DevPathFromText1394 (
1123 IN CHAR16
*TextDeviceNode
1127 F1394_DEVICE_PATH
*F1394
;
1129 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1130 F1394
= (F1394_DEVICE_PATH
*) CreateDeviceNode (
1131 MESSAGING_DEVICE_PATH
,
1133 sizeof (F1394_DEVICE_PATH
)
1136 F1394
->Reserved
= 0;
1137 Xtoi64 (GuidStr
, &F1394
->Guid
);
1139 return (EFI_DEVICE_PATH_PROTOCOL
*) F1394
;
1143 EFI_DEVICE_PATH_PROTOCOL
*
1144 DevPathFromTextUsb (
1145 IN CHAR16
*TextDeviceNode
1149 CHAR16
*InterfaceStr
;
1150 USB_DEVICE_PATH
*Usb
;
1152 PortStr
= GetNextParamStr (&TextDeviceNode
);
1153 InterfaceStr
= GetNextParamStr (&TextDeviceNode
);
1154 Usb
= (USB_DEVICE_PATH
*) CreateDeviceNode (
1155 MESSAGING_DEVICE_PATH
,
1157 sizeof (USB_DEVICE_PATH
)
1160 Usb
->ParentPortNumber
= (UINT8
) Strtoi (PortStr
);
1161 Usb
->InterfaceNumber
= (UINT8
) Strtoi (InterfaceStr
);
1163 return (EFI_DEVICE_PATH_PROTOCOL
*) Usb
;
1167 EFI_DEVICE_PATH_PROTOCOL
*
1168 DevPathFromTextI2O (
1169 IN CHAR16
*TextDeviceNode
1173 I2O_DEVICE_PATH
*I2O
;
1175 TIDStr
= GetNextParamStr (&TextDeviceNode
);
1176 I2O
= (I2O_DEVICE_PATH
*) CreateDeviceNode (
1177 MESSAGING_DEVICE_PATH
,
1179 sizeof (I2O_DEVICE_PATH
)
1182 I2O
->Tid
= (UINT32
) Strtoi (TIDStr
);
1184 return (EFI_DEVICE_PATH_PROTOCOL
*) I2O
;
1188 EFI_DEVICE_PATH_PROTOCOL
*
1189 DevPathFromTextInfiniband (
1190 IN CHAR16
*TextDeviceNode
1199 INFINIBAND_DEVICE_PATH
*InfiniBand
;
1201 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
1202 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1203 SidStr
= GetNextParamStr (&TextDeviceNode
);
1204 TidStr
= GetNextParamStr (&TextDeviceNode
);
1205 DidStr
= GetNextParamStr (&TextDeviceNode
);
1206 InfiniBand
= (INFINIBAND_DEVICE_PATH
*) CreateDeviceNode (
1207 MESSAGING_DEVICE_PATH
,
1209 sizeof (INFINIBAND_DEVICE_PATH
)
1212 InfiniBand
->ResourceFlags
= (UINT32
) Strtoi (FlagsStr
);
1213 StrToGuid (GuidStr
, &PortGid
);
1214 CopyMem (InfiniBand
->PortGid
, &PortGid
, sizeof (EFI_GUID
));
1215 Strtoi64 (SidStr
, &InfiniBand
->ServiceId
);
1216 Strtoi64 (TidStr
, &InfiniBand
->TargetPortId
);
1217 Strtoi64 (DidStr
, &InfiniBand
->DeviceId
);
1219 return (EFI_DEVICE_PATH_PROTOCOL
*) InfiniBand
;
1223 EFI_DEVICE_PATH_PROTOCOL
*
1224 DevPathFromTextVenMsg (
1225 IN CHAR16
*TextDeviceNode
1228 return ConvertFromTextVendor (
1230 MESSAGING_DEVICE_PATH
,
1236 EFI_DEVICE_PATH_PROTOCOL
*
1237 DevPathFromTextVenPcAnsi (
1238 IN CHAR16
*TextDeviceNode
1241 VENDOR_DEVICE_PATH
*Vendor
;
1243 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1244 MESSAGING_DEVICE_PATH
,
1246 sizeof (VENDOR_DEVICE_PATH
));
1247 CopyGuid (&Vendor
->Guid
, &gEfiPcAnsiGuid
);
1249 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1253 EFI_DEVICE_PATH_PROTOCOL
*
1254 DevPathFromTextVenVt100 (
1255 IN CHAR16
*TextDeviceNode
1258 VENDOR_DEVICE_PATH
*Vendor
;
1260 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1261 MESSAGING_DEVICE_PATH
,
1263 sizeof (VENDOR_DEVICE_PATH
));
1264 CopyGuid (&Vendor
->Guid
, &gEfiVT100Guid
);
1266 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1270 EFI_DEVICE_PATH_PROTOCOL
*
1271 DevPathFromTextVenVt100Plus (
1272 IN CHAR16
*TextDeviceNode
1275 VENDOR_DEVICE_PATH
*Vendor
;
1277 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1278 MESSAGING_DEVICE_PATH
,
1280 sizeof (VENDOR_DEVICE_PATH
));
1281 CopyGuid (&Vendor
->Guid
, &gEfiVT100PlusGuid
);
1283 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1287 EFI_DEVICE_PATH_PROTOCOL
*
1288 DevPathFromTextVenUtf8 (
1289 IN CHAR16
*TextDeviceNode
1292 VENDOR_DEVICE_PATH
*Vendor
;
1294 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1295 MESSAGING_DEVICE_PATH
,
1297 sizeof (VENDOR_DEVICE_PATH
));
1298 CopyGuid (&Vendor
->Guid
, &gEfiVTUTF8Guid
);
1300 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1304 EFI_DEVICE_PATH_PROTOCOL
*
1305 DevPathFromTextUartFlowCtrl (
1306 IN CHAR16
*TextDeviceNode
1310 UART_FLOW_CONTROL_DEVICE_PATH
*UartFlowControl
;
1312 ValueStr
= GetNextParamStr (&TextDeviceNode
);
1313 UartFlowControl
= (UART_FLOW_CONTROL_DEVICE_PATH
*) CreateDeviceNode (
1314 MESSAGING_DEVICE_PATH
,
1316 sizeof (UART_FLOW_CONTROL_DEVICE_PATH
)
1319 CopyGuid (&UartFlowControl
->Guid
, &mEfiDevicePathMessagingUartFlowControlGuid
);
1320 if (StrCmp (ValueStr
, L
"XonXoff") == 0) {
1321 UartFlowControl
->FlowControlMap
= 2;
1322 } else if (StrCmp (ValueStr
, L
"Hardware") == 0) {
1323 UartFlowControl
->FlowControlMap
= 1;
1325 UartFlowControl
->FlowControlMap
= 0;
1328 return (EFI_DEVICE_PATH_PROTOCOL
*) UartFlowControl
;
1332 EFI_DEVICE_PATH_PROTOCOL
*
1333 DevPathFromTextSAS (
1334 IN CHAR16
*TextDeviceNode
1341 CHAR16
*LocationStr
;
1343 CHAR16
*DriveBayStr
;
1344 CHAR16
*ReservedStr
;
1346 SAS_DEVICE_PATH
*Sas
;
1348 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1349 LunStr
= GetNextParamStr (&TextDeviceNode
);
1350 RTPStr
= GetNextParamStr (&TextDeviceNode
);
1351 SASSATAStr
= GetNextParamStr (&TextDeviceNode
);
1352 LocationStr
= GetNextParamStr (&TextDeviceNode
);
1353 ConnectStr
= GetNextParamStr (&TextDeviceNode
);
1354 DriveBayStr
= GetNextParamStr (&TextDeviceNode
);
1355 ReservedStr
= GetNextParamStr (&TextDeviceNode
);
1357 Sas
= (SAS_DEVICE_PATH
*) CreateDeviceNode (
1358 MESSAGING_DEVICE_PATH
,
1360 sizeof (SAS_DEVICE_PATH
)
1363 CopyGuid (&Sas
->Guid
, &mEfiDevicePathMessagingSASGuid
);
1364 Strtoi64 (AddressStr
, &Sas
->SasAddress
);
1365 Strtoi64 (LunStr
, &Sas
->Lun
);
1366 Sas
->RelativeTargetPort
= (UINT16
) Strtoi (RTPStr
);
1367 if (StrCmp (SASSATAStr
, L
"NoTopology") != 0) {
1368 if (StrCmp (DriveBayStr
, L
"0") == 0) {
1372 Info
= (UINT16
) (Info
| (Strtoi (DriveBayStr
) << 8));
1375 if (StrCmp (SASSATAStr
, L
"SATA") == 0) {
1379 if (StrCmp (LocationStr
, L
"External") == 0) {
1383 if (StrCmp (ConnectStr
, L
"Expanded") == 0) {
1388 Sas
->DeviceTopology
= Info
;
1389 Sas
->Reserved
= (UINT32
) Strtoi (ReservedStr
);
1391 return (EFI_DEVICE_PATH_PROTOCOL
*) Sas
;
1395 EFI_DEVICE_PATH_PROTOCOL
*
1396 DevPathFromTextDebugPort (
1397 IN CHAR16
*TextDeviceNode
1400 VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*Vend
;
1402 Vend
= (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*) CreateDeviceNode (
1403 MESSAGING_DEVICE_PATH
,
1405 sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
)
1408 CopyGuid (&Vend
->Guid
, &gEfiDebugPortProtocolGuid
);
1410 return (EFI_DEVICE_PATH_PROTOCOL
*) Vend
;
1414 EFI_DEVICE_PATH_PROTOCOL
*
1415 DevPathFromTextMAC (
1416 IN CHAR16
*TextDeviceNode
1422 MAC_ADDR_DEVICE_PATH
*MAC
;
1424 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1425 IfTypeStr
= GetNextParamStr (&TextDeviceNode
);
1426 MAC
= (MAC_ADDR_DEVICE_PATH
*) CreateDeviceNode (
1427 MESSAGING_DEVICE_PATH
,
1429 sizeof (MAC_ADDR_DEVICE_PATH
)
1432 MAC
->IfType
= (UINT8
) Strtoi (IfTypeStr
);
1434 Length
= sizeof (EFI_MAC_ADDRESS
);
1435 StrToBuf (&MAC
->MacAddress
.Addr
[0], Length
, AddressStr
);
1437 return (EFI_DEVICE_PATH_PROTOCOL
*) MAC
;
1441 EFI_DEVICE_PATH_PROTOCOL
*
1442 DevPathFromTextIPv4 (
1443 IN CHAR16
*TextDeviceNode
1446 CHAR16
*RemoteIPStr
;
1447 CHAR16
*ProtocolStr
;
1450 IPv4_DEVICE_PATH
*IPv4
;
1452 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1453 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1454 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1455 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1456 IPv4
= (IPv4_DEVICE_PATH
*) CreateDeviceNode (
1457 MESSAGING_DEVICE_PATH
,
1459 sizeof (IPv4_DEVICE_PATH
)
1462 StrToIPv4Addr (&RemoteIPStr
, &IPv4
->RemoteIpAddress
);
1463 IPv4
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1464 if (StrCmp (TypeStr
, L
"Static") == 0) {
1465 IPv4
->StaticIpAddress
= TRUE
;
1467 IPv4
->StaticIpAddress
= FALSE
;
1470 StrToIPv4Addr (&LocalIPStr
, &IPv4
->LocalIpAddress
);
1472 IPv4
->LocalPort
= 0;
1473 IPv4
->RemotePort
= 0;
1475 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv4
;
1479 EFI_DEVICE_PATH_PROTOCOL
*
1480 DevPathFromTextIPv6 (
1481 IN CHAR16
*TextDeviceNode
1484 CHAR16
*RemoteIPStr
;
1485 CHAR16
*ProtocolStr
;
1488 IPv6_DEVICE_PATH
*IPv6
;
1490 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1491 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1492 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1493 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1494 IPv6
= (IPv6_DEVICE_PATH
*) CreateDeviceNode (
1495 MESSAGING_DEVICE_PATH
,
1497 sizeof (IPv6_DEVICE_PATH
)
1500 StrToIPv6Addr (&RemoteIPStr
, &IPv6
->RemoteIpAddress
);
1501 IPv6
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1502 if (StrCmp (TypeStr
, L
"Static") == 0) {
1503 IPv6
->StaticIpAddress
= TRUE
;
1505 IPv6
->StaticIpAddress
= FALSE
;
1508 StrToIPv6Addr (&LocalIPStr
, &IPv6
->LocalIpAddress
);
1510 IPv6
->LocalPort
= 0;
1511 IPv6
->RemotePort
= 0;
1513 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv6
;
1517 EFI_DEVICE_PATH_PROTOCOL
*
1518 DevPathFromTextUart (
1519 IN CHAR16
*TextDeviceNode
1523 CHAR16
*DataBitsStr
;
1525 CHAR16
*StopBitsStr
;
1526 UART_DEVICE_PATH
*Uart
;
1528 BaudStr
= GetNextParamStr (&TextDeviceNode
);
1529 DataBitsStr
= GetNextParamStr (&TextDeviceNode
);
1530 ParityStr
= GetNextParamStr (&TextDeviceNode
);
1531 StopBitsStr
= GetNextParamStr (&TextDeviceNode
);
1532 Uart
= (UART_DEVICE_PATH
*) CreateDeviceNode (
1533 MESSAGING_DEVICE_PATH
,
1535 sizeof (UART_DEVICE_PATH
)
1538 Uart
->BaudRate
= (StrCmp (BaudStr
, L
"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr
);
1539 Uart
->DataBits
= (UINT8
) ((StrCmp (DataBitsStr
, L
"DEFAULT") == 0) ? 8 : Dtoi (DataBitsStr
));
1540 switch (*ParityStr
) {
1565 Uart
->Parity
= 0xff;
1568 if (StrCmp (StopBitsStr
, L
"D") == 0) {
1569 Uart
->StopBits
= (UINT8
) 0;
1570 } else if (StrCmp (StopBitsStr
, L
"1") == 0) {
1571 Uart
->StopBits
= (UINT8
) 1;
1572 } else if (StrCmp (StopBitsStr
, L
"1.5") == 0) {
1573 Uart
->StopBits
= (UINT8
) 2;
1574 } else if (StrCmp (StopBitsStr
, L
"2") == 0) {
1575 Uart
->StopBits
= (UINT8
) 3;
1577 Uart
->StopBits
= 0xff;
1580 return (EFI_DEVICE_PATH_PROTOCOL
*) Uart
;
1584 EFI_DEVICE_PATH_PROTOCOL
*
1585 ConvertFromTextUsbClass (
1586 IN CHAR16
*TextDeviceNode
,
1587 IN USB_CLASS_TEXT
*UsbClassText
1593 CHAR16
*SubClassStr
;
1594 CHAR16
*ProtocolStr
;
1595 USB_CLASS_DEVICE_PATH
*UsbClass
;
1597 UsbClass
= (USB_CLASS_DEVICE_PATH
*) CreateDeviceNode (
1598 MESSAGING_DEVICE_PATH
,
1600 sizeof (USB_CLASS_DEVICE_PATH
)
1603 VIDStr
= GetNextParamStr (&TextDeviceNode
);
1604 PIDStr
= GetNextParamStr (&TextDeviceNode
);
1605 if (UsbClassText
->ClassExist
) {
1606 ClassStr
= GetNextParamStr (&TextDeviceNode
);
1607 UsbClass
->DeviceClass
= (UINT8
) Strtoi (ClassStr
);
1609 UsbClass
->DeviceClass
= UsbClassText
->Class
;
1611 if (UsbClassText
->SubClassExist
) {
1612 SubClassStr
= GetNextParamStr (&TextDeviceNode
);
1613 UsbClass
->DeviceSubClass
= (UINT8
) Strtoi (SubClassStr
);
1615 UsbClass
->DeviceSubClass
= UsbClassText
->SubClass
;
1618 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1620 UsbClass
->VendorId
= (UINT16
) Strtoi (VIDStr
);
1621 UsbClass
->ProductId
= (UINT16
) Strtoi (PIDStr
);
1622 UsbClass
->DeviceProtocol
= (UINT8
) Strtoi (ProtocolStr
);
1624 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbClass
;
1629 EFI_DEVICE_PATH_PROTOCOL
*
1630 DevPathFromTextUsbClass (
1631 IN CHAR16
*TextDeviceNode
1634 USB_CLASS_TEXT UsbClassText
;
1636 UsbClassText
.ClassExist
= TRUE
;
1637 UsbClassText
.SubClassExist
= TRUE
;
1639 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1643 EFI_DEVICE_PATH_PROTOCOL
*
1644 DevPathFromTextUsbAudio (
1645 IN CHAR16
*TextDeviceNode
1648 USB_CLASS_TEXT UsbClassText
;
1650 UsbClassText
.ClassExist
= FALSE
;
1651 UsbClassText
.Class
= USB_CLASS_AUDIO
;
1652 UsbClassText
.SubClassExist
= TRUE
;
1654 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1658 EFI_DEVICE_PATH_PROTOCOL
*
1659 DevPathFromTextUsbCDCControl (
1660 IN CHAR16
*TextDeviceNode
1663 USB_CLASS_TEXT UsbClassText
;
1665 UsbClassText
.ClassExist
= FALSE
;
1666 UsbClassText
.Class
= USB_CLASS_CDCCONTROL
;
1667 UsbClassText
.SubClassExist
= TRUE
;
1669 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1673 EFI_DEVICE_PATH_PROTOCOL
*
1674 DevPathFromTextUsbHID (
1675 IN CHAR16
*TextDeviceNode
1678 USB_CLASS_TEXT UsbClassText
;
1680 UsbClassText
.ClassExist
= FALSE
;
1681 UsbClassText
.Class
= USB_CLASS_HID
;
1682 UsbClassText
.SubClassExist
= TRUE
;
1684 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1688 EFI_DEVICE_PATH_PROTOCOL
*
1689 DevPathFromTextUsbImage (
1690 IN CHAR16
*TextDeviceNode
1693 USB_CLASS_TEXT UsbClassText
;
1695 UsbClassText
.ClassExist
= FALSE
;
1696 UsbClassText
.Class
= USB_CLASS_IMAGE
;
1697 UsbClassText
.SubClassExist
= TRUE
;
1699 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1703 EFI_DEVICE_PATH_PROTOCOL
*
1704 DevPathFromTextUsbPrinter (
1705 IN CHAR16
*TextDeviceNode
1708 USB_CLASS_TEXT UsbClassText
;
1710 UsbClassText
.ClassExist
= FALSE
;
1711 UsbClassText
.Class
= USB_CLASS_PRINTER
;
1712 UsbClassText
.SubClassExist
= TRUE
;
1714 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1718 EFI_DEVICE_PATH_PROTOCOL
*
1719 DevPathFromTextUsbMassStorage (
1720 IN CHAR16
*TextDeviceNode
1723 USB_CLASS_TEXT UsbClassText
;
1725 UsbClassText
.ClassExist
= FALSE
;
1726 UsbClassText
.Class
= USB_CLASS_MASS_STORAGE
;
1727 UsbClassText
.SubClassExist
= TRUE
;
1729 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1733 EFI_DEVICE_PATH_PROTOCOL
*
1734 DevPathFromTextUsbHub (
1735 IN CHAR16
*TextDeviceNode
1738 USB_CLASS_TEXT UsbClassText
;
1740 UsbClassText
.ClassExist
= FALSE
;
1741 UsbClassText
.Class
= USB_CLASS_HUB
;
1742 UsbClassText
.SubClassExist
= TRUE
;
1744 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1748 EFI_DEVICE_PATH_PROTOCOL
*
1749 DevPathFromTextUsbCDCData (
1750 IN CHAR16
*TextDeviceNode
1753 USB_CLASS_TEXT UsbClassText
;
1755 UsbClassText
.ClassExist
= FALSE
;
1756 UsbClassText
.Class
= USB_CLASS_CDCDATA
;
1757 UsbClassText
.SubClassExist
= TRUE
;
1759 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1763 EFI_DEVICE_PATH_PROTOCOL
*
1764 DevPathFromTextUsbSmartCard (
1765 IN CHAR16
*TextDeviceNode
1768 USB_CLASS_TEXT UsbClassText
;
1770 UsbClassText
.ClassExist
= FALSE
;
1771 UsbClassText
.Class
= USB_CLASS_SMART_CARD
;
1772 UsbClassText
.SubClassExist
= TRUE
;
1774 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1778 EFI_DEVICE_PATH_PROTOCOL
*
1779 DevPathFromTextUsbVideo (
1780 IN CHAR16
*TextDeviceNode
1783 USB_CLASS_TEXT UsbClassText
;
1785 UsbClassText
.ClassExist
= FALSE
;
1786 UsbClassText
.Class
= USB_CLASS_VIDEO
;
1787 UsbClassText
.SubClassExist
= TRUE
;
1789 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1793 EFI_DEVICE_PATH_PROTOCOL
*
1794 DevPathFromTextUsbDiagnostic (
1795 IN CHAR16
*TextDeviceNode
1798 USB_CLASS_TEXT UsbClassText
;
1800 UsbClassText
.ClassExist
= FALSE
;
1801 UsbClassText
.Class
= USB_CLASS_DIAGNOSTIC
;
1802 UsbClassText
.SubClassExist
= TRUE
;
1804 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1808 EFI_DEVICE_PATH_PROTOCOL
*
1809 DevPathFromTextUsbWireless (
1810 IN CHAR16
*TextDeviceNode
1813 USB_CLASS_TEXT UsbClassText
;
1815 UsbClassText
.ClassExist
= FALSE
;
1816 UsbClassText
.Class
= USB_CLASS_WIRELESS
;
1817 UsbClassText
.SubClassExist
= TRUE
;
1819 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1823 EFI_DEVICE_PATH_PROTOCOL
*
1824 DevPathFromTextUsbDeviceFirmwareUpdate (
1825 IN CHAR16
*TextDeviceNode
1828 USB_CLASS_TEXT UsbClassText
;
1830 UsbClassText
.ClassExist
= FALSE
;
1831 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1832 UsbClassText
.SubClassExist
= FALSE
;
1833 UsbClassText
.SubClass
= USB_SUBCLASS_FW_UPDATE
;
1835 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1839 EFI_DEVICE_PATH_PROTOCOL
*
1840 DevPathFromTextUsbIrdaBridge (
1841 IN CHAR16
*TextDeviceNode
1844 USB_CLASS_TEXT UsbClassText
;
1846 UsbClassText
.ClassExist
= FALSE
;
1847 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1848 UsbClassText
.SubClassExist
= FALSE
;
1849 UsbClassText
.SubClass
= USB_SUBCLASS_IRDA_BRIDGE
;
1851 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1855 EFI_DEVICE_PATH_PROTOCOL
*
1856 DevPathFromTextUsbTestAndMeasurement (
1857 IN CHAR16
*TextDeviceNode
1860 USB_CLASS_TEXT UsbClassText
;
1862 UsbClassText
.ClassExist
= FALSE
;
1863 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1864 UsbClassText
.SubClassExist
= FALSE
;
1865 UsbClassText
.SubClass
= USB_SUBCLASS_TEST
;
1867 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1871 EFI_DEVICE_PATH_PROTOCOL
*
1872 DevPathFromTextUsbWwid (
1873 IN CHAR16
*TextDeviceNode
1878 CHAR16
*InterfaceNumStr
;
1879 CHAR16
*SerialNumberStr
;
1880 USB_WWID_DEVICE_PATH
*UsbWwid
;
1882 VIDStr
= GetNextParamStr (&TextDeviceNode
);
1883 PIDStr
= GetNextParamStr (&TextDeviceNode
);
1884 InterfaceNumStr
= GetNextParamStr (&TextDeviceNode
);
1885 SerialNumberStr
= GetNextParamStr (&TextDeviceNode
);
1886 UsbWwid
= (USB_WWID_DEVICE_PATH
*) CreateDeviceNode (
1887 MESSAGING_DEVICE_PATH
,
1889 (UINT16
) (sizeof (USB_WWID_DEVICE_PATH
) + StrSize (SerialNumberStr
))
1892 UsbWwid
->VendorId
= (UINT16
) Strtoi (VIDStr
);
1893 UsbWwid
->ProductId
= (UINT16
) Strtoi (PIDStr
);
1894 UsbWwid
->InterfaceNumber
= (UINT16
) Strtoi (InterfaceNumStr
);
1895 StrCpy ((CHAR16
*) ((UINT8
*) UsbWwid
+ sizeof (USB_WWID_DEVICE_PATH
)), SerialNumberStr
);
1897 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbWwid
;
1901 EFI_DEVICE_PATH_PROTOCOL
*
1902 DevPathFromTextUnit (
1903 IN CHAR16
*TextDeviceNode
1907 DEVICE_LOGICAL_UNIT_DEVICE_PATH
*LogicalUnit
;
1909 LunStr
= GetNextParamStr (&TextDeviceNode
);
1910 LogicalUnit
= (DEVICE_LOGICAL_UNIT_DEVICE_PATH
*) CreateDeviceNode (
1911 MESSAGING_DEVICE_PATH
,
1912 MSG_DEVICE_LOGICAL_UNIT_DP
,
1913 (UINT16
) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH
)
1916 LogicalUnit
->Lun
= (UINT8
) Strtoi (LunStr
);
1918 return (EFI_DEVICE_PATH_PROTOCOL
*) LogicalUnit
;
1922 EFI_DEVICE_PATH_PROTOCOL
*
1923 DevPathFromTextiSCSI (
1924 IN CHAR16
*TextDeviceNode
1929 CHAR16
*PortalGroupStr
;
1931 CHAR16
*HeaderDigestStr
;
1932 CHAR16
*DataDigestStr
;
1933 CHAR16
*AuthenticationStr
;
1934 CHAR16
*ProtocolStr
;
1936 ISCSI_DEVICE_PATH_WITH_NAME
*iSCSI
;
1938 NameStr
= GetNextParamStr (&TextDeviceNode
);
1939 PortalGroupStr
= GetNextParamStr (&TextDeviceNode
);
1940 LunStr
= GetNextParamStr (&TextDeviceNode
);
1941 HeaderDigestStr
= GetNextParamStr (&TextDeviceNode
);
1942 DataDigestStr
= GetNextParamStr (&TextDeviceNode
);
1943 AuthenticationStr
= GetNextParamStr (&TextDeviceNode
);
1944 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1945 iSCSI
= (ISCSI_DEVICE_PATH_WITH_NAME
*) CreateDeviceNode (
1946 MESSAGING_DEVICE_PATH
,
1948 (UINT16
) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME
) + StrLen (NameStr
))
1951 AsciiStr
= iSCSI
->iSCSITargetName
;
1952 StrToAscii (NameStr
, &AsciiStr
);
1954 iSCSI
->TargetPortalGroupTag
= (UINT16
) Strtoi (PortalGroupStr
);
1955 Strtoi64 (LunStr
, &iSCSI
->Lun
);
1958 if (StrCmp (HeaderDigestStr
, L
"CRC32C") == 0) {
1962 if (StrCmp (DataDigestStr
, L
"CRC32C") == 0) {
1966 if (StrCmp (AuthenticationStr
, L
"None") == 0) {
1970 if (StrCmp (AuthenticationStr
, L
"CHAP_UNI") == 0) {
1974 iSCSI
->LoginOption
= (UINT16
) Options
;
1976 iSCSI
->NetworkProtocol
= (UINT16
) StrCmp (ProtocolStr
, L
"TCP");
1978 return (EFI_DEVICE_PATH_PROTOCOL
*) iSCSI
;
1982 EFI_DEVICE_PATH_PROTOCOL
*
1984 IN CHAR16
*TextDeviceNode
1987 CHAR16
*PartitionStr
;
1989 CHAR16
*SignatureStr
;
1993 EFI_GUID SignatureGuid
;
1994 HARDDRIVE_DEVICE_PATH
*Hd
;
1996 PartitionStr
= GetNextParamStr (&TextDeviceNode
);
1997 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1998 SignatureStr
= GetNextParamStr (&TextDeviceNode
);
1999 StartStr
= GetNextParamStr (&TextDeviceNode
);
2000 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2001 Hd
= (HARDDRIVE_DEVICE_PATH
*) CreateDeviceNode (
2004 sizeof (HARDDRIVE_DEVICE_PATH
)
2007 Hd
->PartitionNumber
= (UINT32
) Dtoi (PartitionStr
);
2009 ZeroMem (Hd
->Signature
, 16);
2010 Hd
->MBRType
= (UINT8
) 0;
2012 if (StrCmp (TypeStr
, L
"MBR") == 0) {
2013 Hd
->SignatureType
= SIGNATURE_TYPE_MBR
;
2016 Signature32
= (UINT32
) Strtoi (SignatureStr
);
2017 CopyMem (Hd
->Signature
, &Signature32
, sizeof (UINT32
));
2018 } else if (StrCmp (TypeStr
, L
"GPT") == 0) {
2019 Hd
->SignatureType
= SIGNATURE_TYPE_GUID
;
2022 StrToGuid (SignatureStr
, &SignatureGuid
);
2023 CopyMem (Hd
->Signature
, &SignatureGuid
, sizeof (EFI_GUID
));
2025 Hd
->SignatureType
= (UINT8
) Strtoi (TypeStr
);
2028 Strtoi64 (StartStr
, &Hd
->PartitionStart
);
2029 Strtoi64 (SizeStr
, &Hd
->PartitionSize
);
2031 return (EFI_DEVICE_PATH_PROTOCOL
*) Hd
;
2035 EFI_DEVICE_PATH_PROTOCOL
*
2036 DevPathFromTextCDROM (
2037 IN CHAR16
*TextDeviceNode
2043 CDROM_DEVICE_PATH
*CDROM
;
2045 EntryStr
= GetNextParamStr (&TextDeviceNode
);
2046 StartStr
= GetNextParamStr (&TextDeviceNode
);
2047 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2048 CDROM
= (CDROM_DEVICE_PATH
*) CreateDeviceNode (
2051 sizeof (CDROM_DEVICE_PATH
)
2054 CDROM
->BootEntry
= (UINT32
) Strtoi (EntryStr
);
2055 Strtoi64 (StartStr
, &CDROM
->PartitionStart
);
2056 Strtoi64 (SizeStr
, &CDROM
->PartitionSize
);
2058 return (EFI_DEVICE_PATH_PROTOCOL
*) CDROM
;
2062 EFI_DEVICE_PATH_PROTOCOL
*
2063 DevPathFromTextVenMEDIA (
2064 IN CHAR16
*TextDeviceNode
2067 return ConvertFromTextVendor (
2075 EFI_DEVICE_PATH_PROTOCOL
*
2076 DevPathFromTextFilePath (
2077 IN CHAR16
*TextDeviceNode
2080 FILEPATH_DEVICE_PATH
*File
;
2082 File
= (FILEPATH_DEVICE_PATH
*) CreateDeviceNode (
2085 (UINT16
) (sizeof (FILEPATH_DEVICE_PATH
) + StrLen (TextDeviceNode
) * 2)
2088 StrCpy (File
->PathName
, TextDeviceNode
);
2090 return (EFI_DEVICE_PATH_PROTOCOL
*) File
;
2094 EFI_DEVICE_PATH_PROTOCOL
*
2095 DevPathFromTextMedia (
2096 IN CHAR16
*TextDeviceNode
2100 MEDIA_PROTOCOL_DEVICE_PATH
*Media
;
2102 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2103 Media
= (MEDIA_PROTOCOL_DEVICE_PATH
*) CreateDeviceNode (
2106 sizeof (MEDIA_PROTOCOL_DEVICE_PATH
)
2109 StrToGuid (GuidStr
, &Media
->Protocol
);
2111 return (EFI_DEVICE_PATH_PROTOCOL
*) Media
;
2115 EFI_DEVICE_PATH_PROTOCOL
*
2117 IN CHAR16
*TextDeviceNode
2121 MEDIA_FW_VOL_DEVICE_PATH
*Fv
;
2123 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2124 Fv
= (MEDIA_FW_VOL_DEVICE_PATH
*) CreateDeviceNode (
2126 MEDIA_PIWG_FW_VOL_DP
,
2127 sizeof (MEDIA_FW_VOL_DEVICE_PATH
)
2130 StrToGuid (GuidStr
, &Fv
->FvName
);
2132 return (EFI_DEVICE_PATH_PROTOCOL
*) Fv
;
2136 EFI_DEVICE_PATH_PROTOCOL
*
2137 DevPathFromTextFvFile (
2138 IN CHAR16
*TextDeviceNode
2142 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*FvFile
;
2144 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2145 FvFile
= (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*) CreateDeviceNode (
2147 MEDIA_PIWG_FW_FILE_DP
,
2148 sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
)
2151 StrToGuid (GuidStr
, &FvFile
->FvFileName
);
2153 return (EFI_DEVICE_PATH_PROTOCOL
*) FvFile
;
2157 EFI_DEVICE_PATH_PROTOCOL
*
2158 DevPathFromTextBBS (
2159 IN CHAR16
*TextDeviceNode
2166 BBS_BBS_DEVICE_PATH
*Bbs
;
2168 TypeStr
= GetNextParamStr (&TextDeviceNode
);
2169 IdStr
= GetNextParamStr (&TextDeviceNode
);
2170 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
2171 Bbs
= (BBS_BBS_DEVICE_PATH
*) CreateDeviceNode (
2174 (UINT16
) (sizeof (BBS_BBS_DEVICE_PATH
) + StrLen (IdStr
))
2177 if (StrCmp (TypeStr
, L
"Floppy") == 0) {
2178 Bbs
->DeviceType
= BBS_TYPE_FLOPPY
;
2179 } else if (StrCmp (TypeStr
, L
"HD") == 0) {
2180 Bbs
->DeviceType
= BBS_TYPE_HARDDRIVE
;
2181 } else if (StrCmp (TypeStr
, L
"CDROM") == 0) {
2182 Bbs
->DeviceType
= BBS_TYPE_CDROM
;
2183 } else if (StrCmp (TypeStr
, L
"PCMCIA") == 0) {
2184 Bbs
->DeviceType
= BBS_TYPE_PCMCIA
;
2185 } else if (StrCmp (TypeStr
, L
"USB") == 0) {
2186 Bbs
->DeviceType
= BBS_TYPE_USB
;
2187 } else if (StrCmp (TypeStr
, L
"Network") == 0) {
2188 Bbs
->DeviceType
= BBS_TYPE_EMBEDDED_NETWORK
;
2190 Bbs
->DeviceType
= (UINT16
) Strtoi (TypeStr
);
2193 AsciiStr
= Bbs
->String
;
2194 StrToAscii (IdStr
, &AsciiStr
);
2196 Bbs
->StatusFlag
= (UINT16
) Strtoi (FlagsStr
);
2198 return (EFI_DEVICE_PATH_PROTOCOL
*) Bbs
;
2202 EFI_DEVICE_PATH_PROTOCOL
*
2203 DevPathFromTextSata (
2204 IN CHAR16
*TextDeviceNode
2207 SATA_DEVICE_PATH
*Sata
;
2213 // The PMPN is optional.
2215 Param1
= GetNextParamStr (&TextDeviceNode
);
2216 Param2
= GetNextParamStr (&TextDeviceNode
);
2218 if (!IS_NULL (TextDeviceNode
)) {
2219 Param3
= GetNextParamStr (&TextDeviceNode
);
2222 Sata
= (SATA_DEVICE_PATH
*) CreateDeviceNode (
2223 MESSAGING_DEVICE_PATH
,
2225 sizeof (SATA_DEVICE_PATH
)
2227 Sata
->HBAPortNumber
= (UINT16
) Xtoi (Param1
);
2228 if (Param3
!= NULL
) {
2229 Sata
->PortMultiplierPortNumber
= (UINT16
) Xtoi (Param2
);
2232 Sata
->PortMultiplierPortNumber
= 0;
2234 Sata
->Lun
= (UINT16
) Xtoi (Param2
);
2236 return (EFI_DEVICE_PATH_PROTOCOL
*) Sata
;
2239 GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable
[] = {
2240 {L
"Pci", DevPathFromTextPci
},
2241 {L
"PcCard", DevPathFromTextPcCard
},
2242 {L
"MemoryMapped", DevPathFromTextMemoryMapped
},
2243 {L
"VenHw", DevPathFromTextVenHw
},
2244 {L
"Ctrl", DevPathFromTextCtrl
},
2245 {L
"Acpi", DevPathFromTextAcpi
},
2246 {L
"PciRoot", DevPathFromTextPciRoot
},
2247 {L
"Floppy", DevPathFromTextFloppy
},
2248 {L
"Keyboard", DevPathFromTextKeyboard
},
2249 {L
"Serial", DevPathFromTextSerial
},
2250 {L
"ParallelPort", DevPathFromTextParallelPort
},
2251 {L
"AcpiEx", DevPathFromTextAcpiEx
},
2252 {L
"AcpiExp", DevPathFromTextAcpiExp
},
2253 {L
"Ata", DevPathFromTextAta
},
2254 {L
"Scsi", DevPathFromTextScsi
},
2255 {L
"Fibre", DevPathFromTextFibre
},
2256 {L
"I1394", DevPathFromText1394
},
2257 {L
"USB", DevPathFromTextUsb
},
2258 {L
"I2O", DevPathFromTextI2O
},
2259 {L
"Infiniband", DevPathFromTextInfiniband
},
2260 {L
"VenMsg", DevPathFromTextVenMsg
},
2261 {L
"VenPcAnsi", DevPathFromTextVenPcAnsi
},
2262 {L
"VenVt100", DevPathFromTextVenVt100
},
2263 {L
"VenVt100Plus", DevPathFromTextVenVt100Plus
},
2264 {L
"VenUtf8", DevPathFromTextVenUtf8
},
2265 {L
"UartFlowCtrl", DevPathFromTextUartFlowCtrl
},
2266 {L
"SAS", DevPathFromTextSAS
},
2267 {L
"DebugPort", DevPathFromTextDebugPort
},
2268 {L
"MAC", DevPathFromTextMAC
},
2269 {L
"IPv4", DevPathFromTextIPv4
},
2270 {L
"IPv6", DevPathFromTextIPv6
},
2271 {L
"Uart", DevPathFromTextUart
},
2272 {L
"UsbClass", DevPathFromTextUsbClass
},
2273 {L
"UsbAudio", DevPathFromTextUsbAudio
},
2274 {L
"UsbCDCControl", DevPathFromTextUsbCDCControl
},
2275 {L
"UsbHID", DevPathFromTextUsbHID
},
2276 {L
"UsbImage", DevPathFromTextUsbImage
},
2277 {L
"UsbPrinter", DevPathFromTextUsbPrinter
},
2278 {L
"UsbMassStorage", DevPathFromTextUsbMassStorage
},
2279 {L
"UsbHub", DevPathFromTextUsbHub
},
2280 {L
"UsbCDCData", DevPathFromTextUsbCDCData
},
2281 {L
"UsbSmartCard", DevPathFromTextUsbSmartCard
},
2282 {L
"UsbVideo", DevPathFromTextUsbVideo
},
2283 {L
"UsbDiagnostic", DevPathFromTextUsbDiagnostic
},
2284 {L
"UsbWireless", DevPathFromTextUsbWireless
},
2285 {L
"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate
},
2286 {L
"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge
},
2287 {L
"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement
},
2288 {L
"UsbWwid", DevPathFromTextUsbWwid
},
2289 {L
"Unit", DevPathFromTextUnit
},
2290 {L
"iSCSI", DevPathFromTextiSCSI
},
2291 {L
"HD", DevPathFromTextHD
},
2292 {L
"CDROM", DevPathFromTextCDROM
},
2293 {L
"VenMEDIA", DevPathFromTextVenMEDIA
},
2294 {L
"Media", DevPathFromTextMedia
},
2295 {L
"Fv", DevPathFromTextFv
},
2296 {L
"FvFile", DevPathFromTextFvFile
},
2297 {L
"BBS", DevPathFromTextBBS
},
2298 {L
"Sata", DevPathFromTextSata
},
2302 EFI_DEVICE_PATH_PROTOCOL
*
2303 ConvertTextToDeviceNode (
2304 IN CONST CHAR16
*TextDeviceNode
2308 Routine Description:
2309 Convert text to the binary representation of a device node.
2312 TextDeviceNode - TextDeviceNode points to the text representation of a device
2313 node. Conversion starts with the first character and continues
2314 until the first non-device node character.
2317 A pointer - Pointer to the EFI device node.
2318 NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.
2322 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2324 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2325 CHAR16
*DeviceNodeStr
;
2328 if ((TextDeviceNode
== NULL
) || (IS_NULL (*TextDeviceNode
))) {
2334 DeviceNodeStr
= StrDuplicate (TextDeviceNode
);
2336 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2337 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2338 if (ParamStr
!= NULL
) {
2339 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2344 if (DumpNode
== NULL
) {
2348 DumpNode
= DevPathFromTextFilePath
;
2349 DeviceNode
= DumpNode (DeviceNodeStr
);
2351 DeviceNode
= DumpNode (ParamStr
);
2352 FreePool (ParamStr
);
2355 FreePool (DeviceNodeStr
);
2360 EFI_DEVICE_PATH_PROTOCOL
*
2361 ConvertTextToDevicePath (
2362 IN CONST CHAR16
*TextDevicePath
2366 Routine Description:
2367 Convert text to the binary representation of a device path.
2370 TextDevicePath - TextDevicePath points to the text representation of a device
2371 path. Conversion starts with the first character and continues
2372 until the first non-device node character.
2375 A pointer - Pointer to the allocated device path.
2376 NULL - If TextDeviceNode is NULL or there was insufficient memory.
2380 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2382 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2384 EFI_DEVICE_PATH_PROTOCOL
*NewDevicePath
;
2385 CHAR16
*DevicePathStr
;
2387 CHAR16
*DeviceNodeStr
;
2388 UINT8 IsInstanceEnd
;
2389 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2391 if ((TextDevicePath
== NULL
) || (IS_NULL (*TextDevicePath
))) {
2395 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2396 SetDevicePathEndNode (DevicePath
);
2399 DeviceNodeStr
= NULL
;
2400 DevicePathStr
= StrDuplicate (TextDevicePath
);
2402 Str
= DevicePathStr
;
2403 while ((DeviceNodeStr
= GetNextDeviceNodeStr (&Str
, &IsInstanceEnd
)) != NULL
) {
2405 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2406 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2407 if (ParamStr
!= NULL
) {
2408 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2413 if (DumpNode
== NULL
) {
2417 DumpNode
= DevPathFromTextFilePath
;
2418 DeviceNode
= DumpNode (DeviceNodeStr
);
2420 DeviceNode
= DumpNode (ParamStr
);
2421 FreePool (ParamStr
);
2424 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2425 FreePool (DevicePath
);
2426 FreePool (DeviceNode
);
2427 DevicePath
= NewDevicePath
;
2429 if (IsInstanceEnd
) {
2430 DeviceNode
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2431 SetDevicePathInstanceEndNode (DeviceNode
);
2433 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2434 FreePool (DevicePath
);
2435 FreePool (DeviceNode
);
2436 DevicePath
= NewDevicePath
;
2440 FreePool (DevicePathStr
);