This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 9c10bbd04a1 drivers/mtd: Remove bad block management in FTL for
devices not needing it
9c10bbd04a1 is described below
commit 9c10bbd04a165de47eff4c19de9f0a2e10993754
Author: Jukka Laitinen <[email protected]>
AuthorDate: Tue Jun 2 09:18:13 2026 +0300
drivers/mtd: Remove bad block management in FTL for devices not needing it
Bad block management and the logical->physical mapping is only needed
with raw NAND type memories, so we can compile that in conditionally,
saving ~600 bytes of flash on a 32-bit arm when NAND is not used.
Signed-off-by: Jukka Laitinen <[email protected]>
---
drivers/mtd/Kconfig | 10 ++++++++++
drivers/mtd/ftl.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index b661bc44212..343693c8ffd 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -50,6 +50,15 @@ config FTL_READAHEAD
default n
depends on DRVR_READAHEAD
+config FTL_BBM
+ bool "Enable bad block management in the FTL layer"
+ default y if MTD_NAND
+ ---help---
+ Enable logical to physical erase-block mapping in the FTL layer
for
+ MTD devices that expose bad blocks via the MTD isbad/markbad
methods.
+
+ This is needed for devices that require software bad block
management.
+
config MTD_SECT512
bool "512B sector conversion"
default n
@@ -1442,6 +1451,7 @@ config MTD_GD5F
bool "SPI-based GD5F nand FLASH"
default n
select SPI
+ select FTL_BBM
if MTD_GD5F
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c
index 83c027e06a7..f175f4f5076 100644
--- a/drivers/mtd/ftl.c
+++ b/drivers/mtd/ftl.c
@@ -80,10 +80,12 @@ struct ftl_struct_s
FAR uint8_t *eblock; /* One, in-memory erase block */
int oflags;
- /* The nand block map between logic block and physical block */
+#ifdef CONFIG_FTL_BBM
+ /* The block map between logic block and physical block */
FAR off_t *lptable;
off_t lpcount;
+#endif
};
/****************************************************************************
@@ -133,12 +135,14 @@ static const struct block_operations g_bops =
* Private Functions
****************************************************************************/
+#ifdef CONFIG_FTL_BBM
+
/****************************************************************************
* Name: ftl_init_map
*
* Description: Allocate logical block and physical block mapping table
- * space, and scan the entire nand flash device to establish
- * the mapping relationship between logical block and physical
+ * space, and scan the entire MTD device to establish the
+ * mapping relationship between logical block and physical
* good block.
*
****************************************************************************/
@@ -207,6 +211,7 @@ static size_t ftl_get_cblock(FAR struct ftl_struct_s *dev,
off_t start,
return count;
}
+#endif
/****************************************************************************
* Name: ftl_open
@@ -273,11 +278,15 @@ static int ftl_close(FAR struct inode *inode)
static ssize_t ftl_mtd_bread(FAR struct ftl_struct_s *dev, off_t startblock,
size_t nblocks, FAR uint8_t *buffer)
{
+#ifdef CONFIG_FTL_BBM
off_t mask = dev->blkper - 1;
size_t nread = nblocks;
+#endif
ssize_t ret = OK;
+#ifdef CONFIG_FTL_BBM
if (dev->lptable == NULL)
+#endif
{
ret = MTD_BREAD(dev->mtd, startblock, nblocks, buffer);
if (ret != nblocks)
@@ -289,6 +298,7 @@ static ssize_t ftl_mtd_bread(FAR struct ftl_struct_s *dev,
off_t startblock,
return ret;
}
+#ifdef CONFIG_FTL_BBM
while (nblocks > 0)
{
off_t startphysicalblock;
@@ -324,6 +334,7 @@ static ssize_t ftl_mtd_bread(FAR struct ftl_struct_s *dev,
off_t startblock,
}
return nblocks != nread ? nread - nblocks : ret;
+#endif
}
/****************************************************************************
@@ -339,10 +350,14 @@ static ssize_t ftl_mtd_bread(FAR struct ftl_struct_s
*dev, off_t startblock,
static ssize_t ftl_mtd_bwrite(FAR struct ftl_struct_s *dev, off_t startblock,
FAR const uint8_t *buffer)
{
+#ifdef CONFIG_FTL_BBM
off_t starteraseblock;
+#endif
ssize_t ret;
+#ifdef CONFIG_FTL_BBM
if (dev->lptable == NULL)
+#endif
{
ret = MTD_BWRITE(dev->mtd, startblock, dev->blkper, buffer);
if (ret != dev->blkper)
@@ -354,6 +369,7 @@ static ssize_t ftl_mtd_bwrite(FAR struct ftl_struct_s *dev,
off_t startblock,
return ret;
}
+#ifdef CONFIG_FTL_BBM
starteraseblock = startblock / dev->blkper;
while (1)
{
@@ -372,6 +388,7 @@ static ssize_t ftl_mtd_bwrite(FAR struct ftl_struct_s *dev,
off_t startblock,
MTD_MARKBAD(dev->mtd, dev->lptable[starteraseblock]);
ftl_update_map(dev, starteraseblock);
}
+#endif
}
/****************************************************************************
@@ -389,7 +406,9 @@ static ssize_t ftl_mtd_erase(FAR struct ftl_struct_s *dev,
off_t startblock)
{
ssize_t ret;
+#ifdef CONFIG_FTL_BBM
if (dev->lptable == NULL)
+#endif
{
ret = MTD_ERASE(dev->mtd, startblock, 1);
if (ret < 0 && ret != -ENOSYS)
@@ -402,6 +421,7 @@ static ssize_t ftl_mtd_erase(FAR struct ftl_struct_s *dev,
off_t startblock)
return OK;
}
+#ifdef CONFIG_FTL_BBM
while (1)
{
if (startblock >= dev->lpcount)
@@ -418,6 +438,7 @@ static ssize_t ftl_mtd_erase(FAR struct ftl_struct_s *dev,
off_t startblock)
MTD_MARKBAD(dev->mtd, dev->lptable[startblock]);
ftl_update_map(dev, startblock);
}
+#endif
}
/****************************************************************************
@@ -517,7 +538,9 @@ static ssize_t ftl_flush_direct(FAR struct ftl_struct_s
*dev,
}
}
+#ifdef CONFIG_FTL_BBM
if (dev->lptable == NULL)
+#endif
{
ret = MTD_BWRITE(dev->mtd, startblock, count, buffer);
if (ret != count)
@@ -527,6 +550,7 @@ static ssize_t ftl_flush_direct(FAR struct ftl_struct_s
*dev,
return ret;
}
}
+#ifdef CONFIG_FTL_BBM
else
{
if (starteraseblock >= dev->lpcount)
@@ -544,6 +568,7 @@ static ssize_t ftl_flush_direct(FAR struct ftl_struct_s
*dev,
continue;
}
}
+#endif
nblocks -= count;
startblock += count;
@@ -567,7 +592,11 @@ static ssize_t ftl_flush(FAR void *priv, FAR const uint8_t
*buffer,
int nbytes;
int ret;
+#ifdef CONFIG_FTL_BBM
if (dev->mtd->erase == NULL && dev->lptable == NULL)
+#else
+ if (dev->mtd->erase == NULL)
+#endif
{
ret = MTD_BWRITE(dev->mtd, startblock, nblocks, buffer);
if (ret != nblocks)
@@ -922,6 +951,15 @@ int ftl_initialize_by_path(FAR const char *path, FAR
struct mtd_dev_s *mtd,
finfo("path=\"%s\"\n", path);
+#ifndef CONFIG_FTL_BBM
+ /* It is likely a configuration error if the mtd driver implements
+ * the bad block management, but it is still disabled by the
+ * configuration.
+ */
+
+ DEBUGASSERT(mtd->isbad == NULL && mtd->markbad == NULL);
+#endif
+
/* Allocate a FTL device structure */
dev = kmm_zalloc(sizeof(struct ftl_struct_s));
@@ -978,6 +1016,7 @@ int ftl_initialize_by_path(FAR const char *path, FAR
struct mtd_dev_s *mtd,
}
#endif
+#ifdef CONFIG_FTL_BBM
if (MTD_ISBAD(dev->mtd, 0) != -ENOSYS)
{
ret = ftl_init_map(dev);
@@ -986,6 +1025,7 @@ int ftl_initialize_by_path(FAR const char *path, FAR
struct mtd_dev_s *mtd,
goto out;
}
}
+#endif
/* Inode private data is a reference to the FTL device structure */
@@ -993,8 +1033,10 @@ int ftl_initialize_by_path(FAR const char *path, FAR
struct mtd_dev_s *mtd,
if (ret < 0)
{
ferr("ERROR: register_blockdriver failed: %d\n", -ret);
+#ifdef CONFIG_FTL_BBM
kmm_free(dev->lptable);
out:
+#endif
#ifdef FTL_HAVE_RWBUFFER
rwb_uninitialize(&dev->rwb);
#endif