blob: ec798eece7fd93bd3f35cebbb4273de701d05735 [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
Michał Żygowski1b12b642019-11-24 16:32:05 +01003#include <amdblocks/biosram.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07004#include <acpi/acpi.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02005#include <arch/cpu.h>
Kyösti Mälkkia963acd2019-08-16 20:34:25 +03006#include <arch/romstage.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +02007#include <cbmem.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02008#include <console/console.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>
11#include <program_loading.h>
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030012#include <romstage_handoff.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020013#include <smp/node.h>
14#include <string.h>
Kyösti Mälkki7369e832017-07-17 23:00:31 +030015#include <timestamp.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020016#include <northbridge/amd/agesa/agesa_helper.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020017#include <northbridge/amd/agesa/state_machine.h>
18
Michał Żygowski1b12b642019-11-24 16:32:05 +010019void __weak board_BeforeAgesa(struct sysinfo *cb) { }
20
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020021static void fill_sysinfo(struct sysinfo *cb)
22{
23 memset(cb, 0, sizeof(*cb));
24 cb->s3resume = acpi_is_wakeup_s3();
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020025
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030026 agesa_set_interface(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020027}
28
Michał Żygowski1b12b642019-11-24 16:32:05 +010029/* APs will enter directly here from bootblock, bypassing verstage
30 * and potential fallback / normal bootflow detection.
31 */
32static void ap_romstage_main(void);
33
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020034static void romstage_main(void)
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020035{
Kyösti Mälkki63fac812017-09-02 16:41:43 +030036 struct postcar_frame pcf;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020037 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
Jakub Czapigaad6157e2022-02-15 11:50:31 +010041 timestamp_add_now(TS_ROMSTAGE_START);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020042
Arthur Heymansb0b12dd2021-05-29 07:08:36 +020043 console_init();
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020044
Arthur Heymans78ab06a2021-05-29 06:58:38 +020045 printk(BIOS_DEBUG, "APIC %02u: CPU Family_Model = %08x\n",
Arthur Heymansb0b12dd2021-05-29 07:08:36 +020046 initial_lapicid(), cpuid_eax(1));
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020047
Arthur Heymansa552cfc2021-05-29 07:11:10 +020048 fill_sysinfo(cb);
49
50 board_BeforeAgesa(cb);
51
Kyösti Mälkki520717d2019-12-15 21:37:48 +020052 set_ap_entry_ptr(ap_romstage_main);
Michał Żygowski1b12b642019-11-24 16:32:05 +010053
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030054 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020055
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030056 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020057
Jakub Czapigaad6157e2022-02-15 11:50:31 +010058 timestamp_add_now(TS_INITRAM_START);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020059
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030060 if (!cb->s3resume)
61 agesa_execute_state(cb, AMD_INIT_POST);
62 else
63 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030064
Jakub Czapigaad6157e2022-02-15 11:50:31 +010065 timestamp_add_now(TS_INITRAM_END);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020066
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030067 /* Work around AGESA setting all memory as WB on normal
68 * boot path.
69 */
70 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030071
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030072 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030073
74 if (cb->s3resume && !cbmem_initted) {
75 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
76 halt();
77 }
78
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030079 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030080
Kyösti Mälkki63fac812017-09-02 16:41:43 +030081 postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
82 recover_postcar_frame(&pcf, cb->s3resume);
83
84 run_postcar_phase(&pcf);
85 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020086}
87
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020088static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020089{
90 struct sysinfo romstage_state;
91 struct sysinfo *cb = &romstage_state;
92
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020093 fill_sysinfo(cb);
94
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020095 agesa_execute_state(cb, AMD_INIT_RESET);
96
97 agesa_execute_state(cb, AMD_INIT_EARLY);
98
99 /* Not reached. */
100 halt();
101}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200102
Michał Żygowski1b12b642019-11-24 16:32:05 +0100103asmlinkage void car_stage_entry(void)
104{
105 romstage_main();
106}
Kyösti Mälkki2446c1e2020-07-09 07:13:37 +0300107
108void *cbmem_top_chipset(void)
109{
110 /* Top of CBMEM is at highest usable DRAM address below 4GiB. */
111 return (void *)restore_top_of_low_cacheable();
112}