xref: /rk3399_rockchip-uboot/include/linux/mtd/mtd.h (revision cfa460adfdefcc30d104e1a9ee44994ee349bb7b)
1 /*
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__
11 
12 #include <linux/types.h>
13 #include <linux/mtd/mtd-abi.h>
14 
15 #define MTD_CHAR_MAJOR 90
16 #define MTD_BLOCK_MAJOR 31
17 #define MAX_MTD_DEVICES 32
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
26    fail_addr = 0xffffffff, the failure was not at the device level or was not
27    specific to any particular block. */
28 struct 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 
43 struct 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 */
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  */
60 typedef 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  */
85 struct 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 
96 struct mtd_info {
97 	u_char type;
98 	u_int32_t flags;
99 	u_int32_t size;	 // Total size of the MTD
100 
101 	/* "Major" erase size for the device. Naïve users may take this
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;
114 
115 	u_int32_t oobsize;   // Amount of OOB data per block (e.g. 16)
116 	u_int32_t oobavail;  // Available OOB bytes per block
117 
118 	// Kernel-only stuff starts here.
119 	char *name;
120 	int index;
121 
122 	/* ecc layout structure pointer - read only ! */
123 	struct nand_ecclayout *ecclayout;
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 
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 
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);
147 
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 	 */
153 	int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
154 	int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
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);
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 */
161 #if 0
162 	/* kvec-based read/write methods.
163 	   NB: The 'count' parameter is the number of _vectors_, each of
164 	   which contains an (ofs, len) tuple.
165 	*/
166 	int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
167 #endif
168 
169 	/* Sync */
170 	void (*sync) (struct mtd_info *mtd);
171 
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);
179 
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 
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);
205 };
206 
207 
208 	/* Kernel-side ioctl definitions */
209 
210 extern int add_mtd_device(struct mtd_info *mtd);
211 extern int del_mtd_device (struct mtd_info *mtd);
212 
213 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
214 extern struct mtd_info *get_mtd_device_nm(const char *name);
215 
216 extern void put_mtd_device(struct mtd_info *mtd);
217 
218 /* XXX U-BOOT XXX */
219 #if 0
220 struct mtd_notifier {
221 	void (*add)(struct mtd_info *mtd);
222 	void (*remove)(struct mtd_info *mtd);
223 	struct list_head list;
224 };
225 
226 extern void register_mtd_user (struct mtd_notifier *new);
227 extern int unregister_mtd_user (struct mtd_notifier *old);
228 
229 int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
230 		       unsigned long count, loff_t to, size_t *retlen);
231 
232 int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
233 		      unsigned long count, loff_t from, size_t *retlen);
234 #endif
235 
236 #ifdef CONFIG_MTD_PARTITIONS
237 void mtd_erase_callback(struct erase_info *instr);
238 #else
239 static 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
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)
262 #endif /* CONFIG_MTD_DEBUG */
263 
264 #endif /* __MTD_MTD_H__ */
265