1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2f412fefaSKyungmin Park /* 3f412fefaSKyungmin Park * Copyright (c) International Business Machines Corp., 2006 4f412fefaSKyungmin Park * 5f412fefaSKyungmin Park * Authors: Artem Bityutskiy (Битюцкий Артём) 6f412fefaSKyungmin Park * Thomas Gleixner 7f412fefaSKyungmin Park * Frank Haverkamp 8f412fefaSKyungmin Park * Oliver Lohmann 9f412fefaSKyungmin Park * Andreas Arnez 10f412fefaSKyungmin Park */ 11f412fefaSKyungmin Park 12f412fefaSKyungmin Park /* 13f412fefaSKyungmin Park * This file defines the layout of UBI headers and all the other UBI on-flash 14f412fefaSKyungmin Park * data structures. 15f412fefaSKyungmin Park */ 16f412fefaSKyungmin Park 17f412fefaSKyungmin Park #ifndef __UBI_MEDIA_H__ 18f412fefaSKyungmin Park #define __UBI_MEDIA_H__ 19f412fefaSKyungmin Park 20f412fefaSKyungmin Park #include <asm/byteorder.h> 21f412fefaSKyungmin Park 22f412fefaSKyungmin Park /* The version of UBI images supported by this implementation */ 23f412fefaSKyungmin Park #define UBI_VERSION 1 24f412fefaSKyungmin Park 25f412fefaSKyungmin Park /* The highest erase counter value supported by this implementation */ 26f412fefaSKyungmin Park #define UBI_MAX_ERASECOUNTER 0x7FFFFFFF 27f412fefaSKyungmin Park 28f412fefaSKyungmin Park /* The initial CRC32 value used when calculating CRC checksums */ 29f412fefaSKyungmin Park #define UBI_CRC32_INIT 0xFFFFFFFFU 30f412fefaSKyungmin Park 31f412fefaSKyungmin Park /* Erase counter header magic number (ASCII "UBI#") */ 32f412fefaSKyungmin Park #define UBI_EC_HDR_MAGIC 0x55424923 33f412fefaSKyungmin Park /* Volume identifier header magic number (ASCII "UBI!") */ 34f412fefaSKyungmin Park #define UBI_VID_HDR_MAGIC 0x55424921 35f412fefaSKyungmin Park 36f412fefaSKyungmin Park /* 37f412fefaSKyungmin Park * Volume type constants used in the volume identifier header. 38f412fefaSKyungmin Park * 39f412fefaSKyungmin Park * @UBI_VID_DYNAMIC: dynamic volume 40f412fefaSKyungmin Park * @UBI_VID_STATIC: static volume 41f412fefaSKyungmin Park */ 42f412fefaSKyungmin Park enum { 43f412fefaSKyungmin Park UBI_VID_DYNAMIC = 1, 44f412fefaSKyungmin Park UBI_VID_STATIC = 2 45f412fefaSKyungmin Park }; 46f412fefaSKyungmin Park 47f412fefaSKyungmin Park /* 48f412fefaSKyungmin Park * Volume flags used in the volume table record. 49f412fefaSKyungmin Park * 50f412fefaSKyungmin Park * @UBI_VTBL_AUTORESIZE_FLG: auto-resize this volume 51f412fefaSKyungmin Park * 52f412fefaSKyungmin Park * %UBI_VTBL_AUTORESIZE_FLG flag can be set only for one volume in the volume 53f412fefaSKyungmin Park * table. UBI automatically re-sizes the volume which has this flag and makes 54f412fefaSKyungmin Park * the volume to be of largest possible size. This means that if after the 55f412fefaSKyungmin Park * initialization UBI finds out that there are available physical eraseblocks 56f412fefaSKyungmin Park * present on the device, it automatically appends all of them to the volume 57f412fefaSKyungmin Park * (the physical eraseblocks reserved for bad eraseblocks handling and other 58f412fefaSKyungmin Park * reserved physical eraseblocks are not taken). So, if there is a volume with 59f412fefaSKyungmin Park * the %UBI_VTBL_AUTORESIZE_FLG flag set, the amount of available logical 60f412fefaSKyungmin Park * eraseblocks will be zero after UBI is loaded, because all of them will be 61f412fefaSKyungmin Park * reserved for this volume. Note, the %UBI_VTBL_AUTORESIZE_FLG bit is cleared 62f412fefaSKyungmin Park * after the volume had been initialized. 63f412fefaSKyungmin Park * 64f412fefaSKyungmin Park * The auto-resize feature is useful for device production purposes. For 65f412fefaSKyungmin Park * example, different NAND flash chips may have different amount of initial bad 66f412fefaSKyungmin Park * eraseblocks, depending of particular chip instance. Manufacturers of NAND 67f412fefaSKyungmin Park * chips usually guarantee that the amount of initial bad eraseblocks does not 68f412fefaSKyungmin Park * exceed certain percent, e.g. 2%. When one creates an UBI image which will be 69f412fefaSKyungmin Park * flashed to the end devices in production, he does not know the exact amount 70f412fefaSKyungmin Park * of good physical eraseblocks the NAND chip on the device will have, but this 71f412fefaSKyungmin Park * number is required to calculate the volume sized and put them to the volume 72f412fefaSKyungmin Park * table of the UBI image. In this case, one of the volumes (e.g., the one 73f412fefaSKyungmin Park * which will store the root file system) is marked as "auto-resizable", and 74f412fefaSKyungmin Park * UBI will adjust its size on the first boot if needed. 75f412fefaSKyungmin Park * 76f412fefaSKyungmin Park * Note, first UBI reserves some amount of physical eraseblocks for bad 77f412fefaSKyungmin Park * eraseblock handling, and then re-sizes the volume, not vice-versa. This 78f412fefaSKyungmin Park * means that the pool of reserved physical eraseblocks will always be present. 79f412fefaSKyungmin Park */ 80f412fefaSKyungmin Park enum { 81f412fefaSKyungmin Park UBI_VTBL_AUTORESIZE_FLG = 0x01, 82f412fefaSKyungmin Park }; 83f412fefaSKyungmin Park 84f412fefaSKyungmin Park /* 85f412fefaSKyungmin Park * Compatibility constants used by internal volumes. 86f412fefaSKyungmin Park * 87f412fefaSKyungmin Park * @UBI_COMPAT_DELETE: delete this internal volume before anything is written 88f412fefaSKyungmin Park * to the flash 89f412fefaSKyungmin Park * @UBI_COMPAT_RO: attach this device in read-only mode 90f412fefaSKyungmin Park * @UBI_COMPAT_PRESERVE: preserve this internal volume - do not touch its 91ff94bc40SHeiko Schocher * physical eraseblocks, don't allow the wear-leveling 92ff94bc40SHeiko Schocher * sub-system to move them 93f412fefaSKyungmin Park * @UBI_COMPAT_REJECT: reject this UBI image 94f412fefaSKyungmin Park */ 95f412fefaSKyungmin Park enum { 96f412fefaSKyungmin Park UBI_COMPAT_DELETE = 1, 97f412fefaSKyungmin Park UBI_COMPAT_RO = 2, 98f412fefaSKyungmin Park UBI_COMPAT_PRESERVE = 4, 99f412fefaSKyungmin Park UBI_COMPAT_REJECT = 5 100f412fefaSKyungmin Park }; 101f412fefaSKyungmin Park 102f412fefaSKyungmin Park /* Sizes of UBI headers */ 103f412fefaSKyungmin Park #define UBI_EC_HDR_SIZE sizeof(struct ubi_ec_hdr) 104f412fefaSKyungmin Park #define UBI_VID_HDR_SIZE sizeof(struct ubi_vid_hdr) 105f412fefaSKyungmin Park 106f412fefaSKyungmin Park /* Sizes of UBI headers without the ending CRC */ 107f412fefaSKyungmin Park #define UBI_EC_HDR_SIZE_CRC (UBI_EC_HDR_SIZE - sizeof(__be32)) 108f412fefaSKyungmin Park #define UBI_VID_HDR_SIZE_CRC (UBI_VID_HDR_SIZE - sizeof(__be32)) 109f412fefaSKyungmin Park 110f412fefaSKyungmin Park /** 111f412fefaSKyungmin Park * struct ubi_ec_hdr - UBI erase counter header. 112f412fefaSKyungmin Park * @magic: erase counter header magic number (%UBI_EC_HDR_MAGIC) 113f412fefaSKyungmin Park * @version: version of UBI implementation which is supposed to accept this 114f412fefaSKyungmin Park * UBI image 115f412fefaSKyungmin Park * @padding1: reserved for future, zeroes 116f412fefaSKyungmin Park * @ec: the erase counter 117f412fefaSKyungmin Park * @vid_hdr_offset: where the VID header starts 118f412fefaSKyungmin Park * @data_offset: where the user data start 119ff94bc40SHeiko Schocher * @image_seq: image sequence number 120f412fefaSKyungmin Park * @padding2: reserved for future, zeroes 121f412fefaSKyungmin Park * @hdr_crc: erase counter header CRC checksum 122f412fefaSKyungmin Park * 123f412fefaSKyungmin Park * The erase counter header takes 64 bytes and has a plenty of unused space for 124f412fefaSKyungmin Park * future usage. The unused fields are zeroed. The @version field is used to 125f412fefaSKyungmin Park * indicate the version of UBI implementation which is supposed to be able to 126ff94bc40SHeiko Schocher * work with this UBI image. If @version is greater than the current UBI 127f412fefaSKyungmin Park * version, the image is rejected. This may be useful in future if something 128f412fefaSKyungmin Park * is changed radically. This field is duplicated in the volume identifier 129f412fefaSKyungmin Park * header. 130f412fefaSKyungmin Park * 131f412fefaSKyungmin Park * The @vid_hdr_offset and @data_offset fields contain the offset of the the 132f412fefaSKyungmin Park * volume identifier header and user data, relative to the beginning of the 133f412fefaSKyungmin Park * physical eraseblock. These values have to be the same for all physical 134f412fefaSKyungmin Park * eraseblocks. 135ff94bc40SHeiko Schocher * 136ff94bc40SHeiko Schocher * The @image_seq field is used to validate a UBI image that has been prepared 137ff94bc40SHeiko Schocher * for a UBI device. The @image_seq value can be any value, but it must be the 138ff94bc40SHeiko Schocher * same on all eraseblocks. UBI will ensure that all new erase counter headers 139ff94bc40SHeiko Schocher * also contain this value, and will check the value when attaching the flash. 140ff94bc40SHeiko Schocher * One way to make use of @image_seq is to increase its value by one every time 141ff94bc40SHeiko Schocher * an image is flashed over an existing image, then, if the flashing does not 142ff94bc40SHeiko Schocher * complete, UBI will detect the error when attaching the media. 143f412fefaSKyungmin Park */ 144f412fefaSKyungmin Park struct ubi_ec_hdr { 145f412fefaSKyungmin Park __be32 magic; 146f412fefaSKyungmin Park __u8 version; 147f412fefaSKyungmin Park __u8 padding1[3]; 148f412fefaSKyungmin Park __be64 ec; /* Warning: the current limit is 31-bit anyway! */ 149f412fefaSKyungmin Park __be32 vid_hdr_offset; 150f412fefaSKyungmin Park __be32 data_offset; 151ff94bc40SHeiko Schocher __be32 image_seq; 152ff94bc40SHeiko Schocher __u8 padding2[32]; 153f412fefaSKyungmin Park __be32 hdr_crc; 154ff94bc40SHeiko Schocher } __packed; 155f412fefaSKyungmin Park 156f412fefaSKyungmin Park /** 157f412fefaSKyungmin Park * struct ubi_vid_hdr - on-flash UBI volume identifier header. 158f412fefaSKyungmin Park * @magic: volume identifier header magic number (%UBI_VID_HDR_MAGIC) 159f412fefaSKyungmin Park * @version: UBI implementation version which is supposed to accept this UBI 160f412fefaSKyungmin Park * image (%UBI_VERSION) 161f412fefaSKyungmin Park * @vol_type: volume type (%UBI_VID_DYNAMIC or %UBI_VID_STATIC) 162f412fefaSKyungmin Park * @copy_flag: if this logical eraseblock was copied from another physical 163f412fefaSKyungmin Park * eraseblock (for wear-leveling reasons) 164f412fefaSKyungmin Park * @compat: compatibility of this volume (%0, %UBI_COMPAT_DELETE, 165f412fefaSKyungmin Park * %UBI_COMPAT_IGNORE, %UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT) 166f412fefaSKyungmin Park * @vol_id: ID of this volume 167f412fefaSKyungmin Park * @lnum: logical eraseblock number 168ff94bc40SHeiko Schocher * @padding1: reserved for future, zeroes 169f412fefaSKyungmin Park * @data_size: how many bytes of data this logical eraseblock contains 170f412fefaSKyungmin Park * @used_ebs: total number of used logical eraseblocks in this volume 171f412fefaSKyungmin Park * @data_pad: how many bytes at the end of this physical eraseblock are not 172f412fefaSKyungmin Park * used 173f412fefaSKyungmin Park * @data_crc: CRC checksum of the data stored in this logical eraseblock 174f412fefaSKyungmin Park * @padding2: reserved for future, zeroes 175ff94bc40SHeiko Schocher * @sqnum: sequence number 176ff94bc40SHeiko Schocher * @padding3: reserved for future, zeroes 177f412fefaSKyungmin Park * @hdr_crc: volume identifier header CRC checksum 178f412fefaSKyungmin Park * 179f412fefaSKyungmin Park * The @sqnum is the value of the global sequence counter at the time when this 180f412fefaSKyungmin Park * VID header was created. The global sequence counter is incremented each time 181f412fefaSKyungmin Park * UBI writes a new VID header to the flash, i.e. when it maps a logical 182f412fefaSKyungmin Park * eraseblock to a new physical eraseblock. The global sequence counter is an 183f412fefaSKyungmin Park * unsigned 64-bit integer and we assume it never overflows. The @sqnum 184f412fefaSKyungmin Park * (sequence number) is used to distinguish between older and newer versions of 185f412fefaSKyungmin Park * logical eraseblocks. 186f412fefaSKyungmin Park * 187ff94bc40SHeiko Schocher * There are 2 situations when there may be more than one physical eraseblock 188f412fefaSKyungmin Park * corresponding to the same logical eraseblock, i.e., having the same @vol_id 189f412fefaSKyungmin Park * and @lnum values in the volume identifier header. Suppose we have a logical 190f412fefaSKyungmin Park * eraseblock L and it is mapped to the physical eraseblock P. 191f412fefaSKyungmin Park * 192f412fefaSKyungmin Park * 1. Because UBI may erase physical eraseblocks asynchronously, the following 193f412fefaSKyungmin Park * situation is possible: L is asynchronously erased, so P is scheduled for 194f412fefaSKyungmin Park * erasure, then L is written to,i.e. mapped to another physical eraseblock P1, 195f412fefaSKyungmin Park * so P1 is written to, then an unclean reboot happens. Result - there are 2 196f412fefaSKyungmin Park * physical eraseblocks P and P1 corresponding to the same logical eraseblock 197f412fefaSKyungmin Park * L. But P1 has greater sequence number, so UBI picks P1 when it attaches the 198f412fefaSKyungmin Park * flash. 199f412fefaSKyungmin Park * 200f412fefaSKyungmin Park * 2. From time to time UBI moves logical eraseblocks to other physical 201f412fefaSKyungmin Park * eraseblocks for wear-leveling reasons. If, for example, UBI moves L from P 202f412fefaSKyungmin Park * to P1, and an unclean reboot happens before P is physically erased, there 203f412fefaSKyungmin Park * are two physical eraseblocks P and P1 corresponding to L and UBI has to 204f412fefaSKyungmin Park * select one of them when the flash is attached. The @sqnum field says which 205f412fefaSKyungmin Park * PEB is the original (obviously P will have lower @sqnum) and the copy. But 206f412fefaSKyungmin Park * it is not enough to select the physical eraseblock with the higher sequence 207f412fefaSKyungmin Park * number, because the unclean reboot could have happen in the middle of the 208f412fefaSKyungmin Park * copying process, so the data in P is corrupted. It is also not enough to 209f412fefaSKyungmin Park * just select the physical eraseblock with lower sequence number, because the 210f412fefaSKyungmin Park * data there may be old (consider a case if more data was added to P1 after 211f412fefaSKyungmin Park * the copying). Moreover, the unclean reboot may happen when the erasure of P 212f412fefaSKyungmin Park * was just started, so it result in unstable P, which is "mostly" OK, but 213f412fefaSKyungmin Park * still has unstable bits. 214f412fefaSKyungmin Park * 215f412fefaSKyungmin Park * UBI uses the @copy_flag field to indicate that this logical eraseblock is a 216f412fefaSKyungmin Park * copy. UBI also calculates data CRC when the data is moved and stores it at 217f412fefaSKyungmin Park * the @data_crc field of the copy (P1). So when UBI needs to pick one physical 218f412fefaSKyungmin Park * eraseblock of two (P or P1), the @copy_flag of the newer one (P1) is 219f412fefaSKyungmin Park * examined. If it is cleared, the situation* is simple and the newer one is 220f412fefaSKyungmin Park * picked. If it is set, the data CRC of the copy (P1) is examined. If the CRC 221f412fefaSKyungmin Park * checksum is correct, this physical eraseblock is selected (P1). Otherwise 222f412fefaSKyungmin Park * the older one (P) is selected. 223f412fefaSKyungmin Park * 224f412fefaSKyungmin Park * There are 2 sorts of volumes in UBI: user volumes and internal volumes. 225f412fefaSKyungmin Park * Internal volumes are not seen from outside and are used for various internal 226f412fefaSKyungmin Park * UBI purposes. In this implementation there is only one internal volume - the 227f412fefaSKyungmin Park * layout volume. Internal volumes are the main mechanism of UBI extensions. 228f412fefaSKyungmin Park * For example, in future one may introduce a journal internal volume. Internal 229f412fefaSKyungmin Park * volumes have their own reserved range of IDs. 230f412fefaSKyungmin Park * 231f412fefaSKyungmin Park * The @compat field is only used for internal volumes and contains the "degree 232f412fefaSKyungmin Park * of their compatibility". It is always zero for user volumes. This field 233f412fefaSKyungmin Park * provides a mechanism to introduce UBI extensions and to be still compatible 234f412fefaSKyungmin Park * with older UBI binaries. For example, if someone introduced a journal in 235f412fefaSKyungmin Park * future, he would probably use %UBI_COMPAT_DELETE compatibility for the 236f412fefaSKyungmin Park * journal volume. And in this case, older UBI binaries, which know nothing 237f412fefaSKyungmin Park * about the journal volume, would just delete this volume and work perfectly 238f412fefaSKyungmin Park * fine. This is similar to what Ext2fs does when it is fed by an Ext3fs image 239f412fefaSKyungmin Park * - it just ignores the Ext3fs journal. 240f412fefaSKyungmin Park * 241f412fefaSKyungmin Park * The @data_crc field contains the CRC checksum of the contents of the logical 242f412fefaSKyungmin Park * eraseblock if this is a static volume. In case of dynamic volumes, it does 243f412fefaSKyungmin Park * not contain the CRC checksum as a rule. The only exception is when the 244ff94bc40SHeiko Schocher * data of the physical eraseblock was moved by the wear-leveling sub-system, 245ff94bc40SHeiko Schocher * then the wear-leveling sub-system calculates the data CRC and stores it in 246ff94bc40SHeiko Schocher * the @data_crc field. And of course, the @copy_flag is %in this case. 247f412fefaSKyungmin Park * 248f412fefaSKyungmin Park * The @data_size field is used only for static volumes because UBI has to know 249f412fefaSKyungmin Park * how many bytes of data are stored in this eraseblock. For dynamic volumes, 250f412fefaSKyungmin Park * this field usually contains zero. The only exception is when the data of the 251f412fefaSKyungmin Park * physical eraseblock was moved to another physical eraseblock for 252f412fefaSKyungmin Park * wear-leveling reasons. In this case, UBI calculates CRC checksum of the 253f412fefaSKyungmin Park * contents and uses both @data_crc and @data_size fields. In this case, the 254f412fefaSKyungmin Park * @data_size field contains data size. 255f412fefaSKyungmin Park * 256f412fefaSKyungmin Park * The @used_ebs field is used only for static volumes and indicates how many 257f412fefaSKyungmin Park * eraseblocks the data of the volume takes. For dynamic volumes this field is 258f412fefaSKyungmin Park * not used and always contains zero. 259f412fefaSKyungmin Park * 260f412fefaSKyungmin Park * The @data_pad is calculated when volumes are created using the alignment 261f412fefaSKyungmin Park * parameter. So, effectively, the @data_pad field reduces the size of logical 262f412fefaSKyungmin Park * eraseblocks of this volume. This is very handy when one uses block-oriented 263f412fefaSKyungmin Park * software (say, cramfs) on top of the UBI volume. 264f412fefaSKyungmin Park */ 265f412fefaSKyungmin Park struct ubi_vid_hdr { 266f412fefaSKyungmin Park __be32 magic; 267f412fefaSKyungmin Park __u8 version; 268f412fefaSKyungmin Park __u8 vol_type; 269f412fefaSKyungmin Park __u8 copy_flag; 270f412fefaSKyungmin Park __u8 compat; 271f412fefaSKyungmin Park __be32 vol_id; 272f412fefaSKyungmin Park __be32 lnum; 273ff94bc40SHeiko Schocher __u8 padding1[4]; 274f412fefaSKyungmin Park __be32 data_size; 275f412fefaSKyungmin Park __be32 used_ebs; 276f412fefaSKyungmin Park __be32 data_pad; 277f412fefaSKyungmin Park __be32 data_crc; 278ff94bc40SHeiko Schocher __u8 padding2[4]; 279f412fefaSKyungmin Park __be64 sqnum; 280ff94bc40SHeiko Schocher __u8 padding3[12]; 281f412fefaSKyungmin Park __be32 hdr_crc; 282ff94bc40SHeiko Schocher } __packed; 283f412fefaSKyungmin Park 284f412fefaSKyungmin Park /* Internal UBI volumes count */ 285f412fefaSKyungmin Park #define UBI_INT_VOL_COUNT 1 286f412fefaSKyungmin Park 287f412fefaSKyungmin Park /* 288ff94bc40SHeiko Schocher * Starting ID of internal volumes: 0x7fffefff. 289ff94bc40SHeiko Schocher * There is reserved room for 4096 internal volumes. 290f412fefaSKyungmin Park */ 291f412fefaSKyungmin Park #define UBI_INTERNAL_VOL_START (0x7FFFFFFF - 4096) 292f412fefaSKyungmin Park 293f412fefaSKyungmin Park /* The layout volume contains the volume table */ 294f412fefaSKyungmin Park 295f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_ID UBI_INTERNAL_VOL_START 296f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_TYPE UBI_VID_DYNAMIC 297f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_ALIGN 1 298f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_EBS 2 299f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_NAME "layout volume" 300f412fefaSKyungmin Park #define UBI_LAYOUT_VOLUME_COMPAT UBI_COMPAT_REJECT 301f412fefaSKyungmin Park 302f412fefaSKyungmin Park /* The maximum number of volumes per one UBI device */ 303f412fefaSKyungmin Park #define UBI_MAX_VOLUMES 128 304f412fefaSKyungmin Park 305f412fefaSKyungmin Park /* The maximum volume name length */ 306f412fefaSKyungmin Park #define UBI_VOL_NAME_MAX 127 307f412fefaSKyungmin Park 308f412fefaSKyungmin Park /* Size of the volume table record */ 309f412fefaSKyungmin Park #define UBI_VTBL_RECORD_SIZE sizeof(struct ubi_vtbl_record) 310f412fefaSKyungmin Park 311f412fefaSKyungmin Park /* Size of the volume table record without the ending CRC */ 312f412fefaSKyungmin Park #define UBI_VTBL_RECORD_SIZE_CRC (UBI_VTBL_RECORD_SIZE - sizeof(__be32)) 313f412fefaSKyungmin Park 314f412fefaSKyungmin Park /** 315f412fefaSKyungmin Park * struct ubi_vtbl_record - a record in the volume table. 316f412fefaSKyungmin Park * @reserved_pebs: how many physical eraseblocks are reserved for this volume 317f412fefaSKyungmin Park * @alignment: volume alignment 318f412fefaSKyungmin Park * @data_pad: how many bytes are unused at the end of the each physical 319f412fefaSKyungmin Park * eraseblock to satisfy the requested alignment 320f412fefaSKyungmin Park * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) 321f412fefaSKyungmin Park * @upd_marker: if volume update was started but not finished 322f412fefaSKyungmin Park * @name_len: volume name length 323f412fefaSKyungmin Park * @name: the volume name 324f412fefaSKyungmin Park * @flags: volume flags (%UBI_VTBL_AUTORESIZE_FLG) 325f412fefaSKyungmin Park * @padding: reserved, zeroes 326f412fefaSKyungmin Park * @crc: a CRC32 checksum of the record 327f412fefaSKyungmin Park * 328f412fefaSKyungmin Park * The volume table records are stored in the volume table, which is stored in 329f412fefaSKyungmin Park * the layout volume. The layout volume consists of 2 logical eraseblock, each 330f412fefaSKyungmin Park * of which contains a copy of the volume table (i.e., the volume table is 331f412fefaSKyungmin Park * duplicated). The volume table is an array of &struct ubi_vtbl_record 332f412fefaSKyungmin Park * objects indexed by the volume ID. 333f412fefaSKyungmin Park * 334f412fefaSKyungmin Park * If the size of the logical eraseblock is large enough to fit 335f412fefaSKyungmin Park * %UBI_MAX_VOLUMES records, the volume table contains %UBI_MAX_VOLUMES 336f412fefaSKyungmin Park * records. Otherwise, it contains as many records as it can fit (i.e., size of 337f412fefaSKyungmin Park * logical eraseblock divided by sizeof(struct ubi_vtbl_record)). 338f412fefaSKyungmin Park * 339f412fefaSKyungmin Park * The @upd_marker flag is used to implement volume update. It is set to %1 340f412fefaSKyungmin Park * before update and set to %0 after the update. So if the update operation was 341f412fefaSKyungmin Park * interrupted, UBI knows that the volume is corrupted. 342f412fefaSKyungmin Park * 343f412fefaSKyungmin Park * The @alignment field is specified when the volume is created and cannot be 344f412fefaSKyungmin Park * later changed. It may be useful, for example, when a block-oriented file 345f412fefaSKyungmin Park * system works on top of UBI. The @data_pad field is calculated using the 346f412fefaSKyungmin Park * logical eraseblock size and @alignment. The alignment must be multiple to the 347f412fefaSKyungmin Park * minimal flash I/O unit. If @alignment is 1, all the available space of 348f412fefaSKyungmin Park * the physical eraseblocks is used. 349f412fefaSKyungmin Park * 350f412fefaSKyungmin Park * Empty records contain all zeroes and the CRC checksum of those zeroes. 351f412fefaSKyungmin Park */ 352f412fefaSKyungmin Park struct ubi_vtbl_record { 353f412fefaSKyungmin Park __be32 reserved_pebs; 354f412fefaSKyungmin Park __be32 alignment; 355f412fefaSKyungmin Park __be32 data_pad; 356f412fefaSKyungmin Park __u8 vol_type; 357f412fefaSKyungmin Park __u8 upd_marker; 358f412fefaSKyungmin Park __be16 name_len; 359ff94bc40SHeiko Schocher #ifndef __UBOOT__ 360f412fefaSKyungmin Park __u8 name[UBI_VOL_NAME_MAX+1]; 361ff94bc40SHeiko Schocher #else 362ff94bc40SHeiko Schocher char name[UBI_VOL_NAME_MAX+1]; 363ff94bc40SHeiko Schocher #endif 364f412fefaSKyungmin Park __u8 flags; 365f412fefaSKyungmin Park __u8 padding[23]; 366f412fefaSKyungmin Park __be32 crc; 367ff94bc40SHeiko Schocher } __packed; 368f412fefaSKyungmin Park 369ff94bc40SHeiko Schocher /* UBI fastmap on-flash data structures */ 370ff94bc40SHeiko Schocher 371ff94bc40SHeiko Schocher #define UBI_FM_SB_VOLUME_ID (UBI_LAYOUT_VOLUME_ID + 1) 372ff94bc40SHeiko Schocher #define UBI_FM_DATA_VOLUME_ID (UBI_LAYOUT_VOLUME_ID + 2) 373ff94bc40SHeiko Schocher 374ff94bc40SHeiko Schocher /* fastmap on-flash data structure format version */ 375ff94bc40SHeiko Schocher #define UBI_FM_FMT_VERSION 1 376ff94bc40SHeiko Schocher 377ff94bc40SHeiko Schocher #define UBI_FM_SB_MAGIC 0x7B11D69F 378ff94bc40SHeiko Schocher #define UBI_FM_HDR_MAGIC 0xD4B82EF7 379ff94bc40SHeiko Schocher #define UBI_FM_VHDR_MAGIC 0xFA370ED1 380ff94bc40SHeiko Schocher #define UBI_FM_POOL_MAGIC 0x67AF4D08 381ff94bc40SHeiko Schocher #define UBI_FM_EBA_MAGIC 0xf0c040a8 382ff94bc40SHeiko Schocher 383ff94bc40SHeiko Schocher /* A fastmap supber block can be located between PEB 0 and 384ff94bc40SHeiko Schocher * UBI_FM_MAX_START */ 385ff94bc40SHeiko Schocher #define UBI_FM_MAX_START 64 386ff94bc40SHeiko Schocher 387ff94bc40SHeiko Schocher /* A fastmap can use up to UBI_FM_MAX_BLOCKS PEBs */ 388ff94bc40SHeiko Schocher #define UBI_FM_MAX_BLOCKS 32 389ff94bc40SHeiko Schocher 390ff94bc40SHeiko Schocher /* 5% of the total number of PEBs have to be scanned while attaching 391ff94bc40SHeiko Schocher * from a fastmap. 392ff94bc40SHeiko Schocher * But the size of this pool is limited to be between UBI_FM_MIN_POOL_SIZE and 393ff94bc40SHeiko Schocher * UBI_FM_MAX_POOL_SIZE */ 394ff94bc40SHeiko Schocher #define UBI_FM_MIN_POOL_SIZE 8 395ff94bc40SHeiko Schocher #define UBI_FM_MAX_POOL_SIZE 256 396ff94bc40SHeiko Schocher 397ff94bc40SHeiko Schocher /** 398ff94bc40SHeiko Schocher * struct ubi_fm_sb - UBI fastmap super block 399ff94bc40SHeiko Schocher * @magic: fastmap super block magic number (%UBI_FM_SB_MAGIC) 400ff94bc40SHeiko Schocher * @version: format version of this fastmap 401ff94bc40SHeiko Schocher * @data_crc: CRC over the fastmap data 402ff94bc40SHeiko Schocher * @used_blocks: number of PEBs used by this fastmap 403ff94bc40SHeiko Schocher * @block_loc: an array containing the location of all PEBs of the fastmap 404ff94bc40SHeiko Schocher * @block_ec: the erase counter of each used PEB 405ff94bc40SHeiko Schocher * @sqnum: highest sequence number value at the time while taking the fastmap 406ff94bc40SHeiko Schocher * 407ff94bc40SHeiko Schocher */ 408ff94bc40SHeiko Schocher struct ubi_fm_sb { 409ff94bc40SHeiko Schocher __be32 magic; 410ff94bc40SHeiko Schocher __u8 version; 411ff94bc40SHeiko Schocher __u8 padding1[3]; 412ff94bc40SHeiko Schocher __be32 data_crc; 413ff94bc40SHeiko Schocher __be32 used_blocks; 414ff94bc40SHeiko Schocher __be32 block_loc[UBI_FM_MAX_BLOCKS]; 415ff94bc40SHeiko Schocher __be32 block_ec[UBI_FM_MAX_BLOCKS]; 416ff94bc40SHeiko Schocher __be64 sqnum; 417ff94bc40SHeiko Schocher __u8 padding2[32]; 418ff94bc40SHeiko Schocher } __packed; 419ff94bc40SHeiko Schocher 420ff94bc40SHeiko Schocher /** 421ff94bc40SHeiko Schocher * struct ubi_fm_hdr - header of the fastmap data set 422ff94bc40SHeiko Schocher * @magic: fastmap header magic number (%UBI_FM_HDR_MAGIC) 423ff94bc40SHeiko Schocher * @free_peb_count: number of free PEBs known by this fastmap 424ff94bc40SHeiko Schocher * @used_peb_count: number of used PEBs known by this fastmap 425ff94bc40SHeiko Schocher * @scrub_peb_count: number of to be scrubbed PEBs known by this fastmap 426ff94bc40SHeiko Schocher * @bad_peb_count: number of bad PEBs known by this fastmap 427ff94bc40SHeiko Schocher * @erase_peb_count: number of bad PEBs which have to be erased 428ff94bc40SHeiko Schocher * @vol_count: number of UBI volumes known by this fastmap 429ff94bc40SHeiko Schocher */ 430ff94bc40SHeiko Schocher struct ubi_fm_hdr { 431ff94bc40SHeiko Schocher __be32 magic; 432ff94bc40SHeiko Schocher __be32 free_peb_count; 433ff94bc40SHeiko Schocher __be32 used_peb_count; 434ff94bc40SHeiko Schocher __be32 scrub_peb_count; 435ff94bc40SHeiko Schocher __be32 bad_peb_count; 436ff94bc40SHeiko Schocher __be32 erase_peb_count; 437ff94bc40SHeiko Schocher __be32 vol_count; 438ff94bc40SHeiko Schocher __u8 padding[4]; 439ff94bc40SHeiko Schocher } __packed; 440ff94bc40SHeiko Schocher 441ff94bc40SHeiko Schocher /* struct ubi_fm_hdr is followed by two struct ubi_fm_scan_pool */ 442ff94bc40SHeiko Schocher 443ff94bc40SHeiko Schocher /** 444ff94bc40SHeiko Schocher * struct ubi_fm_scan_pool - Fastmap pool PEBs to be scanned while attaching 445ff94bc40SHeiko Schocher * @magic: pool magic numer (%UBI_FM_POOL_MAGIC) 446ff94bc40SHeiko Schocher * @size: current pool size 447ff94bc40SHeiko Schocher * @max_size: maximal pool size 448ff94bc40SHeiko Schocher * @pebs: an array containing the location of all PEBs in this pool 449ff94bc40SHeiko Schocher */ 450ff94bc40SHeiko Schocher struct ubi_fm_scan_pool { 451ff94bc40SHeiko Schocher __be32 magic; 452ff94bc40SHeiko Schocher __be16 size; 453ff94bc40SHeiko Schocher __be16 max_size; 454ff94bc40SHeiko Schocher __be32 pebs[UBI_FM_MAX_POOL_SIZE]; 455ff94bc40SHeiko Schocher __be32 padding[4]; 456ff94bc40SHeiko Schocher } __packed; 457ff94bc40SHeiko Schocher 458ff94bc40SHeiko Schocher /* ubi_fm_scan_pool is followed by nfree+nused struct ubi_fm_ec records */ 459ff94bc40SHeiko Schocher 460ff94bc40SHeiko Schocher /** 461ff94bc40SHeiko Schocher * struct ubi_fm_ec - stores the erase counter of a PEB 462ff94bc40SHeiko Schocher * @pnum: PEB number 463ff94bc40SHeiko Schocher * @ec: ec of this PEB 464ff94bc40SHeiko Schocher */ 465ff94bc40SHeiko Schocher struct ubi_fm_ec { 466ff94bc40SHeiko Schocher __be32 pnum; 467ff94bc40SHeiko Schocher __be32 ec; 468ff94bc40SHeiko Schocher } __packed; 469ff94bc40SHeiko Schocher 470ff94bc40SHeiko Schocher /** 471ff94bc40SHeiko Schocher * struct ubi_fm_volhdr - Fastmap volume header 472ff94bc40SHeiko Schocher * it identifies the start of an eba table 473ff94bc40SHeiko Schocher * @magic: Fastmap volume header magic number (%UBI_FM_VHDR_MAGIC) 474ff94bc40SHeiko Schocher * @vol_id: volume id of the fastmapped volume 475ff94bc40SHeiko Schocher * @vol_type: type of the fastmapped volume 476ff94bc40SHeiko Schocher * @data_pad: data_pad value of the fastmapped volume 477ff94bc40SHeiko Schocher * @used_ebs: number of used LEBs within this volume 478ff94bc40SHeiko Schocher * @last_eb_bytes: number of bytes used in the last LEB 479ff94bc40SHeiko Schocher */ 480ff94bc40SHeiko Schocher struct ubi_fm_volhdr { 481ff94bc40SHeiko Schocher __be32 magic; 482ff94bc40SHeiko Schocher __be32 vol_id; 483ff94bc40SHeiko Schocher __u8 vol_type; 484ff94bc40SHeiko Schocher __u8 padding1[3]; 485ff94bc40SHeiko Schocher __be32 data_pad; 486ff94bc40SHeiko Schocher __be32 used_ebs; 487ff94bc40SHeiko Schocher __be32 last_eb_bytes; 488ff94bc40SHeiko Schocher __u8 padding2[8]; 489ff94bc40SHeiko Schocher } __packed; 490ff94bc40SHeiko Schocher 491ff94bc40SHeiko Schocher /* struct ubi_fm_volhdr is followed by one struct ubi_fm_eba records */ 492ff94bc40SHeiko Schocher 493ff94bc40SHeiko Schocher /** 494ff94bc40SHeiko Schocher * struct ubi_fm_eba - denotes an association beween a PEB and LEB 495ff94bc40SHeiko Schocher * @magic: EBA table magic number 496ff94bc40SHeiko Schocher * @reserved_pebs: number of table entries 497ff94bc40SHeiko Schocher * @pnum: PEB number of LEB (LEB is the index) 498ff94bc40SHeiko Schocher */ 499ff94bc40SHeiko Schocher struct ubi_fm_eba { 500ff94bc40SHeiko Schocher __be32 magic; 501ff94bc40SHeiko Schocher __be32 reserved_pebs; 502ff94bc40SHeiko Schocher __be32 pnum[0]; 503ff94bc40SHeiko Schocher } __packed; 504f412fefaSKyungmin Park #endif /* !__UBI_MEDIA_H__ */ 505