aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/ubi/Kconfig27
-rw-r--r--drivers/mtd/ubi/build.c21
2 files changed, 39 insertions, 9 deletions
diff --git a/drivers/mtd/ubi/Kconfig b/drivers/mtd/ubi/Kconfig
index b2f4f0f032f1..dcbaae3ead63 100644
--- a/drivers/mtd/ubi/Kconfig
+++ b/drivers/mtd/ubi/Kconfig
@@ -28,14 +28,29 @@ config MTD_UBI_WL_THRESHOLD
28 to 128 or 256, although it does not have to be power of 2). 28 to 128 or 256, although it does not have to be power of 2).
29 29
30config MTD_UBI_BEB_LIMIT 30config MTD_UBI_BEB_LIMIT
31 int "Percentage of maximum expected bad eraseblocks" 31 int "Maximum expected bad eraseblock count per 1024 eraseblocks"
32 default 2 32 default 20
33 range 0 25 33 range 0 768
34 help 34 help
35 This option specifies the maximum bad physical eraseblocks UBI 35 This option specifies the maximum bad physical eraseblocks UBI
36 expects on the UBI device (percents of total number of physical 36 expects on the MTD device (per 1024 eraseblocks). If the underlying
37 eraseblocks on this MTD partition). If the underlying flash does not 37 flash does not admit of bad eraseblocks (e.g. NOR flash), this value
38 admit of bad eraseblocks (e.g. NOR flash), this value is ignored. 38 is ignored.
39
40 NAND datasheets often specify the minimum and maximum NVM (Number of
41 Valid Blocks) for the flashes' endurance lifetime. The maximum
42 expected bad eraseblocks per 1024 eraseblocks then can be calculated
43 as "1024 * (1 - MinNVB / MaxNVB)", which gives 20 for most NANDs
44 (MaxNVB is basically the total count of eraseblocks on the chip).
45
46 To put it differently, if this value is 20, UBI will try to reserve
47 about 1.9% of physical eraseblocks for bad blocks handling. And that
48 will be 1.9% of eraseblocks on the entire NAND chip, not just the MTD
49 partition UBI attaches. This means that if you have, say, a NAND
50 flash chip admits maximum 40 bad eraseblocks, and it is split on two
51 MTD partitions of the same size, UBI will reserve 40 eraseblocks when
52 attaching a partition.
53
39 Leave the default value if unsure. 54 Leave the default value if unsure.
40 55
41config MTD_UBI_GLUEBI 56config MTD_UBI_GLUEBI
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index ce311aa75a75..9980441a8886 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -36,6 +36,7 @@
36#include <linux/namei.h> 36#include <linux/namei.h>
37#include <linux/stat.h> 37#include <linux/stat.h>
38#include <linux/miscdevice.h> 38#include <linux/miscdevice.h>
39#include <linux/mtd/partitions.h>
39#include <linux/log2.h> 40#include <linux/log2.h>
40#include <linux/kthread.h> 41#include <linux/kthread.h>
41#include <linux/kernel.h> 42#include <linux/kernel.h>
@@ -610,11 +611,25 @@ static int io_init(struct ubi_device *ubi)
610 if (mtd_can_have_bb(ubi->mtd)) { 611 if (mtd_can_have_bb(ubi->mtd)) {
611 ubi->bad_allowed = 1; 612 ubi->bad_allowed = 1;
612 if (CONFIG_MTD_UBI_BEB_LIMIT > 0) { 613 if (CONFIG_MTD_UBI_BEB_LIMIT > 0) {
613 int percent = CONFIG_MTD_UBI_BEB_LIMIT; 614 int per1024 = CONFIG_MTD_UBI_BEB_LIMIT;
614 int limit = mult_frac(ubi->peb_count, percent, 100); 615 int limit, device_pebs;
616 uint64_t device_size;
617
618 /*
619 * Here we are using size of the entire flash chip and
620 * not just the MTD partition size because the maximum
621 * number of bad eraseblocks is a percentage of the
622 * whole device and bad eraseblocks are not fairly
623 * distributed over the flash chip. So the worst case
624 * is that all the bad eraseblocks of the chip are in
625 * the MTD partition we are attaching (ubi->mtd).
626 */
627 device_size = mtd_get_device_size(ubi->mtd);
628 device_pebs = mtd_div_by_eb(device_size, ubi->mtd);
629 limit = mult_frac(device_pebs, per1024, 1024);
615 630
616 /* Round it up */ 631 /* Round it up */
617 if (mult_frac(limit, 100, percent) < ubi->peb_count) 632 if (mult_frac(limit, 1024, per1024) < device_pebs)
618 limit += 1; 633 limit += 1;
619 ubi->bad_peb_limit = limit; 634 ubi->bad_peb_limit = limit;
620 } 635 }