blob: 14815c219b3daac59423eac9af0e0e84fb6785d4 [file] [log] [blame]
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +02001/*
William Juul52c07962007-10-31 13:53:06 +01002 * $Id: mtd.h,v 1.61 2005/11/07 11:14:54 gleixner Exp $
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +02003 *
4 * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al.
5 *
6 * Released under GPL
7 */
8
9#ifndef __MTD_MTD_H__
10#define __MTD_MTD_H__
William Juul52c07962007-10-31 13:53:06 +010011
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +020012#include <linux/types.h>
13#include <linux/mtd/mtd-abi.h>
14
William Juul52c07962007-10-31 13:53:06 +010015#define MTD_CHAR_MAJOR 90
16#define MTD_BLOCK_MAJOR 31
17#define MAX_MTD_DEVICES 32
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +020018
Wolfgang Denka1be4762008-05-20 16:00:29 +020019#define MTD_ERASE_PENDING 0x01
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +020020#define MTD_ERASING 0x02
21#define MTD_ERASE_SUSPEND 0x04
22#define MTD_ERASE_DONE 0x08
23#define MTD_ERASE_FAILED 0x10
24
Kyungmin Park396b0c42008-08-13 09:11:02 +090025/*
26 * Enumeration for NAND/OneNAND flash chip state
27 */
28enum {
29 FL_READY,
30 FL_READING,
31 FL_WRITING,
32 FL_ERASING,
33 FL_SYNCING,
34 FL_CACHEDPRG,
35 FL_RESETING,
36 FL_UNLOCKING,
37 FL_LOCKING,
38 FL_PM_SUSPENDED,
39};
40
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +020041/* If the erase fails, fail_addr might indicate exactly which block failed. If
42 fail_addr = 0xffffffff, the failure was not at the device level or was not
43 specific to any particular block. */
44struct erase_info {
45 struct mtd_info *mtd;
46 u_int32_t addr;
47 u_int32_t len;
48 u_int32_t fail_addr;
49 u_long time;
50 u_long retries;
51 u_int dev;
52 u_int cell;
53 void (*callback) (struct erase_info *self);
54 u_long priv;
55 u_char state;
56 struct erase_info *next;
57};
58
59struct mtd_erase_region_info {
60 u_int32_t offset; /* At which this region starts, from the beginning of the MTD */
61 u_int32_t erasesize; /* For this region */
62 u_int32_t numblocks; /* Number of blocks of erasesize in this region */
William Juul52c07962007-10-31 13:53:06 +010063 unsigned long *lockmap; /* If keeping bitmap of locks */
64};
65
66/*
67 * oob operation modes
68 *
69 * MTD_OOB_PLACE: oob data are placed at the given offset
70 * MTD_OOB_AUTO: oob data are automatically placed at the free areas
71 * which are defined by the ecclayout
72 * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data
73 * is inserted into the data. Thats a raw image of the
74 * flash contents.
75 */
76typedef enum {
77 MTD_OOB_PLACE,
78 MTD_OOB_AUTO,
79 MTD_OOB_RAW,
80} mtd_oob_mode_t;
81
82/**
83 * struct mtd_oob_ops - oob operation operands
84 * @mode: operation mode
85 *
86 * @len: number of data bytes to write/read
87 *
88 * @retlen: number of data bytes written/read
89 *
90 * @ooblen: number of oob bytes to write/read
91 * @oobretlen: number of oob bytes written/read
92 * @ooboffs: offset of oob data in the oob area (only relevant when
93 * mode = MTD_OOB_PLACE)
94 * @datbuf: data buffer - if NULL only oob data are read/written
95 * @oobbuf: oob data buffer
96 *
97 * Note, it is allowed to read more then one OOB area at one go, but not write.
98 * The interface assumes that the OOB write requests program only one page's
99 * OOB area.
100 */
101struct mtd_oob_ops {
102 mtd_oob_mode_t mode;
103 size_t len;
104 size_t retlen;
105 size_t ooblen;
106 size_t oobretlen;
107 uint32_t ooboffs;
108 uint8_t *datbuf;
109 uint8_t *oobbuf;
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200110};
111
112struct mtd_info {
113 u_char type;
114 u_int32_t flags;
William Juul52c07962007-10-31 13:53:06 +0100115 u_int32_t size; // Total size of the MTD
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200116
William Juul52c07962007-10-31 13:53:06 +0100117 /* "Major" erase size for the device. Naïve users may take this
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200118 * to be the only erase size available, or may use the more detailed
119 * information below if they desire
120 */
121 u_int32_t erasesize;
William Juul52c07962007-10-31 13:53:06 +0100122 /* Minimal writable flash unit size. In case of NOR flash it is 1 (even
123 * though individual bits can be cleared), in case of NAND flash it is
124 * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
125 * it is of ECC block size, etc. It is illegal to have writesize = 0.
126 * Any driver registering a struct mtd_info must ensure a writesize of
127 * 1 or larger.
128 */
129 u_int32_t writesize;
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200130
William Juul52c07962007-10-31 13:53:06 +0100131 u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
132 u_int32_t oobavail; // Available OOB bytes per block
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200133
William Juul52c07962007-10-31 13:53:06 +0100134 // Kernel-only stuff starts here.
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200135 char *name;
136 int index;
137
William Juul52c07962007-10-31 13:53:06 +0100138 /* ecc layout structure pointer - read only ! */
139 struct nand_ecclayout *ecclayout;
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200140
141 /* Data for variable erase regions. If numeraseregions is zero,
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200142 * it means that the whole device has erasesize as given above.
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200143 */
144 int numeraseregions;
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200145 struct mtd_erase_region_info *eraseregions;
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200146
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200147 int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
148
149 /* This stuff for eXecute-In-Place */
150 int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
151
152 /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
153 void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
154
155
156 int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
157 int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
158
William Juul52c07962007-10-31 13:53:06 +0100159 int (*read_oob) (struct mtd_info *mtd, loff_t from,
160 struct mtd_oob_ops *ops);
161 int (*write_oob) (struct mtd_info *mtd, loff_t to,
162 struct mtd_oob_ops *ops);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200163
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200164 /*
165 * Methods to access the protection register area, present in some
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200166 * flash devices. The user data is one time programmable but the
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200167 * factory data is read only.
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200168 */
William Juul52c07962007-10-31 13:53:06 +0100169 int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200170 int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
William Juul52c07962007-10-31 13:53:06 +0100171 int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
172 int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200173 int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
William Juul52c07962007-10-31 13:53:06 +0100174 int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
175
176/* XXX U-BOOT XXX */
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200177#if 0
William Juul52c07962007-10-31 13:53:06 +0100178 /* kvec-based read/write methods.
Wolfgang Denk7b9bc3a2005-09-14 23:53:32 +0200179 NB: The 'count' parameter is the number of _vectors_, each of
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200180 which contains an (ofs, len) tuple.
181 */
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200182 int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200183#endif
William Juul52c07962007-10-31 13:53:06 +0100184
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200185 /* Sync */
186 void (*sync) (struct mtd_info *mtd);
William Juul52c07962007-10-31 13:53:06 +0100187
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200188 /* Chip-supported device locking */
189 int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
190 int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
191
192 /* Power Management functions */
193 int (*suspend) (struct mtd_info *mtd);
194 void (*resume) (struct mtd_info *mtd);
William Juul52c07962007-10-31 13:53:06 +0100195
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200196 /* Bad block management functions */
197 int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
198 int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
199
William Juul52c07962007-10-31 13:53:06 +0100200/* XXX U-BOOT XXX */
201#if 0
202 struct notifier_block reboot_notifier; /* default mode before reboot */
203#endif
204
205 /* ECC status information */
206 struct mtd_ecc_stats ecc_stats;
207 /* Subpage shift (NAND) */
208 int subpage_sft;
209
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200210 void *priv;
211
212 struct module *owner;
213 int usecount;
William Juul52c07962007-10-31 13:53:06 +0100214
215 /* If the driver is something smart, like UBI, it may need to maintain
216 * its own reference counting. The below functions are only for driver.
217 * The driver may register its callbacks. These callbacks are not
218 * supposed to be called by MTD users */
219 int (*get_device) (struct mtd_info *mtd);
220 void (*put_device) (struct mtd_info *mtd);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200221};
222
223
224 /* Kernel-side ioctl definitions */
225
226extern int add_mtd_device(struct mtd_info *mtd);
227extern int del_mtd_device (struct mtd_info *mtd);
228
229extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
William Juul52c07962007-10-31 13:53:06 +0100230extern struct mtd_info *get_mtd_device_nm(const char *name);
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200231
232extern void put_mtd_device(struct mtd_info *mtd);
233
William Juul52c07962007-10-31 13:53:06 +0100234/* XXX U-BOOT XXX */
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200235#if 0
236struct mtd_notifier {
237 void (*add)(struct mtd_info *mtd);
238 void (*remove)(struct mtd_info *mtd);
239 struct list_head list;
240};
241
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200242extern void register_mtd_user (struct mtd_notifier *new);
243extern int unregister_mtd_user (struct mtd_notifier *old);
244
245int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
246 unsigned long count, loff_t to, size_t *retlen);
247
248int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
249 unsigned long count, loff_t from, size_t *retlen);
250#endif
251
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200252#ifdef CONFIG_MTD_PARTITIONS
253void mtd_erase_callback(struct erase_info *instr);
254#else
255static inline void mtd_erase_callback(struct erase_info *instr)
256{
257 if (instr->callback)
258 instr->callback(instr);
259}
260#endif
261
262/*
263 * Debugging macro and defines
264 */
265#define MTD_DEBUG_LEVEL0 (0) /* Quiet */
266#define MTD_DEBUG_LEVEL1 (1) /* Audible */
267#define MTD_DEBUG_LEVEL2 (2) /* Loud */
268#define MTD_DEBUG_LEVEL3 (3) /* Noisy */
269
270#ifdef CONFIG_MTD_DEBUG
Scott Wooddf83c472008-06-20 12:38:57 -0500271#define MTDDEBUG(n, args...) \
Wolfgang Denka1be4762008-05-20 16:00:29 +0200272 do { \
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200273 if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
274 printk(KERN_INFO args); \
275 } while(0)
276#else /* CONFIG_MTD_DEBUG */
Scott Wooddf83c472008-06-20 12:38:57 -0500277#define MTDDEBUG(n, args...) do { } while(0)
Wolfgang Denk2f9b7e42005-08-17 12:55:25 +0200278#endif /* CONFIG_MTD_DEBUG */
279
280#endif /* __MTD_MTD_H__ */