diff options
Diffstat (limited to 'include/linux/mtd')
| -rw-r--r-- | include/linux/mtd/bbm.h | 39 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 76 | ||||
| -rw-r--r-- | include/linux/mtd/nand.h | 92 | ||||
| -rw-r--r-- | include/linux/mtd/onenand.h | 4 | ||||
| -rw-r--r-- | include/linux/mtd/partitions.h | 46 | ||||
| -rw-r--r-- | include/linux/mtd/physmap.h | 17 | 
6 files changed, 121 insertions, 153 deletions
diff --git a/include/linux/mtd/bbm.h b/include/linux/mtd/bbm.h index 57cc0e63714..c4eec228eef 100644 --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h @@ -86,24 +86,39 @@ struct nand_bbt_descr {  #define NAND_BBT_VERSION	0x00000100  /* Create a bbt if none exists */  #define NAND_BBT_CREATE		0x00000200 +/* + * Create an empty BBT with no vendor information. Vendor's information may be + * unavailable, for example, if the NAND controller has a different data and OOB + * layout or if this information is already purged. Must be used in conjunction + * with NAND_BBT_CREATE. + */ +#define NAND_BBT_CREATE_EMPTY	0x00000400  /* Search good / bad pattern through all pages of a block */ -#define NAND_BBT_SCANALLPAGES	0x00000400 +#define NAND_BBT_SCANALLPAGES	0x00000800  /* Scan block empty during good / bad block scan */ -#define NAND_BBT_SCANEMPTY	0x00000800 +#define NAND_BBT_SCANEMPTY	0x00001000  /* Write bbt if neccecary */ -#define NAND_BBT_WRITE		0x00001000 +#define NAND_BBT_WRITE		0x00002000  /* Read and write back block contents when writing bbt */ -#define NAND_BBT_SAVECONTENT	0x00002000 +#define NAND_BBT_SAVECONTENT	0x00004000  /* Search good / bad pattern on the first and the second page */ -#define NAND_BBT_SCAN2NDPAGE	0x00004000 +#define NAND_BBT_SCAN2NDPAGE	0x00008000  /* Search good / bad pattern on the last page of the eraseblock */ -#define NAND_BBT_SCANLASTPAGE	0x00008000 -/* Chip stores bad block marker on BOTH 1st and 6th bytes of OOB */ -#define NAND_BBT_SCANBYTE1AND6 0x00100000 -/* The nand_bbt_descr was created dynamicaly and must be freed */ -#define NAND_BBT_DYNAMICSTRUCT 0x00200000 -/* The bad block table does not OOB for marker */ -#define NAND_BBT_NO_OOB		0x00400000 +#define NAND_BBT_SCANLASTPAGE	0x00010000 +/* + * Use a flash based bad block table. By default, OOB identifier is saved in + * OOB area. This option is passed to the default bad block table function. + */ +#define NAND_BBT_USE_FLASH	0x00020000 +/* Do not store flash based bad block table in OOB area; store it in-band */ +#define NAND_BBT_NO_OOB		0x00040000 + +/* + * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr + * was allocated dynamicaly and must be freed in nand_release(). Has no meaning + * in nand_chip.bbt_options. + */ +#define NAND_BBT_DYNAMICSTRUCT	0x80000000  /* The maximum number of blocks to scan for a bbt */  #define NAND_BBT_SCAN_MAXBLOCKS	4 diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 37be05bbfbc..9f5b312af78 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -32,17 +32,19 @@  #define MTD_CHAR_MAJOR 90  #define MTD_BLOCK_MAJOR 31 -#define MTD_ERASE_PENDING      	0x01 +#define MTD_ERASE_PENDING	0x01  #define MTD_ERASING		0x02  #define MTD_ERASE_SUSPEND	0x04 -#define MTD_ERASE_DONE          0x08 -#define MTD_ERASE_FAILED        0x10 +#define MTD_ERASE_DONE		0x08 +#define MTD_ERASE_FAILED	0x10  #define MTD_FAIL_ADDR_UNKNOWN -1LL -/* If the erase fails, fail_addr might indicate exactly which block failed.  If -   fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not -   specific to any particular block. */ +/* + * If the erase fails, fail_addr might indicate exactly which block failed. If + * fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level + * or was not specific to any particular block. + */  struct erase_info {  	struct mtd_info *mtd;  	uint64_t addr; @@ -59,26 +61,12 @@ struct erase_info {  };  struct mtd_erase_region_info { -	uint64_t offset;			/* At which this region starts, from the beginning of the MTD */ +	uint64_t offset;		/* At which this region starts, from the beginning of the MTD */  	uint32_t erasesize;		/* For this region */  	uint32_t numblocks;		/* Number of blocks of erasesize in this region */  	unsigned long *lockmap;		/* If keeping bitmap of locks */  }; -/* - * oob operation modes - * - * MTD_OOB_PLACE:	oob data are placed at the given offset - * MTD_OOB_AUTO:	oob data are automatically placed at the free areas - *			which are defined by the ecclayout - * MTD_OOB_RAW:		mode to read oob and data without doing ECC checking - */ -typedef enum { -	MTD_OOB_PLACE, -	MTD_OOB_AUTO, -	MTD_OOB_RAW, -} mtd_oob_mode_t; -  /**   * struct mtd_oob_ops - oob operation operands   * @mode:	operation mode @@ -90,7 +78,7 @@ typedef enum {   * @ooblen:	number of oob bytes to write/read   * @oobretlen:	number of oob bytes written/read   * @ooboffs:	offset of oob data in the oob area (only relevant when - *		mode = MTD_OOB_PLACE) + *		mode = MTD_OPS_PLACE_OOB or MTD_OPS_RAW)   * @datbuf:	data buffer - if NULL only oob data are read/written   * @oobbuf:	oob data buffer   * @@ -99,7 +87,7 @@ typedef enum {   * OOB area.   */  struct mtd_oob_ops { -	mtd_oob_mode_t	mode; +	unsigned int	mode;  	size_t		len;  	size_t		retlen;  	size_t		ooblen; @@ -173,7 +161,7 @@ struct mtd_info {  	const char *name;  	int index; -	/* ecc layout structure pointer - read only ! */ +	/* ECC layout structure pointer - read only! */  	struct nand_ecclayout *ecclayout;  	/* Data for variable erase regions. If numeraseregions is zero, @@ -324,10 +312,15 @@ static inline uint32_t mtd_mod_by_ws(uint64_t sz, struct mtd_info *mtd)  	/* Kernel-side ioctl definitions */  struct mtd_partition; +struct mtd_part_parser_data; -extern int mtd_device_register(struct mtd_info *master, -			       const struct mtd_partition *parts, -			       int nr_parts); +extern int mtd_device_parse_register(struct mtd_info *mtd, +			      const char **part_probe_types, +			      struct mtd_part_parser_data *parser_data, +			      const struct mtd_partition *defparts, +			      int defnr_parts); +#define mtd_device_register(master, parts, nr_parts)	\ +	mtd_device_parse_register(master, NULL, NULL, parts, nr_parts)  extern int mtd_device_unregister(struct mtd_info *master);  extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);  extern int __get_mtd_device(struct mtd_info *mtd); @@ -356,27 +349,16 @@ void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);  void mtd_erase_callback(struct erase_info *instr); -/* - * Debugging macro and defines - */ -#define MTD_DEBUG_LEVEL0	(0)	/* Quiet   */ -#define MTD_DEBUG_LEVEL1	(1)	/* Audible */ -#define MTD_DEBUG_LEVEL2	(2)	/* Loud    */ -#define MTD_DEBUG_LEVEL3	(3)	/* Noisy   */ +static inline int mtd_is_bitflip(int err) { +	return err == -EUCLEAN; +} -#ifdef CONFIG_MTD_DEBUG -#define DEBUG(n, args...)				\ -	do {						\ -		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\ -			printk(KERN_INFO args);		\ -	} while(0) -#else /* CONFIG_MTD_DEBUG */ -#define DEBUG(n, args...)				\ -	do {						\ -		if (0)					\ -			printk(KERN_INFO args);		\ -	} while(0) +static inline int mtd_is_eccerr(int err) { +	return err == -EBADMSG; +} -#endif /* CONFIG_MTD_DEBUG */ +static inline int mtd_is_bitflip_or_eccerr(int err) { +	return mtd_is_bitflip(err) || mtd_is_eccerr(err); +}  #endif /* __MTD_MTD_H__ */ diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index c2b9ac4fbc4..904131bab50 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -42,10 +42,10 @@ extern void nand_release(struct mtd_info *mtd);  /* Internal helper for board drivers which need to override command function */  extern void nand_wait_ready(struct mtd_info *mtd); -/* locks all blockes present in the device */ +/* locks all blocks present in the device */  extern int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); -/* unlocks specified locked blockes */ +/* unlocks specified locked blocks */  extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);  /* The maximum number of NAND chips in an array */ @@ -150,7 +150,7 @@ typedef enum {  #define NAND_ECC_READ		0  /* Reset Hardware ECC for write */  #define NAND_ECC_WRITE		1 -/* Enable Hardware ECC before syndrom is read back from flash */ +/* Enable Hardware ECC before syndrome is read back from flash */  #define NAND_ECC_READSYN	2  /* Bit mask for flags passed to do_nand_read_ecc */ @@ -163,7 +163,7 @@ typedef enum {   */  /* Chip can not auto increment pages */  #define NAND_NO_AUTOINCR	0x00000001 -/* Buswitdh is 16 bit */ +/* Buswidth is 16 bit */  #define NAND_BUSWIDTH_16	0x00000002  /* Device supports partial programming without padding */  #define NAND_NO_PADDING		0x00000004 @@ -219,27 +219,15 @@ typedef enum {  #define NAND_CHIPOPTIONS_MSK	(0x0000ffff & ~NAND_NO_AUTOINCR)  /* Non chip related options */ -/* - * Use a flash based bad block table. OOB identifier is saved in OOB area. - * This option is passed to the default bad block table function. - */ -#define NAND_USE_FLASH_BBT	0x00010000  /* This option skips the bbt scan during initialization. */ -#define NAND_SKIP_BBTSCAN	0x00020000 +#define NAND_SKIP_BBTSCAN	0x00010000  /*   * This option is defined if the board driver allocates its own buffers   * (e.g. because it needs them DMA-coherent).   */ -#define NAND_OWN_BUFFERS	0x00040000 +#define NAND_OWN_BUFFERS	0x00020000  /* Chip may not exist, so silence any errors in scan */ -#define NAND_SCAN_SILENT_NODEV	0x00080000 -/* - * If passed additionally to NAND_USE_FLASH_BBT then BBT code will not touch - * the OOB area. - */ -#define NAND_USE_FLASH_BBT_NO_OOB	0x00800000 -/* Create an empty BBT with no vendor information if the BBT is available */ -#define NAND_CREATE_EMPTY_BBT		0x01000000 +#define NAND_SCAN_SILENT_NODEV	0x00040000  /* Options set by nand scan */  /* Nand scan has allocated controller struct */ @@ -331,27 +319,29 @@ struct nand_hw_control {  };  /** - * struct nand_ecc_ctrl - Control structure for ecc - * @mode:	ecc mode - * @steps:	number of ecc steps per page - * @size:	data bytes per ecc step - * @bytes:	ecc bytes per step - * @total:	total number of ecc bytes per page - * @prepad:	padding information for syndrome based ecc generators - * @postpad:	padding information for syndrome based ecc generators + * struct nand_ecc_ctrl - Control structure for ECC + * @mode:	ECC mode + * @steps:	number of ECC steps per page + * @size:	data bytes per ECC step + * @bytes:	ECC bytes per step + * @total:	total number of ECC bytes per page + * @prepad:	padding information for syndrome based ECC generators + * @postpad:	padding information for syndrome based ECC generators   * @layout:	ECC layout control struct pointer - * @priv:	pointer to private ecc control data - * @hwctl:	function to control hardware ecc generator. Must only + * @priv:	pointer to private ECC control data + * @hwctl:	function to control hardware ECC generator. Must only   *		be provided if an hardware ECC is available - * @calculate:	function for ecc calculation or readback from ecc hardware - * @correct:	function for ecc correction, matching to ecc generator (sw/hw) + * @calculate:	function for ECC calculation or readback from ECC hardware + * @correct:	function for ECC correction, matching to ECC generator (sw/hw)   * @read_page_raw:	function to read a raw page without ECC   * @write_page_raw:	function to write a raw page without ECC - * @read_page:	function to read a page according to the ecc generator + * @read_page:	function to read a page according to the ECC generator   *		requirements.   * @read_subpage:	function to read parts of the page covered by ECC. - * @write_page:	function to write a page according to the ecc generator + * @write_page:	function to write a page according to the ECC generator   *		requirements. + * @write_oob_raw:	function to write chip OOB data without ECC + * @read_oob_raw:	function to read chip OOB data without ECC   * @read_oob:	function to read chip OOB data   * @write_oob:	function to write chip OOB data   */ @@ -380,6 +370,10 @@ struct nand_ecc_ctrl {  			uint32_t offs, uint32_t len, uint8_t *buf);  	void (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,  			const uint8_t *buf); +	int (*write_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, +			int page); +	int (*read_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, +			int page, int sndcmd);  	int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page,  			int sndcmd);  	int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip, @@ -388,8 +382,8 @@ struct nand_ecc_ctrl {  /**   * struct nand_buffers - buffer structure for read/write - * @ecccalc:	buffer for calculated ecc - * @ecccode:	buffer for ecc read from flash + * @ecccalc:	buffer for calculated ECC + * @ecccode:	buffer for ECC read from flash   * @databuf:	buffer for data - dynamically sized   *   * Do not change the order of buffers. databuf and oobrbuf must be in @@ -422,7 +416,7 @@ struct nand_buffers {   *			mtd->oobsize, mtd->writesize and so on.   *			@id_data contains the 8 bytes values of NAND_CMD_READID.   *			Return with the bus width. - * @dev_ready:		[BOARDSPECIFIC] hardwarespecific function for accesing + * @dev_ready:		[BOARDSPECIFIC] hardwarespecific function for accessing   *			device ready/busy line. If set to NULL no access to   *			ready/busy is available and the ready/busy information   *			is read from the chip status register. @@ -430,17 +424,17 @@ struct nand_buffers {   *			commands to the chip.   * @waitfunc:		[REPLACEABLE] hardwarespecific function for wait on   *			ready. - * @ecc:		[BOARDSPECIFIC] ecc control ctructure + * @ecc:		[BOARDSPECIFIC] ECC control structure   * @buffers:		buffer structure for read/write   * @hwcontrol:		platform-specific hardware control structure - * @ops:		oob operation operands   * @erase_cmd:		[INTERN] erase command write function, selectable due   *			to AND support.   * @scan_bbt:		[REPLACEABLE] function to scan bad block table   * @chip_delay:		[BOARDSPECIFIC] chip dependent delay for transferring   *			data from array to read regs (tR).   * @state:		[INTERN] the current state of the NAND device - * @oob_poi:		poison value buffer + * @oob_poi:		"poison value buffer," used for laying out OOB data + *			before writing   * @page_shift:		[INTERN] number of address bits in a page (column   *			address bits).   * @phys_erase_shift:	[INTERN] number of address bits in a physical eraseblock @@ -449,6 +443,9 @@ struct nand_buffers {   * @options:		[BOARDSPECIFIC] various chip options. They can partly   *			be set to inform nand_scan about special functionality.   *			See the defines for further explanation. + * @bbt_options:	[INTERN] bad block specific options. All options used + *			here must come from bbm.h. By default, these options + *			will be copied to the appropriate nand_bbt_descr's.   * @badblockpos:	[INTERN] position of the bad block marker in the oob   *			area.   * @badblockbits:	[INTERN] number of bits to left-shift the bad block @@ -464,7 +461,7 @@ struct nand_buffers {   *			non 0 if ONFI supported.   * @onfi_params:	[INTERN] holds the ONFI page parameter when ONFI is   *			supported, 0 otherwise. - * @ecclayout:		[REPLACEABLE] the default ecc placement scheme + * @ecclayout:		[REPLACEABLE] the default ECC placement scheme   * @bbt:		[INTERN] bad block table pointer   * @bbt_td:		[REPLACEABLE] bad block table descriptor for flash   *			lookup. @@ -472,9 +469,9 @@ struct nand_buffers {   * @badblock_pattern:	[REPLACEABLE] bad block scan pattern used for initial   *			bad block scan.   * @controller:		[REPLACEABLE] a pointer to a hardware controller - *			structure which is shared among multiple independend + *			structure which is shared among multiple independent   *			devices. - * @priv:		[OPTIONAL] pointer to private chip date + * @priv:		[OPTIONAL] pointer to private chip data   * @errstat:		[OPTIONAL] hardware specific function to perform   *			additional error status checks (determine if errors are   *			correctable). @@ -509,6 +506,7 @@ struct nand_chip {  	int chip_delay;  	unsigned int options; +	unsigned int bbt_options;  	int page_shift;  	int phys_erase_shift; @@ -536,8 +534,6 @@ struct nand_chip {  	struct nand_buffers *buffers;  	struct nand_hw_control hwcontrol; -	struct mtd_oob_ops ops; -  	uint8_t *bbt;  	struct nand_bbt_descr *bbt_td;  	struct nand_bbt_descr *bbt_md; @@ -611,10 +607,9 @@ extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len,   * @partitions:		mtd partition list   * @chip_delay:		R/B delay value in us   * @options:		Option flags, e.g. 16bit buswidth - * @ecclayout:		ecc layout info structure + * @bbt_options:	BBT option flags, e.g. NAND_BBT_USE_FLASH + * @ecclayout:		ECC layout info structure   * @part_probe_types:	NULL-terminated array of probe types - * @set_parts:		platform specific function to set partitions - * @priv:		hardware controller specific settings   */  struct platform_nand_chip {  	int nr_chips; @@ -624,9 +619,8 @@ struct platform_nand_chip {  	struct nand_ecclayout *ecclayout;  	int chip_delay;  	unsigned int options; +	unsigned int bbt_options;  	const char **part_probe_types; -	void (*set_parts)(uint64_t size, struct platform_nand_chip *chip); -	void *priv;  };  /* Keep gcc happy */ diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index 52b6f187bf4..4596503c9da 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h @@ -184,6 +184,9 @@ struct onenand_chip {  #define ONENAND_IS_CACHE_PROGRAM(this)					\  	(this->options & ONENAND_HAS_CACHE_PROGRAM) +#define ONENAND_IS_NOP_1(this)						\ +	(this->options & ONENAND_HAS_NOP_1) +  /* Check byte access in OneNAND */  #define ONENAND_CHECK_BYTE_ACCESS(addr)		(addr & 0x1) @@ -195,6 +198,7 @@ struct onenand_chip {  #define ONENAND_HAS_2PLANE		(0x0004)  #define ONENAND_HAS_4KB_PAGE		(0x0008)  #define ONENAND_HAS_CACHE_PROGRAM	(0x0010) +#define ONENAND_HAS_NOP_1		(0x0020)  #define ONENAND_SKIP_UNLOCK_CHECK	(0x0100)  #define ONENAND_PAGEBUF_ALLOC		(0x1000)  #define ONENAND_OOBBUF_ALLOC		(0x2000) diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index 3a6f0372fc9..2475228c115 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -24,7 +24,9 @@   * 	will extend to the end of the master MTD device.   * offset: absolute starting position within the master MTD device; if   * 	defined as MTDPART_OFS_APPEND, the partition will start where the - * 	previous one ended; if MTDPART_OFS_NXTBLK, at the next erase block. + *	previous one ended; if MTDPART_OFS_NXTBLK, at the next erase block; + *	if MTDPART_OFS_RETAIN, consume as much as possible, leaving size + *	after the end of partition.   * mask_flags: contains flags that have to be masked (removed) from the   * 	master MTD flag set for the corresponding MTD partition.   * 	For example, to force a read-only partition, simply adding @@ -42,12 +44,25 @@ struct mtd_partition {  	struct nand_ecclayout *ecclayout;	/* out of band layout for this partition (NAND only) */  }; +#define MTDPART_OFS_RETAIN	(-3)  #define MTDPART_OFS_NXTBLK	(-2)  #define MTDPART_OFS_APPEND	(-1)  #define MTDPART_SIZ_FULL	(0)  struct mtd_info; +struct device_node; + +/** + * struct mtd_part_parser_data - used to pass data to MTD partition parsers. + * @origin: for RedBoot, start address of MTD device + * @of_node: for OF parsers, device node containing partitioning information + */ +struct mtd_part_parser_data { +	unsigned long origin; +	struct device_node *of_node; +}; +  /*   * Functions dealing with the various ways of partitioning the space @@ -57,37 +72,12 @@ struct mtd_part_parser {  	struct list_head list;  	struct module *owner;  	const char *name; -	int (*parse_fn)(struct mtd_info *, struct mtd_partition **, unsigned long); +	int (*parse_fn)(struct mtd_info *, struct mtd_partition **, +			struct mtd_part_parser_data *);  };  extern int register_mtd_parser(struct mtd_part_parser *parser);  extern int deregister_mtd_parser(struct mtd_part_parser *parser); -extern int parse_mtd_partitions(struct mtd_info *master, const char **types, -				struct mtd_partition **pparts, unsigned long origin); - -#define put_partition_parser(p) do { module_put((p)->owner); } while(0) - -struct device; -struct device_node; - -#ifdef CONFIG_MTD_OF_PARTS -int __devinit of_mtd_parse_partitions(struct device *dev, -                                      struct device_node *node, -                                      struct mtd_partition **pparts); -#else -static inline int of_mtd_parse_partitions(struct device *dev, -					  struct device_node *node, -					  struct mtd_partition **pparts) -{ -	return 0; -} -#endif - -#ifdef CONFIG_MTD_CMDLINE_PARTS -static inline int mtd_has_cmdlinepart(void) { return 1; } -#else -static inline int mtd_has_cmdlinepart(void) { return 0; } -#endif  int mtd_is_partition(struct mtd_info *mtd);  int mtd_add_partition(struct mtd_info *master, char *name, diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index e5f21d293c7..04e018160e2 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h @@ -32,21 +32,4 @@ struct physmap_flash_data {  	struct mtd_partition	*parts;  }; -/* - * Board needs to specify the exact mapping during their setup time. - */ -void physmap_configure(unsigned long addr, unsigned long size, -		int bankwidth, void (*set_vpp)(struct map_info *, int) ); - -/* - * Machines that wish to do flash partition may want to call this function in - * their setup routine. - * - *	physmap_set_partitions(mypartitions, num_parts); - * - * Note that one can always override this hard-coded partition with - * command line partition (you need to enable CONFIG_MTD_CMDLINE_PARTS). - */ -void physmap_set_partitions(struct mtd_partition *parts, int num_parts); -  #endif /* __LINUX_MTD_PHYSMAP__ */  |