blob: 2e32be1e3a1e26e2c94edd3b2b53a78d8da96d60 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Thomas Gleixnere4f06482005-11-07 11:15:37 +00002 * Portions of MTD ABI definition which are shared by kernel and user space
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 */
4
5#ifndef __MTD_ABI_H__
6#define __MTD_ABI_H__
7
Arnd Bergmannccef7ab2009-02-26 00:51:41 +01008#include <linux/types.h>
9
Linus Torvalds1da177e2005-04-16 15:20:36 -070010struct erase_info_user {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010011 __u32 start;
12 __u32 length;
Linus Torvalds1da177e2005-04-16 15:20:36 -070013};
14
Kevin Cernekee0dc54e92009-04-08 22:52:28 -070015struct erase_info_user64 {
16 __u64 start;
17 __u64 length;
18};
19
Linus Torvalds1da177e2005-04-16 15:20:36 -070020struct mtd_oob_buf {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010021 __u32 start;
22 __u32 length;
Linus Torvalds1da177e2005-04-16 15:20:36 -070023 unsigned char __user *ptr;
24};
25
26#define MTD_ABSENT 0
David Woodhouse21c8db92006-06-14 21:39:48 +010027#define MTD_RAM 1
28#define MTD_ROM 2
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#define MTD_NORFLASH 3
30#define MTD_NANDFLASH 4
Andrew Victor8f15fd52005-02-09 09:17:45 +000031#define MTD_DATAFLASH 6
Artem B. Bityutskiy801c1352006-06-27 12:22:22 +040032#define MTD_UBIVOLUME 7
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Joern Engel8ca9ed52006-05-22 23:17:23 +020034#define MTD_WRITEABLE 0x400 /* Device is writeable */
Joern Engel5fa43392006-05-22 23:18:29 +020035#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */
Joern Engel92cbfdc2006-05-30 14:25:24 +020036#define MTD_NO_ERASE 0x1000 /* No erase necessary */
Justin Treone619a752008-01-30 10:25:49 -080037#define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39// Some common devices / combinations of capabilities
40#define MTD_CAP_ROM 0
Joern Engel92cbfdc2006-05-30 14:25:24 +020041#define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)
Joern Engel5fa43392006-05-22 23:18:29 +020042#define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE)
Joern Engel8ca9ed52006-05-22 23:17:23 +020043#define MTD_CAP_NANDFLASH (MTD_WRITEABLE)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Linus Torvalds1da177e2005-04-16 15:20:36 -070045/* ECC byte placement */
46#define MTD_NANDECC_OFF 0 // Switch off ECC (Not recommended)
47#define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode)
48#define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme
49#define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read)
Thomas Gleixner90e260c2005-05-19 17:10:26 +010050#define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default
Linus Torvalds1da177e2005-04-16 15:20:36 -070051
Nicolas Pitre31f42332005-02-08 17:45:55 +000052/* OTP mode selection */
53#define MTD_OTP_OFF 0
54#define MTD_OTP_FACTORY 1
55#define MTD_OTP_USER 2
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057struct mtd_info_user {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010058 __u8 type;
59 __u32 flags;
60 __u32 size; // Total size of the MTD
61 __u32 erasesize;
62 __u32 writesize;
63 __u32 oobsize; // Amount of OOB data per block (e.g. 16)
Artem Bityutskiy64f60712007-01-30 10:50:43 +020064 /* The below two fields are obsolete and broken, do not use them
65 * (TODO: remove at some point) */
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010066 __u32 ecctype;
67 __u32 eccsize;
Linus Torvalds1da177e2005-04-16 15:20:36 -070068};
69
70struct region_info_user {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010071 __u32 offset; /* At which this region starts,
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 * from the beginning of the MTD */
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010073 __u32 erasesize; /* For this region */
74 __u32 numblocks; /* Number of blocks in this region */
75 __u32 regionindex;
Linus Torvalds1da177e2005-04-16 15:20:36 -070076};
77
Nicolas Pitref77814d2005-02-08 17:11:19 +000078struct otp_info {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +010079 __u32 start;
80 __u32 length;
81 __u32 locked;
Nicolas Pitref77814d2005-02-08 17:11:19 +000082};
83
Thomas Gleixner5bd34c02006-05-27 22:16:10 +020084#define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
85#define MEMERASE _IOW('M', 2, struct erase_info_user)
86#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf)
87#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf)
88#define MEMLOCK _IOW('M', 5, struct erase_info_user)
89#define MEMUNLOCK _IOW('M', 6, struct erase_info_user)
Linus Torvalds1da177e2005-04-16 15:20:36 -070090#define MEMGETREGIONCOUNT _IOR('M', 7, int)
91#define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user)
92#define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo)
93#define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo)
Arnd Bergmann85efde62009-02-26 00:51:39 +010094#define MEMGETBADBLOCK _IOW('M', 11, __kernel_loff_t)
95#define MEMSETBADBLOCK _IOW('M', 12, __kernel_loff_t)
Nicolas Pitre31f42332005-02-08 17:45:55 +000096#define OTPSELECT _IOR('M', 13, int)
97#define OTPGETREGIONCOUNT _IOW('M', 14, int)
98#define OTPGETREGIONINFO _IOW('M', 15, struct otp_info)
Thomas Gleixner5bd34c02006-05-27 22:16:10 +020099#define OTPLOCK _IOR('M', 16, struct otp_info)
100#define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout)
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200101#define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats)
102#define MTDFILEMODE _IO('M', 19)
Kevin Cernekee0dc54e92009-04-08 22:52:28 -0700103#define MEMERASE64 _IOW('M', 20, struct erase_info_user64)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Thomas Gleixner5bd34c02006-05-27 22:16:10 +0200105/*
106 * Obsolete legacy interface. Keep it in order not to break userspace
107 * interfaces
108 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109struct nand_oobinfo {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +0100110 __u32 useecc;
111 __u32 eccbytes;
112 __u32 oobfree[8][2];
113 __u32 eccpos[32];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114};
115
Thomas Gleixner5bd34c02006-05-27 22:16:10 +0200116struct nand_oobfree {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +0100117 __u32 offset;
118 __u32 length;
Thomas Gleixner5bd34c02006-05-27 22:16:10 +0200119};
120
121#define MTD_MAX_OOBFREE_ENTRIES 8
122/*
123 * ECC layout control structure. Exported to userspace for
124 * diagnosis and to allow creation of raw images
125 */
126struct nand_ecclayout {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +0100127 __u32 eccbytes;
128 __u32 eccpos[64];
129 __u32 oobavail;
Thomas Gleixner5bd34c02006-05-27 22:16:10 +0200130 struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
131};
132
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200133/**
Randy Dunlapea9b6dc2006-06-28 21:48:38 -0700134 * struct mtd_ecc_stats - error correction stats
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200135 *
136 * @corrected: number of corrected bits
137 * @failed: number of uncorrectable errors
138 * @badblocks: number of bad blocks in this partition
139 * @bbtblocks: number of blocks reserved for bad block tables
140 */
141struct mtd_ecc_stats {
Arnd Bergmannccef7ab2009-02-26 00:51:41 +0100142 __u32 corrected;
143 __u32 failed;
144 __u32 badblocks;
145 __u32 bbtblocks;
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200146};
147
148/*
149 * Read/write file modes for access to MTD
150 */
151enum mtd_file_modes {
152 MTD_MODE_NORMAL = MTD_OTP_OFF,
153 MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
154 MTD_MODE_OTP_USER = MTD_OTP_USER,
155 MTD_MODE_RAW,
156};
157
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158#endif /* __MTD_ABI_H__ */