diff options
| author | Artem Bityutskiy <Artem.Bityutskiy@intel.com> | 2011-11-18 23:53:11 +0200 | 
|---|---|---|
| committer | Artem Bityutskiy <Artem.Bityutskiy@intel.com> | 2011-11-18 23:53:11 +0200 | 
| commit | f8aa6922dde02835ba97e84be41f387cdd38ec7d (patch) | |
| tree | 171914942c226c733a9781cd8b0ca4ebeba3233d /include/mtd | |
| parent | 97bb4aa681f4df5e784c1f8a8db049a95a0d65c6 (diff) | |
| parent | 0970bf408707d610e88abb069b123e267aeb42f8 (diff) | |
Merge branch 'brian'v1.4.7
Diffstat (limited to 'include/mtd')
| -rw-r--r-- | include/mtd/mtd-abi.h | 122 | 
1 files changed, 105 insertions, 17 deletions
| diff --git a/include/mtd/mtd-abi.h b/include/mtd/mtd-abi.h index a86364a..4de167b 100644 --- a/include/mtd/mtd-abi.h +++ b/include/mtd/mtd-abi.h @@ -45,6 +45,51 @@ struct mtd_oob_buf64 {  	__u64 usr_ptr;  }; +/** + * MTD operation modes + * + * @MTD_OPS_PLACE_OOB:	OOB data are placed at the given offset (default) + * @MTD_OPS_AUTO_OOB:	OOB data are automatically placed at the free areas + *			which are defined by the internal ecclayout + * @MTD_OPS_RAW:	data are transferred as-is, with no error correction; + *			this mode implies %MTD_OPS_PLACE_OOB + * + * These modes can be passed to ioctl(MEMWRITE) and are also used internally. + * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. + * %MTD_FILE_MODE_RAW. + */ +enum { +	MTD_OPS_PLACE_OOB = 0, +	MTD_OPS_AUTO_OOB = 1, +	MTD_OPS_RAW = 2, +}; + +/** + * struct mtd_write_req - data structure for requesting a write operation + * + * @start:	start address + * @len:	length of data buffer + * @ooblen:	length of OOB buffer + * @usr_data:	user-provided data buffer + * @usr_oob:	user-provided OOB buffer + * @mode:	MTD mode (see "MTD operation modes") + * @padding:	reserved, must be set to 0 + * + * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB + * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to + * write data-only, set @usr_oob == NULL. However, setting both @usr_data and + * @usr_oob to NULL is not allowed. + */ +struct mtd_write_req { +	__u64 start; +	__u64 len; +	__u64 ooblen; +	__u64 usr_data; +	__u64 usr_oob; +	__u8 mode; +	__u8 padding[7]; +}; +  #define MTD_ABSENT		0  #define MTD_RAM			1  #define MTD_ROM			2 @@ -59,13 +104,13 @@ struct mtd_oob_buf64 {  #define MTD_NO_ERASE		0x1000	/* No erase necessary */  #define MTD_POWERUP_LOCK	0x2000	/* Always locked after reset */ -// Some common devices / combinations of capabilities +/* Some common devices / combinations of capabilities */  #define MTD_CAP_ROM		0  #define MTD_CAP_RAM		(MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)  #define MTD_CAP_NORFLASH	(MTD_WRITEABLE | MTD_BIT_WRITEABLE)  #define MTD_CAP_NANDFLASH	(MTD_WRITEABLE) -/* ECC byte placement */ +/* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */  #define MTD_NANDECC_OFF		0	// Switch off ECC (Not recommended)  #define MTD_NANDECC_PLACE	1	// Use the given placement in the structure (YAFFS1 legacy mode)  #define MTD_NANDECC_AUTOPLACE	2	// Use the default placement scheme @@ -80,21 +125,18 @@ struct mtd_oob_buf64 {  struct mtd_info_user {  	__u8 type;  	__u32 flags; -	__u32 size;	 // Total size of the MTD +	__u32 size;	/* Total size of the MTD */  	__u32 erasesize;  	__u32 writesize; -	__u32 oobsize;   // Amount of OOB data per block (e.g. 16) -	/* The below two fields are obsolete and broken, do not use them -	 * (TODO: remove at some point) */ -	__u32 ecctype; -	__u32 eccsize; +	__u32 oobsize;	/* Amount of OOB data per block (e.g. 16) */ +	__u64 padding;	/* Old obsolete field; do not use */  };  struct region_info_user {  	__u32 offset;		/* At which this region starts, -					 * from the beginning of the MTD */ -	__u32 erasesize;		/* For this region */ -	__u32 numblocks;		/* Number of blocks in this region */ +				 * from the beginning of the MTD */ +	__u32 erasesize;	/* For this region */ +	__u32 numblocks;	/* Number of blocks in this region */  	__u32 regionindex;  }; @@ -104,29 +146,61 @@ struct otp_info {  	__u32 locked;  }; +/* + * Note, the following ioctl existed in the past and was removed: + * #define MEMSETOOBSEL           _IOW('M', 9, struct nand_oobinfo) + * Try to avoid adding a new ioctl with the same ioctl number. + */ + +/* Get basic MTD characteristics info (better to use sysfs) */  #define MEMGETINFO		_IOR('M', 1, struct mtd_info_user) +/* Erase segment of MTD */  #define MEMERASE		_IOW('M', 2, struct erase_info_user) +/* Write out-of-band data from MTD */  #define MEMWRITEOOB		_IOWR('M', 3, struct mtd_oob_buf) +/* Read out-of-band data from MTD */  #define MEMREADOOB		_IOWR('M', 4, struct mtd_oob_buf) +/* Lock a chip (for MTD that supports it) */  #define MEMLOCK			_IOW('M', 5, struct erase_info_user) +/* Unlock a chip (for MTD that supports it) */  #define MEMUNLOCK		_IOW('M', 6, struct erase_info_user) +/* Get the number of different erase regions */  #define MEMGETREGIONCOUNT	_IOR('M', 7, int) +/* Get information about the erase region for a specific index */  #define MEMGETREGIONINFO	_IOWR('M', 8, struct region_info_user) -#define MEMSETOOBSEL		_IOW('M', 9, struct nand_oobinfo) +/* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */  #define MEMGETOOBSEL		_IOR('M', 10, struct nand_oobinfo) +/* Check if an eraseblock is bad */  #define MEMGETBADBLOCK		_IOW('M', 11, __kernel_loff_t) +/* Mark an eraseblock as bad */  #define MEMSETBADBLOCK		_IOW('M', 12, __kernel_loff_t) +/* Set OTP (One-Time Programmable) mode (factory vs. user) */  #define OTPSELECT		_IOR('M', 13, int) +/* Get number of OTP (One-Time Programmable) regions */  #define OTPGETREGIONCOUNT	_IOW('M', 14, int) +/* Get all OTP (One-Time Programmable) info about MTD */  #define OTPGETREGIONINFO	_IOW('M', 15, struct otp_info) +/* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */  #define OTPLOCK			_IOR('M', 16, struct otp_info) +/* Get ECC layout (deprecated) */  #define ECCGETLAYOUT		_IOR('M', 17, struct nand_ecclayout_user) +/* Get statistics about corrected/uncorrected errors */  #define ECCGETSTATS		_IOR('M', 18, struct mtd_ecc_stats) +/* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */  #define MTDFILEMODE		_IO('M', 19) +/* Erase segment of MTD (supports 64-bit address) */  #define MEMERASE64		_IOW('M', 20, struct erase_info_user64) +/* Write data to OOB (64-bit version) */  #define MEMWRITEOOB64		_IOWR('M', 21, struct mtd_oob_buf64) +/* Read data from OOB (64-bit version) */  #define MEMREADOOB64		_IOWR('M', 22, struct mtd_oob_buf64) +/* Check if chip is locked (for MTD that supports it) */  #define MEMISLOCKED		_IOR('M', 23, struct erase_info_user) +/* + * Most generic write interface; can write in-band and/or out-of-band in various + * modes (see "struct mtd_write_req") + */ +#define MEMWRITE		_IOWR('M', 24, struct mtd_write_req)  /*   * Obsolete legacy interface. Keep it in order not to break userspace @@ -177,13 +251,27 @@ struct mtd_ecc_stats {  };  /* - * Read/write file modes for access to MTD + * MTD file modes - for read/write access to MTD + * + * @MTD_FILE_MODE_NORMAL:	OTP disabled, ECC enabled + * @MTD_FILE_MODE_OTP_FACTORY:	OTP enabled in factory mode + * @MTD_FILE_MODE_OTP_USER:	OTP enabled in user mode + * @MTD_FILE_MODE_RAW:		OTP disabled, ECC disabled + * + * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained + * separately for each open file descriptor. + * + * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW - + * raw access to the flash, without error correction or autoplacement schemes. + * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode + * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is + * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)).   */  enum mtd_file_modes { -	MTD_MODE_NORMAL = MTD_OTP_OFF, -	MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY, -	MTD_MODE_OTP_USER = MTD_OTP_USER, -	MTD_MODE_RAW, +	MTD_FILE_MODE_NORMAL = MTD_OTP_OFF, +	MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY, +	MTD_FILE_MODE_OTP_USER = MTD_OTP_USER, +	MTD_FILE_MODE_RAW,  };  #endif /* __MTD_ABI_H__ */ | 
