diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/BootMode.c b/QuarkPlatformPkg/Platform/Pei/PlatformInit/BootMode.c index 0dd3d24cf3..215f8f03b3 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/BootMode.c +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/BootMode.c @@ -119,19 +119,6 @@ ValidateFvHeader ( return EFI_SUCCESS; } -/** - - Check whether go to recovery path - @retval TRUE Go to recovery path - @retval FALSE Go to normal path - -**/ -BOOLEAN -OemRecoveryBootMode () -{ - return PlatformIsBootWithRecoveryStage1 (); -} - /** Peform the boot mode determination logic If the box is closed, then @@ -154,31 +141,35 @@ UpdateBootMode ( EFI_STATUS Status; EFI_BOOT_MODE NewBootMode; PEI_CAPSULE_PPI *Capsule; - CHAR8 UserSelection; - UINT32 Straps32; + UINT32 RegValue; + + NewBootMode = *BootMode; // - // Read Straps. Used later if recovery boot. + // Read Sticky R/W Bits // - Straps32 = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_STPDDRCFG); + RegValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW); + DEBUG ((EFI_D_ERROR, "RegValue = %08x\n", RegValue)); // // Check if we need to boot in recovery mode // - if ((ValidateFvHeader (BootMode) != EFI_SUCCESS)) { - DEBUG ((EFI_D_INFO, "Force Boot mode recovery\n")); + if ((RegValue & B_CFG_STICKY_RW_FORCE_RECOVERY) != 0) { NewBootMode = BOOT_IN_RECOVERY_MODE; - Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode); - ASSERT_EFI_ERROR (Status); - if (OemRecoveryBootMode () == FALSE) { - DEBUG ((EFI_D_INFO, "Recovery stage1 not Active, reboot to activate recovery stage1 image\n")); - OemInitiateRecoveryAndWait (); - } - } else if (OemRecoveryBootMode ()) { - DEBUG ((EFI_D_INFO, "Boot mode recovery\n")); + DEBUG ((EFI_D_ERROR, "RECOVERY from sticky bit\n"));; + + // + // Clear force recovery sticky bit + // + QNCAltPortWrite ( + QUARK_SCSS_SOC_UNIT_SB_PORT_ID, + QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW, + RegValue &(~B_CFG_STICKY_RW_FORCE_RECOVERY) + ); + + } else if (ValidateFvHeader (BootMode) != EFI_SUCCESS) { NewBootMode = BOOT_IN_RECOVERY_MODE; - Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode); - ASSERT_EFI_ERROR (Status); + DEBUG ((EFI_D_ERROR, "RECOVERY from corrupt FV\n"));; } else if (QNCCheckS3AndClearState ()) { // // Determine if we're in capsule update mode @@ -217,41 +208,17 @@ UpdateBootMode ( NewBootMode = BOOT_WITH_FULL_CONFIGURATION; } } - *BootMode = NewBootMode; + + if (NewBootMode == BOOT_IN_RECOVERY_MODE) { + DEBUG ((EFI_D_INFO, "Boot mode recovery\n")); + Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode); + ASSERT_EFI_ERROR (Status); + } + Status = PeiServicesSetBootMode (NewBootMode); ASSERT_EFI_ERROR (Status); - // - // If Recovery Boot then prompt the user to insert a USB key with recovery nodule and - // continue with the recovery. Also give the user a chance to retry a normal boot. - // - if (NewBootMode == BOOT_IN_RECOVERY_MODE) { - if ((Straps32 & B_STPDDRCFG_FORCE_RECOVERY) == 0) { - DEBUG ((EFI_D_ERROR, "*****************************************************************\n")); - DEBUG ((EFI_D_ERROR, "***** Force Recovery Jumper Detected. *****\n")); - DEBUG ((EFI_D_ERROR, "***** Attempting auto recovery of system flash. *****\n")); - DEBUG ((EFI_D_ERROR, "***** Expecting USB key with recovery module connected. *****\n")); - DEBUG ((EFI_D_ERROR, "***** PLEASE REMOVE FORCE RECOVERY JUMPER. *****\n")); - DEBUG ((EFI_D_ERROR, "*****************************************************************\n")); - } else { - DEBUG ((EFI_D_ERROR, "*****************************************************************\n")); - DEBUG ((EFI_D_ERROR, "***** ERROR: System boot failure!!!!!!! *****\n")); - DEBUG ((EFI_D_ERROR, "***** - Press 'R' if you wish to force system recovery *****\n")); - DEBUG ((EFI_D_ERROR, "***** (connect USB key with recovery module first) *****\n")); - DEBUG ((EFI_D_ERROR, "***** - Press any other key to attempt another boot *****\n")); - DEBUG ((EFI_D_ERROR, "*****************************************************************\n")); - - UserSelection = PlatformDebugPortGetChar8 (); - if ((UserSelection != 'R') && (UserSelection != 'r')) { - DEBUG ((EFI_D_ERROR, "New boot attempt selected........\n")); - // - // Initialte the cold reset - // - ResetCold (); - } - DEBUG ((EFI_D_ERROR, "Recovery boot selected..........\n")); - } - } + *BootMode = NewBootMode; return EFI_SUCCESS; } diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h b/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h index 98284958a4..983095a8d1 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h @@ -67,7 +67,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include #include #include #include @@ -82,4 +81,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include +#include +#include + #endif diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.c b/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.c index 6b07d78293..7b7ca61817 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.c +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.c @@ -554,7 +554,6 @@ InstallEfiMemory ( UINT64 PeiMemoryLength; UINTN BufferSize; UINTN PeiMemoryIndex; - UINTN RequiredMemSize; EFI_RESOURCE_ATTRIBUTE_TYPE Attribute; EFI_PHYSICAL_ADDRESS BadMemoryAddress; EFI_SMRAM_DESCRIPTOR DescriptorAcpiVariable; @@ -613,12 +612,6 @@ InstallEfiMemory ( ); ASSERT_EFI_ERROR (Status); - // - // Get required memory size for ACPI use. This helps to put ACPI memory on the topest - // - RequiredMemSize = 0; - RetriveRequiredMemorySize (PeiServices, &RequiredMemSize); - // // Detect MOR request by the OS. // @@ -735,15 +728,14 @@ InstallEfiMemory ( // Status = SetPlatformImrPolicy ( PeiMemoryBaseAddress, - PeiMemoryLength, - RequiredMemSize + PeiMemoryLength ); ASSERT_EFI_ERROR (Status); // // Carve out the top memory reserved for ACPI // - Status = PeiServicesInstallPeiMemory (PeiMemoryBaseAddress, (PeiMemoryLength - RequiredMemSize)); + Status = PeiServicesInstallPeiMemory (PeiMemoryBaseAddress, PeiMemoryLength); ASSERT_EFI_ERROR (Status); BuildResourceDescriptorHob ( @@ -1073,69 +1065,6 @@ InstallS3Memory ( return EFI_SUCCESS; } -/** - - This function returns the size, in bytes, required for the DXE phase. - - @param PeiServices PEI Services table. - @param Size Pointer to the size, in bytes, required for the DXE phase. - - @return None - -**/ -VOID -RetriveRequiredMemorySize ( - IN EFI_PEI_SERVICES **PeiServices, - OUT UINTN *Size - ) -{ - EFI_PEI_HOB_POINTERS Hob; - EFI_MEMORY_TYPE_INFORMATION *MemoryData; - UINT8 Index; - UINTN TempPageNum; - - MemoryData = NULL; - TempPageNum = 0; - Index = 0; - - PeiServicesGetHobList ((VOID **)&Hob.Raw); - while (!END_OF_HOB_LIST (Hob)) { - if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION && - CompareGuid (&Hob.Guid->Name, &gEfiMemoryTypeInformationGuid) - ) { - MemoryData = (EFI_MEMORY_TYPE_INFORMATION *) (Hob.Raw + sizeof (EFI_HOB_GENERIC_HEADER) + sizeof (EFI_GUID)); - break; - } - - Hob.Raw = GET_NEXT_HOB (Hob); - } - // - // Platform PEIM should supply such a information. Generic PEIM doesn't assume any default value - // - if (!MemoryData) { - return ; - } - - while (MemoryData[Index].Type != EfiMaxMemoryType) { - // - // Accumulate default memory size requirements - // - TempPageNum += MemoryData[Index].NumberOfPages; - Index++; - } - - if (TempPageNum == 0) { - return ; - } - - // - // Add additional pages used by DXE memory manager - // - (*Size) = (TempPageNum + EDKII_DXE_MEM_SIZE_PAGES) * EFI_PAGE_SIZE; - - return ; -} - /** This function returns the memory ranges to be enabled, along with information @@ -1481,7 +1410,6 @@ Done: @param PeiMemoryBaseAddress Base address of memory allocated for PEI. @param PeiMemoryLength Length in bytes of the PEI memory (includes ACPI memory). - @param RequiredMemSize Size in bytes of the ACPI/Runtime memory @return EFI_SUCCESS The function completed successfully. EFI_ACCESS_DENIED Access to IMRs failed. @@ -1490,8 +1418,7 @@ Done: EFI_STATUS SetPlatformImrPolicy ( IN EFI_PHYSICAL_ADDRESS PeiMemoryBaseAddress, - IN UINT64 PeiMemoryLength, - IN UINTN RequiredMemSize + IN UINT64 PeiMemoryLength ) { UINT8 Index; @@ -1514,17 +1441,6 @@ SetPlatformImrPolicy ( } } - // - // Add IMR0 protection for the 'PeiMemory' - // - QncImrWrite ( - QUARK_NC_MEMORY_MANAGER_IMR0, - (UINT32)(((RShiftU64(PeiMemoryBaseAddress, 8)) & IMRL_MASK) | IMR_EN), - (UINT32)((RShiftU64((PeiMemoryBaseAddress+PeiMemoryLength-RequiredMemSize + EFI_PAGES_TO_SIZE(EDKII_DXE_MEM_SIZE_PAGES-1) - 1), 8)) & IMRL_MASK), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM) - ); - // // Add IMR2 protection for shadowed RMU binary. // @@ -1547,28 +1463,6 @@ SetPlatformImrPolicy ( (UINT32)(CPU_SNOOP + CPU0_NON_SMM) ); - // - // Add IMR5 protection for the legacy S3 and AP Startup Vector region (below 1MB). - // - QncImrWrite ( - QUARK_NC_MEMORY_MANAGER_IMR5, - (UINT32)(((RShiftU64(AP_STARTUP_VECTOR, 8)) & IMRL_MASK) | IMR_EN), - (UINT32)((RShiftU64((AP_STARTUP_VECTOR + EFI_PAGE_SIZE - 1), 8)) & IMRH_MASK), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM) - ); - - // - // Add IMR6 protection for the ACPI Reclaim/ACPI/Runtime Services. - // - QncImrWrite ( - QUARK_NC_MEMORY_MANAGER_IMR6, - (UINT32)(((RShiftU64((PeiMemoryBaseAddress+PeiMemoryLength-RequiredMemSize+EFI_PAGES_TO_SIZE(EDKII_DXE_MEM_SIZE_PAGES-1)), 8)) & IMRL_MASK) | IMR_EN), - (UINT32)((RShiftU64((PeiMemoryBaseAddress+PeiMemoryLength-EFI_PAGE_SIZE-1), 8)) & IMRH_MASK), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM), - (UINT32)(CPU_SNOOP + CPU0_NON_SMM) - ); - // // Enable IMR4 protection of eSRAM. // diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.h b/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.h index d2bcf5728e..2bb845f763 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.h +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.h @@ -29,8 +29,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define ACPI_RECLAIM_SIZE_PAGES 0x20 #define EDKII_DXE_MEM_SIZE_PAGES 0x20 -#define AP_STARTUP_VECTOR 0x00097000 - // // Maximum number of "Socket Sets", where a "Socket Set is a set of matching // DIMM's from the various channels @@ -185,12 +183,6 @@ SaveConfig ( IN MRCParams_t *MrcData ); -VOID -RetriveRequiredMemorySize ( - IN EFI_PEI_SERVICES **PeiServices, - OUT UINTN *Size - ); - EFI_STATUS GetMemoryMap ( IN EFI_PEI_SERVICES **PeiServices, @@ -225,8 +217,7 @@ BaseMemoryTest ( EFI_STATUS SetPlatformImrPolicy ( IN EFI_PHYSICAL_ADDRESS PeiMemoryBaseAddress, - IN UINT64 PeiMemoryLength, - IN UINTN RequiredMemSize + IN UINT64 PeiMemoryLength ); VOID diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c index 756cc4a7a3..0f71b1fda2 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c @@ -200,7 +200,8 @@ SetLanControllerMacAddr ( **/ EFI_STATUS EarlyPlatformConfigGpioExpanders ( - IN CONST EFI_PLATFORM_TYPE PlatformType + IN CONST EFI_PLATFORM_TYPE PlatformType, + EFI_BOOT_MODE BootMode ) { EFI_STATUS Status; @@ -266,6 +267,30 @@ EarlyPlatformConfigGpioExpanders ( GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2. 15 // P1-7. ); + + if (BootMode != BOOT_IN_RECOVERY_MODE) { + // + // Read state of Reset Button - EXP2.P1_7 + // This GPIO is pulled high when the button is not pressed + // This GPIO reads low when button is pressed + // + if (!PlatformPcal9555GpioGetState ( + GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2 + 15 // P1-7 + )) { + DEBUG ((EFI_D_INFO, " Force Recovery mode and reset\n")); + + // + // Set 'B_CFG_STICKY_RW_FORCE_RECOVERY' sticky bit so we know we need to do a recovery following warm reset + // + QNCAltPortWrite ( + QUARK_SCSS_SOC_UNIT_SB_PORT_ID, + QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW, + QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW) | B_CFG_STICKY_RW_FORCE_RECOVERY + ); + ResetWarm(); + } + } } // @@ -393,6 +418,40 @@ EarlyPlatformConfigGpioExpanders ( &Buffer ); ASSERT_EFI_ERROR (Status); + + if (BootMode != BOOT_IN_RECOVERY_MODE) { + // + // Read state of RESET_N_SHLD (GPORT5_BIT0) + // + Buffer[1] = 5; + Length = 1; + ReadLength = 1; + Status = I2cReadMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &ReadLength, + &Buffer[1] + ); + ASSERT_EFI_ERROR (Status); + + // + // Return the state of GPORT5_BIT0 + // + if ((Buffer[1] & BIT0) == 0) { + DEBUG ((EFI_D_INFO, " Force Recovery mode and reset\n")); + + // + // Set 'B_CFG_STICKY_RW_FORCE_RECOVERY' sticky bit so we know we need to do a recovery following warm reset + // + QNCAltPortWrite ( + QUARK_SCSS_SOC_UNIT_SB_PORT_ID, + QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW, + QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_CFG_STICKY_RW) | B_CFG_STICKY_RW_FORCE_RECOVERY + ); + ResetWarm(); + } + } } return EFI_SUCCESS; @@ -514,7 +573,7 @@ PeiInitPlatform ( // // DEBUG ((EFI_D_INFO, "EarlyPlatformConfigGpioExpanders ()\n")); - EarlyPlatformConfigGpioExpanders (PlatformType); + EarlyPlatformConfigGpioExpanders (PlatformType, BootMode); // // Now that all of the pre-permanent memory activities have @@ -791,8 +850,8 @@ EarlyPlatformInit ( // if (CheckForResetDueToErrors (TRUE)) { if(FeaturePcdGet (WaitIfResetDueToError)) { - DEBUG ((EFI_D_ERROR, "Press any key to continue.\n")); - PlatformDebugPortGetChar8 (); + DEBUG ((EFI_D_ERROR, "Wait 10 seconds.\n")); + MicroSecondDelay(10000000); } } diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf index 1de8efd33e..5fc85d352e 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf @@ -88,7 +88,6 @@ ResetSystemLib PrintLib TimerLib - RecoveryOemHookLib PcdLib IntelQNCLib ReportStatusCodeLib