soc/amd/common/pi: Ensure AGESA S3 resume called before SMM lock

AGESA S3 restore needs to occur before SMM finalization/locking,
but it's a crapshoot as to which runs first since both use the same
BS_OS_RESUME/BS_ON_ENTRY boot state callback, and there's no way
to prioritize/force ordering.

To work around this, move the AGESA S3 resume call to the preceding
boot state (BS_OS_RESUME_CHECK) to ensure it runs first, and guard it
to ensure it only runs on the S3 resume path.

BUG=none
TEST=build/boot google/liara, verify S3 resume successful.

Change-Id: I765db140c6708a0b129f79fb7d3dc8a4ab3095bd
Signed-off-by: Matt DeVillier <matt.devillier@amd.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/76592
Reviewed-by: Fred Reitberger <reitbergerfred@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
This commit is contained in:
Matt DeVillier 2023-07-19 12:06:06 -05:00 committed by Felix Held
parent cecb7a75b8
commit 0a96a1ca06
1 changed files with 5 additions and 3 deletions

View File

@ -1,12 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
#include <acpi/acpi.h>
#include <bootstate.h> #include <bootstate.h>
#include <amdblocks/agesawrapper_call.h> #include <amdblocks/agesawrapper_call.h>
static void agesawrapper_s3finalrestore(void *unused) static void agesawrapper_s3finalrestore(void *unused)
{ {
do_agesawrapper(AMD_S3FINAL_RESTORE, "amds3finalrestore"); /* Needed since running on BS_OS_RESUME_CHECK to ensure execution before SMM lock */
if (acpi_is_wakeup_s3())
do_agesawrapper(AMD_S3FINAL_RESTORE, "amds3finalrestore");
} }
BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, BOOT_STATE_INIT_ENTRY(BS_OS_RESUME_CHECK, BS_ON_EXIT, agesawrapper_s3finalrestore, NULL);
agesawrapper_s3finalrestore, NULL);