]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[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
e6c80aea 4Copyright (c) 2013 - 2018, 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
9095d37b 282\r
4d0a30a4 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 Unicode string to ASCII string.\r
330\r
5755841f 331 @param Str The equivalent Unicode string\r
572f5d8a 332 @param AsciiStr On input, it points to destination ASCII string buffer; on output, it points\r
333 to the next ASCII string next to it\r
334\r
335**/\r
95276127 336VOID\r
337StrToAscii (\r
338 IN CHAR16 *Str,\r
339 IN OUT CHAR8 **AsciiStr\r
340 )\r
341{\r
342 CHAR8 *Dest;\r
343\r
344 Dest = *AsciiStr;\r
345 while (!IS_NULL (*Str)) {\r
346 *(Dest++) = (CHAR8) *(Str++);\r
347 }\r
348 *Dest = 0;\r
349\r
350 //\r
351 // Return the string next to it\r
352 //\r
353 *AsciiStr = Dest + 1;\r
354}\r
355\r
5d6a5aee
RN
356/**\r
357 Converts a generic text device path node to device path structure.\r
358\r
359 @param Type The type of the device path node.\r
360 @param TextDeviceNode The input text device path node.\r
361\r
362 @return A pointer to device path structure.\r
363**/\r
364EFI_DEVICE_PATH_PROTOCOL *\r
365DevPathFromTextGenericPath (\r
366 IN UINT8 Type,\r
367 IN CHAR16 *TextDeviceNode\r
368 )\r
369{\r
370 EFI_DEVICE_PATH_PROTOCOL *Node;\r
371 CHAR16 *SubtypeStr;\r
372 CHAR16 *DataStr;\r
373 UINTN DataLength;\r
374\r
375 SubtypeStr = GetNextParamStr (&TextDeviceNode);\r
376 DataStr = GetNextParamStr (&TextDeviceNode);\r
377\r
378 if (DataStr == NULL) {\r
379 DataLength = 0;\r
380 } else {\r
381 DataLength = StrLen (DataStr) / 2;\r
382 }\r
383 Node = CreateDeviceNode (\r
384 Type,\r
385 (UINT8) Strtoi (SubtypeStr),\r
386 (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)\r
387 );\r
388\r
96d37135 389 StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);\r
5d6a5aee
RN
390 return Node;\r
391}\r
392\r
393/**\r
394 Converts a generic text device path node to device path structure.\r
395\r
396 @param TextDeviceNode The input Text device path node.\r
397\r
398 @return A pointer to device path structure.\r
399\r
400**/\r
401EFI_DEVICE_PATH_PROTOCOL *\r
402DevPathFromTextPath (\r
403 IN CHAR16 *TextDeviceNode\r
404 )\r
405{\r
406 CHAR16 *TypeStr;\r
407\r
408 TypeStr = GetNextParamStr (&TextDeviceNode);\r
409\r
410 return DevPathFromTextGenericPath ((UINT8) Strtoi (TypeStr), TextDeviceNode);\r
411}\r
412\r
413/**\r
414 Converts a generic hardware text device path node to Hardware device path structure.\r
415\r
416 @param TextDeviceNode The input Text device path node.\r
417\r
418 @return A pointer to Hardware device path structure.\r
419\r
420**/\r
421EFI_DEVICE_PATH_PROTOCOL *\r
422DevPathFromTextHardwarePath (\r
423 IN CHAR16 *TextDeviceNode\r
424 )\r
425{\r
426 return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);\r
427}\r
428\r
572f5d8a 429/**\r
430 Converts a text device path node to Hardware PCI device path structure.\r
431\r
432 @param TextDeviceNode The input Text device path node.\r
433\r
434 @return A pointer to Hardware PCI device path structure.\r
435\r
436**/\r
95276127 437EFI_DEVICE_PATH_PROTOCOL *\r
438DevPathFromTextPci (\r
439 IN CHAR16 *TextDeviceNode\r
440 )\r
441{\r
442 CHAR16 *FunctionStr;\r
443 CHAR16 *DeviceStr;\r
444 PCI_DEVICE_PATH *Pci;\r
445\r
95276127 446 DeviceStr = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 447 FunctionStr = GetNextParamStr (&TextDeviceNode);\r
95276127 448 Pci = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
449 HARDWARE_DEVICE_PATH,\r
450 HW_PCI_DP,\r
c9325700 451 (UINT16) sizeof (PCI_DEVICE_PATH)\r
95276127 452 );\r
453\r
cf40f28a 454 Pci->Function = (UINT8) Strtoi (FunctionStr);\r
455 Pci->Device = (UINT8) Strtoi (DeviceStr);\r
95276127 456\r
457 return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
458}\r
459\r
572f5d8a 460/**\r
461 Converts a text device path node to Hardware PC card device path structure.\r
462\r
463 @param TextDeviceNode The input Text device path node.\r
464\r
465 @return A pointer to Hardware PC card device path structure.\r
466\r
467**/\r
95276127 468EFI_DEVICE_PATH_PROTOCOL *\r
469DevPathFromTextPcCard (\r
470 IN CHAR16 *TextDeviceNode\r
471 )\r
472{\r
473 CHAR16 *FunctionNumberStr;\r
474 PCCARD_DEVICE_PATH *Pccard;\r
475\r
476 FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
477 Pccard = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
478 HARDWARE_DEVICE_PATH,\r
479 HW_PCCARD_DP,\r
c9325700 480 (UINT16) sizeof (PCCARD_DEVICE_PATH)\r
95276127 481 );\r
482\r
cf40f28a 483 Pccard->FunctionNumber = (UINT8) Strtoi (FunctionNumberStr);\r
95276127 484\r
485 return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
486}\r
487\r
572f5d8a 488/**\r
489 Converts a text device path node to Hardware memory map device path structure.\r
490\r
491 @param TextDeviceNode The input Text device path node.\r
492\r
493 @return A pointer to Hardware memory map device path structure.\r
494\r
495**/\r
95276127 496EFI_DEVICE_PATH_PROTOCOL *\r
497DevPathFromTextMemoryMapped (\r
498 IN CHAR16 *TextDeviceNode\r
499 )\r
500{\r
cf40f28a 501 CHAR16 *MemoryTypeStr;\r
95276127 502 CHAR16 *StartingAddressStr;\r
503 CHAR16 *EndingAddressStr;\r
504 MEMMAP_DEVICE_PATH *MemMap;\r
505\r
cf40f28a 506 MemoryTypeStr = GetNextParamStr (&TextDeviceNode);\r
95276127 507 StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
508 EndingAddressStr = GetNextParamStr (&TextDeviceNode);\r
509 MemMap = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
510 HARDWARE_DEVICE_PATH,\r
511 HW_MEMMAP_DP,\r
c9325700 512 (UINT16) sizeof (MEMMAP_DEVICE_PATH)\r
95276127 513 );\r
514\r
cf40f28a 515 MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);\r
516 Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
517 Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
95276127 518\r
519 return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
520}\r
521\r
572f5d8a 522/**\r
523 Converts a text device path node to Vendor device path structure based on the input Type\r
524 and SubType.\r
525\r
526 @param TextDeviceNode The input Text device path node.\r
527 @param Type The type of device path node.\r
528 @param SubType The subtype of device path node.\r
529\r
530 @return A pointer to the newly-created Vendor device path structure.\r
531\r
532**/\r
95276127 533EFI_DEVICE_PATH_PROTOCOL *\r
534ConvertFromTextVendor (\r
535 IN CHAR16 *TextDeviceNode,\r
536 IN UINT8 Type,\r
537 IN UINT8 SubType\r
538 )\r
539{\r
540 CHAR16 *GuidStr;\r
541 CHAR16 *DataStr;\r
542 UINTN Length;\r
543 VENDOR_DEVICE_PATH *Vendor;\r
544\r
545 GuidStr = GetNextParamStr (&TextDeviceNode);\r
546\r
547 DataStr = GetNextParamStr (&TextDeviceNode);\r
548 Length = StrLen (DataStr);\r
549 //\r
550 // Two hex characters make up 1 buffer byte\r
551 //\r
552 Length = (Length + 1) / 2;\r
553\r
554 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
555 Type,\r
556 SubType,\r
d074a8e1 557 (UINT16) (sizeof (VENDOR_DEVICE_PATH) + Length)\r
95276127 558 );\r
559\r
96d37135
RN
560 StrToGuid (GuidStr, &Vendor->Guid);\r
561 StrHexToBytes (DataStr, Length * 2, (UINT8 *) (Vendor + 1), Length);\r
95276127 562\r
563 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
564}\r
565\r
572f5d8a 566/**\r
567 Converts a text device path node to Vendor Hardware device path structure.\r
568\r
569 @param TextDeviceNode The input Text device path node.\r
570\r
571 @return A pointer to the newly-created Vendor Hardware device path structure.\r
572\r
573**/\r
95276127 574EFI_DEVICE_PATH_PROTOCOL *\r
575DevPathFromTextVenHw (\r
576 IN CHAR16 *TextDeviceNode\r
577 )\r
578{\r
579 return ConvertFromTextVendor (\r
580 TextDeviceNode,\r
581 HARDWARE_DEVICE_PATH,\r
582 HW_VENDOR_DP\r
583 );\r
584}\r
585\r
572f5d8a 586/**\r
587 Converts a text device path node to Hardware Controller device path structure.\r
588\r
589 @param TextDeviceNode The input Text device path node.\r
590\r
591 @return A pointer to the newly-created Hardware Controller device path structure.\r
592\r
593**/\r
95276127 594EFI_DEVICE_PATH_PROTOCOL *\r
595DevPathFromTextCtrl (\r
596 IN CHAR16 *TextDeviceNode\r
597 )\r
598{\r
599 CHAR16 *ControllerStr;\r
600 CONTROLLER_DEVICE_PATH *Controller;\r
601\r
602 ControllerStr = GetNextParamStr (&TextDeviceNode);\r
603 Controller = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
604 HARDWARE_DEVICE_PATH,\r
605 HW_CONTROLLER_DP,\r
c9325700 606 (UINT16) sizeof (CONTROLLER_DEVICE_PATH)\r
95276127 607 );\r
cf40f28a 608 Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);\r
95276127 609\r
610 return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
611}\r
612\r
624f017e
HW
613/**\r
614 Converts a text device path node to BMC device path structure.\r
615\r
616 @param TextDeviceNode The input Text device path node.\r
617\r
618 @return A pointer to the newly-created BMC device path structure.\r
619\r
620**/\r
621EFI_DEVICE_PATH_PROTOCOL *\r
622DevPathFromTextBmc (\r
623 IN CHAR16 *TextDeviceNode\r
624 )\r
625{\r
626 CHAR16 *InterfaceTypeStr;\r
627 CHAR16 *BaseAddressStr;\r
628 BMC_DEVICE_PATH *BmcDp;\r
629\r
630 InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);\r
631 BaseAddressStr = GetNextParamStr (&TextDeviceNode);\r
632 BmcDp = (BMC_DEVICE_PATH *) CreateDeviceNode (\r
633 HARDWARE_DEVICE_PATH,\r
634 HW_BMC_DP,\r
635 (UINT16) sizeof (BMC_DEVICE_PATH)\r
636 );\r
637\r
638 BmcDp->InterfaceType = (UINT8) Strtoi (InterfaceTypeStr);\r
639 WriteUnaligned64 (\r
640 (UINT64 *) (&BmcDp->BaseAddress),\r
641 StrHexToUint64 (BaseAddressStr)\r
642 );\r
643\r
644 return (EFI_DEVICE_PATH_PROTOCOL *) BmcDp;\r
645}\r
646\r
5d6a5aee
RN
647/**\r
648 Converts a generic ACPI text device path node to ACPI device path structure.\r
649\r
650 @param TextDeviceNode The input Text device path node.\r
651\r
652 @return A pointer to ACPI device path structure.\r
653\r
654**/\r
655EFI_DEVICE_PATH_PROTOCOL *\r
656DevPathFromTextAcpiPath (\r
657 IN CHAR16 *TextDeviceNode\r
658 )\r
659{\r
660 return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);\r
661}\r
662\r
572f5d8a 663/**\r
664 Converts a string to EisaId.\r
665\r
666 @param Text The input string.\r
572f5d8a 667\r
4d0a30a4 668 @return UINT32 EISA ID.\r
572f5d8a 669**/\r
4d0a30a4 670UINT32\r
cf40f28a 671EisaIdFromText (\r
4d0a30a4 672 IN CHAR16 *Text\r
cf40f28a 673 )\r
674{\r
4d0a30a4
RN
675 return (((Text[0] - 'A' + 1) & 0x1f) << 10)\r
676 + (((Text[1] - 'A' + 1) & 0x1f) << 5)\r
677 + (((Text[2] - 'A' + 1) & 0x1f) << 0)\r
678 + (UINT32) (StrHexToUintn (&Text[3]) << 16)\r
679 ;\r
cf40f28a 680}\r
681\r
572f5d8a 682/**\r
683 Converts a text device path node to ACPI HID device path structure.\r
684\r
685 @param TextDeviceNode The input Text device path node.\r
686\r
687 @return A pointer to the newly-created ACPI HID device path structure.\r
688\r
689**/\r
95276127 690EFI_DEVICE_PATH_PROTOCOL *\r
691DevPathFromTextAcpi (\r
692 IN CHAR16 *TextDeviceNode\r
693 )\r
694{\r
695 CHAR16 *HIDStr;\r
696 CHAR16 *UIDStr;\r
697 ACPI_HID_DEVICE_PATH *Acpi;\r
698\r
699 HIDStr = GetNextParamStr (&TextDeviceNode);\r
700 UIDStr = GetNextParamStr (&TextDeviceNode);\r
701 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
702 ACPI_DEVICE_PATH,\r
703 ACPI_DP,\r
c9325700 704 (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
95276127 705 );\r
706\r
4d0a30a4 707 Acpi->HID = EisaIdFromText (HIDStr);\r
cf40f28a 708 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
95276127 709\r
710 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
711}\r
712\r
572f5d8a 713/**\r
714 Converts a text device path node to ACPI HID device path structure.\r
715\r
716 @param TextDeviceNode The input Text device path node.\r
717 @param PnPId The input plug and play identification.\r
718\r
719 @return A pointer to the newly-created ACPI HID device path structure.\r
720\r
721**/\r
95276127 722EFI_DEVICE_PATH_PROTOCOL *\r
723ConvertFromTextAcpi (\r
724 IN CHAR16 *TextDeviceNode,\r
cf40f28a 725 IN UINT32 PnPId\r
95276127 726 )\r
727{\r
728 CHAR16 *UIDStr;\r
729 ACPI_HID_DEVICE_PATH *Acpi;\r
730\r
731 UIDStr = GetNextParamStr (&TextDeviceNode);\r
732 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
733 ACPI_DEVICE_PATH,\r
734 ACPI_DP,\r
c9325700 735 (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
95276127 736 );\r
737\r
cf40f28a 738 Acpi->HID = EFI_PNP_ID (PnPId);\r
739 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
95276127 740\r
741 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
742}\r
743\r
572f5d8a 744/**\r
745 Converts a text device path node to PCI root device path structure.\r
746\r
747 @param TextDeviceNode The input Text device path node.\r
748\r
749 @return A pointer to the newly-created PCI root device path structure.\r
750\r
751**/\r
95276127 752EFI_DEVICE_PATH_PROTOCOL *\r
753DevPathFromTextPciRoot (\r
754 IN CHAR16 *TextDeviceNode\r
755 )\r
756{\r
cf40f28a 757 return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);\r
95276127 758}\r
759\r
e9b3cd55
RN
760/**\r
761 Converts a text device path node to PCIE root device path structure.\r
762\r
763 @param TextDeviceNode The input Text device path node.\r
764\r
765 @return A pointer to the newly-created PCIE root device path structure.\r
766\r
767**/\r
768EFI_DEVICE_PATH_PROTOCOL *\r
769DevPathFromTextPcieRoot (\r
770 IN CHAR16 *TextDeviceNode\r
771 )\r
772{\r
773 return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);\r
774}\r
775\r
572f5d8a 776/**\r
777 Converts a text device path node to Floppy device path structure.\r
778\r
779 @param TextDeviceNode The input Text device path node.\r
780\r
781 @return A pointer to the newly-created Floppy device path structure.\r
782\r
783**/\r
95276127 784EFI_DEVICE_PATH_PROTOCOL *\r
785DevPathFromTextFloppy (\r
786 IN CHAR16 *TextDeviceNode\r
787 )\r
788{\r
cf40f28a 789 return ConvertFromTextAcpi (TextDeviceNode, 0x0604);\r
95276127 790}\r
791\r
572f5d8a 792/**\r
793 Converts a text device path node to Keyboard device path structure.\r
794\r
795 @param TextDeviceNode The input Text device path node.\r
796\r
797 @return A pointer to the newly-created Keyboard device path structure.\r
798\r
799**/\r
95276127 800EFI_DEVICE_PATH_PROTOCOL *\r
801DevPathFromTextKeyboard (\r
802 IN CHAR16 *TextDeviceNode\r
803 )\r
804{\r
cf40f28a 805 return ConvertFromTextAcpi (TextDeviceNode, 0x0301);\r
95276127 806}\r
807\r
572f5d8a 808/**\r
809 Converts a text device path node to Serial device path structure.\r
810\r
811 @param TextDeviceNode The input Text device path node.\r
812\r
813 @return A pointer to the newly-created Serial device path structure.\r
814\r
815**/\r
95276127 816EFI_DEVICE_PATH_PROTOCOL *\r
817DevPathFromTextSerial (\r
818 IN CHAR16 *TextDeviceNode\r
819 )\r
820{\r
cf40f28a 821 return ConvertFromTextAcpi (TextDeviceNode, 0x0501);\r
95276127 822}\r
823\r
572f5d8a 824/**\r
825 Converts a text device path node to Parallel Port device path structure.\r
826\r
827 @param TextDeviceNode The input Text device path node.\r
828\r
829 @return A pointer to the newly-created Parallel Port device path structure.\r
830\r
831**/\r
95276127 832EFI_DEVICE_PATH_PROTOCOL *\r
833DevPathFromTextParallelPort (\r
834 IN CHAR16 *TextDeviceNode\r
835 )\r
836{\r
cf40f28a 837 return ConvertFromTextAcpi (TextDeviceNode, 0x0401);\r
95276127 838}\r
839\r
572f5d8a 840/**\r
5755841f 841 Converts a text device path node to ACPI extension device path structure.\r
572f5d8a 842\r
843 @param TextDeviceNode The input Text device path node.\r
844\r
5755841f 845 @return A pointer to the newly-created ACPI extension device path structure.\r
572f5d8a 846\r
847**/\r
95276127 848EFI_DEVICE_PATH_PROTOCOL *\r
849DevPathFromTextAcpiEx (\r
850 IN CHAR16 *TextDeviceNode\r
851 )\r
852{\r
cf40f28a 853 CHAR16 *HIDStr;\r
854 CHAR16 *CIDStr;\r
855 CHAR16 *UIDStr;\r
856 CHAR16 *HIDSTRStr;\r
857 CHAR16 *CIDSTRStr;\r
858 CHAR16 *UIDSTRStr;\r
859 CHAR8 *AsciiStr;\r
860 UINT16 Length;\r
861 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
95276127 862\r
863 HIDStr = GetNextParamStr (&TextDeviceNode);\r
864 CIDStr = GetNextParamStr (&TextDeviceNode);\r
865 UIDStr = GetNextParamStr (&TextDeviceNode);\r
866 HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
867 CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
868 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
869\r
870 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);\r
871 Length = (UINT16) (Length + StrLen (UIDSTRStr) + 1);\r
872 Length = (UINT16) (Length + StrLen (CIDSTRStr) + 1);\r
cf40f28a 873 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
874 ACPI_DEVICE_PATH,\r
875 ACPI_EXTENDED_DP,\r
876 Length\r
877 );\r
95276127 878\r
4d0a30a4
RN
879 AcpiEx->HID = EisaIdFromText (HIDStr);\r
880 AcpiEx->CID = EisaIdFromText (CIDStr);\r
cf40f28a 881 AcpiEx->UID = (UINT32) Strtoi (UIDStr);\r
95276127 882\r
cf40f28a 883 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
95276127 884 StrToAscii (HIDSTRStr, &AsciiStr);\r
885 StrToAscii (UIDSTRStr, &AsciiStr);\r
886 StrToAscii (CIDSTRStr, &AsciiStr);\r
cf40f28a 887\r
888 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
95276127 889}\r
890\r
572f5d8a 891/**\r
5755841f 892 Converts a text device path node to ACPI extension device path structure.\r
572f5d8a 893\r
894 @param TextDeviceNode The input Text device path node.\r
895\r
5755841f 896 @return A pointer to the newly-created ACPI extension device path structure.\r
572f5d8a 897\r
898**/\r
95276127 899EFI_DEVICE_PATH_PROTOCOL *\r
900DevPathFromTextAcpiExp (\r
901 IN CHAR16 *TextDeviceNode\r
902 )\r
903{\r
cf40f28a 904 CHAR16 *HIDStr;\r
905 CHAR16 *CIDStr;\r
906 CHAR16 *UIDSTRStr;\r
907 CHAR8 *AsciiStr;\r
908 UINT16 Length;\r
909 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
95276127 910\r
911 HIDStr = GetNextParamStr (&TextDeviceNode);\r
912 CIDStr = GetNextParamStr (&TextDeviceNode);\r
913 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
d074a8e1 914 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);\r
cf40f28a 915 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
916 ACPI_DEVICE_PATH,\r
917 ACPI_EXTENDED_DP,\r
918 Length\r
919 );\r
95276127 920\r
4d0a30a4 921 AcpiEx->HID = EisaIdFromText (HIDStr);\r
a8b57509
DB
922 //\r
923 // According to UEFI spec, the CID parametr is optional and has a default value of 0.\r
924 // So when the CID parametr is not specified or specified as 0 in the text device node.\r
925 // Set the CID to 0 in the ACPI extension device path structure.\r
926 //\r
927 if (*CIDStr == L'\0' || *CIDStr == L'0') {\r
928 AcpiEx->CID = 0;\r
929 } else {\r
930 AcpiEx->CID = EisaIdFromText (CIDStr);\r
931 }\r
cf40f28a 932 AcpiEx->UID = 0;\r
95276127 933\r
cf40f28a 934 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
95276127 935 //\r
936 // HID string is NULL\r
937 //\r
cf40f28a 938 *AsciiStr = '\0';\r
95276127 939 //\r
940 // Convert UID string\r
941 //\r
942 AsciiStr++;\r
943 StrToAscii (UIDSTRStr, &AsciiStr);\r
944 //\r
945 // CID string is NULL\r
946 //\r
cf40f28a 947 *AsciiStr = '\0';\r
95276127 948\r
cf40f28a 949 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
95276127 950}\r
951\r
5b84091f
RN
952/**\r
953 Converts a text device path node to ACPI _ADR device path structure.\r
954\r
955 @param TextDeviceNode The input Text device path node.\r
956\r
957 @return A pointer to the newly-created ACPI _ADR device path structure.\r
958\r
959**/\r
960EFI_DEVICE_PATH_PROTOCOL *\r
961DevPathFromTextAcpiAdr (\r
962 IN CHAR16 *TextDeviceNode\r
963 )\r
964{\r
965 CHAR16 *DisplayDeviceStr;\r
966 ACPI_ADR_DEVICE_PATH *AcpiAdr;\r
967 UINTN Index;\r
b36653bc 968 UINTN Length;\r
5b84091f
RN
969\r
970 AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (\r
971 ACPI_DEVICE_PATH,\r
972 ACPI_ADR_DP,\r
e7cc9dcc 973 (UINT16) sizeof (ACPI_ADR_DEVICE_PATH)\r
5b84091f
RN
974 );\r
975 ASSERT (AcpiAdr != NULL);\r
976\r
977 for (Index = 0; ; Index++) {\r
978 DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);\r
979 if (IS_NULL (*DisplayDeviceStr)) {\r
980 break;\r
981 }\r
982 if (Index > 0) {\r
b36653bc 983 Length = DevicePathNodeLength (AcpiAdr);\r
5b84091f 984 AcpiAdr = ReallocatePool (\r
b36653bc
RN
985 Length,\r
986 Length + sizeof (UINT32),\r
5b84091f
RN
987 AcpiAdr\r
988 );\r
989 ASSERT (AcpiAdr != NULL);\r
b36653bc 990 SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
5b84091f 991 }\r
9095d37b 992\r
5b84091f
RN
993 (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
994 }\r
995\r
996 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
997}\r
998\r
5d6a5aee
RN
999/**\r
1000 Converts a generic messaging text device path node to messaging device path structure.\r
1001\r
1002 @param TextDeviceNode The input Text device path node.\r
1003\r
1004 @return A pointer to messaging device path structure.\r
1005\r
1006**/\r
1007EFI_DEVICE_PATH_PROTOCOL *\r
1008DevPathFromTextMsg (\r
1009 IN CHAR16 *TextDeviceNode\r
1010 )\r
1011{\r
1012 return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);\r
1013}\r
1014\r
572f5d8a 1015/**\r
1016 Converts a text device path node to Parallel Port device path structure.\r
1017\r
1018 @param TextDeviceNode The input Text device path node.\r
1019\r
1020 @return A pointer to the newly-created Parallel Port device path structure.\r
1021\r
1022**/\r
95276127 1023EFI_DEVICE_PATH_PROTOCOL *\r
1024DevPathFromTextAta (\r
9da38884
RN
1025IN CHAR16 *TextDeviceNode\r
1026)\r
95276127 1027{\r
1028 CHAR16 *PrimarySecondaryStr;\r
1029 CHAR16 *SlaveMasterStr;\r
1030 CHAR16 *LunStr;\r
1031 ATAPI_DEVICE_PATH *Atapi;\r
1032\r
1033 Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
9da38884
RN
1034 MESSAGING_DEVICE_PATH,\r
1035 MSG_ATAPI_DP,\r
1036 (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
1037 );\r
1038\r
1039 PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
1040 SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
1041 LunStr = GetNextParamStr (&TextDeviceNode);\r
1042\r
1043 if (StrCmp (PrimarySecondaryStr, L"Primary") == 0) {\r
1044 Atapi->PrimarySecondary = 0;\r
1045 } else if (StrCmp (PrimarySecondaryStr, L"Secondary") == 0) {\r
1046 Atapi->PrimarySecondary = 1;\r
1047 } else {\r
1048 Atapi->PrimarySecondary = (UINT8) Strtoi (PrimarySecondaryStr);\r
1049 }\r
1050 if (StrCmp (SlaveMasterStr, L"Master") == 0) {\r
1051 Atapi->SlaveMaster = 0;\r
1052 } else if (StrCmp (SlaveMasterStr, L"Slave") == 0) {\r
1053 Atapi->SlaveMaster = 1;\r
1054 } else {\r
1055 Atapi->SlaveMaster = (UINT8) Strtoi (SlaveMasterStr);\r
1056 }\r
95276127 1057\r
9da38884 1058 Atapi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1059\r
1060 return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
1061}\r
1062\r
572f5d8a 1063/**\r
1064 Converts a text device path node to SCSI device path structure.\r
1065\r
1066 @param TextDeviceNode The input Text device path node.\r
1067\r
1068 @return A pointer to the newly-created SCSI device path structure.\r
1069\r
1070**/\r
95276127 1071EFI_DEVICE_PATH_PROTOCOL *\r
1072DevPathFromTextScsi (\r
1073 IN CHAR16 *TextDeviceNode\r
1074 )\r
1075{\r
1076 CHAR16 *PunStr;\r
1077 CHAR16 *LunStr;\r
1078 SCSI_DEVICE_PATH *Scsi;\r
1079\r
1080 PunStr = GetNextParamStr (&TextDeviceNode);\r
1081 LunStr = GetNextParamStr (&TextDeviceNode);\r
1082 Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
1083 MESSAGING_DEVICE_PATH,\r
1084 MSG_SCSI_DP,\r
c9325700 1085 (UINT16) sizeof (SCSI_DEVICE_PATH)\r
95276127 1086 );\r
1087\r
cf40f28a 1088 Scsi->Pun = (UINT16) Strtoi (PunStr);\r
1089 Scsi->Lun = (UINT16) Strtoi (LunStr);\r
95276127 1090\r
1091 return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
1092}\r
1093\r
572f5d8a 1094/**\r
1095 Converts a text device path node to Fibre device path structure.\r
1096\r
1097 @param TextDeviceNode The input Text device path node.\r
1098\r
1099 @return A pointer to the newly-created Fibre device path structure.\r
1100\r
1101**/\r
95276127 1102EFI_DEVICE_PATH_PROTOCOL *\r
1103DevPathFromTextFibre (\r
1104 IN CHAR16 *TextDeviceNode\r
1105 )\r
1106{\r
1107 CHAR16 *WWNStr;\r
1108 CHAR16 *LunStr;\r
1109 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
1110\r
1111 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1112 LunStr = GetNextParamStr (&TextDeviceNode);\r
1113 Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
1114 MESSAGING_DEVICE_PATH,\r
1115 MSG_FIBRECHANNEL_DP,\r
c9325700 1116 (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
95276127 1117 );\r
1118\r
1119 Fibre->Reserved = 0;\r
cf40f28a 1120 Strtoi64 (WWNStr, &Fibre->WWN);\r
1121 Strtoi64 (LunStr, &Fibre->Lun);\r
95276127 1122\r
1123 return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
1124}\r
1125\r
e9b3cd55
RN
1126/**\r
1127 Converts a text device path node to FibreEx device path structure.\r
1128\r
1129 @param TextDeviceNode The input Text device path node.\r
1130\r
1131 @return A pointer to the newly-created FibreEx device path structure.\r
1132\r
1133**/\r
1134EFI_DEVICE_PATH_PROTOCOL *\r
1135DevPathFromTextFibreEx (\r
1136 IN CHAR16 *TextDeviceNode\r
1137 )\r
1138{\r
1139 CHAR16 *WWNStr;\r
1140 CHAR16 *LunStr;\r
1141 FIBRECHANNELEX_DEVICE_PATH *FibreEx;\r
1142\r
1143 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1144 LunStr = GetNextParamStr (&TextDeviceNode);\r
1145 FibreEx = (FIBRECHANNELEX_DEVICE_PATH *) CreateDeviceNode (\r
1146 MESSAGING_DEVICE_PATH,\r
1147 MSG_FIBRECHANNELEX_DP,\r
1148 (UINT16) sizeof (FIBRECHANNELEX_DEVICE_PATH)\r
1149 );\r
1150\r
1151 FibreEx->Reserved = 0;\r
1152 Strtoi64 (WWNStr, (UINT64 *) (&FibreEx->WWN));\r
1153 Strtoi64 (LunStr, (UINT64 *) (&FibreEx->Lun));\r
1154\r
1155 *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));\r
1156 *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));\r
1157\r
1158 return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;\r
1159}\r
1160\r
572f5d8a 1161/**\r
1162 Converts a text device path node to 1394 device path structure.\r
1163\r
1164 @param TextDeviceNode The input Text device path node.\r
1165\r
1166 @return A pointer to the newly-created 1394 device path structure.\r
1167\r
1168**/\r
95276127 1169EFI_DEVICE_PATH_PROTOCOL *\r
1170DevPathFromText1394 (\r
1171 IN CHAR16 *TextDeviceNode\r
1172 )\r
1173{\r
1174 CHAR16 *GuidStr;\r
572f5d8a 1175 F1394_DEVICE_PATH *F1394DevPath;\r
95276127 1176\r
1177 GuidStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1178 F1394DevPath = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
1179 MESSAGING_DEVICE_PATH,\r
1180 MSG_1394_DP,\r
c9325700 1181 (UINT16) sizeof (F1394_DEVICE_PATH)\r
572f5d8a 1182 );\r
95276127 1183\r
572f5d8a 1184 F1394DevPath->Reserved = 0;\r
4d0a30a4 1185 F1394DevPath->Guid = StrHexToUint64 (GuidStr);\r
95276127 1186\r
572f5d8a 1187 return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;\r
95276127 1188}\r
1189\r
572f5d8a 1190/**\r
1191 Converts a text device path node to USB device path structure.\r
1192\r
1193 @param TextDeviceNode The input Text device path node.\r
1194\r
1195 @return A pointer to the newly-created USB device path structure.\r
1196\r
1197**/\r
95276127 1198EFI_DEVICE_PATH_PROTOCOL *\r
1199DevPathFromTextUsb (\r
1200 IN CHAR16 *TextDeviceNode\r
1201 )\r
1202{\r
1203 CHAR16 *PortStr;\r
1204 CHAR16 *InterfaceStr;\r
1205 USB_DEVICE_PATH *Usb;\r
1206\r
1207 PortStr = GetNextParamStr (&TextDeviceNode);\r
1208 InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
1209 Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
1210 MESSAGING_DEVICE_PATH,\r
1211 MSG_USB_DP,\r
c9325700 1212 (UINT16) sizeof (USB_DEVICE_PATH)\r
95276127 1213 );\r
1214\r
cf40f28a 1215 Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
1216 Usb->InterfaceNumber = (UINT8) Strtoi (InterfaceStr);\r
95276127 1217\r
1218 return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
1219}\r
1220\r
572f5d8a 1221/**\r
1222 Converts a text device path node to I20 device path structure.\r
1223\r
1224 @param TextDeviceNode The input Text device path node.\r
1225\r
1226 @return A pointer to the newly-created I20 device path structure.\r
1227\r
1228**/\r
95276127 1229EFI_DEVICE_PATH_PROTOCOL *\r
1230DevPathFromTextI2O (\r
1231 IN CHAR16 *TextDeviceNode\r
1232 )\r
1233{\r
1234 CHAR16 *TIDStr;\r
572f5d8a 1235 I2O_DEVICE_PATH *I2ODevPath;\r
95276127 1236\r
572f5d8a 1237 TIDStr = GetNextParamStr (&TextDeviceNode);\r
1238 I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1239 MESSAGING_DEVICE_PATH,\r
1240 MSG_I2O_DP,\r
c9325700 1241 (UINT16) sizeof (I2O_DEVICE_PATH)\r
95276127 1242 );\r
1243\r
572f5d8a 1244 I2ODevPath->Tid = (UINT32) Strtoi (TIDStr);\r
95276127 1245\r
572f5d8a 1246 return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;\r
95276127 1247}\r
1248\r
572f5d8a 1249/**\r
1250 Converts a text device path node to Infini Band device path structure.\r
1251\r
1252 @param TextDeviceNode The input Text device path node.\r
1253\r
1254 @return A pointer to the newly-created Infini Band device path structure.\r
1255\r
1256**/\r
95276127 1257EFI_DEVICE_PATH_PROTOCOL *\r
1258DevPathFromTextInfiniband (\r
1259 IN CHAR16 *TextDeviceNode\r
1260 )\r
1261{\r
1262 CHAR16 *FlagsStr;\r
1263 CHAR16 *GuidStr;\r
1264 CHAR16 *SidStr;\r
1265 CHAR16 *TidStr;\r
1266 CHAR16 *DidStr;\r
95276127 1267 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1268\r
1269 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
1270 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1271 SidStr = GetNextParamStr (&TextDeviceNode);\r
1272 TidStr = GetNextParamStr (&TextDeviceNode);\r
1273 DidStr = GetNextParamStr (&TextDeviceNode);\r
1274 InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
1275 MESSAGING_DEVICE_PATH,\r
1276 MSG_INFINIBAND_DP,\r
c9325700 1277 (UINT16) sizeof (INFINIBAND_DEVICE_PATH)\r
95276127 1278 );\r
1279\r
cf40f28a 1280 InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
96d37135 1281 StrToGuid (GuidStr, (EFI_GUID *) InfiniBand->PortGid);\r
cf40f28a 1282 Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
1283 Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
1284 Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
95276127 1285\r
1286 return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
1287}\r
1288\r
572f5d8a 1289/**\r
1290 Converts a text device path node to Vendor-Defined Messaging device path structure.\r
1291\r
1292 @param TextDeviceNode The input Text device path node.\r
1293\r
1294 @return A pointer to the newly-created Vendor-Defined Messaging device path structure.\r
1295\r
1296**/\r
95276127 1297EFI_DEVICE_PATH_PROTOCOL *\r
1298DevPathFromTextVenMsg (\r
1299 IN CHAR16 *TextDeviceNode\r
1300 )\r
1301{\r
1302 return ConvertFromTextVendor (\r
1303 TextDeviceNode,\r
1304 MESSAGING_DEVICE_PATH,\r
1305 MSG_VENDOR_DP\r
1306 );\r
1307}\r
1308\r
572f5d8a 1309/**\r
1310 Converts a text device path node to Vendor defined PC-ANSI device path structure.\r
1311\r
1312 @param TextDeviceNode The input Text device path node.\r
1313\r
1314 @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.\r
1315\r
1316**/\r
95276127 1317EFI_DEVICE_PATH_PROTOCOL *\r
1318DevPathFromTextVenPcAnsi (\r
1319 IN CHAR16 *TextDeviceNode\r
1320 )\r
1321{\r
1322 VENDOR_DEVICE_PATH *Vendor;\r
1323\r
1324 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1325 MESSAGING_DEVICE_PATH,\r
1326 MSG_VENDOR_DP,\r
c9325700 1327 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1328 CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
1329\r
1330 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1331}\r
1332\r
572f5d8a 1333/**\r
1334 Converts a text device path node to Vendor defined VT100 device path structure.\r
1335\r
1336 @param TextDeviceNode The input Text device path node.\r
1337\r
1338 @return A pointer to the newly-created Vendor defined VT100 device path structure.\r
1339\r
1340**/\r
95276127 1341EFI_DEVICE_PATH_PROTOCOL *\r
1342DevPathFromTextVenVt100 (\r
1343 IN CHAR16 *TextDeviceNode\r
1344 )\r
1345{\r
1346 VENDOR_DEVICE_PATH *Vendor;\r
1347\r
1348 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1349 MESSAGING_DEVICE_PATH,\r
1350 MSG_VENDOR_DP,\r
c9325700 1351 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1352 CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
1353\r
1354 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1355}\r
1356\r
572f5d8a 1357/**\r
1358 Converts a text device path node to Vendor defined VT100 Plus device path structure.\r
1359\r
1360 @param TextDeviceNode The input Text device path node.\r
1361\r
1362 @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.\r
1363\r
1364**/\r
95276127 1365EFI_DEVICE_PATH_PROTOCOL *\r
1366DevPathFromTextVenVt100Plus (\r
1367 IN CHAR16 *TextDeviceNode\r
1368 )\r
1369{\r
1370 VENDOR_DEVICE_PATH *Vendor;\r
1371\r
1372 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1373 MESSAGING_DEVICE_PATH,\r
1374 MSG_VENDOR_DP,\r
c9325700 1375 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1376 CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
1377\r
1378 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1379}\r
1380\r
572f5d8a 1381/**\r
1382 Converts a text device path node to Vendor defined UTF8 device path structure.\r
1383\r
1384 @param TextDeviceNode The input Text device path node.\r
1385\r
1386 @return A pointer to the newly-created Vendor defined UTF8 device path structure.\r
1387\r
1388**/\r
95276127 1389EFI_DEVICE_PATH_PROTOCOL *\r
1390DevPathFromTextVenUtf8 (\r
1391 IN CHAR16 *TextDeviceNode\r
1392 )\r
1393{\r
1394 VENDOR_DEVICE_PATH *Vendor;\r
1395\r
1396 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1397 MESSAGING_DEVICE_PATH,\r
1398 MSG_VENDOR_DP,\r
c9325700 1399 (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
95276127 1400 CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
1401\r
1402 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1403}\r
1404\r
572f5d8a 1405/**\r
1406 Converts a text device path node to UART Flow Control device path structure.\r
1407\r
1408 @param TextDeviceNode The input Text device path node.\r
1409\r
1410 @return A pointer to the newly-created UART Flow Control device path structure.\r
1411\r
1412**/\r
95276127 1413EFI_DEVICE_PATH_PROTOCOL *\r
1414DevPathFromTextUartFlowCtrl (\r
1415 IN CHAR16 *TextDeviceNode\r
1416 )\r
1417{\r
1418 CHAR16 *ValueStr;\r
1419 UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
1420\r
1421 ValueStr = GetNextParamStr (&TextDeviceNode);\r
1422 UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
1423 MESSAGING_DEVICE_PATH,\r
1424 MSG_VENDOR_DP,\r
c9325700 1425 (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
95276127 1426 );\r
1427\r
48557c65 1428 CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);\r
95276127 1429 if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
1430 UartFlowControl->FlowControlMap = 2;\r
1431 } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
1432 UartFlowControl->FlowControlMap = 1;\r
1433 } else {\r
1434 UartFlowControl->FlowControlMap = 0;\r
1435 }\r
1436\r
1437 return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
1438}\r
1439\r
572f5d8a 1440/**\r
1441 Converts a text device path node to Serial Attached SCSI device path structure.\r
1442\r
1443 @param TextDeviceNode The input Text device path node.\r
1444\r
1445 @return A pointer to the newly-created Serial Attached SCSI device path structure.\r
1446\r
1447**/\r
95276127 1448EFI_DEVICE_PATH_PROTOCOL *\r
1449DevPathFromTextSAS (\r
1450 IN CHAR16 *TextDeviceNode\r
1451 )\r
1452{\r
1453 CHAR16 *AddressStr;\r
1454 CHAR16 *LunStr;\r
1455 CHAR16 *RTPStr;\r
1456 CHAR16 *SASSATAStr;\r
1457 CHAR16 *LocationStr;\r
1458 CHAR16 *ConnectStr;\r
1459 CHAR16 *DriveBayStr;\r
1460 CHAR16 *ReservedStr;\r
1461 UINT16 Info;\r
562fce0b 1462 UINT16 Uint16;\r
95276127 1463 SAS_DEVICE_PATH *Sas;\r
1464\r
1465 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1466 LunStr = GetNextParamStr (&TextDeviceNode);\r
1467 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1468 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1469 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1470 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1471 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
1472 ReservedStr = GetNextParamStr (&TextDeviceNode);\r
95276127 1473 Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
1474 MESSAGING_DEVICE_PATH,\r
1475 MSG_VENDOR_DP,\r
c9325700 1476 (UINT16) sizeof (SAS_DEVICE_PATH)\r
95276127 1477 );\r
1478\r
48557c65 1479 CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);\r
cf40f28a 1480 Strtoi64 (AddressStr, &Sas->SasAddress);\r
1481 Strtoi64 (LunStr, &Sas->Lun);\r
1482 Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
562fce0b
RN
1483\r
1484 if (StrCmp (SASSATAStr, L"NoTopology") == 0) {\r
1485 Info = 0x0;\r
1486\r
1487 } else if ((StrCmp (SASSATAStr, L"SATA") == 0) || (StrCmp (SASSATAStr, L"SAS") == 0)) {\r
1488\r
1489 Uint16 = (UINT16) Strtoi (DriveBayStr);\r
1490 if (Uint16 == 0) {\r
1491 Info = 0x1;\r
95276127 1492 } else {\r
562fce0b 1493 Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));\r
95276127 1494 }\r
1495\r
1496 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
562fce0b 1497 Info |= BIT4;\r
95276127 1498 }\r
1499\r
562fce0b
RN
1500 //\r
1501 // Location is an integer between 0 and 1 or else\r
1502 // the keyword Internal (0) or External (1).\r
1503 //\r
95276127 1504 if (StrCmp (LocationStr, L"External") == 0) {\r
562fce0b
RN
1505 Uint16 = 1;\r
1506 } else if (StrCmp (LocationStr, L"Internal") == 0) {\r
1507 Uint16 = 0;\r
1508 } else {\r
2d34b53e 1509 Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);\r
95276127 1510 }\r
562fce0b 1511 Info |= (Uint16 << 5);\r
95276127 1512\r
562fce0b
RN
1513 //\r
1514 // Connect is an integer between 0 and 3 or else\r
1515 // the keyword Direct (0) or Expanded (1).\r
1516 //\r
95276127 1517 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
562fce0b
RN
1518 Uint16 = 1;\r
1519 } else if (StrCmp (ConnectStr, L"Direct") == 0) {\r
1520 Uint16 = 0;\r
1521 } else {\r
2d34b53e 1522 Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));\r
95276127 1523 }\r
562fce0b
RN
1524 Info |= (Uint16 << 6);\r
1525\r
1526 } else {\r
1527 Info = (UINT16) Strtoi (SASSATAStr);\r
95276127 1528 }\r
1529\r
1530 Sas->DeviceTopology = Info;\r
cf40f28a 1531 Sas->Reserved = (UINT32) Strtoi (ReservedStr);\r
95276127 1532\r
1533 return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
1534}\r
1535\r
501793fa
RN
1536/**\r
1537 Converts a text device path node to Serial Attached SCSI Ex device path structure.\r
1538\r
1539 @param TextDeviceNode The input Text device path node.\r
1540\r
1541 @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.\r
1542\r
1543**/\r
1544EFI_DEVICE_PATH_PROTOCOL *\r
1545DevPathFromTextSasEx (\r
1546 IN CHAR16 *TextDeviceNode\r
1547 )\r
1548{\r
1549 CHAR16 *AddressStr;\r
1550 CHAR16 *LunStr;\r
1551 CHAR16 *RTPStr;\r
1552 CHAR16 *SASSATAStr;\r
1553 CHAR16 *LocationStr;\r
1554 CHAR16 *ConnectStr;\r
1555 CHAR16 *DriveBayStr;\r
1556 UINT16 Info;\r
562fce0b
RN
1557 UINT16 Uint16;\r
1558 UINT64 SasAddress;\r
1559 UINT64 Lun;\r
501793fa
RN
1560 SASEX_DEVICE_PATH *SasEx;\r
1561\r
1562 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1563 LunStr = GetNextParamStr (&TextDeviceNode);\r
1564 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1565 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1566 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1567 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1568 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
501793fa
RN
1569 SasEx = (SASEX_DEVICE_PATH *) CreateDeviceNode (\r
1570 MESSAGING_DEVICE_PATH,\r
1571 MSG_SASEX_DP,\r
1572 (UINT16) sizeof (SASEX_DEVICE_PATH)\r
1573 );\r
1574\r
562fce0b
RN
1575 Strtoi64 (AddressStr, &SasAddress);\r
1576 Strtoi64 (LunStr, &Lun);\r
1577 WriteUnaligned64 ((UINT64 *) &SasEx->SasAddress, SwapBytes64 (SasAddress));\r
1578 WriteUnaligned64 ((UINT64 *) &SasEx->Lun, SwapBytes64 (Lun));\r
501793fa 1579 SasEx->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
562fce0b
RN
1580\r
1581 if (StrCmp (SASSATAStr, L"NoTopology") == 0) {\r
1582 Info = 0x0;\r
1583\r
1584 } else if ((StrCmp (SASSATAStr, L"SATA") == 0) || (StrCmp (SASSATAStr, L"SAS") == 0)) {\r
1585\r
1586 Uint16 = (UINT16) Strtoi (DriveBayStr);\r
1587 if (Uint16 == 0) {\r
1588 Info = 0x1;\r
501793fa 1589 } else {\r
562fce0b 1590 Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));\r
501793fa
RN
1591 }\r
1592\r
1593 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
562fce0b 1594 Info |= BIT4;\r
501793fa
RN
1595 }\r
1596\r
562fce0b
RN
1597 //\r
1598 // Location is an integer between 0 and 1 or else\r
1599 // the keyword Internal (0) or External (1).\r
1600 //\r
501793fa 1601 if (StrCmp (LocationStr, L"External") == 0) {\r
562fce0b
RN
1602 Uint16 = 1;\r
1603 } else if (StrCmp (LocationStr, L"Internal") == 0) {\r
1604 Uint16 = 0;\r
1605 } else {\r
2d34b53e 1606 Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);\r
501793fa 1607 }\r
562fce0b 1608 Info |= (Uint16 << 5);\r
501793fa 1609\r
562fce0b
RN
1610 //\r
1611 // Connect is an integer between 0 and 3 or else\r
1612 // the keyword Direct (0) or Expanded (1).\r
1613 //\r
501793fa 1614 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
562fce0b
RN
1615 Uint16 = 1;\r
1616 } else if (StrCmp (ConnectStr, L"Direct") == 0) {\r
1617 Uint16 = 0;\r
1618 } else {\r
2d34b53e 1619 Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));\r
501793fa 1620 }\r
562fce0b
RN
1621 Info |= (Uint16 << 6);\r
1622\r
1623 } else {\r
1624 Info = (UINT16) Strtoi (SASSATAStr);\r
501793fa
RN
1625 }\r
1626\r
1627 SasEx->DeviceTopology = Info;\r
1628\r
1629 return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;\r
1630}\r
1631\r
a06ec3e2
RN
1632/**\r
1633 Converts a text device path node to NVM Express Namespace device path structure.\r
1634\r
1635 @param TextDeviceNode The input Text device path node.\r
1636\r
1637 @return A pointer to the newly-created NVM Express Namespace device path structure.\r
1638\r
1639**/\r
1640EFI_DEVICE_PATH_PROTOCOL *\r
1641DevPathFromTextNVMe (\r
1642 IN CHAR16 *TextDeviceNode\r
1643 )\r
1644{\r
1645 CHAR16 *NamespaceIdStr;\r
1646 CHAR16 *NamespaceUuidStr;\r
1647 NVME_NAMESPACE_DEVICE_PATH *Nvme;\r
1648 UINT8 *Uuid;\r
1649 UINTN Index;\r
1650\r
1651 NamespaceIdStr = GetNextParamStr (&TextDeviceNode);\r
1652 NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);\r
1653 Nvme = (NVME_NAMESPACE_DEVICE_PATH *) CreateDeviceNode (\r
1654 MESSAGING_DEVICE_PATH,\r
1655 MSG_NVME_NAMESPACE_DP,\r
1656 (UINT16) sizeof (NVME_NAMESPACE_DEVICE_PATH)\r
1657 );\r
1658\r
1659 Nvme->NamespaceId = (UINT32) Strtoi (NamespaceIdStr);\r
1660 Uuid = (UINT8 *) &Nvme->NamespaceUuid;\r
1661\r
1662 Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);\r
1663 while (Index-- != 0) {\r
1664 Uuid[Index] = (UINT8) StrHexToUintn (SplitStr (&NamespaceUuidStr, L'-'));\r
1665 }\r
1666\r
1667 return (EFI_DEVICE_PATH_PROTOCOL *) Nvme;\r
1668}\r
1669\r
52306166
FT
1670/**\r
1671 Converts a text device path node to UFS device path structure.\r
1672\r
1673 @param TextDeviceNode The input Text device path node.\r
1674\r
1675 @return A pointer to the newly-created UFS device path structure.\r
1676\r
1677**/\r
1678EFI_DEVICE_PATH_PROTOCOL *\r
1679DevPathFromTextUfs (\r
1680 IN CHAR16 *TextDeviceNode\r
1681 )\r
1682{\r
1683 CHAR16 *PunStr;\r
1684 CHAR16 *LunStr;\r
1685 UFS_DEVICE_PATH *Ufs;\r
1686\r
1687 PunStr = GetNextParamStr (&TextDeviceNode);\r
1688 LunStr = GetNextParamStr (&TextDeviceNode);\r
1689 Ufs = (UFS_DEVICE_PATH *) CreateDeviceNode (\r
1690 MESSAGING_DEVICE_PATH,\r
1691 MSG_UFS_DP,\r
1692 (UINT16) sizeof (UFS_DEVICE_PATH)\r
1693 );\r
1694\r
1695 Ufs->Pun = (UINT8) Strtoi (PunStr);\r
1696 Ufs->Lun = (UINT8) Strtoi (LunStr);\r
1697\r
1698 return (EFI_DEVICE_PATH_PROTOCOL *) Ufs;\r
1699}\r
1700\r
ab8686b8
FT
1701/**\r
1702 Converts a text device path node to SD (Secure Digital) device path structure.\r
1703\r
1704 @param TextDeviceNode The input Text device path node.\r
1705\r
1706 @return A pointer to the newly-created SD device path structure.\r
1707\r
1708**/\r
1709EFI_DEVICE_PATH_PROTOCOL *\r
1710DevPathFromTextSd (\r
1711 IN CHAR16 *TextDeviceNode\r
1712 )\r
1713{\r
1714 CHAR16 *SlotNumberStr;\r
1715 SD_DEVICE_PATH *Sd;\r
1716\r
1717 SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
1718 Sd = (SD_DEVICE_PATH *) CreateDeviceNode (\r
1719 MESSAGING_DEVICE_PATH,\r
1720 MSG_SD_DP,\r
1721 (UINT16) sizeof (SD_DEVICE_PATH)\r
1722 );\r
1723\r
1724 Sd->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
1725\r
1726 return (EFI_DEVICE_PATH_PROTOCOL *) Sd;\r
1727}\r
1728\r
5c67fb2f
FT
1729/**\r
1730 Converts a text device path node to EMMC (Embedded MMC) device path structure.\r
1731\r
1732 @param TextDeviceNode The input Text device path node.\r
1733\r
1734 @return A pointer to the newly-created EMMC device path structure.\r
1735\r
1736**/\r
1737EFI_DEVICE_PATH_PROTOCOL *\r
1738DevPathFromTextEmmc (\r
1739 IN CHAR16 *TextDeviceNode\r
1740 )\r
1741{\r
1742 CHAR16 *SlotNumberStr;\r
1743 EMMC_DEVICE_PATH *Emmc;\r
1744\r
1745 SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
1746 Emmc = (EMMC_DEVICE_PATH *) CreateDeviceNode (\r
1747 MESSAGING_DEVICE_PATH,\r
1748 MSG_EMMC_DP,\r
1749 (UINT16) sizeof (EMMC_DEVICE_PATH)\r
1750 );\r
1751\r
1752 Emmc->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
1753\r
1754 return (EFI_DEVICE_PATH_PROTOCOL *) Emmc;\r
1755}\r
1756\r
572f5d8a 1757/**\r
1758 Converts a text device path node to Debug Port device path structure.\r
1759\r
1760 @param TextDeviceNode The input Text device path node.\r
1761\r
1762 @return A pointer to the newly-created Debug Port device path structure.\r
1763\r
1764**/\r
95276127 1765EFI_DEVICE_PATH_PROTOCOL *\r
1766DevPathFromTextDebugPort (\r
1767 IN CHAR16 *TextDeviceNode\r
1768 )\r
1769{\r
9343d0a1 1770 VENDOR_DEVICE_PATH *Vend;\r
95276127 1771\r
9343d0a1 1772 Vend = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1773 MESSAGING_DEVICE_PATH,\r
1774 MSG_VENDOR_DP,\r
9343d0a1 1775 (UINT16) sizeof (VENDOR_DEVICE_PATH)\r
95276127 1776 );\r
1777\r
1778 CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
1779\r
1780 return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
1781}\r
1782\r
572f5d8a 1783/**\r
1784 Converts a text device path node to MAC device path structure.\r
1785\r
1786 @param TextDeviceNode The input Text device path node.\r
1787\r
1788 @return A pointer to the newly-created MAC device path structure.\r
1789\r
1790**/\r
95276127 1791EFI_DEVICE_PATH_PROTOCOL *\r
1792DevPathFromTextMAC (\r
1793 IN CHAR16 *TextDeviceNode\r
1794 )\r
1795{\r
1796 CHAR16 *AddressStr;\r
1797 CHAR16 *IfTypeStr;\r
1798 UINTN Length;\r
572f5d8a 1799 MAC_ADDR_DEVICE_PATH *MACDevPath;\r
95276127 1800\r
1801 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1802 IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 1803 MACDevPath = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
95276127 1804 MESSAGING_DEVICE_PATH,\r
1805 MSG_MAC_ADDR_DP,\r
c9325700 1806 (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)\r
95276127 1807 );\r
1808\r
572f5d8a 1809 MACDevPath->IfType = (UINT8) Strtoi (IfTypeStr);\r
95276127 1810\r
1811 Length = sizeof (EFI_MAC_ADDRESS);\r
2d67f2ba
JW
1812 if (MACDevPath->IfType == 0x01 || MACDevPath->IfType == 0x00) {\r
1813 Length = 6;\r
1814 }\r
1815\r
96d37135 1816 StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);\r
95276127 1817\r
572f5d8a 1818 return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
95276127 1819}\r
1820\r
052019e1 1821\r
1822/**\r
1823 Converts a text format to the network protocol ID.\r
1824\r
1825 @param Text String of protocol field.\r
1826\r
1827 @return Network protocol ID .\r
1828\r
1829**/\r
1830UINTN\r
1831NetworkProtocolFromText (\r
1832 IN CHAR16 *Text\r
1833 )\r
1834{\r
1835 if (StrCmp (Text, L"UDP") == 0) {\r
1836 return RFC_1700_UDP_PROTOCOL;\r
1837 }\r
1838\r
1839 if (StrCmp (Text, L"TCP") == 0) {\r
1840 return RFC_1700_TCP_PROTOCOL;\r
1841 }\r
1842\r
1843 return Strtoi (Text);\r
1844}\r
1845\r
1846\r
572f5d8a 1847/**\r
1848 Converts a text device path node to IPV4 device path structure.\r
1849\r
1850 @param TextDeviceNode The input Text device path node.\r
1851\r
1852 @return A pointer to the newly-created IPV4 device path structure.\r
1853\r
1854**/\r
95276127 1855EFI_DEVICE_PATH_PROTOCOL *\r
1856DevPathFromTextIPv4 (\r
1857 IN CHAR16 *TextDeviceNode\r
1858 )\r
1859{\r
1860 CHAR16 *RemoteIPStr;\r
1861 CHAR16 *ProtocolStr;\r
1862 CHAR16 *TypeStr;\r
1863 CHAR16 *LocalIPStr;\r
e9b3cd55
RN
1864 CHAR16 *GatewayIPStr;\r
1865 CHAR16 *SubnetMaskStr;\r
95276127 1866 IPv4_DEVICE_PATH *IPv4;\r
1867\r
1868 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1869 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1870 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1871 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
e9b3cd55
RN
1872 GatewayIPStr = GetNextParamStr (&TextDeviceNode);\r
1873 SubnetMaskStr = GetNextParamStr (&TextDeviceNode);\r
95276127 1874 IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
1875 MESSAGING_DEVICE_PATH,\r
1876 MSG_IPv4_DP,\r
c9325700 1877 (UINT16) sizeof (IPv4_DEVICE_PATH)\r
95276127 1878 );\r
1879\r
96d37135 1880 StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);\r
052019e1 1881 IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1882 if (StrCmp (TypeStr, L"Static") == 0) {\r
1883 IPv4->StaticIpAddress = TRUE;\r
1884 } else {\r
1885 IPv4->StaticIpAddress = FALSE;\r
1886 }\r
1887\r
96d37135 1888 StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);\r
e9b3cd55 1889 if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {\r
96d37135
RN
1890 StrToIpv4Address (GatewayIPStr, NULL, &IPv4->GatewayIpAddress, NULL);\r
1891 StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask, NULL);\r
e9b3cd55
RN
1892 } else {\r
1893 ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));\r
1894 ZeroMem (&IPv4->SubnetMask, sizeof (IPv4->SubnetMask));\r
1895 }\r
95276127 1896\r
cf40f28a 1897 IPv4->LocalPort = 0;\r
1898 IPv4->RemotePort = 0;\r
95276127 1899\r
1900 return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
1901}\r
1902\r
572f5d8a 1903/**\r
1904 Converts a text device path node to IPV6 device path structure.\r
1905\r
1906 @param TextDeviceNode The input Text device path node.\r
1907\r
1908 @return A pointer to the newly-created IPV6 device path structure.\r
1909\r
1910**/\r
95276127 1911EFI_DEVICE_PATH_PROTOCOL *\r
1912DevPathFromTextIPv6 (\r
1913 IN CHAR16 *TextDeviceNode\r
1914 )\r
1915{\r
1916 CHAR16 *RemoteIPStr;\r
1917 CHAR16 *ProtocolStr;\r
1918 CHAR16 *TypeStr;\r
1919 CHAR16 *LocalIPStr;\r
501793fa
RN
1920 CHAR16 *GatewayIPStr;\r
1921 CHAR16 *PrefixLengthStr;\r
95276127 1922 IPv6_DEVICE_PATH *IPv6;\r
1923\r
1924 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1925 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1926 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1927 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
501793fa
RN
1928 PrefixLengthStr = GetNextParamStr (&TextDeviceNode);\r
1929 GatewayIPStr = GetNextParamStr (&TextDeviceNode);\r
95276127 1930 IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
1931 MESSAGING_DEVICE_PATH,\r
1932 MSG_IPv6_DP,\r
c9325700 1933 (UINT16) sizeof (IPv6_DEVICE_PATH)\r
95276127 1934 );\r
1935\r
96d37135 1936 StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);\r
052019e1 1937 IPv6->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
95276127 1938 if (StrCmp (TypeStr, L"Static") == 0) {\r
501793fa
RN
1939 IPv6->IpAddressOrigin = 0;\r
1940 } else if (StrCmp (TypeStr, L"StatelessAutoConfigure") == 0) {\r
1941 IPv6->IpAddressOrigin = 1;\r
95276127 1942 } else {\r
501793fa 1943 IPv6->IpAddressOrigin = 2;\r
95276127 1944 }\r
1945\r
96d37135 1946 StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);\r
501793fa 1947 if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {\r
96d37135 1948 StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);\r
501793fa
RN
1949 IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);\r
1950 } else {\r
1951 ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));\r
1952 IPv6->PrefixLength = 0;\r
1953 }\r
95276127 1954\r
1955 IPv6->LocalPort = 0;\r
1956 IPv6->RemotePort = 0;\r
1957\r
1958 return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
1959}\r
1960\r
572f5d8a 1961/**\r
1962 Converts a text device path node to UART device path structure.\r
1963\r
1964 @param TextDeviceNode The input Text device path node.\r
1965\r
1966 @return A pointer to the newly-created UART device path structure.\r
1967\r
1968**/\r
95276127 1969EFI_DEVICE_PATH_PROTOCOL *\r
1970DevPathFromTextUart (\r
1971 IN CHAR16 *TextDeviceNode\r
1972 )\r
1973{\r
1974 CHAR16 *BaudStr;\r
1975 CHAR16 *DataBitsStr;\r
1976 CHAR16 *ParityStr;\r
1977 CHAR16 *StopBitsStr;\r
1978 UART_DEVICE_PATH *Uart;\r
1979\r
1980 BaudStr = GetNextParamStr (&TextDeviceNode);\r
1981 DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
1982 ParityStr = GetNextParamStr (&TextDeviceNode);\r
1983 StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
1984 Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
1985 MESSAGING_DEVICE_PATH,\r
1986 MSG_UART_DP,\r
c9325700 1987 (UINT16) sizeof (UART_DEVICE_PATH)\r
95276127 1988 );\r
1989\r
9da38884
RN
1990 if (StrCmp (BaudStr, L"DEFAULT") == 0) {\r
1991 Uart->BaudRate = 115200;\r
1992 } else {\r
1993 Strtoi64 (BaudStr, &Uart->BaudRate);\r
1994 }\r
1995 Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));\r
95276127 1996 switch (*ParityStr) {\r
1997 case L'D':\r
1998 Uart->Parity = 0;\r
1999 break;\r
2000\r
2001 case L'N':\r
2002 Uart->Parity = 1;\r
2003 break;\r
2004\r
2005 case L'E':\r
2006 Uart->Parity = 2;\r
2007 break;\r
2008\r
2009 case L'O':\r
2010 Uart->Parity = 3;\r
2011 break;\r
2012\r
2013 case L'M':\r
2014 Uart->Parity = 4;\r
2015 break;\r
2016\r
2017 case L'S':\r
2018 Uart->Parity = 5;\r
bd07919c 2019 break;\r
95276127 2020\r
2021 default:\r
9da38884
RN
2022 Uart->Parity = (UINT8) Strtoi (ParityStr);\r
2023 break;\r
95276127 2024 }\r
2025\r
2026 if (StrCmp (StopBitsStr, L"D") == 0) {\r
2027 Uart->StopBits = (UINT8) 0;\r
2028 } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
2029 Uart->StopBits = (UINT8) 1;\r
2030 } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
2031 Uart->StopBits = (UINT8) 2;\r
2032 } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
2033 Uart->StopBits = (UINT8) 3;\r
2034 } else {\r
9da38884 2035 Uart->StopBits = (UINT8) Strtoi (StopBitsStr);\r
95276127 2036 }\r
2037\r
2038 return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
2039}\r
2040\r
572f5d8a 2041/**\r
2042 Converts a text device path node to USB class device path structure.\r
2043\r
2044 @param TextDeviceNode The input Text device path node.\r
2045 @param UsbClassText A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.\r
2046\r
2047 @return A pointer to the newly-created USB class device path structure.\r
2048\r
2049**/\r
95276127 2050EFI_DEVICE_PATH_PROTOCOL *\r
2051ConvertFromTextUsbClass (\r
2052 IN CHAR16 *TextDeviceNode,\r
2053 IN USB_CLASS_TEXT *UsbClassText\r
2054 )\r
2055{\r
2056 CHAR16 *VIDStr;\r
2057 CHAR16 *PIDStr;\r
2058 CHAR16 *ClassStr;\r
2059 CHAR16 *SubClassStr;\r
2060 CHAR16 *ProtocolStr;\r
2061 USB_CLASS_DEVICE_PATH *UsbClass;\r
2062\r
2063 UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
2064 MESSAGING_DEVICE_PATH,\r
2065 MSG_USB_CLASS_DP,\r
c9325700 2066 (UINT16) sizeof (USB_CLASS_DEVICE_PATH)\r
95276127 2067 );\r
2068\r
2069 VIDStr = GetNextParamStr (&TextDeviceNode);\r
2070 PIDStr = GetNextParamStr (&TextDeviceNode);\r
2071 if (UsbClassText->ClassExist) {\r
2072 ClassStr = GetNextParamStr (&TextDeviceNode);\r
38741080
DB
2073 if (*ClassStr == L'\0') {\r
2074 UsbClass->DeviceClass = 0xFF;\r
2075 } else {\r
2076 UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
2077 }\r
95276127 2078 } else {\r
2079 UsbClass->DeviceClass = UsbClassText->Class;\r
2080 }\r
2081 if (UsbClassText->SubClassExist) {\r
2082 SubClassStr = GetNextParamStr (&TextDeviceNode);\r
38741080
DB
2083 if (*SubClassStr == L'\0') {\r
2084 UsbClass->DeviceSubClass = 0xFF;\r
2085 } else {\r
2086 UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
2087 }\r
95276127 2088 } else {\r
2089 UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
572f5d8a 2090 }\r
95276127 2091\r
2092 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
2093\r
38741080
DB
2094 if (*VIDStr == L'\0') {\r
2095 UsbClass->VendorId = 0xFFFF;\r
2096 } else {\r
2097 UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
2098 }\r
2099 if (*PIDStr == L'\0') {\r
2100 UsbClass->ProductId = 0xFFFF;\r
2101 } else {\r
2102 UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
2103 }\r
2104 if (*ProtocolStr == L'\0') {\r
2105 UsbClass->DeviceProtocol = 0xFF;\r
2106 } else {\r
2107 UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
2108 }\r
95276127 2109\r
2110 return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
2111}\r
2112\r
2113\r
572f5d8a 2114/**\r
2115 Converts a text device path node to USB class device path structure.\r
2116\r
2117 @param TextDeviceNode The input Text device path node.\r
2118\r
2119 @return A pointer to the newly-created USB class device path structure.\r
2120\r
2121**/\r
95276127 2122EFI_DEVICE_PATH_PROTOCOL *\r
2123DevPathFromTextUsbClass (\r
2124 IN CHAR16 *TextDeviceNode\r
2125 )\r
2126{\r
2127 USB_CLASS_TEXT UsbClassText;\r
2128\r
2129 UsbClassText.ClassExist = TRUE;\r
2130 UsbClassText.SubClassExist = TRUE;\r
2131\r
2132 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2133}\r
2134\r
572f5d8a 2135/**\r
2136 Converts a text device path node to USB audio device path structure.\r
2137\r
2138 @param TextDeviceNode The input Text device path node.\r
2139\r
2140 @return A pointer to the newly-created USB audio device path structure.\r
2141\r
2142**/\r
95276127 2143EFI_DEVICE_PATH_PROTOCOL *\r
2144DevPathFromTextUsbAudio (\r
2145 IN CHAR16 *TextDeviceNode\r
2146 )\r
2147{\r
2148 USB_CLASS_TEXT UsbClassText;\r
2149\r
2150 UsbClassText.ClassExist = FALSE;\r
2151 UsbClassText.Class = USB_CLASS_AUDIO;\r
2152 UsbClassText.SubClassExist = TRUE;\r
2153\r
2154 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2155}\r
2156\r
572f5d8a 2157/**\r
2158 Converts a text device path node to USB CDC Control device path structure.\r
2159\r
2160 @param TextDeviceNode The input Text device path node.\r
2161\r
2162 @return A pointer to the newly-created USB CDC Control device path structure.\r
2163\r
2164**/\r
95276127 2165EFI_DEVICE_PATH_PROTOCOL *\r
2166DevPathFromTextUsbCDCControl (\r
2167 IN CHAR16 *TextDeviceNode\r
2168 )\r
2169{\r
2170 USB_CLASS_TEXT UsbClassText;\r
2171\r
2172 UsbClassText.ClassExist = FALSE;\r
2173 UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
2174 UsbClassText.SubClassExist = TRUE;\r
2175\r
2176 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2177}\r
2178\r
572f5d8a 2179/**\r
2180 Converts a text device path node to USB HID device path structure.\r
2181\r
2182 @param TextDeviceNode The input Text device path node.\r
2183\r
2184 @return A pointer to the newly-created USB HID device path structure.\r
2185\r
2186**/\r
95276127 2187EFI_DEVICE_PATH_PROTOCOL *\r
2188DevPathFromTextUsbHID (\r
2189 IN CHAR16 *TextDeviceNode\r
2190 )\r
2191{\r
2192 USB_CLASS_TEXT UsbClassText;\r
2193\r
2194 UsbClassText.ClassExist = FALSE;\r
2195 UsbClassText.Class = USB_CLASS_HID;\r
2196 UsbClassText.SubClassExist = TRUE;\r
2197\r
2198 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2199}\r
2200\r
572f5d8a 2201/**\r
2202 Converts a text device path node to USB Image device path structure.\r
2203\r
2204 @param TextDeviceNode The input Text device path node.\r
2205\r
2206 @return A pointer to the newly-created USB Image device path structure.\r
2207\r
2208**/\r
95276127 2209EFI_DEVICE_PATH_PROTOCOL *\r
2210DevPathFromTextUsbImage (\r
2211 IN CHAR16 *TextDeviceNode\r
2212 )\r
2213{\r
2214 USB_CLASS_TEXT UsbClassText;\r
2215\r
2216 UsbClassText.ClassExist = FALSE;\r
2217 UsbClassText.Class = USB_CLASS_IMAGE;\r
2218 UsbClassText.SubClassExist = TRUE;\r
2219\r
2220 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2221}\r
2222\r
572f5d8a 2223/**\r
2224 Converts a text device path node to USB Print device path structure.\r
2225\r
2226 @param TextDeviceNode The input Text device path node.\r
2227\r
2228 @return A pointer to the newly-created USB Print device path structure.\r
2229\r
2230**/\r
95276127 2231EFI_DEVICE_PATH_PROTOCOL *\r
2232DevPathFromTextUsbPrinter (\r
2233 IN CHAR16 *TextDeviceNode\r
2234 )\r
2235{\r
2236 USB_CLASS_TEXT UsbClassText;\r
2237\r
2238 UsbClassText.ClassExist = FALSE;\r
2239 UsbClassText.Class = USB_CLASS_PRINTER;\r
2240 UsbClassText.SubClassExist = TRUE;\r
2241\r
2242 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2243}\r
2244\r
572f5d8a 2245/**\r
2246 Converts a text device path node to USB mass storage device path structure.\r
2247\r
2248 @param TextDeviceNode The input Text device path node.\r
2249\r
2250 @return A pointer to the newly-created USB mass storage device path structure.\r
2251\r
2252**/\r
95276127 2253EFI_DEVICE_PATH_PROTOCOL *\r
2254DevPathFromTextUsbMassStorage (\r
2255 IN CHAR16 *TextDeviceNode\r
2256 )\r
2257{\r
2258 USB_CLASS_TEXT UsbClassText;\r
2259\r
2260 UsbClassText.ClassExist = FALSE;\r
2261 UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
2262 UsbClassText.SubClassExist = TRUE;\r
2263\r
2264 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2265}\r
2266\r
572f5d8a 2267/**\r
2268 Converts a text device path node to USB HUB device path structure.\r
2269\r
2270 @param TextDeviceNode The input Text device path node.\r
2271\r
2272 @return A pointer to the newly-created USB HUB device path structure.\r
2273\r
2274**/\r
95276127 2275EFI_DEVICE_PATH_PROTOCOL *\r
2276DevPathFromTextUsbHub (\r
2277 IN CHAR16 *TextDeviceNode\r
2278 )\r
2279{\r
2280 USB_CLASS_TEXT UsbClassText;\r
2281\r
2282 UsbClassText.ClassExist = FALSE;\r
2283 UsbClassText.Class = USB_CLASS_HUB;\r
2284 UsbClassText.SubClassExist = TRUE;\r
2285\r
2286 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2287}\r
2288\r
572f5d8a 2289/**\r
2290 Converts a text device path node to USB CDC data device path structure.\r
2291\r
2292 @param TextDeviceNode The input Text device path node.\r
2293\r
2294 @return A pointer to the newly-created USB CDC data device path structure.\r
2295\r
2296**/\r
95276127 2297EFI_DEVICE_PATH_PROTOCOL *\r
2298DevPathFromTextUsbCDCData (\r
2299 IN CHAR16 *TextDeviceNode\r
2300 )\r
2301{\r
2302 USB_CLASS_TEXT UsbClassText;\r
2303\r
2304 UsbClassText.ClassExist = FALSE;\r
2305 UsbClassText.Class = USB_CLASS_CDCDATA;\r
2306 UsbClassText.SubClassExist = TRUE;\r
2307\r
2308 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2309}\r
2310\r
572f5d8a 2311/**\r
2312 Converts a text device path node to USB smart card device path structure.\r
2313\r
2314 @param TextDeviceNode The input Text device path node.\r
2315\r
2316 @return A pointer to the newly-created USB smart card device path structure.\r
2317\r
2318**/\r
95276127 2319EFI_DEVICE_PATH_PROTOCOL *\r
2320DevPathFromTextUsbSmartCard (\r
2321 IN CHAR16 *TextDeviceNode\r
2322 )\r
2323{\r
2324 USB_CLASS_TEXT UsbClassText;\r
2325\r
2326 UsbClassText.ClassExist = FALSE;\r
2327 UsbClassText.Class = USB_CLASS_SMART_CARD;\r
2328 UsbClassText.SubClassExist = TRUE;\r
2329\r
2330 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2331}\r
2332\r
572f5d8a 2333/**\r
2334 Converts a text device path node to USB video device path structure.\r
2335\r
2336 @param TextDeviceNode The input Text device path node.\r
2337\r
2338 @return A pointer to the newly-created USB video device path structure.\r
2339\r
2340**/\r
95276127 2341EFI_DEVICE_PATH_PROTOCOL *\r
2342DevPathFromTextUsbVideo (\r
2343 IN CHAR16 *TextDeviceNode\r
2344 )\r
2345{\r
2346 USB_CLASS_TEXT UsbClassText;\r
2347\r
2348 UsbClassText.ClassExist = FALSE;\r
2349 UsbClassText.Class = USB_CLASS_VIDEO;\r
2350 UsbClassText.SubClassExist = TRUE;\r
2351\r
2352 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2353}\r
2354\r
572f5d8a 2355/**\r
2356 Converts a text device path node to USB diagnostic device path structure.\r
2357\r
2358 @param TextDeviceNode The input Text device path node.\r
2359\r
2360 @return A pointer to the newly-created USB diagnostic device path structure.\r
2361\r
2362**/\r
95276127 2363EFI_DEVICE_PATH_PROTOCOL *\r
2364DevPathFromTextUsbDiagnostic (\r
2365 IN CHAR16 *TextDeviceNode\r
2366 )\r
2367{\r
2368 USB_CLASS_TEXT UsbClassText;\r
2369\r
2370 UsbClassText.ClassExist = FALSE;\r
2371 UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
2372 UsbClassText.SubClassExist = TRUE;\r
2373\r
2374 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2375}\r
2376\r
572f5d8a 2377/**\r
2378 Converts a text device path node to USB wireless device path structure.\r
2379\r
2380 @param TextDeviceNode The input Text device path node.\r
2381\r
2382 @return A pointer to the newly-created USB wireless device path structure.\r
2383\r
2384**/\r
95276127 2385EFI_DEVICE_PATH_PROTOCOL *\r
2386DevPathFromTextUsbWireless (\r
2387 IN CHAR16 *TextDeviceNode\r
2388 )\r
2389{\r
2390 USB_CLASS_TEXT UsbClassText;\r
2391\r
2392 UsbClassText.ClassExist = FALSE;\r
2393 UsbClassText.Class = USB_CLASS_WIRELESS;\r
2394 UsbClassText.SubClassExist = TRUE;\r
2395\r
2396 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2397}\r
2398\r
572f5d8a 2399/**\r
2400 Converts a text device path node to USB device firmware update device path structure.\r
2401\r
2402 @param TextDeviceNode The input Text device path node.\r
2403\r
2404 @return A pointer to the newly-created USB device firmware update device path structure.\r
2405\r
2406**/\r
95276127 2407EFI_DEVICE_PATH_PROTOCOL *\r
2408DevPathFromTextUsbDeviceFirmwareUpdate (\r
2409 IN CHAR16 *TextDeviceNode\r
2410 )\r
2411{\r
2412 USB_CLASS_TEXT UsbClassText;\r
2413\r
2414 UsbClassText.ClassExist = FALSE;\r
2415 UsbClassText.Class = USB_CLASS_RESERVE;\r
2416 UsbClassText.SubClassExist = FALSE;\r
2417 UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
2418\r
2419 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2420}\r
2421\r
572f5d8a 2422/**\r
2423 Converts a text device path node to USB IRDA bridge device path structure.\r
2424\r
2425 @param TextDeviceNode The input Text device path node.\r
2426\r
2427 @return A pointer to the newly-created USB IRDA bridge device path structure.\r
2428\r
2429**/\r
95276127 2430EFI_DEVICE_PATH_PROTOCOL *\r
2431DevPathFromTextUsbIrdaBridge (\r
2432 IN CHAR16 *TextDeviceNode\r
2433 )\r
2434{\r
2435 USB_CLASS_TEXT UsbClassText;\r
2436\r
2437 UsbClassText.ClassExist = FALSE;\r
2438 UsbClassText.Class = USB_CLASS_RESERVE;\r
2439 UsbClassText.SubClassExist = FALSE;\r
2440 UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
2441\r
2442 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2443}\r
2444\r
572f5d8a 2445/**\r
2446 Converts a text device path node to USB text and measurement device path structure.\r
2447\r
2448 @param TextDeviceNode The input Text device path node.\r
2449\r
2450 @return A pointer to the newly-created USB text and measurement device path structure.\r
2451\r
2452**/\r
95276127 2453EFI_DEVICE_PATH_PROTOCOL *\r
2454DevPathFromTextUsbTestAndMeasurement (\r
2455 IN CHAR16 *TextDeviceNode\r
2456 )\r
2457{\r
2458 USB_CLASS_TEXT UsbClassText;\r
2459\r
2460 UsbClassText.ClassExist = FALSE;\r
2461 UsbClassText.Class = USB_CLASS_RESERVE;\r
2462 UsbClassText.SubClassExist = FALSE;\r
2463 UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
2464\r
2465 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
2466}\r
2467\r
572f5d8a 2468/**\r
2469 Converts a text device path node to USB WWID device path structure.\r
2470\r
2471 @param TextDeviceNode The input Text device path node.\r
2472\r
2473 @return A pointer to the newly-created USB WWID device path structure.\r
2474\r
2475**/\r
95276127 2476EFI_DEVICE_PATH_PROTOCOL *\r
2477DevPathFromTextUsbWwid (\r
2478 IN CHAR16 *TextDeviceNode\r
2479 )\r
2480{\r
2481 CHAR16 *VIDStr;\r
2482 CHAR16 *PIDStr;\r
2483 CHAR16 *InterfaceNumStr;\r
cf40f28a 2484 CHAR16 *SerialNumberStr;\r
95276127 2485 USB_WWID_DEVICE_PATH *UsbWwid;\r
9da38884
RN
2486 UINTN SerialNumberStrLen;\r
2487\r
2488 VIDStr = GetNextParamStr (&TextDeviceNode);\r
2489 PIDStr = GetNextParamStr (&TextDeviceNode);\r
2490 InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
2491 SerialNumberStr = GetNextParamStr (&TextDeviceNode);\r
2492 SerialNumberStrLen = StrLen (SerialNumberStr);\r
2493 if (SerialNumberStrLen >= 2 &&\r
2494 SerialNumberStr[0] == L'\"' &&\r
2495 SerialNumberStr[SerialNumberStrLen - 1] == L'\"'\r
2496 ) {\r
2497 SerialNumberStr[SerialNumberStrLen - 1] = L'\0';\r
2498 SerialNumberStr++;\r
2499 SerialNumberStrLen -= 2;\r
2500 }\r
2501 UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
95276127 2502 MESSAGING_DEVICE_PATH,\r
2503 MSG_USB_WWID_DP,\r
9da38884 2504 (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))\r
95276127 2505 );\r
9da38884
RN
2506 UsbWwid->VendorId = (UINT16) Strtoi (VIDStr);\r
2507 UsbWwid->ProductId = (UINT16) Strtoi (PIDStr);\r
2508 UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
750b4513
HW
2509\r
2510 //\r
2511 // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.\r
2512 // Therefore, the '\0' will not be copied.\r
2513 //\r
2514 CopyMem (\r
2515 (UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH),\r
2516 SerialNumberStr,\r
2517 SerialNumberStrLen * sizeof (CHAR16)\r
2518 );\r
95276127 2519\r
2520 return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
2521}\r
2522\r
572f5d8a 2523/**\r
2524 Converts a text device path node to Logic Unit device path structure.\r
2525\r
2526 @param TextDeviceNode The input Text device path node.\r
2527\r
2528 @return A pointer to the newly-created Logic Unit device path structure.\r
2529\r
2530**/\r
95276127 2531EFI_DEVICE_PATH_PROTOCOL *\r
2532DevPathFromTextUnit (\r
2533 IN CHAR16 *TextDeviceNode\r
2534 )\r
2535{\r
2536 CHAR16 *LunStr;\r
2537 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
2538\r
2539 LunStr = GetNextParamStr (&TextDeviceNode);\r
2540 LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
2541 MESSAGING_DEVICE_PATH,\r
2542 MSG_DEVICE_LOGICAL_UNIT_DP,\r
cf40f28a 2543 (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
95276127 2544 );\r
2545\r
cf40f28a 2546 LogicalUnit->Lun = (UINT8) Strtoi (LunStr);\r
95276127 2547\r
2548 return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
2549}\r
2550\r
572f5d8a 2551/**\r
2552 Converts a text device path node to iSCSI device path structure.\r
2553\r
2554 @param TextDeviceNode The input Text device path node.\r
2555\r
2556 @return A pointer to the newly-created iSCSI device path structure.\r
2557\r
2558**/\r
95276127 2559EFI_DEVICE_PATH_PROTOCOL *\r
2560DevPathFromTextiSCSI (\r
2561 IN CHAR16 *TextDeviceNode\r
2562 )\r
2563{\r
2564 UINT16 Options;\r
2565 CHAR16 *NameStr;\r
2566 CHAR16 *PortalGroupStr;\r
2567 CHAR16 *LunStr;\r
2568 CHAR16 *HeaderDigestStr;\r
2569 CHAR16 *DataDigestStr;\r
2570 CHAR16 *AuthenticationStr;\r
2571 CHAR16 *ProtocolStr;\r
cf40f28a 2572 CHAR8 *AsciiStr;\r
572f5d8a 2573 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
d0196be1 2574 UINT64 Lun;\r
95276127 2575\r
2576 NameStr = GetNextParamStr (&TextDeviceNode);\r
2577 PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
2578 LunStr = GetNextParamStr (&TextDeviceNode);\r
2579 HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
2580 DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
2581 AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
2582 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2583 ISCSIDevPath = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
95276127 2584 MESSAGING_DEVICE_PATH,\r
2585 MSG_ISCSI_DP,\r
047c6449 2586 (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
95276127 2587 );\r
2588\r
184f7d83 2589 AsciiStr = ISCSIDevPath->TargetName;\r
cf40f28a 2590 StrToAscii (NameStr, &AsciiStr);\r
2591\r
572f5d8a 2592 ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
d0196be1
RN
2593 Strtoi64 (LunStr, &Lun);\r
2594 WriteUnaligned64 ((UINT64 *) &ISCSIDevPath->Lun, SwapBytes64 (Lun));\r
95276127 2595\r
2596 Options = 0x0000;\r
2597 if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
2598 Options |= 0x0002;\r
2599 }\r
2600\r
2601 if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
2602 Options |= 0x0008;\r
2603 }\r
2604\r
2605 if (StrCmp (AuthenticationStr, L"None") == 0) {\r
2606 Options |= 0x0800;\r
2607 }\r
2608\r
2609 if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
2610 Options |= 0x1000;\r
2611 }\r
2612\r
572f5d8a 2613 ISCSIDevPath->LoginOption = (UINT16) Options;\r
95276127 2614\r
e6c80aea 2615 if (IS_NULL (*ProtocolStr) || (StrCmp (ProtocolStr, L"TCP") == 0)) {\r
7571a1c1
JW
2616 ISCSIDevPath->NetworkProtocol = 0;\r
2617 } else {\r
2618 //\r
2619 // Undefined and reserved.\r
2620 //\r
2621 ISCSIDevPath->NetworkProtocol = 1;\r
2622 }\r
95276127 2623\r
572f5d8a 2624 return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
95276127 2625}\r
2626\r
8f97f911 2627/**\r
2628 Converts a text device path node to VLAN device path structure.\r
2629\r
2630 @param TextDeviceNode The input Text device path node.\r
2631\r
2632 @return A pointer to the newly-created VLAN device path structure.\r
2633\r
2634**/\r
2635EFI_DEVICE_PATH_PROTOCOL *\r
2636DevPathFromTextVlan (\r
2637 IN CHAR16 *TextDeviceNode\r
2638 )\r
2639{\r
2640 CHAR16 *VlanStr;\r
2641 VLAN_DEVICE_PATH *Vlan;\r
2642\r
2643 VlanStr = GetNextParamStr (&TextDeviceNode);\r
2644 Vlan = (VLAN_DEVICE_PATH *) CreateDeviceNode (\r
2645 MESSAGING_DEVICE_PATH,\r
2646 MSG_VLAN_DP,\r
c9325700 2647 (UINT16) sizeof (VLAN_DEVICE_PATH)\r
8f97f911 2648 );\r
2649\r
2650 Vlan->VlanId = (UINT16) Strtoi (VlanStr);\r
2651\r
2652 return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
2653}\r
2654\r
7795c8f9
QS
2655/**\r
2656 Converts a text device path node to Bluetooth device path structure.\r
2657\r
2658 @param TextDeviceNode The input Text device path node.\r
2659\r
2660 @return A pointer to the newly-created Bluetooth device path structure.\r
2661\r
2662**/\r
2663EFI_DEVICE_PATH_PROTOCOL *\r
2664DevPathFromTextBluetooth (\r
2665 IN CHAR16 *TextDeviceNode\r
2666 )\r
2667{\r
2668 CHAR16 *BluetoothStr;\r
7795c8f9
QS
2669 BLUETOOTH_DEVICE_PATH *BluetoothDp;\r
2670\r
2671 BluetoothStr = GetNextParamStr (&TextDeviceNode);\r
4fc82771
HW
2672 BluetoothDp = (BLUETOOTH_DEVICE_PATH *) CreateDeviceNode (\r
2673 MESSAGING_DEVICE_PATH,\r
2674 MSG_BLUETOOTH_DP,\r
2675 (UINT16) sizeof (BLUETOOTH_DEVICE_PATH)\r
2676 );\r
2677 StrHexToBytes (\r
2678 BluetoothStr,\r
2679 sizeof (BLUETOOTH_ADDRESS) * 2,\r
2680 BluetoothDp->BD_ADDR.Address,\r
2681 sizeof (BLUETOOTH_ADDRESS)\r
2682 );\r
7795c8f9
QS
2683 return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothDp;\r
2684}\r
2685\r
3bafd562
HW
2686/**\r
2687 Converts a text device path node to Wi-Fi device path structure.\r
2688\r
2689 @param TextDeviceNode The input Text device path node.\r
2690\r
2691 @return A pointer to the newly-created Wi-Fi device path structure.\r
2692\r
2693**/\r
2694EFI_DEVICE_PATH_PROTOCOL *\r
2695DevPathFromTextWiFi (\r
2696 IN CHAR16 *TextDeviceNode\r
2697 )\r
2698{\r
2699 CHAR16 *SSIdStr;\r
0cd35d73
HW
2700 CHAR8 AsciiStr[33];\r
2701 UINTN DataLen;\r
3bafd562
HW
2702 WIFI_DEVICE_PATH *WiFiDp;\r
2703\r
2704 SSIdStr = GetNextParamStr (&TextDeviceNode);\r
2705 WiFiDp = (WIFI_DEVICE_PATH *) CreateDeviceNode (\r
2706 MESSAGING_DEVICE_PATH,\r
2707 MSG_WIFI_DP,\r
2708 (UINT16) sizeof (WIFI_DEVICE_PATH)\r
2709 );\r
2710\r
0cd35d73
HW
2711 if (NULL != SSIdStr) {\r
2712 DataLen = StrLen (SSIdStr);\r
2713 if (StrLen (SSIdStr) > 32) {\r
2714 SSIdStr[32] = L'\0';\r
2715 DataLen = 32;\r
2716 }\r
2717\r
ca2ac9d5 2718 UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));\r
0cd35d73
HW
2719 CopyMem (WiFiDp->SSId, AsciiStr, DataLen);\r
2720 }\r
3bafd562
HW
2721\r
2722 return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;\r
2723}\r
2724\r
ff5623e9
RN
2725/**\r
2726 Converts a text device path node to Bluetooth LE device path structure.\r
2727\r
2728 @param TextDeviceNode The input Text device path node.\r
2729\r
2730 @return A pointer to the newly-created Bluetooth LE device path structure.\r
2731\r
2732**/\r
2733EFI_DEVICE_PATH_PROTOCOL *\r
2734DevPathFromTextBluetoothLE (\r
2735 IN CHAR16 *TextDeviceNode\r
2736 )\r
2737{\r
2738 CHAR16 *BluetoothLeAddrStr;\r
2739 CHAR16 *BluetoothLeAddrTypeStr;\r
2740 BLUETOOTH_LE_DEVICE_PATH *BluetoothLeDp;\r
2741\r
2742 BluetoothLeAddrStr = GetNextParamStr (&TextDeviceNode);\r
2743 BluetoothLeAddrTypeStr = GetNextParamStr (&TextDeviceNode);\r
2744 BluetoothLeDp = (BLUETOOTH_LE_DEVICE_PATH *) CreateDeviceNode (\r
2745 MESSAGING_DEVICE_PATH,\r
2746 MSG_BLUETOOTH_LE_DP,\r
2747 (UINT16) sizeof (BLUETOOTH_LE_DEVICE_PATH)\r
2748 );\r
2749\r
2750 BluetoothLeDp->Address.Type = (UINT8) Strtoi (BluetoothLeAddrTypeStr);\r
2751 StrHexToBytes (\r
2752 BluetoothLeAddrStr, sizeof (BluetoothLeDp->Address.Address) * 2,\r
2753 BluetoothLeDp->Address.Address, sizeof (BluetoothLeDp->Address.Address)\r
2754 );\r
2755 return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;\r
2756}\r
2757\r
9b9d0655
JW
2758/**\r
2759 Converts a text device path node to DNS 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 DNS device path structure.\r
2764\r
2765**/\r
2766EFI_DEVICE_PATH_PROTOCOL *\r
2767DevPathFromTextDns (\r
2768 IN CHAR16 *TextDeviceNode\r
2769 )\r
2770{\r
2771 CHAR16 *DeviceNodeStr;\r
2772 CHAR16 *DeviceNodeStrPtr;\r
2773 UINT32 DnsServerIpCount;\r
2774 UINT16 DnsDeviceNodeLength;\r
2775 DNS_DEVICE_PATH *DnsDeviceNode;\r
2776 UINT32 DnsServerIpIndex;\r
2777 CHAR16 *DnsServerIp;\r
2778\r
2779\r
2780 //\r
2781 // Count the DNS server address number.\r
2782 //\r
2783 DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);\r
2784 if (DeviceNodeStr == NULL) {\r
2785 return NULL;\r
2786 }\r
2787\r
2788 DeviceNodeStrPtr = DeviceNodeStr;\r
9095d37b 2789\r
9b9d0655
JW
2790 DnsServerIpCount = 0;\r
2791 while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != L'\0') {\r
2792 GetNextParamStr (&DeviceNodeStrPtr);\r
9095d37b 2793 DnsServerIpCount ++;\r
9b9d0655
JW
2794 }\r
2795\r
2796 FreePool (DeviceNodeStr);\r
2797 DeviceNodeStr = NULL;\r
2798\r
2799 //\r
9095d37b 2800 // One or more instances of the DNS server address in EFI_IP_ADDRESS,\r
9b9d0655
JW
2801 // otherwise, NULL will be returned.\r
2802 //\r
2803 if (DnsServerIpCount == 0) {\r
2804 return NULL;\r
2805 }\r
2806\r
2807 //\r
2808 // Create the DNS DeviceNode.\r
2809 //\r
2810 DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));\r
2811 DnsDeviceNode = (DNS_DEVICE_PATH *) CreateDeviceNode (\r
2812 MESSAGING_DEVICE_PATH,\r
2813 MSG_DNS_DP,\r
2814 DnsDeviceNodeLength\r
2815 );\r
2816 if (DnsDeviceNode == NULL) {\r
2817 return NULL;\r
2818 }\r
2819\r
2820 //\r
2821 // Confirm the DNS server address is IPv4 or IPv6 type.\r
2822 //\r
2823 DeviceNodeStrPtr = TextDeviceNode;\r
2824 while (!IS_NULL (*DeviceNodeStrPtr)) {\r
2825 if (*DeviceNodeStrPtr == L'.') {\r
2826 DnsDeviceNode->IsIPv6 = 0x00;\r
2827 break;\r
2828 }\r
2829\r
2830 if (*DeviceNodeStrPtr == L':') {\r
2831 DnsDeviceNode->IsIPv6 = 0x01;\r
2832 break;\r
2833 }\r
2834\r
2835 DeviceNodeStrPtr++;\r
2836 }\r
2837\r
2838 for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {\r
2839 DnsServerIp = GetNextParamStr (&TextDeviceNode);\r
2840 if (DnsDeviceNode->IsIPv6 == 0x00) {\r
2841 StrToIpv4Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);\r
2842 } else {\r
2843 StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);\r
2844 }\r
2845 }\r
9095d37b 2846\r
9b9d0655
JW
2847 return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode;\r
2848}\r
2849\r
c808ac7b
RN
2850/**\r
2851 Converts a text device path node to URI device path structure.\r
2852\r
2853 @param TextDeviceNode The input Text device path node.\r
2854\r
2855 @return A pointer to the newly-created URI device path structure.\r
2856\r
2857**/\r
2858EFI_DEVICE_PATH_PROTOCOL *\r
2859DevPathFromTextUri (\r
2860 IN CHAR16 *TextDeviceNode\r
2861 )\r
2862{\r
2863 CHAR16 *UriStr;\r
2864 UINTN UriLength;\r
2865 URI_DEVICE_PATH *Uri;\r
2866\r
2867 UriStr = GetNextParamStr (&TextDeviceNode);\r
2868 UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));\r
2869 Uri = (URI_DEVICE_PATH *) CreateDeviceNode (\r
2870 MESSAGING_DEVICE_PATH,\r
2871 MSG_URI_DP,\r
2872 (UINT16) (sizeof (URI_DEVICE_PATH) + UriLength)\r
2873 );\r
2874\r
2875 while (UriLength-- != 0) {\r
2876 Uri->Uri[UriLength] = (CHAR8) UriStr[UriLength];\r
2877 }\r
2878\r
2879 return (EFI_DEVICE_PATH_PROTOCOL *) Uri;\r
2880}\r
2881\r
5d6a5aee
RN
2882/**\r
2883 Converts a media text device path node to media device path structure.\r
2884\r
2885 @param TextDeviceNode The input Text device path node.\r
2886\r
2887 @return A pointer to media device path structure.\r
2888\r
2889**/\r
2890EFI_DEVICE_PATH_PROTOCOL *\r
2891DevPathFromTextMediaPath (\r
2892 IN CHAR16 *TextDeviceNode\r
2893 )\r
2894{\r
2895 return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);\r
2896}\r
2897\r
572f5d8a 2898/**\r
2899 Converts a text device path node to HD device path structure.\r
2900\r
2901 @param TextDeviceNode The input Text device path node.\r
2902\r
2903 @return A pointer to the newly-created HD device path structure.\r
2904\r
2905**/\r
95276127 2906EFI_DEVICE_PATH_PROTOCOL *\r
2907DevPathFromTextHD (\r
2908 IN CHAR16 *TextDeviceNode\r
2909 )\r
2910{\r
2911 CHAR16 *PartitionStr;\r
2912 CHAR16 *TypeStr;\r
2913 CHAR16 *SignatureStr;\r
2914 CHAR16 *StartStr;\r
2915 CHAR16 *SizeStr;\r
2916 UINT32 Signature32;\r
95276127 2917 HARDDRIVE_DEVICE_PATH *Hd;\r
2918\r
2919 PartitionStr = GetNextParamStr (&TextDeviceNode);\r
2920 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2921 SignatureStr = GetNextParamStr (&TextDeviceNode);\r
2922 StartStr = GetNextParamStr (&TextDeviceNode);\r
2923 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2924 Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
2925 MEDIA_DEVICE_PATH,\r
2926 MEDIA_HARDDRIVE_DP,\r
c9325700 2927 (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
95276127 2928 );\r
2929\r
9da38884 2930 Hd->PartitionNumber = (UINT32) Strtoi (PartitionStr);\r
95276127 2931\r
2932 ZeroMem (Hd->Signature, 16);\r
2933 Hd->MBRType = (UINT8) 0;\r
2934\r
cf40f28a 2935 if (StrCmp (TypeStr, L"MBR") == 0) {\r
95276127 2936 Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
2937 Hd->MBRType = 0x01;\r
2938\r
cf40f28a 2939 Signature32 = (UINT32) Strtoi (SignatureStr);\r
95276127 2940 CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
cf40f28a 2941 } else if (StrCmp (TypeStr, L"GPT") == 0) {\r
95276127 2942 Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
2943 Hd->MBRType = 0x02;\r
2944\r
96d37135 2945 StrToGuid (SignatureStr, (EFI_GUID *) Hd->Signature);\r
95276127 2946 } else {\r
cf40f28a 2947 Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
95276127 2948 }\r
2949\r
cf40f28a 2950 Strtoi64 (StartStr, &Hd->PartitionStart);\r
2951 Strtoi64 (SizeStr, &Hd->PartitionSize);\r
95276127 2952\r
2953 return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
2954}\r
2955\r
572f5d8a 2956/**\r
2957 Converts a text device path node to CDROM device path structure.\r
2958\r
2959 @param TextDeviceNode The input Text device path node.\r
2960\r
2961 @return A pointer to the newly-created CDROM device path structure.\r
2962\r
2963**/\r
95276127 2964EFI_DEVICE_PATH_PROTOCOL *\r
2965DevPathFromTextCDROM (\r
2966 IN CHAR16 *TextDeviceNode\r
2967 )\r
2968{\r
2969 CHAR16 *EntryStr;\r
2970 CHAR16 *StartStr;\r
2971 CHAR16 *SizeStr;\r
572f5d8a 2972 CDROM_DEVICE_PATH *CDROMDevPath;\r
95276127 2973\r
2974 EntryStr = GetNextParamStr (&TextDeviceNode);\r
2975 StartStr = GetNextParamStr (&TextDeviceNode);\r
2976 SizeStr = GetNextParamStr (&TextDeviceNode);\r
572f5d8a 2977 CDROMDevPath = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
95276127 2978 MEDIA_DEVICE_PATH,\r
2979 MEDIA_CDROM_DP,\r
c9325700 2980 (UINT16) sizeof (CDROM_DEVICE_PATH)\r
95276127 2981 );\r
2982\r
572f5d8a 2983 CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);\r
2984 Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);\r
2985 Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);\r
95276127 2986\r
572f5d8a 2987 return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;\r
95276127 2988}\r
2989\r
572f5d8a 2990/**\r
2991 Converts a text device path node to Vendor-defined media device path structure.\r
2992\r
2993 @param TextDeviceNode The input Text device path node.\r
2994\r
2995 @return A pointer to the newly-created Vendor-defined media device path structure.\r
2996\r
2997**/\r
95276127 2998EFI_DEVICE_PATH_PROTOCOL *\r
9da38884 2999DevPathFromTextVenMedia (\r
95276127 3000 IN CHAR16 *TextDeviceNode\r
3001 )\r
3002{\r
3003 return ConvertFromTextVendor (\r
3004 TextDeviceNode,\r
3005 MEDIA_DEVICE_PATH,\r
3006 MEDIA_VENDOR_DP\r
3007 );\r
3008}\r
3009\r
572f5d8a 3010/**\r
3011 Converts a text device path node to File device path structure.\r
3012\r
3013 @param TextDeviceNode The input Text device path node.\r
3014\r
3015 @return A pointer to the newly-created File device path structure.\r
3016\r
3017**/\r
95276127 3018EFI_DEVICE_PATH_PROTOCOL *\r
3019DevPathFromTextFilePath (\r
3020 IN CHAR16 *TextDeviceNode\r
3021 )\r
3022{\r
3023 FILEPATH_DEVICE_PATH *File;\r
3024\r
3025 File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
3026 MEDIA_DEVICE_PATH,\r
3027 MEDIA_FILEPATH_DP,\r
d074a8e1 3028 (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
95276127 3029 );\r
3030\r
750b4513 3031 StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);\r
95276127 3032\r
3033 return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
3034}\r
3035\r
572f5d8a 3036/**\r
3037 Converts a text device path node to Media protocol device path structure.\r
3038\r
3039 @param TextDeviceNode The input Text device path node.\r
3040\r
3041 @return A pointer to the newly-created Media protocol device path structure.\r
3042\r
3043**/\r
95276127 3044EFI_DEVICE_PATH_PROTOCOL *\r
3045DevPathFromTextMedia (\r
3046 IN CHAR16 *TextDeviceNode\r
3047 )\r
3048{\r
3049 CHAR16 *GuidStr;\r
3050 MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
3051\r
3052 GuidStr = GetNextParamStr (&TextDeviceNode);\r
3053 Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
3054 MEDIA_DEVICE_PATH,\r
3055 MEDIA_PROTOCOL_DP,\r
c9325700 3056 (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
95276127 3057 );\r
3058\r
96d37135 3059 StrToGuid (GuidStr, &Media->Protocol);\r
95276127 3060\r
3061 return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
3062}\r
3063\r
572f5d8a 3064/**\r
3065 Converts a text device path node to firmware volume device path structure.\r
3066\r
3067 @param TextDeviceNode The input Text device path node.\r
3068\r
3069 @return A pointer to the newly-created firmware volume device path structure.\r
3070\r
3071**/\r
cf40f28a 3072EFI_DEVICE_PATH_PROTOCOL *\r
3073DevPathFromTextFv (\r
3074 IN CHAR16 *TextDeviceNode\r
3075 )\r
3076{\r
3077 CHAR16 *GuidStr;\r
3078 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
3079\r
3080 GuidStr = GetNextParamStr (&TextDeviceNode);\r
3081 Fv = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
3082 MEDIA_DEVICE_PATH,\r
3083 MEDIA_PIWG_FW_VOL_DP,\r
c9325700 3084 (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
cf40f28a 3085 );\r
3086\r
96d37135 3087 StrToGuid (GuidStr, &Fv->FvName);\r
cf40f28a 3088\r
3089 return (EFI_DEVICE_PATH_PROTOCOL *) Fv;\r
3090}\r
3091\r
572f5d8a 3092/**\r
3093 Converts a text device path node to firmware file device path structure.\r
3094\r
3095 @param TextDeviceNode The input Text device path node.\r
3096\r
3097 @return A pointer to the newly-created firmware file device path structure.\r
3098\r
3099**/\r
cf40f28a 3100EFI_DEVICE_PATH_PROTOCOL *\r
3101DevPathFromTextFvFile (\r
3102 IN CHAR16 *TextDeviceNode\r
3103 )\r
3104{\r
3105 CHAR16 *GuidStr;\r
3106 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
3107\r
3108 GuidStr = GetNextParamStr (&TextDeviceNode);\r
3109 FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
3110 MEDIA_DEVICE_PATH,\r
3111 MEDIA_PIWG_FW_FILE_DP,\r
c9325700 3112 (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
cf40f28a 3113 );\r
3114\r
96d37135 3115 StrToGuid (GuidStr, &FvFile->FvFileName);\r
cf40f28a 3116\r
3117 return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;\r
3118}\r
3119\r
192b057b 3120/**\r
3121 Converts a text device path node to text relative offset device path structure.\r
3122\r
3123 @param TextDeviceNode The input Text device path node.\r
3124\r
3125 @return A pointer to the newly-created Text device path structure.\r
3126\r
3127**/\r
3128EFI_DEVICE_PATH_PROTOCOL *\r
3129DevPathFromTextRelativeOffsetRange (\r
3130 IN CHAR16 *TextDeviceNode\r
3131 )\r
3132{\r
395ed063 3133 CHAR16 *StartingOffsetStr;\r
3134 CHAR16 *EndingOffsetStr;\r
3135 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
192b057b 3136\r
3137 StartingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
3138 EndingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
395ed063 3139 Offset = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (\r
3140 MEDIA_DEVICE_PATH,\r
3141 MEDIA_RELATIVE_OFFSET_RANGE_DP,\r
c9325700 3142 (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
395ed063 3143 );\r
3144\r
792a1534 3145 Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);\r
3146 Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);\r
192b057b 3147\r
3148 return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
3149}\r
3150\r
6a46c1a2
FT
3151/**\r
3152 Converts a text device path node to text ram disk device path structure.\r
3153\r
3154 @param TextDeviceNode The input Text device path node.\r
3155\r
3156 @return A pointer to the newly-created Text device path structure.\r
3157\r
3158**/\r
3159EFI_DEVICE_PATH_PROTOCOL *\r
3160DevPathFromTextRamDisk (\r
3161 IN CHAR16 *TextDeviceNode\r
3162 )\r
3163{\r
3164 CHAR16 *StartingAddrStr;\r
3165 CHAR16 *EndingAddrStr;\r
3166 CHAR16 *TypeGuidStr;\r
3167 CHAR16 *InstanceStr;\r
3168 MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;\r
3169 UINT64 StartingAddr;\r
3170 UINT64 EndingAddr;\r
3171\r
3172 StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3173 EndingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3174 InstanceStr = GetNextParamStr (&TextDeviceNode);\r
3175 TypeGuidStr = GetNextParamStr (&TextDeviceNode);\r
3176 RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
3177 MEDIA_DEVICE_PATH,\r
3178 MEDIA_RAM_DISK_DP,\r
3179 (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
3180 );\r
3181\r
3182 Strtoi64 (StartingAddrStr, &StartingAddr);\r
3183 WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
3184 Strtoi64 (EndingAddrStr, &EndingAddr);\r
3185 WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
3186 RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
96d37135 3187 StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);\r
6a46c1a2
FT
3188\r
3189 return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
3190}\r
3191\r
3192/**\r
3193 Converts a text device path node to text virtual disk device path structure.\r
3194\r
3195 @param TextDeviceNode The input Text device path node.\r
3196\r
3197 @return A pointer to the newly-created Text device path structure.\r
3198\r
3199**/\r
3200EFI_DEVICE_PATH_PROTOCOL *\r
3201DevPathFromTextVirtualDisk (\r
3202 IN CHAR16 *TextDeviceNode\r
3203 )\r
3204{\r
3205 CHAR16 *StartingAddrStr;\r
3206 CHAR16 *EndingAddrStr;\r
3207 CHAR16 *InstanceStr;\r
3208 MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;\r
3209 UINT64 StartingAddr;\r
3210 UINT64 EndingAddr;\r
3211\r
3212 StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3213 EndingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3214 InstanceStr = GetNextParamStr (&TextDeviceNode);\r
3215\r
3216 RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
3217 MEDIA_DEVICE_PATH,\r
3218 MEDIA_RAM_DISK_DP,\r
3219 (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
3220 );\r
3221\r
3222 Strtoi64 (StartingAddrStr, &StartingAddr);\r
3223 WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
3224 Strtoi64 (EndingAddrStr, &EndingAddr);\r
3225 WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
3226 RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
3227 CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);\r
3228\r
3229 return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
3230}\r
3231\r
3232/**\r
3233 Converts a text device path node to text virtual cd device path structure.\r
3234\r
3235 @param TextDeviceNode The input Text device path node.\r
3236\r
3237 @return A pointer to the newly-created Text device path structure.\r
3238\r
3239**/\r
3240EFI_DEVICE_PATH_PROTOCOL *\r
3241DevPathFromTextVirtualCd (\r
3242 IN CHAR16 *TextDeviceNode\r
3243 )\r
3244{\r
3245 CHAR16 *StartingAddrStr;\r
3246 CHAR16 *EndingAddrStr;\r
3247 CHAR16 *InstanceStr;\r
3248 MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;\r
3249 UINT64 StartingAddr;\r
3250 UINT64 EndingAddr;\r
3251\r
3252 StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3253 EndingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3254 InstanceStr = GetNextParamStr (&TextDeviceNode);\r
3255\r
3256 RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
3257 MEDIA_DEVICE_PATH,\r
3258 MEDIA_RAM_DISK_DP,\r
3259 (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
3260 );\r
3261\r
3262 Strtoi64 (StartingAddrStr, &StartingAddr);\r
3263 WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
3264 Strtoi64 (EndingAddrStr, &EndingAddr);\r
3265 WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
3266 RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
3267 CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);\r
3268\r
3269 return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
3270}\r
3271\r
3272/**\r
3273 Converts a text device path node to text persistent virtual disk device path structure.\r
3274\r
3275 @param TextDeviceNode The input Text device path node.\r
3276\r
3277 @return A pointer to the newly-created Text device path structure.\r
3278\r
3279**/\r
3280EFI_DEVICE_PATH_PROTOCOL *\r
3281DevPathFromTextPersistentVirtualDisk (\r
3282 IN CHAR16 *TextDeviceNode\r
3283 )\r
3284{\r
3285 CHAR16 *StartingAddrStr;\r
3286 CHAR16 *EndingAddrStr;\r
3287 CHAR16 *InstanceStr;\r
3288 MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;\r
3289 UINT64 StartingAddr;\r
3290 UINT64 EndingAddr;\r
3291\r
3292 StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3293 EndingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3294 InstanceStr = GetNextParamStr (&TextDeviceNode);\r
3295\r
3296 RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
3297 MEDIA_DEVICE_PATH,\r
3298 MEDIA_RAM_DISK_DP,\r
3299 (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
3300 );\r
3301\r
3302 Strtoi64 (StartingAddrStr, &StartingAddr);\r
3303 WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
3304 Strtoi64 (EndingAddrStr, &EndingAddr);\r
3305 WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
3306 RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
3307 CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);\r
3308\r
3309 return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
3310}\r
3311\r
3312/**\r
3313 Converts a text device path node to text persistent virtual cd device path structure.\r
3314\r
3315 @param TextDeviceNode The input Text device path node.\r
3316\r
3317 @return A pointer to the newly-created Text device path structure.\r
3318\r
3319**/\r
3320EFI_DEVICE_PATH_PROTOCOL *\r
3321DevPathFromTextPersistentVirtualCd (\r
3322 IN CHAR16 *TextDeviceNode\r
3323 )\r
3324{\r
3325 CHAR16 *StartingAddrStr;\r
3326 CHAR16 *EndingAddrStr;\r
3327 CHAR16 *InstanceStr;\r
3328 MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;\r
3329 UINT64 StartingAddr;\r
3330 UINT64 EndingAddr;\r
3331\r
3332 StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3333 EndingAddrStr = GetNextParamStr (&TextDeviceNode);\r
3334 InstanceStr = GetNextParamStr (&TextDeviceNode);\r
3335\r
3336 RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
3337 MEDIA_DEVICE_PATH,\r
3338 MEDIA_RAM_DISK_DP,\r
3339 (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
3340 );\r
3341\r
3342 Strtoi64 (StartingAddrStr, &StartingAddr);\r
3343 WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
3344 Strtoi64 (EndingAddrStr, &EndingAddr);\r
3345 WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
3346 RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
3347 CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);\r
3348\r
3349 return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
3350}\r
5d6a5aee
RN
3351\r
3352/**\r
3353 Converts a BBS text device path node to BBS device path structure.\r
3354\r
3355 @param TextDeviceNode The input Text device path node.\r
3356\r
3357 @return A pointer to BBS device path structure.\r
3358\r
3359**/\r
3360EFI_DEVICE_PATH_PROTOCOL *\r
3361DevPathFromTextBbsPath (\r
3362 IN CHAR16 *TextDeviceNode\r
3363 )\r
3364{\r
3365 return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);\r
3366}\r
3367\r
572f5d8a 3368/**\r
3369 Converts a text device path node to BIOS Boot Specification device path structure.\r
3370\r
3371 @param TextDeviceNode The input Text device path node.\r
3372\r
5755841f 3373 @return A pointer to the newly-created BIOS Boot Specification device path structure.\r
572f5d8a 3374\r
3375**/\r
95276127 3376EFI_DEVICE_PATH_PROTOCOL *\r
3377DevPathFromTextBBS (\r
3378 IN CHAR16 *TextDeviceNode\r
3379 )\r
3380{\r
3381 CHAR16 *TypeStr;\r
3382 CHAR16 *IdStr;\r
3383 CHAR16 *FlagsStr;\r
cf40f28a 3384 CHAR8 *AsciiStr;\r
95276127 3385 BBS_BBS_DEVICE_PATH *Bbs;\r
3386\r
3387 TypeStr = GetNextParamStr (&TextDeviceNode);\r
3388 IdStr = GetNextParamStr (&TextDeviceNode);\r
3389 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
3390 Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
3391 BBS_DEVICE_PATH,\r
3392 BBS_BBS_DP,\r
d074a8e1 3393 (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))\r
95276127 3394 );\r
3395\r
3396 if (StrCmp (TypeStr, L"Floppy") == 0) {\r
3397 Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
3398 } else if (StrCmp (TypeStr, L"HD") == 0) {\r
3399 Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
3400 } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
3401 Bbs->DeviceType = BBS_TYPE_CDROM;\r
3402 } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
3403 Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
3404 } else if (StrCmp (TypeStr, L"USB") == 0) {\r
3405 Bbs->DeviceType = BBS_TYPE_USB;\r
3406 } else if (StrCmp (TypeStr, L"Network") == 0) {\r
3407 Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
3408 } else {\r
cf40f28a 3409 Bbs->DeviceType = (UINT16) Strtoi (TypeStr);\r
95276127 3410 }\r
3411\r
cf40f28a 3412 AsciiStr = Bbs->String;\r
3413 StrToAscii (IdStr, &AsciiStr);\r
95276127 3414\r
cf40f28a 3415 Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);\r
95276127 3416\r
3417 return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
3418}\r
3419\r
572f5d8a 3420/**\r
3421 Converts a text device path node to SATA device path structure.\r
3422\r
3423 @param TextDeviceNode The input Text device path node.\r
3424\r
3425 @return A pointer to the newly-created SATA device path structure.\r
3426\r
3427**/\r
cf40f28a 3428EFI_DEVICE_PATH_PROTOCOL *\r
3429DevPathFromTextSata (\r
3430 IN CHAR16 *TextDeviceNode\r
3431 )\r
3432{\r
3433 SATA_DEVICE_PATH *Sata;\r
3434 CHAR16 *Param1;\r
3435 CHAR16 *Param2;\r
3436 CHAR16 *Param3;\r
3437\r
cf40f28a 3438 Param1 = GetNextParamStr (&TextDeviceNode);\r
3439 Param2 = GetNextParamStr (&TextDeviceNode);\r
9da38884 3440 Param3 = GetNextParamStr (&TextDeviceNode);\r
cf40f28a 3441\r
3442 Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
3443 MESSAGING_DEVICE_PATH,\r
3444 MSG_SATA_DP,\r
c9325700 3445 (UINT16) sizeof (SATA_DEVICE_PATH)\r
cf40f28a 3446 );\r
9da38884 3447 Sata->HBAPortNumber = (UINT16) Strtoi (Param1);\r
6d9b9bbb
DB
3448\r
3449 //\r
3450 // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF\r
3451 //\r
3452 if (*Param2 == L'\0' ) {\r
3453 Sata->PortMultiplierPortNumber = 0xFFFF;\r
3454 } else {\r
3455 Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
3456 }\r
9da38884 3457 Sata->Lun = (UINT16) Strtoi (Param3);\r
cf40f28a 3458\r
3459 return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r
3460}\r
3461\r
4d0a30a4 3462GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {\r
5d6a5aee
RN
3463 {L"Path", DevPathFromTextPath },\r
3464\r
3465 {L"HardwarePath", DevPathFromTextHardwarePath },\r
4d0a30a4
RN
3466 {L"Pci", DevPathFromTextPci },\r
3467 {L"PcCard", DevPathFromTextPcCard },\r
3468 {L"MemoryMapped", DevPathFromTextMemoryMapped },\r
3469 {L"VenHw", DevPathFromTextVenHw },\r
3470 {L"Ctrl", DevPathFromTextCtrl },\r
678226f6 3471 {L"BMC", DevPathFromTextBmc },\r
5d6a5aee
RN
3472\r
3473 {L"AcpiPath", DevPathFromTextAcpiPath },\r
4d0a30a4
RN
3474 {L"Acpi", DevPathFromTextAcpi },\r
3475 {L"PciRoot", DevPathFromTextPciRoot },\r
3476 {L"PcieRoot", DevPathFromTextPcieRoot },\r
3477 {L"Floppy", DevPathFromTextFloppy },\r
3478 {L"Keyboard", DevPathFromTextKeyboard },\r
3479 {L"Serial", DevPathFromTextSerial },\r
3480 {L"ParallelPort", DevPathFromTextParallelPort },\r
3481 {L"AcpiEx", DevPathFromTextAcpiEx },\r
3482 {L"AcpiExp", DevPathFromTextAcpiExp },\r
3483 {L"AcpiAdr", DevPathFromTextAcpiAdr },\r
5d6a5aee
RN
3484\r
3485 {L"Msg", DevPathFromTextMsg },\r
4d0a30a4
RN
3486 {L"Ata", DevPathFromTextAta },\r
3487 {L"Scsi", DevPathFromTextScsi },\r
3488 {L"Fibre", DevPathFromTextFibre },\r
3489 {L"FibreEx", DevPathFromTextFibreEx },\r
3490 {L"I1394", DevPathFromText1394 },\r
3491 {L"USB", DevPathFromTextUsb },\r
3492 {L"I2O", DevPathFromTextI2O },\r
3493 {L"Infiniband", DevPathFromTextInfiniband },\r
3494 {L"VenMsg", DevPathFromTextVenMsg },\r
3495 {L"VenPcAnsi", DevPathFromTextVenPcAnsi },\r
3496 {L"VenVt100", DevPathFromTextVenVt100 },\r
3497 {L"VenVt100Plus", DevPathFromTextVenVt100Plus },\r
3498 {L"VenUtf8", DevPathFromTextVenUtf8 },\r
3499 {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl },\r
3500 {L"SAS", DevPathFromTextSAS },\r
3501 {L"SasEx", DevPathFromTextSasEx },\r
a06ec3e2 3502 {L"NVMe", DevPathFromTextNVMe },\r
52306166 3503 {L"UFS", DevPathFromTextUfs },\r
ab8686b8 3504 {L"SD", DevPathFromTextSd },\r
d18f9699 3505 {L"eMMC", DevPathFromTextEmmc },\r
4d0a30a4
RN
3506 {L"DebugPort", DevPathFromTextDebugPort },\r
3507 {L"MAC", DevPathFromTextMAC },\r
3508 {L"IPv4", DevPathFromTextIPv4 },\r
3509 {L"IPv6", DevPathFromTextIPv6 },\r
3510 {L"Uart", DevPathFromTextUart },\r
3511 {L"UsbClass", DevPathFromTextUsbClass },\r
3512 {L"UsbAudio", DevPathFromTextUsbAudio },\r
3513 {L"UsbCDCControl", DevPathFromTextUsbCDCControl },\r
3514 {L"UsbHID", DevPathFromTextUsbHID },\r
3515 {L"UsbImage", DevPathFromTextUsbImage },\r
3516 {L"UsbPrinter", DevPathFromTextUsbPrinter },\r
3517 {L"UsbMassStorage", DevPathFromTextUsbMassStorage },\r
3518 {L"UsbHub", DevPathFromTextUsbHub },\r
3519 {L"UsbCDCData", DevPathFromTextUsbCDCData },\r
3520 {L"UsbSmartCard", DevPathFromTextUsbSmartCard },\r
3521 {L"UsbVideo", DevPathFromTextUsbVideo },\r
3522 {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic },\r
3523 {L"UsbWireless", DevPathFromTextUsbWireless },\r
3524 {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },\r
3525 {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge },\r
3526 {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement },\r
3527 {L"UsbWwid", DevPathFromTextUsbWwid },\r
3528 {L"Unit", DevPathFromTextUnit },\r
3529 {L"iSCSI", DevPathFromTextiSCSI },\r
3530 {L"Vlan", DevPathFromTextVlan },\r
9b9d0655 3531 {L"Dns", DevPathFromTextDns },\r
c808ac7b 3532 {L"Uri", DevPathFromTextUri },\r
7795c8f9 3533 {L"Bluetooth", DevPathFromTextBluetooth },\r
a5cb7c82 3534 {L"Wi-Fi", DevPathFromTextWiFi },\r
ff5623e9 3535 {L"BluetoothLE", DevPathFromTextBluetoothLE },\r
5d6a5aee 3536 {L"MediaPath", DevPathFromTextMediaPath },\r
4d0a30a4
RN
3537 {L"HD", DevPathFromTextHD },\r
3538 {L"CDROM", DevPathFromTextCDROM },\r
9da38884 3539 {L"VenMedia", DevPathFromTextVenMedia },\r
4d0a30a4
RN
3540 {L"Media", DevPathFromTextMedia },\r
3541 {L"Fv", DevPathFromTextFv },\r
3542 {L"FvFile", DevPathFromTextFvFile },\r
3543 {L"Offset", DevPathFromTextRelativeOffsetRange },\r
6a46c1a2
FT
3544 {L"RamDisk", DevPathFromTextRamDisk },\r
3545 {L"VirtualDisk", DevPathFromTextVirtualDisk },\r
3546 {L"VirtualCD", DevPathFromTextVirtualCd },\r
3547 {L"PersistentVirtualDisk", DevPathFromTextPersistentVirtualDisk },\r
3548 {L"PersistentVirtualCD", DevPathFromTextPersistentVirtualCd },\r
5d6a5aee
RN
3549\r
3550 {L"BbsPath", DevPathFromTextBbsPath },\r
4d0a30a4
RN
3551 {L"BBS", DevPathFromTextBBS },\r
3552 {L"Sata", DevPathFromTextSata },\r
95276127 3553 {NULL, NULL}\r
3554};\r
3555\r
572f5d8a 3556/**\r
3557 Convert text to the binary representation of a device node.\r
95276127 3558\r
572f5d8a 3559 @param TextDeviceNode TextDeviceNode points to the text representation of a device\r
95276127 3560 node. Conversion starts with the first character and continues\r
3561 until the first non-device node character.\r
3562\r
572f5d8a 3563 @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was\r
3564 insufficient memory or text unsupported.\r
95276127 3565\r
572f5d8a 3566**/\r
3567EFI_DEVICE_PATH_PROTOCOL *\r
3568EFIAPI\r
4d0a30a4 3569UefiDevicePathLibConvertTextToDeviceNode (\r
572f5d8a 3570 IN CONST CHAR16 *TextDeviceNode\r
3571 )\r
95276127 3572{\r
4d0a30a4 3573 DEVICE_PATH_FROM_TEXT FromText;\r
95276127 3574 CHAR16 *ParamStr;\r
3575 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
3576 CHAR16 *DeviceNodeStr;\r
3577 UINTN Index;\r
3578\r
3579 if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
3580 return NULL;\r
3581 }\r
3582\r
3583 ParamStr = NULL;\r
4d0a30a4
RN
3584 FromText = NULL;\r
3585 DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);\r
3069bc19 3586 ASSERT (DeviceNodeStr != NULL);\r
95276127 3587\r
4d0a30a4
RN
3588 for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {\r
3589 ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);\r
95276127 3590 if (ParamStr != NULL) {\r
4d0a30a4 3591 FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;\r
95276127 3592 break;\r
3593 }\r
3594 }\r
3595\r
4d0a30a4 3596 if (FromText == NULL) {\r
95276127 3597 //\r
3598 // A file path\r
3599 //\r
4d0a30a4
RN
3600 FromText = DevPathFromTextFilePath;\r
3601 DeviceNode = FromText (DeviceNodeStr);\r
95276127 3602 } else {\r
4d0a30a4 3603 DeviceNode = FromText (ParamStr);\r
95276127 3604 FreePool (ParamStr);\r
3605 }\r
3606\r
3607 FreePool (DeviceNodeStr);\r
3608\r
3609 return DeviceNode;\r
3610}\r
3611\r
572f5d8a 3612/**\r
3613 Convert text to the binary representation of a device path.\r
95276127 3614\r
95276127 3615\r
572f5d8a 3616 @param TextDevicePath TextDevicePath points to the text representation of a device\r
95276127 3617 path. Conversion starts with the first character and continues\r
3618 until the first non-device node character.\r
3619\r
572f5d8a 3620 @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or\r
3621 there was insufficient memory.\r
95276127 3622\r
572f5d8a 3623**/\r
3624EFI_DEVICE_PATH_PROTOCOL *\r
3625EFIAPI\r
4d0a30a4 3626UefiDevicePathLibConvertTextToDevicePath (\r
572f5d8a 3627 IN CONST CHAR16 *TextDevicePath\r
3628 )\r
95276127 3629{\r
95276127 3630 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
95276127 3631 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
3632 CHAR16 *DevicePathStr;\r
3633 CHAR16 *Str;\r
3634 CHAR16 *DeviceNodeStr;\r
4d0a30a4 3635 BOOLEAN IsInstanceEnd;\r
95276127 3636 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
3637\r
3638 if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
3639 return NULL;\r
3640 }\r
3641\r
3642 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 3643 ASSERT (DevicePath != NULL);\r
95276127 3644 SetDevicePathEndNode (DevicePath);\r
3645\r
4d0a30a4 3646 DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);\r
95276127 3647\r
4d0a30a4 3648 Str = DevicePathStr;\r
95276127 3649 while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
4d0a30a4 3650 DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);\r
95276127 3651\r
4d0a30a4 3652 NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);\r
95276127 3653 FreePool (DevicePath);\r
3654 FreePool (DeviceNode);\r
3655 DevicePath = NewDevicePath;\r
3656\r
4d0a30a4 3657 if (IsInstanceEnd) {\r
95276127 3658 DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
3069bc19 3659 ASSERT (DeviceNode != NULL);\r
4d0a30a4 3660 SetDevicePathEndNode (DeviceNode);\r
647636e1 3661 DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;\r
95276127 3662\r
4d0a30a4 3663 NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);\r
95276127 3664 FreePool (DevicePath);\r
3665 FreePool (DeviceNode);\r
3666 DevicePath = NewDevicePath;\r
3667 }\r
3668 }\r
3669\r
3670 FreePool (DevicePathStr);\r
3671 return DevicePath;\r
3672}\r