#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
);\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
{\r
\r
UINTN mPciD31F0RegBase;\r
- UINTN BiosFlaLower = 0;\r
- UINTN BiosFlaLimit = 0x7fffff;\r
-\r
- BiosFlaLower = PcdGet32(PcdFlashMicroCodeAddress)-PcdGet32(PcdFlashAreaBaseAddress);\r
+ UINTN BiosFlaLower0;\r
+ UINTN BiosFlaLimit0;\r
+ UINTN BiosFlaLower1;\r
+ UINTN BiosFlaLimit1; \r
+ \r
\r
+ BiosFlaLower0 = PcdGet32(PcdFlashMicroCodeAddress)-PcdGet32(PcdFlashAreaBaseAddress);\r
+ BiosFlaLimit0 = PcdGet32(PcdFlashMicroCodeSize)-1; \r
+ #ifdef MINNOW2_FSP_BUILD\r
+ BiosFlaLower1 = PcdGet32(PcdFlashFvFspBase)-PcdGet32(PcdFlashAreaBaseAddress);\r
+ BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvFspBase)+PcdGet32(PcdFlashFvRecoverySize))-1;\r
+ #else\r
+ BiosFlaLower1 = PcdGet32(PcdFlashFvMainBase)-PcdGet32(PcdFlashAreaBaseAddress);\r
+ BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvMainBase)+PcdGet32(PcdFlashFvRecoverySize))-1;\r
+ #endif\r
\r
+ \r
mPciD31F0RegBase = MmPciAddress (0,\r
DEFAULT_PCI_BUS_NUMBER_PCH,\r
PCI_DEVICE_NUMBER_PCH_LPC,\r
//\r
MmioOr32((UINTN)(SpiBase + R_PCH_SPI_PR0),\r
B_PCH_SPI_PR0_RPE|B_PCH_SPI_PR0_WPE|\\r
- (B_PCH_SPI_PR0_PRB_MASK&(BiosFlaLower>>12))|(B_PCH_SPI_PR0_PRL_MASK&(BiosFlaLimit>>12)<<16));\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
+ //Set PR1\r
+ //\r
+\r
+ MmioOr32((UINTN)(SpiBase + R_PCH_SPI_PR1),\r
+ B_PCH_SPI_PR1_RPE|B_PCH_SPI_PR1_WPE|\\r
+ (B_PCH_SPI_PR1_PRB_MASK&(BiosFlaLower1>>12))|(B_PCH_SPI_PR1_PRL_MASK&(BiosFlaLimit1>>12)<<16));\r
+\r
+ //\r
+ //Lock down PRx\r
//\r
MmioOr16 ((UINTN) (SpiBase + R_PCH_SPI_HSFS), (UINT16) (B_PCH_SPI_HSFS_FLOCKDN));\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
+ DEBUG((EFI_D_ERROR, "Failed to lock down PRx.\n"));\r
}\r
-\r
return;\r
\r
}\r
)\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
}\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
//\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
&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
&mReadyToBootEvent\r
);\r
//\r
- // Create a ReadyToBoot Event to run enable PR0 and lock down\r
+ // Create a ReadyToBoot Event to run enable PR0/PR1 and lock down,unlock variable region\r
//\r
if(mSystemConfiguration.SpiRwProtect==1) {\r
Status = EfiCreateEventReadyToBootEx (\r
&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
{\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
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
&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