Home | History | Annotate | Download | only in mtd
      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 (at) infradead.org> et al.
      5  *
      6  * Released under GPL
      7  */
      8 
      9 #ifndef __MTD_MTD_H__
     10 #define __MTD_MTD_H__
     11 
     12 #ifndef __KERNEL__
     13 #error This is a kernel header. Perhaps include mtd-user.h instead?
     14 #endif
     15 
     16 #include <linux/types.h>
     17 #include <linux/module.h>
     18 #include <linux/uio.h>
     19 #include <linux/notifier.h>
     20 
     21 #include <linux/mtd/compatmac.h>
     22 #include <mtd/mtd-abi.h>
     23 
     24 #define MTD_CHAR_MAJOR 90
     25 #define MTD_BLOCK_MAJOR 31
     26 #define MAX_MTD_DEVICES 16
     27 
     28 #define MTD_ERASE_PENDING      	0x01
     29 #define MTD_ERASING		0x02
     30 #define MTD_ERASE_SUSPEND	0x04
     31 #define MTD_ERASE_DONE          0x08
     32 #define MTD_ERASE_FAILED        0x10
     33 
     34 /* If the erase fails, fail_addr might indicate exactly which block failed.  If
     35    fail_addr = 0xffffffff, the failure was not at the device level or was not
     36    specific to any particular block. */
     37 struct erase_info {
     38 	struct mtd_info *mtd;
     39 	u_int32_t addr;
     40 	u_int32_t len;
     41 	u_int32_t fail_addr;
     42 	u_long time;
     43 	u_long retries;
     44 	u_int dev;
     45 	u_int cell;
     46 	void (*callback) (struct erase_info *self);
     47 	u_long priv;
     48 	u_char state;
     49 	struct erase_info *next;
     50 };
     51 
     52 struct mtd_erase_region_info {
     53 	u_int32_t offset;			/* At which this region starts, from the beginning of the MTD */
     54 	u_int32_t erasesize;		/* For this region */
     55 	u_int32_t numblocks;		/* Number of blocks of erasesize in this region */
     56 };
     57 
     58 /*
     59  * oob operation modes
     60  *
     61  * MTD_OOB_PLACE:	oob data are placed at the given offset
     62  * MTD_OOB_AUTO:	oob data are automatically placed at the free areas
     63  *			which are defined by the ecclayout
     64  * MTD_OOB_RAW:		mode to read raw data+oob in one chunk. The oob data
     65  *			is inserted into the data. Thats a raw image of the
     66  *			flash contents.
     67  */
     68 typedef enum {
     69 	MTD_OOB_PLACE,
     70 	MTD_OOB_AUTO,
     71 	MTD_OOB_RAW,
     72 } mtd_oob_mode_t;
     73 
     74 /**
     75  * struct mtd_oob_ops - oob operation operands
     76  * @mode:	operation mode
     77  *
     78  * @len:	number of bytes to write/read. When a data buffer is given
     79  *		(datbuf != NULL) this is the number of data bytes. When
     80  *		no data buffer is available this is the number of oob bytes.
     81  *
     82  * @retlen:	number of bytes written/read. When a data buffer is given
     83  *		(datbuf != NULL) this is the number of data bytes. When
     84  *		no data buffer is available this is the number of oob bytes.
     85  *
     86  * @ooblen:	number of oob bytes per page
     87  * @ooboffs:	offset of oob data in the oob area (only relevant when
     88  *		mode = MTD_OOB_PLACE)
     89  * @datbuf:	data buffer - if NULL only oob data are read/written
     90  * @oobbuf:	oob data buffer
     91  */
     92 struct mtd_oob_ops {
     93 	mtd_oob_mode_t	mode;
     94 	size_t		len;
     95 	size_t		retlen;
     96 	size_t		ooblen;
     97 	uint32_t	ooboffs;
     98 	uint8_t		*datbuf;
     99 	uint8_t		*oobbuf;
    100 };
    101 
    102 struct mtd_info {
    103 	u_char type;
    104 	u_int32_t flags;
    105 	u_int32_t size;	 // Total size of the MTD
    106 
    107 	/* "Major" erase size for the device. Nave users may take this
    108 	 * to be the only erase size available, or may use the more detailed
    109 	 * information below if they desire
    110 	 */
    111 	u_int32_t erasesize;
    112 	/* Minimal writable flash unit size. In case of NOR flash it is 1 (even
    113 	 * though individual bits can be cleared), in case of NAND flash it is
    114 	 * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
    115 	 * it is of ECC block size, etc. It is illegal to have writesize = 0.
    116 	 * Any driver registering a struct mtd_info must ensure a writesize of
    117 	 * 1 or larger.
    118 	 */
    119 	u_int32_t writesize;
    120 
    121 	u_int32_t oobsize;   // Amount of OOB data per block (e.g. 16)
    122 	u_int32_t ecctype;
    123 	u_int32_t eccsize;
    124 
    125 	/*
    126 	 * Reuse some of the above unused fields in the case of NOR flash
    127 	 * with configurable programming regions to avoid modifying the
    128 	 * user visible structure layout/size.  Only valid when the
    129 	 * MTD_PROGRAM_REGIONS flag is set.
    130 	 * (Maybe we should have an union for those?)
    131 	 */
    132 #define MTD_PROGREGION_CTRLMODE_VALID(mtd)  (mtd)->oobsize
    133 #define MTD_PROGREGION_CTRLMODE_INVALID(mtd)  (mtd)->ecctype
    134 
    135 	// Kernel-only stuff starts here.
    136 	char *name;
    137 	int index;
    138 
    139 	/* ecc layout structure pointer - read only ! */
    140 	struct nand_ecclayout *ecclayout;
    141 
    142 	/* Data for variable erase regions. If numeraseregions is zero,
    143 	 * it means that the whole device has erasesize as given above.
    144 	 */
    145 	int numeraseregions;
    146 	struct mtd_erase_region_info *eraseregions;
    147 
    148 	/* This really shouldn't be here. It can go away in 2.5 */
    149 	u_int32_t bank_size;
    150 
    151 	int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
    152 
    153 	/* This stuff for eXecute-In-Place */
    154 	int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
    155 
    156 	/* We probably shouldn't allow XIP if the unpoint isn't a NULL */
    157 	void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
    158 
    159 
    160 	int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
    161 	int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
    162 
    163 	int (*read_oob) (struct mtd_info *mtd, loff_t from,
    164 			 struct mtd_oob_ops *ops);
    165 	int (*write_oob) (struct mtd_info *mtd, loff_t to,
    166 			 struct mtd_oob_ops *ops);
    167 
    168 	/*
    169 	 * Methods to access the protection register area, present in some
    170 	 * flash devices. The user data is one time programmable but the
    171 	 * factory data is read only.
    172 	 */
    173 	int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
    174 	int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
    175 	int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
    176 	int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
    177 	int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
    178 	int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
    179 
    180 	/* kvec-based read/write methods.
    181 	   NB: The 'count' parameter is the number of _vectors_, each of
    182 	   which contains an (ofs, len) tuple.
    183 	*/
    184 	int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
    185 
    186 	/* Sync */
    187 	void (*sync) (struct mtd_info *mtd);
    188 
    189 	/* Chip-supported device locking */
    190 	int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
    191 	int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
    192 
    193 	/* Power Management functions */
    194 	int (*suspend) (struct mtd_info *mtd);
    195 	void (*resume) (struct mtd_info *mtd);
    196 
    197 	/* Bad block management functions */
    198 	int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
    199 	int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
    200 
    201 	struct notifier_block reboot_notifier;  /* default mode before reboot */
    202 
    203 	/* ECC status information */
    204 	struct mtd_ecc_stats ecc_stats;
    205 
    206 	void *priv;
    207 
    208 	struct module *owner;
    209 	int usecount;
    210 };
    211 
    212 
    213 	/* Kernel-side ioctl definitions */
    214 
    215 extern int add_mtd_device(struct mtd_info *mtd);
    216 extern int del_mtd_device (struct mtd_info *mtd);
    217 
    218 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
    219 
    220 extern void put_mtd_device(struct mtd_info *mtd);
    221 
    222 
    223 struct mtd_notifier {
    224 	void (*add)(struct mtd_info *mtd);
    225 	void (*remove)(struct mtd_info *mtd);
    226 	struct list_head list;
    227 };
    228 
    229 
    230 extern void register_mtd_user (struct mtd_notifier *new);
    231 extern int unregister_mtd_user (struct mtd_notifier *old);
    232 
    233 int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
    234 		       unsigned long count, loff_t to, size_t *retlen);
    235 
    236 int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
    237 		      unsigned long count, loff_t from, size_t *retlen);
    238 
    239 #ifdef CONFIG_MTD_PARTITIONS
    240 void mtd_erase_callback(struct erase_info *instr);
    241 #else
    242 static inline void mtd_erase_callback(struct erase_info *instr)
    243 {
    244 	if (instr->callback)
    245 		instr->callback(instr);
    246 }
    247 #endif
    248 
    249 /*
    250  * Debugging macro and defines
    251  */
    252 #define MTD_DEBUG_LEVEL0	(0)	/* Quiet   */
    253 #define MTD_DEBUG_LEVEL1	(1)	/* Audible */
    254 #define MTD_DEBUG_LEVEL2	(2)	/* Loud    */
    255 #define MTD_DEBUG_LEVEL3	(3)	/* Noisy   */
    256 
    257 #ifdef CONFIG_MTD_DEBUG
    258 #define DEBUG(n, args...)				\
    259 	do {						\
    260 		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\
    261 			printk(KERN_INFO args);		\
    262 	} while(0)
    263 #else /* CONFIG_MTD_DEBUG */
    264 #define DEBUG(n, args...) do { } while(0)
    265 
    266 #endif /* CONFIG_MTD_DEBUG */
    267 
    268 #endif /* __MTD_MTD_H__ */
    269