]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
MdePkg/UefiScsiLib: Set FUA bit for synchronous SCSI Write operations
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathFromText.c
index c66b77ba6c69a902cac63de0d96183ee35c15fcd..1515d2d5907eb76590d3a8711d5798ea6a38f125 100644 (file)
@@ -2,13 +2,7 @@
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
 Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -279,7 +273,7 @@ IsHexStr (
   while ((*Str != 0) && *Str == L'0') {\r
     Str ++;\r
   }\r
-  \r
+\r
   return (BOOLEAN) (*Str == L'x' || *Str == L'X');\r
 }\r
 \r
@@ -919,7 +913,16 @@ DevPathFromTextAcpiExp (
                                                   );\r
 \r
   AcpiEx->HID = EisaIdFromText (HIDStr);\r
-  AcpiEx->CID = EisaIdFromText (CIDStr);\r
+  //\r
+  // According to UEFI spec, the CID parametr is optional and has a default value of 0.\r
+  // So when the CID parametr is not specified or specified as 0 in the text device node.\r
+  // Set the CID to 0 in the ACPI extension device path structure.\r
+  //\r
+  if (*CIDStr == L'\0' || *CIDStr == L'0') {\r
+    AcpiEx->CID = 0;\r
+  } else {\r
+    AcpiEx->CID = EisaIdFromText (CIDStr);\r
+  }\r
   AcpiEx->UID = 0;\r
 \r
   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
@@ -980,7 +983,7 @@ DevPathFromTextAcpiAdr (
       ASSERT (AcpiAdr != NULL);\r
       SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
     }\r
-    \r
+\r
     (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
   }\r
 \r
@@ -1758,12 +1761,12 @@ DevPathFromTextDebugPort (
   IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
-  VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;\r
+  VENDOR_DEVICE_PATH  *Vend;\r
 \r
-  Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
+  Vend = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MESSAGING_DEVICE_PATH,\r
                                                     MSG_VENDOR_DP,\r
-                                                    (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (VENDOR_DEVICE_PATH)\r
                                                     );\r
 \r
   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
@@ -2061,22 +2064,42 @@ ConvertFromTextUsbClass (
   PIDStr      = GetNextParamStr (&TextDeviceNode);\r
   if (UsbClassText->ClassExist) {\r
     ClassStr = GetNextParamStr (&TextDeviceNode);\r
-    UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+    if (*ClassStr == L'\0') {\r
+      UsbClass->DeviceClass = 0xFF;\r
+    } else {\r
+      UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+    }\r
   } else {\r
     UsbClass->DeviceClass = UsbClassText->Class;\r
   }\r
   if (UsbClassText->SubClassExist) {\r
     SubClassStr = GetNextParamStr (&TextDeviceNode);\r
-    UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+    if (*SubClassStr == L'\0') {\r
+      UsbClass->DeviceSubClass = 0xFF;\r
+    } else {\r
+      UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+    }\r
   } else {\r
     UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
   }\r
 \r
   ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
 \r
-  UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);\r
-  UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);\r
-  UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);\r
+  if (*VIDStr == L'\0') {\r
+    UsbClass->VendorId        = 0xFFFF;\r
+  } else {\r
+    UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);\r
+  }\r
+  if (*PIDStr == L'\0') {\r
+    UsbClass->ProductId       = 0xFFFF;\r
+  } else {\r
+    UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);\r
+  }\r
+  if (*ProtocolStr == L'\0') {\r
+    UsbClass->DeviceProtocol  = 0xFF;\r
+  } else {\r
+    UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);\r
+  }\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
 }\r
@@ -2542,6 +2565,7 @@ DevPathFromTextiSCSI (
   CHAR16                      *ProtocolStr;\r
   CHAR8                       *AsciiStr;\r
   ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
+  UINT64                      Lun;\r
 \r
   NameStr           = GetNextParamStr (&TextDeviceNode);\r
   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);\r
@@ -2560,7 +2584,8 @@ DevPathFromTextiSCSI (
   StrToAscii (NameStr, &AsciiStr);\r
 \r
   ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
-  Strtoi64 (LunStr, &ISCSIDevPath->Lun);\r
+  Strtoi64 (LunStr, &Lun);\r
+  WriteUnaligned64 ((UINT64 *) &ISCSIDevPath->Lun, SwapBytes64 (Lun));\r
 \r
   Options = 0x0000;\r
   if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
@@ -2755,18 +2780,18 @@ DevPathFromTextDns (
   }\r
 \r
   DeviceNodeStrPtr = DeviceNodeStr;\r
-  \r
+\r
   DnsServerIpCount = 0;\r
   while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != L'\0') {\r
     GetNextParamStr (&DeviceNodeStrPtr);\r
-    DnsServerIpCount ++; \r
+    DnsServerIpCount ++;\r
   }\r
 \r
   FreePool (DeviceNodeStr);\r
   DeviceNodeStr = NULL;\r
 \r
   //\r
-  // One or more instances of the DNS server address in EFI_IP_ADDRESS, \r
+  // One or more instances of the DNS server address in EFI_IP_ADDRESS,\r
   // otherwise, NULL will be returned.\r
   //\r
   if (DnsServerIpCount == 0) {\r
@@ -2812,7 +2837,7 @@ DevPathFromTextDns (
       StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);\r
     }\r
   }\r
-  \r
+\r
   return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode;\r
 }\r
 \r
@@ -3414,7 +3439,15 @@ DevPathFromTextSata (
                                 (UINT16) sizeof (SATA_DEVICE_PATH)\r
                                 );\r
   Sata->HBAPortNumber            = (UINT16) Strtoi (Param1);\r
-  Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+\r
+  //\r
+  // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF\r
+  //\r
+  if (*Param2 == L'\0' ) {\r
+    Sata->PortMultiplierPortNumber = 0xFFFF;\r
+  } else {\r
+    Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+  }\r
   Sata->Lun                      = (UINT16) Strtoi (Param3);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r