<p>Marshall Dawson has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/22730">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP soc/amd/common: Add S3 resume functions to wrapper<br><br>Change-Id: I5c6a9c1a679a1c4d3f7d1d3b41a32efd0a2c2c01<br>Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com><br>---<br>M src/soc/amd/common/agesawrapper.c<br>1 file changed, 146 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/30/22730/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/soc/amd/common/agesawrapper.c b/src/soc/amd/common/agesawrapper.c<br>index 28c290b..87e1550 100644<br>--- a/src/soc/amd/common/agesawrapper.c<br>+++ b/src/soc/amd/common/agesawrapper.c<br>@@ -21,6 +21,7 @@<br> #include <cpu/x86/mtrr.h><br> #include <BiosCallOuts.h><br> #include <string.h><br>+#include "s3_resume.h"<br> <br> void __attribute__((weak)) SetMemParams(AMD_POST_PARAMS *PostParams) {}<br> void __attribute__((weak)) OemPostParams(AMD_POST_PARAMS *PostParams) {}<br>@@ -382,6 +383,151 @@<br>        return Status;<br> }<br> <br>+AGESA_STATUS agesawrapper_amdinitresume(void)<br>+{<br>+    AGESA_STATUS status;<br>+ AMD_INTERFACE_PARAMS AmdParamStruct;<br>+ AMD_RESUME_PARAMS *AmdResumeParamsPtr;<br>+       struct region nv_data;<br>+<br>+    if (!acpi_s3_resume_allowed())<br>+               return AGESA_UNSUPPORTED;<br>+<br>+ memset(&AmdParamStruct, 0, sizeof(AmdParamStruct));<br>+<br>+   AmdParamStruct.AgesaFunctionName = AMD_INIT_RESUME;<br>+  AmdParamStruct.AllocationMethod = PreMemHeap;<br>+        AmdParamStruct.StdHeader.AltImageBasePtr = 0;<br>+        AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;<br>+   AmdParamStruct.StdHeader.Func = 0;<br>+   AmdParamStruct.StdHeader.ImageBasePtr = 0;<br>+   AmdCreateStruct (&AmdParamStruct);<br>+<br>+    AmdResumeParamsPtr = (AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr;<br>+<br>+    get_s3_info(S3_DATA_TYPE_NV, &nv_data);<br>+  AmdResumeParamsPtr->S3DataBlock.NvStorage = (void *)nv_data.offset;<br>+       AmdResumeParamsPtr->S3DataBlock.NvStorageSize = nv_data.size;<br>+<br>+  status = AmdInitResume ((AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr);<br>+<br>+        if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);<br>+      AmdReleaseStruct (&AmdParamStruct);<br>+<br>+   return status;<br>+}<br>+<br>+AGESA_STATUS agesawrapper_amds3laterestore(void)<br>+{<br>+ AGESA_STATUS Status;<br>+ AMD_INTERFACE_PARAMS AmdInterfaceParams;<br>+     AMD_S3LATE_PARAMS AmdS3LateParams;<br>+   AMD_S3LATE_PARAMS *AmdS3LateParamsPtr;<br>+       struct region vol_data;<br>+<br>+   if (!acpi_s3_resume_allowed())<br>+               return AGESA_UNSUPPORTED;<br>+<br>+ amd_initcpuio();<br>+<br>+  memset(&AmdS3LateParams, 0, sizeof(AmdS3LateParams));<br>+<br>+ AmdInterfaceParams.StdHeader.ImageBasePtr = 0;<br>+       AmdInterfaceParams.AllocationMethod = ByHost;<br>+        AmdInterfaceParams.AgesaFunctionName = AMD_S3LATE_RESTORE;<br>+   AmdInterfaceParams.NewStructPtr = &AmdS3LateParams;<br>+      AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;<br>+       AmdS3LateParamsPtr = &AmdS3LateParams;<br>+   AmdInterfaceParams.NewStructSize = sizeof(AMD_S3LATE_PARAMS);<br>+<br>+     AmdCreateStruct(&AmdInterfaceParams);<br>+<br>+ get_s3_info(S3_DATA_TYPE_VOLATILE, &vol_data);<br>+   AmdS3LateParamsPtr->S3DataBlock.VolatileStorage = (void *)vol_data.offset;<br>+        AmdS3LateParamsPtr->S3DataBlock.VolatileStorageSize = vol_data.size;<br>+<br>+   Status = AmdS3LateRestore(AmdS3LateParamsPtr);<br>+       /* todo: debug status of UNSUPPORTED */<br>+      if (Status != AGESA_SUCCESS) {<br>+               agesawrapper_amdreadeventlog(AmdInterfaceParams.StdHeader.HeapStatus);<br>+               ASSERT(Status == AGESA_SUCCESS);<br>+     }<br>+<br>+ return Status;<br>+}<br>+<br>+AGESA_STATUS agesawrapper_fchs3earlyrestore(void)<br>+{<br>+        AGESA_STATUS status = AGESA_SUCCESS;<br>+ FCH_DATA_BLOCK FchParams;<br>+    AMD_CONFIG_PARAMS StdHeader;<br>+ struct cbmem_usage *amd_cbmem;<br>+<br>+    if (!acpi_s3_resume_allowed())<br>+               return AGESA_UNSUPPORTED;<br>+<br>+ amd_cbmem = (struct cbmem_usage *)GetHeapBase();<br>+     if (!amd_cbmem) {<br>+            printk(BIOS_ERR, "Error locating CBMEM_ID_RESUME_SCRATCH\n");<br>+              return AGESA_ERROR;<br>+  }<br>+<br>+ StdHeader.HeapStatus = HEAP_SYSTEM_MEM;<br>+      StdHeader.HeapBasePtr = (uintptr_t)&amd_cbmem->heap_base;<br>+     StdHeader.AltImageBasePtr = 0;<br>+       StdHeader.CalloutPtr = &GetBiosCallout;<br>+  StdHeader.Func = 0;<br>+  StdHeader.ImageBasePtr = 0;<br>+<br>+       memset(&FchParams, 0, sizeof(FchParams));<br>+<br>+     FchParams.StdHeader = &StdHeader;<br>+// todo<br>+// see example in southbridge/amd/agesa/hudson/resume.c<br>+//  s3_resume_init_data(&FchParams);<br>+<br>+      FchInitS3EarlyRestore(&FchParams);<br>+<br>+    return status;<br>+}<br>+<br>+AGESA_STATUS agesawrapper_fchs3laterestore(void)<br>+{<br>+ AGESA_STATUS status = AGESA_SUCCESS;<br>+ AMD_CONFIG_PARAMS StdHeader;<br>+ FCH_DATA_BLOCK FchParams;<br>+    struct cbmem_usage *amd_cbmem;<br>+<br>+    if (!acpi_s3_resume_allowed())<br>+               return AGESA_UNSUPPORTED;<br>+<br>+ amd_cbmem = (struct cbmem_usage *)GetHeapBase();<br>+     if (!amd_cbmem) {<br>+            printk(BIOS_ERR, "Error locating CBMEM_ID_RESUME_SCRATCH\n");<br>+              return AGESA_ERROR;<br>+  }<br>+<br>+ StdHeader.HeapStatus = HEAP_SYSTEM_MEM;<br>+      StdHeader.HeapBasePtr = (uintptr_t)&amd_cbmem->heap_base;<br>+     StdHeader.AltImageBasePtr = 0;<br>+       StdHeader.CalloutPtr = &GetBiosCallout;<br>+  StdHeader.Func = 0;<br>+  StdHeader.ImageBasePtr = 0;<br>+<br>+       memset(&FchParams, 0, sizeof(FchParams));<br>+<br>+     FchParams.StdHeader = &StdHeader;<br>+// todo<br>+// see example in southbridge/amd/agesa/hudson/resume.c<br>+//  s3_resume_init_data(&FchParams);<br>+ FchInitS3LateRestore(&FchParams);<br>+<br>+     // todo: still need to reload interrupt values?  native agesa doesn't<br>+    //       but old PI code used to.<br>+<br>+ return status;<br>+}<br>+<br> AGESA_STATUS agesawrapper_amdreadeventlog (UINT8 HeapStatus)<br> {<br>      AGESA_STATUS Status;<br></pre><p>To view, visit <a href="https://review.coreboot.org/22730">change 22730</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/22730"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I5c6a9c1a679a1c4d3f7d1d3b41a32efd0a2c2c01 </div>
<div style="display:none"> Gerrit-Change-Number: 22730 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Marshall Dawson <marshalldawson3rd@gmail.com> </div>