Index: linux-3.10.49/drivers/mtd/Kconfig =================================================================== --- linux-3.10.49.orig/drivers/mtd/Kconfig +++ linux-3.10.49/drivers/mtd/Kconfig @@ -80,6 +80,13 @@ config MTD_TESTS WARNING: some of the tests will ERASE entire MTD device which they test. Do not use these tests unless you really know what you do. +config MTD_SIZE_DEPEND_PARTS + bool "Size depended partition generator (hardcoded)" + def_bool n + help + Generate a flash chip size depended partition layout. The layout itself + is hardcoded + config MTD_REDBOOT_PARTS tristate "RedBoot partition table parsing" ---help--- Index: linux-3.10.49/drivers/mtd/Makefile =================================================================== --- linux-3.10.49.orig/drivers/mtd/Makefile +++ linux-3.10.49/drivers/mtd/Makefile @@ -13,6 +13,7 @@ mtd-$(CONFIG_MTD_SPLIT_UIMAGE_FW) += mtd mtd-$(CONFIG_MTD_SPLIT_LZMA_FW) += mtdsplit_lzma.o obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o +obj-$(CONFIG_MTD_SIZE_DEPEND_PARTS) += size_depend.o obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o obj-$(CONFIG_MTD_AFS_PARTS) += afs.o Index: linux-3.10.49/drivers/mtd/size_depend.c =================================================================== --- /dev/null +++ linux-3.10.49/drivers/mtd/size_depend.c @@ -0,0 +1,111 @@ +/* + * Generate a mtd partition table based on the flash + * produce (hardcoded) layout. + * + * Copyright © 2015 Alexander Couzens + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +static int parse_size_depend_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +{ + /* 256k for "uboot" at the beginning + * space between for "firmware" + * 64k for "art" (calibration) data at the end + */ + int nrparts; + int namelen; + struct mtd_partition *parts; + char *name; + + printk(KERN_INFO "size_depend: generating mtd layout\n"); + /* +1 for \0 bytes */ + namelen = strlen("firmware") + 1 + + strlen("u-boot") + 1 + + strlen("u-boot-env") + 1 + + strlen("art") + 1; + + nrparts = 4; + + parts = kzalloc(sizeof(*parts)*nrparts + namelen, GFP_KERNEL); + if (!parts) + return ERR_PTR(-ENOMEM); + + name = (char *) &parts[nrparts]; + + parts[0].name = name; + parts[0].size = 256 * 1024; + parts[0].offset = 0; + parts[0].mask_flags |= MTD_WRITEABLE; + strlcpy(name, "u-boot", strlen("u-boot") + 1); + name += strlen("u-boot") + 1; + + parts[1].name = name; + parts[1].size = 64 * 1024; + parts[1].offset = 256 * 1024; + strlcpy(name, "u-boot-env", strlen("u-boot-env") + 1); + name += strlen("u-boot-env") + 1; + + parts[2].name = name; + parts[2].size = mtd_get_device_size(master) - ((320 * 1024) + (64 * 1024)); + parts[2].offset = 320 * 1024; + strlcpy(name, "firmware", strlen("firmware") + 1); + name += strlen("firmware") + 1; + + parts[3].name = name; + parts[3].size = 64 * 1024; + parts[3].offset = mtd_get_device_size(master) - (64 * 1024); + parts[3].mask_flags |= MTD_WRITEABLE; + strlcpy(name, "art", strlen("art") + 1); + + *pparts = parts; + + return nrparts; +} + +static struct mtd_part_parser size_depend_parser = { + .owner = THIS_MODULE, + .parse_fn = parse_size_depend_partitions, + .name = "SizeDepend", +}; + +/* mtd parsers will request the module by parser name */ +MODULE_ALIAS("SizeDepend"); + +static int __init size_depend_parser_init(void) +{ + return register_mtd_parser(&size_depend_parser); +} + +static void __exit size_depend_parser_exit(void) +{ + deregister_mtd_parser(&size_depend_parser); +} + +module_init(size_depend_parser_init); +module_exit(size_depend_parser_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Alexander Couzens "); +MODULE_DESCRIPTION("Choose a partition table based on flash size");