diff --git a/include/flash.h b/include/flash.h index f06e66e..09efde3 100644 --- a/include/flash.h +++ b/include/flash.h @@ -12,12 +12,14 @@ struct flash_ops { int (* write)(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); int (* copy)(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len); - int (* erase)(struct flash_dev *dev, uint32_t addr, size_t block_size); + int (* erase)(struct flash_dev *dev, uint32_t addr); }; struct flash_dev { struct flash_ops *ops; void *priv; + uint8_t log2_page_size; + uint8_t log2_block_size; }; struct flash_dev *flash_probe(void); @@ -28,4 +30,4 @@ int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len); int flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len); -int flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size); +int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len); diff --git a/source/core/flash.c b/source/core/flash.c index e6f7273..76d855d 100644 --- a/source/core/flash.c +++ b/source/core/flash.c @@ -44,10 +44,17 @@ int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len) return dev->ops->copy(dev, dst, src, len); } -int flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size) +int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len) { if (!dev) return -1; - return dev->ops->erase(dev, addr, block_size); + while (len--) { + if (dev->ops->erase(dev, addr) < 0) + return -1; + + ++addr; + } + + return 0; } diff --git a/source/drivers/sandbox_flash.c b/source/drivers/sandbox_flash.c index 94531ba..8a23e72 100644 --- a/source/drivers/sandbox_flash.c +++ b/source/drivers/sandbox_flash.c @@ -25,7 +25,7 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len); -static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size); +static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr); static struct flash_ops stdio_flash_ops = { .get_size = stdio_flash_get_size, @@ -99,17 +99,12 @@ static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, return 0; } -static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr, - size_t block_size) +static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr) { struct stdio_flash_priv *priv = dev->priv; - size_t log2_block_size = ilog2(block_size); - if (block_size != (UINT32_C(1) << log2_block_size)) - return -1; - - memset(priv->data + (addr << log2_block_size), 0xff, - (1 << log2_block_size)); + memset(priv->data + (addr << dev->log2_block_size), 0xff, + 1 << dev->log2_block_size); return 0; } @@ -140,6 +135,8 @@ struct flash_dev *flash_probe(void) dev->priv = priv; dev->ops = &stdio_flash_ops; + dev->log2_page_size = ilog2(1); + dev->log2_block_size = ilog2(4 * KIB); return dev; diff --git a/source/ftl/dev.c b/source/ftl/dev.c index 1d9f571..b13753b 100644 --- a/source/ftl/dev.c +++ b/source/ftl/dev.c @@ -1,8 +1,10 @@ #include #include +#include #include #include +#include static size_t ftl_flash_get_size(struct flash_dev *dev); static size_t ftl_flash_get_capacity(struct flash_dev *dev); @@ -10,8 +12,7 @@ static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len); static int ftl_flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); -static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr, - size_t block_size); +static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr); static struct flash_ops ftl_flash_ops = { .get_size = ftl_flash_get_size, @@ -56,14 +57,10 @@ static int ftl_flash_write(struct flash_dev *dev, uint32_t addr, return ftl_write(map, addr, data); } -static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr, - size_t block_size) +static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr) { struct ftl_map *map = dev->priv; - /* TODO */ - (void)block_size; - return ftl_trim(map, addr); } @@ -86,6 +83,8 @@ struct flash_dev *ftl_mount(struct flash_dev *raw_dev) dev->ops = &ftl_flash_ops; dev->priv = map; + dev->log2_page_size = ilog2(4 * KIB); + dev->log2_block_size = ilog2(4 * KIB); return dev; diff --git a/source/ftl/gc.c b/source/ftl/gc.c index 365fb84..d8d8a72 100644 --- a/source/ftl/gc.c +++ b/source/ftl/gc.c @@ -125,6 +125,5 @@ int prepare_head(struct ftl_map *map) if (free_tail(map) < 0) return -1; - return flash_erase(map->dev, map->head >> log2_pages_per_block, - map->log2_block_size); + return flash_erase(map->dev, map->head, 1 << log2_pages_per_block); }