blob: feb153952195a905c64da4ad6cd78c8043458765 [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
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Elyes HAOUAS20eaef02019-03-29 17:45:28 +01004#include <console/console.h>
Martin Rothbc5c3e72017-12-09 10:40:45 -07005#include <timestamp.h>
Michał Żygowskif65c1e42019-12-01 18:14:39 +01006#include <amdblocks/biosram.h>
Marshall Dawsonc2f6da02017-12-04 15:28:10 -07007#include <amdblocks/s3_resume.h>
Marshall Dawson857a3872017-12-13 20:01:59 -07008#include <amdblocks/agesawrapper.h>
9#include <amdblocks/BiosCallOuts.h>
Felix Held78b0e7f2021-06-11 18:00:02 +020010#include <amdblocks/ioapic.h>
Martin Roth50f2e4c2018-10-29 11:16:53 -060011#include <soc/pci_devs.h>
Richard Spiegeldd9b1d12018-09-20 14:50:11 -070012#include <soc/northbridge.h>
13#include <soc/cpu.h>
Elyes HAOUASb0cda4b2022-01-01 19:06:22 +010014#include <string.h>
Marc Jones1587dc82017-05-15 18:55:11 -060015
Aaron Durbin64031672018-04-21 14:45:32 -060016void __weak SetMemParams(AMD_POST_PARAMS *PostParams) {}
17void __weak OemPostParams(AMD_POST_PARAMS *PostParams) {}
Marc Jones1587dc82017-05-15 18:55:11 -060018
Marc Jones1587dc82017-05-15 18:55:11 -060019/* ACPI table pointers returned by AmdInitLate */
Aaron Durbin8dd40062017-11-03 11:50:14 -060020static void *DmiTable;
21static void *AcpiPstate;
22static void *AcpiSrat;
23static void *AcpiSlit;
Marc Jones1587dc82017-05-15 18:55:11 -060024
Aaron Durbin8dd40062017-11-03 11:50:14 -060025static void *AcpiWheaMce;
26static void *AcpiWheaCmc;
27static void *AcpiAlib;
28static void *AcpiIvrs;
29static void *AcpiCrat;
Marc Jones1587dc82017-05-15 18:55:11 -060030
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +030031static AGESA_STATUS module_dispatch(AGESA_STRUCT_NAME func,
32 AMD_CONFIG_PARAMS *StdHeader)
33{
34 MODULE_ENTRY dispatcher = agesa_get_dispatcher();
35
36 if (!dispatcher)
37 return AGESA_UNSUPPORTED;
38
39 StdHeader->Func = func;
40 return dispatcher(StdHeader);
41}
42
43static AGESA_STATUS amd_dispatch(void *Params)
44{
45 AMD_CONFIG_PARAMS *StdHeader = Params;
46 return module_dispatch(StdHeader->Func, StdHeader);
47}
48
49AGESA_STATUS amd_late_run_ap_task(AP_EXE_PARAMS *ApExeParams)
50{
51 AMD_CONFIG_PARAMS *StdHeader = (void *)ApExeParams;
52 return module_dispatch(AMD_LATE_RUN_AP_TASK, StdHeader);
53}
54
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030055static AGESA_STATUS amd_create_struct(AMD_INTERFACE_PARAMS *aip,
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030056 AGESA_STRUCT_NAME func, void *buf, size_t len)
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070057{
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030058 AGESA_STATUS status;
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +030059
Kyösti Mälkki4cdd2f82018-06-14 06:49:38 +030060 /* Should clone entire StdHeader here. */
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030061 memset(aip, 0, sizeof(*aip));
62 aip->StdHeader.CalloutPtr = &GetBiosCallout;
Kyösti Mälkki4cdd2f82018-06-14 06:49:38 +030063
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030064 /* If we provide the buffer, API expects it to have
65 StdHeader already filled. */
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030066 if (buf != NULL && len >= sizeof(aip->StdHeader)) {
67 memcpy(buf, &aip->StdHeader, sizeof(aip->StdHeader));
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030068 aip->AllocationMethod = ByHost;
69 aip->NewStructPtr = buf;
70 aip->NewStructSize = len;
71 } else {
72 if (ENV_ROMSTAGE)
73 aip->AllocationMethod = PreMemHeap;
74 if (ENV_RAMSTAGE)
75 aip->AllocationMethod = PostMemDram;
76 }
77
78 aip->AgesaFunctionName = func;
79 status = module_dispatch(AMD_CREATE_STRUCT, &aip->StdHeader);
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070080
Kyösti Mälkki2fc1a372018-06-14 06:57:05 +030081 if (status != AGESA_SUCCESS) {
82 printk(BIOS_ERR, "Error: AmdCreateStruct() for 0x%x returned 0x%x. "
83 "Proper system initialization may not be possible.\n",
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030084 aip->AgesaFunctionName, status);
Kyösti Mälkki2fc1a372018-06-14 06:57:05 +030085 }
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070086
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030087 if (!aip->NewStructPtr)
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070088 die("No AGESA structure created");
89
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030090 return status;
Marshall Dawson4c5a3b62018-01-25 11:13:35 -070091}
92
Kyösti Mälkki7f8a57e2018-06-28 16:58:52 +030093static AGESA_STATUS amd_release_struct(AMD_INTERFACE_PARAMS *aip)
94{
95 return module_dispatch(AMD_RELEASE_STRUCT, &aip->StdHeader);
96}
97
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +030098static AGESA_STATUS amd_init_reset(AMD_RESET_PARAMS *ResetParams)
Marc Jones1587dc82017-05-15 18:55:11 -060099{
100 AGESA_STATUS status;
Kyösti Mälkki108fb8a2018-06-14 06:57:05 +0300101
Kyösti Mälkki108fb8a2018-06-14 06:57:05 +0300102 SetFchResetParams(&ResetParams->FchInterface);
Marc Jones1587dc82017-05-15 18:55:11 -0600103
Martin Rothbc5c3e72017-12-09 10:40:45 -0700104 timestamp_add_now(TS_AGESA_INIT_RESET_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300105 status = amd_dispatch(ResetParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700106 timestamp_add_now(TS_AGESA_INIT_RESET_DONE);
107
Marc Jones1587dc82017-05-15 18:55:11 -0600108 return status;
109}
110
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300111static AGESA_STATUS amd_init_early(AMD_EARLY_PARAMS *EarlyParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600112{
113 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600114
Richard Spiegeldd9b1d12018-09-20 14:50:11 -0700115 soc_customize_init_early(EarlyParams);
Marshall Dawson857a3872017-12-13 20:01:59 -0700116 OemCustomizeInitEarly(EarlyParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600117
Martin Rothbc5c3e72017-12-09 10:40:45 -0700118 timestamp_add_now(TS_AGESA_INIT_EARLY_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300119 status = amd_dispatch(EarlyParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700120 timestamp_add_now(TS_AGESA_INIT_EARLY_DONE);
Marc Jones1587dc82017-05-15 18:55:11 -0600121
Marc Jones1587dc82017-05-15 18:55:11 -0600122 return status;
123}
124
Marshall Dawson972f8262017-12-14 09:08:02 -0700125static void print_init_post_settings(AMD_POST_PARAMS *parms)
126{
127 u64 syslimit, bottomio, uma_size, uma_start;
128 const char *mode;
129
130 switch (parms->MemConfig.UmaMode) {
131 case UMA_AUTO:
132 mode = "UMA_AUTO";
133 break;
134 case UMA_SPECIFIED:
135 mode = "UMA_SPECIFIED";
136 break;
137 case UMA_NONE:
138 mode = "UMA_NONE";
139 break;
140 default:
141 mode = "unknown!";
142 break;
143 }
144
Marshall Dawson74258d72018-10-22 15:22:46 -0600145 syslimit = (u64)(parms->MemConfig.SysLimit + 1) * 64 * KiB - 1;
Marshall Dawson972f8262017-12-14 09:08:02 -0700146 bottomio = (u64)parms->MemConfig.BottomIo * 64 * KiB;
147
148 uma_size = (u64)parms->MemConfig.UmaSize * 64 * KiB;
149 uma_start = (u64)parms->MemConfig.UmaBase * 64 * KiB;
150
151 printk(BIOS_SPEW, "AGESA set: umamode %s\n", mode);
152 printk(BIOS_SPEW, " : syslimit 0x%llx, bottomio 0x%08llx\n",
153 syslimit, bottomio);
154 printk(BIOS_SPEW, " : uma size %lluMB, uma start 0x%08llx\n",
155 uma_size / MiB, uma_start);
156}
157
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300158static AGESA_STATUS amd_init_post(AMD_POST_PARAMS *PostParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600159{
160 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600161
Julius Werner5d1f9a02019-03-07 17:07:26 -0800162 PostParams->MemConfig.UmaMode = CONFIG(GFXUMA) ? UMA_AUTO : UMA_NONE;
Marc Jones1587dc82017-05-15 18:55:11 -0600163 PostParams->MemConfig.UmaSize = 0;
Richard Spiegel271b8a52018-11-06 16:32:28 -0700164 PostParams->MemConfig.BottomIo = (uint16_t)
Marc Jones1587dc82017-05-15 18:55:11 -0600165 (CONFIG_BOTTOMIO_POSITION >> 24);
166
Richard Spiegel67c2a7b2017-11-09 16:04:35 -0700167 SetMemParams(PostParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600168 OemPostParams(PostParams);
Richard Spiegel67c2a7b2017-11-09 16:04:35 -0700169 printk(BIOS_SPEW, "DRAM clear on reset: %s\n",
170 (PostParams->MemConfig.EnableMemClr == FALSE) ? "Keep" :
171 (PostParams->MemConfig.EnableMemClr == TRUE) ? "Clear" :
172 "unknown"
173 );
Marc Jones1587dc82017-05-15 18:55:11 -0600174
Martin Rothbc5c3e72017-12-09 10:40:45 -0700175 timestamp_add_now(TS_AGESA_INIT_POST_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300176 status = amd_dispatch(PostParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700177 timestamp_add_now(TS_AGESA_INIT_POST_DONE);
Marc Jones1587dc82017-05-15 18:55:11 -0600178
Marshall Dawson972f8262017-12-14 09:08:02 -0700179 /*
Marc Jones932b5bd2018-02-19 13:34:31 -0700180 * AGESA passes back the base and size of UMA. This is the only
181 * opportunity to get and save these settings to be used in resource
182 * allocation. We also need to allocate the top of low memory.
183 * If UMA is below 4GiB, UMA base is the top of low memory, otherwise
184 * Sub4GCachetop is the top of low memory.
185 * With UMA_NONE we see UmaBase==0.
Marshall Dawson972f8262017-12-14 09:08:02 -0700186 */
187 uintptr_t top;
Marc Jones932b5bd2018-02-19 13:34:31 -0700188 if (PostParams->MemConfig.UmaBase &&
189 (PostParams->MemConfig.UmaBase < ((4ull * GiB) >> 16)))
Marshall Dawson972f8262017-12-14 09:08:02 -0700190 top = PostParams->MemConfig.UmaBase << 16;
Marc Jones1587dc82017-05-15 18:55:11 -0600191 else
Marshall Dawson972f8262017-12-14 09:08:02 -0700192 top = PostParams->MemConfig.Sub4GCacheTop;
193 backup_top_of_low_cacheable(top);
Marc Jones1587dc82017-05-15 18:55:11 -0600194
Marc Jones932b5bd2018-02-19 13:34:31 -0700195 save_uma_size(PostParams->MemConfig.UmaSize * 64 * KiB);
196 save_uma_base((u64)PostParams->MemConfig.UmaBase * 64 * KiB);
197
Marshall Dawson972f8262017-12-14 09:08:02 -0700198 print_init_post_settings(PostParams);
Marc Jones1587dc82017-05-15 18:55:11 -0600199
Marc Jones1587dc82017-05-15 18:55:11 -0600200 return status;
201}
202
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300203static AGESA_STATUS amd_init_env(AMD_ENV_PARAMS *EnvParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600204{
205 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600206
Marshall Dawson857a3872017-12-13 20:01:59 -0700207 SetFchEnvParams(&EnvParams->FchInterface);
208 SetNbEnvParams(&EnvParams->GnbEnvConfiguration);
Marc Jones1587dc82017-05-15 18:55:11 -0600209
Martin Rothbc5c3e72017-12-09 10:40:45 -0700210 timestamp_add_now(TS_AGESA_INIT_ENV_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300211 status = amd_dispatch(EnvParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700212 timestamp_add_now(TS_AGESA_INIT_ENV_DONE);
213
Marc Jones1587dc82017-05-15 18:55:11 -0600214 return status;
215}
216
Richard Spiegel271b8a52018-11-06 16:32:28 -0700217void *agesawrapper_getlateinitptr(int pick)
Marc Jones1587dc82017-05-15 18:55:11 -0600218{
219 switch (pick) {
220 case PICK_DMI:
221 return DmiTable;
222 case PICK_PSTATE:
223 return AcpiPstate;
224 case PICK_SRAT:
225 return AcpiSrat;
226 case PICK_SLIT:
227 return AcpiSlit;
228 case PICK_WHEA_MCE:
229 return AcpiWheaMce;
230 case PICK_WHEA_CMC:
231 return AcpiWheaCmc;
232 case PICK_ALIB:
233 return AcpiAlib;
234 case PICK_IVRS:
235 return AcpiIvrs;
236 case PICK_CRAT:
237 return AcpiCrat;
238 default:
239 return NULL;
240 }
241}
Marc Jones1587dc82017-05-15 18:55:11 -0600242
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300243static AGESA_STATUS amd_init_mid(AMD_MID_PARAMS *MidParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600244{
245 AGESA_STATUS status;
Marc Jones1587dc82017-05-15 18:55:11 -0600246
247 /* Enable MMIO on AMD CPU Address Map Controller */
Marshall Dawson857a3872017-12-13 20:01:59 -0700248 amd_initcpuio();
Marc Jones1587dc82017-05-15 18:55:11 -0600249
Marshall Dawson857a3872017-12-13 20:01:59 -0700250 SetFchMidParams(&MidParams->FchInterface);
251 SetNbMidParams(&MidParams->GnbMidConfiguration);
Marc Jones1587dc82017-05-15 18:55:11 -0600252
Martin Rothbc5c3e72017-12-09 10:40:45 -0700253 timestamp_add_now(TS_AGESA_INIT_MID_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300254 status = amd_dispatch(MidParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700255 timestamp_add_now(TS_AGESA_INIT_MID_DONE);
256
Marc Jones1587dc82017-05-15 18:55:11 -0600257 return status;
258}
259
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300260static AGESA_STATUS amd_init_late(AMD_LATE_PARAMS *LateParams)
Marc Jones1587dc82017-05-15 18:55:11 -0600261{
262 AGESA_STATUS Status;
Martin Rothbc5c3e72017-12-09 10:40:45 -0700263
Kyösti Mälkkie7377552018-06-21 16:20:55 +0300264 const struct device *dev = pcidev_path_on_root(IOMMU_DEVFN);
Martin Roth50f2e4c2018-10-29 11:16:53 -0600265 if (dev && dev->enabled) {
Felix Held78b0e7f2021-06-11 18:00:02 +0200266 LateParams->GnbLateConfiguration.GnbIoapicId = GNB_IOAPIC_ID;
267 LateParams->GnbLateConfiguration.FchIoapicId = FCH_IOAPIC_ID;
Martin Roth50f2e4c2018-10-29 11:16:53 -0600268 }
Marc Jonesbc94aea2018-09-26 09:57:08 -0600269
Martin Rothbc5c3e72017-12-09 10:40:45 -0700270 timestamp_add_now(TS_AGESA_INIT_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300271 Status = amd_dispatch(LateParams);
Martin Rothbc5c3e72017-12-09 10:40:45 -0700272 timestamp_add_now(TS_AGESA_INIT_LATE_DONE);
273
Marshall Dawson857a3872017-12-13 20:01:59 -0700274 DmiTable = LateParams->DmiTable;
275 AcpiPstate = LateParams->AcpiPState;
Marc Jones1587dc82017-05-15 18:55:11 -0600276
Marshall Dawson857a3872017-12-13 20:01:59 -0700277 AcpiWheaMce = LateParams->AcpiWheaMce;
278 AcpiWheaCmc = LateParams->AcpiWheaCmc;
279 AcpiAlib = LateParams->AcpiAlib;
280 AcpiIvrs = LateParams->AcpiIvrs;
281 AcpiCrat = LateParams->AcpiCrat;
Marc Jones1587dc82017-05-15 18:55:11 -0600282
Marshall Dawson857a3872017-12-13 20:01:59 -0700283 printk(BIOS_DEBUG, "DmiTable:%p, AcpiPstatein: %p, AcpiSrat:%p,"
284 "AcpiSlit:%p, Mce:%p, Cmc:%p,"
285 "Alib:%p, AcpiIvrs:%p in %s\n",
286 DmiTable, AcpiPstate, AcpiSrat,
287 AcpiSlit, AcpiWheaMce, AcpiWheaCmc,
288 AcpiAlib, AcpiIvrs, __func__);
Marc Jones1587dc82017-05-15 18:55:11 -0600289
Marc Jones1587dc82017-05-15 18:55:11 -0600290 return Status;
291}
Marc Jones1587dc82017-05-15 18:55:11 -0600292
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300293static AGESA_STATUS amd_init_rtb(AMD_RTB_PARAMS *RtbParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700294{
295 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700296
297 timestamp_add_now(TS_AGESA_INIT_RTB_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300298 Status = amd_dispatch(RtbParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700299 timestamp_add_now(TS_AGESA_INIT_RTB_DONE);
300
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300301 if (Status != AGESA_SUCCESS)
302 return Status;
303
304 if (OemS3Save(&RtbParams->S3DataBlock) != AGESA_SUCCESS)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700305 printk(BIOS_ERR, "S3 data not saved, resuming impossible\n");
306
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700307 return Status;
308}
309
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300310static AGESA_STATUS amd_init_resume(AMD_RESUME_PARAMS *InitResumeParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700311{
312 AGESA_STATUS status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700313
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300314 OemInitResume(&InitResumeParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700315
316 timestamp_add_now(TS_AGESA_INIT_RESUME_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300317 status = amd_dispatch(InitResumeParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700318 timestamp_add_now(TS_AGESA_INIT_RESUME_DONE);
319
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700320 return status;
321}
322
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300323static AGESA_STATUS amd_s3late_restore(AMD_S3LATE_PARAMS *S3LateParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700324{
325 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700326
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700327 amd_initcpuio();
328
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300329 OemS3LateRestore(&S3LateParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700330
331 timestamp_add_now(TS_AGESA_S3_LATE_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300332 Status = amd_dispatch(S3LateParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700333 timestamp_add_now(TS_AGESA_S3_LATE_DONE);
334
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700335 return Status;
336}
337
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300338static AGESA_STATUS amd_s3final_restore(AMD_S3FINAL_PARAMS *S3FinalParams)
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700339{
340 AGESA_STATUS Status;
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700341
Kyösti Mälkki66cabe72018-07-01 03:48:39 +0300342 OemS3LateRestore(&S3FinalParams->S3DataBlock);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700343
344 timestamp_add_now(TS_AGESA_S3_FINAL_START);
Kyösti Mälkki85b2ed52018-06-14 06:57:05 +0300345 Status = amd_dispatch(S3FinalParams);
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700346 timestamp_add_now(TS_AGESA_S3_FINAL_DONE);
347
Marshall Dawsonc2f6da02017-12-04 15:28:10 -0700348 return Status;
349}
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300350
351static AGESA_STATUS romstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
352{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300353 void *Params = StdHeader;
354
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300355 switch (StdHeader->Func) {
356 case AMD_INIT_RESET:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300357 return amd_init_reset(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300358 case AMD_INIT_EARLY:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300359 return amd_init_early(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300360 case AMD_INIT_POST:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300361 return amd_init_post(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300362 case AMD_INIT_RESUME:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300363 return amd_init_resume(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300364 default:
365 return AGESA_UNSUPPORTED;
366 }
367}
368
369static AGESA_STATUS ramstage_dispatch(AMD_CONFIG_PARAMS *StdHeader)
370{
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300371 void *Params = StdHeader;
372
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300373 switch (StdHeader->Func) {
374 case AMD_INIT_ENV:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300375 return amd_init_env(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300376 case AMD_INIT_MID:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300377 return amd_init_mid(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300378 case AMD_INIT_LATE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300379 return amd_init_late(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300380 case AMD_INIT_RTB:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300381 return amd_init_rtb(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300382 case AMD_S3LATE_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300383 return amd_s3late_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300384 case AMD_S3FINAL_RESTORE:
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300385 return amd_s3final_restore(Params);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300386 default:
387 return AGESA_UNSUPPORTED;
388 }
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300389
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300390}
391
392AGESA_STATUS agesa_execute_state(AGESA_STRUCT_NAME func)
393{
394 AGESA_STATUS status = AGESA_UNSUPPORTED;
395 AMD_CONFIG_PARAMS template = {};
396 AMD_CONFIG_PARAMS *StdHeader = &template;
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300397 AMD_INTERFACE_PARAMS AmdParamStruct;
398 AMD_INTERFACE_PARAMS *aip = &AmdParamStruct;
399 union {
400 AMD_RESET_PARAMS ResetParams;
401 AMD_S3LATE_PARAMS S3LateParams;
402 AMD_S3FINAL_PARAMS S3FinalParams;
403 } sp;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300404
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300405 if ((func == AMD_INIT_RESET) || (func == AMD_S3LATE_RESTORE) ||
406 (func == AMD_S3FINAL_RESTORE)) {
407 memset(&sp, 0, sizeof(sp));
408 amd_create_struct(aip, func, &sp, sizeof(sp));
409 } else {
410 amd_create_struct(aip, func, NULL, 0);
411 }
412
413 StdHeader = aip->NewStructPtr;
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300414 StdHeader->Func = func;
415
416 if (ENV_ROMSTAGE)
417 status = romstage_dispatch(StdHeader);
418 if (ENV_RAMSTAGE)
419 status = ramstage_dispatch(StdHeader);
420
Kyösti Mälkkifa6233d2018-06-28 16:55:29 +0300421 amd_release_struct(aip);
Kyösti Mälkki6e512c42018-06-14 06:57:05 +0300422 return status;
423}