kernel: add support for limiting 4K erase sector support based on flash chip size
authorFelix Fietkau <nbd@nbd.name>
Fri, 3 Nov 2017 08:53:54 +0000 (09:53 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 6 Nov 2017 15:38:25 +0000 (16:38 +0100)
Some targets need 4K sectors for small flash chips (e.g. some
routerboards, where the entire chip is just one "erase block"), whereas
on other devices 4K sectors lead to horrible flash erase/write
performance.

Set the default limit in the generic kernel configuration to 4 MiB to
ensure that all new platforms don't use 4K sectors for bigger flash
chips. On all existing targets use 16 MiB for now to avoid regressions.
They will be changed individually in follow-up commits.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
target/linux/ar71xx/mikrotik/config-default
target/linux/generic/config-4.9
target/linux/generic/pending-4.9/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch [new file with mode: 0644]
target/linux/layerscape/armv8_32b/config-4.9
target/linux/layerscape/armv8_64b/config-4.9
target/linux/pistachio/config-4.9
target/linux/ramips/mt7620/config-4.9
target/linux/ramips/rt305x/config-4.9
target/linux/ramips/rt3883/config-4.9

index 42f9882bb290647858b56c091eb8014faea99ae9..284274e41f3dc682b0ea2883ba34c891244e4faf 100644 (file)
@@ -232,6 +232,7 @@ CONFIG_MTD_NAND_RB750=y
 CONFIG_MTD_NAND_RB91X=y
 # CONFIG_MTD_REDBOOT_PARTS is not set
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 # CONFIG_MTD_SPLIT_EVA_FW is not set
 # CONFIG_MTD_SPLIT_TPLINK_FW is not set
 # CONFIG_MTD_TPLINK_PARTS is not set
index 9512e494af51c789a8e296dfbcae096d78b1a98f..e591ac66553443b692cc7780db6b33e7dfe1c21b 100644 (file)
@@ -2632,6 +2632,7 @@ CONFIG_MTD_ROOTFS_ROOT_DEV=y
 # CONFIG_MTD_SPINAND_MT29F is not set
 # CONFIG_MTD_SPI_NOR is not set
 # CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096
 CONFIG_MTD_SPLIT=y
 # CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set
 # CONFIG_MTD_SPLIT_EVA_FW is not set
diff --git a/target/linux/generic/pending-4.9/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch b/target/linux/generic/pending-4.9/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch
new file mode 100644 (file)
index 0000000..e1c1de3
--- /dev/null
@@ -0,0 +1,56 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 4 Nov 2017 07:40:23 +0100
+Subject: [PATCH] mtd: spi-nor: support limiting 4K sectors support based on
+ flash size
+
+Some devices need 4K sectors to be able to deal with small flash chips.
+For instance, w25x05 is 64 KiB in size, and without 4K sectors, the
+entire chip is just one erase block.
+On bigger flash chip sizes, using 4K sectors can significantly slow down
+many operations, including using a writable filesystem. There are several
+platforms where it makes sense to use a single kernel on both kinds of
+devices.
+
+To support this properly, allow configuring an upper flash chip size
+limit for 4K sectors support.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/mtd/spi-nor/Kconfig
++++ b/drivers/mtd/spi-nor/Kconfig
+@@ -29,6 +29,17 @@ config MTD_SPI_NOR_USE_4K_SECTORS
+         Please note that some tools/drivers/filesystems may not work with
+         4096 B erase size (e.g. UBIFS requires 15 KiB as a minimum).
++config MTD_SPI_NOR_USE_4K_SECTORS_LIMIT
++      int "Maximum flash chip size to use 4K sectors on (in KiB)"
++      depends on MTD_SPI_NOR_USE_4K_SECTORS
++      default "4096"
++      help
++        There are many flash chips that support 4K sectors, but are so large
++        that using them significantly slows down writing large amounts of
++        data or using a writable filesystem.
++        Any flash chip larger than the size specified in this option will
++        not use 4K sectors.
++
+ config SPI_ATMEL_QUADSPI
+       tristate "Atmel Quad SPI Controller"
+       depends on ARCH_AT91 || (ARM && COMPILE_TEST)
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1642,10 +1642,12 @@ int spi_nor_scan(struct spi_nor *nor, co
+ #ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
+       /* prefer "small sector" erase if possible */
+-      if (info->flags & SECT_4K) {
++      if ((info->flags & SECT_4K) && (mtd->size <=
++          CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
+               nor->erase_opcode = SPINOR_OP_BE_4K;
+               mtd->erasesize = 4096;
+-      } else if (info->flags & SECT_4K_PMC) {
++      } else if ((info->flags & SECT_4K_PMC) && (mtd->size <=
++                 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
+               nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
+               mtd->erasesize = 4096;
+       } else
index bb45901171dd06250a11fa809ab93d99744985c2..565cb5d9dfc297125677cdacfe6c9a8ae9d77acb 100644 (file)
@@ -841,6 +841,7 @@ CONFIG_MTD_NAND_DENALI_DT=y
 CONFIG_MTD_NAND_ECC=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SST25L=y
 CONFIG_MTD_UBI=y
 CONFIG_MTD_UBI_BEB_LIMIT=20
index ea4dba67c089b3e79c875deb4cdeeeed451297ef..4432919f4e2e647e5a61ad2eb806a1e4e97df9ee 100644 (file)
@@ -824,6 +824,7 @@ CONFIG_MTD_NAND_ECC=y
 CONFIG_MTD_NAND_FSL_IFC=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SST25L=y
 CONFIG_MUTEX_SPIN_ON_OWNER=y
 CONFIG_MV_XOR_V2=y
index 121f6a8c1380a306d59043323cd5758cae928588..a417a6b064bfd91fe07b19fa63284adace32b85d 100644 (file)
@@ -216,6 +216,7 @@ CONFIG_MTD_SPI_NAND=y
 CONFIG_MTD_SPI_NAND_DEVICES=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_UBI=y
 CONFIG_MTD_UBI_BEB_LIMIT=20
 CONFIG_MTD_UBI_BLOCK=y
index dc3c8fcc0a35e46ce4d85ddd144009bb415a828c..4f8c68629ee57c3eb7676be932b940ed0930b689 100644 (file)
@@ -141,6 +141,7 @@ CONFIG_MTD_NAND_MT7620=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SPLIT_FIRMWARE=y
 CONFIG_MTD_SPLIT_SEAMA_FW=y
 CONFIG_MTD_SPLIT_TPLINK_FW=y
index d7b53038d4912dedd3571fca5e7701325f74feb7..ae843f3720b0f673cac66d290dd3d027f2f67755 100644 (file)
@@ -134,6 +134,7 @@ CONFIG_MTD_M25P80=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SPLIT_FIRMWARE=y
 CONFIG_MTD_SPLIT_SEAMA_FW=y
 CONFIG_MTD_SPLIT_UIMAGE_FW=y
index 3e6b73f80cf441590356378938de6dfb75336997..3b116e560fb5330ce81f17bfe723499a91cf92de 100644 (file)
@@ -134,6 +134,7 @@ CONFIG_MTD_M25P80=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SPLIT_FIRMWARE=y
 CONFIG_MTD_SPLIT_SEAMA_FW=y
 CONFIG_MTD_SPLIT_UIMAGE_FW=y