]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
ShellPkg: Add optional extended decode for Vendor Device Nodes for consistent map...
[mirror_edk2.git] / ShellPkg / Library / UefiShellCommandLib / ConsistMapping.c
index a009609ffc27e08f727fce96f64ec2c5217bbed5..a42a045d52d48341f1ed43c27a100d15f5fe6d26 100644 (file)
@@ -14,6 +14,7 @@
 #include "UefiShellCommandLib.h"\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/SortLib.h>\r
+#include <Library/UefiLib.h>\r
 \r
 typedef enum {\r
   MTDTypeUnknown,\r
@@ -575,6 +576,9 @@ DevPathSerialVendor (
 {\r
   VENDOR_DEVICE_PATH  *Vendor;\r
   SAS_DEVICE_PATH     *Sas;\r
+  UINTN               TargetNameLength;\r
+  UINTN               Index;\r
+  CHAR16              *Buffer;\r
 \r
   if (DevicePathNode == NULL || MappingItem == NULL) {\r
     return;\r
@@ -589,6 +593,32 @@ DevPathSerialVendor (
     AppendCSDNum (MappingItem, Sas->Lun);\r
     AppendCSDNum (MappingItem, Sas->DeviceTopology);\r
     AppendCSDNum (MappingItem, Sas->RelativeTargetPort);\r
+  } else {\r
+    TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - sizeof (VENDOR_DEVICE_PATH), PcdGet32(PcdShellVendorExtendedDecode));\r
+    if (TargetNameLength != 0) {\r
+      //\r
+      // String is 2 chars per data byte, plus NULL terminator\r
+      //\r
+      Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * sizeof(CHAR16));\r
+      ASSERT(Buffer != NULL);\r
+      if (Buffer == NULL) {\r
+        return;\r
+      }\r
+\r
+      //\r
+      // Build the string data\r
+      //\r
+      for (Index = 0; Index < TargetNameLength; Index++) {\r
+        Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof (VENDOR_DEVICE_PATH) + Index));\r
+      }\r
+\r
+      //\r
+      // Append the new data block\r
+      //\r
+      AppendCSDStr (MappingItem, Buffer);\r
+\r
+      FreePool(Buffer);\r
+    }\r
   }\r
 }\r
 \r
@@ -651,13 +681,6 @@ DevPathSerialIScsi (
   IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
   )\r
 {\r
-///@todo make this a PCD\r
-//\r
-// As Csd of ISCSI node is quite long, we comment\r
-// the code below to keep the consistent mapping\r
-// short. Uncomment if you really need it.\r
-//\r
-/*\r
   ISCSI_DEVICE_PATH  *IScsi;\r
   UINT8              *IScsiTargetName;\r
   CHAR16             *TargetName;\r
@@ -667,24 +690,25 @@ DevPathSerialIScsi (
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
-  AppendCSDNum (MappingItem, IScsi->LoginOption);\r
-  AppendCSDNum (MappingItem, IScsi->Lun);\r
-  AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
-  TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
-  if (TargetNameLength > 0) {\r
-    TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
-    if (TargetName != NULL) {\r
-      IScsiTargetName = (UINT8 *) (IScsi + 1);\r
-      for (Index = 0; Index < TargetNameLength; Index++) {\r
-        TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+  if (PcdGetBool(PcdShellDecodeIScsiMapNames)) {\r
+    IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
+    AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
+    AppendCSDNum (MappingItem, IScsi->LoginOption);\r
+    AppendCSDNum (MappingItem, IScsi->Lun);\r
+    AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
+    TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
+    if (TargetNameLength > 0) {\r
+      TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
+      if (TargetName != NULL) {\r
+        IScsiTargetName = (UINT8 *) (IScsi + 1);\r
+        for (Index = 0; Index < TargetNameLength; Index++) {\r
+          TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+        }\r
+        AppendCSDStr (MappingItem, TargetName);\r
+        FreePool (TargetName);\r
       }\r
-      AppendCSDStr (MappingItem, TargetName);\r
-      FreePool (TargetName);\r
     }\r
   }\r
- */\r
 }\r
 \r
 /**\r