summaryrefslogtreecommitdiff
path: root/packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch')
-rw-r--r--packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch b/packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch
new file mode 100644
index 0000000000..f32cbde27b
--- /dev/null
+++ b/packages/uboot/u-boot-mkimage-gta01-native/preboot-override.patch
@@ -0,0 +1,137 @@
+Provide a place where the loader can patch the binary, such that it executes a
+command string from RAM. We use this for automated installs, where we can thus
+use the same u-boot binary for all stages.
+
+include/configs/neo1973.h: new option CFG_PREBOOT_OVERRIDE to allow setting of
+ the preboot command in memory
+cpu/arm920t/start.S: added variable "preboot_override" at known location
+ (_start+0x40)
+common/main.c (main_loop): if preboot_override is set, execute the command
+ string found there
+common/env_common.c (env_relocate): if preboot_override is set, always use the
+ default environment
+
+- Werner Almesberger <werner@openmoko.org>
+
+Index: u-boot/cpu/arm920t/start.S
+===================================================================
+--- u-boot.orig/cpu/arm920t/start.S
++++ u-boot/cpu/arm920t/start.S
+@@ -77,6 +77,14 @@ _fiq: .word fiq
+ *************************************************************************
+ */
+
++
++/* Must follow the .balign above, so we get a well-known address ! */
++#ifdef CFG_PREBOOT_OVERRIDE
++.globl preboot_override
++preboot_override:
++ .word 0
++#endif
++
+ #ifdef CONFIG_S3C2410_NAND_BOOT
+ .globl booted_from_nand
+ booted_from_nand:
+Index: u-boot/include/configs/neo1973_gta01.h
+===================================================================
+--- u-boot.orig/include/configs/neo1973_gta01.h
++++ u-boot/include/configs/neo1973_gta01.h
+@@ -207,6 +207,7 @@
+ #define CFG_ENV_IS_IN_NAND 1
+ #define CFG_ENV_SIZE 0x4000 /* 16k Total Size of Environment Sector */
+ #define CFG_ENV_OFFSET_OOB 1 /* Location of ENV stored in block 0 OOB */
++#define CFG_PREBOOT_OVERRIDE 1 /* allow preboot from memory */
+
+ #define NAND_MAX_CHIPS 1
+ #define CFG_NAND_BASE 0x4e000000
+Index: u-boot/common/main.c
+===================================================================
+--- u-boot.orig/common/main.c
++++ u-boot/common/main.c
+@@ -85,6 +85,11 @@ int do_mdm_init = 0;
+ extern void mdm_init(void); /* defined in board.c */
+ #endif
+
++#ifdef CFG_PREBOOT_OVERRIDE
++extern char *preboot_override;
++#endif
++
++
+ /***************************************************************************
+ * Watch for 'delay' seconds for autoboot stop or autoboot delay string.
+ * returns: 0 - no key string, allow autoboot
+@@ -306,8 +311,8 @@ void main_loop (void)
+ char *s;
+ int bootdelay;
+ #endif
+-#ifdef CONFIG_PREBOOT
+- char *p;
++#if defined(CONFIG_PREBOOT) || defined(CFG_PREBOOT_OVERRIDE)
++ char *p = NULL;
+ #endif
+ #ifdef CONFIG_BOOTCOUNT_LIMIT
+ unsigned long bootcount = 0;
+@@ -364,8 +369,23 @@ void main_loop (void)
+ install_auto_complete();
+ #endif
+
++#if defined(CONFIG_PREBOOT) || defined(CFG_PREBOOT_OVERRIDE)
+ #ifdef CONFIG_PREBOOT
+- if ((p = getenv ("preboot")) != NULL) {
++ p = getenv ("preboot");
++#endif
++#ifdef CFG_PREBOOT_OVERRIDE
++ if (preboot_override) {
++ /* for convenience, preboot_override may end in \n, not \0 */
++ p = strchr(preboot_override, '\n');
++ if (p)
++ *p = 0;
++ /* make sure we can overwrite the load area if we want to */
++ p = strdup(preboot_override);
++ /* clean the image in case we want to flash it */
++ preboot_override = NULL;
++ }
++#endif /* CFG_PREBOOT_OVERRIDE */
++ if (p) {
+ # ifdef CONFIG_AUTOBOOT_KEYED
+ int prev = disable_ctrlc(1); /* disable Control C checking */
+ # endif
+@@ -381,7 +401,7 @@ void main_loop (void)
+ disable_ctrlc(prev); /* restore Control C checking */
+ # endif
+ }
+-#endif /* CONFIG_PREBOOT */
++#endif /* CONFIG_PREBOOT || CFG_PREBOOT_OVERRIDE */
+
+ #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
+ s = getenv ("bootdelay");
+Index: u-boot/common/env_common.c
+===================================================================
+--- u-boot.orig/common/env_common.c
++++ u-boot/common/env_common.c
+@@ -37,6 +37,10 @@
+ # define SHOW_BOOT_PROGRESS(arg)
+ #endif
+
++#ifdef CFG_PREBOOT_OVERRIDE
++extern char *preboot_override;
++#endif
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ #ifdef CONFIG_AMIGAONEG3SE
+@@ -234,7 +238,14 @@ void env_relocate (void)
+ puts ("*** Warning - bad CRC, using default environment\n\n");
+ SHOW_BOOT_PROGRESS (-1);
+ #endif
++ }
++
++#ifdef CFG_PREBOOT_OVERRIDE
++ if (preboot_override)
++ gd->env_valid = 0;
++#endif
+
++ if (gd->env_valid == 0) {
+ if (sizeof(default_environment) > ENV_SIZE)
+ {
+ puts ("*** Error - default environment is too large\n\n");