]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/VpdInfoFile.py
BaseTools: Optimize VPD PCD value for the different SKUs
[mirror_edk2.git] / BaseTools / Source / Python / Common / VpdInfoFile.py
index cc79ee275fd429fdcfb9ae9d9a5dd90682417f20..130d5c7e0cdec42cec504e98b62e834af1b881e1 100644 (file)
@@ -79,6 +79,7 @@ class VpdInfoFile:
         #           @see BuildClassObject.PcdClassObject\r
         #  Value  : offset in different SKU such as [sku1_offset, sku2_offset]\r
         self._VpdArray = {}\r
+        self._VpdInfo = {}\r
     \r
     ## Add a VPD PCD collected from platform's autogen when building.\r
     #\r
@@ -102,8 +103,9 @@ class VpdInfoFile:
             if Vpd.MaxDatumSize == None or Vpd.MaxDatumSize == "":\r
                 Vpd.MaxDatumSize = VpdInfoFile._MAX_SIZE_TYPE[Vpd.DatumType]\r
         else:\r
-            EdkLogger.error("VpdInfoFile", BuildToolError.PARAMETER_INVALID,  \r
-                            "Invalid DatumType %s for VPD PCD %s.%s" % (Vpd.DatumType, Vpd.TokenSpaceGuidCName, Vpd.TokenCName))\r
+            if Vpd.MaxDatumSize <= 0:\r
+                EdkLogger.error("VpdInfoFile", BuildToolError.PARAMETER_INVALID,\r
+                                "Invalid max datum size for VPD PCD %s.%s" % (Vpd.TokenSpaceGuidCName, Vpd.TokenCName))\r
             \r
         if Vpd not in self._VpdArray.keys():\r
             #\r
@@ -178,6 +180,9 @@ class VpdInfoFile:
             \r
             Found = False\r
             \r
+            if (TokenSpaceName, PcdTokenName) not in self._VpdInfo:\r
+                self._VpdInfo[(TokenSpaceName, PcdTokenName)] = []\r
+            self._VpdInfo[(TokenSpaceName, PcdTokenName)].append((SkuId,Offset, Value))\r
             for VpdObject in self._VpdArray.keys():\r
                 VpdObjectTokenCName = VpdObject.TokenCName\r
                 for PcdItem in GlobalData.MixedPcd:\r
@@ -216,6 +221,8 @@ class VpdInfoFile:
             return None\r
         \r
         return self._VpdArray[vpd]\r
+    def GetVpdInfo(self,(PcdTokenName,TokenSpaceName)):\r
+        return self._VpdInfo.get((TokenSpaceName, PcdTokenName))\r
     \r
 ## Call external BPDG tool to process VPD file\r
 #    \r
@@ -233,14 +240,15 @@ def CallExtenalBPDGTool(ToolPath, VpdFileName):
     OutputBinFileName = os.path.join(OutputDir, "%s.bin" % BaseName)\r
           \r
     try:\r
-        PopenObject = subprocess.Popen([ToolPath,\r
+        PopenObject = subprocess.Popen(' '.join([ToolPath,\r
                                         '-o', OutputBinFileName, \r
                                         '-m', OutputMapFileName,\r
                                         '-q',\r
                                         '-f',\r
-                                        VpdFileName],\r
+                                        VpdFileName]),\r
                                         stdout=subprocess.PIPE, \r
-                                        stderr= subprocess.PIPE)\r
+                                        stderr= subprocess.PIPE,\r
+                                        shell=True)\r
     except Exception, X:\r
         EdkLogger.error("BPDG", BuildToolError.COMMAND_FAILURE, ExtraData="%s" % (str(X)))\r
     (out, error) = PopenObject.communicate()\r