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. 231da177e4SLinus Torvalds * size: the partition size; if defined as MTDPART_SIZ_FULL, the partition 241da177e4SLinus Torvalds * will extend to the end of the master MTD device. 251da177e4SLinus Torvalds * offset: absolute starting position within the master MTD device; if 261da177e4SLinus Torvalds * defined as MTDPART_OFS_APPEND, the partition will start where the 271a31368bSDmitry Eremin-Solenikov * previous one ended; if MTDPART_OFS_NXTBLK, at the next erase block; 281a31368bSDmitry Eremin-Solenikov * if MTDPART_OFS_RETAIN, consume as much as possible, leaving size 291a31368bSDmitry Eremin-Solenikov * after the end of partition. 301da177e4SLinus Torvalds * mask_flags: contains flags that have to be masked (removed) from the 311da177e4SLinus Torvalds * master MTD flag set for the corresponding MTD partition. 321da177e4SLinus Torvalds * For example, to force a read-only partition, simply adding 331da177e4SLinus Torvalds * MTD_WRITEABLE to the mask_flags will do the trick. 341da177e4SLinus Torvalds * 351da177e4SLinus Torvalds * Note: writeable partitions require their size and offset be 361da177e4SLinus Torvalds * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK). 371da177e4SLinus Torvalds */ 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds struct mtd_partition { 4026a6d240SGeert Uytterhoeven const char *name; /* identifier string */ 4169423d99SAdrian Hunter uint64_t size; /* partition size */ 4269423d99SAdrian Hunter uint64_t offset; /* offset within the master MTD space */ 4326cdb67cSDavid Woodhouse uint32_t mask_flags; /* master MTD flags to mask out for this partition */ 44*42e9401bSSascha Hauer struct device_node *of_node; 451da177e4SLinus Torvalds }; 461da177e4SLinus Torvalds 471a31368bSDmitry Eremin-Solenikov #define MTDPART_OFS_RETAIN (-3) 481da177e4SLinus Torvalds #define MTDPART_OFS_NXTBLK (-2) 491da177e4SLinus Torvalds #define MTDPART_OFS_APPEND (-1) 501da177e4SLinus Torvalds #define MTDPART_SIZ_FULL (0) 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds 537699ad35SNicolas Pitre struct mtd_info; 54d26c87d6SDmitry Eremin-Solenikov struct device_node; 557699ad35SNicolas Pitre 56c7975330SDmitry Eremin-Solenikov /** 57c7975330SDmitry Eremin-Solenikov * struct mtd_part_parser_data - used to pass data to MTD partition parsers. 58c7975330SDmitry Eremin-Solenikov * @origin: for RedBoot, start address of MTD device 59c7975330SDmitry Eremin-Solenikov */ 60c7975330SDmitry Eremin-Solenikov struct mtd_part_parser_data { 61c7975330SDmitry Eremin-Solenikov unsigned long origin; 62c7975330SDmitry Eremin-Solenikov }; 63c7975330SDmitry Eremin-Solenikov 64c7975330SDmitry Eremin-Solenikov 651da177e4SLinus Torvalds /* 661da177e4SLinus Torvalds * Functions dealing with the various ways of partitioning the space 671da177e4SLinus Torvalds */ 681da177e4SLinus Torvalds 691da177e4SLinus Torvalds struct mtd_part_parser { 701da177e4SLinus Torvalds struct list_head list; 711da177e4SLinus Torvalds struct module *owner; 721da177e4SLinus Torvalds const char *name; 73b9adf469SBrian Norris int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, 74c7975330SDmitry Eremin-Solenikov struct mtd_part_parser_data *); 75adc83bf8SBrian Norris void (*cleanup)(const struct mtd_partition *pparts, int nr_parts); 761da177e4SLinus Torvalds }; 771da177e4SLinus Torvalds 7807fd2f87SBrian Norris /* Container for passing around a set of parsed partitions */ 7907fd2f87SBrian Norris struct mtd_partitions { 8007fd2f87SBrian Norris const struct mtd_partition *parts; 8107fd2f87SBrian Norris int nr_parts; 8207fd2f87SBrian Norris const struct mtd_part_parser *parser; 8307fd2f87SBrian Norris }; 8407fd2f87SBrian Norris 85b9eab011SBrian Norris extern int __register_mtd_parser(struct mtd_part_parser *parser, 86b9eab011SBrian Norris struct module *owner); 87b9eab011SBrian Norris #define register_mtd_parser(parser) __register_mtd_parser(parser, THIS_MODULE) 88b9eab011SBrian Norris 89cf3b2b1eSAxel Lin extern void deregister_mtd_parser(struct mtd_part_parser *parser); 901da177e4SLinus Torvalds 91b9eab011SBrian Norris /* 92b9eab011SBrian Norris * module_mtd_part_parser() - Helper macro for MTD partition parsers that don't 93b9eab011SBrian Norris * do anything special in module init/exit. Each driver may only use this macro 94b9eab011SBrian Norris * once, and calling it replaces module_init() and module_exit(). 95b9eab011SBrian Norris */ 96b9eab011SBrian Norris #define module_mtd_part_parser(__mtd_part_parser) \ 97b9eab011SBrian Norris module_driver(__mtd_part_parser, register_mtd_parser, \ 98b9eab011SBrian Norris deregister_mtd_parser) 99b9eab011SBrian Norris 1005dee4674SRichard Genoud int mtd_is_partition(const struct mtd_info *mtd); 10126a6d240SGeert Uytterhoeven int mtd_add_partition(struct mtd_info *master, const char *name, 1025daa7b21SRoman Tereshonkov long long offset, long long length); 1035daa7b21SRoman Tereshonkov int mtd_del_partition(struct mtd_info *master, int partno); 10462082e56SRichard Genoud uint64_t mtd_get_device_size(const struct mtd_info *mtd); 1055daa7b21SRoman Tereshonkov 1069a310d21SScott Wood #endif 107