summaryrefslogtreecommitdiff
path: root/ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c
diff options
context:
space:
mode:
Diffstat (limited to 'ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c')
-rw-r--r--ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c b/ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c
new file mode 100644
index 0000000..87c0818
--- /dev/null
+++ b/ReferenceCode/ME/ActiveManagement/StartWatchDog/Pei/StartWatchDog.c
@@ -0,0 +1,96 @@
+/** @file
+ Start Watchdog timer in PEI phase
+
+@copyright
+ Copyright (c) 1999 - 2012 Intel Corporation. All rights
+ reserved This software and associated documentation (if any)
+ is furnished under a license and may only be used or copied in
+ accordance with the terms of the license. Except as permitted
+ by such license, no part of this software or documentation may
+ be reproduced, stored in a retrieval system, or transmitted in
+ any form or by any means without the express written consent
+ of Intel Corporation.
+
+ This file contains an 'Intel Peripheral Driver' and uniquely
+ identified as "Intel Reference Module" and is
+ licensed for Intel CPUs and chipsets under the terms of your
+ license agreement with Intel or your vendor. This file may
+ be modified by the user, subject to additional terms of the
+ license agreement
+**/
+
+//
+// External include files do NOT need to be explicitly specified in real EDKII
+// environment
+//
+#if !defined(EDK_RELEASE_VERSION) || (EDK_RELEASE_VERSION < 0x00020000)
+#include "EdkIIGluePeim.h"
+#include "StartWatchDog.h"
+#include "MeLibPei.h"
+#endif
+
+/**
+ Perform the platform spefific initializations.
+
+ @param[in] FfsHeader FFS file header pointer of this driver.
+ @param[in] PeiServices General purpose services available to every PEIM.
+
+ @retval EFI_SUCCESS if the interface could be successfully installed.
+**/
+EFI_STATUS
+EFIAPI
+PeiInitStartWatchDog (
+ IN EFI_FFS_FILE_HEADER *FfsHeader,
+ IN EFI_PEI_SERVICES **PeiServices
+ )
+{
+ EFI_STATUS Status;
+ EFI_BOOT_MODE BootMode;
+ PEI_HECI_PPI *HeciPpi;
+ UINT32 HeciMemBar;
+ UINT16 WaitTimerBios;
+ UINT32 MeStatus;
+
+ Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode);
+ ASSERT_EFI_ERROR (Status);
+
+ if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {
+ return EFI_SUCCESS;
+ }
+
+ if (PeiAmtWatchDog (PeiServices)) {
+ Status = PeiServicesLocatePpi (
+ &gPeiHeciPpiGuid, // GUID
+ 0, // INSTANCE
+ NULL, // EFI_PEI_PPI_DESCRIPTOR
+ (VOID **) &HeciPpi // PPI
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ Status = HeciPpi->InitializeHeci (PeiServices, HeciPpi, &HeciMemBar);
+ if (!EFI_ERROR (Status)) {
+ ///
+ /// Get ME Status
+ ///
+ Status = HeciPpi->GetMeStatus (PeiServices, &MeStatus);
+ ASSERT_EFI_ERROR (Status);
+
+ ///
+ /// If ME is ready, send AsfStartWatchDog message
+ ///
+ if (ME_STATUS_ME_STATE_ONLY (MeStatus) == ME_READY) {
+ WaitTimerBios = PeiAmtWatchTimerBiosGet (PeiServices);
+
+ Status = PeiHeciAsfStartWatchDog (
+ PeiServices,
+ HeciPpi,
+ HeciMemBar,
+ WaitTimerBios
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+ }
+ }
+
+ return Status;
+}