soc/amd/common: Allow AGESA file split for pre- and post-memory

By splitting the binary files for platform initialization, the
post-memory code can be modified to stop executing in place (--xip).

This change creates two separate sections in CBFS for AGESA and loads
the appropriate file at the correct stage.

BUG=b:68141063
TEST=Booted kahlee with split agesa enabled.

Change-Id: I2fa423df164037bc3738476fd2a34522df279e34
Signed-off-by: Justin TerAvest <teravest@chromium.org>
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/22974
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Justin TerAvest 2017-12-22 15:15:02 -07:00 committed by Martin Roth
parent a71c66a52e
commit 922619512d
3 changed files with 67 additions and 2 deletions

View File

@ -20,6 +20,7 @@
#include <delay.h> #include <delay.h>
#include <cpu/x86/mtrr.h> #include <cpu/x86/mtrr.h>
#include <amdblocks/BiosCallOuts.h> #include <amdblocks/BiosCallOuts.h>
#include <rules.h>
#include <string.h> #include <string.h>
#include <timestamp.h> #include <timestamp.h>
@ -423,15 +424,26 @@ static int agesa_locate_stage_file(const char *name, struct region_device *rdev)
region_device_sz(rdev) - metadata_sz); region_device_sz(rdev) - metadata_sz);
} }
static const char *get_agesa_cbfs_name(void)
{
if (!IS_ENABLED(CONFIG_AGESA_SPLIT_MEMORY_FILES))
return CONFIG_AGESA_CBFS_NAME;
if (!ENV_RAMSTAGE)
return CONFIG_AGESA_PRE_MEMORY_CBFS_NAME;
return CONFIG_AGESA_POST_MEMORY_CBFS_NAME;
}
const void *agesawrapper_locate_module (const CHAR8 name[8]) const void *agesawrapper_locate_module (const CHAR8 name[8])
{ {
const void *agesa; const void *agesa;
const AMD_IMAGE_HEADER *image; const AMD_IMAGE_HEADER *image;
struct region_device rdev; struct region_device rdev;
size_t file_size; size_t file_size;
const char *fname = CONFIG_AGESA_CBFS_NAME; const char *fname;
int ret; int ret;
fname = get_agesa_cbfs_name();
if (IS_ENABLED(CONFIG_AGESA_BINARY_PI_AS_STAGE)) if (IS_ENABLED(CONFIG_AGESA_BINARY_PI_AS_STAGE))
ret = agesa_locate_stage_file(fname, &rdev); ret = agesa_locate_stage_file(fname, &rdev);
else else

View File

@ -123,8 +123,27 @@ ramstage-libs += $(agesa_output_path)/libagesa.a
####################################################################### #######################################################################
ifeq ($(CONFIG_AGESA_SPLIT_MEMORY_FILES), y)
cbfs-files-$(CONFIG_CPU_AMD_AGESA_BINARY_PI) += $(CONFIG_AGESA_PRE_MEMORY_CBFS_NAME)
$(CONFIG_AGESA_PRE_MEMORY_CBFS_NAME)-file := $(CONFIG_AGESA_PRE_MEMORY_BINARY_PI_FILE)
$(CONFIG_AGESA_PRE_MEMORY_CBFS_NAME)-type := stage
$(CONFIG_AGESA_PRE_MEMORY_CBFS_NAME)-options := --xip
# 4KiB alignment to handle any interior alignment. Current AGESA only has
# 64 byte alignment.
$(CONFIG_AGESA_PRE_MEMORY_CBFS_NAME)-align := 4096
cbfs-files-$(CONFIG_CPU_AMD_AGESA_BINARY_PI) += $(CONFIG_AGESA_POST_MEMORY_CBFS_NAME)
$(CONFIG_AGESA_POST_MEMORY_CBFS_NAME)-file := $(CONFIG_AGESA_POST_MEMORY_BINARY_PI_FILE)
$(CONFIG_AGESA_POST_MEMORY_CBFS_NAME)-type := stage
$(CONFIG_AGESA_POST_MEMORY_CBFS_NAME)-options := --xip
# 4KiB alignment to handle any interior alignment. Current AGESA only has
# 64 byte alignment.
$(CONFIG_AGESA_POST_MEMORY_CBFS_NAME)-align := 4096
else
cbfs-files-$(CONFIG_CPU_AMD_AGESA_BINARY_PI) += $(CONFIG_AGESA_CBFS_NAME) cbfs-files-$(CONFIG_CPU_AMD_AGESA_BINARY_PI) += $(CONFIG_AGESA_CBFS_NAME)
$(CONFIG_AGESA_CBFS_NAME)-file := $(CONFIG_AGESA_BINARY_PI_FILE) $(CONFIG_AGESA_CBFS_NAME)-file := $(CONFIG_AGESA_BINARY_PI_FILE)
ifeq ($(CONFIG_AGESA_BINARY_PI_AS_STAGE),y) ifeq ($(CONFIG_AGESA_BINARY_PI_AS_STAGE),y)
$(CONFIG_AGESA_CBFS_NAME)-type := stage $(CONFIG_AGESA_CBFS_NAME)-type := stage
$(CONFIG_AGESA_CBFS_NAME)-options := --xip $(CONFIG_AGESA_CBFS_NAME)-options := --xip
@ -134,6 +153,8 @@ $(CONFIG_AGESA_CBFS_NAME)-align := 4096
else else
$(CONFIG_AGESA_CBFS_NAME)-type := raw $(CONFIG_AGESA_CBFS_NAME)-type := raw
$(CONFIG_AGESA_CBFS_NAME)-position := $(CONFIG_AGESA_BINARY_PI_LOCATION) $(CONFIG_AGESA_CBFS_NAME)-position := $(CONFIG_AGESA_BINARY_PI_LOCATION)
endif endif # CONFIG_AGESA_BINARY_PI_AS_STAGE
endif # CONFIG_AGESA_SPLIT_MEMORY_FILES
endif endif

View File

@ -58,10 +58,42 @@ config AGESA_BINARY_PI_AS_STAGE
cpu address space. It's required that the file be in ELF format cpu address space. It's required that the file be in ELF format
containing the relocations necessary for relocating at runtime. containing the relocations necessary for relocating at runtime.
config AGESA_SPLIT_MEMORY_FILES
bool "Split AGESA Binary PI into pre- and post-memory files."
depends on AGESA_BINARY_PI_AS_STAGE
default n
help
Specifies that AGESA is split into two binaries for pre- and
post-memory.
config AGESA_PRE_MEMORY_BINARY_PI_FILE
string
depends on AGESA_SPLIT_MEMORY_FILES
default "3rdparty/blobs/pi/amd/00670F00/FT4/AGESA_premem.elf" if SOC_AMD_STONEYRIDGE_FT4
help
Specify the binary file to use for pre-memory AMD platform
initialization.
config AGESA_POST_MEMORY_BINARY_PI_FILE
string
depends on AGESA_SPLIT_MEMORY_FILES
default "3rdparty/blobs/pi/amd/00670F00/FT4/AGESA_postmem.elf" if SOC_AMD_STONEYRIDGE_FT4
help
Specify the binary file to use for post-memory AMD platform
initialization.
config AGESA_CBFS_NAME config AGESA_CBFS_NAME
string string
default "AGESA" default "AGESA"
config AGESA_PRE_MEMORY_CBFS_NAME
string
default "AGESA_PRE_MEM"
config AGESA_POST_MEMORY_CBFS_NAME
string
default "AGESA_POST_MEM"
config AGESA_BINARY_PI_LOCATION config AGESA_BINARY_PI_LOCATION
hex "AGESA PI binary address in ROM" hex "AGESA PI binary address in ROM"
default 0xFFE00000 default 0xFFE00000