From 1131889570836da2ee63f5eacb46ce31d3a55276 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Wed, 2 Apr 2014 20:46:13 -0500 Subject: baytrail: handle MRC being an ELF file Provide the option to embed MRC as an ELF file and not just binary blob. This allows for MRC to be relocated. BUG=chrome-os-partner:27654 BRANCH=rambi TEST=Built and booted rambi. Change-Id: I2e177c155a3074e4e1d450b1a73b7299aebd5286 Signed-off-by: Aaron Durbin Reviewed-on: https://chromium-review.googlesource.com/192893 Reviewed-by: Duncan Laurie (cherry picked from commit 89c97d5e2023b8c5cc780e1b1d532d0a586512f9) Signed-off-by: Marc Jones Reviewed-on: http://review.coreboot.org/7214 Reviewed-by: Edward O'Callaghan Tested-by: build bot (Jenkins) --- src/soc/intel/baytrail/Makefile.inc | 8 +++++++- src/soc/intel/baytrail/romstage/raminit.c | 15 +++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) (limited to 'src/soc/intel') diff --git a/src/soc/intel/baytrail/Makefile.inc b/src/soc/intel/baytrail/Makefile.inc index 94f3241dfb..464b63919f 100644 --- a/src/soc/intel/baytrail/Makefile.inc +++ b/src/soc/intel/baytrail/Makefile.inc @@ -88,10 +88,16 @@ ifeq ($(CONFIG_HAVE_ME_BIN),y) mv $(obj)/coreboot.pre.new $(obj)/coreboot.pre endif +# If an MRC file is an ELF file determine the entry address and first loadable +# section offset in the file. Subtract the offset from the entry address to +# determine the final location. +mrcelfoffset = $(shell readelf -S -W $(CONFIG_MRC_FILE) | sed -e 's/\[ /[0/' | awk '$$3 ~ /PROGBITS/ { print "0x"$$5; exit }' ) +mrcelfentry = $(shell readelf -h -W $(CONFIG_MRC_FILE) | grep 'Entry point address' | awk '{print $$NF }') + # Add memory reference code blob. cbfs-files-$(CONFIG_HAVE_MRC) += mrc.bin mrc.bin-file := $(call strip_quotes,$(CONFIG_MRC_FILE)) -mrc.bin-position := $(CONFIG_MRC_BIN_ADDRESS) +mrc.bin-position := $(if $(findstring elf,$(CONFIG_MRC_FILE)),$(shell printf "0x%x" $$(( $(mrcelfentry) - $(mrcelfoffset) )) ),$(CONFIG_MRC_BIN_ADDRESS)) mrc.bin-type := 0xab PHONY += baytrail_add_me diff --git a/src/soc/intel/baytrail/romstage/raminit.c b/src/soc/intel/baytrail/romstage/raminit.c index d5ee0317f0..72d8e51b78 100644 --- a/src/soc/intel/baytrail/romstage/raminit.c +++ b/src/soc/intel/baytrail/romstage/raminit.c @@ -146,13 +146,20 @@ void raminit(struct mrc_params *mp, int prev_sleep_state) #endif } - mrc_entry = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, "mrc.bin", 0xab, - NULL); - - if (mrc_entry == NULL) { + /* Determine if mrc.bin is in the cbfs. */ + if (cbfs_get_file_content(CBFS_DEFAULT_MEDIA, "mrc.bin", 0xab, NULL) == + NULL) { printk(BIOS_DEBUG, "Couldn't find mrc.bin\n"); return; } + + /* + * The entry point is currently the first instruction. Handle the + * case of an ELF file being put in the cbfs by setting the entry + * to the CONFIG_MRC_BIN_ADDRESS. + */ + mrc_entry = (void *)(uintptr_t)CONFIG_MRC_BIN_ADDRESS; + if (mp->mainboard.dram_info_location == DRAM_INFO_SPD_SMBUS) enable_smbus(); -- cgit v1.2.3