[coreboot-gerrit] Change in coreboot[master]: WIP soc/amd/common: Add S3 resume functions to wrapper

Marshall Dawson (Code Review) gerrit at coreboot.org
Tue Dec 5 18:08:56 CET 2017


Marshall Dawson has uploaded this change for review. ( https://review.coreboot.org/22730


Change subject: WIP soc/amd/common: Add S3 resume functions to wrapper
......................................................................

WIP soc/amd/common: Add S3 resume functions to wrapper

Change-Id: I5c6a9c1a679a1c4d3f7d1d3b41a32efd0a2c2c01
Signed-off-by: Marshall Dawson <marshalldawson3rd at gmail.com>
---
M src/soc/amd/common/agesawrapper.c
1 file changed, 146 insertions(+), 0 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/30/22730/1

diff --git a/src/soc/amd/common/agesawrapper.c b/src/soc/amd/common/agesawrapper.c
index 28c290b..87e1550 100644
--- a/src/soc/amd/common/agesawrapper.c
+++ b/src/soc/amd/common/agesawrapper.c
@@ -21,6 +21,7 @@
 #include <cpu/x86/mtrr.h>
 #include <BiosCallOuts.h>
 #include <string.h>
+#include "s3_resume.h"
 
 void __attribute__((weak)) SetMemParams(AMD_POST_PARAMS *PostParams) {}
 void __attribute__((weak)) OemPostParams(AMD_POST_PARAMS *PostParams) {}
@@ -382,6 +383,151 @@
 	return Status;
 }
 
+AGESA_STATUS agesawrapper_amdinitresume(void)
+{
+	AGESA_STATUS status;
+	AMD_INTERFACE_PARAMS AmdParamStruct;
+	AMD_RESUME_PARAMS *AmdResumeParamsPtr;
+	struct region nv_data;
+
+	if (!acpi_s3_resume_allowed())
+		return AGESA_UNSUPPORTED;
+
+	memset(&AmdParamStruct, 0, sizeof(AmdParamStruct));
+
+	AmdParamStruct.AgesaFunctionName = AMD_INIT_RESUME;
+	AmdParamStruct.AllocationMethod = PreMemHeap;
+	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
+	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
+	AmdParamStruct.StdHeader.Func = 0;
+	AmdParamStruct.StdHeader.ImageBasePtr = 0;
+	AmdCreateStruct (&AmdParamStruct);
+
+	AmdResumeParamsPtr = (AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr;
+
+	get_s3_info(S3_DATA_TYPE_NV, &nv_data);
+	AmdResumeParamsPtr->S3DataBlock.NvStorage = (void *)nv_data.offset;
+	AmdResumeParamsPtr->S3DataBlock.NvStorageSize = nv_data.size;
+
+	status = AmdInitResume ((AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr);
+
+	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
+	AmdReleaseStruct (&AmdParamStruct);
+
+	return status;
+}
+
+AGESA_STATUS agesawrapper_amds3laterestore(void)
+{
+	AGESA_STATUS Status;
+	AMD_INTERFACE_PARAMS AmdInterfaceParams;
+	AMD_S3LATE_PARAMS AmdS3LateParams;
+	AMD_S3LATE_PARAMS *AmdS3LateParamsPtr;
+	struct region vol_data;
+
+	if (!acpi_s3_resume_allowed())
+		return AGESA_UNSUPPORTED;
+
+	amd_initcpuio();
+
+	memset(&AmdS3LateParams, 0, sizeof(AmdS3LateParams));
+
+	AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
+	AmdInterfaceParams.AllocationMethod = ByHost;
+	AmdInterfaceParams.AgesaFunctionName = AMD_S3LATE_RESTORE;
+	AmdInterfaceParams.NewStructPtr = &AmdS3LateParams;
+	AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;
+	AmdS3LateParamsPtr = &AmdS3LateParams;
+	AmdInterfaceParams.NewStructSize = sizeof(AMD_S3LATE_PARAMS);
+
+	AmdCreateStruct(&AmdInterfaceParams);
+
+	get_s3_info(S3_DATA_TYPE_VOLATILE, &vol_data);
+	AmdS3LateParamsPtr->S3DataBlock.VolatileStorage = (void *)vol_data.offset;
+	AmdS3LateParamsPtr->S3DataBlock.VolatileStorageSize = vol_data.size;
+
+	Status = AmdS3LateRestore(AmdS3LateParamsPtr);
+	/* todo: debug status of UNSUPPORTED */
+	if (Status != AGESA_SUCCESS) {
+		agesawrapper_amdreadeventlog(AmdInterfaceParams.StdHeader.HeapStatus);
+		ASSERT(Status == AGESA_SUCCESS);
+	}
+
+	return Status;
+}
+
+AGESA_STATUS agesawrapper_fchs3earlyrestore(void)
+{
+	AGESA_STATUS status = AGESA_SUCCESS;
+	FCH_DATA_BLOCK FchParams;
+	AMD_CONFIG_PARAMS StdHeader;
+	struct cbmem_usage *amd_cbmem;
+
+	if (!acpi_s3_resume_allowed())
+		return AGESA_UNSUPPORTED;
+
+	amd_cbmem = (struct cbmem_usage *)GetHeapBase();
+	if (!amd_cbmem) {
+		printk(BIOS_ERR, "Error locating CBMEM_ID_RESUME_SCRATCH\n");
+		return AGESA_ERROR;
+	}
+
+	StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
+	StdHeader.HeapBasePtr = (uintptr_t)&amd_cbmem->heap_base;
+	StdHeader.AltImageBasePtr = 0;
+	StdHeader.CalloutPtr = &GetBiosCallout;
+	StdHeader.Func = 0;
+	StdHeader.ImageBasePtr = 0;
+
+	memset(&FchParams, 0, sizeof(FchParams));
+
+	FchParams.StdHeader = &StdHeader;
+// todo
+// see example in southbridge/amd/agesa/hudson/resume.c
+//	s3_resume_init_data(&FchParams);
+
+	FchInitS3EarlyRestore(&FchParams);
+
+	return status;
+}
+
+AGESA_STATUS agesawrapper_fchs3laterestore(void)
+{
+	AGESA_STATUS status = AGESA_SUCCESS;
+	AMD_CONFIG_PARAMS StdHeader;
+	FCH_DATA_BLOCK FchParams;
+	struct cbmem_usage *amd_cbmem;
+
+	if (!acpi_s3_resume_allowed())
+		return AGESA_UNSUPPORTED;
+
+	amd_cbmem = (struct cbmem_usage *)GetHeapBase();
+	if (!amd_cbmem) {
+		printk(BIOS_ERR, "Error locating CBMEM_ID_RESUME_SCRATCH\n");
+		return AGESA_ERROR;
+	}
+
+	StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
+	StdHeader.HeapBasePtr = (uintptr_t)&amd_cbmem->heap_base;
+	StdHeader.AltImageBasePtr = 0;
+	StdHeader.CalloutPtr = &GetBiosCallout;
+	StdHeader.Func = 0;
+	StdHeader.ImageBasePtr = 0;
+
+	memset(&FchParams, 0, sizeof(FchParams));
+
+	FchParams.StdHeader = &StdHeader;
+// todo
+// see example in southbridge/amd/agesa/hudson/resume.c
+//	s3_resume_init_data(&FchParams);
+	FchInitS3LateRestore(&FchParams);
+
+	// todo: still need to reload interrupt values?  native agesa doesn't
+	//       but old PI code used to.
+
+	return status;
+}
+
 AGESA_STATUS agesawrapper_amdreadeventlog (UINT8 HeapStatus)
 {
 	AGESA_STATUS Status;

-- 
To view, visit https://review.coreboot.org/22730
To unsubscribe, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5c6a9c1a679a1c4d3f7d1d3b41a32efd0a2c2c01
Gerrit-Change-Number: 22730
Gerrit-PatchSet: 1
Gerrit-Owner: Marshall Dawson <marshalldawson3rd at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20171205/33c85a41/attachment-0001.html>


More information about the coreboot-gerrit mailing list