blob: 8e0dc00f757131e452243b3be04d236c63fb7801 [file] [log] [blame]
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +02001/*
William Juulcfa460a2007-10-31 13:53:06 +01002 * $Id: mtd.h,v 1.61 2005/11/07 11:14:54 gleixner Exp $
Wolfgang Denk932394a2005-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 Juulcfa460a2007-10-31 13:53:06 +010011
Wolfgang Denk932394a2005-08-17 12:55:25 +020012#include <linux/types.h>
13#include <linux/mtd/mtd-abi.h>
14
William Juulcfa460a2007-10-31 13:53:06 +010015#define MTD_CHAR_MAJOR 90
16#define MTD_BLOCK_MAJOR 31
17#define MAX_MTD_DEVICES 32
Wolfgang Denk932394a2005-08-17 12:55:25 +020018
Wolfgang Denk53677ef2008-05-20 16:00:29 +020019#define MTD_ERASE_PENDING 0x01
Wolfgang Denk932394a2005-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
25/* If the erase fails, fail_addr might indicate exactly which block failed. If
26 fail_addr = 0xffffffff, the failure was not at the device level or was not
27 specific to any particular block. */
28struct erase_info {
29 struct mtd_info *mtd;
30 u_int32_t addr;
31 u_int32_t len;
32 u_int32_t fail_addr;
33 u_long time;
34 u_long retries;
35 u_int dev;
36 u_int cell;
37 void (*callback) (struct erase_info *self);
38 u_long priv;
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 */
William Juulcfa460a2007-10-31 13:53:06 +010047 unsigned long *lockmap; /* If keeping bitmap of locks */
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;
Wolfgang Denk932394a2005-08-17 12:55:25 +020094};
95
96struct mtd_info {
97 u_char type;
98 u_int32_t flags;
William Juulcfa460a2007-10-31 13:53:06 +010099 u_int32_t size; // Total size of the MTD
Wolfgang Denk932394a2005-08-17 12:55:25 +0200100
William Juulcfa460a2007-10-31 13:53:06 +0100101 /* "Major" erase size for the device. Naïve users may take this
Wolfgang Denk932394a2005-08-17 12:55:25 +0200102 * 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;
William Juulcfa460a2007-10-31 13:53:06 +0100106 /* 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;
Wolfgang Denk932394a2005-08-17 12:55:25 +0200114
William Juulcfa460a2007-10-31 13:53:06 +0100115 u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
116 u_int32_t oobavail; // Available OOB bytes per block
Wolfgang Denk932394a2005-08-17 12:55:25 +0200117
William Juulcfa460a2007-10-31 13:53:06 +0100118 // Kernel-only stuff starts here.
Wolfgang Denk932394a2005-08-17 12:55:25 +0200119 char *name;
120 int index;
121
William Juulcfa460a2007-10-31 13:53:06 +0100122 /* ecc layout structure pointer - read only ! */
123 struct nand_ecclayout *ecclayout;
Wolfgang Denk932394a2005-08-17 12:55:25 +0200124
125 /* Data for variable erase regions. If numeraseregions is zero,
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +0200126 * it means that the whole device has erasesize as given above.
Wolfgang Denk932394a2005-08-17 12:55:25 +0200127 */
128 int numeraseregions;
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +0200129 struct mtd_erase_region_info *eraseregions;
Wolfgang Denk932394a2005-08-17 12:55:25 +0200130
Wolfgang Denk932394a2005-08-17 12:55:25 +0200131 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
William Juulcfa460a2007-10-31 13:53:06 +0100143 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);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200147
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +0200148 /*
149 * Methods to access the protection register area, present in some
Wolfgang Denk932394a2005-08-17 12:55:25 +0200150 * flash devices. The user data is one time programmable but the
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +0200151 * factory data is read only.
Wolfgang Denk932394a2005-08-17 12:55:25 +0200152 */
William Juulcfa460a2007-10-31 13:53:06 +0100153 int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200154 int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
William Juulcfa460a2007-10-31 13:53:06 +0100155 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);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200157 int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
William Juulcfa460a2007-10-31 13:53:06 +0100158 int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
159
160/* XXX U-BOOT XXX */
Wolfgang Denk932394a2005-08-17 12:55:25 +0200161#if 0
William Juulcfa460a2007-10-31 13:53:06 +0100162 /* kvec-based read/write methods.
Wolfgang Denkac7eb8a2005-09-14 23:53:32 +0200163 NB: The 'count' parameter is the number of _vectors_, each of
Wolfgang Denk932394a2005-08-17 12:55:25 +0200164 which contains an (ofs, len) tuple.
165 */
Wolfgang Denk932394a2005-08-17 12:55:25 +0200166 int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200167#endif
William Juulcfa460a2007-10-31 13:53:06 +0100168
Wolfgang Denk932394a2005-08-17 12:55:25 +0200169 /* Sync */
170 void (*sync) (struct mtd_info *mtd);
William Juulcfa460a2007-10-31 13:53:06 +0100171
Wolfgang Denk932394a2005-08-17 12:55:25 +0200172 /* 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);
William Juulcfa460a2007-10-31 13:53:06 +0100179
Wolfgang Denk932394a2005-08-17 12:55:25 +0200180 /* 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
William Juulcfa460a2007-10-31 13:53:06 +0100184/* 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
Wolfgang Denk932394a2005-08-17 12:55:25 +0200194 void *priv;
195
196 struct module *owner;
197 int usecount;
William Juulcfa460a2007-10-31 13:53:06 +0100198
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);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200205};
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);
William Juulcfa460a2007-10-31 13:53:06 +0100214extern struct mtd_info *get_mtd_device_nm(const char *name);
Wolfgang Denk932394a2005-08-17 12:55:25 +0200215
216extern void put_mtd_device(struct mtd_info *mtd);
217
William Juulcfa460a2007-10-31 13:53:06 +0100218/* XXX U-BOOT XXX */
Wolfgang Denk932394a2005-08-17 12:55:25 +0200219#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
Wolfgang Denk932394a2005-08-17 12:55:25 +0200226extern 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
Wolfgang Denk932394a2005-08-17 12:55:25 +0200236#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}
244#endif
245
246/*
247 * Debugging macro and defines
248 */
249#define MTD_DEBUG_LEVEL0 (0) /* Quiet */
250#define MTD_DEBUG_LEVEL1 (1) /* Audible */
251#define MTD_DEBUG_LEVEL2 (2) /* Loud */
252#define MTD_DEBUG_LEVEL3 (3) /* Noisy */
253
254#ifdef CONFIG_MTD_DEBUG
Scott Wood3167c532008-06-20 12:38:57 -0500255#define MTDDEBUG(n, args...) \
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200256 do { \
Wolfgang Denk932394a2005-08-17 12:55:25 +0200257 if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
258 printk(KERN_INFO args); \
259 } while(0)
260#else /* CONFIG_MTD_DEBUG */
Scott Wood3167c532008-06-20 12:38:57 -0500261#define MTDDEBUG(n, args...) do { } while(0)
Wolfgang Denk932394a2005-08-17 12:55:25 +0200262#endif /* CONFIG_MTD_DEBUG */
263
264#endif /* __MTD_MTD_H__ */