Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

UBI: incorporate maximum write size

Incorporate MTD write buffer size into UBI device information
because UBIFS needs this field. UBI does not use it ATM, just
provides to upper layers in 'struct ubi_device_info'.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>

+37
+14
drivers/mtd/ubi/build.c
··· 690 690 ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); 691 691 ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0); 692 692 693 + ubi->max_write_size = ubi->mtd->writebufsize; 694 + /* 695 + * Maximum write size has to be greater or equivalent to min. I/O 696 + * size, and be multiple of min. I/O size. 697 + */ 698 + if (ubi->max_write_size < ubi->min_io_size || 699 + ubi->max_write_size % ubi->min_io_size || 700 + !is_power_of_2(ubi->max_write_size)) { 701 + ubi_err("bad write buffer size %d for %d min. I/O unit", 702 + ubi->max_write_size, ubi->min_io_size); 703 + return -EINVAL; 704 + } 705 + 693 706 /* Calculate default aligned sizes of EC and VID headers */ 694 707 ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); 695 708 ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); 696 709 697 710 dbg_msg("min_io_size %d", ubi->min_io_size); 711 + dbg_msg("max_write_size %d", ubi->max_write_size); 698 712 dbg_msg("hdrs_min_io_size %d", ubi->hdrs_min_io_size); 699 713 dbg_msg("ec_hdr_alsize %d", ubi->ec_hdr_alsize); 700 714 dbg_msg("vid_hdr_alsize %d", ubi->vid_hdr_alsize);
+1
drivers/mtd/ubi/kapi.c
··· 41 41 di->ubi_num = ubi->ubi_num; 42 42 di->leb_size = ubi->leb_size; 43 43 di->min_io_size = ubi->min_io_size; 44 + di->max_write_size = ubi->max_write_size; 44 45 di->ro_mode = ubi->ro_mode; 45 46 di->cdev = ubi->cdev.dev; 46 47 }
+3
drivers/mtd/ubi/ubi.h
··· 381 381 * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or 382 382 * not 383 383 * @nor_flash: non-zero if working on top of NOR flash 384 + * @max_write_size: maximum amount of bytes the underlying flash can write at a 385 + * time (MTD write buffer size) 384 386 * @mtd: MTD device descriptor 385 387 * 386 388 * @peb_buf1: a buffer of PEB size used for different purposes ··· 466 464 int vid_hdr_shift; 467 465 unsigned int bad_allowed:1; 468 466 unsigned int nor_flash:1; 467 + int max_write_size; 469 468 struct mtd_info *mtd; 470 469 471 470 void *peb_buf1;
+19
include/linux/mtd/ubi.h
··· 117 117 * @ubi_num: ubi device number 118 118 * @leb_size: logical eraseblock size on this UBI device 119 119 * @min_io_size: minimal I/O unit size 120 + * @max_write_size: maximum amount of bytes the underlying flash can write at a 121 + * time (MTD write buffer size) 120 122 * @ro_mode: if this device is in read-only mode 121 123 * @cdev: UBI character device major and minor numbers 122 124 * 123 125 * Note, @leb_size is the logical eraseblock size offered by the UBI device. 124 126 * Volumes of this UBI device may have smaller logical eraseblock size if their 125 127 * alignment is not equivalent to %1. 128 + * 129 + * The @max_write_size field describes flash write maximum write unit. For 130 + * example, NOR flash allows for changing individual bytes, so @min_io_size is 131 + * %1. However, it does not mean than NOR flash has to write data byte-by-byte. 132 + * Instead, CFI NOR flashes have a write-buffer of, e.g., 64 bytes, and when 133 + * writing large chunks of data, they write 64-bytes at a time. Obviously, this 134 + * improves write throughput. 135 + * 136 + * Also, the MTD device may have N interleaved (striped) flash chips 137 + * underneath, in which case @min_io_size can be physical min. I/O size of 138 + * single flash chip, while @max_write_size can be N * @min_io_size. 139 + * 140 + * The @max_write_size field is always greater or equivalent to @min_io_size. 141 + * E.g., some NOR flashes may have (@min_io_size = 1, @max_write_size = 64). In 142 + * contrast, NAND flashes usually have @min_io_size = @max_write_size = NAND 143 + * page size. 126 144 */ 127 145 struct ubi_device_info { 128 146 int ubi_num; 129 147 int leb_size; 130 148 int min_io_size; 149 + int max_write_size; 131 150 int ro_mode; 132 151 dev_t cdev; 133 152 };