]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/Microcode.c
UefiCpuPkg: Add CpuLib to module INFs that depend on UefiCpuLib.
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / Microcode.c
index 105a9f84bf95bd0f7fc3f71747386a98ba0df547..f9f070fa8bf230e72b7643b5bd8f96212512905b 100644 (file)
 **/\r
 VOID\r
 MicrocodeDetect (\r
-  IN CPU_MP_DATA             *CpuMpData,\r
-  IN UINTN                   ProcessorNumber\r
+  IN CPU_MP_DATA  *CpuMpData,\r
+  IN UINTN        ProcessorNumber\r
   )\r
 {\r
-  CPU_MICROCODE_HEADER                    *Microcode;\r
-  UINTN                                   MicrocodeEnd;\r
-  CPU_AP_DATA                             *BspData;\r
-  UINT32                                  LatestRevision;\r
-  CPU_MICROCODE_HEADER                    *LatestMicrocode;\r
-  UINT32                                  ThreadId;\r
-  EDKII_PEI_MICROCODE_CPU_ID              MicrocodeCpuId;\r
+  CPU_MICROCODE_HEADER        *Microcode;\r
+  UINTN                       MicrocodeEnd;\r
+  CPU_AP_DATA                 *BspData;\r
+  UINT32                      LatestRevision;\r
+  CPU_MICROCODE_HEADER        *LatestMicrocode;\r
+  UINT32                      ThreadId;\r
+  EDKII_PEI_MICROCODE_CPU_ID  MicrocodeCpuId;\r
 \r
   if (CpuMpData->MicrocodePatchRegionSize == 0) {\r
     //\r
@@ -47,7 +47,7 @@ MicrocodeDetect (
 \r
   GetProcessorMicrocodeCpuId (&MicrocodeCpuId);\r
 \r
-  if (ProcessorNumber != (UINTN) CpuMpData->BspNumber) {\r
+  if (ProcessorNumber != (UINTN)CpuMpData->BspNumber) {\r
     //\r
     // Direct use microcode of BSP if AP is the same as BSP.\r
     // Assume BSP calls this routine() before AP.\r
@@ -55,8 +55,9 @@ MicrocodeDetect (
     BspData = &(CpuMpData->CpuData[CpuMpData->BspNumber]);\r
     if ((BspData->ProcessorSignature == MicrocodeCpuId.ProcessorSignature) &&\r
         (BspData->PlatformId == MicrocodeCpuId.PlatformId) &&\r
-        (BspData->MicrocodeEntryAddr != 0)) {\r
-      LatestMicrocode = (CPU_MICROCODE_HEADER *)(UINTN) BspData->MicrocodeEntryAddr;\r
+        (BspData->MicrocodeEntryAddr != 0))\r
+    {\r
+      LatestMicrocode = (CPU_MICROCODE_HEADER *)(UINTN)BspData->MicrocodeEntryAddr;\r
       LatestRevision  = LatestMicrocode->UpdateRevision;\r
       goto LoadMicrocode;\r
     }\r
@@ -69,11 +70,11 @@ MicrocodeDetect (
   //\r
   LatestRevision  = 0;\r
   LatestMicrocode = NULL;\r
-  Microcode       = (CPU_MICROCODE_HEADER *) (UINTN) CpuMpData->MicrocodePatchAddress;\r
-  MicrocodeEnd    = (UINTN) Microcode + (UINTN) CpuMpData->MicrocodePatchRegionSize;\r
+  Microcode       = (CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->MicrocodePatchAddress;\r
+  MicrocodeEnd    = (UINTN)Microcode + (UINTN)CpuMpData->MicrocodePatchRegionSize;\r
 \r
   do {\r
-    if (!IsValidMicrocode (Microcode, MicrocodeEnd - (UINTN) Microcode, LatestRevision, &MicrocodeCpuId, 1, TRUE)) {\r
+    if (!IsValidMicrocode (Microcode, MicrocodeEnd - (UINTN)Microcode, LatestRevision, &MicrocodeCpuId, 1, TRUE)) {\r
       //\r
       // It is the padding data between the microcode patches for microcode patches alignment.\r
       // Because the microcode patch is the multiple of 1-KByte, the padding data should not\r
@@ -81,14 +82,15 @@ MicrocodeDetect (
       // alignment value should be larger than 1-KByte. We could skip SIZE_1KB padding data to\r
       // find the next possible microcode patch header.\r
       //\r
-      Microcode = (CPU_MICROCODE_HEADER *) ((UINTN) Microcode + SIZE_1KB);\r
+      Microcode = (CPU_MICROCODE_HEADER *)((UINTN)Microcode + SIZE_1KB);\r
       continue;\r
     }\r
+\r
     LatestMicrocode = Microcode;\r
     LatestRevision  = LatestMicrocode->UpdateRevision;\r
 \r
-    Microcode = (CPU_MICROCODE_HEADER *) (((UINTN) Microcode) + GetMicrocodeLength (Microcode));\r
-  } while ((UINTN) Microcode < MicrocodeEnd);\r
+    Microcode = (CPU_MICROCODE_HEADER *)(((UINTN)Microcode) + GetMicrocodeLength (Microcode));\r
+  } while ((UINTN)Microcode < MicrocodeEnd);\r
 \r
 LoadMicrocode:\r
   if (LatestRevision != 0) {\r
@@ -97,7 +99,7 @@ LoadMicrocode:
     // patch header) for each processor even it's the same as the loaded one.\r
     // It will be used when building the microcode patch cache HOB.\r
     //\r
-    CpuMpData->CpuData[ProcessorNumber].MicrocodeEntryAddr = (UINTN) LatestMicrocode;\r
+    CpuMpData->CpuData[ProcessorNumber].MicrocodeEntryAddr = (UINTN)LatestMicrocode;\r
   }\r
 \r
   if (LatestRevision > GetProcessorMicrocodeSignature ()) {\r
@@ -109,6 +111,7 @@ LoadMicrocode:
     //\r
     LoadMicrocode (LatestMicrocode);\r
   }\r
+\r
   //\r
   // It's possible that the microcode fails to load. Just capture the CPU microcode revision after loading.\r
   //\r
@@ -129,15 +132,15 @@ LoadMicrocode:
 **/\r
 VOID\r
 ShadowMicrocodePatchWorker (\r
-  IN OUT CPU_MP_DATA             *CpuMpData,\r
-  IN     MICROCODE_PATCH_INFO    *Patches,\r
-  IN     UINTN                   PatchCount,\r
-  IN     UINTN                   TotalLoadSize\r
+  IN OUT CPU_MP_DATA           *CpuMpData,\r
+  IN     MICROCODE_PATCH_INFO  *Patches,\r
+  IN     UINTN                 PatchCount,\r
+  IN     UINTN                 TotalLoadSize\r
   )\r
 {\r
-  UINTN    Index;\r
-  VOID     *MicrocodePatchInRam;\r
-  UINT8    *Walker;\r
+  UINTN  Index;\r
+  VOID   *MicrocodePatchInRam;\r
+  UINT8  *Walker;\r
 \r
   ASSERT ((Patches != NULL) && (PatchCount != 0));\r
 \r
@@ -152,7 +155,7 @@ ShadowMicrocodePatchWorker (
   for (Walker = MicrocodePatchInRam, Index = 0; Index < PatchCount; Index++) {\r
     CopyMem (\r
       Walker,\r
-      (VOID *) Patches[Index].Address,\r
+      (VOID *)Patches[Index].Address,\r
       Patches[Index].Size\r
       );\r
     Walker += Patches[Index].Size;\r
@@ -161,13 +164,15 @@ ShadowMicrocodePatchWorker (
   //\r
   // Update the microcode patch related fields in CpuMpData\r
   //\r
-  CpuMpData->MicrocodePatchAddress    = (UINTN) MicrocodePatchInRam;\r
+  CpuMpData->MicrocodePatchAddress    = (UINTN)MicrocodePatchInRam;\r
   CpuMpData->MicrocodePatchRegionSize = TotalLoadSize;\r
 \r
   DEBUG ((\r
     DEBUG_INFO,\r
     "%a: Required microcode patches have been loaded at 0x%lx, with size 0x%lx.\n",\r
-    __FUNCTION__, CpuMpData->MicrocodePatchAddress, CpuMpData->MicrocodePatchRegionSize\r
+    __FUNCTION__,\r
+    CpuMpData->MicrocodePatchAddress,\r
+    CpuMpData->MicrocodePatchRegionSize\r
     ));\r
 \r
   return;\r
@@ -181,19 +186,19 @@ ShadowMicrocodePatchWorker (
 **/\r
 VOID\r
 ShadowMicrocodePatchByPcd (\r
-  IN OUT CPU_MP_DATA             *CpuMpData\r
+  IN OUT CPU_MP_DATA  *CpuMpData\r
   )\r
 {\r
-  UINTN                                  Index;\r
-  CPU_MICROCODE_HEADER                   *MicrocodeEntryPoint;\r
-  UINTN                                  MicrocodeEnd;\r
-  UINTN                                  TotalSize;\r
-  MICROCODE_PATCH_INFO                   *PatchInfoBuffer;\r
-  UINTN                                  MaxPatchNumber;\r
-  UINTN                                  PatchCount;\r
-  UINTN                                  TotalLoadSize;\r
-  EDKII_PEI_MICROCODE_CPU_ID             *MicrocodeCpuIds;\r
-  BOOLEAN                                Valid;\r
+  UINTN                       Index;\r
+  CPU_MICROCODE_HEADER        *MicrocodeEntryPoint;\r
+  UINTN                       MicrocodeEnd;\r
+  UINTN                       TotalSize;\r
+  MICROCODE_PATCH_INFO        *PatchInfoBuffer;\r
+  UINTN                       MaxPatchNumber;\r
+  UINTN                       PatchCount;\r
+  UINTN                       TotalLoadSize;\r
+  EDKII_PEI_MICROCODE_CPU_ID  *MicrocodeCpuIds;\r
+  BOOLEAN                     Valid;\r
 \r
   //\r
   // Initialize the microcode patch related fields in CpuMpData as the values\r
@@ -203,10 +208,10 @@ ShadowMicrocodePatchByPcd (
   CpuMpData->MicrocodePatchAddress    = PcdGet64 (PcdCpuMicrocodePatchAddress);\r
   CpuMpData->MicrocodePatchRegionSize = PcdGet64 (PcdCpuMicrocodePatchRegionSize);\r
 \r
-  MicrocodeEntryPoint    = (CPU_MICROCODE_HEADER *) (UINTN) CpuMpData->MicrocodePatchAddress;\r
-  MicrocodeEnd           = (UINTN) MicrocodeEntryPoint +\r
-                           (UINTN) CpuMpData->MicrocodePatchRegionSize;\r
-  if ((MicrocodeEntryPoint == NULL) || ((UINTN) MicrocodeEntryPoint == MicrocodeEnd)) {\r
+  MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->MicrocodePatchAddress;\r
+  MicrocodeEnd        = (UINTN)MicrocodeEntryPoint +\r
+                        (UINTN)CpuMpData->MicrocodePatchRegionSize;\r
+  if ((MicrocodeEntryPoint == NULL) || ((UINTN)MicrocodeEntryPoint == MicrocodeEnd)) {\r
     //\r
     // There is no microcode patches\r
     //\r
@@ -242,7 +247,7 @@ ShadowMicrocodePatchByPcd (
   do {\r
     Valid = IsValidMicrocode (\r
               MicrocodeEntryPoint,\r
-              MicrocodeEnd - (UINTN) MicrocodeEntryPoint,\r
+              MicrocodeEnd - (UINTN)MicrocodeEntryPoint,\r
               0,\r
               MicrocodeCpuIds,\r
               CpuMpData->CpuCount,\r
@@ -252,7 +257,7 @@ ShadowMicrocodePatchByPcd (
       //\r
       // Padding data between the microcode patches, skip 1KB to check next entry.\r
       //\r
-      MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (((UINTN) MicrocodeEntryPoint) + SIZE_1KB);\r
+      MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)(((UINTN)MicrocodeEntryPoint) + SIZE_1KB);\r
       continue;\r
     }\r
 \r
@@ -277,6 +282,7 @@ ShadowMicrocodePatchByPcd (
       if (PatchInfoBuffer == NULL) {\r
         goto OnExit;\r
       }\r
+\r
       MaxPatchNumber = MaxPatchNumber * 2;\r
     }\r
 \r
@@ -285,21 +291,23 @@ ShadowMicrocodePatchByPcd (
     //\r
     // Store the information of this microcode patch\r
     //\r
-    PatchInfoBuffer[PatchCount - 1].Address = (UINTN) MicrocodeEntryPoint;\r
+    PatchInfoBuffer[PatchCount - 1].Address = (UINTN)MicrocodeEntryPoint;\r
     PatchInfoBuffer[PatchCount - 1].Size    = TotalSize;\r
-    TotalLoadSize += TotalSize;\r
+    TotalLoadSize                          += TotalSize;\r
 \r
     //\r
     // Process the next microcode patch\r
     //\r
-    MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) ((UINTN) MicrocodeEntryPoint + TotalSize);\r
-  } while ((UINTN) MicrocodeEntryPoint < MicrocodeEnd);\r
+    MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)((UINTN)MicrocodeEntryPoint + TotalSize);\r
+  } while ((UINTN)MicrocodeEntryPoint < MicrocodeEnd);\r
 \r
   if (PatchCount != 0) {\r
     DEBUG ((\r
       DEBUG_INFO,\r
       "%a: 0x%x microcode patches will be loaded into memory, with size 0x%x.\n",\r
-      __FUNCTION__, PatchCount, TotalLoadSize\r
+      __FUNCTION__,\r
+      PatchCount,\r
+      TotalLoadSize\r
       ));\r
 \r
     ShadowMicrocodePatchWorker (CpuMpData, PatchInfoBuffer, PatchCount, TotalLoadSize);\r
@@ -309,6 +317,7 @@ OnExit:
   if (PatchInfoBuffer != NULL) {\r
     FreePool (PatchInfoBuffer);\r
   }\r
+\r
   FreePages (MicrocodeCpuIds, EFI_SIZE_TO_PAGES (CpuMpData->CpuCount * sizeof (EDKII_PEI_MICROCODE_CPU_ID)));\r
 }\r
 \r
@@ -319,10 +328,10 @@ OnExit:
 **/\r
 VOID\r
 ShadowMicrocodeUpdatePatch (\r
-  IN OUT CPU_MP_DATA             *CpuMpData\r
+  IN OUT CPU_MP_DATA  *CpuMpData\r
   )\r
 {\r
-  EFI_STATUS     Status;\r
+  EFI_STATUS  Status;\r
 \r
   Status = PlatformShadowMicrocode (CpuMpData);\r
   if (EFI_ERROR (Status)) {\r
@@ -347,16 +356,16 @@ ShadowMicrocodeUpdatePatch (
 **/\r
 BOOLEAN\r
 GetMicrocodePatchInfoFromHob (\r
-  UINT64                         *Address,\r
-  UINT64                         *RegionSize\r
+  UINT64  *Address,\r
+  UINT64  *RegionSize\r
   )\r
 {\r
-  EFI_HOB_GUID_TYPE            *GuidHob;\r
-  EDKII_MICROCODE_PATCH_HOB    *MicrocodePathHob;\r
+  EFI_HOB_GUID_TYPE          *GuidHob;\r
+  EDKII_MICROCODE_PATCH_HOB  *MicrocodePathHob;\r
 \r
   GuidHob = GetFirstGuidHob (&gEdkiiMicrocodePatchHobGuid);\r
   if (GuidHob == NULL) {\r
-    DEBUG((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n", __FUNCTION__));\r
+    DEBUG ((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n", __FUNCTION__));\r
     return FALSE;\r
   }\r
 \r
@@ -365,9 +374,12 @@ GetMicrocodePatchInfoFromHob (
   *Address    = MicrocodePathHob->MicrocodePatchAddress;\r
   *RegionSize = MicrocodePathHob->MicrocodePatchRegionSize;\r
 \r
-  DEBUG((\r
-    DEBUG_INFO, "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n",\r
-    __FUNCTION__, *Address, *RegionSize\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
+    "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n",\r
+    __FUNCTION__,\r
+    *Address,\r
+    *RegionSize\r
     ));\r
 \r
   return TRUE;\r