source: branches/8.09/package/mtd/src/mtd-api.h @ 17662

Last change on this file since 17662 was 17662, checked in by nbd, 7 years ago

merge mtd fis table changes from r17657-r17660 to 8.09 to provide a better upgrade path from 8.09 to trunk and back

  • Property svn:eol-style set to native
File size: 9.4 KB
Line 
1
2
3#ifndef __MTD_MTD_H__
4#define __MTD_MTD_H__
5
6#ifdef __KERNEL__
7
8#include <linux/config.h>
9#include <linux/version.h>
10#include <linux/types.h>
11#include <linux/mtd/compatmac.h>
12#include <linux/notifier.h>
13#include <linux/module.h>
14#include <linux/uio.h>
15
16#endif /* __KERNEL__ */
17
18struct erase_info_user {
19        u_int32_t start;
20        u_int32_t length;
21};
22
23struct mtd_oob_buf {
24        u_int32_t start;
25        u_int32_t length;
26        unsigned char *ptr;
27};
28
29
30#define MTD_CHAR_MAJOR 90
31#define MTD_BLOCK_MAJOR 31
32#define MAX_MTD_DEVICES 16
33
34
35
36#define MTD_ABSENT              0
37#define MTD_RAM                 1
38#define MTD_ROM                 2
39#define MTD_NORFLASH            3
40#define MTD_NANDFLASH           4
41#define MTD_PEROM               5
42#define MTD_OTHER               14
43#define MTD_UNKNOWN             15
44
45
46
47#define MTD_CLEAR_BITS          1       // Bits can be cleared (flash)
48#define MTD_SET_BITS            2       // Bits can be set
49#define MTD_ERASEABLE           4       // Has an erase function
50#define MTD_WRITEB_WRITEABLE    8       // Direct IO is possible
51#define MTD_VOLATILE            16      // Set for RAMs
52#define MTD_XIP                 32      // eXecute-In-Place possible
53#define MTD_OOB                 64      // Out-of-band data (NAND flash)
54#define MTD_ECC                 128     // Device capable of automatic ECC
55
56// Some common devices / combinations of capabilities
57#define MTD_CAP_ROM             0
58#define MTD_CAP_RAM             (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE)
59#define MTD_CAP_NORFLASH        (MTD_CLEAR_BITS|MTD_ERASEABLE)
60#define MTD_CAP_NANDFLASH       (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB)
61#define MTD_WRITEABLE           (MTD_CLEAR_BITS|MTD_SET_BITS)
62
63
64// Types of automatic ECC/Checksum available
65#define MTD_ECC_NONE            0       // No automatic ECC available
66#define MTD_ECC_RS_DiskOnChip   1       // Automatic ECC on DiskOnChip
67#define MTD_ECC_SW              2       // SW ECC for Toshiba & Samsung devices
68
69struct mtd_info_user {
70        u_char type;
71        u_int32_t flags;
72        u_int32_t size;  // Total size of the MTD
73        u_int32_t erasesize;
74        u_int32_t oobblock;  // Size of OOB blocks (e.g. 512)
75        u_int32_t oobsize;   // Amount of OOB data per block (e.g. 16)
76        u_int32_t ecctype;
77        u_int32_t eccsize;
78};
79
80struct region_info_user {
81        u_int32_t offset;               /* At which this region starts,
82                                         * from the beginning of the MTD */
83        u_int32_t erasesize;            /* For this region */
84        u_int32_t numblocks;            /* Number of blocks in this region */
85        u_int32_t regionindex;
86};
87
88#define MEMGETINFO              _IOR('M', 1, struct mtd_info_user)
89#define MEMERASE                _IOW('M', 2, struct erase_info_user)
90#define MEMWRITEOOB             _IOWR('M', 3, struct mtd_oob_buf)
91#define MEMREADOOB              _IOWR('M', 4, struct mtd_oob_buf)
92#define MEMLOCK                 _IOW('M', 5, struct erase_info_user)
93#define MEMUNLOCK               _IOW('M', 6, struct erase_info_user)
94#define MEMGETREGIONCOUNT       _IOR('M', 7, int)
95#define MEMGETREGIONINFO        _IOWR('M', 8, struct region_info_user)
96#define MEMREADDATA             _IOWR('M', 9, struct mtd_oob_buf)
97#define MEMWRITEDATA            _IOWR('M', 10, struct mtd_oob_buf)
98#define MTDREFRESH                              _IO('M', 23)
99
100#ifndef __KERNEL__
101
102typedef struct mtd_info_user mtd_info_t;
103typedef struct erase_info_user erase_info_t;
104typedef struct region_info_user region_info_t;
105
106        /* User-space ioctl definitions */
107
108
109#else /* __KERNEL__ */
110
111
112#define MTD_ERASE_PENDING       0x01
113#define MTD_ERASING             0x02
114#define MTD_ERASE_SUSPEND       0x04
115#define MTD_ERASE_DONE          0x08
116#define MTD_ERASE_FAILED        0x10
117
118struct erase_info {
119        struct mtd_info *mtd;
120        u_int32_t addr;
121        u_int32_t len;
122        u_long time;
123        u_long retries;
124        u_int dev;
125        u_int cell;
126        void (*callback) (struct erase_info *self);
127        u_long priv;
128        u_char state;
129        struct erase_info *next;
130};
131
132struct mtd_erase_region_info {
133        u_int32_t offset;                       /* At which this region starts, from the beginning of the MTD */
134        u_int32_t erasesize;            /* For this region */
135        u_int32_t numblocks;            /* Number of blocks of erasesize in this region */
136};
137
138struct mtd_info {
139        u_char type;
140        u_int32_t flags;
141        u_int32_t size;  // Total size of the MTD
142
143        /* "Major" erase size for the device. Naïve users may take this
144         * to be the only erase size available, or may use the more detailed
145         * information below if they desire
146         */
147        u_int32_t erasesize;
148
149        u_int32_t oobblock;  // Size of OOB blocks (e.g. 512)
150        u_int32_t oobsize;   // Amount of OOB data per block (e.g. 16)
151        u_int32_t ecctype;
152        u_int32_t eccsize;
153
154        // Kernel-only stuff starts here.
155        char *name;
156        int index;
157
158        /* Data for variable erase regions. If numeraseregions is zero,
159         * it means that the whole device has erasesize as given above.
160         */
161        int numeraseregions;
162        struct mtd_erase_region_info *eraseregions; 
163
164        /* This really shouldn't be here. It can go away in 2.5 */
165        u_int32_t bank_size;
166
167        struct module *module;
168        int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
169
170        /* This stuff for eXecute-In-Place */
171        int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
172
173        /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
174        void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
175
176
177        int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
178        int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
179
180        int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, int oobsel);
181        int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, int oobsel);
182
183        int (*read_oob) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
184        int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
185
186        /*
187         * Methods to access the protection register area, present in some
188         * flash devices. The user data is one time programmable but the
189         * factory data is read only.
190         */
191        int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
192
193        int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
194
195        /* This function is not yet implemented */
196        int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
197
198        /* iovec-based read/write methods. We need these especially for NAND flash,
199           with its limited number of write cycles per erase.
200           NB: The 'count' parameter is the number of _vectors_, each of
201           which contains an (ofs, len) tuple.
202        */
203        int (*readv) (struct mtd_info *mtd, struct iovec *vecs, unsigned long count, loff_t from, size_t *retlen);
204        int (*readv_ecc) (struct mtd_info *mtd, struct iovec *vecs, unsigned long count, loff_t from, 
205                size_t *retlen, u_char *eccbuf, int oobsel);
206        int (*writev) (struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen);
207        int (*writev_ecc) (struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to, 
208                size_t *retlen, u_char *eccbuf, int oobsel);
209
210        /* Sync */
211        void (*sync) (struct mtd_info *mtd);
212
213        /* Chip-supported device locking */
214        int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
215        int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
216
217        /* Power Management functions */
218        int (*suspend) (struct mtd_info *mtd);
219        void (*resume) (struct mtd_info *mtd);
220
221        struct notifier_block reboot_notifier;
222
223        void *priv;
224};
225
226
227        /* Kernel-side ioctl definitions */
228
229extern int add_mtd_device(struct mtd_info *mtd);
230extern int del_mtd_device (struct mtd_info *mtd);
231
232extern struct mtd_info *__get_mtd_device(struct mtd_info *mtd, int num);
233
234static inline struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
235{
236        struct mtd_info *ret;
237       
238        ret = __get_mtd_device(mtd, num);
239
240        if (ret && ret->module && !try_inc_mod_count(ret->module))
241                return NULL;
242
243        return ret;
244}
245
246static inline void put_mtd_device(struct mtd_info *mtd)
247{
248       if (mtd->module)
249               __MOD_DEC_USE_COUNT(mtd->module);
250}
251
252
253struct mtd_notifier {
254        void (*add)(struct mtd_info *mtd);
255        void (*remove)(struct mtd_info *mtd);
256        struct mtd_notifier *next;
257};
258
259
260extern void register_mtd_user (struct mtd_notifier *new);
261extern int unregister_mtd_user (struct mtd_notifier *old);
262
263int default_mtd_writev(struct mtd_info *mtd, const struct iovec *vecs,
264                       unsigned long count, loff_t to, size_t *retlen);
265
266int default_mtd_readv(struct mtd_info *mtd, struct iovec *vecs,
267                      unsigned long count, loff_t from, size_t *retlen);
268
269#ifndef MTDC
270#define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args)
271#define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d))
272#define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg)
273#define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args)
274#define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args)
275#define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args)
276#define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args)
277#define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args)
278#define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args)
279#define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args)
280#define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args)
281#define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd);  } while (0)
282#endif /* MTDC */
283
284/*
285 * Debugging macro and defines
286 */
287#define MTD_DEBUG_LEVEL0        (0)     /* Quiet   */
288#define MTD_DEBUG_LEVEL1        (1)     /* Audible */
289#define MTD_DEBUG_LEVEL2        (2)     /* Loud    */
290#define MTD_DEBUG_LEVEL3        (3)     /* Noisy   */
291
292#ifdef CONFIG_MTD_DEBUG
293#define DEBUG(n, args...)                               \
294        do {                                            \
295                if (n <= CONFIG_MTD_DEBUG_VERBOSE)      \
296                        printk(KERN_INFO args);         \
297        } while(0)
298#else /* CONFIG_MTD_DEBUG */
299#define DEBUG(n, args...)
300#endif /* CONFIG_MTD_DEBUG */
301
302#endif /* __KERNEL__ */
303
304#endif /* __MTD_MTD_H__ */
Note: See TracBrowser for help on using the repository browser.