AGESA: Drop CAR teardown without POSTCAR_STAGE
Except for family15, all AGESA boards have moved away from AGESA_LEGACY_WRAPPER, thus they all have POSTCAR_STAGE now. AGESA family15 boards remain at AGESA_LEGACY=y, but those boards have per-board romstage.c files and are not touched here. Change-Id: If750766cc7a9ecca4641a8f14e1ab15e9abb7ff5 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/18632 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
@@ -31,6 +31,12 @@
|
|||||||
#if IS_ENABLED(CONFIG_LATE_CBMEM_INIT)
|
#if IS_ENABLED(CONFIG_LATE_CBMEM_INIT)
|
||||||
#error "Only EARLY_CBMEM_INIT is supported."
|
#error "Only EARLY_CBMEM_INIT is supported."
|
||||||
#endif
|
#endif
|
||||||
|
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
||||||
|
#error "Only POSTCAR_STAGE is supported."
|
||||||
|
#endif
|
||||||
|
#if HAS_LEGACY_WRAPPER
|
||||||
|
#error "LEGACY_WRAPPER code not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
void asmlinkage early_all_cores(void)
|
void asmlinkage early_all_cores(void)
|
||||||
{
|
{
|
||||||
@@ -47,8 +53,7 @@ static void fill_sysinfo(struct sysinfo *cb)
|
|||||||
memset(cb, 0, sizeof(*cb));
|
memset(cb, 0, sizeof(*cb));
|
||||||
cb->s3resume = acpi_is_wakeup_s3();
|
cb->s3resume = acpi_is_wakeup_s3();
|
||||||
|
|
||||||
if (!HAS_LEGACY_WRAPPER)
|
agesa_set_interface(cb);
|
||||||
agesa_set_interface(cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void * asmlinkage romstage_main(unsigned long bist)
|
void * asmlinkage romstage_main(unsigned long bist)
|
||||||
@@ -77,31 +82,25 @@ void * asmlinkage romstage_main(unsigned long bist)
|
|||||||
/* Halt if there was a built in self test failure */
|
/* Halt if there was a built in self test failure */
|
||||||
report_bist_failure(bist);
|
report_bist_failure(bist);
|
||||||
|
|
||||||
if (!HAS_LEGACY_WRAPPER) {
|
agesa_execute_state(cb, AMD_INIT_RESET);
|
||||||
|
|
||||||
agesa_execute_state(cb, AMD_INIT_RESET);
|
agesa_execute_state(cb, AMD_INIT_EARLY);
|
||||||
|
|
||||||
agesa_execute_state(cb, AMD_INIT_EARLY);
|
timestamp_add_now(TS_BEFORE_INITRAM);
|
||||||
|
|
||||||
timestamp_add_now(TS_BEFORE_INITRAM);
|
if (!cb->s3resume)
|
||||||
|
agesa_execute_state(cb, AMD_INIT_POST);
|
||||||
|
else
|
||||||
|
agesa_execute_state(cb, AMD_INIT_RESUME);
|
||||||
|
|
||||||
if (!cb->s3resume)
|
/* FIXME: Detect if TSC frequency changed during raminit? */
|
||||||
agesa_execute_state(cb, AMD_INIT_POST);
|
timestamp_rescale_table(1, 4);
|
||||||
else
|
timestamp_add_now(TS_AFTER_INITRAM);
|
||||||
agesa_execute_state(cb, AMD_INIT_RESUME);
|
|
||||||
|
|
||||||
/* FIXME: Detect if TSC frequency changed during raminit? */
|
/* Work around AGESA setting all memory as WB on normal
|
||||||
timestamp_rescale_table(1, 4);
|
* boot path.
|
||||||
timestamp_add_now(TS_AFTER_INITRAM);
|
*/
|
||||||
|
fixup_cbmem_to_UC(cb->s3resume);
|
||||||
} else {
|
|
||||||
|
|
||||||
agesa_main(cb);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_POSTCAR_STAGE))
|
|
||||||
fixup_cbmem_to_UC(cb->s3resume);
|
|
||||||
|
|
||||||
cbmem_initted = !cbmem_recovery(cb->s3resume);
|
cbmem_initted = !cbmem_recovery(cb->s3resume);
|
||||||
|
|
||||||
@@ -112,14 +111,6 @@ void * asmlinkage romstage_main(unsigned long bist)
|
|||||||
|
|
||||||
romstage_handoff_init(cb->s3resume);
|
romstage_handoff_init(cb->s3resume);
|
||||||
|
|
||||||
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);
|
postcar_frame_init(&pcf, HIGH_ROMSTAGE_STACK_SIZE);
|
||||||
recover_postcar_frame(&pcf, cb->s3resume);
|
recover_postcar_frame(&pcf, cb->s3resume);
|
||||||
|
|
||||||
@@ -127,20 +118,3 @@ void * asmlinkage romstage_main(unsigned long bist)
|
|||||||
/* We do not return. */
|
/* We do not return. */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
|
||||||
void asmlinkage romstage_after_car(void)
|
|
||||||
{
|
|
||||||
struct sysinfo romstage_state;
|
|
||||||
struct sysinfo *cb = &romstage_state;
|
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "CAR disabled.\n");
|
|
||||||
|
|
||||||
fill_sysinfo(cb);
|
|
||||||
|
|
||||||
if (HAS_LEGACY_WRAPPER)
|
|
||||||
agesa_postcar(cb);
|
|
||||||
|
|
||||||
run_ramstage();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@@ -611,13 +611,6 @@ fam12_enable_stack_hook_exit:
|
|||||||
* Return any family specific controls to their 'standard'
|
* Return any family specific controls to their 'standard'
|
||||||
* settings for using cache with main memory.
|
* settings for using cache with main memory.
|
||||||
*
|
*
|
||||||
* Note: Customized for coreboot:
|
|
||||||
* A wbinvd is used to send cache to memory. The existing stack is preserved
|
|
||||||
* at its original location and additional information is preserved (e.g.
|
|
||||||
* coreboot CAR globals, heap structures, etc.). This implementation should
|
|
||||||
* NOT be used with S3 resume IF the stack/cache area is not reserved and
|
|
||||||
* over system memory.
|
|
||||||
*
|
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
||||||
* Outputs:
|
* Outputs:
|
||||||
@@ -672,18 +665,7 @@ fam12_enable_stack_hook_exit:
|
|||||||
mov %ax, %bx # Save INVD -> WBINVD bit
|
mov %ax, %bx # Save INVD -> WBINVD bit
|
||||||
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
invd # Clear the cache tag RAMs
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# Send cache to memory. Preserve stack and coreboot CAR globals.
|
|
||||||
# This shouldn't be used with S3 resume IF the stack/cache area is
|
|
||||||
# not reserved and over system memory.
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
|
||||||
wbinvd
|
|
||||||
#else
|
|
||||||
invd
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mov %bx, %ax # Restore INVD -> WBINVD bit
|
mov %bx, %ax # Restore INVD -> WBINVD bit
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
|
||||||
|
@@ -770,13 +770,6 @@ fam14_enable_stack_hook_exit:
|
|||||||
* Return any family specific controls to their 'standard'
|
* Return any family specific controls to their 'standard'
|
||||||
* settings for using cache with main memory.
|
* settings for using cache with main memory.
|
||||||
*
|
*
|
||||||
* Note: Customized for coreboot:
|
|
||||||
* A wbinvd is used to send cache to memory. The existing stack is preserved
|
|
||||||
* at its original location and additional information is preserved (e.g.
|
|
||||||
* coreboot CAR globals, heap structures, etc.). This implementation should
|
|
||||||
* NOT be used with S3 resume IF the stack/cache area is not reserved and
|
|
||||||
* over system memory.
|
|
||||||
*
|
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
||||||
* Outputs:
|
* Outputs:
|
||||||
@@ -820,18 +813,7 @@ fam14_enable_stack_hook_exit:
|
|||||||
_RDMSR
|
_RDMSR
|
||||||
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
invd # Clear the cache tag RAMs
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# Send cache to memory. Preserve stack and coreboot CAR globals.
|
|
||||||
# This shouldn't be used with S3 resume IF the stack/cache area is
|
|
||||||
# not reserved and over system memory.
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
|
||||||
wbinvd
|
|
||||||
#else
|
|
||||||
invd
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bts $INVD_WBINVD, %eax # Turn on Conversion of INVD to WBINVD
|
bts $INVD_WBINVD, %eax # Turn on Conversion of INVD to WBINVD
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
|
||||||
|
@@ -1033,13 +1033,6 @@ fam15_enable_stack_hook_exit:
|
|||||||
* Return any family specific controls to their 'standard'
|
* Return any family specific controls to their 'standard'
|
||||||
* settings for using cache with main memory.
|
* settings for using cache with main memory.
|
||||||
*
|
*
|
||||||
* Note: Customized for coreboot:
|
|
||||||
* A wbinvd is used to send cache to memory. The existing stack is preserved
|
|
||||||
* at its original location and additional information is preserved (e.g.
|
|
||||||
* coreboot CAR globals, heap structures, etc.). This implementation should
|
|
||||||
* NOT be used with S3 resume IF the stack/cache area is not reserved and
|
|
||||||
* over system memory.
|
|
||||||
*
|
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
* ESI - [31:24] flags; [15,8]= Node#; [7,0]= core#
|
||||||
* Outputs:
|
* Outputs:
|
||||||
@@ -1257,18 +1250,7 @@ fam15_disable_stack_remote_read_exit:
|
|||||||
_RDMSR
|
_RDMSR
|
||||||
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
invd # Clear the cache tag RAMs
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# Send cache to memory. Preserve stack and coreboot CAR globals.
|
|
||||||
# This shouldn't be used with S3 resume IF the stack/cache area is
|
|
||||||
# not reserved and over system memory.
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
|
||||||
wbinvd
|
|
||||||
#else
|
|
||||||
invd
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#.if (bh == 01h) || (bh == 03h) ; Is this TN or KM?
|
#.if (bh == 01h) || (bh == 03h) ; Is this TN or KM?
|
||||||
cmp $01, %bh
|
cmp $01, %bh
|
||||||
jz 4f
|
jz 4f
|
||||||
@@ -1901,17 +1883,8 @@ ClearTheStack: # Stack base is in SS, stack pointer is
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* AMD_DISABLE_STACK: Implementation is modified for coreboot from
|
* AMD_DISABLE_STACK: Destroy the stack inside the cache. This routine
|
||||||
* the original AMD intent. A WBINVD is used in the HOOK
|
* should only be executed on the BSP
|
||||||
* to send dirty cache contents to DRAM backing before
|
|
||||||
* disabling cache-as-ram. This is not safe for S3 resume.
|
|
||||||
*
|
|
||||||
* todo:
|
|
||||||
* * rework PI/AGESA source to set DRAM to UC to send
|
|
||||||
* writes directly to memory
|
|
||||||
* * move DCACHE_BASE or use postcar stage for teardown
|
|
||||||
* to eliminate car_migrated problem that will occur
|
|
||||||
* after wbinvd is changed back to invd
|
|
||||||
*
|
*
|
||||||
* In:
|
* In:
|
||||||
* none
|
* none
|
||||||
|
@@ -269,13 +269,6 @@ MSR_MASK = ((1 << MTRR_DEF_TYPE_EN)+(1 << MTRR_DEF_TYPE_FIX_EN))
|
|||||||
* Read family specific values to determine the node and core
|
* Read family specific values to determine the node and core
|
||||||
* numbers for the core executing this code.
|
* numbers for the core executing this code.
|
||||||
*
|
*
|
||||||
* Note: Customized for coreboot:
|
|
||||||
* A wbinvd is used to send cache to memory. The existing stack is preserved
|
|
||||||
* at its original location and additional information is preserved (e.g.
|
|
||||||
* coreboot CAR globals, heap structures, etc.). This implementation should
|
|
||||||
* NOT be used with S3 resume IF the stack/cache area is not reserved and
|
|
||||||
* over system memory.
|
|
||||||
*
|
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* none
|
* none
|
||||||
* Outputs:
|
* Outputs:
|
||||||
@@ -609,17 +602,7 @@ fam16_disable_stack_remote_read_exit:
|
|||||||
_RDMSR
|
_RDMSR
|
||||||
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
btr $INVD_WBINVD, %eax # Disable INVD -> WBINVD conversion
|
||||||
_WRMSR
|
_WRMSR
|
||||||
|
invd # Clear the cache tag RAMs
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# Send cache to memory. Preserve stack and coreboot CAR globals.
|
|
||||||
# This shouldn't be used with S3 resume IF the stack/cache area is
|
|
||||||
# not reserved and over system memory.
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
#if !IS_ENABLED(CONFIG_POSTCAR_STAGE)
|
|
||||||
wbinvd
|
|
||||||
#else
|
|
||||||
invd
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#Do Standard Family 16 work
|
#Do Standard Family 16 work
|
||||||
mov $HWCR, %ecx # MSR:C001_0015h
|
mov $HWCR, %ecx # MSR:C001_0015h
|
||||||
@@ -1264,17 +1247,8 @@ ClearTheStack: # Stack base is in SS, stack pointer is
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* AMD_DISABLE_STACK: Implementation is modified for coreboot from
|
* AMD_DISABLE_STACK: Destroy the stack inside the cache. This routine
|
||||||
* the original AMD intent. A WBINVD is used in the HOOK
|
* should only be executed on the BSP
|
||||||
* to send dirty cache contents to DRAM backing before
|
|
||||||
* disabling cache-as-ram. This is not safe for S3 resume.
|
|
||||||
*
|
|
||||||
* todo:
|
|
||||||
* * rework PI/AGESA source to set DRAM to UC to send
|
|
||||||
* writes directly to memory
|
|
||||||
* * move DCACHE_BASE or use postcar stage for teardown
|
|
||||||
* to eliminate car_migrated problem that will occur
|
|
||||||
* after wbinvd is changed back to invd
|
|
||||||
*
|
*
|
||||||
* In:
|
* In:
|
||||||
* none
|
* none
|
||||||
|
Reference in New Issue
Block a user