3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 DevicePathFromText protocol as defined in the UEFI 2.0 specification.
22 #include "DevicePath.h"
45 Length
= StrLen ((CHAR16
*) Src
);
47 ReturnStr
= AllocateCopyPool ((Length
+ 1) * sizeof (CHAR16
), (VOID
*) Src
);
61 Get parameter in a pair of parentheses follow the given node name.
62 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
65 Str - Device Path Text
66 NodeName - Name of the node
69 Parameter text for the node
76 UINTN ParameterLength
;
79 // Check whether the node name matchs
81 NodeNameLength
= StrLen (NodeName
);
82 if (CompareMem (Str
, NodeName
, NodeNameLength
* sizeof (CHAR16
)) != 0) {
86 ParamStr
= Str
+ NodeNameLength
;
87 if (!IS_LEFT_PARENTH (*ParamStr
)) {
92 // Skip the found '(' and find first occurrence of ')'
96 StrPointer
= ParamStr
;
97 while (!IS_NULL (*StrPointer
)) {
98 if (IS_RIGHT_PARENTH (*StrPointer
)) {
104 if (IS_NULL (*StrPointer
)) {
111 ParamStr
= AllocateCopyPool ((ParameterLength
+ 1) * sizeof (CHAR16
), ParamStr
);
112 if (ParamStr
== NULL
) {
116 // Terminate the parameter string
118 ParamStr
[ParameterLength
] = L
'\0';
126 IN OUT CHAR16
**List
,
132 Get current sub-string from a string list, before return
133 the list header is moved to next sub-string. The sub-string is separated
134 by the specified character. For example, the separator is ',', the string
135 list is "2,0,3", it returns "2", the remain list move to "2,3"
138 List - A string list separated by the specified separator
139 Separator - The separator character
142 pointer - The current sub-string
152 if (IS_NULL (*Str
)) {
157 // Find first occurrence of the separator
159 while (!IS_NULL (*Str
)) {
160 if (*Str
== Separator
) {
166 if (*Str
== Separator
) {
168 // Find a sub-string, terminate it
175 // Move to next sub-string
189 // The separator is comma
191 return SplitStr (List
, L
',');
196 GetNextDeviceNodeStr (
197 IN OUT CHAR16
**DevicePath
,
198 OUT BOOLEAN
*IsInstanceEnd
203 Get one device node from entire device path text.
206 Str - The entire device path text string
207 IsInstanceEnd - This node is the end of a device path instance
210 a pointer - A device node text
211 NULL - No more device node available
217 UINTN ParenthesesStack
;
220 if (IS_NULL (*Str
)) {
225 // Skip the leading '/', '(', ')' and ','
227 while (!IS_NULL (*Str
)) {
228 if (!IS_SLASH (*Str
) &&
230 !IS_LEFT_PARENTH (*Str
) &&
231 !IS_RIGHT_PARENTH (*Str
)) {
240 // Scan for the separator of this device node, '/' or ','
242 ParenthesesStack
= 0;
243 while (!IS_NULL (*Str
)) {
244 if ((IS_COMMA (*Str
) || IS_SLASH (*Str
)) && (ParenthesesStack
== 0)) {
248 if (IS_LEFT_PARENTH (*Str
)) {
250 } else if (IS_RIGHT_PARENTH (*Str
)) {
257 if (ParenthesesStack
!= 0) {
259 // The '(' doesn't pair with ')', invalid device path text
264 if (IS_COMMA (*Str
)) {
265 *IsInstanceEnd
= TRUE
;
269 *IsInstanceEnd
= FALSE
;
270 if (!IS_NULL (*Str
)) {
290 Determines if a Unicode character is a hexadecimal digit.
291 The test is case insensitive.
294 Digit - Pointer to byte that receives the value of the hex character.
295 Char - Unicode character to test.
298 TRUE - If the character is a hexadecimal digit.
303 if ((Char
>= L
'0') && (Char
<= L
'9')) {
304 *Digit
= (UINT8
) (Char
- L
'0');
308 if ((Char
>= L
'A') && (Char
<= L
'F')) {
309 *Digit
= (UINT8
) (Char
- L
'A' + 0x0A);
313 if ((Char
>= L
'a') && (Char
<= L
'f')) {
314 *Digit
= (UINT8
) (Char
- L
'a' + 0x0A);
329 Converts the low nibble of a byte to hex unicode character.
332 Nibble - lower nibble of a byte.
335 Hex unicode character.
341 return (CHAR16
)(Nibble
+ L
'0');
344 return (CHAR16
)(Nibble
- 0xA + L
'A');
353 OUT UINTN
*ConvertedStrLen OPTIONAL
358 Converts Unicode string to binary buffer.
359 The conversion may be partial.
360 The first character in the string that is not hex digit stops the conversion.
361 At a minimum, any blob of data could be represented as a hex string.
364 Buf - Pointer to buffer that receives the data.
365 Len - Length in bytes of the buffer to hold converted data.
366 If routine return with EFI_SUCCESS, containing length of converted data.
367 If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.
368 Str - String to be converted from.
369 ConvertedStrLen - Length of the Hex String consumed.
372 EFI_SUCCESS: Routine Success.
373 EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.
385 // Find out how many hex characters the string has.
387 for (Idx
= 0, HexCnt
= 0; IsHexDigit (&Digit
, Str
[Idx
]); Idx
++, HexCnt
++);
394 // Two Unicode characters make up 1 buffer byte. Round up.
396 BufferLength
= (HexCnt
+ 1) / 2;
399 // Test if buffer is passed enough.
401 if (BufferLength
> (*Len
)) {
403 return EFI_BUFFER_TOO_SMALL
;
408 for (Idx
= 0; Idx
< HexCnt
; Idx
++) {
410 IsHexDigit (&Digit
, Str
[HexCnt
- 1 - Idx
]);
413 // For odd charaters, write the lower nibble for each buffer byte,
414 // and for even characters, the upper nibble.
416 if ((Idx
& 1) == 0) {
421 Byte
= (UINT8
) (Byte
| Digit
<< 4);
427 if (ConvertedStrLen
!= NULL
) {
428 *ConvertedStrLen
= HexCnt
;
438 IN OUT UINTN
*HexStringBufferLength
,
445 Converts binary buffer to Unicode string.
446 At a minimum, any blob of data could be represented as a hex string.
449 Str - Pointer to the string.
450 HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.
451 If routine return with EFI_SUCCESS, containing length of hex string buffer.
452 If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.
453 Buf - Buffer to be converted from.
454 Len - Length in bytes of the buffer to be converted.
457 EFI_SUCCESS: Routine success.
458 EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.
467 // Make sure string is either passed or allocate enough.
468 // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
469 // Plus the Unicode termination character.
472 if (StrLen
> ((*HexStringBufferLength
) - 1)) {
473 *HexStringBufferLength
= StrLen
+ 1;
474 return EFI_BUFFER_TOO_SMALL
;
477 *HexStringBufferLength
= StrLen
+ 1;
483 for (Idx
= 0; Idx
< Len
; Idx
++) {
486 Str
[StrLen
- 1 - Idx
* 2] = NibbleToHexChar (Byte
);
487 Str
[StrLen
- 2 - Idx
* 2] = NibbleToHexChar ((UINT8
)(Byte
>> 4));
501 Skip the leading white space and '0x' or '0X' of a hex string
511 // skip preceeding white space
513 while (*Str
&& *Str
== ' ') {
517 // skip preceeding zeros
519 while (*Str
&& *Str
== '0') {
523 // skip preceeding character 'x' or 'X'
525 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
541 Convert hex string to uint
554 ASSERT (Str
!= NULL
);
557 // convert hex digits
560 Length
= sizeof (UINTN
);
561 HexStringToBuf ((UINT8
*) &Rvalue
, &Length
, TrimHexStr (Str
), NULL
);
576 Convert hex string to 64 bit data.
589 Length
= sizeof (UINT64
);
590 HexStringToBuf ((UINT8
*) Data
, &Length
, TrimHexStr (Str
), NULL
);
602 Convert decimal string to uint
617 ASSERT (str
!= NULL
);
619 High
= (UINTN
) -1 / 10;
620 Low
= (UINTN
) -1 % 10;
622 // skip preceeding white space
624 while (*str
&& *str
== ' ') {
633 if (Char
>= '0' && Char
<= '9') {
634 if ((Rvalue
> High
|| Rvalue
== High
) && (Char
- '0' > (INTN
) Low
)) {
638 Rvalue
= (Rvalue
* 10) + Char
- '0';
653 IN UINTN BufferLength
,
663 // Two hex char make up one byte
665 StrLength
= BufferLength
* sizeof (CHAR16
);
667 for(Index
= 0; Index
< StrLength
; Index
++, Str
++) {
669 IsHexDigit (&Digit
, *Str
);
672 // For odd charaters, write the upper nibble for each buffer byte,
673 // and for even characters, the lower nibble.
675 if ((Index
& 1) == 0) {
676 Byte
= (UINT8
) (Digit
<< 4);
678 Byte
= Buf
[Index
/ 2];
680 Byte
= (UINT8
) (Byte
| Digit
);
683 Buf
[Index
/ 2] = Byte
;
697 UINTN ConvertedStrLen
;
700 BufferLength
= sizeof (Guid
->Data1
);
701 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data1
, &BufferLength
, Str
, &ConvertedStrLen
);
702 if (EFI_ERROR (Status
)) {
705 Str
+= ConvertedStrLen
;
706 if (IS_HYPHEN (*Str
)) {
709 return EFI_UNSUPPORTED
;
712 BufferLength
= sizeof (Guid
->Data2
);
713 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data2
, &BufferLength
, Str
, &ConvertedStrLen
);
714 if (EFI_ERROR (Status
)) {
717 Str
+= ConvertedStrLen
;
718 if (IS_HYPHEN (*Str
)) {
721 return EFI_UNSUPPORTED
;
724 BufferLength
= sizeof (Guid
->Data3
);
725 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data3
, &BufferLength
, Str
, &ConvertedStrLen
);
726 if (EFI_ERROR (Status
)) {
729 Str
+= ConvertedStrLen
;
730 if (IS_HYPHEN (*Str
)) {
733 return EFI_UNSUPPORTED
;
736 StrToBuf (&Guid
->Data4
[0], 2, Str
);
738 // Skip 2 byte hex chars
742 if (IS_HYPHEN (*Str
)) {
745 return EFI_UNSUPPORTED
;
747 StrToBuf (&Guid
->Data4
[2], 6, Str
);
756 OUT EFI_IPv4_ADDRESS
*IPv4Addr
761 for (Index
= 0; Index
< 4; Index
++) {
762 IPv4Addr
->Addr
[Index
] = (UINT8
) Atoi (SplitStr (Str
, L
'.'));
770 OUT EFI_IPv6_ADDRESS
*IPv6Addr
776 for (Index
= 0; Index
< 8; Index
++) {
777 Data
= (UINT16
) Xtoi (SplitStr (Str
, L
':'));
778 IPv6Addr
->Addr
[Index
* 2] = (UINT8
) (Data
>> 8);
779 IPv6Addr
->Addr
[Index
* 2 + 1] = (UINT8
) (Data
& 0xff);
787 IN OUT CHAR8
**AsciiStr
793 while (!IS_NULL (*Str
)) {
794 *(Dest
++) = (CHAR8
) *(Str
++);
799 // Return the string next to it
801 *AsciiStr
= Dest
+ 1;
805 EFI_DEVICE_PATH_PROTOCOL
*
807 IN CHAR16
*TextDeviceNode
812 PCI_DEVICE_PATH
*Pci
;
814 FunctionStr
= GetNextParamStr (&TextDeviceNode
);
815 DeviceStr
= GetNextParamStr (&TextDeviceNode
);
816 Pci
= (PCI_DEVICE_PATH
*) CreateDeviceNode (
817 HARDWARE_DEVICE_PATH
,
819 sizeof (PCI_DEVICE_PATH
)
822 Pci
->Function
= (UINT8
) Xtoi (FunctionStr
);
823 Pci
->Device
= (UINT8
) Xtoi (DeviceStr
);
825 return (EFI_DEVICE_PATH_PROTOCOL
*) Pci
;
829 EFI_DEVICE_PATH_PROTOCOL
*
830 DevPathFromTextPcCard (
831 IN CHAR16
*TextDeviceNode
834 CHAR16
*FunctionNumberStr
;
835 PCCARD_DEVICE_PATH
*Pccard
;
837 FunctionNumberStr
= GetNextParamStr (&TextDeviceNode
);
838 Pccard
= (PCCARD_DEVICE_PATH
*) CreateDeviceNode (
839 HARDWARE_DEVICE_PATH
,
841 sizeof (PCCARD_DEVICE_PATH
)
844 Pccard
->FunctionNumber
= (UINT8
) Xtoi (FunctionNumberStr
);
846 return (EFI_DEVICE_PATH_PROTOCOL
*) Pccard
;
850 EFI_DEVICE_PATH_PROTOCOL
*
851 DevPathFromTextMemoryMapped (
852 IN CHAR16
*TextDeviceNode
855 CHAR16
*StartingAddressStr
;
856 CHAR16
*EndingAddressStr
;
857 MEMMAP_DEVICE_PATH
*MemMap
;
859 StartingAddressStr
= GetNextParamStr (&TextDeviceNode
);
860 EndingAddressStr
= GetNextParamStr (&TextDeviceNode
);
861 MemMap
= (MEMMAP_DEVICE_PATH
*) CreateDeviceNode (
862 HARDWARE_DEVICE_PATH
,
864 sizeof (MEMMAP_DEVICE_PATH
)
867 MemMap
->MemoryType
= 0;
869 Xtoi64 (StartingAddressStr
, &MemMap
->StartingAddress
);
870 Xtoi64 (EndingAddressStr
, &MemMap
->EndingAddress
);
872 return (EFI_DEVICE_PATH_PROTOCOL
*) MemMap
;
876 EFI_DEVICE_PATH_PROTOCOL
*
877 ConvertFromTextVendor (
878 IN CHAR16
*TextDeviceNode
,
886 VENDOR_DEVICE_PATH
*Vendor
;
888 GuidStr
= GetNextParamStr (&TextDeviceNode
);
890 DataStr
= GetNextParamStr (&TextDeviceNode
);
891 Length
= StrLen (DataStr
);
893 // Two hex characters make up 1 buffer byte
895 Length
= (Length
+ 1) / 2;
897 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
900 sizeof (VENDOR_DEVICE_PATH
) + (UINT16
) Length
903 StrToGuid (GuidStr
, &Vendor
->Guid
);
904 StrToBuf (((UINT8
*) Vendor
) + sizeof (VENDOR_DEVICE_PATH
), Length
, DataStr
);
906 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
910 EFI_DEVICE_PATH_PROTOCOL
*
911 DevPathFromTextVenHw (
912 IN CHAR16
*TextDeviceNode
915 return ConvertFromTextVendor (
917 HARDWARE_DEVICE_PATH
,
923 EFI_DEVICE_PATH_PROTOCOL
*
924 DevPathFromTextCtrl (
925 IN CHAR16
*TextDeviceNode
928 CHAR16
*ControllerStr
;
929 CONTROLLER_DEVICE_PATH
*Controller
;
931 ControllerStr
= GetNextParamStr (&TextDeviceNode
);
932 Controller
= (CONTROLLER_DEVICE_PATH
*) CreateDeviceNode (
933 HARDWARE_DEVICE_PATH
,
935 sizeof (CONTROLLER_DEVICE_PATH
)
937 Controller
->ControllerNumber
= (UINT32
) Xtoi (ControllerStr
);
939 return (EFI_DEVICE_PATH_PROTOCOL
*) Controller
;
943 EFI_DEVICE_PATH_PROTOCOL
*
944 DevPathFromTextAcpi (
945 IN CHAR16
*TextDeviceNode
950 ACPI_HID_DEVICE_PATH
*Acpi
;
952 HIDStr
= GetNextParamStr (&TextDeviceNode
);
953 UIDStr
= GetNextParamStr (&TextDeviceNode
);
954 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
957 sizeof (ACPI_HID_DEVICE_PATH
)
960 if ((HIDStr
[0] == L
'P') && (HIDStr
[1] == L
'N') && (HIDStr
[2] == L
'P')) {
964 Acpi
->HID
= EISA_PNP_ID (Xtoi (HIDStr
));
965 Acpi
->UID
= (UINT32
) Xtoi (UIDStr
);
967 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
971 EFI_DEVICE_PATH_PROTOCOL
*
972 ConvertFromTextAcpi (
973 IN CHAR16
*TextDeviceNode
,
978 ACPI_HID_DEVICE_PATH
*Acpi
;
980 UIDStr
= GetNextParamStr (&TextDeviceNode
);
981 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
984 sizeof (ACPI_HID_DEVICE_PATH
)
988 Acpi
->UID
= (UINT32
) Xtoi (UIDStr
);
990 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
994 EFI_DEVICE_PATH_PROTOCOL
*
995 DevPathFromTextPciRoot (
996 IN CHAR16
*TextDeviceNode
999 return ConvertFromTextAcpi (TextDeviceNode
, 0x0a0341d0);
1003 EFI_DEVICE_PATH_PROTOCOL
*
1004 DevPathFromTextFloppy (
1005 IN CHAR16
*TextDeviceNode
1008 return ConvertFromTextAcpi (TextDeviceNode
, 0x060441d0);
1012 EFI_DEVICE_PATH_PROTOCOL
*
1013 DevPathFromTextKeyboard (
1014 IN CHAR16
*TextDeviceNode
1017 return ConvertFromTextAcpi (TextDeviceNode
, 0x030141d0);
1021 EFI_DEVICE_PATH_PROTOCOL
*
1022 DevPathFromTextSerial (
1023 IN CHAR16
*TextDeviceNode
1026 return ConvertFromTextAcpi (TextDeviceNode
, 0x050141d0);
1030 EFI_DEVICE_PATH_PROTOCOL
*
1031 DevPathFromTextParallelPort (
1032 IN CHAR16
*TextDeviceNode
1035 return ConvertFromTextAcpi (TextDeviceNode
, 0x040141d0);
1039 EFI_DEVICE_PATH_PROTOCOL
*
1040 DevPathFromTextAcpiEx (
1041 IN CHAR16
*TextDeviceNode
1052 ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR
*AcpiExt
;
1054 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1055 CIDStr
= GetNextParamStr (&TextDeviceNode
);
1056 UIDStr
= GetNextParamStr (&TextDeviceNode
);
1057 HIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1058 CIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1059 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1061 Length
= (UINT16
) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + StrLen (HIDSTRStr
) + 1);
1062 Length
= (UINT16
) (Length
+ StrLen (UIDSTRStr
) + 1);
1063 Length
= (UINT16
) (Length
+ StrLen (CIDSTRStr
) + 1);
1064 AcpiExt
= (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR
*) CreateDeviceNode (
1070 if ((HIDStr
[0] == L
'P') && (HIDStr
[1] == L
'N') && (HIDStr
[2] == L
'P')) {
1072 AcpiExt
->HID
= EISA_PNP_ID (Xtoi (HIDStr
));
1074 AcpiExt
->HID
= (UINT32
) Xtoi (HIDStr
);
1077 AcpiExt
->UID
= (UINT32
) Xtoi (UIDStr
);
1078 AcpiExt
->CID
= (UINT32
) Xtoi (CIDStr
);
1080 AsciiStr
= AcpiExt
->HidUidCidStr
;
1081 StrToAscii (HIDSTRStr
, &AsciiStr
);
1082 StrToAscii (UIDSTRStr
, &AsciiStr
);
1083 StrToAscii (CIDSTRStr
, &AsciiStr
);
1085 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiExt
;
1089 EFI_DEVICE_PATH_PROTOCOL
*
1090 DevPathFromTextAcpiExp (
1091 IN CHAR16
*TextDeviceNode
1099 ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR
*AcpiExt
;
1101 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1102 CIDStr
= GetNextParamStr (&TextDeviceNode
);
1103 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1104 Length
= sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + (UINT16
) StrLen (UIDSTRStr
) + 3;
1105 AcpiExt
= (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR
*) CreateDeviceNode (
1111 if ((HIDStr
[0] == L
'P') && (HIDStr
[1] == L
'N') && (HIDStr
[2] == L
'P')) {
1113 AcpiExt
->HID
= EISA_PNP_ID (Xtoi (HIDStr
));
1115 AcpiExt
->HID
= (UINT32
) Xtoi (HIDStr
);
1119 AcpiExt
->CID
= (UINT32
) Xtoi (CIDStr
);
1121 AsciiStr
= AcpiExt
->HidUidCidStr
;
1123 // HID string is NULL
1127 // Convert UID string
1130 StrToAscii (UIDSTRStr
, &AsciiStr
);
1132 // CID string is NULL
1136 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiExt
;
1140 EFI_DEVICE_PATH_PROTOCOL
*
1141 DevPathFromTextAta (
1142 IN CHAR16
*TextDeviceNode
1145 CHAR16
*PrimarySecondaryStr
;
1146 CHAR16
*SlaveMasterStr
;
1148 ATAPI_DEVICE_PATH
*Atapi
;
1150 Atapi
= (ATAPI_DEVICE_PATH
*) CreateDeviceNode (
1151 MESSAGING_DEVICE_PATH
,
1153 sizeof (ATAPI_DEVICE_PATH
)
1156 PrimarySecondaryStr
= GetNextParamStr (&TextDeviceNode
);
1157 SlaveMasterStr
= GetNextParamStr (&TextDeviceNode
);
1158 LunStr
= GetNextParamStr (&TextDeviceNode
);
1160 Atapi
->PrimarySecondary
= (UINT8
) ((StrCmp (PrimarySecondaryStr
, L
"Primary") == 0) ? 0 : 1);
1161 Atapi
->SlaveMaster
= (UINT8
) ((StrCmp (SlaveMasterStr
, L
"Master") == 0) ? 0 : 1);
1162 Atapi
->Lun
= (UINT16
) Xtoi (LunStr
);
1164 return (EFI_DEVICE_PATH_PROTOCOL
*) Atapi
;
1168 EFI_DEVICE_PATH_PROTOCOL
*
1169 DevPathFromTextScsi (
1170 IN CHAR16
*TextDeviceNode
1175 SCSI_DEVICE_PATH
*Scsi
;
1177 PunStr
= GetNextParamStr (&TextDeviceNode
);
1178 LunStr
= GetNextParamStr (&TextDeviceNode
);
1179 Scsi
= (SCSI_DEVICE_PATH
*) CreateDeviceNode (
1180 MESSAGING_DEVICE_PATH
,
1182 sizeof (SCSI_DEVICE_PATH
)
1185 Scsi
->Pun
= (UINT16
) Xtoi (PunStr
);
1186 Scsi
->Lun
= (UINT16
) Xtoi (LunStr
);
1188 return (EFI_DEVICE_PATH_PROTOCOL
*) Scsi
;
1192 EFI_DEVICE_PATH_PROTOCOL
*
1193 DevPathFromTextFibre (
1194 IN CHAR16
*TextDeviceNode
1199 FIBRECHANNEL_DEVICE_PATH
*Fibre
;
1201 WWNStr
= GetNextParamStr (&TextDeviceNode
);
1202 LunStr
= GetNextParamStr (&TextDeviceNode
);
1203 Fibre
= (FIBRECHANNEL_DEVICE_PATH
*) CreateDeviceNode (
1204 MESSAGING_DEVICE_PATH
,
1205 MSG_FIBRECHANNEL_DP
,
1206 sizeof (FIBRECHANNEL_DEVICE_PATH
)
1209 Fibre
->Reserved
= 0;
1210 Xtoi64 (WWNStr
, &Fibre
->WWN
);
1211 Xtoi64 (LunStr
, &Fibre
->Lun
);
1213 return (EFI_DEVICE_PATH_PROTOCOL
*) Fibre
;
1217 EFI_DEVICE_PATH_PROTOCOL
*
1218 DevPathFromText1394 (
1219 IN CHAR16
*TextDeviceNode
1223 F1394_DEVICE_PATH
*F1394
;
1225 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1226 F1394
= (F1394_DEVICE_PATH
*) CreateDeviceNode (
1227 MESSAGING_DEVICE_PATH
,
1229 sizeof (F1394_DEVICE_PATH
)
1232 F1394
->Reserved
= 0;
1233 Xtoi64 (GuidStr
, &F1394
->Guid
);
1235 return (EFI_DEVICE_PATH_PROTOCOL
*) F1394
;
1239 EFI_DEVICE_PATH_PROTOCOL
*
1240 DevPathFromTextUsb (
1241 IN CHAR16
*TextDeviceNode
1245 CHAR16
*InterfaceStr
;
1246 USB_DEVICE_PATH
*Usb
;
1248 PortStr
= GetNextParamStr (&TextDeviceNode
);
1249 InterfaceStr
= GetNextParamStr (&TextDeviceNode
);
1250 Usb
= (USB_DEVICE_PATH
*) CreateDeviceNode (
1251 MESSAGING_DEVICE_PATH
,
1253 sizeof (USB_DEVICE_PATH
)
1256 Usb
->ParentPortNumber
= (UINT8
) Xtoi (PortStr
);
1257 Usb
->InterfaceNumber
= (UINT8
) Xtoi (InterfaceStr
);
1259 return (EFI_DEVICE_PATH_PROTOCOL
*) Usb
;
1263 EFI_DEVICE_PATH_PROTOCOL
*
1264 DevPathFromTextI2O (
1265 IN CHAR16
*TextDeviceNode
1269 I2O_DEVICE_PATH
*I2O
;
1271 TIDStr
= GetNextParamStr (&TextDeviceNode
);
1272 I2O
= (I2O_DEVICE_PATH
*) CreateDeviceNode (
1273 MESSAGING_DEVICE_PATH
,
1275 sizeof (I2O_DEVICE_PATH
)
1278 I2O
->Tid
= (UINT32
) Xtoi (TIDStr
);
1280 return (EFI_DEVICE_PATH_PROTOCOL
*) I2O
;
1284 EFI_DEVICE_PATH_PROTOCOL
*
1285 DevPathFromTextInfiniband (
1286 IN CHAR16
*TextDeviceNode
1295 INFINIBAND_DEVICE_PATH
*InfiniBand
;
1297 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
1298 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1299 SidStr
= GetNextParamStr (&TextDeviceNode
);
1300 TidStr
= GetNextParamStr (&TextDeviceNode
);
1301 DidStr
= GetNextParamStr (&TextDeviceNode
);
1302 InfiniBand
= (INFINIBAND_DEVICE_PATH
*) CreateDeviceNode (
1303 MESSAGING_DEVICE_PATH
,
1305 sizeof (INFINIBAND_DEVICE_PATH
)
1308 InfiniBand
->ResourceFlags
= (UINT32
) Xtoi (FlagsStr
);
1309 StrToGuid (GuidStr
, &PortGid
);
1310 CopyMem (InfiniBand
->PortGid
, &PortGid
, sizeof (EFI_GUID
));
1311 Xtoi64 (SidStr
, &InfiniBand
->ServiceId
);
1312 Xtoi64 (TidStr
, &InfiniBand
->TargetPortId
);
1313 Xtoi64 (DidStr
, &InfiniBand
->DeviceId
);
1315 return (EFI_DEVICE_PATH_PROTOCOL
*) InfiniBand
;
1319 EFI_DEVICE_PATH_PROTOCOL
*
1320 DevPathFromTextVenMsg (
1321 IN CHAR16
*TextDeviceNode
1324 return ConvertFromTextVendor (
1326 MESSAGING_DEVICE_PATH
,
1332 EFI_DEVICE_PATH_PROTOCOL
*
1333 DevPathFromTextVenPcAnsi (
1334 IN CHAR16
*TextDeviceNode
1337 VENDOR_DEVICE_PATH
*Vendor
;
1339 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1340 MESSAGING_DEVICE_PATH
,
1342 sizeof (VENDOR_DEVICE_PATH
));
1343 CopyGuid (&Vendor
->Guid
, &gEfiPcAnsiGuid
);
1345 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1349 EFI_DEVICE_PATH_PROTOCOL
*
1350 DevPathFromTextVenVt100 (
1351 IN CHAR16
*TextDeviceNode
1354 VENDOR_DEVICE_PATH
*Vendor
;
1356 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1357 MESSAGING_DEVICE_PATH
,
1359 sizeof (VENDOR_DEVICE_PATH
));
1360 CopyGuid (&Vendor
->Guid
, &gEfiVT100Guid
);
1362 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1366 EFI_DEVICE_PATH_PROTOCOL
*
1367 DevPathFromTextVenVt100Plus (
1368 IN CHAR16
*TextDeviceNode
1371 VENDOR_DEVICE_PATH
*Vendor
;
1373 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1374 MESSAGING_DEVICE_PATH
,
1376 sizeof (VENDOR_DEVICE_PATH
));
1377 CopyGuid (&Vendor
->Guid
, &gEfiVT100PlusGuid
);
1379 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1383 EFI_DEVICE_PATH_PROTOCOL
*
1384 DevPathFromTextVenUtf8 (
1385 IN CHAR16
*TextDeviceNode
1388 VENDOR_DEVICE_PATH
*Vendor
;
1390 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1391 MESSAGING_DEVICE_PATH
,
1393 sizeof (VENDOR_DEVICE_PATH
));
1394 CopyGuid (&Vendor
->Guid
, &gEfiVTUTF8Guid
);
1396 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1400 EFI_DEVICE_PATH_PROTOCOL
*
1401 DevPathFromTextUartFlowCtrl (
1402 IN CHAR16
*TextDeviceNode
1406 UART_FLOW_CONTROL_DEVICE_PATH
*UartFlowControl
;
1408 ValueStr
= GetNextParamStr (&TextDeviceNode
);
1409 UartFlowControl
= (UART_FLOW_CONTROL_DEVICE_PATH
*) CreateDeviceNode (
1410 MESSAGING_DEVICE_PATH
,
1412 sizeof (UART_FLOW_CONTROL_DEVICE_PATH
)
1415 CopyGuid (&UartFlowControl
->Guid
, &mEfiDevicePathMessagingUartFlowControlGuid
);
1416 if (StrCmp (ValueStr
, L
"XonXoff") == 0) {
1417 UartFlowControl
->FlowControlMap
= 2;
1418 } else if (StrCmp (ValueStr
, L
"Hardware") == 0) {
1419 UartFlowControl
->FlowControlMap
= 1;
1421 UartFlowControl
->FlowControlMap
= 0;
1424 return (EFI_DEVICE_PATH_PROTOCOL
*) UartFlowControl
;
1428 EFI_DEVICE_PATH_PROTOCOL
*
1429 DevPathFromTextSAS (
1430 IN CHAR16
*TextDeviceNode
1437 CHAR16
*LocationStr
;
1439 CHAR16
*DriveBayStr
;
1440 CHAR16
*ReservedStr
;
1442 SAS_DEVICE_PATH
*Sas
;
1444 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1445 LunStr
= GetNextParamStr (&TextDeviceNode
);
1446 RTPStr
= GetNextParamStr (&TextDeviceNode
);
1447 SASSATAStr
= GetNextParamStr (&TextDeviceNode
);
1448 LocationStr
= GetNextParamStr (&TextDeviceNode
);
1449 ConnectStr
= GetNextParamStr (&TextDeviceNode
);
1450 DriveBayStr
= GetNextParamStr (&TextDeviceNode
);
1451 ReservedStr
= GetNextParamStr (&TextDeviceNode
);
1453 Sas
= (SAS_DEVICE_PATH
*) CreateDeviceNode (
1454 MESSAGING_DEVICE_PATH
,
1456 sizeof (SAS_DEVICE_PATH
)
1459 CopyGuid (&Sas
->Guid
, &mEfiDevicePathMessagingSASGuid
);
1460 Xtoi64 (AddressStr
, &Sas
->SasAddress
);
1461 Xtoi64 (LunStr
, &Sas
->Lun
);
1462 Sas
->RelativeTargetPort
= (UINT16
) Xtoi (RTPStr
);
1463 if (StrCmp (SASSATAStr
, L
"NoTopology") == 0)
1466 if (StrCmp (DriveBayStr
, L
"0") == 0) {
1470 Info
|= (Xtoi (DriveBayStr
) << 8);
1473 if (StrCmp (SASSATAStr
, L
"SATA") == 0) {
1477 if (StrCmp (LocationStr
, L
"External") == 0) {
1481 if (StrCmp (ConnectStr
, L
"Expanded") == 0) {
1486 Sas
->DeviceTopology
= Info
;
1487 Sas
->Reserved
= (UINT32
) Xtoi (ReservedStr
);
1489 return (EFI_DEVICE_PATH_PROTOCOL
*) Sas
;
1493 EFI_DEVICE_PATH_PROTOCOL
*
1494 DevPathFromTextDebugPort (
1495 IN CHAR16
*TextDeviceNode
1498 VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*Vend
;
1500 Vend
= (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*) CreateDeviceNode (
1501 MESSAGING_DEVICE_PATH
,
1503 sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
)
1506 CopyGuid (&Vend
->Guid
, &gEfiDebugPortProtocolGuid
);
1508 return (EFI_DEVICE_PATH_PROTOCOL
*) Vend
;
1512 EFI_DEVICE_PATH_PROTOCOL
*
1513 DevPathFromTextMAC (
1514 IN CHAR16
*TextDeviceNode
1520 MAC_ADDR_DEVICE_PATH
*MAC
;
1522 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1523 IfTypeStr
= GetNextParamStr (&TextDeviceNode
);
1524 MAC
= (MAC_ADDR_DEVICE_PATH
*) CreateDeviceNode (
1525 MESSAGING_DEVICE_PATH
,
1527 sizeof (MAC_ADDR_DEVICE_PATH
)
1530 MAC
->IfType
= (UINT8
) Xtoi (IfTypeStr
);
1532 Length
= sizeof (EFI_MAC_ADDRESS
);
1533 StrToBuf (&MAC
->MacAddress
.Addr
[0], Length
, AddressStr
);
1535 return (EFI_DEVICE_PATH_PROTOCOL
*) MAC
;
1539 EFI_DEVICE_PATH_PROTOCOL
*
1540 DevPathFromTextIPv4 (
1541 IN CHAR16
*TextDeviceNode
1544 CHAR16
*RemoteIPStr
;
1545 CHAR16
*ProtocolStr
;
1548 IPv4_DEVICE_PATH
*IPv4
;
1550 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1551 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1552 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1553 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1554 IPv4
= (IPv4_DEVICE_PATH
*) CreateDeviceNode (
1555 MESSAGING_DEVICE_PATH
,
1557 sizeof (IPv4_DEVICE_PATH
)
1560 StrToIPv4Addr (&RemoteIPStr
, &IPv4
->RemoteIpAddress
);
1561 IPv4
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1562 if (StrCmp (TypeStr
, L
"Static") == 0) {
1563 IPv4
->StaticIpAddress
= TRUE
;
1565 IPv4
->StaticIpAddress
= FALSE
;
1568 StrToIPv4Addr (&LocalIPStr
, &IPv4
->LocalIpAddress
);
1570 IPv4
->LocalPort
= 0;
1571 IPv4
->RemotePort
= 0;
1573 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv4
;
1577 EFI_DEVICE_PATH_PROTOCOL
*
1578 DevPathFromTextIPv6 (
1579 IN CHAR16
*TextDeviceNode
1582 CHAR16
*RemoteIPStr
;
1583 CHAR16
*ProtocolStr
;
1586 IPv6_DEVICE_PATH
*IPv6
;
1588 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1589 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1590 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1591 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1592 IPv6
= (IPv6_DEVICE_PATH
*) CreateDeviceNode (
1593 MESSAGING_DEVICE_PATH
,
1595 sizeof (IPv6_DEVICE_PATH
)
1598 StrToIPv6Addr (&RemoteIPStr
, &IPv6
->RemoteIpAddress
);
1599 IPv6
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1600 if (StrCmp (TypeStr
, L
"Static") == 0) {
1601 IPv6
->StaticIpAddress
= TRUE
;
1603 IPv6
->StaticIpAddress
= FALSE
;
1606 StrToIPv6Addr (&LocalIPStr
, &IPv6
->LocalIpAddress
);
1608 IPv6
->LocalPort
= 0;
1609 IPv6
->RemotePort
= 0;
1611 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv6
;
1615 EFI_DEVICE_PATH_PROTOCOL
*
1616 DevPathFromTextUart (
1617 IN CHAR16
*TextDeviceNode
1621 CHAR16
*DataBitsStr
;
1623 CHAR16
*StopBitsStr
;
1624 UART_DEVICE_PATH
*Uart
;
1626 BaudStr
= GetNextParamStr (&TextDeviceNode
);
1627 DataBitsStr
= GetNextParamStr (&TextDeviceNode
);
1628 ParityStr
= GetNextParamStr (&TextDeviceNode
);
1629 StopBitsStr
= GetNextParamStr (&TextDeviceNode
);
1630 Uart
= (UART_DEVICE_PATH
*) CreateDeviceNode (
1631 MESSAGING_DEVICE_PATH
,
1633 sizeof (UART_DEVICE_PATH
)
1636 Uart
->BaudRate
= (StrCmp (BaudStr
, L
"DEFAULT") == 0) ? 115200 : Atoi (BaudStr
);
1637 Uart
->DataBits
= (UINT8
) ((StrCmp (DataBitsStr
, L
"DEFAULT") == 0) ? 8 : Atoi (DataBitsStr
));
1638 switch (*ParityStr
) {
1663 Uart
->Parity
= 0xff;
1666 if (StrCmp (StopBitsStr
, L
"D") == 0) {
1667 Uart
->StopBits
= (UINT8
) 0;
1668 } else if (StrCmp (StopBitsStr
, L
"1") == 0) {
1669 Uart
->StopBits
= (UINT8
) 1;
1670 } else if (StrCmp (StopBitsStr
, L
"1.5") == 0) {
1671 Uart
->StopBits
= (UINT8
) 2;
1672 } else if (StrCmp (StopBitsStr
, L
"2") == 0) {
1673 Uart
->StopBits
= (UINT8
) 3;
1675 Uart
->StopBits
= 0xff;
1678 return (EFI_DEVICE_PATH_PROTOCOL
*) Uart
;
1682 EFI_DEVICE_PATH_PROTOCOL
*
1683 ConvertFromTextUsbClass (
1684 IN CHAR16
*TextDeviceNode
,
1685 IN USB_CLASS_TEXT
*UsbClassText
1691 CHAR16
*SubClassStr
;
1692 CHAR16
*ProtocolStr
;
1693 USB_CLASS_DEVICE_PATH
*UsbClass
;
1695 UsbClass
= (USB_CLASS_DEVICE_PATH
*) CreateDeviceNode (
1696 MESSAGING_DEVICE_PATH
,
1698 sizeof (USB_CLASS_DEVICE_PATH
)
1701 VIDStr
= GetNextParamStr (&TextDeviceNode
);
1702 PIDStr
= GetNextParamStr (&TextDeviceNode
);
1703 if (UsbClassText
->ClassExist
) {
1704 ClassStr
= GetNextParamStr (&TextDeviceNode
);
1705 UsbClass
->DeviceClass
= (UINT8
) Xtoi (ClassStr
);
1707 UsbClass
->DeviceClass
= UsbClassText
->Class
;
1709 if (UsbClassText
->SubClassExist
) {
1710 SubClassStr
= GetNextParamStr (&TextDeviceNode
);
1711 UsbClass
->DeviceSubClass
= (UINT8
) Xtoi (SubClassStr
);
1713 UsbClass
->DeviceSubClass
= UsbClassText
->SubClass
;
1716 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1718 UsbClass
->VendorId
= (UINT16
) Xtoi (VIDStr
);
1719 UsbClass
->ProductId
= (UINT16
) Xtoi (PIDStr
);
1720 UsbClass
->DeviceProtocol
= (UINT8
) Xtoi (ProtocolStr
);
1722 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbClass
;
1727 EFI_DEVICE_PATH_PROTOCOL
*
1728 DevPathFromTextUsbClass (
1729 IN CHAR16
*TextDeviceNode
1732 USB_CLASS_TEXT UsbClassText
;
1734 UsbClassText
.ClassExist
= TRUE
;
1735 UsbClassText
.SubClassExist
= TRUE
;
1737 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1741 EFI_DEVICE_PATH_PROTOCOL
*
1742 DevPathFromTextUsbAudio (
1743 IN CHAR16
*TextDeviceNode
1746 USB_CLASS_TEXT UsbClassText
;
1748 UsbClassText
.ClassExist
= FALSE
;
1749 UsbClassText
.Class
= USB_CLASS_AUDIO
;
1750 UsbClassText
.SubClassExist
= TRUE
;
1752 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1756 EFI_DEVICE_PATH_PROTOCOL
*
1757 DevPathFromTextUsbCDCControl (
1758 IN CHAR16
*TextDeviceNode
1761 USB_CLASS_TEXT UsbClassText
;
1763 UsbClassText
.ClassExist
= FALSE
;
1764 UsbClassText
.Class
= USB_CLASS_CDCCONTROL
;
1765 UsbClassText
.SubClassExist
= TRUE
;
1767 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1771 EFI_DEVICE_PATH_PROTOCOL
*
1772 DevPathFromTextUsbHID (
1773 IN CHAR16
*TextDeviceNode
1776 USB_CLASS_TEXT UsbClassText
;
1778 UsbClassText
.ClassExist
= FALSE
;
1779 UsbClassText
.Class
= USB_CLASS_HID
;
1780 UsbClassText
.SubClassExist
= TRUE
;
1782 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1786 EFI_DEVICE_PATH_PROTOCOL
*
1787 DevPathFromTextUsbImage (
1788 IN CHAR16
*TextDeviceNode
1791 USB_CLASS_TEXT UsbClassText
;
1793 UsbClassText
.ClassExist
= FALSE
;
1794 UsbClassText
.Class
= USB_CLASS_IMAGE
;
1795 UsbClassText
.SubClassExist
= TRUE
;
1797 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1801 EFI_DEVICE_PATH_PROTOCOL
*
1802 DevPathFromTextUsbPrinter (
1803 IN CHAR16
*TextDeviceNode
1806 USB_CLASS_TEXT UsbClassText
;
1808 UsbClassText
.ClassExist
= FALSE
;
1809 UsbClassText
.Class
= USB_CLASS_PRINTER
;
1810 UsbClassText
.SubClassExist
= TRUE
;
1812 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1816 EFI_DEVICE_PATH_PROTOCOL
*
1817 DevPathFromTextUsbMassStorage (
1818 IN CHAR16
*TextDeviceNode
1821 USB_CLASS_TEXT UsbClassText
;
1823 UsbClassText
.ClassExist
= FALSE
;
1824 UsbClassText
.Class
= USB_CLASS_MASS_STORAGE
;
1825 UsbClassText
.SubClassExist
= TRUE
;
1827 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1831 EFI_DEVICE_PATH_PROTOCOL
*
1832 DevPathFromTextUsbHub (
1833 IN CHAR16
*TextDeviceNode
1836 USB_CLASS_TEXT UsbClassText
;
1838 UsbClassText
.ClassExist
= FALSE
;
1839 UsbClassText
.Class
= USB_CLASS_HUB
;
1840 UsbClassText
.SubClassExist
= TRUE
;
1842 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1846 EFI_DEVICE_PATH_PROTOCOL
*
1847 DevPathFromTextUsbCDCData (
1848 IN CHAR16
*TextDeviceNode
1851 USB_CLASS_TEXT UsbClassText
;
1853 UsbClassText
.ClassExist
= FALSE
;
1854 UsbClassText
.Class
= USB_CLASS_CDCDATA
;
1855 UsbClassText
.SubClassExist
= TRUE
;
1857 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1861 EFI_DEVICE_PATH_PROTOCOL
*
1862 DevPathFromTextUsbSmartCard (
1863 IN CHAR16
*TextDeviceNode
1866 USB_CLASS_TEXT UsbClassText
;
1868 UsbClassText
.ClassExist
= FALSE
;
1869 UsbClassText
.Class
= USB_CLASS_SMART_CARD
;
1870 UsbClassText
.SubClassExist
= TRUE
;
1872 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1876 EFI_DEVICE_PATH_PROTOCOL
*
1877 DevPathFromTextUsbVideo (
1878 IN CHAR16
*TextDeviceNode
1881 USB_CLASS_TEXT UsbClassText
;
1883 UsbClassText
.ClassExist
= FALSE
;
1884 UsbClassText
.Class
= USB_CLASS_VIDEO
;
1885 UsbClassText
.SubClassExist
= TRUE
;
1887 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1891 EFI_DEVICE_PATH_PROTOCOL
*
1892 DevPathFromTextUsbDiagnostic (
1893 IN CHAR16
*TextDeviceNode
1896 USB_CLASS_TEXT UsbClassText
;
1898 UsbClassText
.ClassExist
= FALSE
;
1899 UsbClassText
.Class
= USB_CLASS_DIAGNOSTIC
;
1900 UsbClassText
.SubClassExist
= TRUE
;
1902 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1906 EFI_DEVICE_PATH_PROTOCOL
*
1907 DevPathFromTextUsbWireless (
1908 IN CHAR16
*TextDeviceNode
1911 USB_CLASS_TEXT UsbClassText
;
1913 UsbClassText
.ClassExist
= FALSE
;
1914 UsbClassText
.Class
= USB_CLASS_WIRELESS
;
1915 UsbClassText
.SubClassExist
= TRUE
;
1917 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1921 EFI_DEVICE_PATH_PROTOCOL
*
1922 DevPathFromTextUsbDeviceFirmwareUpdate (
1923 IN CHAR16
*TextDeviceNode
1926 USB_CLASS_TEXT UsbClassText
;
1928 UsbClassText
.ClassExist
= FALSE
;
1929 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1930 UsbClassText
.SubClassExist
= FALSE
;
1931 UsbClassText
.SubClass
= USB_SUBCLASS_FW_UPDATE
;
1933 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1937 EFI_DEVICE_PATH_PROTOCOL
*
1938 DevPathFromTextUsbIrdaBridge (
1939 IN CHAR16
*TextDeviceNode
1942 USB_CLASS_TEXT UsbClassText
;
1944 UsbClassText
.ClassExist
= FALSE
;
1945 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1946 UsbClassText
.SubClassExist
= FALSE
;
1947 UsbClassText
.SubClass
= USB_SUBCLASS_IRDA_BRIDGE
;
1949 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1953 EFI_DEVICE_PATH_PROTOCOL
*
1954 DevPathFromTextUsbTestAndMeasurement (
1955 IN CHAR16
*TextDeviceNode
1958 USB_CLASS_TEXT UsbClassText
;
1960 UsbClassText
.ClassExist
= FALSE
;
1961 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1962 UsbClassText
.SubClassExist
= FALSE
;
1963 UsbClassText
.SubClass
= USB_SUBCLASS_TEST
;
1965 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1969 EFI_DEVICE_PATH_PROTOCOL
*
1970 DevPathFromTextUsbWwid (
1971 IN CHAR16
*TextDeviceNode
1976 CHAR16
*InterfaceNumStr
;
1977 USB_WWID_DEVICE_PATH
*UsbWwid
;
1979 VIDStr
= GetNextParamStr (&TextDeviceNode
);
1980 PIDStr
= GetNextParamStr (&TextDeviceNode
);
1981 InterfaceNumStr
= GetNextParamStr (&TextDeviceNode
);
1982 UsbWwid
= (USB_WWID_DEVICE_PATH
*) CreateDeviceNode (
1983 MESSAGING_DEVICE_PATH
,
1985 sizeof (USB_WWID_DEVICE_PATH
)
1988 UsbWwid
->VendorId
= (UINT16
) Xtoi (VIDStr
);
1989 UsbWwid
->ProductId
= (UINT16
) Xtoi (PIDStr
);
1990 UsbWwid
->InterfaceNumber
= (UINT16
) Xtoi (InterfaceNumStr
);
1992 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbWwid
;
1996 EFI_DEVICE_PATH_PROTOCOL
*
1997 DevPathFromTextUnit (
1998 IN CHAR16
*TextDeviceNode
2002 DEVICE_LOGICAL_UNIT_DEVICE_PATH
*LogicalUnit
;
2004 LunStr
= GetNextParamStr (&TextDeviceNode
);
2005 LogicalUnit
= (DEVICE_LOGICAL_UNIT_DEVICE_PATH
*) CreateDeviceNode (
2006 MESSAGING_DEVICE_PATH
,
2007 MSG_DEVICE_LOGICAL_UNIT_DP
,
2008 sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH
)
2011 LogicalUnit
->Lun
= (UINT8
) Xtoi (LunStr
);
2013 return (EFI_DEVICE_PATH_PROTOCOL
*) LogicalUnit
;
2017 EFI_DEVICE_PATH_PROTOCOL
*
2018 DevPathFromTextiSCSI (
2019 IN CHAR16
*TextDeviceNode
2024 CHAR16
*PortalGroupStr
;
2026 CHAR16
*HeaderDigestStr
;
2027 CHAR16
*DataDigestStr
;
2028 CHAR16
*AuthenticationStr
;
2029 CHAR16
*ProtocolStr
;
2030 ISCSI_DEVICE_PATH_WITH_NAME
*iSCSI
;
2032 NameStr
= GetNextParamStr (&TextDeviceNode
);
2033 PortalGroupStr
= GetNextParamStr (&TextDeviceNode
);
2034 LunStr
= GetNextParamStr (&TextDeviceNode
);
2035 HeaderDigestStr
= GetNextParamStr (&TextDeviceNode
);
2036 DataDigestStr
= GetNextParamStr (&TextDeviceNode
);
2037 AuthenticationStr
= GetNextParamStr (&TextDeviceNode
);
2038 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
2039 iSCSI
= (ISCSI_DEVICE_PATH_WITH_NAME
*) CreateDeviceNode (
2040 MESSAGING_DEVICE_PATH
,
2042 sizeof (ISCSI_DEVICE_PATH_WITH_NAME
) + (UINT16
) (StrLen (NameStr
) * 2)
2045 StrCpy (iSCSI
->iSCSITargetName
, NameStr
);
2046 iSCSI
->TargetPortalGroupTag
= (UINT16
) Xtoi (PortalGroupStr
);
2047 Xtoi64 (LunStr
, &iSCSI
->Lun
);
2050 if (StrCmp (HeaderDigestStr
, L
"CRC32C") == 0) {
2054 if (StrCmp (DataDigestStr
, L
"CRC32C") == 0) {
2058 if (StrCmp (AuthenticationStr
, L
"None") == 0) {
2062 if (StrCmp (AuthenticationStr
, L
"CHAP_UNI") == 0) {
2066 iSCSI
->LoginOption
= (UINT16
) Options
;
2068 iSCSI
->NetworkProtocol
= (UINT16
) StrCmp (ProtocolStr
, L
"TCP");
2069 iSCSI
->Reserved
= (UINT16
) 0;
2071 return (EFI_DEVICE_PATH_PROTOCOL
*) iSCSI
;
2075 EFI_DEVICE_PATH_PROTOCOL
*
2077 IN CHAR16
*TextDeviceNode
2080 CHAR16
*PartitionStr
;
2082 CHAR16
*SignatureStr
;
2086 EFI_GUID SignatureGuid
;
2087 HARDDRIVE_DEVICE_PATH
*Hd
;
2089 PartitionStr
= GetNextParamStr (&TextDeviceNode
);
2090 TypeStr
= GetNextParamStr (&TextDeviceNode
);
2091 SignatureStr
= GetNextParamStr (&TextDeviceNode
);
2092 StartStr
= GetNextParamStr (&TextDeviceNode
);
2093 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2094 Hd
= (HARDDRIVE_DEVICE_PATH
*) CreateDeviceNode (
2097 sizeof (HARDDRIVE_DEVICE_PATH
)
2100 Hd
->PartitionNumber
= (UINT32
) Atoi (PartitionStr
);
2102 ZeroMem (Hd
->Signature
, 16);
2103 Hd
->MBRType
= (UINT8
) 0;
2105 if (StrCmp (TypeStr
, L
"None") == 0) {
2106 Hd
->SignatureType
= (UINT8
) 0;
2107 } else if (StrCmp (TypeStr
, L
"MBR") == 0) {
2108 Hd
->SignatureType
= SIGNATURE_TYPE_MBR
;
2111 Signature32
= (UINT32
) Xtoi (SignatureStr
);
2112 CopyMem (Hd
->Signature
, &Signature32
, sizeof (UINT32
));
2113 } else if (StrCmp (TypeStr
, L
"GUID") == 0) {
2114 Hd
->SignatureType
= SIGNATURE_TYPE_GUID
;
2117 StrToGuid (SignatureStr
, &SignatureGuid
);
2118 CopyMem (Hd
->Signature
, &SignatureGuid
, sizeof (EFI_GUID
));
2120 Hd
->SignatureType
= 0xff;
2124 Xtoi64 (StartStr
, &Hd
->PartitionStart
);
2125 Xtoi64 (SizeStr
, &Hd
->PartitionSize
);
2127 return (EFI_DEVICE_PATH_PROTOCOL
*) Hd
;
2131 EFI_DEVICE_PATH_PROTOCOL
*
2132 DevPathFromTextCDROM (
2133 IN CHAR16
*TextDeviceNode
2139 CDROM_DEVICE_PATH
*CDROM
;
2141 EntryStr
= GetNextParamStr (&TextDeviceNode
);
2142 StartStr
= GetNextParamStr (&TextDeviceNode
);
2143 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2144 CDROM
= (CDROM_DEVICE_PATH
*) CreateDeviceNode (
2147 sizeof (CDROM_DEVICE_PATH
)
2150 CDROM
->BootEntry
= (UINT32
) Xtoi (EntryStr
);
2151 Xtoi64 (StartStr
, &CDROM
->PartitionStart
);
2152 Xtoi64 (SizeStr
, &CDROM
->PartitionSize
);
2154 return (EFI_DEVICE_PATH_PROTOCOL
*) CDROM
;
2158 EFI_DEVICE_PATH_PROTOCOL
*
2159 DevPathFromTextVenMEDIA (
2160 IN CHAR16
*TextDeviceNode
2163 return ConvertFromTextVendor (
2171 EFI_DEVICE_PATH_PROTOCOL
*
2172 DevPathFromTextFilePath (
2173 IN CHAR16
*TextDeviceNode
2176 FILEPATH_DEVICE_PATH
*File
;
2178 File
= (FILEPATH_DEVICE_PATH
*) CreateDeviceNode (
2181 sizeof (FILEPATH_DEVICE_PATH
) + (UINT16
) (StrLen (TextDeviceNode
) * 2)
2184 StrCpy (File
->PathName
, TextDeviceNode
);
2186 return (EFI_DEVICE_PATH_PROTOCOL
*) File
;
2190 EFI_DEVICE_PATH_PROTOCOL
*
2191 DevPathFromTextMedia (
2192 IN CHAR16
*TextDeviceNode
2196 MEDIA_PROTOCOL_DEVICE_PATH
*Media
;
2198 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2199 Media
= (MEDIA_PROTOCOL_DEVICE_PATH
*) CreateDeviceNode (
2202 sizeof (MEDIA_PROTOCOL_DEVICE_PATH
)
2205 StrToGuid (GuidStr
, &Media
->Protocol
);
2207 return (EFI_DEVICE_PATH_PROTOCOL
*) Media
;
2211 EFI_DEVICE_PATH_PROTOCOL
*
2212 DevPathFromTextBBS (
2213 IN CHAR16
*TextDeviceNode
2220 BBS_BBS_DEVICE_PATH
*Bbs
;
2222 TypeStr
= GetNextParamStr (&TextDeviceNode
);
2223 IdStr
= GetNextParamStr (&TextDeviceNode
);
2224 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
2225 Bbs
= (BBS_BBS_DEVICE_PATH
*) CreateDeviceNode (
2228 sizeof (BBS_BBS_DEVICE_PATH
) + (UINT16
) (StrLen (IdStr
))
2231 if (StrCmp (TypeStr
, L
"Floppy") == 0) {
2232 Bbs
->DeviceType
= BBS_TYPE_FLOPPY
;
2233 } else if (StrCmp (TypeStr
, L
"HD") == 0) {
2234 Bbs
->DeviceType
= BBS_TYPE_HARDDRIVE
;
2235 } else if (StrCmp (TypeStr
, L
"CDROM") == 0) {
2236 Bbs
->DeviceType
= BBS_TYPE_CDROM
;
2237 } else if (StrCmp (TypeStr
, L
"PCMCIA") == 0) {
2238 Bbs
->DeviceType
= BBS_TYPE_PCMCIA
;
2239 } else if (StrCmp (TypeStr
, L
"USB") == 0) {
2240 Bbs
->DeviceType
= BBS_TYPE_USB
;
2241 } else if (StrCmp (TypeStr
, L
"Network") == 0) {
2242 Bbs
->DeviceType
= BBS_TYPE_EMBEDDED_NETWORK
;
2244 Bbs
->DeviceType
= BBS_TYPE_UNKNOWN
;
2247 AsciiStr
= (UINT8
*) Bbs
->String
;
2248 StrToAscii (IdStr
, (CHAR8
**) &AsciiStr
);
2250 Bbs
->StatusFlag
= (UINT16
) Xtoi (FlagsStr
);
2252 return (EFI_DEVICE_PATH_PROTOCOL
*) Bbs
;
2255 GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable
[] = {
2256 {L
"Pci", DevPathFromTextPci
},
2257 {L
"PcCard", DevPathFromTextPcCard
},
2258 {L
"MemoryMapped", DevPathFromTextMemoryMapped
},
2259 {L
"VenHw", DevPathFromTextVenHw
},
2260 {L
"Ctrl", DevPathFromTextCtrl
},
2261 {L
"Acpi", DevPathFromTextAcpi
},
2262 {L
"PciRoot", DevPathFromTextPciRoot
},
2263 {L
"Floppy", DevPathFromTextFloppy
},
2264 {L
"Keyboard", DevPathFromTextKeyboard
},
2265 {L
"Serial", DevPathFromTextSerial
},
2266 {L
"ParallelPort", DevPathFromTextParallelPort
},
2267 {L
"AcpiEx", DevPathFromTextAcpiEx
},
2268 {L
"AcpiExp", DevPathFromTextAcpiExp
},
2269 {L
"Ata", DevPathFromTextAta
},
2270 {L
"Scsi", DevPathFromTextScsi
},
2271 {L
"Fibre", DevPathFromTextFibre
},
2272 {L
"I1394", DevPathFromText1394
},
2273 {L
"USB", DevPathFromTextUsb
},
2274 {L
"I2O", DevPathFromTextI2O
},
2275 {L
"Infiniband", DevPathFromTextInfiniband
},
2276 {L
"VenMsg", DevPathFromTextVenMsg
},
2277 {L
"VenPcAnsi", DevPathFromTextVenPcAnsi
},
2278 {L
"VenVt100", DevPathFromTextVenVt100
},
2279 {L
"VenVt100Plus", DevPathFromTextVenVt100Plus
},
2280 {L
"VenUtf8", DevPathFromTextVenUtf8
},
2281 {L
"UartFlowCtrl", DevPathFromTextUartFlowCtrl
},
2282 {L
"SAS", DevPathFromTextSAS
},
2283 {L
"DebugPort", DevPathFromTextDebugPort
},
2284 {L
"MAC", DevPathFromTextMAC
},
2285 {L
"IPv4", DevPathFromTextIPv4
},
2286 {L
"IPv6", DevPathFromTextIPv6
},
2287 {L
"Uart", DevPathFromTextUart
},
2288 {L
"UsbClass", DevPathFromTextUsbClass
},
2289 {L
"UsbAudio", DevPathFromTextUsbAudio
},
2290 {L
"UsbCDCControl", DevPathFromTextUsbCDCControl
},
2291 {L
"UsbHID", DevPathFromTextUsbHID
},
2292 {L
"UsbImage", DevPathFromTextUsbImage
},
2293 {L
"UsbPrinter", DevPathFromTextUsbPrinter
},
2294 {L
"UsbMassStorage", DevPathFromTextUsbMassStorage
},
2295 {L
"UsbHub", DevPathFromTextUsbHub
},
2296 {L
"UsbCDCData", DevPathFromTextUsbCDCData
},
2297 {L
"UsbSmartCard", DevPathFromTextUsbSmartCard
},
2298 {L
"UsbVideo", DevPathFromTextUsbVideo
},
2299 {L
"UsbDiagnostic", DevPathFromTextUsbDiagnostic
},
2300 {L
"UsbWireless", DevPathFromTextUsbWireless
},
2301 {L
"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate
},
2302 {L
"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge
},
2303 {L
"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement
},
2304 {L
"UsbWwid", DevPathFromTextUsbWwid
},
2305 {L
"Unit", DevPathFromTextUnit
},
2306 {L
"iSCSI", DevPathFromTextiSCSI
},
2307 {L
"HD", DevPathFromTextHD
},
2308 {L
"CDROM", DevPathFromTextCDROM
},
2309 {L
"VenMEDIA", DevPathFromTextVenMEDIA
},
2310 {L
"Media", DevPathFromTextMedia
},
2311 {L
"BBS", DevPathFromTextBBS
},
2315 EFI_DEVICE_PATH_PROTOCOL
*
2316 ConvertTextToDeviceNode (
2317 IN CONST CHAR16
*TextDeviceNode
2321 Routine Description:
2322 Convert text to the binary representation of a device node.
2325 TextDeviceNode - TextDeviceNode points to the text representation of a device
2326 node. Conversion starts with the first character and continues
2327 until the first non-device node character.
2330 A pointer - Pointer to the EFI device node.
2331 NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.
2335 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2337 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2338 CHAR16
*DeviceNodeStr
;
2341 if ((TextDeviceNode
== NULL
) || (IS_NULL (*TextDeviceNode
))) {
2347 DeviceNodeStr
= StrDuplicate (TextDeviceNode
);
2349 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2350 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2351 if (ParamStr
!= NULL
) {
2352 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2357 if (DumpNode
== NULL
) {
2361 DumpNode
= DevPathFromTextFilePath
;
2362 DeviceNode
= DumpNode (DeviceNodeStr
);
2364 DeviceNode
= DumpNode (ParamStr
);
2365 gBS
->FreePool (ParamStr
);
2368 gBS
->FreePool (DeviceNodeStr
);
2373 EFI_DEVICE_PATH_PROTOCOL
*
2374 ConvertTextToDevicePath (
2375 IN CONST CHAR16
*TextDevicePath
2379 Routine Description:
2380 Convert text to the binary representation of a device path.
2383 TextDevicePath - TextDevicePath points to the text representation of a device
2384 path. Conversion starts with the first character and continues
2385 until the first non-device node character.
2388 A pointer - Pointer to the allocated device path.
2389 NULL - If TextDeviceNode is NULL or there was insufficient memory.
2393 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2395 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2397 EFI_DEVICE_PATH_PROTOCOL
*NewDevicePath
;
2398 CHAR16
*DevicePathStr
;
2400 CHAR16
*DeviceNodeStr
;
2401 UINT8 IsInstanceEnd
;
2402 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2404 if ((TextDevicePath
== NULL
) || (IS_NULL (*TextDevicePath
))) {
2408 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2409 SetDevicePathEndNode (DevicePath
);
2412 DeviceNodeStr
= NULL
;
2413 DevicePathStr
= StrDuplicate (TextDevicePath
);
2415 Str
= DevicePathStr
;
2416 while ((DeviceNodeStr
= GetNextDeviceNodeStr (&Str
, &IsInstanceEnd
)) != NULL
) {
2418 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2419 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2420 if (ParamStr
!= NULL
) {
2421 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2426 if (DumpNode
== NULL
) {
2430 DumpNode
= DevPathFromTextFilePath
;
2431 DeviceNode
= DumpNode (DeviceNodeStr
);
2433 DeviceNode
= DumpNode (ParamStr
);
2434 gBS
->FreePool (ParamStr
);
2437 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2438 gBS
->FreePool (DevicePath
);
2439 gBS
->FreePool (DeviceNode
);
2440 DevicePath
= NewDevicePath
;
2442 if (IsInstanceEnd
) {
2443 DeviceNode
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2444 SetDevicePathInstanceEndNode (DeviceNode
);
2446 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2447 gBS
->FreePool (DevicePath
);
2448 gBS
->FreePool (DeviceNode
);
2449 DevicePath
= NewDevicePath
;
2453 gBS
->FreePool (DevicePathStr
);