Home | History | Annotate | Download | only in mtd
      1 /*
      2  * Portions of MTD ABI definition which are shared by kernel and user space
      3  */
      4 
      5 #ifndef __MTD_ABI_H__
      6 #define __MTD_ABI_H__
      7 
      8 #include <linux/types.h>
      9 
     10 struct erase_info_user {
     11 	__u32 start;
     12 	__u32 length;
     13 };
     14 
     15 struct erase_info_user64 {
     16 	__u64 start;
     17 	__u64 length;
     18 };
     19 
     20 struct mtd_oob_buf {
     21 	__u32 start;
     22 	__u32 length;
     23 	unsigned char *ptr;
     24 };
     25 
     26 struct mtd_oob_buf64 {
     27 	__u64 start;
     28 	__u32 pad;
     29 	__u32 length;
     30 	__u64 usr_ptr;
     31 };
     32 
     33 #define MTD_ABSENT		0
     34 #define MTD_RAM			1
     35 #define MTD_ROM			2
     36 #define MTD_NORFLASH		3
     37 #define MTD_NANDFLASH		4
     38 #define MTD_DATAFLASH		6
     39 #define MTD_UBIVOLUME		7
     40 
     41 #define MTD_WRITEABLE		0x400	/* Device is writeable */
     42 #define MTD_BIT_WRITEABLE	0x800	/* Single bits can be flipped */
     43 #define MTD_NO_ERASE		0x1000	/* No erase necessary */
     44 #define MTD_POWERUP_LOCK	0x2000	/* Always locked after reset */
     45 
     46 // Some common devices / combinations of capabilities
     47 #define MTD_CAP_ROM		0
     48 #define MTD_CAP_RAM		(MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)
     49 #define MTD_CAP_NORFLASH	(MTD_WRITEABLE | MTD_BIT_WRITEABLE)
     50 #define MTD_CAP_NANDFLASH	(MTD_WRITEABLE)
     51 
     52 /* ECC byte placement */
     53 #define MTD_NANDECC_OFF		0	// Switch off ECC (Not recommended)
     54 #define MTD_NANDECC_PLACE	1	// Use the given placement in the structure (YAFFS1 legacy mode)
     55 #define MTD_NANDECC_AUTOPLACE	2	// Use the default placement scheme
     56 #define MTD_NANDECC_PLACEONLY	3	// Use the given placement in the structure (Do not store ecc result on read)
     57 #define MTD_NANDECC_AUTOPL_USR 	4	// Use the given autoplacement scheme rather than using the default
     58 
     59 /* OTP mode selection */
     60 #define MTD_OTP_OFF		0
     61 #define MTD_OTP_FACTORY		1
     62 #define MTD_OTP_USER		2
     63 
     64 struct mtd_info_user {
     65 	__u8 type;
     66 	__u32 flags;
     67 	__u32 size;	 // Total size of the MTD
     68 	__u32 erasesize;
     69 	__u32 writesize;
     70 	__u32 oobsize;   // Amount of OOB data per block (e.g. 16)
     71 	/* The below two fields are obsolete and broken, do not use them
     72 	 * (TODO: remove at some point) */
     73 	__u32 ecctype;
     74 	__u32 eccsize;
     75 };
     76 
     77 struct region_info_user {
     78 	__u32 offset;		/* At which this region starts,
     79 					 * from the beginning of the MTD */
     80 	__u32 erasesize;		/* For this region */
     81 	__u32 numblocks;		/* Number of blocks in this region */
     82 	__u32 regionindex;
     83 };
     84 
     85 struct otp_info {
     86 	__u32 start;
     87 	__u32 length;
     88 	__u32 locked;
     89 };
     90 
     91 #define MEMGETINFO		_IOR('M', 1, struct mtd_info_user)
     92 #define MEMERASE		_IOW('M', 2, struct erase_info_user)
     93 #define MEMWRITEOOB		_IOWR('M', 3, struct mtd_oob_buf)
     94 #define MEMREADOOB		_IOWR('M', 4, struct mtd_oob_buf)
     95 #define MEMLOCK			_IOW('M', 5, struct erase_info_user)
     96 #define MEMUNLOCK		_IOW('M', 6, struct erase_info_user)
     97 #define MEMGETREGIONCOUNT	_IOR('M', 7, int)
     98 #define MEMGETREGIONINFO	_IOWR('M', 8, struct region_info_user)
     99 #define MEMSETOOBSEL		_IOW('M', 9, struct nand_oobinfo)
    100 #define MEMGETOOBSEL		_IOR('M', 10, struct nand_oobinfo)
    101 #define MEMGETBADBLOCK		_IOW('M', 11, __kernel_loff_t)
    102 #define MEMSETBADBLOCK		_IOW('M', 12, __kernel_loff_t)
    103 #define OTPSELECT		_IOR('M', 13, int)
    104 #define OTPGETREGIONCOUNT	_IOW('M', 14, int)
    105 #define OTPGETREGIONINFO	_IOW('M', 15, struct otp_info)
    106 #define OTPLOCK			_IOR('M', 16, struct otp_info)
    107 #define ECCGETLAYOUT		_IOR('M', 17, struct nand_ecclayout)
    108 #define ECCGETSTATS		_IOR('M', 18, struct mtd_ecc_stats)
    109 #define MTDFILEMODE		_IO('M', 19)
    110 #define MEMERASE64		_IOW('M', 20, struct erase_info_user64)
    111 #define MEMWRITEOOB64		_IOWR('M', 21, struct mtd_oob_buf64)
    112 #define MEMREADOOB64		_IOWR('M', 22, struct mtd_oob_buf64)
    113 
    114 /*
    115  * Obsolete legacy interface. Keep it in order not to break userspace
    116  * interfaces
    117  */
    118 struct nand_oobinfo {
    119 	__u32 useecc;
    120 	__u32 eccbytes;
    121 	__u32 oobfree[8][2];
    122 	__u32 eccpos[32];
    123 };
    124 
    125 struct nand_oobfree {
    126 	__u32 offset;
    127 	__u32 length;
    128 };
    129 
    130 #define MTD_MAX_OOBFREE_ENTRIES	8
    131 /*
    132  * ECC layout control structure. Exported to userspace for
    133  * diagnosis and to allow creation of raw images
    134  */
    135 struct nand_ecclayout {
    136 	__u32 eccbytes;
    137 	__u32 eccpos[64];
    138 	__u32 oobavail;
    139 	struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
    140 };
    141 
    142 /**
    143  * struct mtd_ecc_stats - error correction stats
    144  *
    145  * @corrected:	number of corrected bits
    146  * @failed:	number of uncorrectable errors
    147  * @badblocks:	number of bad blocks in this partition
    148  * @bbtblocks:	number of blocks reserved for bad block tables
    149  */
    150 struct mtd_ecc_stats {
    151 	__u32 corrected;
    152 	__u32 failed;
    153 	__u32 badblocks;
    154 	__u32 bbtblocks;
    155 };
    156 
    157 /*
    158  * Read/write file modes for access to MTD
    159  */
    160 enum mtd_file_modes {
    161 	MTD_MODE_NORMAL = MTD_OTP_OFF,
    162 	MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
    163 	MTD_MODE_OTP_USER = MTD_OTP_USER,
    164 	MTD_MODE_RAW,
    165 };
    166 
    167 #endif /* __MTD_ABI_H__ */
    168