Call S3Ready() whenever the first of the following occurs:
- a driver signals End-of-Dxe,
- a driver calls EFI_ACPI_S3_SAVE_PROTOCOL.S3Save().

S3Ready() already contains a static, function scope "latch" that causes it
to exit early when called for the second time or later.

(At the moment, the only platform in the edk2 tree that includes this
driver is Vlv2TbltDevicePkg. That platform does not signal End-of-Dxe
(yet).)

http://thread.gmane.org/gmane.comp.bios.tianocore.devel/16088/focus=16146
Suggested-by: Yao Jiewen <jiewen....@intel.com>
Cc: Yao Jiewen <jiewen....@intel.com>
Cc: Jeff Fan <jeff....@intel.com>
Cc: David Wei <david....@intel.com>
Cc: Tim He <tim...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---
 IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf |  1 +
 IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c      | 46 
++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git 
a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf 
b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
index c5dec05..e5fb92e 100644
--- a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
+++ b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
@@ -60,6 +60,7 @@ [Guids]
   ## SOMETIMES_CONSUMES ## Variable:L"AcpiGlobalVariable"
   ## SOMETIMES_PRODUCES ## Variable:L"AcpiGlobalVariable"
   gEfiAcpiVariableCompatiblityGuid
+  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES  ## Event
 
 [Protocols]
   gEfiAcpiS3SaveProtocolGuid                    ## PRODUCES
diff --git a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c 
b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c
index ac3e947..e0fa866 100644
--- a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c
+++ b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c
@@ -28,6 +28,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #include <Guid/AcpiVariableCompatibility.h>
 #include <Guid/AcpiS3Context.h>
 #include <Guid/Acpi.h>
+#include <Guid/EventGroup.h>
 #include <Protocol/AcpiS3Save.h>
 #include <IndustryStandard/Acpi.h>
 
@@ -550,6 +551,40 @@ S3Ready (
 }
 
 /**
+  Callback function executed when the EndOfDxe event group is signaled.
+
+  @param[in] Event    Event whose notification function is being invoked.
+  @param[in] Context  The pointer to the notification function's context, which
+                      is implementation-dependent.
+**/
+VOID
+EFIAPI
+OnEndOfDxe (
+  IN EFI_EVENT Event,
+  IN VOID      *Context
+  )
+{
+  EFI_STATUS Status;
+
+  //
+  // Our S3Ready() function ignores both of its parameters, and always
+  // succeeds.
+  //
+  Status = S3Ready (
+             NULL, // This
+             NULL  // LegacyMemoryAddress
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Close the event, deregistering the callback and freeing resources.
+  //
+  Status = gBS->CloseEvent (Event);
+  ASSERT_EFI_ERROR (Status);
+}
+
+
+/**
   The Driver Entry Point.
   
   The function is the driver Entry point which will produce AcpiS3SaveProtocol.
@@ -570,6 +605,7 @@ InstallAcpiS3Save (
   )
 {
   EFI_STATUS        Status;
+  EFI_EVENT         EndOfDxeEvent;
 
   if (!FeaturePcdGet(PcdPlatformCsmSupport)) {
     //
@@ -591,5 +627,15 @@ InstallAcpiS3Save (
                   &mS3Save
                   );
   ASSERT_EFI_ERROR (Status);
+
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  OnEndOfDxe,
+                  NULL, /* NotifyContext */
+                  &gEfiEndOfDxeEventGroupGuid,
+                  &EndOfDxeEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
   return Status;
 }
-- 
1.8.3.1



------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to