Angel Pons | ae59387 | 2020-04-04 18:50:57 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 2 | |
Furquan Shaikh | 76cedd2 | 2020-05-02 10:24:23 -0700 | [diff] [blame] | 3 | #include <acpi/acpi.h> |
Elyes HAOUAS | 20eaef0 | 2019-03-29 17:45:28 +0100 | [diff] [blame] | 4 | #include <console/console.h> |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 5 | #include <timestamp.h> |
Michał Żygowski | f65c1e4 | 2019-12-01 18:14:39 +0100 | [diff] [blame] | 6 | #include <amdblocks/biosram.h> |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 7 | #include <amdblocks/s3_resume.h> |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 8 | #include <amdblocks/agesawrapper.h> |
| 9 | #include <amdblocks/BiosCallOuts.h> |
Felix Held | 78b0e7f | 2021-06-11 18:00:02 +0200 | [diff] [blame] | 10 | #include <amdblocks/ioapic.h> |
Martin Roth | 50f2e4c | 2018-10-29 11:16:53 -0600 | [diff] [blame] | 11 | #include <soc/pci_devs.h> |
Richard Spiegel | dd9b1d1 | 2018-09-20 14:50:11 -0700 | [diff] [blame] | 12 | #include <soc/northbridge.h> |
| 13 | #include <soc/cpu.h> |
Elyes HAOUAS | b0cda4b | 2022-01-01 19:06:22 +0100 | [diff] [blame^] | 14 | #include <string.h> |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 15 | |
Aaron Durbin | 6403167 | 2018-04-21 14:45:32 -0600 | [diff] [blame] | 16 | void __weak SetMemParams(AMD_POST_PARAMS *PostParams) {} |
| 17 | void __weak OemPostParams(AMD_POST_PARAMS *PostParams) {} |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 18 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 19 | /* ACPI table pointers returned by AmdInitLate */ |
Aaron Durbin | 8dd4006 | 2017-11-03 11:50:14 -0600 | [diff] [blame] | 20 | static void *DmiTable; |
| 21 | static void *AcpiPstate; |
| 22 | static void *AcpiSrat; |
| 23 | static void *AcpiSlit; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 24 | |
Aaron Durbin | 8dd4006 | 2017-11-03 11:50:14 -0600 | [diff] [blame] | 25 | static void *AcpiWheaMce; |
| 26 | static void *AcpiWheaCmc; |
| 27 | static void *AcpiAlib; |
| 28 | static void *AcpiIvrs; |
| 29 | static void *AcpiCrat; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 30 | |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 31 | static 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 | |
| 43 | static AGESA_STATUS amd_dispatch(void *Params) |
| 44 | { |
| 45 | AMD_CONFIG_PARAMS *StdHeader = Params; |
| 46 | return module_dispatch(StdHeader->Func, StdHeader); |
| 47 | } |
| 48 | |
| 49 | AGESA_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älkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 55 | static AGESA_STATUS amd_create_struct(AMD_INTERFACE_PARAMS *aip, |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 56 | AGESA_STRUCT_NAME func, void *buf, size_t len) |
Marshall Dawson | 4c5a3b6 | 2018-01-25 11:13:35 -0700 | [diff] [blame] | 57 | { |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 58 | AGESA_STATUS status; |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 59 | |
Kyösti Mälkki | 4cdd2f8 | 2018-06-14 06:49:38 +0300 | [diff] [blame] | 60 | /* Should clone entire StdHeader here. */ |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 61 | memset(aip, 0, sizeof(*aip)); |
| 62 | aip->StdHeader.CalloutPtr = &GetBiosCallout; |
Kyösti Mälkki | 4cdd2f8 | 2018-06-14 06:49:38 +0300 | [diff] [blame] | 63 | |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 64 | /* If we provide the buffer, API expects it to have |
| 65 | StdHeader already filled. */ |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 66 | if (buf != NULL && len >= sizeof(aip->StdHeader)) { |
| 67 | memcpy(buf, &aip->StdHeader, sizeof(aip->StdHeader)); |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 68 | 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 Dawson | 4c5a3b6 | 2018-01-25 11:13:35 -0700 | [diff] [blame] | 80 | |
Kyösti Mälkki | 2fc1a37 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 81 | 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älkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 84 | aip->AgesaFunctionName, status); |
Kyösti Mälkki | 2fc1a37 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 85 | } |
Marshall Dawson | 4c5a3b6 | 2018-01-25 11:13:35 -0700 | [diff] [blame] | 86 | |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 87 | if (!aip->NewStructPtr) |
Marshall Dawson | 4c5a3b6 | 2018-01-25 11:13:35 -0700 | [diff] [blame] | 88 | die("No AGESA structure created"); |
| 89 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 90 | return status; |
Marshall Dawson | 4c5a3b6 | 2018-01-25 11:13:35 -0700 | [diff] [blame] | 91 | } |
| 92 | |
Kyösti Mälkki | 7f8a57e | 2018-06-28 16:58:52 +0300 | [diff] [blame] | 93 | static AGESA_STATUS amd_release_struct(AMD_INTERFACE_PARAMS *aip) |
| 94 | { |
| 95 | return module_dispatch(AMD_RELEASE_STRUCT, &aip->StdHeader); |
| 96 | } |
| 97 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 98 | static AGESA_STATUS amd_init_reset(AMD_RESET_PARAMS *ResetParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 99 | { |
| 100 | AGESA_STATUS status; |
Kyösti Mälkki | 108fb8a | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 101 | |
Kyösti Mälkki | 108fb8a | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 102 | SetFchResetParams(&ResetParams->FchInterface); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 103 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 104 | timestamp_add_now(TS_AGESA_INIT_RESET_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 105 | status = amd_dispatch(ResetParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 106 | timestamp_add_now(TS_AGESA_INIT_RESET_DONE); |
| 107 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 108 | return status; |
| 109 | } |
| 110 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 111 | static AGESA_STATUS amd_init_early(AMD_EARLY_PARAMS *EarlyParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 112 | { |
| 113 | AGESA_STATUS status; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 114 | |
Richard Spiegel | dd9b1d1 | 2018-09-20 14:50:11 -0700 | [diff] [blame] | 115 | soc_customize_init_early(EarlyParams); |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 116 | OemCustomizeInitEarly(EarlyParams); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 117 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 118 | timestamp_add_now(TS_AGESA_INIT_EARLY_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 119 | status = amd_dispatch(EarlyParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 120 | timestamp_add_now(TS_AGESA_INIT_EARLY_DONE); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 121 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 122 | return status; |
| 123 | } |
| 124 | |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 125 | static 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 Dawson | 74258d7 | 2018-10-22 15:22:46 -0600 | [diff] [blame] | 145 | syslimit = (u64)(parms->MemConfig.SysLimit + 1) * 64 * KiB - 1; |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 146 | 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älkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 158 | static AGESA_STATUS amd_init_post(AMD_POST_PARAMS *PostParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 159 | { |
| 160 | AGESA_STATUS status; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 161 | |
Julius Werner | 5d1f9a0 | 2019-03-07 17:07:26 -0800 | [diff] [blame] | 162 | PostParams->MemConfig.UmaMode = CONFIG(GFXUMA) ? UMA_AUTO : UMA_NONE; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 163 | PostParams->MemConfig.UmaSize = 0; |
Richard Spiegel | 271b8a5 | 2018-11-06 16:32:28 -0700 | [diff] [blame] | 164 | PostParams->MemConfig.BottomIo = (uint16_t) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 165 | (CONFIG_BOTTOMIO_POSITION >> 24); |
| 166 | |
Richard Spiegel | 67c2a7b | 2017-11-09 16:04:35 -0700 | [diff] [blame] | 167 | SetMemParams(PostParams); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 168 | OemPostParams(PostParams); |
Richard Spiegel | 67c2a7b | 2017-11-09 16:04:35 -0700 | [diff] [blame] | 169 | 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 Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 174 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 175 | timestamp_add_now(TS_AGESA_INIT_POST_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 176 | status = amd_dispatch(PostParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 177 | timestamp_add_now(TS_AGESA_INIT_POST_DONE); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 178 | |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 179 | /* |
Marc Jones | 932b5bd | 2018-02-19 13:34:31 -0700 | [diff] [blame] | 180 | * 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 Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 186 | */ |
| 187 | uintptr_t top; |
Marc Jones | 932b5bd | 2018-02-19 13:34:31 -0700 | [diff] [blame] | 188 | if (PostParams->MemConfig.UmaBase && |
| 189 | (PostParams->MemConfig.UmaBase < ((4ull * GiB) >> 16))) |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 190 | top = PostParams->MemConfig.UmaBase << 16; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 191 | else |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 192 | top = PostParams->MemConfig.Sub4GCacheTop; |
| 193 | backup_top_of_low_cacheable(top); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 194 | |
Marc Jones | 932b5bd | 2018-02-19 13:34:31 -0700 | [diff] [blame] | 195 | save_uma_size(PostParams->MemConfig.UmaSize * 64 * KiB); |
| 196 | save_uma_base((u64)PostParams->MemConfig.UmaBase * 64 * KiB); |
| 197 | |
Marshall Dawson | 972f826 | 2017-12-14 09:08:02 -0700 | [diff] [blame] | 198 | print_init_post_settings(PostParams); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 199 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 200 | return status; |
| 201 | } |
| 202 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 203 | static AGESA_STATUS amd_init_env(AMD_ENV_PARAMS *EnvParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 204 | { |
| 205 | AGESA_STATUS status; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 206 | |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 207 | SetFchEnvParams(&EnvParams->FchInterface); |
| 208 | SetNbEnvParams(&EnvParams->GnbEnvConfiguration); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 209 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 210 | timestamp_add_now(TS_AGESA_INIT_ENV_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 211 | status = amd_dispatch(EnvParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 212 | timestamp_add_now(TS_AGESA_INIT_ENV_DONE); |
| 213 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 214 | return status; |
| 215 | } |
| 216 | |
Richard Spiegel | 271b8a5 | 2018-11-06 16:32:28 -0700 | [diff] [blame] | 217 | void *agesawrapper_getlateinitptr(int pick) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 218 | { |
| 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 Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 242 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 243 | static AGESA_STATUS amd_init_mid(AMD_MID_PARAMS *MidParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 244 | { |
| 245 | AGESA_STATUS status; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 246 | |
| 247 | /* Enable MMIO on AMD CPU Address Map Controller */ |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 248 | amd_initcpuio(); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 249 | |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 250 | SetFchMidParams(&MidParams->FchInterface); |
| 251 | SetNbMidParams(&MidParams->GnbMidConfiguration); |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 252 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 253 | timestamp_add_now(TS_AGESA_INIT_MID_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 254 | status = amd_dispatch(MidParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 255 | timestamp_add_now(TS_AGESA_INIT_MID_DONE); |
| 256 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 257 | return status; |
| 258 | } |
| 259 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 260 | static AGESA_STATUS amd_init_late(AMD_LATE_PARAMS *LateParams) |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 261 | { |
| 262 | AGESA_STATUS Status; |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 263 | |
Kyösti Mälkki | e737755 | 2018-06-21 16:20:55 +0300 | [diff] [blame] | 264 | const struct device *dev = pcidev_path_on_root(IOMMU_DEVFN); |
Martin Roth | 50f2e4c | 2018-10-29 11:16:53 -0600 | [diff] [blame] | 265 | if (dev && dev->enabled) { |
Felix Held | 78b0e7f | 2021-06-11 18:00:02 +0200 | [diff] [blame] | 266 | LateParams->GnbLateConfiguration.GnbIoapicId = GNB_IOAPIC_ID; |
| 267 | LateParams->GnbLateConfiguration.FchIoapicId = FCH_IOAPIC_ID; |
Martin Roth | 50f2e4c | 2018-10-29 11:16:53 -0600 | [diff] [blame] | 268 | } |
Marc Jones | bc94aea | 2018-09-26 09:57:08 -0600 | [diff] [blame] | 269 | |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 270 | timestamp_add_now(TS_AGESA_INIT_LATE_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 271 | Status = amd_dispatch(LateParams); |
Martin Roth | bc5c3e7 | 2017-12-09 10:40:45 -0700 | [diff] [blame] | 272 | timestamp_add_now(TS_AGESA_INIT_LATE_DONE); |
| 273 | |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 274 | DmiTable = LateParams->DmiTable; |
| 275 | AcpiPstate = LateParams->AcpiPState; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 276 | |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 277 | AcpiWheaMce = LateParams->AcpiWheaMce; |
| 278 | AcpiWheaCmc = LateParams->AcpiWheaCmc; |
| 279 | AcpiAlib = LateParams->AcpiAlib; |
| 280 | AcpiIvrs = LateParams->AcpiIvrs; |
| 281 | AcpiCrat = LateParams->AcpiCrat; |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 282 | |
Marshall Dawson | 857a387 | 2017-12-13 20:01:59 -0700 | [diff] [blame] | 283 | 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 Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 289 | |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 290 | return Status; |
| 291 | } |
Marc Jones | 1587dc8 | 2017-05-15 18:55:11 -0600 | [diff] [blame] | 292 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 293 | static AGESA_STATUS amd_init_rtb(AMD_RTB_PARAMS *RtbParams) |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 294 | { |
| 295 | AGESA_STATUS Status; |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 296 | |
| 297 | timestamp_add_now(TS_AGESA_INIT_RTB_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 298 | Status = amd_dispatch(RtbParams); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 299 | timestamp_add_now(TS_AGESA_INIT_RTB_DONE); |
| 300 | |
Kyösti Mälkki | 66cabe7 | 2018-07-01 03:48:39 +0300 | [diff] [blame] | 301 | if (Status != AGESA_SUCCESS) |
| 302 | return Status; |
| 303 | |
| 304 | if (OemS3Save(&RtbParams->S3DataBlock) != AGESA_SUCCESS) |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 305 | printk(BIOS_ERR, "S3 data not saved, resuming impossible\n"); |
| 306 | |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 307 | return Status; |
| 308 | } |
| 309 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 310 | static AGESA_STATUS amd_init_resume(AMD_RESUME_PARAMS *InitResumeParams) |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 311 | { |
| 312 | AGESA_STATUS status; |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 313 | |
Kyösti Mälkki | 66cabe7 | 2018-07-01 03:48:39 +0300 | [diff] [blame] | 314 | OemInitResume(&InitResumeParams->S3DataBlock); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 315 | |
| 316 | timestamp_add_now(TS_AGESA_INIT_RESUME_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 317 | status = amd_dispatch(InitResumeParams); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 318 | timestamp_add_now(TS_AGESA_INIT_RESUME_DONE); |
| 319 | |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 320 | return status; |
| 321 | } |
| 322 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 323 | static AGESA_STATUS amd_s3late_restore(AMD_S3LATE_PARAMS *S3LateParams) |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 324 | { |
| 325 | AGESA_STATUS Status; |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 326 | |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 327 | amd_initcpuio(); |
| 328 | |
Kyösti Mälkki | 66cabe7 | 2018-07-01 03:48:39 +0300 | [diff] [blame] | 329 | OemS3LateRestore(&S3LateParams->S3DataBlock); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 330 | |
| 331 | timestamp_add_now(TS_AGESA_S3_LATE_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 332 | Status = amd_dispatch(S3LateParams); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 333 | timestamp_add_now(TS_AGESA_S3_LATE_DONE); |
| 334 | |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 335 | return Status; |
| 336 | } |
| 337 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 338 | static AGESA_STATUS amd_s3final_restore(AMD_S3FINAL_PARAMS *S3FinalParams) |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 339 | { |
| 340 | AGESA_STATUS Status; |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 341 | |
Kyösti Mälkki | 66cabe7 | 2018-07-01 03:48:39 +0300 | [diff] [blame] | 342 | OemS3LateRestore(&S3FinalParams->S3DataBlock); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 343 | |
| 344 | timestamp_add_now(TS_AGESA_S3_FINAL_START); |
Kyösti Mälkki | 85b2ed5 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 345 | Status = amd_dispatch(S3FinalParams); |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 346 | timestamp_add_now(TS_AGESA_S3_FINAL_DONE); |
| 347 | |
Marshall Dawson | c2f6da0 | 2017-12-04 15:28:10 -0700 | [diff] [blame] | 348 | return Status; |
| 349 | } |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 350 | |
| 351 | static AGESA_STATUS romstage_dispatch(AMD_CONFIG_PARAMS *StdHeader) |
| 352 | { |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 353 | void *Params = StdHeader; |
| 354 | |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 355 | switch (StdHeader->Func) { |
| 356 | case AMD_INIT_RESET: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 357 | return amd_init_reset(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 358 | case AMD_INIT_EARLY: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 359 | return amd_init_early(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 360 | case AMD_INIT_POST: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 361 | return amd_init_post(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 362 | case AMD_INIT_RESUME: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 363 | return amd_init_resume(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 364 | default: |
| 365 | return AGESA_UNSUPPORTED; |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | static AGESA_STATUS ramstage_dispatch(AMD_CONFIG_PARAMS *StdHeader) |
| 370 | { |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 371 | void *Params = StdHeader; |
| 372 | |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 373 | switch (StdHeader->Func) { |
| 374 | case AMD_INIT_ENV: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 375 | return amd_init_env(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 376 | case AMD_INIT_MID: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 377 | return amd_init_mid(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 378 | case AMD_INIT_LATE: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 379 | return amd_init_late(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 380 | case AMD_INIT_RTB: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 381 | return amd_init_rtb(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 382 | case AMD_S3LATE_RESTORE: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 383 | return amd_s3late_restore(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 384 | case AMD_S3FINAL_RESTORE: |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 385 | return amd_s3final_restore(Params); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 386 | default: |
| 387 | return AGESA_UNSUPPORTED; |
| 388 | } |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 389 | |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 390 | } |
| 391 | |
| 392 | AGESA_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älkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 397 | 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älkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 404 | |
Kyösti Mälkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 405 | 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älkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 414 | 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älkki | fa6233d | 2018-06-28 16:55:29 +0300 | [diff] [blame] | 421 | amd_release_struct(aip); |
Kyösti Mälkki | 6e512c4 | 2018-06-14 06:57:05 +0300 | [diff] [blame] | 422 | return status; |
| 423 | } |