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