diff options
author | John Crispin <blogic@openwrt.org> | 2011-10-10 15:13:46 +0000 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2011-10-10 15:13:46 +0000 |
commit | 4cc422e0f3860fbe49957352cfb7cd61e5e884d3 (patch) | |
tree | 0f8c817f0dfc9ae67a7e62306b3070c4b4c8f1c0 /target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch | |
parent | 4f21c56812d340411d24db0a330beac3db9a0bd8 (diff) | |
download | master-187ad058-4cc422e0f3860fbe49957352cfb7cd61e5e884d3.tar.gz master-187ad058-4cc422e0f3860fbe49957352cfb7cd61e5e884d3.tar.bz2 master-187ad058-4cc422e0f3860fbe49957352cfb7cd61e5e884d3.zip |
[lantiq]
* update patches to 3.0
* add basic vr9 support
* backport 3.1 fixes
* backport 3.2 queue (falcon)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@28405 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch')
-rw-r--r-- | target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch b/target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch new file mode 100644 index 0000000000..6c6a45ac04 --- /dev/null +++ b/target/linux/lantiq/patches-3.0/201-owrt-mtd_uimage_split.patch @@ -0,0 +1,116 @@ +--- a/drivers/mtd/Kconfig ++++ b/drivers/mtd/Kconfig +@@ -41,6 +41,10 @@ config MTD_ROOTFS_SPLIT + bool "Automatically split 'rootfs' partition for squashfs" + default y + ++config MTD_UIMAGE_SPLIT ++ bool "Automatically split 'linux' partition into 'kernel' and 'rootfs'" ++ default y ++ + config MTD_REDBOOT_PARTS + tristate "RedBoot partition table parsing" + ---help--- +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -861,6 +861,82 @@ static int refresh_rootfs_split(struct m + } + #endif /* CONFIG_MTD_ROOTFS_SPLIT */ + ++ ++#ifdef CONFIG_MTD_UIMAGE_SPLIT ++static unsigned long find_uimage_size(struct mtd_info *mtd, ++ unsigned long offset) ++{ ++#define UBOOT_MAGIC 0x56190527 ++ unsigned long magic = 0; ++ unsigned long temp; ++ size_t len; ++ int ret; ++ ++ ret = mtd->read(mtd, offset, 4, &len, (void *)&magic); ++ if (ret || len != sizeof(magic)) ++ return 0; ++ ++ if (le32_to_cpu(magic) != UBOOT_MAGIC) ++ return 0; ++ ++ ret = mtd->read(mtd, offset + 12, 4, &len, (void *)&temp); ++ if (ret || len != sizeof(temp)) ++ return 0; ++ ++ return temp + 0x40; ++} ++ ++static int detect_squashfs_partition(struct mtd_info *mtd, unsigned long offset) ++{ ++ unsigned long temp; ++ size_t len; ++ int ret; ++ ++ ret = mtd->read(mtd, offset, 4, &len, (void *)&temp); ++ if (ret || len != sizeof(temp)) ++ return 0; ++ ++ return le32_to_cpu(temp) == SQUASHFS_MAGIC; ++} ++ ++static int split_uimage(struct mtd_info *mtd, ++ const struct mtd_partition *part) ++{ ++ static struct mtd_partition split_partitions[] = { ++ { ++ .name = "kernel", ++ .offset = 0x0, ++ .size = 0x0, ++ }, { ++ .name = "rootfs", ++ .offset = 0x0, ++ .size = 0x0, ++ }, ++ }; ++ ++ 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; ++ } ++ ++ if (!detect_squashfs_partition(mtd, ++ part->offset ++ + split_partitions[0].size)) { ++ split_partitions[0].size &= ~(mtd->erasesize - 1); ++ split_partitions[0].size += mtd->erasesize; ++ } ++ ++ split_partitions[0].offset = part->offset; ++ split_partitions[1].offset = part->offset + split_partitions[0].size; ++ split_partitions[1].size = part->size - split_partitions[0].size; ++ ++ add_mtd_partitions(mtd, split_partitions, 2); ++ ++ return 0; ++} ++#endif ++ + /* + * This function, given a master MTD object and a partition table, creates + * and registers slave MTD objects which are bound to the master according to +@@ -894,6 +970,17 @@ int add_mtd_partitions(struct mtd_info * + + add_mtd_device(&slave->mtd); + ++#ifdef CONFIG_MTD_UIMAGE_SPLIT ++ if (!strcmp(parts[i].name, "linux")) { ++ ret = split_uimage(master, &parts[i]); ++ ++ if (ret) { ++ printk(KERN_WARNING ++ "Can't split linux partition\n"); ++ } ++ } ++#endif ++ + if (!strcmp(parts[i].name, "rootfs")) { + #ifdef CONFIG_MTD_ROOTFS_ROOT_DEV + if (ROOT_DEV == 0) { |