blob: 35b2778e68ba53c89c4f8ab7dbebe561e4a9c833 [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{
36 struct sysinfo romstage_state;
37 struct sysinfo *cb = &romstage_state;
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030038 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020039
Jakub Czapigaad6157e2022-02-15 11:50:31 +010040 timestamp_add_now(TS_ROMSTAGE_START);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020041
Arthur Heymansb0b12dd2021-05-29 07:08:36 +020042 console_init();
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020043
Arthur Heymans78ab06a2021-05-29 06:58:38 +020044 printk(BIOS_DEBUG, "APIC %02u: CPU Family_Model = %08x\n",
Arthur Heymansb0b12dd2021-05-29 07:08:36 +020045 initial_lapicid(), cpuid_eax(1));
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020046
Arthur Heymansa552cfc2021-05-29 07:11:10 +020047 fill_sysinfo(cb);
48
49 board_BeforeAgesa(cb);
50
Kyösti Mälkki520717d2019-12-15 21:37:48 +020051 set_ap_entry_ptr(ap_romstage_main);
Michał Żygowski1b12b642019-11-24 16:32:05 +010052
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030053 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020054
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030055 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020056
Jakub Czapigaad6157e2022-02-15 11:50:31 +010057 timestamp_add_now(TS_INITRAM_START);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020058
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030059 if (!cb->s3resume)
60 agesa_execute_state(cb, AMD_INIT_POST);
61 else
62 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030063
Jakub Czapigaad6157e2022-02-15 11:50:31 +010064 timestamp_add_now(TS_INITRAM_END);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020065
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030066 /* Work around AGESA setting all memory as WB on normal
67 * boot path.
68 */
69 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030070
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030071 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030072
73 if (cb->s3resume && !cbmem_initted) {
74 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
75 halt();
76 }
77
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030078 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030079
Arthur Heymans876a1b42022-02-15 11:06:10 +010080 prepare_and_run_postcar();
Kyösti Mälkki63fac812017-09-02 16:41:43 +030081 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020082}
83
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020084static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020085{
86 struct sysinfo romstage_state;
87 struct sysinfo *cb = &romstage_state;
88
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020089 fill_sysinfo(cb);
90
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020091 agesa_execute_state(cb, AMD_INIT_RESET);
92
93 agesa_execute_state(cb, AMD_INIT_EARLY);
94
95 /* Not reached. */
96 halt();
97}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020098
Michał Żygowski1b12b642019-11-24 16:32:05 +010099asmlinkage void car_stage_entry(void)
100{
101 romstage_main();
102}
Kyösti Mälkki2446c1e2020-07-09 07:13:37 +0300103
104void *cbmem_top_chipset(void)
105{
106 /* Top of CBMEM is at highest usable DRAM address below 4GiB. */
107 return (void *)restore_top_of_low_cacheable();
108}