blob: ee4d45e95b28d0c57a09a7a84a3b3258c75db5ca [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
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020032static void fill_sysinfo(struct sysinfo *cb)
33{
34 memset(cb, 0, sizeof(*cb));
35 cb->s3resume = acpi_is_wakeup_s3();
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020036
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030037 agesa_set_interface(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020038}
39
Michał Żygowski1b12b642019-11-24 16:32:05 +010040/* APs will enter directly here from bootblock, bypassing verstage
41 * and potential fallback / normal bootflow detection.
42 */
43static void ap_romstage_main(void);
44
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020045static void romstage_main(void)
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020046{
Kyösti Mälkki63fac812017-09-02 16:41:43 +030047 struct postcar_frame pcf;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020048 struct sysinfo romstage_state;
49 struct sysinfo *cb = &romstage_state;
50 u8 initial_apic_id = (u8) (cpuid_ebx(1) >> 24);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030051 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020052
Kyösti Mälkki9266ce92019-11-25 18:21:05 +020053 /* Enable PCI MMIO configuration. */
Michał Żygowski1b12b642019-11-24 16:32:05 +010054 if (CONFIG(ROMCC_BOOTBLOCK))
55 amd_initmmio();
Kyösti Mälkki9266ce92019-11-25 18:21:05 +020056
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020057 fill_sysinfo(cb);
58
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020059 if (initial_apic_id == 0) {
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020060
Michał Żygowski1b12b642019-11-24 16:32:05 +010061 if (CONFIG(ROMCC_BOOTBLOCK))
62 timestamp_init(timestamp_get());
Kyösti Mälkki7369e832017-07-17 23:00:31 +030063 timestamp_add_now(TS_START_ROMSTAGE);
64
Kyösti Mälkki3d5e1e52019-12-03 14:06:02 +020065 board_BeforeAgesa(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020066
67 console_init();
68 }
69
70 printk(BIOS_DEBUG, "APIC %02d: CPU Family_Model = %08x\n",
71 initial_apic_id, cpuid_eax(1));
72
Michał Żygowski1b12b642019-11-24 16:32:05 +010073 if (!CONFIG(ROMCC_BOOTBLOCK))
74 set_ap_entry_ptr(ap_romstage_main);
75
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030076 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020077
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030078 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020079
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030080 timestamp_add_now(TS_BEFORE_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020081
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030082 if (!cb->s3resume)
83 agesa_execute_state(cb, AMD_INIT_POST);
84 else
85 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030086
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030087 timestamp_add_now(TS_AFTER_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020088
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030089 /* Work around AGESA setting all memory as WB on normal
90 * boot path.
91 */
92 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030093
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030094 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030095
96 if (cb->s3resume && !cbmem_initted) {
97 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
98 halt();
99 }
100
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +0300101 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +0300102
Kyösti Mälkki63fac812017-09-02 16:41:43 +0300103 postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
104 recover_postcar_frame(&pcf, cb->s3resume);
105
106 run_postcar_phase(&pcf);
107 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200108}
109
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200110static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200111{
112 struct sysinfo romstage_state;
113 struct sysinfo *cb = &romstage_state;
114
115 /* Enable PCI MMIO configuration. */
Michał Żygowski1b12b642019-11-24 16:32:05 +0100116 if (CONFIG(ROMCC_BOOTBLOCK))
117 amd_initmmio();
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200118
119 fill_sysinfo(cb);
120
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +0200121 agesa_execute_state(cb, AMD_INIT_RESET);
122
123 agesa_execute_state(cb, AMD_INIT_EARLY);
124
125 /* Not reached. */
126 halt();
127}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200128
Michał Żygowski1b12b642019-11-24 16:32:05 +0100129#if CONFIG(ROMCC_BOOTBLOCK)
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200130/* This wrapper enables easy transition away from ROMCC_BOOTBLOCK
131 * keeping changes in cache_as_ram.S easy to manage.
132 */
133asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
134{
135 romstage_main();
136}
137
138asmlinkage void ap_bootblock_c_entry(void)
139{
140 ap_romstage_main();
141}
Michał Żygowski1b12b642019-11-24 16:32:05 +0100142#else
143asmlinkage void car_stage_entry(void)
144{
145 romstage_main();
146}
147#endif