blob: dbf8bd60706fc21ba623f88bd16ad05e6ff0bd07 [file] [log] [blame]
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02001/*
2 * This file is part of the coreboot project.
3 *
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +02004 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
Michał Żygowski1b12b642019-11-24 16:32:05 +010014#include <amdblocks/biosram.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020015#include <arch/acpi.h>
16#include <arch/cpu.h>
Kyösti Mälkkia963acd2019-08-16 20:34:25 +030017#include <arch/romstage.h>
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020018#include <bootblock_common.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020019#include <cbmem.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020020#include <console/console.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020021#include <halt.h>
22#include <program_loading.h>
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030023#include <romstage_handoff.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020024#include <smp/node.h>
25#include <string.h>
Kyösti Mälkki7369e832017-07-17 23:00:31 +030026#include <timestamp.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020027#include <northbridge/amd/agesa/agesa_helper.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020028#include <northbridge/amd/agesa/state_machine.h>
29
Michał Żygowski1b12b642019-11-24 16:32:05 +010030void __weak board_BeforeAgesa(struct sysinfo *cb) { }
31
Aaron Durbin64031672018-04-21 14:45:32 -060032void __weak platform_once(struct sysinfo *cb)
Kyösti Mälkkia3d644f2017-07-17 11:58:06 +030033{
34 board_BeforeAgesa(cb);
35}
36
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020037static void fill_sysinfo(struct sysinfo *cb)
38{
39 memset(cb, 0, sizeof(*cb));
40 cb->s3resume = acpi_is_wakeup_s3();
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020041
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030042 agesa_set_interface(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020043}
44
Michał Żygowski1b12b642019-11-24 16:32:05 +010045/* APs will enter directly here from bootblock, bypassing verstage
46 * and potential fallback / normal bootflow detection.
47 */
48static void ap_romstage_main(void);
49
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020050static void romstage_main(void)
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020051{
Kyösti Mälkki63fac812017-09-02 16:41:43 +030052 struct postcar_frame pcf;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020053 struct sysinfo romstage_state;
54 struct sysinfo *cb = &romstage_state;
55 u8 initial_apic_id = (u8) (cpuid_ebx(1) >> 24);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030056 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020057
Kyösti Mälkki9266ce92019-11-25 18:21:05 +020058 /* Enable PCI MMIO configuration. */
Michał Żygowski1b12b642019-11-24 16:32:05 +010059 if (CONFIG(ROMCC_BOOTBLOCK))
60 amd_initmmio();
Kyösti Mälkki9266ce92019-11-25 18:21:05 +020061
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020062 fill_sysinfo(cb);
63
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020064 if (initial_apic_id == 0) {
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020065
Michał Żygowski1b12b642019-11-24 16:32:05 +010066 if (CONFIG(ROMCC_BOOTBLOCK))
67 timestamp_init(timestamp_get());
Kyösti Mälkki7369e832017-07-17 23:00:31 +030068 timestamp_add_now(TS_START_ROMSTAGE);
69
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020070 platform_once(cb);
71
72 console_init();
73 }
74
75 printk(BIOS_DEBUG, "APIC %02d: CPU Family_Model = %08x\n",
76 initial_apic_id, cpuid_eax(1));
77
Michał Żygowski1b12b642019-11-24 16:32:05 +010078 if (!CONFIG(ROMCC_BOOTBLOCK))
79 set_ap_entry_ptr(ap_romstage_main);
80
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030081 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020082
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030083 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020084
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030085 timestamp_add_now(TS_BEFORE_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020086
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030087 if (!cb->s3resume)
88 agesa_execute_state(cb, AMD_INIT_POST);
89 else
90 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030091
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030092 timestamp_add_now(TS_AFTER_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020093
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030094 /* Work around AGESA setting all memory as WB on normal
95 * boot path.
96 */
97 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030098
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030099 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +0300100
101 if (cb->s3resume && !cbmem_initted) {
102 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
103 halt();
104 }
105
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +0300106 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +0300107
Kyösti Mälkki63fac812017-09-02 16:41:43 +0300108 postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
109 recover_postcar_frame(&pcf, cb->s3resume);
110
111 run_postcar_phase(&pcf);
112 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200113}
114
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200115static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200116{
117 struct sysinfo romstage_state;
118 struct sysinfo *cb = &romstage_state;
119
120 /* Enable PCI MMIO configuration. */
Michał Żygowski1b12b642019-11-24 16:32:05 +0100121 if (CONFIG(ROMCC_BOOTBLOCK))
122 amd_initmmio();
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200123
124 fill_sysinfo(cb);
125
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200126 agesa_execute_state(cb, AMD_INIT_RESET);
127
128 agesa_execute_state(cb, AMD_INIT_EARLY);
129
130 /* Not reached. */
131 halt();
132}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200133
Michał Żygowski1b12b642019-11-24 16:32:05 +0100134#if CONFIG(ROMCC_BOOTBLOCK)
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200135/* This wrapper enables easy transition away from ROMCC_BOOTBLOCK
136 * keeping changes in cache_as_ram.S easy to manage.
137 */
138asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
139{
140 romstage_main();
141}
142
143asmlinkage void ap_bootblock_c_entry(void)
144{
145 ap_romstage_main();
146}
Michał Żygowski1b12b642019-11-24 16:32:05 +0100147#else
148asmlinkage void car_stage_entry(void)
149{
150 romstage_main();
151}
152#endif