diff options
Diffstat (limited to '0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch')
-rw-r--r-- | 0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch | 409 |
1 files changed, 409 insertions, 0 deletions
diff --git a/0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch b/0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch new file mode 100644 index 0000000..6982ca6 --- /dev/null +++ b/0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch @@ -0,0 +1,409 @@ +From 432b9a0f1fcd3ebff235755b9f26d996f36ce946 Mon Sep 17 00:00:00 2001 +From: Ian Campbell <ijc@hellion.org.uk> +Date: Fri, 18 Apr 2014 19:05:49 +0100 +Subject: [PATCH 25/36] sunxi: non-FEL SPL boot support for sun7i +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add support for booting from an MMC card. + +Signed-off-by: Stefan Roese <sr@denx.de> +Signed-off-by: Henrik Nordström <henrik@henriknordstrom.net> +Signed-off-by: Ian Campbell <ijc@hellion.org.uk> +Cc: Tom Cubie <Mr.hipboi@gmail.com> +--- + Makefile | 10 +++ + arch/arm/cpu/armv7/sunxi/config.mk | 8 ++ + arch/arm/cpu/armv7/sunxi/u-boot-spl.lds | 52 +++++++++++ + boards.cfg | 1 + + include/configs/sunxi-common.h | 26 ++++++ + spl/Makefile | 13 +++ + tools/.gitignore | 1 + + tools/Makefile | 2 + + tools/mksunxiboot.c | 154 ++++++++++++++++++++++++++++++++ + 9 files changed, 267 insertions(+) + create mode 100644 arch/arm/cpu/armv7/sunxi/config.mk + create mode 100644 arch/arm/cpu/armv7/sunxi/u-boot-spl.lds + create mode 100644 tools/mksunxiboot.c + +diff --git a/Makefile b/Makefile +index c91c10e..379731c 100644 +--- a/Makefile ++++ b/Makefile +@@ -870,6 +870,13 @@ OBJCOPYFLAGS_u-boot.spr = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO) \ + u-boot.spr: spl/u-boot-spl.img u-boot.img FORCE + $(call if_changed,pad_cat) + ++ifneq ($(CONFIG_SUNXI),) ++OBJCOPYFLAGS_u-boot-sunxi-with-spl.bin = -I binary -O binary \ ++ --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff ++u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img FORCE ++ $(call if_changed,pad_cat) ++endif ++ + ifneq ($(CONFIG_TEGRA),) + OBJCOPYFLAGS_u-boot-nodtb-tegra.bin = -O binary --pad-to=$(CONFIG_SYS_TEXT_BASE) + u-boot-nodtb-tegra.bin: spl/u-boot-spl u-boot.bin FORCE +@@ -1081,6 +1088,9 @@ spl/u-boot-spl.bin: spl/u-boot-spl + spl/u-boot-spl: tools prepare + $(Q)$(MAKE) obj=spl -f $(srctree)/spl/Makefile all + ++spl/sunxi-spl.bin: spl/u-boot-spl ++ @: ++ + tpl/u-boot-tpl.bin: tools prepare + $(Q)$(MAKE) obj=tpl -f $(srctree)/spl/Makefile all CONFIG_TPL_BUILD=y + +diff --git a/arch/arm/cpu/armv7/sunxi/config.mk b/arch/arm/cpu/armv7/sunxi/config.mk +new file mode 100644 +index 0000000..00f5ffc +--- /dev/null ++++ b/arch/arm/cpu/armv7/sunxi/config.mk +@@ -0,0 +1,8 @@ ++# Build a combined spl + u-boot image ++ifdef CONFIG_SPL ++ifndef CONFIG_SPL_BUILD ++ifndef CONFIG_SPL_FEL ++ALL-y += u-boot-sunxi-with-spl.bin ++endif ++endif ++endif +diff --git a/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds +new file mode 100644 +index 0000000..5008028 +--- /dev/null ++++ b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds +@@ -0,0 +1,52 @@ ++/* ++ * (C) Copyright 2012 ++ * Allwinner Technology Co., Ltd. <www.allwinnertech.com> ++ * Tom Cubie <tangliang@allwinnertech.com> ++ * ++ * Based on omap-common/u-boot-spl.lds: ++ * ++ * (C) Copyright 2002 ++ * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> ++ * ++ * (C) Copyright 2010 ++ * Texas Instruments, <www.ti.com> ++ * Aneesh V <aneesh@ti.com> ++ * ++ * SPDX-License-Identifier: GPL-2.0+ ++ */ ++MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,\ ++ LENGTH = CONFIG_SPL_MAX_SIZE } ++MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, \ ++ LENGTH = CONFIG_SPL_BSS_MAX_SIZE } ++ ++OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ++OUTPUT_ARCH(arm) ++ENTRY(_start) ++SECTIONS ++{ ++ .text : ++ { ++ __start = .; ++ arch/arm/cpu/armv7/start.o (.text) ++ *(.text*) ++ } > .sram ++ ++ . = ALIGN(4); ++ .rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } >.sram ++ ++ . = ALIGN(4); ++ .data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram ++ ++ . = ALIGN(4); ++ __image_copy_end = .; ++ _end = .; ++ ++ .bss : ++ { ++ . = ALIGN(4); ++ __bss_start = .; ++ *(.bss*) ++ . = ALIGN(4); ++ __bss_end = .; ++ } > .sdram ++} +diff --git a/boards.cfg b/boards.cfg +index ddc3c86..65ec99f 100644 +--- a/boards.cfg ++++ b/boards.cfg +@@ -372,6 +372,7 @@ Active arm armv7 rmobile renesas lager + Active arm armv7 s5pc1xx samsung goni s5p_goni - Mateusz Zalega <m.zalega@samsung.com> + Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <mk7.kang@samsung.com> + Active arm armv7 socfpga altera socfpga socfpga_cyclone5 - - ++Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,SUNXI_GMAC,RGMII - + Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,SUNXI_GMAC,RGMII - + Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <mathieu.poirier@linaro.org> + Active arm armv7 u8500 st-ericsson u8500 u8500_href - - +diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h +index ede3d50..56a89b9 100644 +--- a/include/configs/sunxi-common.h ++++ b/include/configs/sunxi-common.h +@@ -17,6 +17,11 @@ + * High Level Configuration Options + */ + #define CONFIG_SUNXI /* sunxi family */ ++#ifdef CONFIG_SPL_BUILD ++#ifndef CONFIG_SPL_FEL ++#define CONFIG_SYS_THUMB_BUILD /* Thumbs mode to save space in SPL */ ++#endif ++#endif + + #include <asm/arch/cpu.h> /* get chip and board defs */ + +@@ -121,11 +126,32 @@ + #define CONFIG_SPL_SERIAL_SUPPORT + #define CONFIG_SPL_LIBGENERIC_SUPPORT + ++#ifdef CONFIG_SPL_FEL ++ + #define CONFIG_SPL + #define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds" + #define CONFIG_SPL_START_S_PATH "arch/arm/cpu/armv7/sunxi" + #define CONFIG_SPL_TEXT_BASE 0x2000 + #define CONFIG_SPL_MAX_SIZE 0x4000 /* 16 KiB */ ++ ++#else /* CONFIG_SPL */ ++ ++#define CONFIG_SPL_BSS_START_ADDR 0x4ff80000 ++#define CONFIG_SPL_BSS_MAX_SIZE 0x80000 /* 512 KiB */ ++ ++#define CONFIG_SPL_TEXT_BASE 0x20 /* sram start+header */ ++#define CONFIG_SPL_MAX_SIZE 0x5fe0 /* 24KB on sun4i/sun7i */ ++ ++#define CONFIG_SPL_LIBDISK_SUPPORT ++#define CONFIG_SPL_MMC_SUPPORT ++ ++#define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv7/sunxi/u-boot-spl.lds" ++ ++#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 80 /* 40KiB */ ++#define CONFIG_SPL_PAD_TO 32768 /* decimal for 'dd' */ ++ ++#endif /* CONFIG_SPL */ ++ + /* end of 32 KiB in sram */ + #define LOW_LEVEL_SRAM_STACK 0x00008000 /* End of sram */ + #define CONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK +diff --git a/spl/Makefile b/spl/Makefile +index 6fec252..e7c7a95 100644 +--- a/spl/Makefile ++++ b/spl/Makefile +@@ -188,6 +188,12 @@ ifdef CONFIG_SAMSUNG + ALL-y += $(obj)/$(BOARD)-spl.bin + endif + ++ifdef CONFIG_SUNXI ++ifndef CONFIG_SPL_FEL ++ALL-y += $(obj)/sunxi-spl.bin ++endif ++endif ++ + all: $(ALL-y) + + ifdef CONFIG_SAMSUNG +@@ -215,6 +221,13 @@ ifneq ($(CONFIG_SPL_TEXT_BASE),) + LDFLAGS_$(SPL_BIN) += -Ttext $(CONFIG_SPL_TEXT_BASE) + endif + ++ifdef CONFIG_SUNXI ++quiet_cmd_mksunxiboot = MKSUNXI $@ ++cmd_mksunxiboot = $(objtree)/tools/mksunxiboot $< $@ ++$(obj)/sunxi-spl.bin: $(obj)/$(SPL_BIN).bin ++ $(call if_changed,mksunxiboot) ++endif ++ + quiet_cmd_u-boot-spl = LD $@ + cmd_u-boot-spl = cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \ + $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \ +diff --git a/tools/.gitignore b/tools/.gitignore +index 2a90dfe..3ad5db3 100644 +--- a/tools/.gitignore ++++ b/tools/.gitignore +@@ -9,6 +9,7 @@ + /mkexynosspl + /mpc86x_clk + /mxsboot ++/mksunxiboot + /ncb + /proftool + /relocate-rela +diff --git a/tools/Makefile b/tools/Makefile +index 097cc1d..062a404 100644 +--- a/tools/Makefile ++++ b/tools/Makefile +@@ -120,6 +120,8 @@ hostprogs-$(CONFIG_MX23) += mxsboot$(SFX) + hostprogs-$(CONFIG_MX28) += mxsboot$(SFX) + HOSTCFLAGS_mxsboot$(SFX).o := -pedantic + ++hostprogs-$(CONFIG_SUNXI) += mksunxiboot$(SFX) ++ + hostprogs-$(CONFIG_NETCONSOLE) += ncb$(SFX) + hostprogs-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1$(SFX) + +diff --git a/tools/mksunxiboot.c b/tools/mksunxiboot.c +new file mode 100644 +index 0000000..50fcda5 +--- /dev/null ++++ b/tools/mksunxiboot.c +@@ -0,0 +1,154 @@ ++/* ++ * (C) Copyright 2007-2011 ++ * Allwinner Technology Co., Ltd. <www.allwinnertech.com> ++ * Tom Cubie <tangliang@allwinnertech.com> ++ * ++ * a simple tool to generate bootable image for sunxi platform. ++ * ++ * SPDX-License-Identifier: GPL-2.0+ ++ */ ++#include <fcntl.h> ++#include <stdio.h> ++#include <unistd.h> ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++ ++typedef unsigned char u8; ++typedef unsigned int u32; ++ ++/* boot head definition from sun4i boot code */ ++struct boot_file_head { ++ u32 jump_instruction; /* one intruction jumping to real code */ ++ u8 magic[8]; /* ="eGON.BT0" or "eGON.BT1", not C-style str */ ++ u32 check_sum; /* generated by PC */ ++ u32 length; /* generated by PC */ ++#if 1 ++ /* We use a simplified header, only filling in what is needed by the ++ * boot ROM. To be compatible with Allwinner tools the larger header ++ * below should be used, followed by a custom header if desired. */ ++ u8 pad[12]; /* align to 32 bytes */ ++#else ++ u32 pub_head_size; /* the size of boot_file_head */ ++ u8 pub_head_vsn[4]; /* the version of boot_file_head */ ++ u8 file_head_vsn[4]; /* the version of boot0_file_head or ++ boot1_file_head */ ++ u8 Boot_vsn[4]; /* Boot version */ ++ u8 eGON_vsn[4]; /* eGON version */ ++ u8 platform[8]; /* platform information */ ++#endif ++}; ++ ++#define BOOT0_MAGIC "eGON.BT0" ++#define STAMP_VALUE 0x5F0A6C39 ++ ++/* check sum functon from sun4i boot code */ ++int gen_check_sum(void *boot_buf) ++{ ++ struct boot_file_head *head_p; ++ u32 length; ++ u32 *buf; ++ u32 loop; ++ u32 i; ++ u32 sum; ++ ++ head_p = (struct boot_file_head *)boot_buf; ++ length = head_p->length; ++ if ((length & 0x3) != 0) /* must 4-byte-aligned */ ++ return -1; ++ buf = (u32 *)boot_buf; ++ head_p->check_sum = STAMP_VALUE; /* fill stamp */ ++ loop = length >> 2; ++ ++ /* calculate the sum */ ++ for (i = 0, sum = 0; i < loop; i++) ++ sum += buf[i]; ++ ++ /* write back check sum */ ++ head_p->check_sum = sum; ++ ++ return 0; ++} ++ ++#define ALIGN(x, a) __ALIGN_MASK((x), (typeof(x))(a)-1) ++#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) ++ ++#define SUN4I_SRAM_SIZE 0x7600 /* 0x7748+ is used by BROM */ ++#define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head)) ++#define BLOCK_SIZE 512 ++ ++struct boot_img { ++ struct boot_file_head header; ++ char code[SRAM_LOAD_MAX_SIZE]; ++ char pad[BLOCK_SIZE]; ++}; ++ ++int main(int argc, char *argv[]) ++{ ++ int fd_in, fd_out; ++ struct boot_img img; ++ unsigned file_size, load_size; ++ int count; ++ ++ if (argc < 2) { ++ printf("\tThis program makes an input bin file to sun4i " \ ++ "bootable image.\n" \ ++ "\tUsage: %s input_file out_putfile\n", argv[0]); ++ return EXIT_FAILURE; ++ } ++ ++ fd_in = open(argv[1], O_RDONLY); ++ if (fd_in < 0) { ++ perror("Open input file"); ++ return EXIT_FAILURE; ++ } ++ ++ memset((void *)img.pad, 0, BLOCK_SIZE); ++ ++ /* get input file size */ ++ file_size = lseek(fd_in, 0, SEEK_END); ++ ++ if (file_size > SRAM_LOAD_MAX_SIZE) { ++ fprintf(stderr, "ERROR: File too large!\n"); ++ return EXIT_FAILURE; ++ } else { ++ load_size = ALIGN(file_size, sizeof(int)); ++ } ++ ++ fd_out = open(argv[2], O_WRONLY | O_CREAT, 0666); ++ if (fd_out < 0) { ++ perror("Open output file"); ++ return EXIT_FAILURE; ++ } ++ ++ /* read file to buffer to calculate checksum */ ++ lseek(fd_in, 0, SEEK_SET); ++ count = read(fd_in, img.code, load_size); ++ if (count != load_size) { ++ perror("Reading input image"); ++ return EXIT_FAILURE; ++ } ++ ++ /* fill the header */ ++ img.header.jump_instruction = /* b instruction */ ++ 0xEA000000 | /* jump to the first instr after the header */ ++ ((sizeof(struct boot_file_head) / sizeof(int) - 2) ++ & 0x00FFFFFF); ++ memcpy(img.header.magic, BOOT0_MAGIC, 8); /* no '0' termination */ ++ img.header.length = ++ ALIGN(load_size + sizeof(struct boot_file_head), BLOCK_SIZE); ++ gen_check_sum((void *)&img); ++ ++ count = write(fd_out, (void *)&img, img.header.length); ++ if (count != img.header.length) { ++ perror("Writing output"); ++ return EXIT_FAILURE; ++ } ++ ++ close(fd_in); ++ close(fd_out); ++ ++ return EXIT_SUCCESS; ++} +-- +1.9.0 + |