1f412fefaSKyungmin Park /* 2f412fefaSKyungmin Park * Copyright (c) International Business Machines Corp., 2006 3f412fefaSKyungmin Park * Copyright (c) Nokia Corporation, 2006, 2007 4f412fefaSKyungmin Park * 5f412fefaSKyungmin Park * This program is free software; you can redistribute it and/or modify 6f412fefaSKyungmin Park * it under the terms of the GNU General Public License as published by 7f412fefaSKyungmin Park * the Free Software Foundation; either version 2 of the License, or 8f412fefaSKyungmin Park * (at your option) any later version. 9f412fefaSKyungmin Park * 10f412fefaSKyungmin Park * This program is distributed in the hope that it will be useful, 11f412fefaSKyungmin Park * but WITHOUT ANY WARRANTY; without even the implied warranty of 12f412fefaSKyungmin Park * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13f412fefaSKyungmin Park * the GNU General Public License for more details. 14f412fefaSKyungmin Park * 15f412fefaSKyungmin Park * You should have received a copy of the GNU General Public License 16f412fefaSKyungmin Park * along with this program; if not, write to the Free Software 17f412fefaSKyungmin Park * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18f412fefaSKyungmin Park * 19f412fefaSKyungmin Park * Author: Artem Bityutskiy (Битюцкий Артём) 20f412fefaSKyungmin Park */ 21f412fefaSKyungmin Park 22f412fefaSKyungmin Park #ifndef __UBI_UBI_H__ 23f412fefaSKyungmin Park #define __UBI_UBI_H__ 24f412fefaSKyungmin Park 25f412fefaSKyungmin Park #ifdef UBI_LINUX 26f412fefaSKyungmin Park #include <linux/init.h> 27f412fefaSKyungmin Park #include <linux/types.h> 28f412fefaSKyungmin Park #include <linux/list.h> 29f412fefaSKyungmin Park #include <linux/rbtree.h> 30f412fefaSKyungmin Park #include <linux/sched.h> 31f412fefaSKyungmin Park #include <linux/wait.h> 32f412fefaSKyungmin Park #include <linux/mutex.h> 33f412fefaSKyungmin Park #include <linux/rwsem.h> 34f412fefaSKyungmin Park #include <linux/spinlock.h> 35f412fefaSKyungmin Park #include <linux/fs.h> 36f412fefaSKyungmin Park #include <linux/cdev.h> 37f412fefaSKyungmin Park #include <linux/device.h> 38f412fefaSKyungmin Park #include <linux/string.h> 39f412fefaSKyungmin Park #include <linux/vmalloc.h> 40f412fefaSKyungmin Park #include <linux/mtd/mtd.h> 41f412fefaSKyungmin Park #include <linux/mtd/ubi.h> 42f412fefaSKyungmin Park #endif 43f412fefaSKyungmin Park 44f412fefaSKyungmin Park #include <linux/types.h> 45f412fefaSKyungmin Park #include <linux/list.h> 46f412fefaSKyungmin Park #include <linux/rbtree.h> 47f412fefaSKyungmin Park #include <linux/string.h> 48f412fefaSKyungmin Park #include <linux/mtd/mtd.h> 49f412fefaSKyungmin Park #include <linux/mtd/ubi.h> 50f412fefaSKyungmin Park 51f412fefaSKyungmin Park #include "ubi-media.h" 52f412fefaSKyungmin Park #include "scan.h" 53f412fefaSKyungmin Park #include "debug.h" 54f412fefaSKyungmin Park 55f412fefaSKyungmin Park /* Maximum number of supported UBI devices */ 56f412fefaSKyungmin Park #define UBI_MAX_DEVICES 32 57f412fefaSKyungmin Park 58f412fefaSKyungmin Park /* UBI name used for character devices, sysfs, etc */ 59f412fefaSKyungmin Park #define UBI_NAME_STR "ubi" 60f412fefaSKyungmin Park 61f412fefaSKyungmin Park /* Normal UBI messages */ 62f412fefaSKyungmin Park #define ubi_msg(fmt, ...) printk(KERN_NOTICE "UBI: " fmt "\n", ##__VA_ARGS__) 63f412fefaSKyungmin Park /* UBI warning messages */ 64f412fefaSKyungmin Park #define ubi_warn(fmt, ...) printk(KERN_WARNING "UBI warning: %s: " fmt "\n", \ 65f412fefaSKyungmin Park __func__, ##__VA_ARGS__) 66f412fefaSKyungmin Park /* UBI error messages */ 67f412fefaSKyungmin Park #define ubi_err(fmt, ...) printk(KERN_ERR "UBI error: %s: " fmt "\n", \ 68f412fefaSKyungmin Park __func__, ##__VA_ARGS__) 69f412fefaSKyungmin Park 70f412fefaSKyungmin Park /* Lowest number PEBs reserved for bad PEB handling */ 71f412fefaSKyungmin Park #define MIN_RESEVED_PEBS 2 72f412fefaSKyungmin Park 73f412fefaSKyungmin Park /* Background thread name pattern */ 74f412fefaSKyungmin Park #define UBI_BGT_NAME_PATTERN "ubi_bgt%dd" 75f412fefaSKyungmin Park 76f412fefaSKyungmin Park /* This marker in the EBA table means that the LEB is um-mapped */ 77f412fefaSKyungmin Park #define UBI_LEB_UNMAPPED -1 78f412fefaSKyungmin Park 79f412fefaSKyungmin Park /* 80f412fefaSKyungmin Park * In case of errors, UBI tries to repeat the operation several times before 81f412fefaSKyungmin Park * returning error. The below constant defines how many times UBI re-tries. 82f412fefaSKyungmin Park */ 83f412fefaSKyungmin Park #define UBI_IO_RETRIES 3 84f412fefaSKyungmin Park 85f412fefaSKyungmin Park /* 86f412fefaSKyungmin Park * Error codes returned by the I/O unit. 87f412fefaSKyungmin Park * 88f412fefaSKyungmin Park * UBI_IO_PEB_EMPTY: the physical eraseblock is empty, i.e. it contains only 89f412fefaSKyungmin Park * 0xFF bytes 90f412fefaSKyungmin Park * UBI_IO_PEB_FREE: the physical eraseblock is free, i.e. it contains only a 91f412fefaSKyungmin Park * valid erase counter header, and the rest are %0xFF bytes 92f412fefaSKyungmin Park * UBI_IO_BAD_EC_HDR: the erase counter header is corrupted (bad magic or CRC) 93f412fefaSKyungmin Park * UBI_IO_BAD_VID_HDR: the volume identifier header is corrupted (bad magic or 94f412fefaSKyungmin Park * CRC) 95f412fefaSKyungmin Park * UBI_IO_BITFLIPS: bit-flips were detected and corrected 96f412fefaSKyungmin Park */ 97f412fefaSKyungmin Park enum { 98f412fefaSKyungmin Park UBI_IO_PEB_EMPTY = 1, 99f412fefaSKyungmin Park UBI_IO_PEB_FREE, 100f412fefaSKyungmin Park UBI_IO_BAD_EC_HDR, 101f412fefaSKyungmin Park UBI_IO_BAD_VID_HDR, 102f412fefaSKyungmin Park UBI_IO_BITFLIPS 103f412fefaSKyungmin Park }; 104f412fefaSKyungmin Park 105f412fefaSKyungmin Park /** 106f412fefaSKyungmin Park * struct ubi_wl_entry - wear-leveling entry. 107f412fefaSKyungmin Park * @rb: link in the corresponding RB-tree 108f412fefaSKyungmin Park * @ec: erase counter 109f412fefaSKyungmin Park * @pnum: physical eraseblock number 110f412fefaSKyungmin Park * 111f412fefaSKyungmin Park * This data structure is used in the WL unit. Each physical eraseblock has a 112f412fefaSKyungmin Park * corresponding &struct wl_entry object which may be kept in different 113f412fefaSKyungmin Park * RB-trees. See WL unit for details. 114f412fefaSKyungmin Park */ 115f412fefaSKyungmin Park struct ubi_wl_entry { 116f412fefaSKyungmin Park struct rb_node rb; 117f412fefaSKyungmin Park int ec; 118f412fefaSKyungmin Park int pnum; 119f412fefaSKyungmin Park }; 120f412fefaSKyungmin Park 121f412fefaSKyungmin Park /** 122f412fefaSKyungmin Park * struct ubi_ltree_entry - an entry in the lock tree. 123f412fefaSKyungmin Park * @rb: links RB-tree nodes 124f412fefaSKyungmin Park * @vol_id: volume ID of the locked logical eraseblock 125f412fefaSKyungmin Park * @lnum: locked logical eraseblock number 126f412fefaSKyungmin Park * @users: how many tasks are using this logical eraseblock or wait for it 127f412fefaSKyungmin Park * @mutex: read/write mutex to implement read/write access serialization to 128f412fefaSKyungmin Park * the (@vol_id, @lnum) logical eraseblock 129f412fefaSKyungmin Park * 130f412fefaSKyungmin Park * This data structure is used in the EBA unit to implement per-LEB locking. 131f412fefaSKyungmin Park * When a logical eraseblock is being locked - corresponding 132f412fefaSKyungmin Park * &struct ubi_ltree_entry object is inserted to the lock tree (@ubi->ltree). 133f412fefaSKyungmin Park * See EBA unit for details. 134f412fefaSKyungmin Park */ 135f412fefaSKyungmin Park struct ubi_ltree_entry { 136f412fefaSKyungmin Park struct rb_node rb; 137f412fefaSKyungmin Park int vol_id; 138f412fefaSKyungmin Park int lnum; 139f412fefaSKyungmin Park int users; 140f412fefaSKyungmin Park struct rw_semaphore mutex; 141f412fefaSKyungmin Park }; 142f412fefaSKyungmin Park 143f412fefaSKyungmin Park struct ubi_volume_desc; 144f412fefaSKyungmin Park 145f412fefaSKyungmin Park /** 146f412fefaSKyungmin Park * struct ubi_volume - UBI volume description data structure. 147f412fefaSKyungmin Park * @dev: device object to make use of the the Linux device model 148f412fefaSKyungmin Park * @cdev: character device object to create character device 149f412fefaSKyungmin Park * @ubi: reference to the UBI device description object 150f412fefaSKyungmin Park * @vol_id: volume ID 151f412fefaSKyungmin Park * @ref_count: volume reference count 152f412fefaSKyungmin Park * @readers: number of users holding this volume in read-only mode 153f412fefaSKyungmin Park * @writers: number of users holding this volume in read-write mode 154f412fefaSKyungmin Park * @exclusive: whether somebody holds this volume in exclusive mode 155f412fefaSKyungmin Park * 156f412fefaSKyungmin Park * @reserved_pebs: how many physical eraseblocks are reserved for this volume 157f412fefaSKyungmin Park * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) 158f412fefaSKyungmin Park * @usable_leb_size: logical eraseblock size without padding 159f412fefaSKyungmin Park * @used_ebs: how many logical eraseblocks in this volume contain data 160f412fefaSKyungmin Park * @last_eb_bytes: how many bytes are stored in the last logical eraseblock 161f412fefaSKyungmin Park * @used_bytes: how many bytes of data this volume contains 162f412fefaSKyungmin Park * @alignment: volume alignment 163f412fefaSKyungmin Park * @data_pad: how many bytes are not used at the end of physical eraseblocks to 164f412fefaSKyungmin Park * satisfy the requested alignment 165f412fefaSKyungmin Park * @name_len: volume name length 166f412fefaSKyungmin Park * @name: volume name 167f412fefaSKyungmin Park * 168f412fefaSKyungmin Park * @upd_ebs: how many eraseblocks are expected to be updated 169f412fefaSKyungmin Park * @ch_lnum: LEB number which is being changing by the atomic LEB change 170f412fefaSKyungmin Park * operation 171f412fefaSKyungmin Park * @ch_dtype: data persistency type which is being changing by the atomic LEB 172f412fefaSKyungmin Park * change operation 173f412fefaSKyungmin Park * @upd_bytes: how many bytes are expected to be received for volume update or 174f412fefaSKyungmin Park * atomic LEB change 175f412fefaSKyungmin Park * @upd_received: how many bytes were already received for volume update or 176f412fefaSKyungmin Park * atomic LEB change 177f412fefaSKyungmin Park * @upd_buf: update buffer which is used to collect update data or data for 178f412fefaSKyungmin Park * atomic LEB change 179f412fefaSKyungmin Park * 180f412fefaSKyungmin Park * @eba_tbl: EBA table of this volume (LEB->PEB mapping) 181f412fefaSKyungmin Park * @checked: %1 if this static volume was checked 182f412fefaSKyungmin Park * @corrupted: %1 if the volume is corrupted (static volumes only) 183f412fefaSKyungmin Park * @upd_marker: %1 if the update marker is set for this volume 184f412fefaSKyungmin Park * @updating: %1 if the volume is being updated 185f412fefaSKyungmin Park * @changing_leb: %1 if the atomic LEB change ioctl command is in progress 186f412fefaSKyungmin Park * 187f412fefaSKyungmin Park * @gluebi_desc: gluebi UBI volume descriptor 188f412fefaSKyungmin Park * @gluebi_refcount: reference count of the gluebi MTD device 189f412fefaSKyungmin Park * @gluebi_mtd: MTD device description object of the gluebi MTD device 190f412fefaSKyungmin Park * 191f412fefaSKyungmin Park * The @corrupted field indicates that the volume's contents is corrupted. 192f412fefaSKyungmin Park * Since UBI protects only static volumes, this field is not relevant to 193f412fefaSKyungmin Park * dynamic volumes - it is user's responsibility to assure their data 194f412fefaSKyungmin Park * integrity. 195f412fefaSKyungmin Park * 196f412fefaSKyungmin Park * The @upd_marker flag indicates that this volume is either being updated at 197f412fefaSKyungmin Park * the moment or is damaged because of an unclean reboot. 198f412fefaSKyungmin Park */ 199f412fefaSKyungmin Park struct ubi_volume { 200f412fefaSKyungmin Park struct device dev; 201f412fefaSKyungmin Park struct cdev cdev; 202f412fefaSKyungmin Park struct ubi_device *ubi; 203f412fefaSKyungmin Park int vol_id; 204f412fefaSKyungmin Park int ref_count; 205f412fefaSKyungmin Park int readers; 206f412fefaSKyungmin Park int writers; 207f412fefaSKyungmin Park int exclusive; 208f412fefaSKyungmin Park 209f412fefaSKyungmin Park int reserved_pebs; 210f412fefaSKyungmin Park int vol_type; 211f412fefaSKyungmin Park int usable_leb_size; 212f412fefaSKyungmin Park int used_ebs; 213f412fefaSKyungmin Park int last_eb_bytes; 214f412fefaSKyungmin Park long long used_bytes; 215f412fefaSKyungmin Park int alignment; 216f412fefaSKyungmin Park int data_pad; 217f412fefaSKyungmin Park int name_len; 218f412fefaSKyungmin Park char name[UBI_VOL_NAME_MAX+1]; 219f412fefaSKyungmin Park 220f412fefaSKyungmin Park int upd_ebs; 221f412fefaSKyungmin Park int ch_lnum; 222f412fefaSKyungmin Park int ch_dtype; 223f412fefaSKyungmin Park long long upd_bytes; 224f412fefaSKyungmin Park long long upd_received; 225f412fefaSKyungmin Park void *upd_buf; 226f412fefaSKyungmin Park 227f412fefaSKyungmin Park int *eba_tbl; 228f412fefaSKyungmin Park unsigned int checked:1; 229f412fefaSKyungmin Park unsigned int corrupted:1; 230f412fefaSKyungmin Park unsigned int upd_marker:1; 231f412fefaSKyungmin Park unsigned int updating:1; 232f412fefaSKyungmin Park unsigned int changing_leb:1; 233f412fefaSKyungmin Park 234f412fefaSKyungmin Park #ifdef CONFIG_MTD_UBI_GLUEBI 235f412fefaSKyungmin Park /* 236f412fefaSKyungmin Park * Gluebi-related stuff may be compiled out. 237f412fefaSKyungmin Park * TODO: this should not be built into UBI but should be a separate 238f412fefaSKyungmin Park * ubimtd driver which works on top of UBI and emulates MTD devices. 239f412fefaSKyungmin Park */ 240f412fefaSKyungmin Park struct ubi_volume_desc *gluebi_desc; 241f412fefaSKyungmin Park int gluebi_refcount; 242f412fefaSKyungmin Park struct mtd_info gluebi_mtd; 243f412fefaSKyungmin Park #endif 244f412fefaSKyungmin Park }; 245f412fefaSKyungmin Park 246f412fefaSKyungmin Park /** 247f412fefaSKyungmin Park * struct ubi_volume_desc - descriptor of the UBI volume returned when it is 248f412fefaSKyungmin Park * opened. 249f412fefaSKyungmin Park * @vol: reference to the corresponding volume description object 250f412fefaSKyungmin Park * @mode: open mode (%UBI_READONLY, %UBI_READWRITE, or %UBI_EXCLUSIVE) 251f412fefaSKyungmin Park */ 252f412fefaSKyungmin Park struct ubi_volume_desc { 253f412fefaSKyungmin Park struct ubi_volume *vol; 254f412fefaSKyungmin Park int mode; 255f412fefaSKyungmin Park }; 256f412fefaSKyungmin Park 257f412fefaSKyungmin Park struct ubi_wl_entry; 258f412fefaSKyungmin Park 259f412fefaSKyungmin Park /** 260f412fefaSKyungmin Park * struct ubi_device - UBI device description structure 261f412fefaSKyungmin Park * @dev: UBI device object to use the the Linux device model 262f412fefaSKyungmin Park * @cdev: character device object to create character device 263f412fefaSKyungmin Park * @ubi_num: UBI device number 264f412fefaSKyungmin Park * @ubi_name: UBI device name 265f412fefaSKyungmin Park * @vol_count: number of volumes in this UBI device 266f412fefaSKyungmin Park * @volumes: volumes of this UBI device 267f412fefaSKyungmin Park * @volumes_lock: protects @volumes, @rsvd_pebs, @avail_pebs, beb_rsvd_pebs, 268f412fefaSKyungmin Park * @beb_rsvd_level, @bad_peb_count, @good_peb_count, @vol_count, 269f412fefaSKyungmin Park * @vol->readers, @vol->writers, @vol->exclusive, 270f412fefaSKyungmin Park * @vol->ref_count, @vol->mapping and @vol->eba_tbl. 271f412fefaSKyungmin Park * @ref_count: count of references on the UBI device 272f412fefaSKyungmin Park * 273f412fefaSKyungmin Park * @rsvd_pebs: count of reserved physical eraseblocks 274f412fefaSKyungmin Park * @avail_pebs: count of available physical eraseblocks 275f412fefaSKyungmin Park * @beb_rsvd_pebs: how many physical eraseblocks are reserved for bad PEB 276f412fefaSKyungmin Park * handling 277f412fefaSKyungmin Park * @beb_rsvd_level: normal level of PEBs reserved for bad PEB handling 278f412fefaSKyungmin Park * 279f412fefaSKyungmin Park * @autoresize_vol_id: ID of the volume which has to be auto-resized at the end 280f412fefaSKyungmin Park * of UBI ititializetion 281f412fefaSKyungmin Park * @vtbl_slots: how many slots are available in the volume table 282f412fefaSKyungmin Park * @vtbl_size: size of the volume table in bytes 283f412fefaSKyungmin Park * @vtbl: in-RAM volume table copy 284f412fefaSKyungmin Park * @volumes_mutex: protects on-flash volume table and serializes volume 285f412fefaSKyungmin Park * changes, like creation, deletion, update, resize 286f412fefaSKyungmin Park * 287f412fefaSKyungmin Park * @max_ec: current highest erase counter value 288f412fefaSKyungmin Park * @mean_ec: current mean erase counter value 289f412fefaSKyungmin Park * 290f412fefaSKyungmin Park * @global_sqnum: global sequence number 291f412fefaSKyungmin Park * @ltree_lock: protects the lock tree and @global_sqnum 292f412fefaSKyungmin Park * @ltree: the lock tree 293f412fefaSKyungmin Park * @alc_mutex: serializes "atomic LEB change" operations 294f412fefaSKyungmin Park * 295f412fefaSKyungmin Park * @used: RB-tree of used physical eraseblocks 296f412fefaSKyungmin Park * @free: RB-tree of free physical eraseblocks 297f412fefaSKyungmin Park * @scrub: RB-tree of physical eraseblocks which need scrubbing 298f412fefaSKyungmin Park * @prot: protection trees 299f412fefaSKyungmin Park * @prot.pnum: protection tree indexed by physical eraseblock numbers 300f412fefaSKyungmin Park * @prot.aec: protection tree indexed by absolute erase counter value 301f412fefaSKyungmin Park * @wl_lock: protects the @used, @free, @prot, @lookuptbl, @abs_ec, @move_from, 302f412fefaSKyungmin Park * @move_to, @move_to_put @erase_pending, @wl_scheduled, and @works 303f412fefaSKyungmin Park * fields 304f412fefaSKyungmin Park * @move_mutex: serializes eraseblock moves 305f412fefaSKyungmin Park * @wl_scheduled: non-zero if the wear-leveling was scheduled 306f412fefaSKyungmin Park * @lookuptbl: a table to quickly find a &struct ubi_wl_entry object for any 307f412fefaSKyungmin Park * physical eraseblock 308f412fefaSKyungmin Park * @abs_ec: absolute erase counter 309f412fefaSKyungmin Park * @move_from: physical eraseblock from where the data is being moved 310f412fefaSKyungmin Park * @move_to: physical eraseblock where the data is being moved to 311f412fefaSKyungmin Park * @move_to_put: if the "to" PEB was put 312f412fefaSKyungmin Park * @works: list of pending works 313f412fefaSKyungmin Park * @works_count: count of pending works 314f412fefaSKyungmin Park * @bgt_thread: background thread description object 315f412fefaSKyungmin Park * @thread_enabled: if the background thread is enabled 316f412fefaSKyungmin Park * @bgt_name: background thread name 317f412fefaSKyungmin Park * 318f412fefaSKyungmin Park * @flash_size: underlying MTD device size (in bytes) 319f412fefaSKyungmin Park * @peb_count: count of physical eraseblocks on the MTD device 320f412fefaSKyungmin Park * @peb_size: physical eraseblock size 321f412fefaSKyungmin Park * @bad_peb_count: count of bad physical eraseblocks 322f412fefaSKyungmin Park * @good_peb_count: count of good physical eraseblocks 323f412fefaSKyungmin Park * @min_io_size: minimal input/output unit size of the underlying MTD device 324f412fefaSKyungmin Park * @hdrs_min_io_size: minimal I/O unit size used for VID and EC headers 325f412fefaSKyungmin Park * @ro_mode: if the UBI device is in read-only mode 326f412fefaSKyungmin Park * @leb_size: logical eraseblock size 327f412fefaSKyungmin Park * @leb_start: starting offset of logical eraseblocks within physical 328f412fefaSKyungmin Park * eraseblocks 329f412fefaSKyungmin Park * @ec_hdr_alsize: size of the EC header aligned to @hdrs_min_io_size 330f412fefaSKyungmin Park * @vid_hdr_alsize: size of the VID header aligned to @hdrs_min_io_size 331f412fefaSKyungmin Park * @vid_hdr_offset: starting offset of the volume identifier header (might be 332f412fefaSKyungmin Park * unaligned) 333f412fefaSKyungmin Park * @vid_hdr_aloffset: starting offset of the VID header aligned to 334f412fefaSKyungmin Park * @hdrs_min_io_size 335f412fefaSKyungmin Park * @vid_hdr_shift: contains @vid_hdr_offset - @vid_hdr_aloffset 336f412fefaSKyungmin Park * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or 337f412fefaSKyungmin Park * not 338f412fefaSKyungmin Park * @mtd: MTD device descriptor 339f412fefaSKyungmin Park * 340f412fefaSKyungmin Park * @peb_buf1: a buffer of PEB size used for different purposes 341f412fefaSKyungmin Park * @peb_buf2: another buffer of PEB size used for different purposes 342f412fefaSKyungmin Park * @buf_mutex: proptects @peb_buf1 and @peb_buf2 343f412fefaSKyungmin Park * @dbg_peb_buf: buffer of PEB size used for debugging 344f412fefaSKyungmin Park * @dbg_buf_mutex: proptects @dbg_peb_buf 345f412fefaSKyungmin Park */ 346f412fefaSKyungmin Park struct ubi_device { 347f412fefaSKyungmin Park struct cdev cdev; 348f412fefaSKyungmin Park struct device dev; 349f412fefaSKyungmin Park int ubi_num; 350f412fefaSKyungmin Park char ubi_name[sizeof(UBI_NAME_STR)+5]; 351f412fefaSKyungmin Park int vol_count; 352f412fefaSKyungmin Park struct ubi_volume *volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT]; 353f412fefaSKyungmin Park spinlock_t volumes_lock; 354f412fefaSKyungmin Park int ref_count; 355f412fefaSKyungmin Park 356f412fefaSKyungmin Park int rsvd_pebs; 357f412fefaSKyungmin Park int avail_pebs; 358f412fefaSKyungmin Park int beb_rsvd_pebs; 359f412fefaSKyungmin Park int beb_rsvd_level; 360f412fefaSKyungmin Park 361f412fefaSKyungmin Park int autoresize_vol_id; 362f412fefaSKyungmin Park int vtbl_slots; 363f412fefaSKyungmin Park int vtbl_size; 364f412fefaSKyungmin Park struct ubi_vtbl_record *vtbl; 365f412fefaSKyungmin Park struct mutex volumes_mutex; 366f412fefaSKyungmin Park 367f412fefaSKyungmin Park int max_ec; 368f412fefaSKyungmin Park /* TODO: mean_ec is not updated run-time, fix */ 369f412fefaSKyungmin Park int mean_ec; 370f412fefaSKyungmin Park 371f412fefaSKyungmin Park /* EBA unit's stuff */ 372f412fefaSKyungmin Park unsigned long long global_sqnum; 373f412fefaSKyungmin Park spinlock_t ltree_lock; 374f412fefaSKyungmin Park struct rb_root ltree; 375f412fefaSKyungmin Park struct mutex alc_mutex; 376f412fefaSKyungmin Park 377f412fefaSKyungmin Park /* Wear-leveling unit's stuff */ 378f412fefaSKyungmin Park struct rb_root used; 379f412fefaSKyungmin Park struct rb_root free; 380f412fefaSKyungmin Park struct rb_root scrub; 381f412fefaSKyungmin Park struct { 382f412fefaSKyungmin Park struct rb_root pnum; 383f412fefaSKyungmin Park struct rb_root aec; 384f412fefaSKyungmin Park } prot; 385f412fefaSKyungmin Park spinlock_t wl_lock; 386f412fefaSKyungmin Park struct mutex move_mutex; 387f412fefaSKyungmin Park struct rw_semaphore work_sem; 388f412fefaSKyungmin Park int wl_scheduled; 389f412fefaSKyungmin Park struct ubi_wl_entry **lookuptbl; 390f412fefaSKyungmin Park unsigned long long abs_ec; 391f412fefaSKyungmin Park struct ubi_wl_entry *move_from; 392f412fefaSKyungmin Park struct ubi_wl_entry *move_to; 393f412fefaSKyungmin Park int move_to_put; 394f412fefaSKyungmin Park struct list_head works; 395f412fefaSKyungmin Park int works_count; 396f412fefaSKyungmin Park struct task_struct *bgt_thread; 397f412fefaSKyungmin Park int thread_enabled; 398f412fefaSKyungmin Park char bgt_name[sizeof(UBI_BGT_NAME_PATTERN)+2]; 399f412fefaSKyungmin Park 400f412fefaSKyungmin Park /* I/O unit's stuff */ 401f412fefaSKyungmin Park long long flash_size; 402f412fefaSKyungmin Park int peb_count; 403f412fefaSKyungmin Park int peb_size; 404f412fefaSKyungmin Park int bad_peb_count; 405f412fefaSKyungmin Park int good_peb_count; 406f412fefaSKyungmin Park int min_io_size; 407f412fefaSKyungmin Park int hdrs_min_io_size; 408f412fefaSKyungmin Park int ro_mode; 409f412fefaSKyungmin Park int leb_size; 410f412fefaSKyungmin Park int leb_start; 411f412fefaSKyungmin Park int ec_hdr_alsize; 412f412fefaSKyungmin Park int vid_hdr_alsize; 413f412fefaSKyungmin Park int vid_hdr_offset; 414f412fefaSKyungmin Park int vid_hdr_aloffset; 415f412fefaSKyungmin Park int vid_hdr_shift; 416f412fefaSKyungmin Park int bad_allowed; 417f412fefaSKyungmin Park struct mtd_info *mtd; 418f412fefaSKyungmin Park 419f412fefaSKyungmin Park void *peb_buf1; 420f412fefaSKyungmin Park void *peb_buf2; 421f412fefaSKyungmin Park struct mutex buf_mutex; 422f412fefaSKyungmin Park struct mutex ckvol_mutex; 423f412fefaSKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG 424f412fefaSKyungmin Park void *dbg_peb_buf; 425f412fefaSKyungmin Park struct mutex dbg_buf_mutex; 426f412fefaSKyungmin Park #endif 427f412fefaSKyungmin Park }; 428f412fefaSKyungmin Park 429f412fefaSKyungmin Park extern struct kmem_cache *ubi_wl_entry_slab; 430f412fefaSKyungmin Park extern struct file_operations ubi_ctrl_cdev_operations; 431f412fefaSKyungmin Park extern struct file_operations ubi_cdev_operations; 432f412fefaSKyungmin Park extern struct file_operations ubi_vol_cdev_operations; 433f412fefaSKyungmin Park extern struct class *ubi_class; 434f412fefaSKyungmin Park extern struct mutex ubi_devices_mutex; 435f412fefaSKyungmin Park 436f412fefaSKyungmin Park /* vtbl.c */ 437f412fefaSKyungmin Park int ubi_change_vtbl_record(struct ubi_device *ubi, int idx, 438f412fefaSKyungmin Park struct ubi_vtbl_record *vtbl_rec); 439f412fefaSKyungmin Park int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si); 440f412fefaSKyungmin Park 441f412fefaSKyungmin Park /* vmt.c */ 442f412fefaSKyungmin Park int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req); 443f412fefaSKyungmin Park int ubi_remove_volume(struct ubi_volume_desc *desc); 444f412fefaSKyungmin Park int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs); 445f412fefaSKyungmin Park int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol); 446f412fefaSKyungmin Park void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol); 447f412fefaSKyungmin Park 448f412fefaSKyungmin Park /* upd.c */ 449f412fefaSKyungmin Park int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol, 450f412fefaSKyungmin Park long long bytes); 451f412fefaSKyungmin Park int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol, 452f412fefaSKyungmin Park const void __user *buf, int count); 453f412fefaSKyungmin Park int ubi_start_leb_change(struct ubi_device *ubi, struct ubi_volume *vol, 454f412fefaSKyungmin Park const struct ubi_leb_change_req *req); 455f412fefaSKyungmin Park int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol, 456f412fefaSKyungmin Park const void __user *buf, int count); 457f412fefaSKyungmin Park 458f412fefaSKyungmin Park /* misc.c */ 459f412fefaSKyungmin Park int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf, int length); 460f412fefaSKyungmin Park int ubi_check_volume(struct ubi_device *ubi, int vol_id); 461f412fefaSKyungmin Park void ubi_calculate_reserved(struct ubi_device *ubi); 462f412fefaSKyungmin Park 463f412fefaSKyungmin Park /* gluebi.c */ 464f412fefaSKyungmin Park #ifdef CONFIG_MTD_UBI_GLUEBI 465f412fefaSKyungmin Park int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol); 466f412fefaSKyungmin Park int ubi_destroy_gluebi(struct ubi_volume *vol); 467f412fefaSKyungmin Park void ubi_gluebi_updated(struct ubi_volume *vol); 468f412fefaSKyungmin Park #else 469f412fefaSKyungmin Park #define ubi_create_gluebi(ubi, vol) 0 470*cac952ffSMarek Vasut 471*cac952ffSMarek Vasut static inline int ubi_destroy_gluebi(struct ubi_volume *vol) 472*cac952ffSMarek Vasut { 473*cac952ffSMarek Vasut return 0; 474*cac952ffSMarek Vasut } 475*cac952ffSMarek Vasut 476f412fefaSKyungmin Park #define ubi_gluebi_updated(vol) 477f412fefaSKyungmin Park #endif 478f412fefaSKyungmin Park 479f412fefaSKyungmin Park /* eba.c */ 480f412fefaSKyungmin Park int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol, 481f412fefaSKyungmin Park int lnum); 482f412fefaSKyungmin Park int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum, 483f412fefaSKyungmin Park void *buf, int offset, int len, int check); 484f412fefaSKyungmin Park int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum, 485f412fefaSKyungmin Park const void *buf, int offset, int len, int dtype); 486f412fefaSKyungmin Park int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol, 487f412fefaSKyungmin Park int lnum, const void *buf, int len, int dtype, 488f412fefaSKyungmin Park int used_ebs); 489f412fefaSKyungmin Park int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol, 490f412fefaSKyungmin Park int lnum, const void *buf, int len, int dtype); 491f412fefaSKyungmin Park int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, 492f412fefaSKyungmin Park struct ubi_vid_hdr *vid_hdr); 493f412fefaSKyungmin Park int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si); 494f412fefaSKyungmin Park void ubi_eba_close(const struct ubi_device *ubi); 495f412fefaSKyungmin Park 496f412fefaSKyungmin Park /* wl.c */ 497f412fefaSKyungmin Park int ubi_wl_get_peb(struct ubi_device *ubi, int dtype); 498f412fefaSKyungmin Park int ubi_wl_put_peb(struct ubi_device *ubi, int pnum, int torture); 499f412fefaSKyungmin Park int ubi_wl_flush(struct ubi_device *ubi); 500f412fefaSKyungmin Park int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum); 501f412fefaSKyungmin Park int ubi_wl_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si); 502f412fefaSKyungmin Park void ubi_wl_close(struct ubi_device *ubi); 503f412fefaSKyungmin Park int ubi_thread(void *u); 504f412fefaSKyungmin Park 505f412fefaSKyungmin Park /* io.c */ 506f412fefaSKyungmin Park int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset, 507f412fefaSKyungmin Park int len); 508f412fefaSKyungmin Park int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset, 509f412fefaSKyungmin Park int len); 510f412fefaSKyungmin Park int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture); 511f412fefaSKyungmin Park int ubi_io_is_bad(const struct ubi_device *ubi, int pnum); 512f412fefaSKyungmin Park int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum); 513f412fefaSKyungmin Park int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, 514f412fefaSKyungmin Park struct ubi_ec_hdr *ec_hdr, int verbose); 515f412fefaSKyungmin Park int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum, 516f412fefaSKyungmin Park struct ubi_ec_hdr *ec_hdr); 517f412fefaSKyungmin Park int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, 518f412fefaSKyungmin Park struct ubi_vid_hdr *vid_hdr, int verbose); 519f412fefaSKyungmin Park int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum, 520f412fefaSKyungmin Park struct ubi_vid_hdr *vid_hdr); 521f412fefaSKyungmin Park 522f412fefaSKyungmin Park /* build.c */ 523f412fefaSKyungmin Park int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset); 524f412fefaSKyungmin Park int ubi_detach_mtd_dev(int ubi_num, int anyway); 525f412fefaSKyungmin Park struct ubi_device *ubi_get_device(int ubi_num); 526f412fefaSKyungmin Park void ubi_put_device(struct ubi_device *ubi); 527f412fefaSKyungmin Park struct ubi_device *ubi_get_by_major(int major); 528f412fefaSKyungmin Park int ubi_major2num(int major); 529f412fefaSKyungmin Park 530f412fefaSKyungmin Park /* 531f412fefaSKyungmin Park * ubi_rb_for_each_entry - walk an RB-tree. 532f412fefaSKyungmin Park * @rb: a pointer to type 'struct rb_node' to to use as a loop counter 533f412fefaSKyungmin Park * @pos: a pointer to RB-tree entry type to use as a loop counter 534f412fefaSKyungmin Park * @root: RB-tree's root 535f412fefaSKyungmin Park * @member: the name of the 'struct rb_node' within the RB-tree entry 536f412fefaSKyungmin Park */ 537f412fefaSKyungmin Park #define ubi_rb_for_each_entry(rb, pos, root, member) \ 538f412fefaSKyungmin Park for (rb = rb_first(root), \ 539f412fefaSKyungmin Park pos = (rb ? container_of(rb, typeof(*pos), member) : NULL); \ 540f412fefaSKyungmin Park rb; \ 541f412fefaSKyungmin Park rb = rb_next(rb), pos = container_of(rb, typeof(*pos), member)) 542f412fefaSKyungmin Park 543f412fefaSKyungmin Park /** 544f412fefaSKyungmin Park * ubi_zalloc_vid_hdr - allocate a volume identifier header object. 545f412fefaSKyungmin Park * @ubi: UBI device description object 546f412fefaSKyungmin Park * @gfp_flags: GFP flags to allocate with 547f412fefaSKyungmin Park * 548f412fefaSKyungmin Park * This function returns a pointer to the newly allocated and zero-filled 549f412fefaSKyungmin Park * volume identifier header object in case of success and %NULL in case of 550f412fefaSKyungmin Park * failure. 551f412fefaSKyungmin Park */ 552f412fefaSKyungmin Park static inline struct ubi_vid_hdr * 553f412fefaSKyungmin Park ubi_zalloc_vid_hdr(const struct ubi_device *ubi, gfp_t gfp_flags) 554f412fefaSKyungmin Park { 555f412fefaSKyungmin Park void *vid_hdr; 556f412fefaSKyungmin Park 557f412fefaSKyungmin Park vid_hdr = kzalloc(ubi->vid_hdr_alsize, gfp_flags); 558f412fefaSKyungmin Park if (!vid_hdr) 559f412fefaSKyungmin Park return NULL; 560f412fefaSKyungmin Park 561f412fefaSKyungmin Park /* 562f412fefaSKyungmin Park * VID headers may be stored at un-aligned flash offsets, so we shift 563f412fefaSKyungmin Park * the pointer. 564f412fefaSKyungmin Park */ 565f412fefaSKyungmin Park return vid_hdr + ubi->vid_hdr_shift; 566f412fefaSKyungmin Park } 567f412fefaSKyungmin Park 568f412fefaSKyungmin Park /** 569f412fefaSKyungmin Park * ubi_free_vid_hdr - free a volume identifier header object. 570f412fefaSKyungmin Park * @ubi: UBI device description object 571f412fefaSKyungmin Park * @vid_hdr: the object to free 572f412fefaSKyungmin Park */ 573f412fefaSKyungmin Park static inline void ubi_free_vid_hdr(const struct ubi_device *ubi, 574f412fefaSKyungmin Park struct ubi_vid_hdr *vid_hdr) 575f412fefaSKyungmin Park { 576f412fefaSKyungmin Park void *p = vid_hdr; 577f412fefaSKyungmin Park 578f412fefaSKyungmin Park if (!p) 579f412fefaSKyungmin Park return; 580f412fefaSKyungmin Park 581f412fefaSKyungmin Park kfree(p - ubi->vid_hdr_shift); 582f412fefaSKyungmin Park } 583f412fefaSKyungmin Park 584f412fefaSKyungmin Park /* 585f412fefaSKyungmin Park * This function is equivalent to 'ubi_io_read()', but @offset is relative to 586f412fefaSKyungmin Park * the beginning of the logical eraseblock, not to the beginning of the 587f412fefaSKyungmin Park * physical eraseblock. 588f412fefaSKyungmin Park */ 589f412fefaSKyungmin Park static inline int ubi_io_read_data(const struct ubi_device *ubi, void *buf, 590f412fefaSKyungmin Park int pnum, int offset, int len) 591f412fefaSKyungmin Park { 592f412fefaSKyungmin Park ubi_assert(offset >= 0); 593f412fefaSKyungmin Park return ubi_io_read(ubi, buf, pnum, offset + ubi->leb_start, len); 594f412fefaSKyungmin Park } 595f412fefaSKyungmin Park 596f412fefaSKyungmin Park /* 597f412fefaSKyungmin Park * This function is equivalent to 'ubi_io_write()', but @offset is relative to 598f412fefaSKyungmin Park * the beginning of the logical eraseblock, not to the beginning of the 599f412fefaSKyungmin Park * physical eraseblock. 600f412fefaSKyungmin Park */ 601f412fefaSKyungmin Park static inline int ubi_io_write_data(struct ubi_device *ubi, const void *buf, 602f412fefaSKyungmin Park int pnum, int offset, int len) 603f412fefaSKyungmin Park { 604f412fefaSKyungmin Park ubi_assert(offset >= 0); 605f412fefaSKyungmin Park return ubi_io_write(ubi, buf, pnum, offset + ubi->leb_start, len); 606f412fefaSKyungmin Park } 607f412fefaSKyungmin Park 608f412fefaSKyungmin Park /** 609f412fefaSKyungmin Park * ubi_ro_mode - switch to read-only mode. 610f412fefaSKyungmin Park * @ubi: UBI device description object 611f412fefaSKyungmin Park */ 612f412fefaSKyungmin Park static inline void ubi_ro_mode(struct ubi_device *ubi) 613f412fefaSKyungmin Park { 614f412fefaSKyungmin Park if (!ubi->ro_mode) { 615f412fefaSKyungmin Park ubi->ro_mode = 1; 616f412fefaSKyungmin Park ubi_warn("switch to read-only mode"); 617f412fefaSKyungmin Park } 618f412fefaSKyungmin Park } 619f412fefaSKyungmin Park 620f412fefaSKyungmin Park /** 621f412fefaSKyungmin Park * vol_id2idx - get table index by volume ID. 622f412fefaSKyungmin Park * @ubi: UBI device description object 623f412fefaSKyungmin Park * @vol_id: volume ID 624f412fefaSKyungmin Park */ 625f412fefaSKyungmin Park static inline int vol_id2idx(const struct ubi_device *ubi, int vol_id) 626f412fefaSKyungmin Park { 627f412fefaSKyungmin Park if (vol_id >= UBI_INTERNAL_VOL_START) 628f412fefaSKyungmin Park return vol_id - UBI_INTERNAL_VOL_START + ubi->vtbl_slots; 629f412fefaSKyungmin Park else 630f412fefaSKyungmin Park return vol_id; 631f412fefaSKyungmin Park } 632f412fefaSKyungmin Park 633f412fefaSKyungmin Park /** 634f412fefaSKyungmin Park * idx2vol_id - get volume ID by table index. 635f412fefaSKyungmin Park * @ubi: UBI device description object 636f412fefaSKyungmin Park * @idx: table index 637f412fefaSKyungmin Park */ 638f412fefaSKyungmin Park static inline int idx2vol_id(const struct ubi_device *ubi, int idx) 639f412fefaSKyungmin Park { 640f412fefaSKyungmin Park if (idx >= ubi->vtbl_slots) 641f412fefaSKyungmin Park return idx - ubi->vtbl_slots + UBI_INTERNAL_VOL_START; 642f412fefaSKyungmin Park else 643f412fefaSKyungmin Park return idx; 644f412fefaSKyungmin Park } 645f412fefaSKyungmin Park 646f412fefaSKyungmin Park #endif /* !__UBI_UBI_H__ */ 647