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