diff options
author | Marshall Dawson <marshalldawson3rd@gmail.com> | 2017-12-04 15:28:10 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2018-02-12 17:01:57 +0000 |
commit | c2f6da00f458f03dd19ee6256e959da4c26c987f (patch) | |
tree | 3e17982589695e77ac6d4edbe3b6a4f5fc17c7a3 /src | |
parent | e71745bdf92653271d335fe146eb1fac7c19dae9 (diff) | |
download | coreboot-c2f6da00f458f03dd19ee6256e959da4c26c987f.tar.xz |
soc/amd/common: Add S3 resume functions to wrapper
Add new functions that can execute InitRtb, InitResume, LateResume,
and FinalResume.
Note that the name AmdInitRtb supersedes the deprecated AmdS3Save.
TEST=Suspend/Resume Kahlee with complete S3 patch stack
BUG=b:69614064
Change-Id: I5c6a9c1a679a1c4d3f7d1d3b41a32efd0a2c2c01
Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-on: https://review.coreboot.org/22730
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/soc/amd/common/block/include/amdblocks/agesawrapper.h | 3 | ||||
-rw-r--r-- | src/soc/amd/common/block/pi/agesawrapper.c | 137 | ||||
-rw-r--r-- | src/soc/amd/common/block/pi/amd_late_init.c | 2 |
3 files changed, 140 insertions, 2 deletions
diff --git a/src/soc/amd/common/block/include/amdblocks/agesawrapper.h b/src/soc/amd/common/block/include/amdblocks/agesawrapper.h index 5c2f4eb9dd..44ddba2018 100644 --- a/src/soc/amd/common/block/include/amdblocks/agesawrapper.h +++ b/src/soc/amd/common/block/include/amdblocks/agesawrapper.h @@ -43,9 +43,10 @@ AGESA_STATUS agesawrapper_amdinitmid(void); void *agesawrapper_getlateinitptr(int pick); AGESA_STATUS agesawrapper_amdlaterunaptask(UINT32 Func, UINTN Data, void *ConfigPtr); -AGESA_STATUS agesawrapper_amdS3Save(void); +AGESA_STATUS agesawrapper_amdinitrtb(void); AGESA_STATUS agesawrapper_amdinitresume(void); AGESA_STATUS agesawrapper_amds3laterestore(void); +AGESA_STATUS agesawrapper_amds3finalrestore(void); AGESA_STATUS agesawrapper_fchs3earlyrestore(void); AGESA_STATUS agesawrapper_fchs3laterestore(void); diff --git a/src/soc/amd/common/block/pi/agesawrapper.c b/src/soc/amd/common/block/pi/agesawrapper.c index 66928fba25..dca72222ce 100644 --- a/src/soc/amd/common/block/pi/agesawrapper.c +++ b/src/soc/amd/common/block/pi/agesawrapper.c @@ -23,6 +23,7 @@ #include <rmodule.h> #include <string.h> #include <timestamp.h> +#include <amdblocks/s3_resume.h> #include <amdblocks/agesawrapper.h> #include <amdblocks/BiosCallOuts.h> @@ -374,6 +375,142 @@ AGESA_STATUS agesawrapper_amdlaterunaptask(UINT32 Func, UINTN Data, return Status; } +AGESA_STATUS agesawrapper_amdinitrtb(void) +{ + AGESA_STATUS Status; + AMD_INTERFACE_PARAMS AmdParamStruct = { + .AgesaFunctionName = AMD_INIT_RTB, + .AllocationMethod = PostMemDram, + .StdHeader.CalloutPtr = &GetBiosCallout, + }; + AMD_RTB_PARAMS *RtbParams; + + create_struct(&AmdParamStruct); + + RtbParams = (AMD_RTB_PARAMS *)AmdParamStruct.NewStructPtr; + + timestamp_add_now(TS_AGESA_INIT_RTB_START); + Status = AmdInitRtb(RtbParams); + timestamp_add_now(TS_AGESA_INIT_RTB_DONE); + + if (Status != AGESA_SUCCESS) { + agesawrapper_readeventlog(AmdParamStruct.StdHeader.HeapStatus); + ASSERT(Status == AGESA_SUCCESS); + } + + if (save_s3_info(RtbParams->S3DataBlock.NvStorage, + RtbParams->S3DataBlock.NvStorageSize, + RtbParams->S3DataBlock.VolatileStorage, + RtbParams->S3DataBlock.VolatileStorageSize)) + printk(BIOS_ERR, "S3 data not saved, resuming impossible\n"); + + AmdReleaseStruct(&AmdParamStruct); + + return Status; +} + +AGESA_STATUS agesawrapper_amdinitresume(void) +{ + AGESA_STATUS status; + AMD_INTERFACE_PARAMS AmdParamStruct = { + .AgesaFunctionName = AMD_INIT_RESUME, + .AllocationMethod = PreMemHeap, + .StdHeader.CalloutPtr = &GetBiosCallout, + }; + AMD_RESUME_PARAMS *InitResumeParams; + size_t nv_size; + + if (!acpi_s3_resume_allowed()) + return AGESA_UNSUPPORTED; + + create_struct(&AmdParamStruct); + + InitResumeParams = (AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr; + + get_s3nv_info(&InitResumeParams->S3DataBlock.NvStorage, &nv_size); + InitResumeParams->S3DataBlock.NvStorageSize = nv_size; + + timestamp_add_now(TS_AGESA_INIT_RESUME_START); + status = AmdInitResume(InitResumeParams); + timestamp_add_now(TS_AGESA_INIT_RESUME_DONE); + + if (status != AGESA_SUCCESS) + agesawrapper_readeventlog(AmdParamStruct.StdHeader.HeapStatus); + AmdReleaseStruct(&AmdParamStruct); + + return status; +} + +AGESA_STATUS agesawrapper_amds3laterestore(void) +{ + AGESA_STATUS Status; + AMD_INTERFACE_PARAMS AmdParamStruct = { + .AgesaFunctionName = AMD_S3LATE_RESTORE, + .AllocationMethod = ByHost, + .StdHeader.CalloutPtr = &GetBiosCallout, + }; + AMD_S3LATE_PARAMS *S3LateParams; + size_t vol_size; + + if (!acpi_s3_resume_allowed()) + return AGESA_UNSUPPORTED; + + amd_initcpuio(); + + create_struct(&AmdParamStruct); + + S3LateParams = (AMD_S3LATE_PARAMS *)AmdParamStruct.NewStructPtr; + + get_s3vol_info(&S3LateParams->S3DataBlock.VolatileStorage, &vol_size); + S3LateParams->S3DataBlock.VolatileStorageSize = vol_size; + + timestamp_add_now(TS_AGESA_S3_LATE_START); + Status = AmdS3LateRestore(S3LateParams); + timestamp_add_now(TS_AGESA_S3_LATE_DONE); + + if (Status != AGESA_SUCCESS) { + agesawrapper_readeventlog(AmdParamStruct.StdHeader.HeapStatus); + ASSERT(Status == AGESA_SUCCESS); + } + AmdReleaseStruct(&AmdParamStruct); + + return Status; +} + +AGESA_STATUS agesawrapper_amds3finalrestore(void) +{ + AGESA_STATUS Status; + AMD_INTERFACE_PARAMS AmdParamStruct = { + .AgesaFunctionName = AMD_S3FINAL_RESTORE, + .AllocationMethod = ByHost, + .StdHeader.CalloutPtr = &GetBiosCallout, + }; + AMD_S3FINAL_PARAMS *S3FinalParams; + size_t vol_size; + + if (!acpi_s3_resume_allowed()) + return AGESA_UNSUPPORTED; + + create_struct(&AmdParamStruct); + + S3FinalParams = (AMD_S3FINAL_PARAMS *)AmdParamStruct.NewStructPtr; + + get_s3vol_info(&S3FinalParams->S3DataBlock.VolatileStorage, &vol_size); + S3FinalParams->S3DataBlock.VolatileStorageSize = vol_size; + + timestamp_add_now(TS_AGESA_S3_FINAL_START); + Status = AmdS3FinalRestore(S3FinalParams); + timestamp_add_now(TS_AGESA_S3_FINAL_DONE); + + if (Status != AGESA_SUCCESS) { + agesawrapper_readeventlog(AmdParamStruct.StdHeader.HeapStatus); + ASSERT(Status == AGESA_SUCCESS); + } + AmdReleaseStruct(&AmdParamStruct); + + return Status; +} + static int agesa_locate_file(const char *name, struct region_device *rdev, uint32_t type) { diff --git a/src/soc/amd/common/block/pi/amd_late_init.c b/src/soc/amd/common/block/pi/amd_late_init.c index 3eb3674c09..3695ce4f51 100644 --- a/src/soc/amd/common/block/pi/amd_late_init.c +++ b/src/soc/amd/common/block/pi/amd_late_init.c @@ -33,7 +33,7 @@ static void agesawrapper_post_device(void *unused) if (!acpi_s3_resume_allowed()) return; - do_agesawrapper(agesawrapper_amdS3Save, "amdS3Save"); + do_agesawrapper(agesawrapper_amdinitrtb, "amdinitrtb"); } BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_EXIT, |