EFI_STATUS EFIAPI CapsulePpiNotifyCallback ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; EFI_BOOT_MODE BootMode; PEI_CAPSULE_PPI *Capsule; Status = (*PeiServices)->GetBootMode((const EFI_PEI_SERVICES **)PeiServices, &BootMode); ASSERT_EFI_ERROR (Status); if (BootMode == BOOT_ON_S3_RESUME) { // // Determine if we're in capsule update mode // Status = (*PeiServices)->LocatePpi ((const EFI_PEI_SERVICES **)PeiServices, &gPeiCapsulePpiGuid, 0, NULL, (VOID **)&Capsule ); if (Status == EFI_SUCCESS) { if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) { BootMode = BOOT_ON_FLASH_UPDATE; Status = (*PeiServices)->SetBootMode((const EFI_PEI_SERVICES **)PeiServices, BootMode); ASSERT_EFI_ERROR (Status); } } } return Status; }
EFI_STATUS UpdateBootMode ( IN CONST EFI_PEI_SERVICES **PeiServices, IN OUT EFI_PLATFORM_INFO_HOB *PlatformInfoHob ) { EFI_STATUS Status; EFI_BOOT_MODE BootMode; UINT16 SleepType; CHAR16 *strBootMode; PEI_CAPSULE_PPI *Capsule; EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable; SYSTEM_CONFIGURATION SystemConfiguration; UINTN VarSize; volatile UINT32 GpioValue; BOOLEAN IsFirstBoot; UINT32 Data32; Status = (*PeiServices)->GetBootMode( PeiServices, &BootMode ); ASSERT_EFI_ERROR (Status); if (BootMode == BOOT_IN_RECOVERY_MODE){ return Status; } GetWakeupEventAndSaveToHob (PeiServices); // // Let's assume things are OK if not told otherwise // BootMode = BOOT_WITH_FULL_CONFIGURATION; // // When this boot is WDT reset, the system needs booting with CrashDump function eanbled. // Data32 = IoRead32 (ACPI_BASE_ADDRESS + R_PCH_TCO_STS); // // Check Power Button, click the power button, the system will boot in fast boot mode, // if it is pressed and hold for a second, it will boot in FullConfiguration/setup mode. // GpioValue = MmioRead32 (IO_BASE_ADDRESS + GPIO_SSUS_OFFSET + PMU_PWRBTN_B_OFFSET); // The value of GPIOS_16 (PMU_PWRBTN_B) if (((GpioValue & BIT0) != 0)&&((Data32 & B_PCH_TCO_STS_SECOND_TO) != B_PCH_TCO_STS_SECOND_TO)){ IsFirstBoot = PcdGetBool(PcdBootState); if (!IsFirstBoot){ VarSize = sizeof (SYSTEM_CONFIGURATION); ZeroMem (&SystemConfiguration, sizeof (SYSTEM_CONFIGURATION)); Status = (*PeiServices)->LocatePpi ( PeiServices, &gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (void **)&Variable ); ASSERT_EFI_ERROR (Status); // // Use normal setup default from NVRAM variable, // the Platform Mode (manufacturing/safe/normal) is handle in PeiGetVariable. // VarSize = sizeof(SYSTEM_CONFIGURATION); Status = Variable->GetVariable ( Variable, L"Setup", &gEfiSetupVariableGuid, NULL, &VarSize, &SystemConfiguration ); if (SystemConfiguration.FastBoot == 1) { BootMode = BOOT_WITH_MINIMAL_CONFIGURATION; } } } // // Check if we need to boot in forced recovery mode // if (CheckIfRecoveryMode(PeiServices, PlatformInfoHob)) { BootMode = BOOT_IN_RECOVERY_MODE; } if (BootMode == BOOT_IN_RECOVERY_MODE) { Status = (*PeiServices)->InstallPpi ( PeiServices, &mPpiListRecoveryBootMode ); ASSERT_EFI_ERROR (Status); } else { if (GetSleepTypeAfterWakeup (PeiServices, &SleepType)) { switch (SleepType) { case V_PCH_ACPI_PM1_CNT_S3: BootMode = BOOT_ON_S3_RESUME; // // Determine if we're in capsule update mode // Status = (*PeiServices)->LocatePpi ( PeiServices, &gPeiCapsulePpiGuid, 0, NULL, (void **)&Capsule ); if (Status == EFI_SUCCESS) { if (Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES**)PeiServices) == EFI_SUCCESS) { BootMode = BOOT_ON_FLASH_UPDATE; } } break; case V_PCH_ACPI_PM1_CNT_S4: BootMode = BOOT_ON_S4_RESUME; break; case V_PCH_ACPI_PM1_CNT_S5: BootMode = BOOT_ON_S5_RESUME; break; } // switch (SleepType) } // // Check for Safe Mode // } switch (BootMode) { case BOOT_WITH_FULL_CONFIGURATION: strBootMode = L"BOOT_WITH_FULL_CONFIGURATION"; break; case BOOT_WITH_MINIMAL_CONFIGURATION: strBootMode = L"BOOT_WITH_MINIMAL_CONFIGURATION"; break; case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: strBootMode = L"BOOT_ASSUMING_NO_CONFIGURATION_CHANGES"; break; case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: strBootMode = L"BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS"; break; case BOOT_WITH_DEFAULT_SETTINGS: strBootMode = L"BOOT_WITH_DEFAULT_SETTINGS"; break; case BOOT_ON_S4_RESUME: strBootMode = L"BOOT_ON_S4_RESUME"; break; case BOOT_ON_S5_RESUME: strBootMode = L"BOOT_ON_S5_RESUME"; break; case BOOT_ON_S2_RESUME: strBootMode = L"BOOT_ON_S2_RESUME"; break; case BOOT_ON_S3_RESUME: strBootMode = L"BOOT_ON_S3_RESUME"; break; case BOOT_ON_FLASH_UPDATE: strBootMode = L"BOOT_ON_FLASH_UPDATE"; break; case BOOT_IN_RECOVERY_MODE: strBootMode = L"BOOT_IN_RECOVERY_MODE"; break; default: strBootMode = L"Unknown boot mode"; } // switch (BootMode) DEBUG ((EFI_D_ERROR, "Setting BootMode to %s\n", strBootMode)); Status = (*PeiServices)->SetBootMode( PeiServices, BootMode ); ASSERT_EFI_ERROR (Status); return Status; }