linux/include/linux/mtd/mtd.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al.
   3 *
   4 * Released under GPL
   5 */
   6
   7#ifndef __MTD_MTD_H__
   8#define __MTD_MTD_H__
   9
  10#include <linux/types.h>
  11#include <linux/module.h>
  12#include <linux/uio.h>
  13#include <linux/notifier.h>
  14#include <linux/device.h>
  15
  16#include <linux/mtd/compatmac.h>
  17#include <mtd/mtd-abi.h>
  18
  19#include <asm/div64.h>
  20
  21#define MTD_CHAR_MAJOR 90
  22#define MTD_BLOCK_MAJOR 31
  23#define MAX_MTD_DEVICES 32
  24
  25#define MTD_ERASE_PENDING       0x01
  26#define MTD_ERASING             0x02
  27#define MTD_ERASE_SUSPEND       0x04
  28#define MTD_ERASE_DONE          0x08
  29#define MTD_ERASE_FAILED        0x10
  30
  31#define MTD_FAIL_ADDR_UNKNOWN -1LL
  32
  33/* If the erase fails, fail_addr might indicate exactly which block failed.  If
  34   fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not
  35   specific to any particular block. */
  36struct erase_info {
  37        struct mtd_info *mtd;
  38        uint64_t addr;
  39        uint64_t len;
  40        uint64_t fail_addr;
  41        u_long time;
  42        u_long retries;
  43        unsigned dev;
  44        unsigned cell;
  45        void (*callback) (struct erase_info *self);
  46        u_long priv;
  47        u_char state;
  48        struct erase_info *next;
  49};
  50
  51struct mtd_erase_region_info {
  52        uint64_t offset;                        /* At which this region starts, from the beginning of the MTD */
  53        uint32_t erasesize;             /* For this region */
  54        uint32_t numblocks;             /* Number of blocks of erasesize in this region */
  55        unsigned long *lockmap;         /* If keeping bitmap of locks */
  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 */
  68typedef 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 data bytes to write/read
  79 *
  80 * @retlen:     number of data bytes written/read
  81 *
  82 * @ooblen:     number of oob bytes to write/read
  83 * @oobretlen:  number of oob bytes written/read
  84 * @ooboffs:    offset of oob data in the oob area (only relevant when
  85 *              mode = MTD_OOB_PLACE)
  86 * @datbuf:     data buffer - if NULL only oob data are read/written
  87 * @oobbuf:     oob data buffer
  88 *
  89 * Note, it is allowed to read more than one OOB area at one go, but not write.
  90 * The interface assumes that the OOB write requests program only one page's
  91 * OOB area.
  92 */
  93struct mtd_oob_ops {
  94        mtd_oob_mode_t  mode;
  95        size_t          len;
  96        size_t          retlen;
  97        size_t          ooblen;
  98        size_t          oobretlen;
  99        uint32_t        ooboffs;
 100        uint8_t         *datbuf;
 101        uint8_t         *oobbuf;
 102};
 103
 104struct mtd_info {
 105        u_char type;
 106        uint32_t flags;
 107        uint64_t size;   // Total size of the MTD
 108
 109        /* "Major" erase size for the device. Naïve users may take this
 110         * to be the only erase size available, or may use the more detailed
 111         * information below if they desire
 112         */
 113        uint32_t erasesize;
 114        /* Minimal writable flash unit size. In case of NOR flash it is 1 (even
 115         * though individual bits can be cleared), in case of NAND flash it is
 116         * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
 117         * it is of ECC block size, etc. It is illegal to have writesize = 0.
 118         * Any driver registering a struct mtd_info must ensure a writesize of
 119         * 1 or larger.
 120         */
 121        uint32_t writesize;
 122
 123        uint32_t oobsize;   // Amount of OOB data per block (e.g. 16)
 124        uint32_t oobavail;  // Available OOB bytes per block
 125
 126        /*
 127         * If erasesize is a power of 2 then the shift is stored in
 128         * erasesize_shift otherwise erasesize_shift is zero. Ditto writesize.
 129         */
 130        unsigned int erasesize_shift;
 131        unsigned int writesize_shift;
 132        /* Masks based on erasesize_shift and writesize_shift */
 133        unsigned int erasesize_mask;
 134        unsigned int writesize_mask;
 135
 136        // Kernel-only stuff starts here.
 137        const char *name;
 138        int index;
 139
 140        /* ecc layout structure pointer - read only ! */
 141        struct nand_ecclayout *ecclayout;
 142
 143        /* Data for variable erase regions. If numeraseregions is zero,
 144         * it means that the whole device has erasesize as given above.
 145         */
 146        int numeraseregions;
 147        struct mtd_erase_region_info *eraseregions;
 148
 149        /*
 150         * Erase is an asynchronous operation.  Device drivers are supposed
 151         * to call instr->callback() whenever the operation completes, even
 152         * if it completes with a failure.
 153         * Callers are supposed to pass a callback function and wait for it
 154         * to be called before writing to the block.
 155         */
 156        int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
 157
 158        /* This stuff for eXecute-In-Place */
 159        /* phys is optional and may be set to NULL */
 160        int (*point) (struct mtd_info *mtd, loff_t from, size_t len,
 161                        size_t *retlen, void **virt, resource_size_t *phys);
 162
 163        /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
 164        void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
 165
 166        /* Allow NOMMU mmap() to directly map the device (if not NULL)
 167         * - return the address to which the offset maps
 168         * - return -ENOSYS to indicate refusal to do the mapping
 169         */
 170        unsigned long (*get_unmapped_area) (struct mtd_info *mtd,
 171                                            unsigned long len,
 172                                            unsigned long offset,
 173                                            unsigned long flags);
 174
 175        /* Backing device capabilities for this device
 176         * - provides mmap capabilities
 177         */
 178        struct backing_dev_info *backing_dev_info;
 179
 180
 181        int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
 182        int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
 183
 184        /* In blackbox flight recorder like scenarios we want to make successful
 185           writes in interrupt context. panic_write() is only intended to be
 186           called when its known the kernel is about to panic and we need the
 187           write to succeed. Since the kernel is not going to be running for much
 188           longer, this function can break locks and delay to ensure the write
 189           succeeds (but not sleep). */
 190
 191        int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
 192
 193        int (*read_oob) (struct mtd_info *mtd, loff_t from,
 194                         struct mtd_oob_ops *ops);
 195        int (*write_oob) (struct mtd_info *mtd, loff_t to,
 196                         struct mtd_oob_ops *ops);
 197
 198        /*
 199         * Methods to access the protection register area, present in some
 200         * flash devices. The user data is one time programmable but the
 201         * factory data is read only.
 202         */
 203        int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
 204        int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
 205        int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
 206        int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
 207        int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
 208        int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
 209
 210        /* kvec-based read/write methods.
 211           NB: The 'count' parameter is the number of _vectors_, each of
 212           which contains an (ofs, len) tuple.
 213        */
 214        int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
 215
 216        /* Sync */
 217        void (*sync) (struct mtd_info *mtd);
 218
 219        /* Chip-supported device locking */
 220        int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
 221        int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
 222
 223        /* Power Management functions */
 224        int (*suspend) (struct mtd_info *mtd);
 225        void (*resume) (struct mtd_info *mtd);
 226
 227        /* Bad block management functions */
 228        int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
 229        int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
 230
 231        struct notifier_block reboot_notifier;  /* default mode before reboot */
 232
 233        /* ECC status information */
 234        struct mtd_ecc_stats ecc_stats;
 235        /* Subpage shift (NAND) */
 236        int subpage_sft;
 237
 238        void *priv;
 239
 240        struct module *owner;
 241        struct device dev;
 242        int usecount;
 243
 244        /* If the driver is something smart, like UBI, it may need to maintain
 245         * its own reference counting. The below functions are only for driver.
 246         * The driver may register its callbacks. These callbacks are not
 247         * supposed to be called by MTD users */
 248        int (*get_device) (struct mtd_info *mtd);
 249        void (*put_device) (struct mtd_info *mtd);
 250};
 251
 252static inline struct mtd_info *dev_to_mtd(struct device *dev)
 253{
 254        return dev ? dev_get_drvdata(dev) : NULL;
 255}
 256
 257static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
 258{
 259        if (mtd->erasesize_shift)
 260                return sz >> mtd->erasesize_shift;
 261        do_div(sz, mtd->erasesize);
 262        return sz;
 263}
 264
 265static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd)
 266{
 267        if (mtd->erasesize_shift)
 268                return sz & mtd->erasesize_mask;
 269        return do_div(sz, mtd->erasesize);
 270}
 271
 272static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
 273{
 274        if (mtd->writesize_shift)
 275                return sz >> mtd->writesize_shift;
 276        do_div(sz, mtd->writesize);
 277        return sz;
 278}
 279
 280static inline uint32_t mtd_mod_by_ws(uint64_t sz, struct mtd_info *mtd)
 281{
 282        if (mtd->writesize_shift)
 283                return sz & mtd->writesize_mask;
 284        return do_div(sz, mtd->writesize);
 285}
 286
 287        /* Kernel-side ioctl definitions */
 288
 289extern int add_mtd_device(struct mtd_info *mtd);
 290extern int del_mtd_device (struct mtd_info *mtd);
 291
 292extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
 293extern struct mtd_info *get_mtd_device_nm(const char *name);
 294
 295extern void put_mtd_device(struct mtd_info *mtd);
 296
 297
 298struct mtd_notifier {
 299        void (*add)(struct mtd_info *mtd);
 300        void (*remove)(struct mtd_info *mtd);
 301        struct list_head list;
 302};
 303
 304
 305extern void register_mtd_user (struct mtd_notifier *new);
 306extern int unregister_mtd_user (struct mtd_notifier *old);
 307
 308int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
 309                       unsigned long count, loff_t to, size_t *retlen);
 310
 311int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
 312                      unsigned long count, loff_t from, size_t *retlen);
 313
 314#ifdef CONFIG_MTD_PARTITIONS
 315void mtd_erase_callback(struct erase_info *instr);
 316#else
 317static inline void mtd_erase_callback(struct erase_info *instr)
 318{
 319        if (instr->callback)
 320                instr->callback(instr);
 321}
 322#endif
 323
 324/*
 325 * Debugging macro and defines
 326 */
 327#define MTD_DEBUG_LEVEL0        (0)     /* Quiet   */
 328#define MTD_DEBUG_LEVEL1        (1)     /* Audible */
 329#define MTD_DEBUG_LEVEL2        (2)     /* Loud    */
 330#define MTD_DEBUG_LEVEL3        (3)     /* Noisy   */
 331
 332#ifdef CONFIG_MTD_DEBUG
 333#define DEBUG(n, args...)                               \
 334        do {                                            \
 335                if (n <= CONFIG_MTD_DEBUG_VERBOSE)      \
 336                        printk(KERN_INFO args);         \
 337        } while(0)
 338#else /* CONFIG_MTD_DEBUG */
 339#define DEBUG(n, args...)                               \
 340        do {                                            \
 341                if (0)                                  \
 342                        printk(KERN_INFO args);         \
 343        } while(0)
 344
 345#endif /* CONFIG_MTD_DEBUG */
 346
 347#endif /* __MTD_MTD_H__ */
 348