From e707c67c69599274b890d0686522880aa2e16d71 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Mon, 10 Nov 2014 13:11:50 -0800 Subject: [PATCH] CBFS: Correct ROM_SIZE for ARM boards, use CBFS_SIZE for cbfstool Some projects (like ChromeOS) put more content than described by CBFS onto their image. For top-aligned images (read: x86), this has traditionally been achieved with a CBFS_SIZE Kconfig (which denotes the area actually managed by CBFS, as opposed to ROM_SIZE) that is used to calculate the CBFS entry start offset. On bottom-aligned boards, many define a fake (smaller) ROM_SIZE for only the CBFS part, which is not consistently done and can be an issue because ROM_SIZE is expected to be a power of two. This patch changes all non-x86 boards to describe their actual (physical) ROM size via one of the BOARD_ROMSIZE_KB_xxx options as a mainboard Kconfig select (which is the correct place to declare unchangeable physical properties of the board). It also changes the cbfstool create invocation to use CBFS_SIZE as the -s parameter for those architectures, which defaults to ROM_SIZE but gets overridden for special use cases like ChromeOS. This has the advantage that cbfstool has a consistent idea of where the area it is responsible for ends, which offers better bounds-checking and is needed for a subsequent fix. Also change the FMAP offset to default to right behind the (now consistently known) CBFS region for non-x86 boards, which has emerged as a de-facto standard on those architectures and allows us to reduce the amount of custom configuration. In the future, the nightmare that is ChromeOS's image build system could be redesigned to enforce this automatically, and also confirm that it doesn't overwrite any space used by CBFS (which is now consistently defined as the file size of coreboot.rom on non-x86). CQ-DEPEND=CL:231576,CL:231475 BRANCH=None BUG=chromium:422501 TEST=Built and booted on Veyron_Pinky. Change-Id: I4fce5a56a8d72f4c4dd3a08c129025f1565351cc Signed-off-by: Julius Werner Reviewed-on: https://chromium-review.googlesource.com/229974 Reviewed-by: Aaron Durbin --- Makefile.inc | 7 +++++-- src/Kconfig | 8 +++++++- src/arch/arm/Makefile.inc | 4 +++- src/arch/arm64/Makefile.inc | 4 +++- src/arch/mips/Makefile.inc | 5 +++-- src/arch/x86/Makefile.inc | 3 ++- src/mainboard/google/cosmos/Kconfig | 1 + src/mainboard/google/nyan/Kconfig | 1 + src/mainboard/google/nyan_big/Kconfig | 1 + src/mainboard/google/nyan_blaze/Kconfig | 1 + src/mainboard/google/rush/Kconfig | 1 + src/mainboard/google/rush_ryu/Kconfig | 1 + src/mainboard/google/storm/Kconfig | 1 + src/mainboard/google/veyron_jerry/Kconfig | 1 + src/mainboard/google/veyron_mighty/Kconfig | 1 + src/mainboard/google/veyron_pinky/Kconfig | 1 + src/soc/qualcomm/Kconfig | 8 -------- src/vendorcode/google/chromeos/Kconfig | 3 ++- 18 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Makefile.inc b/Makefile.inc index 25a0807880..d82de694d4 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -410,7 +410,7 @@ prebuild-files = \ prebuilt-files = $(foreach file,$(cbfs-files), $(call extract_nth,1,$(file))) $(obj)/coreboot.pre1: $(objcbfs)/bootblock.bin $$(prebuilt-files) $(CBFSTOOL) $$(cpu_ucode_cbfs_file) - $(CBFSTOOL) $@.tmp create -s $(CONFIG_COREBOOT_ROMSIZE_KB)K \ + $(CBFSTOOL) $@.tmp create \ -B $(objcbfs)/bootblock.bin -a 64 \ $(CBFSTOOL_PRE1_OPTS) $(prebuild-files) true @@ -440,7 +440,10 @@ endif $(obj)/coreboot.rom: $(obj)/coreboot.pre $(objcbfs)/ramstage.elf $(CBFSTOOL) $(call strip_quotes,$(COREBOOT_ROM_DEPENDENCIES)) $$(INTERMEDIATE) $$(VBOOT_STUB) $(REFCODE_BLOB) @printf " CBFS $(subst $(obj)/,,$(@))\n" - cp $(obj)/coreboot.pre $@.tmp +# The full ROM may be larger than the CBFS part, so create an empty +# file (filled with \377 = 0xff) and copy the CBFS image over it. + tr '\000' '\377' < /dev/zero 2> /dev/null | dd of=$@.tmp bs=8192 iflag=fullblock count=$$(($(CONFIG_ROM_SIZE) / 8192)) 2> /dev/null + dd if=$(obj)/coreboot.pre of=$@.tmp bs=8192 conv=notrunc 2> /dev/null $(CBFSTOOL) $@.tmp add-stage -f $(objcbfs)/ramstage.elf -n $(CONFIG_CBFS_PREFIX)/ramstage -c $(CBFS_COMPRESS_FLAG) ifeq ($(CONFIG_PAYLOAD_NONE),y) @printf " PAYLOAD none (as specified by user)\n" diff --git a/src/Kconfig b/src/Kconfig index 8d3d831df9..da5196dc40 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -422,8 +422,14 @@ config IOAPIC default n config CBFS_SIZE - hex + hex "Size of CBFS filesystem in ROM" default ROM_SIZE + help + This is the part of the ROM actually managed by CBFS, located at the + end of the ROM (passed through cbfstool -o) on x86 and at at the start + of the ROM (passed through cbfstool -s) everywhere else. Defaults to + span the whole ROM but can be overwritten to make coreboot live + alongside other components (like ChromeOS's vboot/FMAP). config CACHE_ROM_SIZE hex diff --git a/src/arch/arm/Makefile.inc b/src/arch/arm/Makefile.inc index 58c9c953fc..a7d85fe8f6 100644 --- a/src/arch/arm/Makefile.inc +++ b/src/arch/arm/Makefile.inc @@ -33,7 +33,9 @@ subdirs-y += armv4/ armv7/ ############################################################################### ifeq ($(CONFIG_ARCH_ROMSTAGE_ARM),y) -CBFSTOOL_PRE1_OPTS = -m arm -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) -o $(CONFIG_CBFS_ROM_OFFSET) +CBFSTOOL_PRE1_OPTS = -m arm -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) \ + -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) \ + -o $(CONFIG_CBFS_ROM_OFFSET) -s $(CONFIG_CBFS_SIZE) endif ############################################################################### diff --git a/src/arch/arm64/Makefile.inc b/src/arch/arm64/Makefile.inc index bf1ba27b59..e1e8ee71c2 100644 --- a/src/arch/arm64/Makefile.inc +++ b/src/arch/arm64/Makefile.inc @@ -34,7 +34,9 @@ subdirs-y += armv8/ ################################################################################ ifeq ($(CONFIG_ARCH_ROMSTAGE_ARM64),y) -CBFSTOOL_PRE1_OPTS = -m arm64 -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) -o $(CONFIG_CBFS_ROM_OFFSET) +CBFSTOOL_PRE1_OPTS = -m arm64 -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) \ + -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) \ + -o $(CONFIG_CBFS_ROM_OFFSET) -s $(CONFIG_CBFS_SIZE) endif ################################################################################ diff --git a/src/arch/mips/Makefile.inc b/src/arch/mips/Makefile.inc index 5446803368..39bb05e17a 100644 --- a/src/arch/mips/Makefile.inc +++ b/src/arch/mips/Makefile.inc @@ -24,8 +24,9 @@ ############################################################################### ifeq ($(CONFIG_ARCH_ROMSTAGE_MIPS),y) -CBFSTOOL_PRE1_OPTS = -m mips -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) -o $(CONFIG_CBFS_ROM_OFFSET) -CBFSTOOL_PRE_OPTS = -b 0 +CBFSTOOL_PRE1_OPTS = -m mips -b $(CONFIG_BOOTBLOCK_ROM_OFFSET) \ + -H $(CONFIG_CBFS_HEADER_ROM_OFFSET) \ + -o $(CONFIG_CBFS_ROM_OFFSET) -s $(CONFIG_CBFS_SIZE) endif ############################################################################### diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 28f81052cb..0c7d71d38b 100644 --- a/src/arch/x86/Makefile.inc +++ b/src/arch/x86/Makefile.inc @@ -58,7 +58,8 @@ endif # CONFIG_HAVE_OPTION_TABLE ################################################################################ ifeq ($(CONFIG_ARCH_ROMSTAGE_X86_32),y) -CBFSTOOL_PRE1_OPTS = -m x86 -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) )) +CBFSTOOL_PRE1_OPTS = -m x86 -s $(CONFIG_ROM_SIZE) \ + -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) )) # Make sure that segment for .car.data is ignored while adding romstage. CBFSTOOL_PRE_OPTS = -b $(shell cat $(objcbfs)/base_xip.txt) -S ".car.data" endif diff --git a/src/mainboard/google/cosmos/Kconfig b/src/mainboard/google/cosmos/Kconfig index 56ab368f69..895fd0573e 100644 --- a/src/mainboard/google/cosmos/Kconfig +++ b/src/mainboard/google/cosmos/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_COSMOS config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_2048 select CHROMEOS select CHROMEOS_VBNV_FLASH select COMMON_CBFS_SPI_WRAPPER diff --git a/src/mainboard/google/nyan/Kconfig b/src/mainboard/google/nyan/Kconfig index 19eb6a1c1e..8a39bb7b80 100644 --- a/src/mainboard/google/nyan/Kconfig +++ b/src/mainboard/google/nyan/Kconfig @@ -21,6 +21,7 @@ if BOARD_GOOGLE_NYAN config BOARD_SPECIFIC_OPTIONS # dummy def_bool y + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/nyan_big/Kconfig b/src/mainboard/google/nyan_big/Kconfig index b01dd84208..9105076095 100644 --- a/src/mainboard/google/nyan_big/Kconfig +++ b/src/mainboard/google/nyan_big/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_NYAN_BIG config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/nyan_blaze/Kconfig b/src/mainboard/google/nyan_blaze/Kconfig index e85a633fde..5b744977b7 100644 --- a/src/mainboard/google/nyan_blaze/Kconfig +++ b/src/mainboard/google/nyan_blaze/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_NYAN_BLAZE config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/rush/Kconfig b/src/mainboard/google/rush/Kconfig index f27b65846f..486c7cfadb 100644 --- a/src/mainboard/google/rush/Kconfig +++ b/src/mainboard/google/rush/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_RUSH config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/rush_ryu/Kconfig b/src/mainboard/google/rush_ryu/Kconfig index 3623f2ed21..b9b6011901 100644 --- a/src/mainboard/google/rush_ryu/Kconfig +++ b/src/mainboard/google/rush_ryu/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_RUSH_RYU config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_8192 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/storm/Kconfig b/src/mainboard/google/storm/Kconfig index 7d75d7a6d5..d2626c50d2 100644 --- a/src/mainboard/google/storm/Kconfig +++ b/src/mainboard/google/storm/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_STORM config BOARD_SPECIFIC_OPTIONS def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_8192 select CHROMEOS select COMMON_CBFS_SPI_WRAPPER select MAINBOARD_HAS_BOOTBLOCK_INIT diff --git a/src/mainboard/google/veyron_jerry/Kconfig b/src/mainboard/google/veyron_jerry/Kconfig index 4d250d3424..8a48a45a86 100644 --- a/src/mainboard/google/veyron_jerry/Kconfig +++ b/src/mainboard/google/veyron_jerry/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_VEYRON_JERRY config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/veyron_mighty/Kconfig b/src/mainboard/google/veyron_mighty/Kconfig index ee61ddbefc..041fab349d 100644 --- a/src/mainboard/google/veyron_mighty/Kconfig +++ b/src/mainboard/google/veyron_mighty/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_VEYRON_MIGHTY config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/mainboard/google/veyron_pinky/Kconfig b/src/mainboard/google/veyron_pinky/Kconfig index aac4b3cca8..7c93cbf643 100644 --- a/src/mainboard/google/veyron_pinky/Kconfig +++ b/src/mainboard/google/veyron_pinky/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_VEYRON_PINKY config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select BOARD_ID_SUPPORT + select BOARD_ROMSIZE_KB_4096 select CHROMEOS select CHROMEOS_VBNV_EC select EC_GOOGLE_CHROMEEC diff --git a/src/soc/qualcomm/Kconfig b/src/soc/qualcomm/Kconfig index 918093b7d8..b7a12d4f9c 100644 --- a/src/soc/qualcomm/Kconfig +++ b/src/soc/qualcomm/Kconfig @@ -1,9 +1 @@ source src/soc/qualcomm/ipq806x/Kconfig - -config CBFS_SIZE - hex "Size of CBFS filesystem in ROM" - default ROM_SIZE - help - CBFS size needs to match the size of memory allocated to the - coreboot blob elsewhere in the system. Make sure this config option - is fine tuned in the board config file. diff --git a/src/vendorcode/google/chromeos/Kconfig b/src/vendorcode/google/chromeos/Kconfig index d0fae0a83c..2cf7ec2c69 100644 --- a/src/vendorcode/google/chromeos/Kconfig +++ b/src/vendorcode/google/chromeos/Kconfig @@ -87,6 +87,7 @@ config FLASHMAP_OFFSET hex "Flash Map Offset" default 0x00670000 if NORTHBRIDGE_INTEL_SANDYBRIDGE default 0x00610000 if NORTHBRIDGE_INTEL_IVYBRIDGE + default CBFS_SIZE if !ARCH_X86 default 0 help Offset of flash map in firmware image @@ -161,4 +162,4 @@ config PHYSICAL_REC_SWITCH Whether this platform has a physical recovery switch source src/vendorcode/google/chromeos/vboot1/Kconfig -source src/vendorcode/google/chromeos/vboot2/Kconfig \ No newline at end of file +source src/vendorcode/google/chromeos/vboot2/Kconfig