1*f80ad8b4SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2*f80ad8b4SAndroid Build Coastguard Worker /*
3*f80ad8b4SAndroid Build Coastguard Worker * Copyright © 1999-2010 David Woodhouse <[email protected]> et al.
4*f80ad8b4SAndroid Build Coastguard Worker *
5*f80ad8b4SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
6*f80ad8b4SAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
7*f80ad8b4SAndroid Build Coastguard Worker * the Free Software Foundation; either version 2 of the License, or
8*f80ad8b4SAndroid Build Coastguard Worker * (at your option) any later version.
9*f80ad8b4SAndroid Build Coastguard Worker *
10*f80ad8b4SAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
11*f80ad8b4SAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*f80ad8b4SAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*f80ad8b4SAndroid Build Coastguard Worker * GNU General Public License for more details.
14*f80ad8b4SAndroid Build Coastguard Worker *
15*f80ad8b4SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License
16*f80ad8b4SAndroid Build Coastguard Worker * along with this program; if not, write to the Free Software
17*f80ad8b4SAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18*f80ad8b4SAndroid Build Coastguard Worker *
19*f80ad8b4SAndroid Build Coastguard Worker */
20*f80ad8b4SAndroid Build Coastguard Worker
21*f80ad8b4SAndroid Build Coastguard Worker #ifndef __MTD_ABI_H__
22*f80ad8b4SAndroid Build Coastguard Worker #define __MTD_ABI_H__
23*f80ad8b4SAndroid Build Coastguard Worker
24*f80ad8b4SAndroid Build Coastguard Worker #include <linux/types.h>
25*f80ad8b4SAndroid Build Coastguard Worker
26*f80ad8b4SAndroid Build Coastguard Worker struct erase_info_user {
27*f80ad8b4SAndroid Build Coastguard Worker __u32 start;
28*f80ad8b4SAndroid Build Coastguard Worker __u32 length;
29*f80ad8b4SAndroid Build Coastguard Worker };
30*f80ad8b4SAndroid Build Coastguard Worker
31*f80ad8b4SAndroid Build Coastguard Worker struct erase_info_user64 {
32*f80ad8b4SAndroid Build Coastguard Worker __u64 start;
33*f80ad8b4SAndroid Build Coastguard Worker __u64 length;
34*f80ad8b4SAndroid Build Coastguard Worker };
35*f80ad8b4SAndroid Build Coastguard Worker
36*f80ad8b4SAndroid Build Coastguard Worker struct mtd_oob_buf {
37*f80ad8b4SAndroid Build Coastguard Worker __u32 start;
38*f80ad8b4SAndroid Build Coastguard Worker __u32 length;
39*f80ad8b4SAndroid Build Coastguard Worker unsigned char __user *ptr;
40*f80ad8b4SAndroid Build Coastguard Worker };
41*f80ad8b4SAndroid Build Coastguard Worker
42*f80ad8b4SAndroid Build Coastguard Worker struct mtd_oob_buf64 {
43*f80ad8b4SAndroid Build Coastguard Worker __u64 start;
44*f80ad8b4SAndroid Build Coastguard Worker __u32 pad;
45*f80ad8b4SAndroid Build Coastguard Worker __u32 length;
46*f80ad8b4SAndroid Build Coastguard Worker __u64 usr_ptr;
47*f80ad8b4SAndroid Build Coastguard Worker };
48*f80ad8b4SAndroid Build Coastguard Worker
49*f80ad8b4SAndroid Build Coastguard Worker /**
50*f80ad8b4SAndroid Build Coastguard Worker * MTD operation modes
51*f80ad8b4SAndroid Build Coastguard Worker *
52*f80ad8b4SAndroid Build Coastguard Worker * @MTD_OPS_PLACE_OOB: OOB data are placed at the given offset (default)
53*f80ad8b4SAndroid Build Coastguard Worker * @MTD_OPS_AUTO_OOB: OOB data are automatically placed at the free areas
54*f80ad8b4SAndroid Build Coastguard Worker * which are defined by the internal ecclayout
55*f80ad8b4SAndroid Build Coastguard Worker * @MTD_OPS_RAW: data are transferred as-is, with no error correction;
56*f80ad8b4SAndroid Build Coastguard Worker * this mode implies %MTD_OPS_PLACE_OOB
57*f80ad8b4SAndroid Build Coastguard Worker *
58*f80ad8b4SAndroid Build Coastguard Worker * These modes can be passed to ioctl(MEMWRITE) and ioctl(MEMREAD); they are
59*f80ad8b4SAndroid Build Coastguard Worker * also used internally. See notes on "MTD file modes" for discussion on
60*f80ad8b4SAndroid Build Coastguard Worker * %MTD_OPS_RAW vs. %MTD_FILE_MODE_RAW.
61*f80ad8b4SAndroid Build Coastguard Worker */
62*f80ad8b4SAndroid Build Coastguard Worker enum {
63*f80ad8b4SAndroid Build Coastguard Worker MTD_OPS_PLACE_OOB = 0,
64*f80ad8b4SAndroid Build Coastguard Worker MTD_OPS_AUTO_OOB = 1,
65*f80ad8b4SAndroid Build Coastguard Worker MTD_OPS_RAW = 2,
66*f80ad8b4SAndroid Build Coastguard Worker };
67*f80ad8b4SAndroid Build Coastguard Worker
68*f80ad8b4SAndroid Build Coastguard Worker /**
69*f80ad8b4SAndroid Build Coastguard Worker * struct mtd_write_req - data structure for requesting a write operation
70*f80ad8b4SAndroid Build Coastguard Worker *
71*f80ad8b4SAndroid Build Coastguard Worker * @start: start address
72*f80ad8b4SAndroid Build Coastguard Worker * @len: length of data buffer (only lower 32 bits are used)
73*f80ad8b4SAndroid Build Coastguard Worker * @ooblen: length of OOB buffer (only lower 32 bits are used)
74*f80ad8b4SAndroid Build Coastguard Worker * @usr_data: user-provided data buffer
75*f80ad8b4SAndroid Build Coastguard Worker * @usr_oob: user-provided OOB buffer
76*f80ad8b4SAndroid Build Coastguard Worker * @mode: MTD mode (see "MTD operation modes")
77*f80ad8b4SAndroid Build Coastguard Worker * @padding: reserved, must be set to 0
78*f80ad8b4SAndroid Build Coastguard Worker *
79*f80ad8b4SAndroid Build Coastguard Worker * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB
80*f80ad8b4SAndroid Build Coastguard Worker * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to
81*f80ad8b4SAndroid Build Coastguard Worker * write data-only, set @usr_oob == NULL. However, setting both @usr_data and
82*f80ad8b4SAndroid Build Coastguard Worker * @usr_oob to NULL is not allowed.
83*f80ad8b4SAndroid Build Coastguard Worker */
84*f80ad8b4SAndroid Build Coastguard Worker struct mtd_write_req {
85*f80ad8b4SAndroid Build Coastguard Worker __u64 start;
86*f80ad8b4SAndroid Build Coastguard Worker __u64 len;
87*f80ad8b4SAndroid Build Coastguard Worker __u64 ooblen;
88*f80ad8b4SAndroid Build Coastguard Worker __u64 usr_data;
89*f80ad8b4SAndroid Build Coastguard Worker __u64 usr_oob;
90*f80ad8b4SAndroid Build Coastguard Worker __u8 mode;
91*f80ad8b4SAndroid Build Coastguard Worker __u8 padding[7];
92*f80ad8b4SAndroid Build Coastguard Worker };
93*f80ad8b4SAndroid Build Coastguard Worker
94*f80ad8b4SAndroid Build Coastguard Worker /**
95*f80ad8b4SAndroid Build Coastguard Worker * struct mtd_read_req_ecc_stats - ECC statistics for a read operation
96*f80ad8b4SAndroid Build Coastguard Worker *
97*f80ad8b4SAndroid Build Coastguard Worker * @uncorrectable_errors: the number of uncorrectable errors that happened
98*f80ad8b4SAndroid Build Coastguard Worker * during the read operation
99*f80ad8b4SAndroid Build Coastguard Worker * @corrected_bitflips: the number of bitflips corrected during the read
100*f80ad8b4SAndroid Build Coastguard Worker * operation
101*f80ad8b4SAndroid Build Coastguard Worker * @max_bitflips: the maximum number of bitflips detected in any single ECC
102*f80ad8b4SAndroid Build Coastguard Worker * step for the data read during the operation; this information
103*f80ad8b4SAndroid Build Coastguard Worker * can be used to decide whether the data stored in a specific
104*f80ad8b4SAndroid Build Coastguard Worker * region of the MTD device should be moved somewhere else to
105*f80ad8b4SAndroid Build Coastguard Worker * avoid data loss.
106*f80ad8b4SAndroid Build Coastguard Worker */
107*f80ad8b4SAndroid Build Coastguard Worker struct mtd_read_req_ecc_stats {
108*f80ad8b4SAndroid Build Coastguard Worker __u32 uncorrectable_errors;
109*f80ad8b4SAndroid Build Coastguard Worker __u32 corrected_bitflips;
110*f80ad8b4SAndroid Build Coastguard Worker __u32 max_bitflips;
111*f80ad8b4SAndroid Build Coastguard Worker };
112*f80ad8b4SAndroid Build Coastguard Worker
113*f80ad8b4SAndroid Build Coastguard Worker /**
114*f80ad8b4SAndroid Build Coastguard Worker * struct mtd_read_req - data structure for requesting a read operation
115*f80ad8b4SAndroid Build Coastguard Worker *
116*f80ad8b4SAndroid Build Coastguard Worker * @start: start address
117*f80ad8b4SAndroid Build Coastguard Worker * @len: length of data buffer (only lower 32 bits are used)
118*f80ad8b4SAndroid Build Coastguard Worker * @ooblen: length of OOB buffer (only lower 32 bits are used)
119*f80ad8b4SAndroid Build Coastguard Worker * @usr_data: user-provided data buffer
120*f80ad8b4SAndroid Build Coastguard Worker * @usr_oob: user-provided OOB buffer
121*f80ad8b4SAndroid Build Coastguard Worker * @mode: MTD mode (see "MTD operation modes")
122*f80ad8b4SAndroid Build Coastguard Worker * @padding: reserved, must be set to 0
123*f80ad8b4SAndroid Build Coastguard Worker * @ecc_stats: ECC statistics for the read operation
124*f80ad8b4SAndroid Build Coastguard Worker *
125*f80ad8b4SAndroid Build Coastguard Worker * This structure supports ioctl(MEMREAD) operations, allowing data and/or OOB
126*f80ad8b4SAndroid Build Coastguard Worker * reads in various modes. To read from OOB-only, set @usr_data == NULL, and to
127*f80ad8b4SAndroid Build Coastguard Worker * read data-only, set @usr_oob == NULL. However, setting both @usr_data and
128*f80ad8b4SAndroid Build Coastguard Worker * @usr_oob to NULL is not allowed.
129*f80ad8b4SAndroid Build Coastguard Worker */
130*f80ad8b4SAndroid Build Coastguard Worker struct mtd_read_req {
131*f80ad8b4SAndroid Build Coastguard Worker __u64 start;
132*f80ad8b4SAndroid Build Coastguard Worker __u64 len;
133*f80ad8b4SAndroid Build Coastguard Worker __u64 ooblen;
134*f80ad8b4SAndroid Build Coastguard Worker __u64 usr_data;
135*f80ad8b4SAndroid Build Coastguard Worker __u64 usr_oob;
136*f80ad8b4SAndroid Build Coastguard Worker __u8 mode;
137*f80ad8b4SAndroid Build Coastguard Worker __u8 padding[7];
138*f80ad8b4SAndroid Build Coastguard Worker struct mtd_read_req_ecc_stats ecc_stats;
139*f80ad8b4SAndroid Build Coastguard Worker };
140*f80ad8b4SAndroid Build Coastguard Worker
141*f80ad8b4SAndroid Build Coastguard Worker #define MTD_ABSENT 0
142*f80ad8b4SAndroid Build Coastguard Worker #define MTD_RAM 1
143*f80ad8b4SAndroid Build Coastguard Worker #define MTD_ROM 2
144*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NORFLASH 3
145*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDFLASH 4 /* SLC NAND */
146*f80ad8b4SAndroid Build Coastguard Worker #define MTD_DATAFLASH 6
147*f80ad8b4SAndroid Build Coastguard Worker #define MTD_UBIVOLUME 7
148*f80ad8b4SAndroid Build Coastguard Worker #define MTD_MLCNANDFLASH 8 /* MLC NAND (including TLC) */
149*f80ad8b4SAndroid Build Coastguard Worker
150*f80ad8b4SAndroid Build Coastguard Worker #define MTD_WRITEABLE 0x400 /* Device is writeable */
151*f80ad8b4SAndroid Build Coastguard Worker #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */
152*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NO_ERASE 0x1000 /* No erase necessary */
153*f80ad8b4SAndroid Build Coastguard Worker #define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */
154*f80ad8b4SAndroid Build Coastguard Worker #define MTD_SLC_ON_MLC_EMULATION 0x4000 /* Emulate SLC behavior on MLC NANDs */
155*f80ad8b4SAndroid Build Coastguard Worker
156*f80ad8b4SAndroid Build Coastguard Worker /* Some common devices / combinations of capabilities */
157*f80ad8b4SAndroid Build Coastguard Worker #define MTD_CAP_ROM 0
158*f80ad8b4SAndroid Build Coastguard Worker #define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)
159*f80ad8b4SAndroid Build Coastguard Worker #define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE)
160*f80ad8b4SAndroid Build Coastguard Worker #define MTD_CAP_NANDFLASH (MTD_WRITEABLE)
161*f80ad8b4SAndroid Build Coastguard Worker #define MTD_CAP_NVRAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)
162*f80ad8b4SAndroid Build Coastguard Worker
163*f80ad8b4SAndroid Build Coastguard Worker /* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */
164*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDECC_OFF 0 /* Switch off ECC (Not recommended) */
165*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDECC_PLACE 1 /* Use the given placement in the structure (YAFFS1 legacy mode) */
166*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDECC_AUTOPLACE 2 /* Use the default placement scheme */
167*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDECC_PLACEONLY 3 /* Use the given placement in the structure (Do not store ecc result on read) */
168*f80ad8b4SAndroid Build Coastguard Worker #define MTD_NANDECC_AUTOPL_USR 4 /* Use the given autoplacement scheme rather than using the default */
169*f80ad8b4SAndroid Build Coastguard Worker
170*f80ad8b4SAndroid Build Coastguard Worker /* OTP mode selection */
171*f80ad8b4SAndroid Build Coastguard Worker #define MTD_OTP_OFF 0
172*f80ad8b4SAndroid Build Coastguard Worker #define MTD_OTP_FACTORY 1
173*f80ad8b4SAndroid Build Coastguard Worker #define MTD_OTP_USER 2
174*f80ad8b4SAndroid Build Coastguard Worker
175*f80ad8b4SAndroid Build Coastguard Worker struct mtd_info_user {
176*f80ad8b4SAndroid Build Coastguard Worker __u8 type;
177*f80ad8b4SAndroid Build Coastguard Worker __u32 flags;
178*f80ad8b4SAndroid Build Coastguard Worker __u32 size; /* Total size of the MTD */
179*f80ad8b4SAndroid Build Coastguard Worker __u32 erasesize;
180*f80ad8b4SAndroid Build Coastguard Worker __u32 writesize;
181*f80ad8b4SAndroid Build Coastguard Worker __u32 oobsize; /* Amount of OOB data per block (e.g. 16) */
182*f80ad8b4SAndroid Build Coastguard Worker __u64 padding; /* Old obsolete field; do not use */
183*f80ad8b4SAndroid Build Coastguard Worker };
184*f80ad8b4SAndroid Build Coastguard Worker
185*f80ad8b4SAndroid Build Coastguard Worker struct region_info_user {
186*f80ad8b4SAndroid Build Coastguard Worker __u32 offset; /* At which this region starts,
187*f80ad8b4SAndroid Build Coastguard Worker * from the beginning of the MTD */
188*f80ad8b4SAndroid Build Coastguard Worker __u32 erasesize; /* For this region */
189*f80ad8b4SAndroid Build Coastguard Worker __u32 numblocks; /* Number of blocks in this region */
190*f80ad8b4SAndroid Build Coastguard Worker __u32 regionindex;
191*f80ad8b4SAndroid Build Coastguard Worker };
192*f80ad8b4SAndroid Build Coastguard Worker
193*f80ad8b4SAndroid Build Coastguard Worker struct otp_info {
194*f80ad8b4SAndroid Build Coastguard Worker __u32 start;
195*f80ad8b4SAndroid Build Coastguard Worker __u32 length;
196*f80ad8b4SAndroid Build Coastguard Worker __u32 locked;
197*f80ad8b4SAndroid Build Coastguard Worker };
198*f80ad8b4SAndroid Build Coastguard Worker
199*f80ad8b4SAndroid Build Coastguard Worker /*
200*f80ad8b4SAndroid Build Coastguard Worker * Note, the following ioctl existed in the past and was removed:
201*f80ad8b4SAndroid Build Coastguard Worker * #define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo)
202*f80ad8b4SAndroid Build Coastguard Worker * Try to avoid adding a new ioctl with the same ioctl number.
203*f80ad8b4SAndroid Build Coastguard Worker */
204*f80ad8b4SAndroid Build Coastguard Worker
205*f80ad8b4SAndroid Build Coastguard Worker /* Get basic MTD characteristics info (better to use sysfs) */
206*f80ad8b4SAndroid Build Coastguard Worker #define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
207*f80ad8b4SAndroid Build Coastguard Worker /* Erase segment of MTD */
208*f80ad8b4SAndroid Build Coastguard Worker #define MEMERASE _IOW('M', 2, struct erase_info_user)
209*f80ad8b4SAndroid Build Coastguard Worker /* Write out-of-band data from MTD */
210*f80ad8b4SAndroid Build Coastguard Worker #define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf)
211*f80ad8b4SAndroid Build Coastguard Worker /* Read out-of-band data from MTD */
212*f80ad8b4SAndroid Build Coastguard Worker #define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf)
213*f80ad8b4SAndroid Build Coastguard Worker /* Lock a chip (for MTD that supports it) */
214*f80ad8b4SAndroid Build Coastguard Worker #define MEMLOCK _IOW('M', 5, struct erase_info_user)
215*f80ad8b4SAndroid Build Coastguard Worker /* Unlock a chip (for MTD that supports it) */
216*f80ad8b4SAndroid Build Coastguard Worker #define MEMUNLOCK _IOW('M', 6, struct erase_info_user)
217*f80ad8b4SAndroid Build Coastguard Worker /* Get the number of different erase regions */
218*f80ad8b4SAndroid Build Coastguard Worker #define MEMGETREGIONCOUNT _IOR('M', 7, int)
219*f80ad8b4SAndroid Build Coastguard Worker /* Get information about the erase region for a specific index */
220*f80ad8b4SAndroid Build Coastguard Worker #define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user)
221*f80ad8b4SAndroid Build Coastguard Worker /* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */
222*f80ad8b4SAndroid Build Coastguard Worker #define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo)
223*f80ad8b4SAndroid Build Coastguard Worker /* Check if an eraseblock is bad */
224*f80ad8b4SAndroid Build Coastguard Worker #define MEMGETBADBLOCK _IOW('M', 11, __kernel_loff_t)
225*f80ad8b4SAndroid Build Coastguard Worker /* Mark an eraseblock as bad */
226*f80ad8b4SAndroid Build Coastguard Worker #define MEMSETBADBLOCK _IOW('M', 12, __kernel_loff_t)
227*f80ad8b4SAndroid Build Coastguard Worker /* Set OTP (One-Time Programmable) mode (factory vs. user) */
228*f80ad8b4SAndroid Build Coastguard Worker #define OTPSELECT _IOR('M', 13, int)
229*f80ad8b4SAndroid Build Coastguard Worker /* Get number of OTP (One-Time Programmable) regions */
230*f80ad8b4SAndroid Build Coastguard Worker #define OTPGETREGIONCOUNT _IOW('M', 14, int)
231*f80ad8b4SAndroid Build Coastguard Worker /* Get all OTP (One-Time Programmable) info about MTD */
232*f80ad8b4SAndroid Build Coastguard Worker #define OTPGETREGIONINFO _IOW('M', 15, struct otp_info)
233*f80ad8b4SAndroid Build Coastguard Worker /* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */
234*f80ad8b4SAndroid Build Coastguard Worker #define OTPLOCK _IOR('M', 16, struct otp_info)
235*f80ad8b4SAndroid Build Coastguard Worker /* Get ECC layout (deprecated) */
236*f80ad8b4SAndroid Build Coastguard Worker #define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout_user)
237*f80ad8b4SAndroid Build Coastguard Worker /* Get statistics about corrected/uncorrected errors */
238*f80ad8b4SAndroid Build Coastguard Worker #define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats)
239*f80ad8b4SAndroid Build Coastguard Worker /* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */
240*f80ad8b4SAndroid Build Coastguard Worker #define MTDFILEMODE _IO('M', 19)
241*f80ad8b4SAndroid Build Coastguard Worker /* Erase segment of MTD (supports 64-bit address) */
242*f80ad8b4SAndroid Build Coastguard Worker #define MEMERASE64 _IOW('M', 20, struct erase_info_user64)
243*f80ad8b4SAndroid Build Coastguard Worker /* Write data to OOB (64-bit version) */
244*f80ad8b4SAndroid Build Coastguard Worker #define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64)
245*f80ad8b4SAndroid Build Coastguard Worker /* Read data from OOB (64-bit version) */
246*f80ad8b4SAndroid Build Coastguard Worker #define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64)
247*f80ad8b4SAndroid Build Coastguard Worker /* Check if chip is locked (for MTD that supports it) */
248*f80ad8b4SAndroid Build Coastguard Worker #define MEMISLOCKED _IOR('M', 23, struct erase_info_user)
249*f80ad8b4SAndroid Build Coastguard Worker /*
250*f80ad8b4SAndroid Build Coastguard Worker * Most generic write interface; can write in-band and/or out-of-band in various
251*f80ad8b4SAndroid Build Coastguard Worker * modes (see "struct mtd_write_req"). This ioctl is not supported for flashes
252*f80ad8b4SAndroid Build Coastguard Worker * without OOB, e.g., NOR flash.
253*f80ad8b4SAndroid Build Coastguard Worker */
254*f80ad8b4SAndroid Build Coastguard Worker #define MEMWRITE _IOWR('M', 24, struct mtd_write_req)
255*f80ad8b4SAndroid Build Coastguard Worker /* Erase a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */
256*f80ad8b4SAndroid Build Coastguard Worker #define OTPERASE _IOW('M', 25, struct otp_info)
257*f80ad8b4SAndroid Build Coastguard Worker /*
258*f80ad8b4SAndroid Build Coastguard Worker * Most generic read interface; can read in-band and/or out-of-band in various
259*f80ad8b4SAndroid Build Coastguard Worker * modes (see "struct mtd_read_req"). This ioctl is not supported for flashes
260*f80ad8b4SAndroid Build Coastguard Worker * without OOB, e.g., NOR flash.
261*f80ad8b4SAndroid Build Coastguard Worker */
262*f80ad8b4SAndroid Build Coastguard Worker #define MEMREAD _IOWR('M', 26, struct mtd_read_req)
263*f80ad8b4SAndroid Build Coastguard Worker
264*f80ad8b4SAndroid Build Coastguard Worker /*
265*f80ad8b4SAndroid Build Coastguard Worker * Obsolete legacy interface. Keep it in order not to break userspace
266*f80ad8b4SAndroid Build Coastguard Worker * interfaces
267*f80ad8b4SAndroid Build Coastguard Worker */
268*f80ad8b4SAndroid Build Coastguard Worker struct nand_oobinfo {
269*f80ad8b4SAndroid Build Coastguard Worker __u32 useecc;
270*f80ad8b4SAndroid Build Coastguard Worker __u32 eccbytes;
271*f80ad8b4SAndroid Build Coastguard Worker __u32 oobfree[8][2];
272*f80ad8b4SAndroid Build Coastguard Worker __u32 eccpos[32];
273*f80ad8b4SAndroid Build Coastguard Worker };
274*f80ad8b4SAndroid Build Coastguard Worker
275*f80ad8b4SAndroid Build Coastguard Worker struct nand_oobfree {
276*f80ad8b4SAndroid Build Coastguard Worker __u32 offset;
277*f80ad8b4SAndroid Build Coastguard Worker __u32 length;
278*f80ad8b4SAndroid Build Coastguard Worker };
279*f80ad8b4SAndroid Build Coastguard Worker
280*f80ad8b4SAndroid Build Coastguard Worker #define MTD_MAX_OOBFREE_ENTRIES 8
281*f80ad8b4SAndroid Build Coastguard Worker #define MTD_MAX_ECCPOS_ENTRIES 64
282*f80ad8b4SAndroid Build Coastguard Worker /*
283*f80ad8b4SAndroid Build Coastguard Worker * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl
284*f80ad8b4SAndroid Build Coastguard Worker * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a
285*f80ad8b4SAndroid Build Coastguard Worker * complete set of ECC information. The ioctl truncates the larger internal
286*f80ad8b4SAndroid Build Coastguard Worker * structure to retain binary compatibility with the static declaration of the
287*f80ad8b4SAndroid Build Coastguard Worker * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of
288*f80ad8b4SAndroid Build Coastguard Worker * the user struct, not the MAX size of the internal OOB layout representation.
289*f80ad8b4SAndroid Build Coastguard Worker */
290*f80ad8b4SAndroid Build Coastguard Worker struct nand_ecclayout_user {
291*f80ad8b4SAndroid Build Coastguard Worker __u32 eccbytes;
292*f80ad8b4SAndroid Build Coastguard Worker __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES];
293*f80ad8b4SAndroid Build Coastguard Worker __u32 oobavail;
294*f80ad8b4SAndroid Build Coastguard Worker struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
295*f80ad8b4SAndroid Build Coastguard Worker };
296*f80ad8b4SAndroid Build Coastguard Worker
297*f80ad8b4SAndroid Build Coastguard Worker /**
298*f80ad8b4SAndroid Build Coastguard Worker * struct mtd_ecc_stats - error correction stats
299*f80ad8b4SAndroid Build Coastguard Worker *
300*f80ad8b4SAndroid Build Coastguard Worker * @corrected: number of corrected bits
301*f80ad8b4SAndroid Build Coastguard Worker * @failed: number of uncorrectable errors
302*f80ad8b4SAndroid Build Coastguard Worker * @badblocks: number of bad blocks in this partition
303*f80ad8b4SAndroid Build Coastguard Worker * @bbtblocks: number of blocks reserved for bad block tables
304*f80ad8b4SAndroid Build Coastguard Worker */
305*f80ad8b4SAndroid Build Coastguard Worker struct mtd_ecc_stats {
306*f80ad8b4SAndroid Build Coastguard Worker __u32 corrected;
307*f80ad8b4SAndroid Build Coastguard Worker __u32 failed;
308*f80ad8b4SAndroid Build Coastguard Worker __u32 badblocks;
309*f80ad8b4SAndroid Build Coastguard Worker __u32 bbtblocks;
310*f80ad8b4SAndroid Build Coastguard Worker };
311*f80ad8b4SAndroid Build Coastguard Worker
312*f80ad8b4SAndroid Build Coastguard Worker /*
313*f80ad8b4SAndroid Build Coastguard Worker * MTD file modes - for read/write access to MTD
314*f80ad8b4SAndroid Build Coastguard Worker *
315*f80ad8b4SAndroid Build Coastguard Worker * @MTD_FILE_MODE_NORMAL: OTP disabled, ECC enabled
316*f80ad8b4SAndroid Build Coastguard Worker * @MTD_FILE_MODE_OTP_FACTORY: OTP enabled in factory mode
317*f80ad8b4SAndroid Build Coastguard Worker * @MTD_FILE_MODE_OTP_USER: OTP enabled in user mode
318*f80ad8b4SAndroid Build Coastguard Worker * @MTD_FILE_MODE_RAW: OTP disabled, ECC disabled
319*f80ad8b4SAndroid Build Coastguard Worker *
320*f80ad8b4SAndroid Build Coastguard Worker * These modes can be set via ioctl(MTDFILEMODE). The mode will be retained
321*f80ad8b4SAndroid Build Coastguard Worker * separately for each open file descriptor.
322*f80ad8b4SAndroid Build Coastguard Worker *
323*f80ad8b4SAndroid Build Coastguard Worker * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW -
324*f80ad8b4SAndroid Build Coastguard Worker * raw access to the flash, without error correction or autoplacement schemes.
325*f80ad8b4SAndroid Build Coastguard Worker * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode
326*f80ad8b4SAndroid Build Coastguard Worker * (e.g., when using ioctl(MEMWRITE) or ioctl(MEMREAD)), but in some cases, the
327*f80ad8b4SAndroid Build Coastguard Worker * MTD_FILE_MODE is used out of necessity (e.g., `write()',
328*f80ad8b4SAndroid Build Coastguard Worker * ioctl(MEMWRITEOOB64)).
329*f80ad8b4SAndroid Build Coastguard Worker */
330*f80ad8b4SAndroid Build Coastguard Worker enum mtd_file_modes {
331*f80ad8b4SAndroid Build Coastguard Worker MTD_FILE_MODE_NORMAL = MTD_OTP_OFF,
332*f80ad8b4SAndroid Build Coastguard Worker MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
333*f80ad8b4SAndroid Build Coastguard Worker MTD_FILE_MODE_OTP_USER = MTD_OTP_USER,
334*f80ad8b4SAndroid Build Coastguard Worker MTD_FILE_MODE_RAW,
335*f80ad8b4SAndroid Build Coastguard Worker };
336*f80ad8b4SAndroid Build Coastguard Worker
mtd_type_is_nand_user(const struct mtd_info_user * mtd)337*f80ad8b4SAndroid Build Coastguard Worker static inline int mtd_type_is_nand_user(const struct mtd_info_user *mtd)
338*f80ad8b4SAndroid Build Coastguard Worker {
339*f80ad8b4SAndroid Build Coastguard Worker return mtd->type == MTD_NANDFLASH || mtd->type == MTD_MLCNANDFLASH;
340*f80ad8b4SAndroid Build Coastguard Worker }
341*f80ad8b4SAndroid Build Coastguard Worker
342*f80ad8b4SAndroid Build Coastguard Worker #endif /* __MTD_ABI_H__ */
343