June 2025 | ||||||
Mo | Tu | We | Th | Fr | Sa | Su |
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 1 | 2 | 3 | 4 | 5 | 6 |
001: /* 002: * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> et al. 003: * 004: * This program is free software; you can redistribute it and/or modify 005: * it under the terms of the GNU General Public License as published by 006: * the Free Software Foundation; either version 2 of the License, or 007: * (at your option) any later version. 008: * 009: * This program is distributed in the hope that it will be useful, 010: * but WITHOUT ANY WARRANTY; without even the implied warranty of 011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012: * GNU General Public License for more details. 013: * 014: * You should have received a copy of the GNU General Public License 015: * along with this program; if not, write to the Free Software 016: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 017: * 018: */ 019: 020: #ifndef __MTD_ABI_H__ 021: #define __MTD_ABI_H__ 022: 023: #include <linux/types.h> 024: 025: struct erase_info_user { 026: __u32 start; 027: __u32 length; 028: }; 029: 030: struct erase_info_user64 { 031: __u64 start; 032: __u64 length; 033: }; 034: 035: struct mtd_oob_buf { 036: __u32 start; 037: __u32 length; 038: unsigned char *ptr; 039: }; 040: 041: struct mtd_oob_buf64 { 042: __u64 start; 043: __u32 pad; 044: __u32 length; 045: __u64 usr_ptr; 046: }; 047: 048: /** 049: * MTD operation modes 050: * 051: * @MTD_OPS_PLACE_OOB: OOB data are placed at the given offset (default) 052: * @MTD_OPS_AUTO_OOB: OOB data are automatically placed at the free areas 053: * which are defined by the internal ecclayout 054: * @MTD_OPS_RAW: data are transferred as-is, with no error correction; 055: * this mode implies %MTD_OPS_PLACE_OOB 056: * 057: * These modes can be passed to ioctl(MEMWRITE) and are also used internally. 058: * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. 059: * %MTD_FILE_MODE_RAW. 060: */ 061: enum { 062: MTD_OPS_PLACE_OOB = 0, 063: MTD_OPS_AUTO_OOB = 1, 064: MTD_OPS_RAW = 2, 065: }; 066: 067: /** 068: * struct mtd_write_req - data structure for requesting a write operation 069: * 070: * @start: start address 071: * @len: length of data buffer 072: * @ooblen: length of OOB buffer 073: * @usr_data: user-provided data buffer 074: * @usr_oob: user-provided OOB buffer 075: * @mode: MTD mode (see "MTD operation modes") 076: * @padding: reserved, must be set to 0 077: * 078: * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB 079: * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to 080: * write data-only, set @usr_oob == NULL. However, setting both @usr_data and 081: * @usr_oob to NULL is not allowed. 082: */ 083: struct mtd_write_req { 084: __u64 start; 085: __u64 len; 086: __u64 ooblen; 087: __u64 usr_data; 088: __u64 usr_oob; 089: __u8 mode; 090: __u8 padding[7]; 091: }; 092: 093: #define MTD_ABSENT 0 094: #define MTD_RAM 1 095: #define MTD_ROM 2 096: #define MTD_NORFLASH 3 097: #define MTD_NANDFLASH 4 098: #define MTD_DATAFLASH 6 099: #define MTD_UBIVOLUME 7 100: #define MTD_MLCNANDFLASH 8 101: 102: #define MTD_WRITEABLE 0x400 /* Device is writeable */ 103: #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ 104: #define MTD_NO_ERASE 0x1000 /* No erase necessary */ 105: #define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */ 106: 107: /* Some common devices / combinations of capabilities */ 108: #define MTD_CAP_ROM 0 109: #define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE) 110: #define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE) 111: #define MTD_CAP_NANDFLASH (MTD_WRITEABLE) 112: 113: /* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */ 114: #define MTD_NANDECC_OFF 0 // Switch off ECC (Not recommended) 115: #define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode) 116: #define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme 117: #define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read) 118: #define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default 119: 120: /* OTP mode selection */ 121: #define MTD_OTP_OFF 0 122: #define MTD_OTP_FACTORY 1 123: #define MTD_OTP_USER 2 124: 125: struct mtd_info_user { 126: __u8 type; 127: __u32 flags; 128: __u32 size; /* Total size of the MTD */ 129: __u32 erasesize; 130: __u32 writesize; 131: __u32 oobsize; /* Amount of OOB data per block (e.g. 16) */ 132: __u64 padding; /* Old obsolete field; do not use */ 133: }; 134: 135: struct region_info_user { 136: __u32 offset; /* At which this region starts, 137: * from the beginning of the MTD */ 138: __u32 erasesize; /* For this region */ 139: __u32 numblocks; /* Number of blocks in this region */ 140: __u32 regionindex; 141: }; 142: 143: struct otp_info { 144: __u32 start; 145: __u32 length; 146: __u32 locked; 147: }; 148: 149: /* 150: * Note, the following ioctl existed in the past and was removed: 151: * #define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo) 152: * Try to avoid adding a new ioctl with the same ioctl number. 153: */ 154: 155: /* Get basic MTD characteristics info (better to use sysfs) */ 156: #define MEMGETINFO _IOR('M', 1, struct mtd_info_user) 157: /* Erase segment of MTD */ 158: #define MEMERASE _IOW('M', 2, struct erase_info_user) 159: /* Write out-of-band data from MTD */ 160: #define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf) 161: /* Read out-of-band data from MTD */ 162: #define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf) 163: /* Lock a chip (for MTD that supports it) */ 164: #define MEMLOCK _IOW('M', 5, struct erase_info_user) 165: /* Unlock a chip (for MTD that supports it) */ 166: #define MEMUNLOCK _IOW('M', 6, struct erase_info_user) 167: /* Get the number of different erase regions */ 168: #define MEMGETREGIONCOUNT _IOR('M', 7, int) 169: /* Get information about the erase region for a specific index */ 170: #define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user) 171: /* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */ 172: #define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo) 173: /* Check if an eraseblock is bad */ 174: #define MEMGETBADBLOCK _IOW('M', 11, __kernel_loff_t) 175: /* Mark an eraseblock as bad */ 176: #define MEMSETBADBLOCK _IOW('M', 12, __kernel_loff_t) 177: /* Set OTP (One-Time Programmable) mode (factory vs. user) */ 178: #define OTPSELECT _IOR('M', 13, int) 179: /* Get number of OTP (One-Time Programmable) regions */ 180: #define OTPGETREGIONCOUNT _IOW('M', 14, int) 181: /* Get all OTP (One-Time Programmable) info about MTD */ 182: #define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) 183: /* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */ 184: #define OTPLOCK _IOR('M', 16, struct otp_info) 185: /* Get ECC layout (deprecated) */ 186: #define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout_user) 187: /* Get statistics about corrected/uncorrected errors */ 188: #define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) 189: /* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */ 190: #define MTDFILEMODE _IO('M', 19) 191: /* Erase segment of MTD (supports 64-bit address) */ 192: #define MEMERASE64 _IOW('M', 20, struct erase_info_user64) 193: /* Write data to OOB (64-bit version) */ 194: #define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64) 195: /* Read data from OOB (64-bit version) */ 196: #define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64) 197: /* Check if chip is locked (for MTD that supports it) */ 198: #define MEMISLOCKED _IOR('M', 23, struct erase_info_user) 199: /* 200: * Most generic write interface; can write in-band and/or out-of-band in various 201: * modes (see "struct mtd_write_req") 202: */ 203: #define MEMWRITE _IOWR('M', 24, struct mtd_write_req) 204: 205: /* 206: * Obsolete legacy interface. Keep it in order not to break userspace 207: * interfaces 208: */ 209: struct nand_oobinfo { 210: __u32 useecc; 211: __u32 eccbytes; 212: __u32 oobfree[8][2]; 213: __u32 eccpos[32]; 214: }; 215: 216: struct nand_oobfree { 217: __u32 offset; 218: __u32 length; 219: }; 220: 221: #define MTD_MAX_OOBFREE_ENTRIES 8 222: #define MTD_MAX_ECCPOS_ENTRIES 64 223: /* 224: * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl 225: * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a 226: * complete set of ECC information. The ioctl truncates the larger internal 227: * structure to retain binary compatibility with the static declaration of the 228: * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of 229: * the user struct, not the MAX size of the internal struct nand_ecclayout. 230: */ 231: struct nand_ecclayout_user { 232: __u32 eccbytes; 233: __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES]; 234: __u32 oobavail; 235: struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; 236: }; 237: 238: /** 239: * struct mtd_ecc_stats - error correction stats 240: * 241: * @corrected: number of corrected bits 242: * @failed: number of uncorrectable errors 243: * @badblocks: number of bad blocks in this partition 244: * @bbtblocks: number of blocks reserved for bad block tables 245: */ 246: struct mtd_ecc_stats { 247: __u32 corrected; 248: __u32 failed; 249: __u32 badblocks; 250: __u32 bbtblocks; 251: }; 252: 253: /* 254: * MTD file modes - for read/write access to MTD 255: * 256: * @MTD_FILE_MODE_NORMAL: OTP disabled, ECC enabled 257: * @MTD_FILE_MODE_OTP_FACTORY: OTP enabled in factory mode 258: * @MTD_FILE_MODE_OTP_USER: OTP enabled in user mode 259: * @MTD_FILE_MODE_RAW: OTP disabled, ECC disabled 260: * 261: * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained 262: * separately for each open file descriptor. 263: * 264: * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW - 265: * raw access to the flash, without error correction or autoplacement schemes. 266: * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode 267: * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is 268: * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)). 269: */ 270: enum mtd_file_modes { 271: MTD_FILE_MODE_NORMAL = MTD_OTP_OFF, 272: MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY, 273: MTD_FILE_MODE_OTP_USER = MTD_OTP_USER, 274: MTD_FILE_MODE_RAW, 275: }; 276: 277: #endif /* __MTD_ABI_H__ */ 278: