blob: beae4baa9c729ffb47ae0a8971fcd96212ed0e3c [file] [log] [blame]
Angel Ponsae593872020-04-04 18:50:57 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Marc Jones1587dc82017-05-15 18:55:11 -06002
Elyes HAOUAS20eaef02019-03-29 17:45:28 +01003#include <console/console.h>
Martin Rothbc5c3e72017-12-09 10:40:45 -07004#include <timestamp.h>
Michał Żygowskif65c1e42019-12-01 18:14:39 +01005#include <amdblocks/biosram.h>
Marshall Dawsonc2f6da02017-12-04 15:28:10 -07006#include <amdblocks/s3_resume.h>
Marshall Dawson857a3872017-12-13 20:01:59 -07007#include <amdblocks/agesawrapper.h>
8#include <amdblocks/BiosCallOuts.h>
Felix Held78b0e7f2021-06-11 18:00:02 +02009#include <amdblocks/ioapic.h>
Martin Roth50f2e4c2018-10-29 11:16:53 -060010#include <soc/pci_devs.h>
Richard Spiegeldd9b1d12018-09-20 14:50:11 -070011#include <soc/northbridge.h>
12#include <soc/cpu.h>
Elyes HAOUASb0cda4b2022-01-01 19:06:22 +010013#include <string.h>
Marc Jones1587dc82017-05-15 18:55:11 -060014
Aaron Durbin64031672018-04-21 14:45:32 -060015void __weak SetMemParams(AMD_POST_PARAMS *PostParams) {}
16void __weak OemPostParams(AMD_POST_PARAMS *PostParams) {}
Marc Jones1587dc82017-05-15 18:55:11 -060017
Marc Jones1587dc82017-05-15 18:55:11 -060018/* ACPI table pointers returned by AmdInitLate */
Aaron Durbin8dd40062017-11-03 11:50:14 -060019static void *DmiTable;
20static void *AcpiPstate;
21static void *AcpiSrat;
22static void *AcpiSlit;
Marc Jones1587dc82017-05-15 18:55:11 -060023
Aaron Durbin8dd40062017-11-03 11:50:14 -060024static void *AcpiWheaMce;
25static void *AcpiWheaCmc;
26static void *AcpiAlib;
27static void *AcpiIvrs;
28static void *AcpiCrat;
Marc Jones1587dc82017-05-15 18:55:11 -060029
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +030030static AGESA_STATUS module_dispatch(AGESA_STRUCT_NAME func,
31 AMD_CONFIG_PARAMS *StdHeader)
32{
33 MODULE_ENTRY dispatcher = agesa_get_dispatcher();
34
35 if (!dispatcher)
36 return AGESA_UNSUPPORTED;
37
38 StdHeader->Func = func;
39 return dispatcher(StdHeader);
40}
41
42static AGESA_STATUS amd_dispatch(void *Params)
43{
44 AMD_CONFIG_PARAMS *StdHeader = Params;
45 return module_dispatch(StdHeader->Func, StdHeader);
46}
47
48AGESA_STATUS amd_late_run_ap_task(AP_EXE_PARAMS *ApExeParams)
49{
50 AMD_CONFIG_PARAMS *StdHeader = (void *)ApExeParams;
51 return module_dispatch(AMD_LATE_RUN_AP_TASK, StdHeader);
52}
53
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030054static AGESA_STATUS amd_create_struct(AMD_INTERFACE_PARAMS *aip,
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030055 AGESA_STRUCT_NAME func, void *buf, size_t len)
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070056{
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030057 AGESA_STATUS status;
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +030058
Kyösti Mälkki4cdd2f82018-06-14 06:49:38 +030059 /* Should clone entire StdHeader here. */
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030060 memset(aip, 0, sizeof(*aip));
61 aip->StdHeader.CalloutPtr = &GetBiosCallout;
Kyösti Mälkki4cdd2f82018-06-14 06:49:38 +030062
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030063 /* If we provide the buffer, API expects it to have
64 StdHeader already filled. */
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030065 if (buf != NULL && len >= sizeof(aip->StdHeader)) {
66 memcpy(buf, &aip->StdHeader, sizeof(aip->StdHeader));
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030067 aip->AllocationMethod = ByHost;
68 aip->NewStructPtr = buf;
69 aip->NewStructSize = len;
70 } else {
Kyösti Mälkki11cac782022-04-07 07:16:48 +030071 if (ENV_RAMINIT)
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030072 aip->AllocationMethod = PreMemHeap;
73 if (ENV_RAMSTAGE)
74 aip->AllocationMethod = PostMemDram;
75 }
76
77 aip->AgesaFunctionName = func;
78 status = module_dispatch(AMD_CREATE_STRUCT, &aip->StdHeader);
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070079
Kyösti Mälkki2fc1a372018-06-14 06:57:05 +030080 if (status != AGESA_SUCCESS) {
Julius Wernere9665952022-01-21 17:06:20 -080081 printk(BIOS_ERR, "AmdCreateStruct() for 0x%x returned 0x%x. "
Kyösti Mälkki2fc1a372018-06-14 06:57:05 +030082 "Proper system initialization may not be possible.\n",
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030083 aip->AgesaFunctionName, status);
Kyösti Mälkki2fc1a372018-06-14 06:57:05 +030084 }
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070085
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030086 if (!aip->NewStructPtr)
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070087 die("No AGESA structure created");
88
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030089 return status;
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070090}
91
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030092static AGESA_STATUS amd_release_struct(AMD_INTERFACE_PARAMS *aip)
93{
94 return module_dispatch(AMD_RELEASE_STRUCT, &aip->StdHeader);
95}
96
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030097static AGESA_STATUS amd_init_reset(AMD_RESET_PARAMS *ResetParams)
Marc Jones1587dc82017-05-15 18:55:11 -060098{
99 AGESA_STATUS status;
Kyösti Mälkki108fb8a2018-06-14 06:57:05 +0300100
Kyösti Mälkki108fb8a2018-06-14 06:57:05 +0300101 SetFchResetParams(&ResetParams->FchInterface);
Marc Jones1587dc82017-05-15 18:55:11 -0600102
Martin Rothbc5c3e72017-12-09 10:40:45 -0700103 timestamp_add_now(TS_AGESA_INIT_RESET_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300104 status = amd_dispatch(ResetParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100105 timestamp_add_now(TS_AGESA_INIT_RESET_END);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700106
Marc Jones1587dc82017-05-15 18:55:11 -0600107 return status;
108}
109
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300110static AGESA_STATUS amd_init_early(AMD_EARLY_PARAMS *EarlyParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600111{
112 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600113
Richard Spiegeldd9b1d12018-09-20 14:50:11 -0700114 soc_customize_init_early(EarlyParams);
Marshall Dawson857a3872017-12-13 20:01:59 -0700115 OemCustomizeInitEarly(EarlyParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600116
Martin Rothbc5c3e72017-12-09 10:40:45 -0700117 timestamp_add_now(TS_AGESA_INIT_EARLY_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300118 status = amd_dispatch(EarlyParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100119 timestamp_add_now(TS_AGESA_INIT_EARLY_END);
Marc Jones1587dc82017-05-15 18:55:11 -0600120
Marc Jones1587dc82017-05-15 18:55:11 -0600121 return status;
122}
123
Marshall Dawson972f8262017-12-14 09:08:02 -0700124static void print_init_post_settings(AMD_POST_PARAMS *parms)
125{
126 u64 syslimit, bottomio, uma_size, uma_start;
127 const char *mode;
128
129 switch (parms->MemConfig.UmaMode) {
130 case UMA_AUTO:
131 mode = "UMA_AUTO";
132 break;
133 case UMA_SPECIFIED:
134 mode = "UMA_SPECIFIED";
135 break;
136 case UMA_NONE:
137 mode = "UMA_NONE";
138 break;
139 default:
140 mode = "unknown!";
141 break;
142 }
143
Marshall Dawson74258d72018-10-22 15:22:46 -0600144 syslimit = (u64)(parms->MemConfig.SysLimit + 1) * 64 * KiB - 1;
Marshall Dawson972f8262017-12-14 09:08:02 -0700145 bottomio = (u64)parms->MemConfig.BottomIo * 64 * KiB;
146
147 uma_size = (u64)parms->MemConfig.UmaSize * 64 * KiB;
148 uma_start = (u64)parms->MemConfig.UmaBase * 64 * KiB;
149
150 printk(BIOS_SPEW, "AGESA set: umamode %s\n", mode);
151 printk(BIOS_SPEW, " : syslimit 0x%llx, bottomio 0x%08llx\n",
152 syslimit, bottomio);
153 printk(BIOS_SPEW, " : uma size %lluMB, uma start 0x%08llx\n",
154 uma_size / MiB, uma_start);
155}
156
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300157static AGESA_STATUS amd_init_post(AMD_POST_PARAMS *PostParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600158{
159 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600160
Julius Werner5d1f9a02019-03-07 17:07:26 -0800161 PostParams->MemConfig.UmaMode = CONFIG(GFXUMA) ? UMA_AUTO : UMA_NONE;
Marc Jones1587dc82017-05-15 18:55:11 -0600162 PostParams->MemConfig.UmaSize = 0;
Richard Spiegel271b8a52018-11-06 16:32:28 -0700163 PostParams->MemConfig.BottomIo = (uint16_t)
Marc Jones1587dc82017-05-15 18:55:11 -0600164 (CONFIG_BOTTOMIO_POSITION >> 24);
165
Richard Spiegel67c2a7b2017-11-09 16:04:35 -0700166 SetMemParams(PostParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600167 OemPostParams(PostParams);
Richard Spiegel67c2a7b2017-11-09 16:04:35 -0700168 printk(BIOS_SPEW, "DRAM clear on reset: %s\n",
169 (PostParams->MemConfig.EnableMemClr == FALSE) ? "Keep" :
170 (PostParams->MemConfig.EnableMemClr == TRUE) ? "Clear" :
171 "unknown"
172 );
Marc Jones1587dc82017-05-15 18:55:11 -0600173
Martin Rothbc5c3e72017-12-09 10:40:45 -0700174 timestamp_add_now(TS_AGESA_INIT_POST_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300175 status = amd_dispatch(PostParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100176 timestamp_add_now(TS_AGESA_INIT_POST_END);
Marc Jones1587dc82017-05-15 18:55:11 -0600177
Marshall Dawson972f8262017-12-14 09:08:02 -0700178 /*
Marc Jones932b5bd2018-02-19 13:34:31 -0700179 * AGESA passes back the base and size of UMA. This is the only
180 * opportunity to get and save these settings to be used in resource
181 * allocation. We also need to allocate the top of low memory.
182 * If UMA is below 4GiB, UMA base is the top of low memory, otherwise
183 * Sub4GCachetop is the top of low memory.
184 * With UMA_NONE we see UmaBase==0.
Marshall Dawson972f8262017-12-14 09:08:02 -0700185 */
186 uintptr_t top;
Marc Jones932b5bd2018-02-19 13:34:31 -0700187 if (PostParams->MemConfig.UmaBase &&
188 (PostParams->MemConfig.UmaBase < ((4ull * GiB) >> 16)))
Marshall Dawson972f8262017-12-14 09:08:02 -0700189 top = PostParams->MemConfig.UmaBase << 16;
Marc Jones1587dc82017-05-15 18:55:11 -0600190 else
Marshall Dawson972f8262017-12-14 09:08:02 -0700191 top = PostParams->MemConfig.Sub4GCacheTop;
192 backup_top_of_low_cacheable(top);
Marc Jones1587dc82017-05-15 18:55:11 -0600193
Marc Jones932b5bd2018-02-19 13:34:31 -0700194 save_uma_size(PostParams->MemConfig.UmaSize * 64 * KiB);
195 save_uma_base((u64)PostParams->MemConfig.UmaBase * 64 * KiB);
196
Marshall Dawson972f8262017-12-14 09:08:02 -0700197 print_init_post_settings(PostParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600198
Marc Jones1587dc82017-05-15 18:55:11 -0600199 return status;
200}
201
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300202static AGESA_STATUS amd_init_env(AMD_ENV_PARAMS *EnvParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600203{
204 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600205
Marshall Dawson857a3872017-12-13 20:01:59 -0700206 SetFchEnvParams(&EnvParams->FchInterface);
207 SetNbEnvParams(&EnvParams->GnbEnvConfiguration);
Marc Jones1587dc82017-05-15 18:55:11 -0600208
Martin Rothbc5c3e72017-12-09 10:40:45 -0700209 timestamp_add_now(TS_AGESA_INIT_ENV_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300210 status = amd_dispatch(EnvParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100211 timestamp_add_now(TS_AGESA_INIT_ENV_END);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700212
Marc Jones1587dc82017-05-15 18:55:11 -0600213 return status;
214}
215
Richard Spiegel271b8a52018-11-06 16:32:28 -0700216void *agesawrapper_getlateinitptr(int pick)
Marc Jones1587dc82017-05-15 18:55:11 -0600217{
218 switch (pick) {
219 case PICK_DMI:
220 return DmiTable;
221 case PICK_PSTATE:
222 return AcpiPstate;
223 case PICK_SRAT:
224 return AcpiSrat;
225 case PICK_SLIT:
226 return AcpiSlit;
227 case PICK_WHEA_MCE:
228 return AcpiWheaMce;
229 case PICK_WHEA_CMC:
230 return AcpiWheaCmc;
231 case PICK_ALIB:
232 return AcpiAlib;
233 case PICK_IVRS:
234 return AcpiIvrs;
235 case PICK_CRAT:
236 return AcpiCrat;
237 default:
238 return NULL;
239 }
240}
Marc Jones1587dc82017-05-15 18:55:11 -0600241
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300242static AGESA_STATUS amd_init_mid(AMD_MID_PARAMS *MidParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600243{
244 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600245
246 /* Enable MMIO on AMD CPU Address Map Controller */
Marshall Dawson857a3872017-12-13 20:01:59 -0700247 amd_initcpuio();
Marc Jones1587dc82017-05-15 18:55:11 -0600248
Marshall Dawson857a3872017-12-13 20:01:59 -0700249 SetFchMidParams(&MidParams->FchInterface);
250 SetNbMidParams(&MidParams->GnbMidConfiguration);
Marc Jones1587dc82017-05-15 18:55:11 -0600251
Martin Rothbc5c3e72017-12-09 10:40:45 -0700252 timestamp_add_now(TS_AGESA_INIT_MID_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300253 status = amd_dispatch(MidParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100254 timestamp_add_now(TS_AGESA_INIT_MID_END);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700255
Marc Jones1587dc82017-05-15 18:55:11 -0600256 return status;
257}
258
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300259static AGESA_STATUS amd_init_late(AMD_LATE_PARAMS *LateParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600260{
261 AGESA_STATUS Status;
Martin Rothbc5c3e72017-12-09 10:40:45 -0700262
Felix Heldaa8ae1a2023-12-20 22:47:35 +0100263 if (is_dev_enabled(DEV_PTR(iommu))) {
Felix Held78b0e7f2021-06-11 18:00:02 +0200264 LateParams->GnbLateConfiguration.GnbIoapicId = GNB_IOAPIC_ID;
265 LateParams->GnbLateConfiguration.FchIoapicId = FCH_IOAPIC_ID;
Martin Roth50f2e4c2018-10-29 11:16:53 -0600266 }
Marc Jonesbc94aea2018-09-26 09:57:08 -0600267
Felix Heldf0c1c972023-03-02 19:45:21 +0100268 /* Make binaryPI use \_SB_ as processor object scope in PSTATE SSDT */
269 LateParams->PlatformConfig.ProcessorScopeInSb = true;
270
Martin Rothbc5c3e72017-12-09 10:40:45 -0700271 timestamp_add_now(TS_AGESA_INIT_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300272 Status = amd_dispatch(LateParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100273 timestamp_add_now(TS_AGESA_INIT_LATE_END);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700274
Marshall Dawson857a3872017-12-13 20:01:59 -0700275 DmiTable = LateParams->DmiTable;
276 AcpiPstate = LateParams->AcpiPState;
Marc Jones1587dc82017-05-15 18:55:11 -0600277
Marshall Dawson857a3872017-12-13 20:01:59 -0700278 AcpiWheaMce = LateParams->AcpiWheaMce;
279 AcpiWheaCmc = LateParams->AcpiWheaCmc;
280 AcpiAlib = LateParams->AcpiAlib;
281 AcpiIvrs = LateParams->AcpiIvrs;
282 AcpiCrat = LateParams->AcpiCrat;
Marc Jones1587dc82017-05-15 18:55:11 -0600283
Marshall Dawson857a3872017-12-13 20:01:59 -0700284 printk(BIOS_DEBUG, "DmiTable:%p, AcpiPstatein: %p, AcpiSrat:%p,"
285 "AcpiSlit:%p, Mce:%p, Cmc:%p,"
286 "Alib:%p, AcpiIvrs:%p in %s\n",
287 DmiTable, AcpiPstate, AcpiSrat,
288 AcpiSlit, AcpiWheaMce, AcpiWheaCmc,
289 AcpiAlib, AcpiIvrs, __func__);
Marc Jones1587dc82017-05-15 18:55:11 -0600290
Marc Jones1587dc82017-05-15 18:55:11 -0600291 return Status;
292}
Marc Jones1587dc82017-05-15 18:55:11 -0600293
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300294static AGESA_STATUS amd_init_rtb(AMD_RTB_PARAMS *RtbParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700295{
296 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700297
298 timestamp_add_now(TS_AGESA_INIT_RTB_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300299 Status = amd_dispatch(RtbParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100300 timestamp_add_now(TS_AGESA_INIT_RTB_END);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700301
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300302 if (Status != AGESA_SUCCESS)
303 return Status;
304
305 if (OemS3Save(&RtbParams->S3DataBlock) != AGESA_SUCCESS)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700306 printk(BIOS_ERR, "S3 data not saved, resuming impossible\n");
307
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700308 return Status;
309}
310
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300311static AGESA_STATUS amd_init_resume(AMD_RESUME_PARAMS *InitResumeParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700312{
313 AGESA_STATUS status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700314
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300315 OemInitResume(&InitResumeParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700316
317 timestamp_add_now(TS_AGESA_INIT_RESUME_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300318 status = amd_dispatch(InitResumeParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100319 timestamp_add_now(TS_AGESA_INIT_RESUME_END);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700320
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700321 return status;
322}
323
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300324static AGESA_STATUS amd_s3late_restore(AMD_S3LATE_PARAMS *S3LateParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700325{
326 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700327
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700328 amd_initcpuio();
329
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300330 OemS3LateRestore(&S3LateParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700331
332 timestamp_add_now(TS_AGESA_S3_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300333 Status = amd_dispatch(S3LateParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100334 timestamp_add_now(TS_AGESA_S3_LATE_END);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700335
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700336 return Status;
337}
338
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300339static AGESA_STATUS amd_s3final_restore(AMD_S3FINAL_PARAMS *S3FinalParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700340{
341 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700342
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300343 OemS3LateRestore(&S3FinalParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700344
345 timestamp_add_now(TS_AGESA_S3_FINAL_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300346 Status = amd_dispatch(S3FinalParams);
Jakub Czapigaad6157e2022-02-15 11:50:31 +0100347 timestamp_add_now(TS_AGESA_S3_FINAL_END);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700348
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700349 return Status;
350}
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300351
352static AGESA_STATUS romstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
353{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300354 void *Params = StdHeader;
355
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300356 switch (StdHeader->Func) {
357 case AMD_INIT_RESET:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300358 return amd_init_reset(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300359 case AMD_INIT_EARLY:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300360 return amd_init_early(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300361 case AMD_INIT_POST:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300362 return amd_init_post(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300363 case AMD_INIT_RESUME:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300364 return amd_init_resume(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300365 default:
366 return AGESA_UNSUPPORTED;
367 }
368}
369
370static AGESA_STATUS ramstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
371{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300372 void *Params = StdHeader;
373
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300374 switch (StdHeader->Func) {
375 case AMD_INIT_ENV:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300376 return amd_init_env(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300377 case AMD_INIT_MID:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300378 return amd_init_mid(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300379 case AMD_INIT_LATE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300380 return amd_init_late(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300381 case AMD_INIT_RTB:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300382 return amd_init_rtb(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300383 case AMD_S3LATE_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300384 return amd_s3late_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300385 case AMD_S3FINAL_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300386 return amd_s3final_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300387 default:
388 return AGESA_UNSUPPORTED;
389 }
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300390
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300391}
392
393AGESA_STATUS agesa_execute_state(AGESA_STRUCT_NAME func)
394{
395 AGESA_STATUS status = AGESA_UNSUPPORTED;
396 AMD_CONFIG_PARAMS template = {};
397 AMD_CONFIG_PARAMS *StdHeader = &template;
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300398 AMD_INTERFACE_PARAMS AmdParamStruct;
399 AMD_INTERFACE_PARAMS *aip = &AmdParamStruct;
400 union {
401 AMD_RESET_PARAMS ResetParams;
402 AMD_S3LATE_PARAMS S3LateParams;
403 AMD_S3FINAL_PARAMS S3FinalParams;
404 } sp;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300405
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300406 if ((func == AMD_INIT_RESET) || (func == AMD_S3LATE_RESTORE) ||
407 (func == AMD_S3FINAL_RESTORE)) {
408 memset(&sp, 0, sizeof(sp));
409 amd_create_struct(aip, func, &sp, sizeof(sp));
410 } else {
411 amd_create_struct(aip, func, NULL, 0);
412 }
413
414 StdHeader = aip->NewStructPtr;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300415 StdHeader->Func = func;
416
Kyösti Mälkki11cac782022-04-07 07:16:48 +0300417 if (ENV_RAMINIT)
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300418 status = romstage_dispatch(StdHeader);
419 if (ENV_RAMSTAGE)
420 status = ramstage_dispatch(StdHeader);
421
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300422 amd_release_struct(aip);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300423 return status;
424}