mtd.h (859f24350e6e4313626f85161dd03f025a4dac59) mtd.h (cfa460adfdefcc30d104e1a9ee44994ee349bb7b)
1/*
1/*
2 * $Id: mtd.h,v 1.56 2004/08/09 18:46:04 dmarlin Exp $
2 * $Id: mtd.h,v 1.61 2005/11/07 11:14:54 gleixner Exp $
3 *
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__
3 *
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__
11
11#include <linux/types.h>
12#include <linux/mtd/mtd-abi.h>
13
12#include <linux/types.h>
13#include <linux/mtd/mtd-abi.h>
14
14#define MAX_MTD_DEVICES 16
15#define MTD_CHAR_MAJOR 90
16#define MTD_BLOCK_MAJOR 31
17#define MAX_MTD_DEVICES 32
15
16#define MTD_ERASE_PENDING 0x01
17#define MTD_ERASING 0x02
18#define MTD_ERASE_SUSPEND 0x04
19#define MTD_ERASE_DONE 0x08
20#define MTD_ERASE_FAILED 0x10
21
22/* If the erase fails, fail_addr might indicate exactly which block failed. If

--- 13 unchanged lines hidden (view full) ---

36 u_char state;
37 struct erase_info *next;
38};
39
40struct mtd_erase_region_info {
41 u_int32_t offset; /* At which this region starts, from the beginning of the MTD */
42 u_int32_t erasesize; /* For this region */
43 u_int32_t numblocks; /* Number of blocks of erasesize in this region */
18
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
24
25/* If the erase fails, fail_addr might indicate exactly which block failed. If

--- 13 unchanged lines hidden (view full) ---

39 u_char state;
40 struct erase_info *next;
41};
42
43struct mtd_erase_region_info {
44 u_int32_t offset; /* At which this region starts, from the beginning of the MTD */
45 u_int32_t erasesize; /* For this region */
46 u_int32_t numblocks; /* Number of blocks of erasesize in this region */
47 unsigned long *lockmap; /* If keeping bitmap of locks */
44};
45
48};
49
50/*
51 * oob operation modes
52 *
53 * MTD_OOB_PLACE: oob data are placed at the given offset
54 * MTD_OOB_AUTO: oob data are automatically placed at the free areas
55 * which are defined by the ecclayout
56 * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data
57 * is inserted into the data. Thats a raw image of the
58 * flash contents.
59 */
60typedef enum {
61 MTD_OOB_PLACE,
62 MTD_OOB_AUTO,
63 MTD_OOB_RAW,
64} mtd_oob_mode_t;
65
66/**
67 * struct mtd_oob_ops - oob operation operands
68 * @mode: operation mode
69 *
70 * @len: number of data bytes to write/read
71 *
72 * @retlen: number of data bytes written/read
73 *
74 * @ooblen: number of oob bytes to write/read
75 * @oobretlen: number of oob bytes written/read
76 * @ooboffs: offset of oob data in the oob area (only relevant when
77 * mode = MTD_OOB_PLACE)
78 * @datbuf: data buffer - if NULL only oob data are read/written
79 * @oobbuf: oob data buffer
80 *
81 * Note, it is allowed to read more then one OOB area at one go, but not write.
82 * The interface assumes that the OOB write requests program only one page's
83 * OOB area.
84 */
85struct mtd_oob_ops {
86 mtd_oob_mode_t mode;
87 size_t len;
88 size_t retlen;
89 size_t ooblen;
90 size_t oobretlen;
91 uint32_t ooboffs;
92 uint8_t *datbuf;
93 uint8_t *oobbuf;
94};
95
46struct mtd_info {
47 u_char type;
48 u_int32_t flags;
96struct mtd_info {
97 u_char type;
98 u_int32_t flags;
49 u_int32_t size; /* Total size of the MTD */
99 u_int32_t size; // Total size of the MTD
50
100
51 /* "Major" erase size for the device. Nave users may take this
101 /* "Major" erase size for the device. Naïve users may take this
52 * to be the only erase size available, or may use the more detailed
53 * information below if they desire
54 */
55 u_int32_t erasesize;
102 * to be the only erase size available, or may use the more detailed
103 * information below if they desire
104 */
105 u_int32_t erasesize;
106 /* Minimal writable flash unit size. In case of NOR flash it is 1 (even
107 * though individual bits can be cleared), in case of NAND flash it is
108 * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
109 * it is of ECC block size, etc. It is illegal to have writesize = 0.
110 * Any driver registering a struct mtd_info must ensure a writesize of
111 * 1 or larger.
112 */
113 u_int32_t writesize;
56
114
57 u_int32_t oobblock; /* Size of OOB blocks (e.g. 512) */
58 u_int32_t oobsize; /* Amount of OOB data per block (e.g. 16) */
59 u_int32_t oobavail; /* Number of bytes in OOB area available for fs */
60 u_int32_t ecctype;
61 u_int32_t eccsize;
115 u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
116 u_int32_t oobavail; // Available OOB bytes per block
62
117
63
64 /* Kernel-only stuff starts here. */
118 // Kernel-only stuff starts here.
65 char *name;
66 int index;
67
119 char *name;
120 int index;
121
68 /* oobinfo is a nand_oobinfo structure, which can be set by iotcl (MEMSETOOBINFO) */
69 struct nand_oobinfo oobinfo;
122 /* ecc layout structure pointer - read only ! */
123 struct nand_ecclayout *ecclayout;
70
71 /* Data for variable erase regions. If numeraseregions is zero,
72 * it means that the whole device has erasesize as given above.
73 */
74 int numeraseregions;
75 struct mtd_erase_region_info *eraseregions;
76
124
125 /* Data for variable erase regions. If numeraseregions is zero,
126 * it means that the whole device has erasesize as given above.
127 */
128 int numeraseregions;
129 struct mtd_erase_region_info *eraseregions;
130
77 /* This really shouldn't be here. It can go away in 2.5 */
78 u_int32_t bank_size;
79
80 int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
81
82 /* This stuff for eXecute-In-Place */
83 int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
84
85 /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
86 void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
87
88
89 int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
90 int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
91
131 int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
132
133 /* This stuff for eXecute-In-Place */
134 int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
135
136 /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
137 void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
138
139
140 int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
141 int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
142
92 int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel);
93 int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel);
143 int (*read_oob) (struct mtd_info *mtd, loff_t from,
144 struct mtd_oob_ops *ops);
145 int (*write_oob) (struct mtd_info *mtd, loff_t to,
146 struct mtd_oob_ops *ops);
94
147
95 int (*read_oob) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
96 int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
97
98 /*
99 * Methods to access the protection register area, present in some
100 * flash devices. The user data is one time programmable but the
101 * factory data is read only.
102 */
148 /*
149 * Methods to access the protection register area, present in some
150 * flash devices. The user data is one time programmable but the
151 * factory data is read only.
152 */
103 int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
104
153 int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
105 int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
154 int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
106
107 /* This function is not yet implemented */
155 int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
156 int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
108 int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
157 int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
158 int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
159
160/* XXX U-BOOT XXX */
109#if 0
161#if 0
110 /* kvec-based read/write methods. We need these especially for NAND flash,
111 with its limited number of write cycles per erase.
162 /* kvec-based read/write methods.
112 NB: The 'count' parameter is the number of _vectors_, each of
113 which contains an (ofs, len) tuple.
114 */
163 NB: The 'count' parameter is the number of _vectors_, each of
164 which contains an (ofs, len) tuple.
165 */
115 int (*readv) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen);
116 int (*readv_ecc) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from,
117 size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel);
118 int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
166 int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
119 int (*writev_ecc) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to,
120 size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel);
121#endif
167#endif
168
122 /* Sync */
123 void (*sync) (struct mtd_info *mtd);
169 /* Sync */
170 void (*sync) (struct mtd_info *mtd);
124#if 0
171
125 /* Chip-supported device locking */
126 int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
127 int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
128
129 /* Power Management functions */
130 int (*suspend) (struct mtd_info *mtd);
131 void (*resume) (struct mtd_info *mtd);
172 /* Chip-supported device locking */
173 int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
174 int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
175
176 /* Power Management functions */
177 int (*suspend) (struct mtd_info *mtd);
178 void (*resume) (struct mtd_info *mtd);
132#endif
179
133 /* Bad block management functions */
134 int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
135 int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
136
180 /* Bad block management functions */
181 int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
182 int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
183
184/* XXX U-BOOT XXX */
185#if 0
186 struct notifier_block reboot_notifier; /* default mode before reboot */
187#endif
188
189 /* ECC status information */
190 struct mtd_ecc_stats ecc_stats;
191 /* Subpage shift (NAND) */
192 int subpage_sft;
193
137 void *priv;
138
139 struct module *owner;
140 int usecount;
194 void *priv;
195
196 struct module *owner;
197 int usecount;
198
199 /* If the driver is something smart, like UBI, it may need to maintain
200 * its own reference counting. The below functions are only for driver.
201 * The driver may register its callbacks. These callbacks are not
202 * supposed to be called by MTD users */
203 int (*get_device) (struct mtd_info *mtd);
204 void (*put_device) (struct mtd_info *mtd);
141};
142
143
144 /* Kernel-side ioctl definitions */
145
146extern int add_mtd_device(struct mtd_info *mtd);
147extern int del_mtd_device (struct mtd_info *mtd);
148
149extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
205};
206
207
208 /* Kernel-side ioctl definitions */
209
210extern int add_mtd_device(struct mtd_info *mtd);
211extern int del_mtd_device (struct mtd_info *mtd);
212
213extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
214extern struct mtd_info *get_mtd_device_nm(const char *name);
150
151extern void put_mtd_device(struct mtd_info *mtd);
152
215
216extern void put_mtd_device(struct mtd_info *mtd);
217
218/* XXX U-BOOT XXX */
153#if 0
154struct mtd_notifier {
155 void (*add)(struct mtd_info *mtd);
156 void (*remove)(struct mtd_info *mtd);
157 struct list_head list;
158};
159
219#if 0
220struct mtd_notifier {
221 void (*add)(struct mtd_info *mtd);
222 void (*remove)(struct mtd_info *mtd);
223 struct list_head list;
224};
225
160
161extern void register_mtd_user (struct mtd_notifier *new);
162extern int unregister_mtd_user (struct mtd_notifier *old);
163
164int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
165 unsigned long count, loff_t to, size_t *retlen);
166
167int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
168 unsigned long count, loff_t from, size_t *retlen);
169#endif
170
226extern void register_mtd_user (struct mtd_notifier *new);
227extern int unregister_mtd_user (struct mtd_notifier *old);
228
229int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
230 unsigned long count, loff_t to, size_t *retlen);
231
232int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
233 unsigned long count, loff_t from, size_t *retlen);
234#endif
235
171#define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args)
172#define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d))
173#define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg)
174#define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args)
175#define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args)
176#define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args)
177#define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args)
178#define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args)
179#define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args)
180#define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args)
181#define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args)
182#define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0)
183
184
185#ifdef CONFIG_MTD_PARTITIONS
186void mtd_erase_callback(struct erase_info *instr);
187#else
188static inline void mtd_erase_callback(struct erase_info *instr)
189{
190 if (instr->callback)
191 instr->callback(instr);
192}

--- 10 unchanged lines hidden (view full) ---

203#ifdef CONFIG_MTD_DEBUG
204#define MTDDEBUG(n, args...) \
205 do { \
206 if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
207 printk(KERN_INFO args); \
208 } while(0)
209#else /* CONFIG_MTD_DEBUG */
210#define MTDDEBUG(n, args...) do { } while(0)
236#ifdef CONFIG_MTD_PARTITIONS
237void mtd_erase_callback(struct erase_info *instr);
238#else
239static inline void mtd_erase_callback(struct erase_info *instr)
240{
241 if (instr->callback)
242 instr->callback(instr);
243}

--- 10 unchanged lines hidden (view full) ---

254#ifdef CONFIG_MTD_DEBUG
255#define MTDDEBUG(n, args...) \
256 do { \
257 if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
258 printk(KERN_INFO args); \
259 } while(0)
260#else /* CONFIG_MTD_DEBUG */
261#define MTDDEBUG(n, args...) do { } while(0)
211
212#endif /* CONFIG_MTD_DEBUG */
213
214#endif /* __MTD_MTD_H__ */
262#endif /* CONFIG_MTD_DEBUG */
263
264#endif /* __MTD_MTD_H__ */