source: trunk/target/linux/lantiq/patches-2.6.39/210-mtd_uimage_split.patch @ 27026

Last change on this file since 27026 was 27026, checked in by blogic, 6 years ago

[lantiq]

  • backport 2.6.8 patches to .39 / .32.33
  • remove lqtapi
  • bump tapi/dsl to .39
  • migrate to new ltq_ style api
  • add amazon_se support
File size: 2.7 KB
  • drivers/mtd/Kconfig

    a b  
    6363        depends on MTD_PARTITIONS 
    6464        default y 
    6565 
     66config MTD_UIMAGE_SPLIT 
     67        bool "Automatically split 'linux' partition into 'kernel' and 'rootfs'" 
     68        default y 
     69 
    6670config MTD_REDBOOT_PARTS 
    6771        tristate "RedBoot partition table parsing" 
    6872        depends on MTD_PARTITIONS 
  • drivers/mtd/mtdpart.c

    a b  
    724724} 
    725725#endif /* CONFIG_MTD_ROOTFS_SPLIT */ 
    726726 
     727 
     728#ifdef CONFIG_MTD_UIMAGE_SPLIT 
     729static unsigned long find_uimage_size(struct mtd_info *mtd, 
     730                                      unsigned long offset) 
     731{ 
     732#define UBOOT_MAGIC     0x56190527 
     733        unsigned long magic = 0; 
     734        unsigned long temp; 
     735        size_t len; 
     736        int ret; 
     737 
     738        ret = mtd->read(mtd, offset, 4, &len, (void *)&magic); 
     739        if (ret || len != sizeof(magic)) 
     740                return 0; 
     741 
     742        if (le32_to_cpu(magic) != UBOOT_MAGIC) 
     743                return 0; 
     744 
     745        ret = mtd->read(mtd, offset + 12, 4, &len, (void *)&temp); 
     746        if (ret || len != sizeof(temp)) 
     747                return 0; 
     748 
     749        return temp + 0x40; 
     750} 
     751 
     752static int detect_squashfs_partition(struct mtd_info *mtd, unsigned long offset) 
     753{ 
     754        unsigned long temp; 
     755        size_t len; 
     756        int ret; 
     757 
     758        ret = mtd->read(mtd, offset, 4, &len, (void *)&temp); 
     759        if (ret || len != sizeof(temp)) 
     760                return 0; 
     761 
     762        return le32_to_cpu(temp) == SQUASHFS_MAGIC; 
     763} 
     764 
     765static int split_uimage(struct mtd_info *mtd, 
     766                        const struct mtd_partition *part) 
     767{ 
     768        static struct mtd_partition split_partitions[] = { 
     769                { 
     770                        .name = "kernel", 
     771                        .offset = 0x0, 
     772                        .size = 0x0, 
     773                }, { 
     774                        .name = "rootfs", 
     775                        .offset = 0x0, 
     776                        .size = 0x0, 
     777                }, 
     778        }; 
     779 
     780        split_partitions[0].size = find_uimage_size(mtd, part->offset); 
     781        if (!split_partitions[0].size) { 
     782                printk(KERN_NOTICE "no uImage found in linux partition\n"); 
     783                return -1; 
     784        } 
     785 
     786        if (!detect_squashfs_partition(mtd, 
     787                                       part->offset 
     788                                       + split_partitions[0].size)) { 
     789                split_partitions[0].size &= ~(mtd->erasesize - 1); 
     790                split_partitions[0].size += mtd->erasesize; 
     791        } 
     792 
     793        split_partitions[0].offset = part->offset; 
     794        split_partitions[1].offset = part->offset + split_partitions[0].size; 
     795        split_partitions[1].size = part->size - split_partitions[0].size; 
     796 
     797        add_mtd_partitions(mtd, split_partitions, 2); 
     798 
     799        return 0; 
     800} 
     801#endif 
     802 
    727803/* 
    728804 * This function, given a master MTD object and a partition table, creates 
    729805 * and registers slave MTD objects which are bound to the master according to 
     
    748824                if (!slave) 
    749825                        return -ENOMEM; 
    750826 
     827#ifdef CONFIG_MTD_UIMAGE_SPLIT 
     828                if (!strcmp(parts[i].name, "linux")) { 
     829                        ret = split_uimage(master, &parts[i]); 
     830 
     831                        if (ret) { 
     832                                printk(KERN_WARNING 
     833                                       "Can't split linux partition\n"); 
     834                        } 
     835                } 
     836#endif 
     837 
    751838                if (!strcmp(parts[i].name, "rootfs")) { 
    752839#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV 
    753840                        if (ROOT_DEV == 0) { 
Note: See TracBrowser for help on using the repository browser.