blob: 132cb3e48533b9f351d60698cdffa6e42b4be359 [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Elyes Haouas5318d9c2022-10-31 14:06:21 +01004#include <amdblocks/biosram.h>
Kyösti Mälkkia963acd2019-08-16 20:34:25 +03005#include <arch/romstage.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +02006#include <cbmem.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02007#include <console/console.h>
Elyes Haouas5318d9c2022-10-31 14:06:21 +01008#include <cpu/cpu.h>
Arthur Heymans78ab06a2021-05-29 06:58:38 +02009#include <cpu/x86/lapic.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020010#include <halt.h>
Elyes Haouas5318d9c2022-10-31 14:06:21 +010011#include <northbridge/amd/agesa/agesa_helper.h>
12#include <northbridge/amd/agesa/state_machine.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020013#include <program_loading.h>
Elyes Haouas5318d9c2022-10-31 14:06:21 +010014#include <romstage_common.h>
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030015#include <romstage_handoff.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020016#include <smp/node.h>
17#include <string.h>
Kyösti Mälkki7369e832017-07-17 23:00:31 +030018#include <timestamp.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020019
Michał Żygowski1b12b642019-11-24 16:32:05 +010020void __weak board_BeforeAgesa(struct sysinfo *cb) { }
21
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020022static void fill_sysinfo(struct sysinfo *cb)
23{
24 memset(cb, 0, sizeof(*cb));
25 cb->s3resume = acpi_is_wakeup_s3();
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020026
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030027 agesa_set_interface(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020028}
29
Michał Żygowski1b12b642019-11-24 16:32:05 +010030/* APs will enter directly here from bootblock, bypassing verstage
31 * and potential fallback / normal bootflow detection.
32 */
33static void ap_romstage_main(void);
34
Arthur Heymansbab9e2e2021-05-29 07:30:33 +020035void __noreturn romstage_main(void)
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020036{
37 struct sysinfo romstage_state;
38 struct sysinfo *cb = &romstage_state;
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030039 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020040
Arthur Heymans78ab06a2021-05-29 06:58:38 +020041 printk(BIOS_DEBUG, "APIC %02u: CPU Family_Model = %08x\n",
Arthur Heymansb0b12dd2021-05-29 07:08:36 +020042 initial_lapicid(), cpuid_eax(1));
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020043
Arthur Heymansa552cfc2021-05-29 07:11:10 +020044 fill_sysinfo(cb);
45
46 board_BeforeAgesa(cb);
47
Kyösti Mälkki520717d2019-12-15 21:37:48 +020048 set_ap_entry_ptr(ap_romstage_main);
Michał Żygowski1b12b642019-11-24 16:32:05 +010049
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030050 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020051
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030052 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020053
Jakub Czapigaad6157e2022-02-15 11:50:31 +010054 timestamp_add_now(TS_INITRAM_START);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020055
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030056 if (!cb->s3resume)
57 agesa_execute_state(cb, AMD_INIT_POST);
58 else
59 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030060
Jakub Czapigaad6157e2022-02-15 11:50:31 +010061 timestamp_add_now(TS_INITRAM_END);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020062
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030063 /* Work around AGESA setting all memory as WB on normal
64 * boot path.
65 */
66 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030067
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030068 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030069
70 if (cb->s3resume && !cbmem_initted) {
71 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
72 halt();
73 }
74
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030075 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030076
Arthur Heymans876a1b42022-02-15 11:06:10 +010077 prepare_and_run_postcar();
Kyösti Mälkki63fac812017-09-02 16:41:43 +030078 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020079}
80
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020081static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020082{
83 struct sysinfo romstage_state;
84 struct sysinfo *cb = &romstage_state;
85
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020086 fill_sysinfo(cb);
87
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020088 agesa_execute_state(cb, AMD_INIT_RESET);
89
90 agesa_execute_state(cb, AMD_INIT_EARLY);
91
92 /* Not reached. */
93 halt();
94}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020095
Elyes Haouas799c3212022-11-09 14:00:44 +010096uintptr_t cbmem_top_chipset(void)
Kyösti Mälkki2446c1e2020-07-09 07:13:37 +030097{
98 /* Top of CBMEM is at highest usable DRAM address below 4GiB. */
Elyes Haouas799c3212022-11-09 14:00:44 +010099 return restore_top_of_low_cacheable();
Kyösti Mälkki2446c1e2020-07-09 07:13:37 +0300100}