2
* Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al.
10
#include <linux/types.h>
12
#include <mtd/mtd-abi.h>
13
#include <asm/errno.h>
15
#define MTD_CHAR_MAJOR 90
16
#define MTD_BLOCK_MAJOR 31
17
#define MAX_MTD_DEVICES 32
19
#define MTD_ERASE_PENDING 0x01
20
#define MTD_ERASING 0x02
21
#define MTD_ERASE_SUSPEND 0x04
22
#define MTD_ERASE_DONE 0x08
23
#define MTD_ERASE_FAILED 0x10
25
#define MTD_FAIL_ADDR_UNKNOWN -1LL
28
* Enumeration for NAND/OneNAND flash chip state
43
/* If the erase fails, fail_addr might indicate exactly which block failed. If
44
fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not
45
specific to any particular block. */
55
void (*callback) (struct erase_info *self);
58
struct erase_info *next;
62
struct mtd_erase_region_info {
63
uint64_t offset; /* At which this region starts, from the beginning of the MTD */
64
u_int32_t erasesize; /* For this region */
65
u_int32_t numblocks; /* Number of blocks of erasesize in this region */
66
unsigned long *lockmap; /* If keeping bitmap of locks */
70
* struct mtd_oob_ops - oob operation operands
71
* @mode: operation mode
73
* @len: number of data bytes to write/read
75
* @retlen: number of data bytes written/read
77
* @ooblen: number of oob bytes to write/read
78
* @oobretlen: number of oob bytes written/read
79
* @ooboffs: offset of oob data in the oob area (only relevant when
80
* mode = MTD_OPS_PLACE_OOB or MTD_OPS_RAW)
81
* @datbuf: data buffer - if NULL only oob data are read/written
82
* @oobbuf: oob data buffer
84
* Note, it is allowed to read more then one OOB area at one go, but not write.
85
* The interface assumes that the OOB write requests program only one page's
99
#ifdef CONFIG_SYS_NAND_MAX_OOBFREE
100
#define MTD_MAX_OOBFREE_ENTRIES_LARGE CONFIG_SYS_NAND_MAX_OOBFREE
102
#define MTD_MAX_OOBFREE_ENTRIES_LARGE 32
105
#ifdef CONFIG_SYS_NAND_MAX_ECCPOS
106
#define MTD_MAX_ECCPOS_ENTRIES_LARGE CONFIG_SYS_NAND_MAX_ECCPOS
108
#define MTD_MAX_ECCPOS_ENTRIES_LARGE 640
112
* ECC layout control structure. Exported to userspace for
113
* diagnosis and to allow creation of raw images
115
struct nand_ecclayout {
117
uint32_t eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE];
119
struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE];
125
uint64_t size; /* Total size of the MTD */
127
/* "Major" erase size for the device. Naïve users may take this
128
* to be the only erase size available, or may use the more detailed
129
* information below if they desire
132
/* Minimal writable flash unit size. In case of NOR flash it is 1 (even
133
* though individual bits can be cleared), in case of NAND flash it is
134
* one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
135
* it is of ECC block size, etc. It is illegal to have writesize = 0.
136
* Any driver registering a struct mtd_info must ensure a writesize of
141
u_int32_t oobsize; /* Amount of OOB data per block (e.g. 16) */
142
u_int32_t oobavail; /* Available OOB bytes per block */
145
* read ops return -EUCLEAN if max number of bitflips corrected on any
146
* one region comprising an ecc step equals or exceeds this value.
147
* Settable by driver, else defaults to ecc_strength. User can override
148
* in sysfs. N.B. The meaning of the -EUCLEAN return code has changed;
149
* see Documentation/ABI/testing/sysfs-class-mtd for more detail.
151
unsigned int bitflip_threshold;
153
/* Kernel-only stuff starts here. */
157
/* ECC layout structure pointer - read only! */
158
struct nand_ecclayout *ecclayout;
160
/* max number of correctible bit errors per ecc step */
161
unsigned int ecc_strength;
163
/* Data for variable erase regions. If numeraseregions is zero,
164
* it means that the whole device has erasesize as given above.
167
struct mtd_erase_region_info *eraseregions;
170
* Do not call via these pointers, use corresponding mtd_*()
173
int (*_erase) (struct mtd_info *mtd, struct erase_info *instr);
174
int (*_point) (struct mtd_info *mtd, loff_t from, size_t len,
175
size_t *retlen, void **virt, phys_addr_t *phys);
176
void (*_unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
177
int (*_read) (struct mtd_info *mtd, loff_t from, size_t len,
178
size_t *retlen, u_char *buf);
179
int (*_write) (struct mtd_info *mtd, loff_t to, size_t len,
180
size_t *retlen, const u_char *buf);
182
/* In blackbox flight recorder like scenarios we want to make successful
183
writes in interrupt context. panic_write() is only intended to be
184
called when its known the kernel is about to panic and we need the
185
write to succeed. Since the kernel is not going to be running for much
186
longer, this function can break locks and delay to ensure the write
187
succeeds (but not sleep). */
189
int (*_panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
191
int (*_read_oob) (struct mtd_info *mtd, loff_t from,
192
struct mtd_oob_ops *ops);
193
int (*_write_oob) (struct mtd_info *mtd, loff_t to,
194
struct mtd_oob_ops *ops);
195
int (*_get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
197
int (*_read_fact_prot_reg) (struct mtd_info *mtd, loff_t from,
198
size_t len, size_t *retlen, u_char *buf);
199
int (*_get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
201
int (*_read_user_prot_reg) (struct mtd_info *mtd, loff_t from,
202
size_t len, size_t *retlen, u_char *buf);
203
int (*_write_user_prot_reg) (struct mtd_info *mtd, loff_t to, size_t len,
204
size_t *retlen, u_char *buf);
205
int (*_lock_user_prot_reg) (struct mtd_info *mtd, loff_t from,
207
void (*_sync) (struct mtd_info *mtd);
208
int (*_lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
209
int (*_unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
210
int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs);
211
int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
213
* If the driver is something smart, like UBI, it may need to maintain
214
* its own reference counting. The below functions are only for driver.
216
int (*_get_device) (struct mtd_info *mtd);
217
void (*_put_device) (struct mtd_info *mtd);
221
/* kvec-based read/write methods.
222
NB: The 'count' parameter is the number of _vectors_, each of
223
which contains an (ofs, len) tuple.
225
int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
229
struct notifier_block reboot_notifier; /* default mode before reboot */
232
/* ECC status information */
233
struct mtd_ecc_stats ecc_stats;
234
/* Subpage shift (NAND) */
239
struct module *owner;
243
int mtd_erase(struct mtd_info *mtd, struct erase_info *instr);
244
int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
246
int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
248
int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
251
int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops);
253
static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to,
254
struct mtd_oob_ops *ops)
256
ops->retlen = ops->oobretlen = 0;
257
if (!mtd->_write_oob)
259
if (!(mtd->flags & MTD_WRITEABLE))
261
return mtd->_write_oob(mtd, to, ops);
264
int mtd_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
266
int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
267
size_t *retlen, u_char *buf);
268
int mtd_get_user_prot_info(struct mtd_info *mtd, struct otp_info *buf,
270
int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
271
size_t *retlen, u_char *buf);
272
int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
273
size_t *retlen, u_char *buf);
274
int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len);
278
int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
279
unsigned long count, loff_t to, size_t *retlen);
282
static inline void mtd_sync(struct mtd_info *mtd)
288
int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
289
int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
290
int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len);
291
int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs);
292
int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs);
294
static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
296
do_div(sz, mtd->erasesize);
300
static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd)
302
return do_div(sz, mtd->erasesize);
305
static inline int mtd_has_oob(const struct mtd_info *mtd)
307
return mtd->_read_oob && mtd->_write_oob;
310
static inline int mtd_can_have_bb(const struct mtd_info *mtd)
312
return !!mtd->_block_isbad;
315
/* Kernel-side ioctl definitions */
317
extern int add_mtd_device(struct mtd_info *mtd);
318
extern int del_mtd_device (struct mtd_info *mtd);
320
extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
321
extern struct mtd_info *get_mtd_device_nm(const char *name);
323
extern void put_mtd_device(struct mtd_info *mtd);
324
extern void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
325
const uint64_t length, uint64_t *len_incl_bad,
329
struct mtd_notifier {
330
void (*add)(struct mtd_info *mtd);
331
void (*remove)(struct mtd_info *mtd);
332
struct list_head list;
335
extern void register_mtd_user (struct mtd_notifier *new);
336
extern int unregister_mtd_user (struct mtd_notifier *old);
339
#ifdef CONFIG_MTD_PARTITIONS
340
void mtd_erase_callback(struct erase_info *instr);
342
static inline void mtd_erase_callback(struct erase_info *instr)
345
instr->callback(instr);
350
* Debugging macro and defines
352
#define MTD_DEBUG_LEVEL0 (0) /* Quiet */
353
#define MTD_DEBUG_LEVEL1 (1) /* Audible */
354
#define MTD_DEBUG_LEVEL2 (2) /* Loud */
355
#define MTD_DEBUG_LEVEL3 (3) /* Noisy */
357
#ifdef CONFIG_MTD_DEBUG
358
#define pr_debug(args...) MTDDEBUG(MTD_DEBUG_LEVEL0, args)
359
#define MTDDEBUG(n, args...) \
361
if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
362
printk(KERN_INFO args); \
364
#else /* CONFIG_MTD_DEBUG */
365
#define pr_debug(args...)
366
#define MTDDEBUG(n, args...) \
369
printk(KERN_INFO args); \
371
#endif /* CONFIG_MTD_DEBUG */
372
#define pr_info(args...) MTDDEBUG(MTD_DEBUG_LEVEL0, args)
373
#define pr_warn(args...) MTDDEBUG(MTD_DEBUG_LEVEL0, args)
374
#define pr_err(args...) MTDDEBUG(MTD_DEBUG_LEVEL0, args)
376
static inline int mtd_is_bitflip(int err) {
377
return err == -EUCLEAN;
380
static inline int mtd_is_eccerr(int err) {
381
return err == -EBADMSG;
384
static inline int mtd_is_bitflip_or_eccerr(int err) {
385
return mtd_is_bitflip(err) || mtd_is_eccerr(err);
388
#endif /* __MTD_MTD_H__ */