implement openwrt compliant flashmap
authorJohn Crispin <john@openwrt.org>
Sat, 3 May 2008 19:40:15 +0000 (19:40 +0000)
committerJohn Crispin <john@openwrt.org>
Sat, 3 May 2008 19:40:15 +0000 (19:40 +0000)
SVN-Revision: 11035

target/linux/etrax/patches/201-flashsize.patch [new file with mode: 0644]

diff --git a/target/linux/etrax/patches/201-flashsize.patch b/target/linux/etrax/patches/201-flashsize.patch
new file mode 100644 (file)
index 0000000..4982963
--- /dev/null
@@ -0,0 +1,92 @@
+Index: linux-2.6.25.1/arch/cris/arch-v10/lib/hw_settings.S
+===================================================================
+--- linux-2.6.25.1.orig/arch/cris/arch-v10/lib/hw_settings.S   2008-05-03 20:25:16.000000000 +0100
++++ linux-2.6.25.1/arch/cris/arch-v10/lib/hw_settings.S        2008-05-03 20:25:35.000000000 +0100
+@@ -60,3 +60,5 @@
+       .dword R_PORT_PB_SET
+       .dword PB_SET_VALUE
+       .dword 0 ; No more register values
++      .ascii "ACME_PART_MAGIC" 
++      .dword 0xdeadc0de
+Index: linux-2.6.25.1/arch/cris/arch-v10/drivers/axisflashmap.c
+===================================================================
+--- linux-2.6.25.1.orig/arch/cris/arch-v10/drivers/axisflashmap.c      2008-05-03 20:27:28.000000000 +0100
++++ linux-2.6.25.1/arch/cris/arch-v10/drivers/axisflashmap.c   2008-05-03 20:34:54.000000000 +0100
+@@ -113,7 +113,7 @@
+ /* If no partition-table was found, we use this default-set. */
+ #define MAX_PARTITIONS         7
+-#define NUM_DEFAULT_PARTITIONS 3
++#define NUM_DEFAULT_PARTITIONS 2
+ /*
+  * Default flash size is 2MB. CONFIG_ETRAX_PTABLE_SECTOR is most likely the
+@@ -122,19 +122,14 @@
+  */
+ static struct mtd_partition axis_default_partitions[NUM_DEFAULT_PARTITIONS] = {
+       {
+-              .name = "boot firmware",
+-              .size = CONFIG_ETRAX_PTABLE_SECTOR,
+-              .offset = 0
+-      },
+-      {
+               .name = "kernel",
+-              .size = 0x200000 - (6 * CONFIG_ETRAX_PTABLE_SECTOR),
+-              .offset = CONFIG_ETRAX_PTABLE_SECTOR
++              .size = 0x00,
++              .offset = 0
+       },
+       {
+-              .name = "filesystem",
+-              .size = 5 * CONFIG_ETRAX_PTABLE_SECTOR,
+-              .offset = 0x200000 - (5 * CONFIG_ETRAX_PTABLE_SECTOR)
++              .name = "rootfs",
++              .size = 0x200000 ,
++              .offset = 0x200000
+       }
+ };
+@@ -281,6 +276,11 @@
+       struct partitiontable_entry *ptable;
+       int use_default_ptable = 1; /* Until proven otherwise. */
+       const char pmsg[] = "  /dev/flash%d at 0x%08x, size 0x%08x\n";
++      unsigned int kernel_part_size = 0;
++      unsigned char *flash_mem = (unsigned char*)(FLASH_CACHED_ADDR);
++      unsigned int flash_scan_count = 0;
++      const char *part_magic = "ACME_PART_MAGIC";
++      unsigned int magic_len = strlen(part_magic);
+       if (!(mymtd = flash_probe())) {
+               /* There's no reason to use this module if no flash chip can
+@@ -292,6 +292,31 @@
+                      mymtd->name, mymtd->size);
+               axisflash_mtd = mymtd;
+       }
++      /* scan flash to findout where out partition starts */
++
++      printk(KERN_INFO "Scanning flash for end of kernel magic\n");
++      for(flash_scan_count = 0; flash_scan_count < 100000; flash_scan_count++){
++              if(strncmp(&flash_mem[flash_scan_count], part_magic, magic_len - 1) == 0)
++              {
++                      kernel_part_size = flash_mem[flash_scan_count + magic_len ];
++                      kernel_part_size <<= 8;
++                      kernel_part_size += flash_mem[flash_scan_count + magic_len + 2];
++                      kernel_part_size <<= 8;
++                      kernel_part_size += flash_mem[flash_scan_count + magic_len + 1];
++                      kernel_part_size <<= 8;
++                      kernel_part_size += flash_mem[flash_scan_count + magic_len + 3];
++                      printk(KERN_INFO "Kernel ends at 0x%.08X\n", kernel_part_size);
++                      flash_scan_count = 1100000;
++              }
++      }
++
++
++      if(kernel_part_size){
++              kernel_part_size = (kernel_part_size & 0xffff0000);
++              axis_default_partitions[0].size = kernel_part_size;
++              axis_default_partitions[1].size =  mymtd->size - axis_default_partitions[0].size;
++              axis_default_partitions[1].offset = axis_default_partitions[0].size;
++      }
+       if (mymtd) {
+               mymtd->owner = THIS_MODULE;