diff options
-rw-r--r-- | src/arch/arm/armv7/bootblock.S | 12 | ||||
-rw-r--r-- | src/soc/samsung/exynos5250/Kconfig | 11 | ||||
-rw-r--r-- | src/soc/samsung/exynos5250/Makefile.inc | 17 | ||||
-rw-r--r-- | src/soc/samsung/exynos5420/Kconfig | 6 | ||||
-rw-r--r-- | src/soc/samsung/exynos5420/Makefile.inc | 17 | ||||
-rwxr-xr-x | util/exynos/fixed_cksum.py | 59 | ||||
-rwxr-xr-x | util/exynos/variable_cksum.py | 59 |
7 files changed, 142 insertions, 39 deletions
diff --git a/src/arch/arm/armv7/bootblock.S b/src/arch/arm/armv7/bootblock.S index b28a787839..82bd79e19a 100644 --- a/src/arch/arm/armv7/bootblock.S +++ b/src/arch/arm/armv7/bootblock.S @@ -31,17 +31,7 @@ .section ".start", "a", %progbits .globl _start -_start: b reset - .balignl 16,0xdeadbeef - -_cbfs_master_header: - /* The CBFS master header is inserted by cbfstool at the first - * aligned offset after the above anchor string is found. - * Hence, we leave some space for it. - */ - .skip 128 @ Assumes 64-byte alignment - -reset: +_start: /* * Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data * aborts may happen early and crash before the abort handlers are diff --git a/src/soc/samsung/exynos5250/Kconfig b/src/soc/samsung/exynos5250/Kconfig index 2b4ad3995b..8d7c867fe0 100644 --- a/src/soc/samsung/exynos5250/Kconfig +++ b/src/soc/samsung/exynos5250/Kconfig @@ -15,21 +15,22 @@ if CPU_SAMSUNG_EXYNOS5250 # # 0x0000: vendor-provided BL1 (8k). # 0x2000: bootblock -# 0x2010-0x2090: reserved for CBFS master header. -# 0xA000: Free for CBFS data. +# 0x9FFC-0xA000: BL2 checksum +# 0xA000-0xA080: reserved for CBFS master header. +# 0xA080: Free for CBFS data. config BOOTBLOCK_ROM_OFFSET hex - default 0x2000 + default 0 config CBFS_HEADER_ROM_OFFSET hex "offset of master CBFS header in ROM" - default 0x2010 + default 0x9F80 config CBFS_ROM_OFFSET # Calculated by BOOTBLOCK_ROM_OFFSET + max bootblock size. hex "offset of CBFS data in ROM" - default 0x0A000 + default 0x0A080 config SYS_SDRAM_BASE hex diff --git a/src/soc/samsung/exynos5250/Makefile.inc b/src/soc/samsung/exynos5250/Makefile.inc index a15bc9c6a3..cc89f2d7b5 100644 --- a/src/soc/samsung/exynos5250/Makefile.inc +++ b/src/soc/samsung/exynos5250/Makefile.inc @@ -50,13 +50,10 @@ ramstage-y += fb.c ramstage-y += usb.c ramstage-y += cbmem.c -# Run an intermediate step when producing coreboot.rom -# that adds additional components to the final firmware -# image outside of CBFS -.PHONY: exynos5250_add_bl1 -$(obj)/coreboot.rom: exynos5250_add_bl1 -exynos5250_add_bl1: $(obj)/coreboot.pre - printf " DD Adding Samsung Exynos5250 BL1\n" - # TODO(hungte) Change this 'cpu' to soc when build scripts are changed. - dd if=3rdparty/cpu/samsung/exynos5250/bl1.bin \ - of=$(obj)/coreboot.pre conv=notrunc >/dev/null 2>&1 +$(objcbfs)/bootblock.raw.elf: $(objcbfs)/bootblock.elf + cp $< $@ + +$(objcbfs)/bootblock.bin: $(objcbfs)/bootblock.raw.bin + @printf " BL1, CKSUM $(subst $(obj)/,,$(@))\n" + util/exynos/fixed_cksum.py $< $<.cksum 32768 + cat 3rdparty/cpu/samsung/exynos5250/bl1.bin $<.cksum > $@ diff --git a/src/soc/samsung/exynos5420/Kconfig b/src/soc/samsung/exynos5420/Kconfig index a0d6c9882c..904091e5ba 100644 --- a/src/soc/samsung/exynos5420/Kconfig +++ b/src/soc/samsung/exynos5420/Kconfig @@ -17,16 +17,16 @@ if CPU_SAMSUNG_EXYNOS5420 # 0x0000: vendor-provided BL1 (8k). # 0x2000: variable length bootblock checksum header # 0x2010: bootblock -# 0x2020-0x20A0: reserved for CBFS master header. +# 0x9F80-0xA000: reserved for CBFS master header. # 0xA000: Free for CBFS data. config BOOTBLOCK_ROM_OFFSET hex - default 0x2010 + default 0 config CBFS_HEADER_ROM_OFFSET hex "offset of master CBFS header in ROM" - default 0x2020 + default 0x9F80 config CBFS_ROM_OFFSET # Calculated by BOOTBLOCK_ROM_OFFSET + max bootblock size. diff --git a/src/soc/samsung/exynos5420/Makefile.inc b/src/soc/samsung/exynos5420/Makefile.inc index ef77b1b728..5f37e7eba5 100644 --- a/src/soc/samsung/exynos5420/Makefile.inc +++ b/src/soc/samsung/exynos5420/Makefile.inc @@ -50,13 +50,10 @@ ramstage-y += dp.c dp_lowlevel.c fimd.c ramstage-y += usb.c ramstage-y += cbmem.c -# Run an intermediate step when producing coreboot.rom -# that adds additional components to the final firmware -# image outside of CBFS -.PHONY: exynos5420_add_bl1 -$(obj)/coreboot.rom: exynos5420_add_bl1 -exynos5420_add_bl1: $(obj)/coreboot.pre - printf " DD Adding Samsung Exynos5420 BL1\n" - # TODO(hungte) Change this 'cpu' to soc when build scripts are changed. - dd if=3rdparty/cpu/samsung/exynos5420/bl1.bin \ - of=$(obj)/coreboot.pre conv=notrunc >/dev/null 2>&1 +$(objcbfs)/bootblock.raw.elf: $(objcbfs)/bootblock.elf + cp $< $@ + +$(objcbfs)/bootblock.bin: $(objcbfs)/bootblock.raw.bin + @printf " BL1, CKSUM $(subst $(obj)/,,$(@))\n" + util/exynos/variable_cksum.py $< $<.cksum + cat 3rdparty/cpu/samsung/exynos5420/bl1.bin $<.cksum > $@ diff --git a/util/exynos/fixed_cksum.py b/util/exynos/fixed_cksum.py new file mode 100755 index 0000000000..66da06025d --- /dev/null +++ b/util/exynos/fixed_cksum.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013 Google Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +""" +This utility computes and fills Exynos ROM checksum (for BL1 or BL2). +(Algorithm from U-Boot: tools/mkexynosspl.c) + +Input: IN OUT DATA_SIZE + +Output: + + IN padded out to DATA_SIZE, checksum at the end, written to OUT. +""" + +import struct +import sys + +def main(argv): + if len(argv) != 4: + exit('usage: %s IN OUT DATA_SIZE' % argv[0]) + + in_name, out_name = argv[1:3] + size = int(argv[3], 0) + checksum_format = "<I" + with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: + data = in_file.read() + checksum_size = struct.calcsize(checksum_format) + data_size = size - checksum_size + assert len(data) <= data_size + checksum = struct.pack(checksum_format, sum(map(ord, data))) + out_file.write(data + bytearray(data_size - len(data)) + checksum) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/util/exynos/variable_cksum.py b/util/exynos/variable_cksum.py new file mode 100755 index 0000000000..75cdc74f87 --- /dev/null +++ b/util/exynos/variable_cksum.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013 Google Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +""" +This utility computes and fills Exynos ROM checksum (for BL1 or BL2). +(Algorithm from U-Boot: tools/mkexynosspl.c) + +Input: IN OUT + +Output: + + Checksum header added to IN and written to OUT. + Header: uint32_t size, checksum, reserved[2]. +""" + +import struct +import sys + +def main(argv): + if len(argv) != 3: + exit('usage: %s IN OUT' % argv[0]) + + in_name, out_name = argv[1:3] + header_format = "<IIII" + with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: + data = in_file.read() + header = struct.pack(header_format, + struct.calcsize(header_format) + len(data), + sum(map(ord, data)), + 0, 0) + out_file.write(header + data) + + +if __name__ == '__main__': + main(sys.argv) |