11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * MTD partitioning layer definitions 31da177e4SLinus Torvalds * 42f82af08SNicolas Pitre * (C) 2000 Nicolas Pitre <nico@fluxnic.net> 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * This code is GPL 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #ifndef MTD_PARTITIONS_H 101da177e4SLinus Torvalds #define MTD_PARTITIONS_H 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <linux/types.h> 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds /* 161da177e4SLinus Torvalds * Partition definition structure: 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds * An array of struct partition is passed along with a MTD object to 19f5671ab3SJamie Iles * mtd_device_register() to create them. 201da177e4SLinus Torvalds * 211da177e4SLinus Torvalds * For each partition, these fields are available: 221da177e4SLinus Torvalds * name: string that will be used to label the partition's MTD device. 231a0915beSRafał Miłecki * types: some partitions can be containers using specific format to describe 241a0915beSRafał Miłecki * embedded subpartitions / volumes. E.g. many home routers use "firmware" 251a0915beSRafał Miłecki * partition that contains at least kernel and rootfs. In such case an 261a0915beSRafał Miłecki * extra parser is needed that will detect these dynamic partitions and 271a0915beSRafał Miłecki * report them to the MTD subsystem. If set this property stores an array 281a0915beSRafał Miłecki * of parser names to use when looking for subpartitions. 291da177e4SLinus Torvalds * size: the partition size; if defined as MTDPART_SIZ_FULL, the partition 301da177e4SLinus Torvalds * will extend to the end of the master MTD device. 311da177e4SLinus Torvalds * offset: absolute starting position within the master MTD device; if 321da177e4SLinus Torvalds * defined as MTDPART_OFS_APPEND, the partition will start where the 331a31368bSDmitry Eremin-Solenikov * previous one ended; if MTDPART_OFS_NXTBLK, at the next erase block; 341a31368bSDmitry Eremin-Solenikov * if MTDPART_OFS_RETAIN, consume as much as possible, leaving size 351a31368bSDmitry Eremin-Solenikov * after the end of partition. 361da177e4SLinus Torvalds * mask_flags: contains flags that have to be masked (removed) from the 371da177e4SLinus Torvalds * master MTD flag set for the corresponding MTD partition. 381da177e4SLinus Torvalds * For example, to force a read-only partition, simply adding 391da177e4SLinus Torvalds * MTD_WRITEABLE to the mask_flags will do the trick. 40*9e3307a1SBoris Brezillon * add_flags: contains flags to add to the parent flags 411da177e4SLinus Torvalds * 421da177e4SLinus Torvalds * Note: writeable partitions require their size and offset be 431da177e4SLinus Torvalds * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK). 441da177e4SLinus Torvalds */ 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds struct mtd_partition { 4726a6d240SGeert Uytterhoeven const char *name; /* identifier string */ 481a0915beSRafał Miłecki const char *const *types; /* names of parsers to use if any */ 4969423d99SAdrian Hunter uint64_t size; /* partition size */ 5069423d99SAdrian Hunter uint64_t offset; /* offset within the master MTD space */ 5126cdb67cSDavid Woodhouse uint32_t mask_flags; /* master MTD flags to mask out for this partition */ 52*9e3307a1SBoris Brezillon uint32_t add_flags; /* flags to add to the partition */ 5342e9401bSSascha Hauer struct device_node *of_node; 541da177e4SLinus Torvalds }; 551da177e4SLinus Torvalds 561a31368bSDmitry Eremin-Solenikov #define MTDPART_OFS_RETAIN (-3) 571da177e4SLinus Torvalds #define MTDPART_OFS_NXTBLK (-2) 581da177e4SLinus Torvalds #define MTDPART_OFS_APPEND (-1) 591da177e4SLinus Torvalds #define MTDPART_SIZ_FULL (0) 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds 627699ad35SNicolas Pitre struct mtd_info; 63d26c87d6SDmitry Eremin-Solenikov struct device_node; 647699ad35SNicolas Pitre 65c7975330SDmitry Eremin-Solenikov /** 66c7975330SDmitry Eremin-Solenikov * struct mtd_part_parser_data - used to pass data to MTD partition parsers. 67c7975330SDmitry Eremin-Solenikov * @origin: for RedBoot, start address of MTD device 68c7975330SDmitry Eremin-Solenikov */ 69c7975330SDmitry Eremin-Solenikov struct mtd_part_parser_data { 70c7975330SDmitry Eremin-Solenikov unsigned long origin; 71c7975330SDmitry Eremin-Solenikov }; 72c7975330SDmitry Eremin-Solenikov 73c7975330SDmitry Eremin-Solenikov 741da177e4SLinus Torvalds /* 751da177e4SLinus Torvalds * Functions dealing with the various ways of partitioning the space 761da177e4SLinus Torvalds */ 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds struct mtd_part_parser { 791da177e4SLinus Torvalds struct list_head list; 801da177e4SLinus Torvalds struct module *owner; 811da177e4SLinus Torvalds const char *name; 825b644aa0SRafał Miłecki const struct of_device_id *of_match_table; 83b9adf469SBrian Norris int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, 84c7975330SDmitry Eremin-Solenikov struct mtd_part_parser_data *); 85adc83bf8SBrian Norris void (*cleanup)(const struct mtd_partition *pparts, int nr_parts); 861da177e4SLinus Torvalds }; 871da177e4SLinus Torvalds 8807fd2f87SBrian Norris /* Container for passing around a set of parsed partitions */ 8907fd2f87SBrian Norris struct mtd_partitions { 9007fd2f87SBrian Norris const struct mtd_partition *parts; 9107fd2f87SBrian Norris int nr_parts; 9207fd2f87SBrian Norris const struct mtd_part_parser *parser; 9307fd2f87SBrian Norris }; 9407fd2f87SBrian Norris 95b9eab011SBrian Norris extern int __register_mtd_parser(struct mtd_part_parser *parser, 96b9eab011SBrian Norris struct module *owner); 97b9eab011SBrian Norris #define register_mtd_parser(parser) __register_mtd_parser(parser, THIS_MODULE) 98b9eab011SBrian Norris 99cf3b2b1eSAxel Lin extern void deregister_mtd_parser(struct mtd_part_parser *parser); 1001da177e4SLinus Torvalds 101b9eab011SBrian Norris /* 102b9eab011SBrian Norris * module_mtd_part_parser() - Helper macro for MTD partition parsers that don't 103b9eab011SBrian Norris * do anything special in module init/exit. Each driver may only use this macro 104b9eab011SBrian Norris * once, and calling it replaces module_init() and module_exit(). 105b9eab011SBrian Norris */ 106b9eab011SBrian Norris #define module_mtd_part_parser(__mtd_part_parser) \ 107b9eab011SBrian Norris module_driver(__mtd_part_parser, register_mtd_parser, \ 108b9eab011SBrian Norris deregister_mtd_parser) 109b9eab011SBrian Norris 11026a6d240SGeert Uytterhoeven int mtd_add_partition(struct mtd_info *master, const char *name, 1115daa7b21SRoman Tereshonkov long long offset, long long length); 1125daa7b21SRoman Tereshonkov int mtd_del_partition(struct mtd_info *master, int partno); 11362082e56SRichard Genoud uint64_t mtd_get_device_size(const struct mtd_info *mtd); 1145daa7b21SRoman Tereshonkov 1159a310d21SScott Wood #endif 116