blob: 6c90ac2a12ecd4f66ac1b839e3a54cc3b5b0b081 [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02003
Michał Żygowski1b12b642019-11-24 16:32:05 +01004#include <amdblocks/biosram.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02005#include <arch/acpi.h>
6#include <arch/cpu.h>
Kyösti Mälkkia963acd2019-08-16 20:34:25 +03007#include <arch/romstage.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +02008#include <cbmem.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02009#include <console/console.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;
39 u8 initial_apic_id = (u8) (cpuid_ebx(1) >> 24);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030040 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020041
42 fill_sysinfo(cb);
43
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020044 if (initial_apic_id == 0) {
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020045
Kyösti Mälkki7369e832017-07-17 23:00:31 +030046 timestamp_add_now(TS_START_ROMSTAGE);
47
Kyösti Mälkki3d5e1e52019-12-03 14:06:02 +020048 board_BeforeAgesa(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020049
50 console_init();
51 }
52
53 printk(BIOS_DEBUG, "APIC %02d: CPU Family_Model = %08x\n",
54 initial_apic_id, cpuid_eax(1));
55
Kyösti Mälkki520717d2019-12-15 21:37:48 +020056 set_ap_entry_ptr(ap_romstage_main);
Michał Żygowski1b12b642019-11-24 16:32:05 +010057
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030058 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020059
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030060 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020061
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030062 timestamp_add_now(TS_BEFORE_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020063
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030064 if (!cb->s3resume)
65 agesa_execute_state(cb, AMD_INIT_POST);
66 else
67 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030068
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030069 timestamp_add_now(TS_AFTER_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020070
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030071 /* Work around AGESA setting all memory as WB on normal
72 * boot path.
73 */
74 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030075
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030076 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030077
78 if (cb->s3resume && !cbmem_initted) {
79 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
80 halt();
81 }
82
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030083 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030084
Kyösti Mälkki63fac812017-09-02 16:41:43 +030085 postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
86 recover_postcar_frame(&pcf, cb->s3resume);
87
88 run_postcar_phase(&pcf);
89 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020090}
91
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020092static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020093{
94 struct sysinfo romstage_state;
95 struct sysinfo *cb = &romstage_state;
96
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020097 fill_sysinfo(cb);
98
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020099 agesa_execute_state(cb, AMD_INIT_RESET);
100
101 agesa_execute_state(cb, AMD_INIT_EARLY);
102
103 /* Not reached. */
104 halt();
105}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200106
Michał Żygowski1b12b642019-11-24 16:32:05 +0100107asmlinkage void car_stage_entry(void)
108{
109 romstage_main();
110}