aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/amd/agesa/romstage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/amd/agesa/romstage.c')
-rw-r--r--src/cpu/amd/agesa/romstage.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/cpu/amd/agesa/romstage.c b/src/cpu/amd/agesa/romstage.c
index f8b1e439d6..1b9757a934 100644
--- a/src/cpu/amd/agesa/romstage.c
+++ b/src/cpu/amd/agesa/romstage.c
@@ -18,7 +18,6 @@
#include <cbmem.h>
#include <cpu/amd/car.h>
#include <cpu/x86/bist.h>
-#include <cpu/x86/mtrr.h>
#include <console/console.h>
#include <halt.h>
#include <program_loading.h>
@@ -54,6 +53,7 @@ static void fill_sysinfo(struct sysinfo *cb)
void * asmlinkage romstage_main(unsigned long bist)
{
+ struct postcar_frame pcf;
struct sysinfo romstage_state;
struct sysinfo *cb = &romstage_state;
u8 initial_apic_id = (u8) (cpuid_ebx(1) >> 24);
@@ -100,6 +100,9 @@ void * asmlinkage romstage_main(unsigned long bist)
}
+ if (IS_ENABLED(CONFIG_POSTCAR_STAGE))
+ fixup_cbmem_to_UC(cb->s3resume);
+
cbmem_initted = !cbmem_recovery(cb->s3resume);
if (cb->s3resume && !cbmem_initted) {
@@ -107,16 +110,25 @@ void * asmlinkage romstage_main(unsigned long bist)
halt();
}
- uintptr_t stack_top = romstage_ram_stack_base(HIGH_ROMSTAGE_STACK_SIZE,
- ROMSTAGE_STACK_CBMEM);
- stack_top += HIGH_ROMSTAGE_STACK_SIZE;
-
romstage_handoff_init(cb->s3resume);
- printk(BIOS_DEBUG, "Move CAR stack.\n");
- return (void*)stack_top;
+ if (!IS_ENABLED(CONFIG_POSTCAR_STAGE)) {
+ uintptr_t stack_top = romstage_ram_stack_base(
+ HIGH_ROMSTAGE_STACK_SIZE, ROMSTAGE_STACK_CBMEM);
+ stack_top += HIGH_ROMSTAGE_STACK_SIZE;
+ printk(BIOS_DEBUG, "Move CAR stack.\n");
+ return (void*)stack_top;
+ }
+
+ postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
+ recover_postcar_frame(&pcf, cb->s3resume);
+
+ run_postcar_phase(&pcf);
+ /* We do not return. */
+ return NULL;
}
+#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
void asmlinkage romstage_after_car(void)
{
struct sysinfo romstage_state;
@@ -131,3 +143,4 @@ void asmlinkage romstage_after_car(void)
run_ramstage();
}
+#endif