xref: /rk3399_rockchip-uboot/include/linux/mtd/ubi.h (revision 1a4596601fd395f3afb8f82f3f840c5e00bdd57a)
147ae6693SKyungmin Park /*
247ae6693SKyungmin Park  * Copyright (c) International Business Machines Corp., 2006
347ae6693SKyungmin Park  *
4*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
547ae6693SKyungmin Park  *
647ae6693SKyungmin Park  * Author: Artem Bityutskiy (Битюцкий Артём)
747ae6693SKyungmin Park  */
847ae6693SKyungmin Park 
947ae6693SKyungmin Park #ifndef __LINUX_UBI_H__
1047ae6693SKyungmin Park #define __LINUX_UBI_H__
1147ae6693SKyungmin Park 
12455ae7e8SWolfgang Denk /* #include <asm/ioctl.h> */
1347ae6693SKyungmin Park #include <linux/types.h>
1447ae6693SKyungmin Park #include <mtd/ubi-user.h>
1547ae6693SKyungmin Park 
1647ae6693SKyungmin Park /*
1747ae6693SKyungmin Park  * enum ubi_open_mode - UBI volume open mode constants.
1847ae6693SKyungmin Park  *
1947ae6693SKyungmin Park  * UBI_READONLY: read-only mode
2047ae6693SKyungmin Park  * UBI_READWRITE: read-write mode
2147ae6693SKyungmin Park  * UBI_EXCLUSIVE: exclusive mode
2247ae6693SKyungmin Park  */
2347ae6693SKyungmin Park enum {
2447ae6693SKyungmin Park 	UBI_READONLY = 1,
2547ae6693SKyungmin Park 	UBI_READWRITE,
2647ae6693SKyungmin Park 	UBI_EXCLUSIVE
2747ae6693SKyungmin Park };
2847ae6693SKyungmin Park 
2947ae6693SKyungmin Park /**
3047ae6693SKyungmin Park  * struct ubi_volume_info - UBI volume description data structure.
3147ae6693SKyungmin Park  * @vol_id: volume ID
3247ae6693SKyungmin Park  * @ubi_num: UBI device number this volume belongs to
3347ae6693SKyungmin Park  * @size: how many physical eraseblocks are reserved for this volume
3447ae6693SKyungmin Park  * @used_bytes: how many bytes of data this volume contains
3547ae6693SKyungmin Park  * @used_ebs: how many physical eraseblocks of this volume actually contain any
3647ae6693SKyungmin Park  * data
3747ae6693SKyungmin Park  * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME)
3847ae6693SKyungmin Park  * @corrupted: non-zero if the volume is corrupted (static volumes only)
3947ae6693SKyungmin Park  * @upd_marker: non-zero if the volume has update marker set
4047ae6693SKyungmin Park  * @alignment: volume alignment
4147ae6693SKyungmin Park  * @usable_leb_size: how many bytes are available in logical eraseblocks of
4247ae6693SKyungmin Park  * this volume
4347ae6693SKyungmin Park  * @name_len: volume name length
4447ae6693SKyungmin Park  * @name: volume name
4547ae6693SKyungmin Park  * @cdev: UBI volume character device major and minor numbers
4647ae6693SKyungmin Park  *
4747ae6693SKyungmin Park  * The @corrupted flag is only relevant to static volumes and is always zero
4847ae6693SKyungmin Park  * for dynamic ones. This is because UBI does not care about dynamic volume
4947ae6693SKyungmin Park  * data protection and only cares about protecting static volume data.
5047ae6693SKyungmin Park  *
5147ae6693SKyungmin Park  * The @upd_marker flag is set if the volume update operation was interrupted.
5247ae6693SKyungmin Park  * Before touching the volume data during the update operation, UBI first sets
5347ae6693SKyungmin Park  * the update marker flag for this volume. If the volume update operation was
5447ae6693SKyungmin Park  * further interrupted, the update marker indicates this. If the update marker
5547ae6693SKyungmin Park  * is set, the contents of the volume is certainly damaged and a new volume
5647ae6693SKyungmin Park  * update operation has to be started.
5747ae6693SKyungmin Park  *
5847ae6693SKyungmin Park  * To put it differently, @corrupted and @upd_marker fields have different
5947ae6693SKyungmin Park  * semantics:
6047ae6693SKyungmin Park  *     o the @corrupted flag means that this static volume is corrupted for some
6147ae6693SKyungmin Park  *       reasons, but not because an interrupted volume update
6247ae6693SKyungmin Park  *     o the @upd_marker field means that the volume is damaged because of an
6347ae6693SKyungmin Park  *       interrupted update operation.
6447ae6693SKyungmin Park  *
6547ae6693SKyungmin Park  * I.e., the @corrupted flag is never set if the @upd_marker flag is set.
6647ae6693SKyungmin Park  *
6747ae6693SKyungmin Park  * The @used_bytes and @used_ebs fields are only really needed for static
6847ae6693SKyungmin Park  * volumes and contain the number of bytes stored in this static volume and how
6947ae6693SKyungmin Park  * many eraseblock this data occupies. In case of dynamic volumes, the
7047ae6693SKyungmin Park  * @used_bytes field is equivalent to @size*@usable_leb_size, and the @used_ebs
7147ae6693SKyungmin Park  * field is equivalent to @size.
7247ae6693SKyungmin Park  *
7347ae6693SKyungmin Park  * In general, logical eraseblock size is a property of the UBI device, not
7447ae6693SKyungmin Park  * of the UBI volume. Indeed, the logical eraseblock size depends on the
7547ae6693SKyungmin Park  * physical eraseblock size and on how much bytes UBI headers consume. But
7647ae6693SKyungmin Park  * because of the volume alignment (@alignment), the usable size of logical
7747ae6693SKyungmin Park  * eraseblocks if a volume may be less. The following equation is true:
7847ae6693SKyungmin Park  * 	@usable_leb_size = LEB size - (LEB size mod @alignment),
7947ae6693SKyungmin Park  * where LEB size is the logical eraseblock size defined by the UBI device.
8047ae6693SKyungmin Park  *
8147ae6693SKyungmin Park  * The alignment is multiple to the minimal flash input/output unit size or %1
8247ae6693SKyungmin Park  * if all the available space is used.
8347ae6693SKyungmin Park  *
8447ae6693SKyungmin Park  * To put this differently, alignment may be considered is a way to change
8547ae6693SKyungmin Park  * volume logical eraseblock sizes.
8647ae6693SKyungmin Park  */
8747ae6693SKyungmin Park struct ubi_volume_info {
8847ae6693SKyungmin Park 	int ubi_num;
8947ae6693SKyungmin Park 	int vol_id;
9047ae6693SKyungmin Park 	int size;
9147ae6693SKyungmin Park 	long long used_bytes;
9247ae6693SKyungmin Park 	int used_ebs;
9347ae6693SKyungmin Park 	int vol_type;
9447ae6693SKyungmin Park 	int corrupted;
9547ae6693SKyungmin Park 	int upd_marker;
9647ae6693SKyungmin Park 	int alignment;
9747ae6693SKyungmin Park 	int usable_leb_size;
9847ae6693SKyungmin Park 	int name_len;
9947ae6693SKyungmin Park 	const char *name;
10047ae6693SKyungmin Park 	dev_t cdev;
10147ae6693SKyungmin Park };
10247ae6693SKyungmin Park 
10347ae6693SKyungmin Park /**
10447ae6693SKyungmin Park  * struct ubi_device_info - UBI device description data structure.
10547ae6693SKyungmin Park  * @ubi_num: ubi device number
10647ae6693SKyungmin Park  * @leb_size: logical eraseblock size on this UBI device
10747ae6693SKyungmin Park  * @min_io_size: minimal I/O unit size
10847ae6693SKyungmin Park  * @ro_mode: if this device is in read-only mode
10947ae6693SKyungmin Park  * @cdev: UBI character device major and minor numbers
11047ae6693SKyungmin Park  *
11147ae6693SKyungmin Park  * Note, @leb_size is the logical eraseblock size offered by the UBI device.
11247ae6693SKyungmin Park  * Volumes of this UBI device may have smaller logical eraseblock size if their
11347ae6693SKyungmin Park  * alignment is not equivalent to %1.
11447ae6693SKyungmin Park  */
11547ae6693SKyungmin Park struct ubi_device_info {
11647ae6693SKyungmin Park 	int ubi_num;
11747ae6693SKyungmin Park 	int leb_size;
11847ae6693SKyungmin Park 	int min_io_size;
11947ae6693SKyungmin Park 	int ro_mode;
12047ae6693SKyungmin Park 	dev_t cdev;
12147ae6693SKyungmin Park };
12247ae6693SKyungmin Park 
12347ae6693SKyungmin Park /* UBI descriptor given to users when they open UBI volumes */
12447ae6693SKyungmin Park struct ubi_volume_desc;
12547ae6693SKyungmin Park 
12647ae6693SKyungmin Park int ubi_get_device_info(int ubi_num, struct ubi_device_info *di);
12747ae6693SKyungmin Park void ubi_get_volume_info(struct ubi_volume_desc *desc,
12847ae6693SKyungmin Park 			 struct ubi_volume_info *vi);
12947ae6693SKyungmin Park struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode);
13047ae6693SKyungmin Park struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
13147ae6693SKyungmin Park 					   int mode);
13247ae6693SKyungmin Park void ubi_close_volume(struct ubi_volume_desc *desc);
13347ae6693SKyungmin Park int ubi_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,
13447ae6693SKyungmin Park 		 int len, int check);
13547ae6693SKyungmin Park int ubi_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf,
13647ae6693SKyungmin Park 		  int offset, int len, int dtype);
13747ae6693SKyungmin Park int ubi_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf,
13847ae6693SKyungmin Park 		   int len, int dtype);
13947ae6693SKyungmin Park int ubi_leb_erase(struct ubi_volume_desc *desc, int lnum);
14047ae6693SKyungmin Park int ubi_leb_unmap(struct ubi_volume_desc *desc, int lnum);
14147ae6693SKyungmin Park int ubi_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype);
14247ae6693SKyungmin Park int ubi_is_mapped(struct ubi_volume_desc *desc, int lnum);
14347ae6693SKyungmin Park 
14447ae6693SKyungmin Park /*
14547ae6693SKyungmin Park  * This function is the same as the 'ubi_leb_read()' function, but it does not
14647ae6693SKyungmin Park  * provide the checking capability.
14747ae6693SKyungmin Park  */
14847ae6693SKyungmin Park static inline int ubi_read(struct ubi_volume_desc *desc, int lnum, char *buf,
14947ae6693SKyungmin Park 			   int offset, int len)
15047ae6693SKyungmin Park {
15147ae6693SKyungmin Park 	return ubi_leb_read(desc, lnum, buf, offset, len, 0);
15247ae6693SKyungmin Park }
15347ae6693SKyungmin Park 
15447ae6693SKyungmin Park /*
15547ae6693SKyungmin Park  * This function is the same as the 'ubi_leb_write()' functions, but it does
15647ae6693SKyungmin Park  * not have the data type argument.
15747ae6693SKyungmin Park  */
15847ae6693SKyungmin Park static inline int ubi_write(struct ubi_volume_desc *desc, int lnum,
15947ae6693SKyungmin Park 			    const void *buf, int offset, int len)
16047ae6693SKyungmin Park {
16147ae6693SKyungmin Park 	return ubi_leb_write(desc, lnum, buf, offset, len, UBI_UNKNOWN);
16247ae6693SKyungmin Park }
16347ae6693SKyungmin Park 
16447ae6693SKyungmin Park /*
16547ae6693SKyungmin Park  * This function is the same as the 'ubi_leb_change()' functions, but it does
16647ae6693SKyungmin Park  * not have the data type argument.
16747ae6693SKyungmin Park  */
16847ae6693SKyungmin Park static inline int ubi_change(struct ubi_volume_desc *desc, int lnum,
16947ae6693SKyungmin Park 				    const void *buf, int len)
17047ae6693SKyungmin Park {
17147ae6693SKyungmin Park 	return ubi_leb_change(desc, lnum, buf, len, UBI_UNKNOWN);
17247ae6693SKyungmin Park }
17347ae6693SKyungmin Park 
17447ae6693SKyungmin Park #endif /* !__LINUX_UBI_H__ */
175