IntelFrameworkModulePkg: AcpiS3SaveDxe: call S3Ready() at End-of-Dxe

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.yao@intel.com>
Cc: Yao Jiewen <jiewen.yao@intel.com>
Cc: Jeff Fan <jeff.fan@intel.com>
Cc: David Wei <david.wei@intel.com>
Cc: Tim He <tim.he@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17805 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2015-07-02 06:36:29 +00:00 committed by abiesheuvel
parent dbaeca276b
commit e50c79f7d5
2 changed files with 47 additions and 0 deletions

View File

@ -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>
@ -549,6 +550,40 @@ S3Ready (
return EFI_SUCCESS;
}
/**
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.
@ -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;
}

View File

@ -60,6 +60,7 @@
## SOMETIMES_CONSUMES ## Variable:L"AcpiGlobalVariable"
## SOMETIMES_PRODUCES ## Variable:L"AcpiGlobalVariable"
gEfiAcpiVariableCompatiblityGuid
gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event
[Protocols]
gEfiAcpiS3SaveProtocolGuid ## PRODUCES