Revision: 19122
          http://sourceforge.net/p/edk2/code/19122
Author:   timhe
Date:     2015-12-04 08:00:53 +0000 (Fri, 04 Dec 2015)
Log Message:
-----------
Vlv2TbltDevicePkg/Vlv2DeviceRefCodePkg: 

Reset BIOS Setup when the jumper is 

present on Turbot board.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Shifei Lu <[email protected]>
Reviewed-by: Tim He <[email protected]>

Modified Paths:
--------------
    
branches/UDK2014.SP1/Vlv2DeviceRefCodePkg/ValleyView2Soc/SouthCluster/Include/Library/PchPlatformLib.h
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PchPlatformLib/PchPlatformLibrary.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/ExI.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.c
    
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/BootMode.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/Platform.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
    branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSmm/Platform.c

Modified: 
branches/UDK2014.SP1/Vlv2DeviceRefCodePkg/ValleyView2Soc/SouthCluster/Include/Library/PchPlatformLib.h
===================================================================
--- 
branches/UDK2014.SP1/Vlv2DeviceRefCodePkg/ValleyView2Soc/SouthCluster/Include/Library/PchPlatformLib.h
      2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2DeviceRefCodePkg/ValleyView2Soc/SouthCluster/Include/Library/PchPlatformLib.h
      2015-12-04 08:00:53 UTC (rev 19122)
@@ -117,5 +117,14 @@
 
 **/
 ;
+UINT32
+DetectTurbotBoard (
+VOID
+  );
 
+UINT32
+DetectGpioPinValue (
+VOID
+  );
+
 #endif

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/AcpiPlatform/AcpiPlatform.c  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -648,6 +648,7 @@
   EFI_PLATFORM_CPU_INFO       *PlatformCpuInfoPtr = NULL;
   EFI_PLATFORM_CPU_INFO       PlatformCpuInfo;
   EFI_PEI_HOB_POINTERS          GuidHob;
+  UINT32                      DxeGpioValue;
 
   if (mFirstNotify) {
     return;
@@ -686,6 +687,8 @@
     CopyMem(&PlatformCpuInfo, PlatformCpuInfoPtr, 
sizeof(EFI_PLATFORM_CPU_INFO));
   }
 
+  DxeGpioValue = DetectGpioPinValue();
+
   //
   // Update the ACPI parameter blocks finally.
   //
@@ -697,8 +700,8 @@
                   &VariableSize,
                   &SetupVarBuffer
                   );
-  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VariableSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",
@@ -796,6 +799,7 @@
   UINTN                         NumberOfEnabledCPUs;
   UINT32                        Data32;
   PCH_STEPPING                  pchStepping;
+  UINT32                        DxeGpioValue;
 
   mFirstNotify      = FALSE;
 
@@ -815,7 +819,8 @@
       mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid);
     }
   }
-
+  
+  DxeGpioValue = DetectGpioPinValue();
   //
   // Search for the Memory Configuration GUID HOB.  If it is not present, then
   // there's nothing we can do. It may not exist on the update path.
@@ -828,8 +833,8 @@
                   &VarSize,
                   &mSystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",
@@ -864,8 +869,8 @@
                   &SysCfgSize,
                   &mSystemConfig
                   );
-  if (EFI_ERROR (Status) || SysCfgSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || SysCfgSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     SysCfgSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
 2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.c
 2015-12-04 08:00:53 UTC (rev 19122)
@@ -291,7 +291,9 @@
   UINT8                         ClockAddress = CLOCK_GENERATOR_ADDRESS;
   UINTN                         VariableSize;
   EFI_PEI_READ_ONLY_VARIABLE2_PPI   *Variable;
+  UINT32                            PeiGpioValue;
 
+  PeiGpioValue = DetectGpioPinValue();
   //
   // Obtain Platform Info from HOB.
   //
@@ -355,8 +357,8 @@
                                    NULL,
                                    &VariableSize,
                                    &SystemConfiguration);
-  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION) || 
PeiGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VariableSize = sizeof(SYSTEM_CONFIGURATION);
     Status = Variable->GetVariable(Variable,
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
 2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardClkGens/BoardClkGens.h
 2015-12-04 08:00:53 UTC (rev 19122)
@@ -28,6 +28,7 @@
 #define _BOARD_CLK_GEN_H_
 
 #include <PiPei.h>
+#include "PchAccess.h"
 #include <Library/HobLib.h>
 #include <Library/IoLib.h>
 #include <Library/DebugLib.h>
@@ -35,6 +36,7 @@
 #include <Ppi/Smbus.h>
 #include <IndustryStandard/SmBus.h>
 #include <Guid/PlatformInfo.h>
+#include <Library/PchPlatformLib.h>
 
 
 #define CLOCK_GENERATOR_ADDRESS  0xd2

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
     2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.c
     2015-12-04 08:00:53 UTC (rev 19122)
@@ -150,7 +150,10 @@
   EFI_PEI_READ_ONLY_VARIABLE2_PPI *PeiReadOnlyVarPpi;
   UINTN                           VarSize;
   SYSTEM_CONFIGURATION            SystemConfiguration;
+  UINT32                          PeiGpioValue;
 
+  PeiGpioValue = DetectGpioPinValue();
+
   DEBUG ((EFI_D_INFO, "MultiPlatformGpioTableInit()...\n"));
 
   //
@@ -178,6 +181,18 @@
                                   &VarSize,
                                   &SystemConfiguration
                                   );
+    if (PeiGpioValue == 0) {
+      VarSize = sizeof(SYSTEM_CONFIGURATION);
+      Status = PeiReadOnlyVarPpi->GetVariable (
+                                    PeiReadOnlyVarPpi,
+                                    L"SetupRecovery",
+                                    &gEfiSetupVariableGuid,
+                                    NULL,
+                                    &VarSize,
+                                    &SystemConfiguration
+                                    );
+      ASSERT_EFI_ERROR (Status);
+    }
                                                                        
      if (SystemConfiguration.GpioWakeCapability == 1) {
       PlatformInfoHob->PlatformCfioData     = (EFI_PHYSICAL_ADDRESS)(UINTN) 
&mMinnow2CfioInitData2;

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
     2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/BoardGpios/BoardGpios.h
     2015-12-04 08:00:53 UTC (rev 19122)
@@ -37,6 +37,7 @@
 #include <Ppi/Smbus.h>
 #include <Ppi/ReadOnlyVariable2.h>
 #include <Guid/SetupVariable.h>
+#include <Library/PchPlatformLib.h>
 
 
 GPIO_CONF_PAD_INIT mNB_BB_FAB3_GpioInitData_SC_TRI[] =

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
        2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/MultiPlatformLib/MultiPlatformLib.inf
        2015-12-04 08:00:53 UTC (rev 19122)
@@ -80,6 +80,7 @@
   DebugLib
   HobLib
   IoLib
+  PchPlatformLib
 #  PeiKscLib
 
 [Ppis]

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PchPlatformLib/PchPlatformLibrary.c
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PchPlatformLib/PchPlatformLibrary.c
  2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PchPlatformLib/PchPlatformLibrary.c
  2015-12-04 08:00:53 UTC (rev 19122)
@@ -134,3 +134,111 @@
   }
   return TRUE;
 }
+
+/**
+  Detect Turbot board
+  
+  @param   None
+
+  @retval  0    Not Turbot board
+  @retval  1    Turbot board 
+
+**/
+UINT32 
+DetectTurbotBoard (
+  void
+  )
+{
+  UINTN PciD31F0RegBase = 0;
+  UINT32 GpioValue = 0;
+  UINT32 TmpVal = 0;
+  UINT32 MmioConf0 = 0;
+  UINT32 MmioPadval = 0;
+  UINT32 PConf0Offset = 0x200; //GPIO_S5_4 pad_conf0 register offset
+  UINT32 PValueOffset = 0x208; //GPIO_S5_4 pad_value register offset
+  UINT32 SSUSOffset = 0x2000;
+  UINT32 IoBase = 0;
+
+  DEBUG ((EFI_D_ERROR, "DetermineTurbotBoard() Entry\n"));
+  PciD31F0RegBase = MmPciAddress (0,
+                      0,
+                      PCI_DEVICE_NUMBER_PCH_LPC,
+                      PCI_FUNCTION_NUMBER_PCH_LPC,
+                      0
+                    );
+  IoBase = MmioRead32 (PciD31F0RegBase + R_PCH_LPC_IO_BASE) & 
B_PCH_LPC_IO_BASE_BAR;
+  
+  MmioConf0 = IoBase + SSUSOffset + PConf0Offset;
+  MmioPadval = IoBase + SSUSOffset + PValueOffset;
+  //0xFED0E200/0xFED0E208 is pad_Conf/pad_val register address of GPIO_S5_4
+  DEBUG ((EFI_D_ERROR, "MmioConf0[0x%x], MmioPadval[0x%x]\n", MmioConf0, 
MmioPadval));
+  
+  MmioWrite32 (MmioConf0, 0x2003CC00);  
+
+  TmpVal = MmioRead32 (MmioPadval);
+  TmpVal &= ~0x6; //Clear bit 1:2
+  TmpVal |= 0x2; // Set the pin as GPI
+  MmioWrite32 (MmioPadval, TmpVal); 
+
+  GpioValue = MmioRead32 (MmioPadval);
+
+  DEBUG ((EFI_D_ERROR, "Gpio_S5_4 value is 0x%x\n", GpioValue));
+  return (GpioValue & 0x1);
+}
+
+/**
+  Detect if "Reset BIOS Setup" jumper is plugged. 
+  Only for MinnowBoard Turbot.
+
+  @param   None
+
+  @retval  0    Jumper is present.
+  @retval  1    Jumper is not present.
+
+**/
+
+UINT32
+DetectGpioPinValue (
+VOID
+  )
+{
+  UINTN                            PciD31F0RegBase = 0;
+  UINT32                           GpioValue;
+  UINT32                           TmpVal = 0;
+  UINT32                           SSUSOffset = 0x2000;
+  UINT32                           IoBase = 0;
+  UINT32                           MmioConf0 = 0;
+  UINT32                           MmioPadval = 0;
+  UINT32                           PConf0Offset = 0xA0; //GPIO_S5_17 pad_conf0 
register offset
+  UINT32                           PValueOffset = 0xA8; //GPIO_S5_17 pad_value 
register offset
+  
+  if (DetectTurbotBoard() == 0) {
+    return 1;
+  }
+  
+  PciD31F0RegBase = MmPciAddress (0,
+                      0,
+                      PCI_DEVICE_NUMBER_PCH_LPC,
+                      PCI_FUNCTION_NUMBER_PCH_LPC,
+                      0
+                    );
+  IoBase = MmioRead32 (PciD31F0RegBase + R_PCH_LPC_IO_BASE) & 
B_PCH_LPC_IO_BASE_BAR;
+
+  //
+  // 0xFED0E0A0/0xFED0E0A8 is pad_Conf/pad_val register address of GPIO_S5_17
+  //
+  MmioConf0 = IoBase + SSUSOffset + PConf0Offset;
+  MmioPadval = IoBase + SSUSOffset + PValueOffset;
+  
+  MmioWrite32 (MmioConf0, 0x2003CC01);
+
+  TmpVal = MmioRead32 (MmioPadval);
+  TmpVal &= ~0x6; //Clear bit 1:2
+  TmpVal |= 0x2; // Set the pin as GPI
+  MmioWrite32 (MmioPadval, TmpVal);
+
+  GpioValue = MmioRead32 (MmioPadval);
+  DEBUG ((EFI_D_INFO, "Gpio_S5_17 value is 0x%x\n", GpioValue));
+
+  return (GpioValue & 0x1);
+}

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c 
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c 
2015-12-04 08:00:53 UTC (rev 19122)
@@ -53,6 +53,7 @@
 #include <Library/GenericBdsLib/InternalBdsLib.h>
 #include <Library/GenericBdsLib/String.h>
 #include <Library/NetLib.h>
+#include <Library/PchPlatformLib.h>
 
 EFI_GUID *ConnectDriverTable[] = {
   &gEfiMmioDeviceProtocolGuid,
@@ -293,6 +294,7 @@
 
   UINTN                                 VarSize;
   SYSTEM_CONFIGURATION  mSystemConfiguration;
+  UINT32                          DxeGpioValue;
 
   if (PciDevicePath == NULL || GopDevicePath == NULL) {
     return EFI_INVALID_PARAMETER;
@@ -313,6 +315,7 @@
     return Status;
   }
 
+  DxeGpioValue = DetectGpioPinValue();
   //
   // Try to connect this handle, so that GOP dirver could start on this
   // device and create child handles with GraphicsOutput Protocol installed
@@ -331,8 +334,8 @@
                   &VarSize,
                   &mSystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",
@@ -622,6 +625,7 @@
   EFI_DEVICE_PATH_PROTOCOL  *GopDevicePath;
   UINTN                VarSize;
   SYSTEM_CONFIGURATION  mSystemConfiguration;
+  UINT32                    DxeGpioValue;
 
   Status = EFI_SUCCESS;
   PlugInPciVgaDevicePath = NULL;
@@ -636,6 +640,8 @@
     return EFI_UNSUPPORTED;
   }
 
+  DxeGpioValue = DetectGpioPinValue();
+
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
                   L"Setup",
@@ -644,8 +650,8 @@
                   &VarSize,
                   &mSystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",
@@ -698,10 +704,12 @@
   SYSTEM_CONFIGURATION   SystemConfiguration;
   UINTN                  VarSize;
   EFI_STATUS             Status;
+  UINT32                 DxeGpioValue;
 
 
   HorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);
   VerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution);
+  DxeGpioValue = DetectGpioPinValue();
 
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
@@ -711,8 +719,8 @@
                   &VarSize,
                   &SystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",
@@ -1616,13 +1624,16 @@
   BOOLEAN                            IsFirstBoot;
   UINT16                             *BootOrder;
   UINTN                              BootOrderSize;
+  UINT32                             DxeGpioValue;
 
   Timeout = PcdGet16 (PcdPlatformBootTimeOut);
   if (Timeout > 10 ) {
     //we think the Timeout variable is corrupted
     Timeout = 10;
   }
-       
+
+  DxeGpioValue = DetectGpioPinValue();
+
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
                   NORMAL_SETUP_NAME,
@@ -1632,8 +1643,8 @@
                   &SystemConfiguration
                   );
 
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
    2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/Library/PlatformBdsLib/PlatformBdsLib.inf
    2015-12-04 08:00:53 UTC (rev 19122)
@@ -81,6 +81,7 @@
   FileHandleLib
   S3BootScriptLib
   SerialPortLib
+  PchPlatformLib
 
 [Protocols]
   gEfiFirmwareVolume2ProtocolGuid

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c    
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.c    
2015-12-04 08:00:53 UTC (rev 19122)
@@ -48,6 +48,7 @@
 #include <Protocol/FirmwareVolume.h>
 #include <Library/HobLib.h>
 #include <IndustryStandard/Pci22.h>
+#include <Library/PchPlatformLib.h>
 
 extern  PCI_OPTION_ROM_TABLE  mPciOptionRomTable[];
 extern  UINTN                 mSizeOptionRomTable;
@@ -343,7 +344,10 @@
 {
   EFI_STATUS  Status;
   UINTN       VarSize;
+  UINT32      DxeGpioValue;
 
+  DxeGpioValue = DetectGpioPinValue();
+
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
                   L"Setup",
@@ -352,8 +356,8 @@
                   &VarSize,
                   &mSystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PciPlatform/PciPlatform.inf  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -71,6 +71,7 @@
   UefiBootServicesTableLib
   UefiRuntimeServicesTableLib
   DxeServicesTableLib
+  PchPlatformLib
 
 [BuildOptions]
 

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/ExI.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/ExI.c    2015-12-04 
03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/ExI.c    2015-12-04 
08:00:53 UTC (rev 19122)
@@ -34,6 +34,7 @@
 
 
 #include "PlatformDxe.h"
+#include <Library/PchPlatformLib.h>
 
 #define PchLpcPciCfg32(Register)  MmioRead32 (MmPciAddress (0, 
DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
 
@@ -71,7 +72,10 @@
 
   SYSTEM_CONFIGURATION          SystemConfiguration;
   UINTN       VarSize;
+  UINT32      DxeGpioValue;
 
+  DxeGpioValue = DetectGpioPinValue();
+
   VarSize = sizeof(SYSTEM_CONFIGURATION);
 
   Status = gRT->GetVariable(
@@ -82,8 +86,8 @@
                   &SystemConfiguration
                   );
 
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/Platform.c       
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformDxe/Platform.c       
2015-12-04 08:00:53 UTC (rev 19122)
@@ -50,6 +50,7 @@
 #include <Protocol/IgdOpRegion.h>
 #include <Library/PcdLib.h>
 #include <Protocol/VariableLock.h>
+#include <Library/PchPlatformLib.h>
 
 
 //
@@ -201,6 +202,10 @@
   VOID
   );
 
+EFI_STATUS
+DxeDetectGpioPinToResetSetup(
+  VOID
+  );
 
 EFI_STATUS
 EFIAPI
@@ -594,7 +599,41 @@
 
 #endif
 
+EFI_STATUS
+DxeDetectGpioPinToResetSetup (
+  VOID
+  )
+{
+  EFI_STATUS       Status;
+  UINTN            VarSize;
+  UINT32           DxeGpioValue;
 
+  DxeGpioValue = DetectGpioPinValue();
+
+  if (DxeGpioValue == 0) {
+    VarSize = sizeof(SYSTEM_CONFIGURATION);
+
+      Status = gRT->GetVariable(
+                      L"SetupRecovery",
+                      &gEfiNormalSetupGuid,
+                      NULL,
+                      &VarSize,
+                      &mSystemConfiguration
+                      );
+      ASSERT_EFI_ERROR (Status);
+
+      Status = gRT->SetVariable (
+                      NORMAL_SETUP_NAME,
+                      &gEfiNormalSetupGuid,
+                      EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                      sizeof(SYSTEM_CONFIGURATION),
+                      &mSystemConfiguration
+                      );
+  }
+
+  return   EFI_SUCCESS;  
+}
+
 EFI_STATUS
 EFIAPI
 TristateLpcGpioS0i3Config (
@@ -816,6 +855,11 @@
                     &mSystemConfiguration
                     );    
   }
+  
+  //
+  // Detect GPIO_S5_17 Pin to reset setup to default in Dxe Phase.
+  //
+  DxeDetectGpioPinToResetSetup();
     
   Status = EfiCreateEventReadyToBootEx (
              TPL_CALLBACK,
@@ -1688,6 +1732,9 @@
   SYSTEM_CONFIGURATION        SystemConfiguration;
   UINTN                       VarSize;
   EFI_STATUS                  Status;
+  UINT32                      DxeGpioValue;
+  
+  DxeGpioValue = DetectGpioPinValue();
 
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
@@ -1698,8 +1745,8 @@
                   &SystemConfiguration
                   );
 
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.c
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.c    
    2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.c    
    2015-12-04 08:00:53 UTC (rev 19122)
@@ -33,6 +33,8 @@
 #include <Guid/SetupVariable.h>
 #include <SetupMode.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
+#include "PchAccess.h"
+#include <Library/PchPlatformLib.h>
 
 EFI_BOOT_SERVICES   *gBS;
 
@@ -165,6 +167,7 @@
   EFI_STATUS  Status = EFI_SUCCESS;
   SYSTEM_CONFIGURATION          SystemConfiguration;
   UINTN       VarSize;
+  UINT32      DxeGpioValue;
 
 
   gBS = SystemTable->BootServices;
@@ -179,6 +182,8 @@
   mPlatformGOPPolicy.GetPlatformLidStatus    = GetPlatformLidStatus;
   mPlatformGOPPolicy.GetVbtData              = GetVbtData;
 
+  DxeGpioValue = DetectGpioPinValue();
+
   //
   // Install protocol to allow access to this Policy.
   //
@@ -190,8 +195,8 @@
                   &VarSize,
                   &SystemConfiguration
                   );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf  
    2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformGopPolicy/PlatformGopPolicy.inf  
    2015-12-04 08:00:53 UTC (rev 19122)
@@ -45,11 +45,14 @@
   MdePkg/MdePkg.dec
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   Vlv2TbltDevicePkg/PlatformPkg.dec
+  Vlv2DeviceRefCodePkg/Vlv2DeviceRefCodePkg.dec
+
 [LibraryClasses]
   BaseLib
   DebugLib
   UefiDriverEntryPoint
   UefiRuntimeServicesTableLib
+  PchPlatformLib
 #  DxeKscLib
 
 [Guids]

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.c    
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.c    
2015-12-04 08:00:53 UTC (rev 19122)
@@ -30,6 +30,8 @@
 --*/
 
 #include "PlatformInfoDxe.h"
+#include "PchAccess.h"
+#include <Library/PchPlatformLib.h>
 
 /**
   Entry point for the driver.
@@ -62,6 +64,9 @@
   UINT8                       *LpssDataHobPtr;
   UINT8                       *LpssDataVarPtr;
   UINTN                       i;
+  UINT32                      DxeGpioValue;
+  
+  DxeGpioValue = DetectGpioPinValue();
 
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
@@ -72,8 +77,8 @@
                   &SystemConfiguration
                   );
   
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.inf  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -61,6 +61,7 @@
   UefiRuntimeServicesTableLib
   UefiDriverEntryPoint
   BaseMemoryLib
+  PchPlatformLib
 
 [Depex]
   gEfiVariableArchProtocolGuid AND gEfiVariableWriteArchProtocolGuid

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/BootMode.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/BootMode.c   
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/BootMode.c   
2015-12-04 08:00:53 UTC (rev 19122)
@@ -157,6 +157,7 @@
   volatile UINT32                   GpioValue;
   BOOLEAN                           IsFirstBoot;
   UINT32                            Data32;
+  UINT32                            PeiGpioValue;
 
   Status = (*PeiServices)->GetBootMode(
                              PeiServices,
@@ -177,6 +178,7 @@
   // When this boot is WDT reset, the system needs booting with CrashDump 
function eanbled.
   //
   Data32 = IoRead32 (ACPI_BASE_ADDRESS + R_PCH_TCO_STS);
+  PeiGpioValue = DetectGpioPinValue();
 
   //
   // Check Power Button, click the power button, the system will boot in fast 
boot mode,
@@ -211,8 +213,8 @@
                            &VarSize,
                            &SystemConfiguration
                            );
-      if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-        //The setup variable is corrupted
+      if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
PeiGpioValue == 0) {
+        //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
         VarSize = sizeof(SYSTEM_CONFIGURATION);
         Status = Variable->GetVariable(
                   Variable,

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformInitPei/PlatformEarlyInit.c  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -179,7 +179,10 @@
   UINTN                        VariableSize;
   EFI_STATUS                   Status;
   EFI_PEI_READ_ONLY_VARIABLE2_PPI   *Variable;
+  UINT32                            PeiGpioValue;
 
+  PeiGpioValue = DetectGpioPinValue();
+
   VariableSize = sizeof (SYSTEM_CONFIGURATION);
   ZeroMem (SystemConfiguration, sizeof (SYSTEM_CONFIGURATION));
 
@@ -205,8 +208,8 @@
                        &VariableSize,
                        SystemConfiguration
                        );
-  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION) || 
PeiGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VariableSize = sizeof(SYSTEM_CONFIGURATION);
     Status = Variable->GetVariable(
               Variable,

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/BootMode.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/BootMode.c       
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/BootMode.c       
2015-12-04 08:00:53 UTC (rev 19122)
@@ -39,6 +39,7 @@
 #include <Guid/SetupVariable.h>
 
 #include <Guid/BootState.h>
+#include <Library/PchPlatformLib.h>
 
 //
 // Priority of our boot modes, highest priority first
@@ -327,7 +328,10 @@
   UINTN                           VarSize;
   SYSTEM_CONFIGURATION            SystemConfiguration;
   BOOLEAN                         FastBootEnabledStatus;
+  UINT32                          PeiGpioValue;
 
+  PeiGpioValue = DetectGpioPinValue();
+
   FastBootEnabledStatus = FALSE;
   Status = (**PeiServices).LocatePpi (
                              PeiServices,
@@ -346,6 +350,18 @@
                                   &VarSize,
                                   &SystemConfiguration
                                   );
+  if (PeiGpioValue == 0) {
+      VarSize = sizeof(SYSTEM_CONFIGURATION);
+      Status = PeiReadOnlyVarPpi->GetVariable (
+                                    PeiReadOnlyVarPpi,
+                                    L"SetupRecovery",
+                                    &gEfiSetupVariableGuid,
+                                    NULL,
+                                    &VarSize,
+                                    &SystemConfiguration
+                                    );
+      ASSERT_EFI_ERROR (Status);
+    }
     if (Status == EFI_SUCCESS) {
       if (SystemConfiguration.FastBoot != 0) {
         FastBootEnabledStatus = TRUE;

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/Platform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/Platform.c       
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/Platform.c       
2015-12-04 08:00:53 UTC (rev 19122)
@@ -38,6 +38,7 @@
 #include <Guid/SetupVariable.h>
 #include <Guid/Vlv2Variable.h>
 #include <Ppi/fTPMPolicy.h>
+#include <Library/PchPlatformLib.h>
 
 //
 // Start::Alpine Valley platform
@@ -708,6 +709,7 @@
 
   EFI_PEI_PPI_DESCRIPTOR          *mVlvMmioPolicyPpiDesc;
   VLV_MMIO_POLICY_PPI             *mVlvMmioPolicyPpi;
+  UINT32                           PeiGpioValue;
 
   ZeroMem (&PlatformInfo, sizeof(PlatformInfo));
 
@@ -753,6 +755,7 @@
 
 
   PchMmPci32( 0, 0, 2, 0, 0x50) = 0x210;
+  PeiGpioValue = DetectGpioPinValue();
 
   VariableSize = sizeof (SYSTEM_CONFIGURATION);
   ZeroMem (&SystemConfiguration, VariableSize);
@@ -776,8 +779,8 @@
                        &VariableSize,
                        &SystemConfiguration
                                           );
-  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION) || 
PeiGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VariableSize = sizeof(SYSTEM_CONFIGURATION);
     Status = Variable->GetVariable(
               Variable,

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformPei/PlatformPei.inf  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -96,6 +96,7 @@
   MonoStatusCodeLib
   BaseCryptLib
   PciLib
+  PchPlatformLib
 
 [Ppis]
   gEfiPeiStallPpiGuid

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf
===================================================================
--- 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf    
    2015-12-04 03:46:05 UTC (rev 19121)
+++ 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.inf    
    2015-12-04 08:00:53 UTC (rev 19122)
@@ -98,6 +98,7 @@
   BiosIdLib
   CpuIA32Lib
   IoLib
+  PchPlatformLib
 
 [Guids]
   ##  This GUID C Name is not required for build since it is from UefiLib and 
not directly used by this module source.

Modified: 
branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c  
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c  
2015-12-04 08:00:53 UTC (rev 19122)
@@ -54,6 +54,7 @@
 #include "SetupMode.h"
 #include "PchCommonDefinitions.h"
 #include <PlatformBaseAddresses.h>
+#include <Library/PchPlatformLib.h>
 
 
 typedef struct {
@@ -1745,10 +1746,12 @@
   EFI_STATUS                  Status;
   UINTN                       VarSize;
   EFI_PEI_HOB_POINTERS        GuidHob;
+  UINT32                      DxeGpioValue;
 
   if (mSetupInfoDone) {
       return;
   }
+  DxeGpioValue = DetectGpioPinValue();
 
   VarSize = sizeof(SYSTEM_CONFIGURATION);
   Status = gRT->GetVariable(
@@ -1759,8 +1762,8 @@
                   &mSystemConfiguration
                                  );
 
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)|| 
DxeGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = gRT->GetVariable(
               L"SetupRecovery",

Modified: branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSmm/Platform.c
===================================================================
--- branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSmm/Platform.c       
2015-12-04 03:46:05 UTC (rev 19121)
+++ branches/UDK2014.SP1/Vlv2TbltDevicePkg/PlatformSmm/Platform.c       
2015-12-04 08:00:53 UTC (rev 19122)
@@ -33,8 +33,8 @@
 
 #include "SmmPlatform.h"
 #include <Protocol/CpuIo2.h>
+#include <Library/PchPlatformLib.h>
 
-
 //
 // Local variables
 //
@@ -151,7 +151,10 @@
   EFI_SMM_SW_DISPATCH_CONTEXT               SwContext;
   UINTN                                     VarSize;
   EFI_BOOT_MODE                             BootMode;
+  UINT32                                    SmmGpioValue;
 
+  SmmGpioValue = DetectGpioPinValue();
+
   Handle = NULL;
 
   //
@@ -179,8 +182,8 @@
                           &VarSize,
                           &mSystemConfiguration
                           );
-  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
SmmGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = SystemTable->RuntimeServices->GetVariable(
               L"SetupRecovery",
@@ -849,6 +852,7 @@
   UINTN             i;
   EFI_STATUS        Status;
   UINTN             VarSize;
+  UINT32            SmmGpioValue;
 
   //
   // make sure EFI_SMM_VARIABLE_PROTOCOL is available
@@ -856,6 +860,7 @@
   if (!mSmmVariable) {
     return;
   }
+  SmmGpioValue = DetectGpioPinValue();
 
   VarSize = sizeof(SYSTEM_CONFIGURATION);
 
@@ -869,8 +874,8 @@
                            &VarSize,
                            &mSystemConfiguration
                            );
-  if (EFI_ERROR(Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
-    //The setup variable is corrupted
+  if (EFI_ERROR(Status) || VarSize != sizeof(SYSTEM_CONFIGURATION) || 
SmmGpioValue == 0) {
+    //The setup variable is corrupted or detect GPIO_S5_17 Pin is low
     VarSize = sizeof(SYSTEM_CONFIGURATION);
     Status = mSmmVariable->SmmGetVariable(
               L"SetupRecovery",


------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741911&iu=/4140
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to