source: trunk/target/linux/lantiq/patches-3.0/210-mtd_uimage_split.patch @ 28308

Last change on this file since 28308 was 28308, checked in by blogic, 5 years ago

[lantiq]

  • rebase 3.0 patches
  • fold some fixes into existing patches
File size: 2.8 KB
  • drivers/mtd/Kconfig

    a b config MTD_ROOTFS_SPLIT 
    4141        bool "Automatically split 'rootfs' partition for squashfs" 
    4242        default y 
    4343 
     44config MTD_UIMAGE_SPLIT 
     45        bool "Automatically split 'linux' partition into 'kernel' and 'rootfs'" 
     46        default y 
     47 
    4448config MTD_REDBOOT_PARTS 
    4549        tristate "RedBoot partition table parsing" 
    4650        ---help--- 
  • drivers/mtd/mtdpart.c

    a b static int refresh_rootfs_split(struct m 
    861861} 
    862862#endif /* CONFIG_MTD_ROOTFS_SPLIT */ 
    863863 
     864 
     865#ifdef CONFIG_MTD_UIMAGE_SPLIT 
     866static unsigned long find_uimage_size(struct mtd_info *mtd, 
     867                                      unsigned long offset) 
     868{ 
     869#define UBOOT_MAGIC     0x56190527 
     870        unsigned long magic = 0; 
     871        unsigned long temp; 
     872        size_t len; 
     873        int ret; 
     874 
     875        ret = mtd->read(mtd, offset, 4, &len, (void *)&magic); 
     876        if (ret || len != sizeof(magic)) 
     877                return 0; 
     878 
     879        if (le32_to_cpu(magic) != UBOOT_MAGIC) 
     880                return 0; 
     881 
     882        ret = mtd->read(mtd, offset + 12, 4, &len, (void *)&temp); 
     883        if (ret || len != sizeof(temp)) 
     884                return 0; 
     885 
     886        return temp + 0x40; 
     887} 
     888 
     889static int detect_squashfs_partition(struct mtd_info *mtd, unsigned long offset) 
     890{ 
     891        unsigned long temp; 
     892        size_t len; 
     893        int ret; 
     894 
     895        ret = mtd->read(mtd, offset, 4, &len, (void *)&temp); 
     896        if (ret || len != sizeof(temp)) 
     897                return 0; 
     898 
     899        return le32_to_cpu(temp) == SQUASHFS_MAGIC; 
     900} 
     901 
     902static int split_uimage(struct mtd_info *mtd, 
     903                        const struct mtd_partition *part) 
     904{ 
     905        static struct mtd_partition split_partitions[] = { 
     906                { 
     907                        .name = "kernel", 
     908                        .offset = 0x0, 
     909                        .size = 0x0, 
     910                }, { 
     911                        .name = "rootfs", 
     912                        .offset = 0x0, 
     913                        .size = 0x0, 
     914                }, 
     915        }; 
     916 
     917        split_partitions[0].size = find_uimage_size(mtd, part->offset); 
     918        if (!split_partitions[0].size) { 
     919                printk(KERN_NOTICE "no uImage found in linux partition\n"); 
     920                return -1; 
     921        } 
     922 
     923        if (!detect_squashfs_partition(mtd, 
     924                                       part->offset 
     925                                       + split_partitions[0].size)) { 
     926                split_partitions[0].size &= ~(mtd->erasesize - 1); 
     927                split_partitions[0].size += mtd->erasesize; 
     928        } 
     929 
     930        split_partitions[0].offset = part->offset; 
     931        split_partitions[1].offset = part->offset + split_partitions[0].size; 
     932        split_partitions[1].size = part->size - split_partitions[0].size; 
     933 
     934        add_mtd_partitions(mtd, split_partitions, 2); 
     935 
     936        return 0; 
     937} 
     938#endif 
     939 
    864940/* 
    865941 * This function, given a master MTD object and a partition table, creates 
    866942 * and registers slave MTD objects which are bound to the master according to 
    int add_mtd_partitions(struct mtd_info * 
    894970 
    895971                add_mtd_device(&slave->mtd); 
    896972 
     973#ifdef CONFIG_MTD_UIMAGE_SPLIT 
     974                if (!strcmp(parts[i].name, "linux")) { 
     975                        ret = split_uimage(master, &parts[i]); 
     976 
     977                        if (ret) { 
     978                                printk(KERN_WARNING 
     979                                       "Can't split linux partition\n"); 
     980                        } 
     981                } 
     982#endif 
     983 
    897984                if (!strcmp(parts[i].name, "rootfs")) { 
    898985#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV 
    899986                        if (ROOT_DEV == 0) { 
Note: See TracBrowser for help on using the repository browser.