Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57cf26c1 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Brian Norris
Browse files

mtd: spi-nor: add Kconfig option to disable 4K sectors



Current situation with 4K sectors is quite messy. First of all, some
MTD "users" don't work with such small size. An example may be UBIFS
which requires 15 KiB erase blocks as a minimum. In theory spi-nor
should provide multiple erase regions and MTD "users" should use the
one they need. Unforunately that is not implemented.

In the result our flashes database in spi-nor is hackish. For some
flashes we pretend they don't support 4K sectors just because some
distribution uses UBIFS on it. This ofc leads to conflicts, like
Samsung using w25q128 with 4K sectors vs. OpenWrt requiring it to
pretend it's 64 KiB blocks only.

My idea (plan?) for fixing this situation:
1) Use real hw info (this requires a way for disabling 4K for now)
2) Provide detailed info about erase regions
3) Make UBIFS work with devices that support 4K sectors

Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 6d178ef2
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -7,6 +7,20 @@ menuconfig MTD_SPI_NOR

if MTD_SPI_NOR

config MTD_SPI_NOR_USE_4K_SECTORS
	bool "Use small 4096 B erase sectors"
	default y
	help
	  Many flash memories support erasing small (4096 B) sectors. Depending
	  on the usage this feature may provide performance gain in comparison
	  to erasing whole blocks (32/64 KiB).
	  Changing a small part of the flash's contents is usually faster with
	  small sectors. On the other hand erasing should be faster when using
	  64 KiB block instead of 16 × 4 KiB 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 SPI_FSL_QUADSPI
	tristate "Freescale Quad SPI controller"
	depends on ARCH_MXC
+4 −1
Original line number Diff line number Diff line
@@ -1013,6 +1013,7 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id,
	    nor->wait_till_ready == spi_nor_wait_till_ready)
		nor->wait_till_ready = spi_nor_wait_till_fsr_ready;

#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
	/* prefer "small sector" erase if possible */
	if (info->flags & SECT_4K) {
		nor->erase_opcode = SPINOR_OP_BE_4K;
@@ -1020,7 +1021,9 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id,
	} else if (info->flags & SECT_4K_PMC) {
		nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
		mtd->erasesize = 4096;
	} else {
	} else
#endif
	{
		nor->erase_opcode = SPINOR_OP_SE;
		mtd->erasesize = info->sector_size;
	}