blob: 29423ef1ba80f2e97f47b49cfb91312923ca1084 [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>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +02009#include <halt.h>
10#include <program_loading.h>
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030011#include <romstage_handoff.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020012#include <smp/node.h>
13#include <string.h>
Kyösti Mälkki7369e832017-07-17 23:00:31 +030014#include <timestamp.h>
Kyösti Mälkkiba22e152016-11-23 06:47:15 +020015#include <northbridge/amd/agesa/agesa_helper.h>
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020016#include <northbridge/amd/agesa/state_machine.h>
17
Michał Żygowski1b12b642019-11-24 16:32:05 +010018void __weak board_BeforeAgesa(struct sysinfo *cb) { }
19
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020020static void fill_sysinfo(struct sysinfo *cb)
21{
22 memset(cb, 0, sizeof(*cb));
23 cb->s3resume = acpi_is_wakeup_s3();
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020024
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030025 agesa_set_interface(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020026}
27
Michał Żygowski1b12b642019-11-24 16:32:05 +010028/* APs will enter directly here from bootblock, bypassing verstage
29 * and potential fallback / normal bootflow detection.
30 */
31static void ap_romstage_main(void);
32
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020033static void romstage_main(void)
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020034{
Kyösti Mälkki63fac812017-09-02 16:41:43 +030035 struct postcar_frame pcf;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020036 struct sysinfo romstage_state;
37 struct sysinfo *cb = &romstage_state;
38 u8 initial_apic_id = (u8) (cpuid_ebx(1) >> 24);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030039 int cbmem_initted = 0;
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020040
41 fill_sysinfo(cb);
42
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020043 if (initial_apic_id == 0) {
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020044
Kyösti Mälkki7369e832017-07-17 23:00:31 +030045 timestamp_add_now(TS_START_ROMSTAGE);
46
Kyösti Mälkki3d5e1e52019-12-03 14:06:02 +020047 board_BeforeAgesa(cb);
Kyösti Mälkkidf7ff312016-11-25 12:02:00 +020048
49 console_init();
50 }
51
52 printk(BIOS_DEBUG, "APIC %02d: CPU Family_Model = %08x\n",
53 initial_apic_id, cpuid_eax(1));
54
Kyösti Mälkki520717d2019-12-15 21:37:48 +020055 set_ap_entry_ptr(ap_romstage_main);
Michał Żygowski1b12b642019-11-24 16:32:05 +010056
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030057 agesa_execute_state(cb, AMD_INIT_RESET);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020058
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030059 agesa_execute_state(cb, AMD_INIT_EARLY);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020060
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030061 timestamp_add_now(TS_BEFORE_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020062
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030063 if (!cb->s3resume)
64 agesa_execute_state(cb, AMD_INIT_POST);
65 else
66 agesa_execute_state(cb, AMD_INIT_RESUME);
Kyösti Mälkki7369e832017-07-17 23:00:31 +030067
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030068 timestamp_add_now(TS_AFTER_INITRAM);
Kyösti Mälkki28c4d2f2016-11-25 11:21:02 +020069
Kyösti Mälkki0f6c0b12017-09-07 06:46:46 +030070 /* Work around AGESA setting all memory as WB on normal
71 * boot path.
72 */
73 fixup_cbmem_to_UC(cb->s3resume);
Kyösti Mälkki63fac812017-09-02 16:41:43 +030074
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030075 cbmem_initted = !cbmem_recovery(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030076
77 if (cb->s3resume && !cbmem_initted) {
78 printk(BIOS_EMERG, "Unable to recover CBMEM\n");
79 halt();
80 }
81
Kyösti Mälkkief40c0c2017-09-02 17:25:21 +030082 romstage_handoff_init(cb->s3resume);
Kyösti Mälkkifb32be42017-04-12 04:31:54 +030083
Kyösti Mälkki63fac812017-09-02 16:41:43 +030084 postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
85 recover_postcar_frame(&pcf, cb->s3resume);
86
87 run_postcar_phase(&pcf);
88 /* We do not return. */
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020089}
90
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +020091static void ap_romstage_main(void)
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020092{
93 struct sysinfo romstage_state;
94 struct sysinfo *cb = &romstage_state;
95
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020096 fill_sysinfo(cb);
97
Kyösti Mälkkidc34a9d2019-11-28 15:04:17 +020098 agesa_execute_state(cb, AMD_INIT_RESET);
99
100 agesa_execute_state(cb, AMD_INIT_EARLY);
101
102 /* Not reached. */
103 halt();
104}
Kyösti Mälkki33d0fb82019-11-29 06:38:46 +0200105
Michał Żygowski1b12b642019-11-24 16:32:05 +0100106asmlinkage void car_stage_entry(void)
107{
108 romstage_main();
109}
Kyösti Mälkki2446c1e2020-07-09 07:13:37 +0300110
111void *cbmem_top_chipset(void)
112{
113 /* Top of CBMEM is at highest usable DRAM address below 4GiB. */
114 return (void *)restore_top_of_low_cacheable();
115}