diff options
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.patch | 137 |
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"); |