]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
UefiCpuPkg: Remove FIT based microcode shadow logic from MpInitLib.
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / PeiMpLib.c
index 6ecbed39ec4c4a54e5e73f9dd4a7b13f11201837..17b60903c5a63e25c050f5188afded82a9bf0858 100644 (file)
@@ -9,6 +9,7 @@
 #include "MpLib.h"\r
 #include <Library/PeiServicesLib.h>\r
 #include <Guid/S3SmmInitDone.h>\r
+#include <Ppi/ShadowMicrocode.h>\r
 \r
 /**\r
   S3 SMM Init Done notification function.\r
@@ -639,4 +640,71 @@ MpInitLibEnableDisableAP (
   return EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);\r
 }\r
 \r
+/**\r
+  This funtion will try to invoke platform specific microcode shadow logic to\r
+  relocate microcode update patches into memory.\r
+\r
+  @param[in] CpuMpData  The pointer to CPU MP Data structure.\r
 \r
+  @retval EFI_SUCCESS              Shadow microcode success.\r
+  @retval EFI_OUT_OF_RESOURCES     No enough resource to complete the operation.\r
+  @retval EFI_UNSUPPORTED          Can't find platform specific microcode shadow\r
+                                   PPI/Protocol.\r
+**/\r
+EFI_STATUS\r
+PlatformShadowMicrocode (\r
+  IN OUT CPU_MP_DATA             *CpuMpData\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EDKII_PEI_SHADOW_MICROCODE_PPI     *ShadowMicrocodePpi;\r
+  UINTN                              CpuCount;\r
+  EDKII_PEI_MICROCODE_CPU_ID         *MicrocodeCpuId;\r
+  UINTN                              Index;\r
+  UINTN                              BufferSize;\r
+  VOID                               *Buffer;\r
+\r
+  Status = PeiServicesLocatePpi (\r
+             &gEdkiiPeiShadowMicrocodePpiGuid,\r
+             0,\r
+             NULL,\r
+             (VOID **) &ShadowMicrocodePpi\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  CpuCount = CpuMpData->CpuCount;\r
+  MicrocodeCpuId = (EDKII_PEI_MICROCODE_CPU_ID *) AllocateZeroPool (sizeof (EDKII_PEI_MICROCODE_CPU_ID) * CpuCount);\r
+  if (MicrocodeCpuId == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
+    MicrocodeCpuId[Index].ProcessorSignature = CpuMpData->CpuData[Index].ProcessorSignature;\r
+    MicrocodeCpuId[Index].PlatformId         = CpuMpData->CpuData[Index].PlatformId;\r
+  }\r
+\r
+  Status = ShadowMicrocodePpi->ShadowMicrocode (\r
+             ShadowMicrocodePpi,\r
+             CpuCount,\r
+             MicrocodeCpuId,\r
+             &BufferSize,\r
+             &Buffer\r
+             );\r
+  FreePool (MicrocodeCpuId);\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  CpuMpData->MicrocodePatchAddress    = (UINTN) Buffer;\r
+  CpuMpData->MicrocodePatchRegionSize = BufferSize;\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
+    ));\r
+\r
+  return EFI_SUCCESS;\r
+}\r