]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add Dual-FSP support (MemoryInitUpd/SiliconInitUpd)
authorYao, Jiewen <Jiewen.Yao@intel.com>
Sun, 2 Aug 2015 04:02:37 +0000 (04:02 +0000)
committerjyao1 <jyao1@Edk2>
Sun, 2 Aug 2015 04:02:37 +0000 (04:02 +0000)
Add FspUpdSignatureCheck() API in FspSecPlatformLib, so that FspSecCore can check if UPD data is valid in FSP API.
Add Set/GetFspMemoryInitUpdDataPointer() and Set/GetFspSiliconInitUpdDataPointer() API in FspCommonLib,
 so that core can set this UdpDataPointer and platform code may get UpdDataPointer easily.
Add UpdateMemSiUpdInitOffsetValue function in GenCfgOpt.py tool, so that the MemoryInitUpdOffset and SiUpdInitOffset is recorded.
Add missing EMBED comment in GenCfgOptUserManual.docx

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <Jiewen.Yao@intel.com>
Reviewed-by: "Mudusuru, Giri P" <giri.p.mudusuru@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18123 6f19259b-4bc3-4df7-8a09-765794883524

IntelFspPkg/FspSecCore/SecFsp.c
IntelFspPkg/FspSecCore/SecFsp.h
IntelFspPkg/Include/Library/FspCommonLib.h
IntelFspPkg/Include/Library/FspSecPlatformLib.h
IntelFspPkg/Include/Private/FspGlobalData.h
IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c
IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c
IntelFspPkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c
IntelFspPkg/Tools/GenCfgOpt.py
IntelFspPkg/Tools/UserManuals/GenCfgOptUserManual.docx

index a9aba7108e338c971208d360d0499c1561c830a9..07aed1c1c06236f12681e25f63906e1663468414 100644 (file)
@@ -265,7 +265,7 @@ FspApiCallingCheck (
     //\r
     if ((UINT32)FspData != 0xFFFFFFFF) {\r
       Status = EFI_UNSUPPORTED;\r
-    } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0)) {\r
+    } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0) || (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam)))) {\r
       Status = EFI_INVALID_PARAMETER;\r
     }\r
   } else if (ApiIdx == 2) {\r
@@ -285,7 +285,7 @@ FspApiCallingCheck (
     //\r
     if ((UINT32)FspData != 0xFFFFFFFF) {\r
       Status = EFI_UNSUPPORTED;\r
-    } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0)) {\r
+    } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0) || (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam)))) {\r
       Status = EFI_INVALID_PARAMETER;\r
     }\r
   } else if (ApiIdx == 4) {\r
@@ -308,6 +308,8 @@ FspApiCallingCheck (
     } else {\r
       if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
         Status = EFI_UNSUPPORTED;\r
+      } else if (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam))) {\r
+        Status = EFI_INVALID_PARAMETER;\r
       }\r
     }\r
   } else {\r
index 3e4e2a4b5cc112455f53be7d4c1759b51c6681a8..4dceebc31b4e03baf4ce4d86701c8c9d04b1686f 100644 (file)
 #define _SEC_FSPE_H_\r
 \r
 #include <PiPei.h>\r
+#include <FspApi.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/SerialPortLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/FspCommonLib.h>\r
-\r
-#include <FspApi.h>\r
+#include <Library/FspSecPlatformLib.h>\r
 \r
 #define FSP_MCUD_SIGNATURE  SIGNATURE_32 ('M', 'C', 'U', 'D')\r
 #define FSP_PER0_SIGNATURE  SIGNATURE_32 ('P', 'E', 'R', '0')\r
index eddebba1ea0bb5e688accb6c7051d59d4a64aab8..fa2f81c08886cf30e9dbb91e49e79e6bf830ae6b 100644 (file)
@@ -157,6 +157,50 @@ GetFspUpdDataPointer (
   VOID\r
   );\r
 \r
+/**\r
+  This function sets the memory init UPD data pointer.\r
+\r
+  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspMemoryInitUpdDataPointer (\r
+  IN VOID    *MemoryInitUpdPtr\r
+  );\r
+\r
+/**\r
+  This function gets the memory init UPD data pointer.\r
+\r
+  @return memory init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspMemoryInitUpdDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the silicon init UPD data pointer.\r
+\r
+  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspSiliconInitUpdDataPointer (\r
+  IN VOID    *SiliconInitUpdPtr\r
+  );\r
+\r
+/**\r
+  This function gets the silicon init UPD data pointer.\r
+\r
+  @return silicon init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspSiliconInitUpdDataPointer (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Set FSP measurement point timestamp.\r
 \r
index c6ed43001d7087dee569ab7fec809e6221856b09..d5c7e77930c05bde68031267c1685dd6071c7ad9 100644 (file)
@@ -71,4 +71,18 @@ SecCarInit (
   IN FSP_TEMP_RAM_INIT_PARAMS  *TempRamInitParamPtr\r
   );\r
 \r
+/**\r
+  This function check the signture of UPD.\r
+\r
+  @param[in]  ApiIdx           Internal index of the FSP API.\r
+  @param[in]  ApiParam         Parameter of the FSP API.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspUpdSignatureCheck (\r
+  IN UINT32   ApiIdx,\r
+  IN VOID     *ApiParam\r
+  );\r
+\r
 #endif\r
index f50255fa7f10ec3164a1162229ce041451aee2c1..be33e89c173580d7c85318d322eb446f5778c94a 100644 (file)
@@ -34,6 +34,8 @@ typedef struct  {
    FSP_PLAT_DATA      PlatformData;\r
    FSP_INFO_HEADER    *FspInfoHeader;\r
    VOID               *UpdDataRgnPtr;\r
+   VOID               *MemoryInitUpdPtr;\r
+   VOID               *SiliconInitUpdPtr;\r
    UINT8              ApiMode;\r
    UINT8              Reserved[3];\r
    UINT32             PerfIdx;\r
index 7de84a0a7e7db9f5d296d1dfdb7c6d959635bf93..a31d16bb70f8a027c956128b9f5e8b7175b2b502 100644 (file)
@@ -289,6 +289,91 @@ GetFspUpdDataPointer (
   return FspData->UpdDataRgnPtr;\r
 }\r
 \r
+\r
+/**\r
+  This function sets the memory init UPD data pointer.\r
+\r
+  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspMemoryInitUpdDataPointer (\r
+  IN VOID    *MemoryInitUpdPtr\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Get the Fsp Global Data Pointer\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+\r
+  //\r
+  // Set the memory init UPD pointer.\r
+  //\r
+  FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;\r
+}\r
+\r
+/**\r
+  This function gets the memory init UPD data pointer.\r
+\r
+  @return memory init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspMemoryInitUpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->MemoryInitUpdPtr;\r
+}\r
+\r
+\r
+/**\r
+  This function sets the silicon init UPD data pointer.\r
+\r
+  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspSiliconInitUpdDataPointer (\r
+  IN VOID    *SiliconInitUpdPtr\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Get the Fsp Global Data Pointer\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+\r
+  //\r
+  // Set the silicon init UPD data pointer.\r
+  //\r
+  FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;\r
+}\r
+\r
+/**\r
+  This function gets the silicon init UPD data pointer.\r
+\r
+  @return silicon init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspSiliconInitUpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->SiliconInitUpdPtr;\r
+}\r
+\r
+\r
 /**\r
   Set FSP measurement point timestamp.\r
 \r
index 97cae9ad9dbb271d615456c4ea7ab308a6f4c1d3..ed5db933f11f79ab8279aa86d2516d53404ff8a8 100644 (file)
@@ -86,7 +86,9 @@ FspMigrateTemporaryMemory (
   FSP_INIT_PARAMS           *FspInitParams;\r
   UINT32                    *NewStackTop;\r
   VOID                      *BootLoaderTempRamHob;\r
-  VOID                      *UpdDataRgnPtr;\r
+  UINT32                    UpdDataRgnPtr;\r
+  UINT32                    MemoryInitUpdPtr;\r
+  UINT32                    SiliconInitUpdPtr;\r
   VOID                      *PlatformDataPtr;\r
   UINT8                      ApiMode;\r
     \r
@@ -105,7 +107,7 @@ FspMigrateTemporaryMemory (
   if (ApiMode == 0) {\r
     BootLoaderTempRamHob = BuildGuidHob (&gFspBootLoaderTemporaryMemoryGuid, BootLoaderTempRamSize);\r
   } else {\r
-    BootLoaderTempRamHob = (VOID *)AllocatePool (BootLoaderTempRamSize);\r
+    BootLoaderTempRamHob = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES (BootLoaderTempRamSize));\r
   }\r
   ASSERT(BootLoaderTempRamHob != NULL);\r
 \r
@@ -150,9 +152,20 @@ FspMigrateTemporaryMemory (
   //\r
   // Update UPD pointer in FSP Global Data\r
   //\r
-  UpdDataRgnPtr = ((FSP_INIT_RT_COMMON_BUFFER *)FspInitParams->RtBufferPtr)->UpdDataRgnPtr;\r
-  if (UpdDataRgnPtr != NULL) {\r
-    SetFspUpdDataPointer (UpdDataRgnPtr);\r
+  if (ApiMode == 0) {\r
+    UpdDataRgnPtr = (UINT32)((UINT32 *)GetFspUpdDataPointer ());\r
+    if (UpdDataRgnPtr >= BootLoaderTempRamStart && UpdDataRgnPtr < BootLoaderTempRamEnd) {\r
+      MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());\r
+      SiliconInitUpdPtr = (UINT32)((UINT32 *)GetFspSiliconInitUpdDataPointer ());\r
+      SetFspUpdDataPointer ((VOID *)(UpdDataRgnPtr + OffsetGap));\r
+      SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));\r
+      SetFspSiliconInitUpdDataPointer ((VOID *)(SiliconInitUpdPtr + OffsetGap));\r
+    }\r
+  } else {\r
+    MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());\r
+    if (MemoryInitUpdPtr >= BootLoaderTempRamStart && MemoryInitUpdPtr < BootLoaderTempRamEnd) {\r
+      SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));\r
+    }\r
   }\r
 \r
   //\r
index 4de2a1d75513693efd1df9435b6d9ca59f7afd29..d72d05f2e289d7e561daafd20d5e516cd5b7470b 100644 (file)
 \r
 #include <PiPei.h>\r
 \r
+/**\r
+  This function check the signture of UPD.\r
+\r
+  @param[in]  ApiIdx           Internal index of the FSP API.\r
+  @param[in]  ApiParam         Parameter of the FSP API.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspUpdSignatureCheck (\r
+  IN UINT32   ApiIdx,\r
+  IN VOID     *ApiParam\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 \r
index 77eaf6481ff4166eaaab7cb90403769d1f5c7db3..a38da70212a8cceee328e6b1667ceef6751ef3a9 100644 (file)
@@ -88,6 +88,48 @@ are permitted provided that the following conditions are met:
 **/\r
 """\r
 \r
+def UpdateMemSiUpdInitOffsetValue (DscFile):\r
+    DscFd        = open(DscFile, "r")\r
+    DscLines     = DscFd.readlines()\r
+    DscFd.close()\r
+\r
+    DscContent = []\r
+    MemUpdInitOffset = 0\r
+    SiUpdInitOffset = 0\r
+    MemUpdInitOffsetValue = 0\r
+    SiUpdInitOffsetValue = 0\r
+\r
+    while len(DscLines):\r
+        DscLine  = DscLines.pop(0)\r
+        DscContent.append(DscLine)\r
+        DscLine = DscLine.strip()\r
+        Match = re.match("^([_a-zA-Z0-9]+).(MemoryInitUpdOffset)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)\r
+        if Match:\r
+            MemUpdInitOffsetValue = int(Match.group(5), 0)\r
+        Match = re.match("^\s*([_a-zA-Z0-9]+).(SiliconInitUpdOffset)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)\r
+        if Match:\r
+            SiUpdInitOffsetValue = int(Match.group(5), 0)\r
+        Match = re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(0x244450554D454D24)",DscLine)\r
+        if Match:\r
+            MemUpdInitOffset = int(Match.group(3), 0)\r
+        Match = re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(0x244450555F495324)",DscLine)\r
+        if Match:\r
+            SiUpdInitOffset = int(Match.group(3), 0)\r
+\r
+    if MemUpdInitOffsetValue != MemUpdInitOffset or SiUpdInitOffsetValue != SiUpdInitOffset:\r
+        MemUpdInitOffsetStr = "0x%08X" % MemUpdInitOffset\r
+        SiUpdInitOffsetStr = "0x%08X" % SiUpdInitOffset\r
+        DscFd = open(DscFile,"w")\r
+        for DscLine in DscContent:\r
+            Match = re.match("^\s*([_a-zA-Z0-9]+).(MemoryInitUpdOffset)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)\r
+            if Match:\r
+                 DscLine = re.sub(r'(?:[^\s]+\s*$)', MemUpdInitOffsetStr + '\n', DscLine)\r
+            Match = re.match("^\s*([_a-zA-Z0-9]+).(SiliconInitUpdOffset)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)\r
+            if Match:\r
+                 DscLine = re.sub(r'(?:[^\s]+\s*$)', SiUpdInitOffsetStr + '\n', line)\r
+            DscFd.writelines(DscLine)\r
+        DscFd.close()\r
+\r
 class CLogicalExpression:\r
     def __init__(self):\r
         self.index    = 0\r
@@ -889,6 +931,22 @@ EndList
                 return 256\r
 \r
         TxtBody = []\r
+        for Item in self._CfgItemList:\r
+           if str(Item['cname']) == 'Signature' and Item['length'] == 8:\r
+               Value = int(Item['value'], 16)\r
+               Chars = []\r
+               while Value != 0x0:\r
+                   Chars.append(chr(Value & 0xFF))\r
+                   Value = Value >> 8\r
+               SignatureStr = ''.join(Chars)\r
+               if int(Item['offset']) == 0:\r
+                   TxtBody.append("#define FSP_UPD_SIGNATURE                %s        /* '%s' */\n" % (Item['value'], SignatureStr))\r
+               elif 'MEM' in SignatureStr:\r
+                   TxtBody.append("#define FSP_MEMORY_INIT_UPD_SIGNATURE    %s        /* '%s' */\n" % (Item['value'], SignatureStr))\r
+               else:\r
+                   TxtBody.append("#define FSP_SILICON_INIT_UPD_SIGNATURE   %s        /* '%s' */\n" % (Item['value'], SignatureStr))\r
+        TxtBody.append("\n")\r
+\r
         for Region in ['UPD', 'VPD']:\r
 \r
             # Write  PcdVpdRegionSign and PcdImageRevision\r
@@ -1176,6 +1234,8 @@ def Main():
             print "ERROR: Cannot open DSC file '%s' !" % DscFile\r
             return 2\r
 \r
+        UpdateMemSiUpdInitOffsetValue(DscFile)\r
+\r
         OutFile = ''\r
         if argc > 4:\r
             if sys.argv[4][0] == '-':\r
index e4da8e057b763ddce5c4429b4a27bb7bf66f20a2..1cbc459eba96d17de31188f409bea2a40be2f2a2 100644 (file)
Binary files a/IntelFspPkg/Tools/UserManuals/GenCfgOptUserManual.docx and b/IntelFspPkg/Tools/UserManuals/GenCfgOptUserManual.docx differ