]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Vlv2TbltDevicePkg/PlatformDxe/Platform.c
NetworkPkg: Fix PXEv6 boot failure when DhcpBinl offer received.
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformDxe / Platform.c
index dba84fb6596785265c5c3494685689989f7fcc10..904a9a5a1fd0f4f83650e1b9f50817cca3ec1325 100644 (file)
@@ -49,6 +49,8 @@ Abstract:
 #include <Protocol/GlobalNvsArea.h>\r
 #include <Protocol/IgdOpRegion.h>\r
 #include <Library/PcdLib.h>\r
+#include <Protocol/VariableLock.h>\r
+\r
 \r
 //\r
 // VLV2 GPIO GROUP OFFSET\r
@@ -200,6 +202,82 @@ InitRC6Policy(
   );\r
 \r
 \r
+EFI_STATUS\r
+EFIAPI\r
+SaveSetupRecoveryVar(\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                   Status = EFI_SUCCESS;\r
+  UINTN                        SizeOfNvStore = 0;\r
+  UINTN                        SizeOfSetupVar = 0;\r
+  SYSTEM_CONFIGURATION         *SetupData = NULL;\r
+  SYSTEM_CONFIGURATION         *RecoveryNvData = NULL;\r
+  EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock = NULL;\r
+\r
+\r
+  DEBUG ((EFI_D_INFO, "SaveSetupRecoveryVar() Entry \n"));\r
+  SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);\r
+  RecoveryNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));\r
+  if (NULL == RecoveryNvData) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Exit; \r
+  }\r
+  \r
+  Status = gRT->GetVariable(\r
+                L"SetupRecovery",\r
+                &gEfiNormalSetupGuid,\r
+                NULL,\r
+                &SizeOfNvStore,\r
+                RecoveryNvData\r
+                );\r
+  \r
+  if (EFI_ERROR (Status)) {\r
+    // Don't find the "SetupRecovery" variable.\r
+    // have to copy "Setup" variable to "SetupRecovery" variable.\r
+    SetupData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));\r
+    if (NULL == SetupData) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Exit;      \r
+    }\r
+    SizeOfSetupVar = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+                    NORMAL_SETUP_NAME,\r
+                    &gEfiNormalSetupGuid,\r
+                    NULL,\r
+                    &SizeOfSetupVar,\r
+                    SetupData\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+    \r
+    Status = gRT->SetVariable (\r
+                    L"SetupRecovery",\r
+                    &gEfiNormalSetupGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof(SYSTEM_CONFIGURATION),\r
+                    SetupData\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock);\r
+      if (!EFI_ERROR (Status)) {\r
+        Status = VariableLock->RequestToLock (VariableLock, L"SetupRecovery", &gEfiNormalSetupGuid);\r
+        ASSERT_EFI_ERROR (Status);\r
+    }\r
+    \r
+  }\r
+\r
+Exit:\r
+  if (RecoveryNvData)\r
+    FreePool (RecoveryNvData);\r
+  if (SetupData)\r
+    FreePool (SetupData);\r
+  \r
+  return Status;\r
+    \r
+}\r
+\r
+\r
 VOID\r
 TristateLpcGpioConfig (\r
   IN UINT32             Gpio_Mmio_Offset,\r
@@ -404,18 +482,6 @@ SpiBiosProtectionFunction(
     B_PCH_SPI_PR0_RPE|B_PCH_SPI_PR0_WPE|\\r
     (B_PCH_SPI_PR0_PRB_MASK&(BiosFlaLower0>>12))|(B_PCH_SPI_PR0_PRL_MASK&(BiosFlaLimit0>>12)<<16));\r
 \r
-  //\r
-  //Lock down PR0\r
-  //\r
-  MmioOr16 ((UINTN) (SpiBase + R_PCH_SPI_HSFS), (UINT16) (B_PCH_SPI_HSFS_FLOCKDN));\r
-\r
-  //\r
-  // Verify if it's really locked.\r
-  //\r
-  if ((MmioRead16 (SpiBase + R_PCH_SPI_HSFS) & B_PCH_SPI_HSFS_FLOCKDN) == 0) {\r
-    DEBUG((EFI_D_ERROR, "Failed to lock down PR0.\n"));\r
-  }\r
-\r
   //\r
   //Set PR1\r
   //\r
@@ -425,7 +491,7 @@ SpiBiosProtectionFunction(
     (B_PCH_SPI_PR1_PRB_MASK&(BiosFlaLower1>>12))|(B_PCH_SPI_PR1_PRL_MASK&(BiosFlaLimit1>>12)<<16));\r
 \r
   //\r
-  //Lock down PR1\r
+  //Lock down PRx\r
   //\r
   MmioOr16 ((UINTN) (SpiBase + R_PCH_SPI_HSFS), (UINT16) (B_PCH_SPI_HSFS_FLOCKDN));\r
 \r
@@ -433,7 +499,7 @@ SpiBiosProtectionFunction(
   // Verify if it's really locked.\r
   //\r
   if ((MmioRead16 (SpiBase + R_PCH_SPI_HSFS) & B_PCH_SPI_HSFS_FLOCKDN) == 0) {\r
-    DEBUG((EFI_D_ERROR, "Failed to lock down PR1.\n"));\r
+    DEBUG((EFI_D_ERROR, "Failed to lock down PRx.\n"));\r
   }\r
   return;\r
 \r
@@ -447,16 +513,15 @@ InitPciDevPME (
   )\r
 {\r
   UINTN                  VarSize;\r
-  EFI_STATUS             Status;\r
 \r
   VarSize = sizeof(SYSTEM_CONFIGURATION);\r
-  Status = gRT->GetVariable(\r
-                  NORMAL_SETUP_NAME,\r
-                  &gEfiNormalSetupGuid,\r
-                  NULL,\r
-                  &VarSize,\r
-                  &mSystemConfiguration\r
-                  );\r
+  gRT->GetVariable(\r
+         NORMAL_SETUP_NAME,\r
+         &gEfiNormalSetupGuid,\r
+         NULL,\r
+         &VarSize,\r
+         &mSystemConfiguration\r
+         );\r
 \r
   //\r
   //Program HDA PME_EN\r
@@ -498,6 +563,31 @@ InitPciDevPME (
   }\r
 }\r
 \r
+VOID\r
+EFIAPI\r
+InitThermalZone (\r
+  EFI_EVENT  Event,\r
+  VOID       *Context\r
+  )\r
+{\r
+  UINTN                  VarSize;\r
+  EFI_GLOBAL_NVS_AREA_PROTOCOL       *GlobalNvsArea;\r
+  VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+  gRT->GetVariable(\r
+         NORMAL_SETUP_NAME,\r
+         &gEfiNormalSetupGuid,\r
+         NULL,\r
+         &VarSize,\r
+         &mSystemConfiguration\r
+         );\r
+  gBS->LocateProtocol (\r
+         &gEfiGlobalNvsAreaProtocolGuid,\r
+         NULL,\r
+         (void **)&GlobalNvsArea\r
+         );\r
+  GlobalNvsArea->Area->CriticalThermalTripPoint = mSystemConfiguration.CriticalThermalTripPoint;\r
+  GlobalNvsArea->Area->PassiveThermalTripPoint = mSystemConfiguration.PassiveThermalTripPoint;\r
+}\r
 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY\r
 \r
 #endif\r
@@ -692,6 +782,10 @@ InitializePlatform (
   //\r
   InitializeObservableProtocol();\r
 \r
+  Status = SaveSetupRecoveryVar();\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "InitializePlatform() Save SetupRecovery variable failed \n"));\r
+  }\r
 \r
   VarSize = sizeof(SYSTEM_CONFIGURATION);\r
   Status = gRT->GetVariable(\r
@@ -701,8 +795,26 @@ InitializePlatform (
                   &VarSize,\r
                   &mSystemConfiguration\r
                   );\r
-\r
-\r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &mSystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+    Status = gRT->SetVariable (\r
+                    NORMAL_SETUP_NAME,\r
+                    &gEfiNormalSetupGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof(SYSTEM_CONFIGURATION),\r
+                    &mSystemConfiguration\r
+                    );    \r
+  }\r
+    \r
   Status = EfiCreateEventReadyToBootEx (\r
              TPL_CALLBACK,\r
              ReadyToBootFunction,\r
@@ -730,7 +842,16 @@ InitializePlatform (
                &mReadyToBootEvent\r
                );\r
   }\r
-\r
+  //\r
+  // Create a ReadyToBoot Event to run the thermalzone init process\r
+  //\r
+  Status = EfiCreateEventReadyToBootEx (\r
+             TPL_CALLBACK,\r
+             InitThermalZone,\r
+             NULL,\r
+             &mReadyToBootEvent\r
+             );  \r
\r
   ReportStatusCodeEx (\r
     EFI_PROGRESS_CODE,\r
     EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_PLATFORM_DXE_STEP1,\r
@@ -1394,12 +1515,7 @@ InitMfgAndConfigModeStateVar()
 {\r
   EFI_PLATFORM_SETUP_ID           *BootModeBuffer;\r
   VOID                            *HobList;\r
-  UINT16                          State;\r
 \r
-  //\r
-  // Variable initialization\r
-  //\r
-  State = FALSE;\r
 \r
   HobList = GetFirstGuidHob(&gEfiPlatformBootModeGuid);\r
   if (HobList != NULL) {\r
@@ -1416,16 +1532,8 @@ InitMfgAndConfigModeStateVar()
         mMfgMode = TRUE;\r
       }\r
 \r
-      //\r
-      // Check if in safe mode\r
-      //\r
-      if ( !CompareMem (\r
-              &BootModeBuffer->SetupName,\r
-              SAFE_SETUP_NAME,\r
-              StrSize (SAFE_SETUP_NAME)\r
-              ) ) {\r
-        State = TRUE;\r
-      }\r
+\r
+\r
   }\r
 \r
 }\r
@@ -1588,6 +1696,19 @@ UpdateDVMTSetup(
                   &SystemConfiguration\r
                   );\r
 \r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &SystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
   if((SystemConfiguration.GraphicsDriverMemorySize < 4) && !EFI_ERROR(Status) ) {\r
     switch (SystemConfiguration.GraphicsDriverMemorySize){\r
       case 1:\r