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