blob: 8ee962b7b0a4783999a2374a487d5103a2cb83ae [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 {
71 if (ENV_ROMSTAGE)
72 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);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700105 timestamp_add_now(TS_AGESA_INIT_RESET_DONE);
106
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);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700119 timestamp_add_now(TS_AGESA_INIT_EARLY_DONE);
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);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700176 timestamp_add_now(TS_AGESA_INIT_POST_DONE);
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);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700211 timestamp_add_now(TS_AGESA_INIT_ENV_DONE);
212
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);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700254 timestamp_add_now(TS_AGESA_INIT_MID_DONE);
255
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
Kyösti Mälkkie7377552018-06-21 16:20:55 +0300263 const struct device *dev = pcidev_path_on_root(IOMMU_DEVFN);
Martin Roth50f2e4c2018-10-29 11:16:53 -0600264 if (dev && dev->enabled) {
Felix Held78b0e7f2021-06-11 18:00:02 +0200265 LateParams->GnbLateConfiguration.GnbIoapicId = GNB_IOAPIC_ID;
266 LateParams->GnbLateConfiguration.FchIoapicId = FCH_IOAPIC_ID;
Martin Roth50f2e4c2018-10-29 11:16:53 -0600267 }
Marc Jonesbc94aea2018-09-26 09:57:08 -0600268
Martin Rothbc5c3e72017-12-09 10:40:45 -0700269 timestamp_add_now(TS_AGESA_INIT_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300270 Status = amd_dispatch(LateParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700271 timestamp_add_now(TS_AGESA_INIT_LATE_DONE);
272
Marshall Dawson857a3872017-12-13 20:01:59 -0700273 DmiTable = LateParams->DmiTable;
274 AcpiPstate = LateParams->AcpiPState;
Marc Jones1587dc82017-05-15 18:55:11 -0600275
Marshall Dawson857a3872017-12-13 20:01:59 -0700276 AcpiWheaMce = LateParams->AcpiWheaMce;
277 AcpiWheaCmc = LateParams->AcpiWheaCmc;
278 AcpiAlib = LateParams->AcpiAlib;
279 AcpiIvrs = LateParams->AcpiIvrs;
280 AcpiCrat = LateParams->AcpiCrat;
Marc Jones1587dc82017-05-15 18:55:11 -0600281
Marshall Dawson857a3872017-12-13 20:01:59 -0700282 printk(BIOS_DEBUG, "DmiTable:%p, AcpiPstatein: %p, AcpiSrat:%p,"
283 "AcpiSlit:%p, Mce:%p, Cmc:%p,"
284 "Alib:%p, AcpiIvrs:%p in %s\n",
285 DmiTable, AcpiPstate, AcpiSrat,
286 AcpiSlit, AcpiWheaMce, AcpiWheaCmc,
287 AcpiAlib, AcpiIvrs, __func__);
Marc Jones1587dc82017-05-15 18:55:11 -0600288
Marc Jones1587dc82017-05-15 18:55:11 -0600289 return Status;
290}
Marc Jones1587dc82017-05-15 18:55:11 -0600291
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300292static AGESA_STATUS amd_init_rtb(AMD_RTB_PARAMS *RtbParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700293{
294 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700295
296 timestamp_add_now(TS_AGESA_INIT_RTB_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300297 Status = amd_dispatch(RtbParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700298 timestamp_add_now(TS_AGESA_INIT_RTB_DONE);
299
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300300 if (Status != AGESA_SUCCESS)
301 return Status;
302
303 if (OemS3Save(&RtbParams->S3DataBlock) != AGESA_SUCCESS)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700304 printk(BIOS_ERR, "S3 data not saved, resuming impossible\n");
305
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700306 return Status;
307}
308
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300309static AGESA_STATUS amd_init_resume(AMD_RESUME_PARAMS *InitResumeParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700310{
311 AGESA_STATUS status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700312
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300313 OemInitResume(&InitResumeParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700314
315 timestamp_add_now(TS_AGESA_INIT_RESUME_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300316 status = amd_dispatch(InitResumeParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700317 timestamp_add_now(TS_AGESA_INIT_RESUME_DONE);
318
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700319 return status;
320}
321
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300322static AGESA_STATUS amd_s3late_restore(AMD_S3LATE_PARAMS *S3LateParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700323{
324 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700325
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700326 amd_initcpuio();
327
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300328 OemS3LateRestore(&S3LateParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700329
330 timestamp_add_now(TS_AGESA_S3_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300331 Status = amd_dispatch(S3LateParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700332 timestamp_add_now(TS_AGESA_S3_LATE_DONE);
333
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700334 return Status;
335}
336
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300337static AGESA_STATUS amd_s3final_restore(AMD_S3FINAL_PARAMS *S3FinalParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700338{
339 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700340
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300341 OemS3LateRestore(&S3FinalParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700342
343 timestamp_add_now(TS_AGESA_S3_FINAL_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300344 Status = amd_dispatch(S3FinalParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700345 timestamp_add_now(TS_AGESA_S3_FINAL_DONE);
346
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700347 return Status;
348}
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300349
350static AGESA_STATUS romstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
351{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300352 void *Params = StdHeader;
353
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300354 switch (StdHeader->Func) {
355 case AMD_INIT_RESET:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300356 return amd_init_reset(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300357 case AMD_INIT_EARLY:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300358 return amd_init_early(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300359 case AMD_INIT_POST:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300360 return amd_init_post(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300361 case AMD_INIT_RESUME:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300362 return amd_init_resume(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300363 default:
364 return AGESA_UNSUPPORTED;
365 }
366}
367
368static AGESA_STATUS ramstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
369{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300370 void *Params = StdHeader;
371
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300372 switch (StdHeader->Func) {
373 case AMD_INIT_ENV:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300374 return amd_init_env(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300375 case AMD_INIT_MID:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300376 return amd_init_mid(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300377 case AMD_INIT_LATE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300378 return amd_init_late(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300379 case AMD_INIT_RTB:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300380 return amd_init_rtb(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300381 case AMD_S3LATE_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300382 return amd_s3late_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300383 case AMD_S3FINAL_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300384 return amd_s3final_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300385 default:
386 return AGESA_UNSUPPORTED;
387 }
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300388
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300389}
390
391AGESA_STATUS agesa_execute_state(AGESA_STRUCT_NAME func)
392{
393 AGESA_STATUS status = AGESA_UNSUPPORTED;
394 AMD_CONFIG_PARAMS template = {};
395 AMD_CONFIG_PARAMS *StdHeader = &template;
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300396 AMD_INTERFACE_PARAMS AmdParamStruct;
397 AMD_INTERFACE_PARAMS *aip = &AmdParamStruct;
398 union {
399 AMD_RESET_PARAMS ResetParams;
400 AMD_S3LATE_PARAMS S3LateParams;
401 AMD_S3FINAL_PARAMS S3FinalParams;
402 } sp;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300403
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300404 if ((func == AMD_INIT_RESET) || (func == AMD_S3LATE_RESTORE) ||
405 (func == AMD_S3FINAL_RESTORE)) {
406 memset(&sp, 0, sizeof(sp));
407 amd_create_struct(aip, func, &sp, sizeof(sp));
408 } else {
409 amd_create_struct(aip, func, NULL, 0);
410 }
411
412 StdHeader = aip->NewStructPtr;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300413 StdHeader->Func = func;
414
415 if (ENV_ROMSTAGE)
416 status = romstage_dispatch(StdHeader);
417 if (ENV_RAMSTAGE)
418 status = ramstage_dispatch(StdHeader);
419
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300420 amd_release_struct(aip);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300421 return status;
422}