summaryrefslogtreecommitdiffstats
path: root/0025-sunxi-non-FEL-SPL-boot-support-for-sun7i.patch
diff options
context:
space:
mode:
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.patch409
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
+