[lantiq] Support booting the Speedport W502V using BRN-BOOT.
[openwrt.git] / target / linux / lantiq / patches / 206-owrt-brnboot.patch
diff --git a/target/linux/lantiq/patches/206-owrt-brnboot.patch b/target/linux/lantiq/patches/206-owrt-brnboot.patch
new file mode 100644 (file)
index 0000000..c21d76d
--- /dev/null
@@ -0,0 +1,93 @@
+Index: linux-3.1.9/drivers/mtd/mtdpart.c
+===================================================================
+--- linux-3.1.9.orig/drivers/mtd/mtdpart.c     2012-01-29 22:55:30.295904157 +0100
++++ linux-3.1.9/drivers/mtd/mtdpart.c  2012-01-29 22:55:30.395904294 +0100
+@@ -899,6 +899,38 @@
+       return le32_to_cpu(temp) == SQUASHFS_MAGIC;
+ }
++static unsigned long find_brnimage_size(struct mtd_info *mtd,
++                                    unsigned long offset)
++{
++      unsigned long buf[4];
++      // Assume at most 2MB of kernel image
++      unsigned long end = offset + (2 << 20);
++      unsigned long ptr = offset + 0x400 - 12;
++      size_t len;
++      int ret;
++
++      while (ptr < end) {
++              long size_min = ptr - 0x400 - 12 - offset;
++              long size_max = ptr + 12 - offset;
++              ret = mtd->read(mtd, ptr, 16, &len, (void *)buf);
++              if (ret || len != 16)
++                      return 0;
++
++              if (le32_to_cpu(buf[0]) < size_min ||
++                  le32_to_cpu(buf[0]) > size_max) {
++                      ptr += 0x400;
++                      continue;
++              }
++
++              if (le32_to_cpu(buf[3]) == SQUASHFS_MAGIC)
++                      return ptr + 12 - offset;
++
++              ptr += 0x400;
++      }
++
++      return 0;
++}
++
+ static int split_uimage(struct mtd_info *mtd,
+                       const struct mtd_partition *part)
+ {
+@@ -916,8 +948,11 @@
+       split_partitions[0].size = find_uimage_size(mtd, part->offset);
+       if (!split_partitions[0].size) {
+-              printk(KERN_NOTICE "no uImage found in linux partition\n");
+-              return -1;
++              split_partitions[0].size = find_brnimage_size(mtd, part->offset);
++              if (!split_partitions[0].size) {
++                      printk(KERN_NOTICE "no uImage or brnImage found in linux partition\n");
++                      return -1;
++              }
+       }
+       if (!detect_squashfs_partition(mtd,
+Index: linux-3.1.9/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+===================================================================
+--- linux-3.1.9.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h       2012-01-29 22:55:30.195904014 +0100
++++ linux-3.1.9/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h    2012-01-29 22:55:30.395904294 +0100
+@@ -149,6 +149,7 @@
+ extern __iomem void *ltq_ebu_membase;
+ extern __iomem void *ltq_cgu_membase;
++extern long ltq_brn_boot;
+ /* request a non-gpio and set the PIO config */
+ extern int  ltq_gpio_request(unsigned int pin, unsigned int alt0,
+Index: linux-3.1.9/arch/mips/lantiq/setup.c
+===================================================================
+--- linux-3.1.9.orig/arch/mips/lantiq/setup.c  2012-01-29 22:55:30.095903875 +0100
++++ linux-3.1.9/arch/mips/lantiq/setup.c       2012-01-29 22:59:28.686237119 +0100
+@@ -20,6 +20,8 @@
+ /* assume 16M as default incase uboot fails to pass proper ramsize */
+ unsigned long physical_memsize = 16L;
++/* set to 1 if the bootloader is BRN-BOOT instead of u-boot */
++unsigned long ltq_brn_boot = 0;
+ void __init plat_mem_setup(void)
+ {
+@@ -39,6 +41,10 @@
+                       if (strict_strtoul(e, 0, &physical_memsize))
+                               pr_warn("bad memsize specified\n");
+               }
++              if (!strncmp(e, "BRN-BOOT", 8)){
++                      pr_info("Found BRN-BOOT instead of u-boot\n");
++                      ltq_brn_boot = 1;
++              }
+               envp++;
+       }
+       physical_memsize *= 1024 * 1024;
This page took 0.058322 seconds and 4 git commands to generate.