blob: a8bf819af82a7e240041e93062d0d847108d2504 [file] [log] [blame]
Tanya Brokhman1c94f1a2015-02-15 09:05:03 +02001/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef _FLASH_UBI_H_
30#define _FLASH_UBI_H_
31
32#include <sys/types.h>
33#include <lib/ptable.h>
34#include <stdint.h>
35
Tanya Brokhmanf9343162015-01-27 13:37:41 +020036struct __attribute__ ((packed)) ubifs_ch {
37 uint32_t magic;
38 uint32_t crc;
39 uint64_t sqnum;
40 uint32_t len;
41#define UBIFS_SB_NODE 6
42 uint8_t node_type;
43 uint8_t group_type;
44 uint8_t padding[2];
45};
46
47/* UBIFS superblock node */
48struct __attribute__ ((packed)) ubifs_sb_node {
49 struct ubifs_ch ch;
50 uint8_t padding[2];
51 uint8_t key_hash;
52 uint8_t key_fmt;
53#define UBIFS_FLG_SPACE_FIXUP 0x04
54 uint32_t flags;
55 uint32_t min_io_size;
56 uint32_t leb_size;
57 uint32_t leb_cnt;
58 uint32_t max_leb_cnt;
59 uint64_t max_bud_bytes;
60 uint32_t log_lebs;
61 uint32_t lpt_lebs;
62 uint32_t orph_lebs;
63 uint32_t jhead_cnt;
64 uint32_t fanout;
65 uint32_t lsave_cnt;
66 uint32_t fmt_version;
67 uint16_t default_compr;
68 uint8_t padding1[2];
69 uint32_t rp_uid;
70 uint32_t rp_gid;
71 uint64_t rp_size;
72 uint32_t time_gran;
73 uint8_t uuid[16];
74 uint32_t ro_compat_version;
75 uint8_t padding2[3968];
76};
77
Tanya Brokhman1c94f1a2015-02-15 09:05:03 +020078/* Erase counter header magic number (ASCII "UBI#") */
79#define UBI_EC_HDR_MAGIC 0x55424923
Tanya Brokhman24a088c2015-02-24 10:21:44 +020080/* Volume identifier header magic number (ASCII "UBI!") */
81#define UBI_VID_HDR_MAGIC 0x55424921
Tanya Brokhman1c94f1a2015-02-15 09:05:03 +020082
83#define UBI_MAGIC "UBI#"
84#define UBI_MAGIC_SIZE 0x04
85
Tanya Brokhmanea981a32015-02-12 16:32:15 +020086#define UBI_VERSION 1
87#define UBI_MAX_ERASECOUNTER 0x7FFFFFFF
88#define UBI_IMAGE_SEQ_BASE 0x12345678
89#define UBI_DEF_ERACE_COUNTER 0
90#define UBI_CRC32_INIT 0xFFFFFFFFU
Tanya Brokhmanf9343162015-01-27 13:37:41 +020091#define UBIFS_CRC32_INIT 0xFFFFFFFFU
Tanya Brokhmanea981a32015-02-12 16:32:15 +020092
93/* Erase counter header fields */
94struct __attribute__ ((packed)) ubi_ec_hdr {
95 uint32_t magic;
96 uint8_t version;
97 uint8_t padding1[3];
98 uint64_t ec; /* Warning: the current limit is 31-bit anyway! */
99 uint32_t vid_hdr_offset;
100 uint32_t data_offset;
101 uint32_t image_seq;
102 uint8_t padding2[32];
103 uint32_t hdr_crc;
104};
105
Tanya Brokhmanc52aeb82015-01-27 11:08:50 +0200106/* Volume identifier header fields */
107struct __attribute__ ((packed)) ubi_vid_hdr {
108 uint32_t magic;
109 uint8_t version;
110 uint8_t vol_type;
111 uint8_t copy_flag;
112 uint8_t compat;
113 uint32_t vol_id;
114 uint32_t lnum;
115 uint8_t padding1[4];
116 uint32_t data_size;
117 uint32_t used_ebs;
118 uint32_t data_pad;
119 uint32_t data_crc;
120 uint8_t padding2[4];
121 uint64_t sqnum;
122 uint8_t padding3[12];
123 uint32_t hdr_crc;
124};
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200125
Tanya Brokhmanc52aeb82015-01-27 11:08:50 +0200126#define UBI_EC_HDR_SIZE sizeof(struct ubi_ec_hdr)
127#define UBI_VID_HDR_SIZE sizeof(struct ubi_vid_hdr)
128#define UBI_EC_HDR_SIZE_CRC (UBI_EC_HDR_SIZE - sizeof(uint32_t))
129#define UBI_VID_HDR_SIZE_CRC (UBI_VID_HDR_SIZE - sizeof(uint32_t))
130
Tanya Brokhmanf9343162015-01-27 13:37:41 +0200131#define UBI_MAX_VOLUMES 128
132#define UBI_INTERNAL_VOL_START (0x7FFFFFFF - 4096)
133#define UBI_LAYOUT_VOLUME_ID UBI_INTERNAL_VOL_START
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200134#define UBI_VID_DYNAMIC 1
135#define UBI_LAYOUT_VOLUME_TYPE UBI_VID_DYNAMIC
Tanya Brokhmanf9343162015-01-27 13:37:41 +0200136#define UBI_FM_SB_VOLUME_ID (UBI_INTERNAL_VOL_START + 1)
137
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200138/* A record in the UBI volume table. */
139struct __attribute__ ((packed)) ubi_vtbl_record {
140 uint32_t reserved_pebs;
141 uint32_t alignment;
142 uint32_t data_pad;
143 uint8_t vol_type;
144 uint8_t upd_marker;
145 uint16_t name_len;
146#define UBI_VOL_NAME_MAX 127
147 uint8_t name[UBI_VOL_NAME_MAX+1];
148 uint8_t flags;
149 uint8_t padding[23];
150 uint32_t crc;
151};
152#define UBI_VTBL_RECORD_SIZE sizeof(struct ubi_vtbl_record)
153#define UBI_VTBL_RECORD_SIZE_CRC (UBI_VTBL_RECORD_SIZE - sizeof(uint32_t))
154
155/* PEB status */
156enum {
157 UBI_UNKNOWN = 0,
158 UBI_BAD_PEB,
159 UBI_FREE_PEB,
160 UBI_USED_PEB,
161 UBI_EMPTY_PEB
162};
163
164/**
165 * struct peb_info - In RAM info on a PEB
166 * @ec: erase counter
167 * @status: status of this PEB: UBI_BAD_PEB/USED/FREE/EMPTY
168 * @volume: if status = UBI_USED_PEB this is the volume
169 * ID this PEB belongs to -1 for any other status
170 */
171struct peb_info {
172 uint64_t ec;
173 int status;
174 int volume;
175};
176
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200177/**
178 * struct ubi_scan_info - UBI scanning information.
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200179 * @pebs_data: info on all of partition PEBs
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200180 * @mean_ec: mean erase counter
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200181 * @vtbl_peb1: number of the first PEB holding the volume table
182 * (relative to the beginning of the partition)
183 * @vtbl_peb1: number of the second PEB holding the volume table
184 * (relative to the beginning of the partition)
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200185 * @bad_cnt: count of bad eraseblocks
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200186 * @empty_cnt: count of empty eraseblocks
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200187 * @free_cnt: count of free eraseblocks
188 * @used_cnt: count of used eraseblocks
189 * @fastmap_sb: PEB number holding FM superblock. If FM is not present: -1
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200190 * @vid_hdr_offs: volume ID header offset from the found EC headers (%-1 means
191 * undefined)
192 * @data_offs: data offset from the found EC headers (%-1 means undefined)
193 * @image_seq: image sequence
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200194 * @read_image_seq: image sequence read from NAND while scanning
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200195 */
196struct ubi_scan_info {
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200197 struct peb_info *pebs_data;
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200198 uint64_t mean_ec;
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200199 int vtbl_peb1;
200 int vtbl_peb2;
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200201 int bad_cnt;
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200202 int empty_cnt;
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200203 int free_cnt;
204 int used_cnt;
205 int fastmap_sb;
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200206 unsigned vid_hdr_offs;
207 unsigned data_offs;
208 uint32_t image_seq;
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200209 uint32_t read_image_seq;
Tanya Brokhmanea981a32015-02-12 16:32:15 +0200210};
211
212int flash_ubi_img(struct ptentry *ptn, void *data, unsigned size);
Tanya Brokhman24a088c2015-02-24 10:21:44 +0200213int update_ubi_vol(struct ptentry *ptn, const char* vol_name,
214 void *data, unsigned size);
Tanya Brokhman1c94f1a2015-02-15 09:05:03 +0200215#endif