summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
authorMatt DeVillier <matt.devillier@amd.corp-partner.google.com>2023-07-19 12:06:06 -0500
committerFelix Held <felix-coreboot@felixheld.de>2023-07-20 20:33:12 +0000
commit0a96a1ca0613e5d7b624e5e608aaeb679ef56dbf (patch)
treeaee6a098723d9b965efad1a93f83d01dc597ae24 /src/soc
parentcecb7a75b8b466a3f50700d098ebdbd3ff131a54 (diff)
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>
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/amd/common/pi/amd_resume_final.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/soc/amd/common/pi/amd_resume_final.c b/src/soc/amd/common/pi/amd_resume_final.c
index 380ffc8b1a..995ac4654d 100644
--- a/src/soc/amd/common/pi/amd_resume_final.c
+++ b/src/soc/amd/common/pi/amd_resume_final.c
@@ -1,12 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+#include <acpi/acpi.h>
#include <bootstate.h>
#include <amdblocks/agesawrapper_call.h>
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,
- agesawrapper_s3finalrestore, NULL);
+BOOT_STATE_INIT_ENTRY(BS_OS_RESUME_CHECK, BS_ON_EXIT, agesawrapper_s3finalrestore, NULL);