Commit 0554effe authored by Michael Walle's avatar Michael Walle Committed by Tudor Ambarus

mtd: spi-nor: convert .n_sectors to .size

.n_sectors is rarely used. In fact it is only used in swp.c and to
calculate the flash size in the core. The use in swp.c might be
converted to use the (largest) flash erase size. For now, we just
locally calculate the sector size.

Simplify the flash_info database and set the size of the flash directly.
This also let us use the SZ_x macros.

Verified that there's no flash that specifies BP and sector size of zero
to make sure we avoid a division by zero in
spi_nor_get_min_prot_length_sr(). We'll protect from a possible division
by zero in a further patch by introducing a default value for
sector_size.
Signed-off-by: default avatarMichael Walle <mwalle@kernel.org>
Link: https://lore.kernel.org/r/20230807-mtd-flash-info-db-rework-v3-5-e60548861b10@kernel.orgSigned-off-by: default avatarTudor Ambarus <tudor.ambarus@linaro.org>
parent afbfb8c5
...@@ -2999,7 +2999,7 @@ static void spi_nor_init_default_params(struct spi_nor *nor) ...@@ -2999,7 +2999,7 @@ static void spi_nor_init_default_params(struct spi_nor *nor)
/* Set SPI NOR sizes. */ /* Set SPI NOR sizes. */
params->writesize = 1; params->writesize = 1;
params->size = (u64)info->sector_size * info->n_sectors; params->size = info->size;
params->bank_size = params->size; params->bank_size = params->size;
params->page_size = info->page_size; params->page_size = info->page_size;
......
...@@ -443,9 +443,9 @@ struct spi_nor_fixups { ...@@ -443,9 +443,9 @@ struct spi_nor_fixups {
* @id: the flash's ID bytes. The first three bytes are the * @id: the flash's ID bytes. The first three bytes are the
* JEDIC ID. JEDEC ID zero means "no ID" (mostly older chips). * JEDIC ID. JEDEC ID zero means "no ID" (mostly older chips).
* @id_len: the number of bytes of ID. * @id_len: the number of bytes of ID.
* @size: the size of the flash in bytes.
* @sector_size: the size listed here is what works with SPINOR_OP_SE, which * @sector_size: the size listed here is what works with SPINOR_OP_SE, which
* isn't necessarily called a "sector" by the vendor. * isn't necessarily called a "sector" by the vendor.
* @n_sectors: the number of sectors.
* @n_banks: the number of banks. * @n_banks: the number of banks.
* @page_size: the flash's page size. * @page_size: the flash's page size.
* @addr_nbytes: number of address bytes to send. * @addr_nbytes: number of address bytes to send.
...@@ -505,8 +505,8 @@ struct flash_info { ...@@ -505,8 +505,8 @@ struct flash_info {
char *name; char *name;
u8 id[SPI_NOR_MAX_ID_LEN]; u8 id[SPI_NOR_MAX_ID_LEN];
u8 id_len; u8 id_len;
size_t size;
unsigned sector_size; unsigned sector_size;
u16 n_sectors;
u16 page_size; u16 page_size;
u8 n_banks; u8 n_banks;
u8 addr_nbytes; u8 addr_nbytes;
...@@ -556,8 +556,8 @@ struct flash_info { ...@@ -556,8 +556,8 @@ struct flash_info {
.id_len = 6 .id_len = 6
#define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks) \ #define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks) \
.size = (_sector_size) * (_n_sectors), \
.sector_size = (_sector_size), \ .sector_size = (_sector_size), \
.n_sectors = (_n_sectors), \
.page_size = 256, \ .page_size = 256, \
.n_banks = (_n_banks) .n_banks = (_n_banks)
...@@ -575,8 +575,8 @@ struct flash_info { ...@@ -575,8 +575,8 @@ struct flash_info {
SPI_NOR_GEOMETRY((_sector_size), (_n_sectors), 1), SPI_NOR_GEOMETRY((_sector_size), (_n_sectors), 1),
#define CAT25_INFO(_sector_size, _n_sectors, _page_size, _addr_nbytes) \ #define CAT25_INFO(_sector_size, _n_sectors, _page_size, _addr_nbytes) \
.size = (_sector_size) * (_n_sectors), \
.sector_size = (_sector_size), \ .sector_size = (_sector_size), \
.n_sectors = (_n_sectors), \
.page_size = (_page_size), \ .page_size = (_page_size), \
.n_banks = 1, \ .n_banks = 1, \
.addr_nbytes = (_addr_nbytes), \ .addr_nbytes = (_addr_nbytes), \
......
...@@ -34,17 +34,18 @@ static u8 spi_nor_get_sr_tb_mask(struct spi_nor *nor) ...@@ -34,17 +34,18 @@ static u8 spi_nor_get_sr_tb_mask(struct spi_nor *nor)
static u64 spi_nor_get_min_prot_length_sr(struct spi_nor *nor) static u64 spi_nor_get_min_prot_length_sr(struct spi_nor *nor)
{ {
unsigned int bp_slots, bp_slots_needed; unsigned int bp_slots, bp_slots_needed;
unsigned int sector_size = nor->info->sector_size;
u64 n_sectors = div_u64(nor->params->size, sector_size);
u8 mask = spi_nor_get_sr_bp_mask(nor); u8 mask = spi_nor_get_sr_bp_mask(nor);
/* Reserved one for "protect none" and one for "protect all". */ /* Reserved one for "protect none" and one for "protect all". */
bp_slots = (1 << hweight8(mask)) - 2; bp_slots = (1 << hweight8(mask)) - 2;
bp_slots_needed = ilog2(nor->info->n_sectors); bp_slots_needed = ilog2(n_sectors);
if (bp_slots_needed > bp_slots) if (bp_slots_needed > bp_slots)
return nor->info->sector_size << return sector_size << (bp_slots_needed - bp_slots);
(bp_slots_needed - bp_slots);
else else
return nor->info->sector_size; return sector_size;
} }
static void spi_nor_get_locked_range_sr(struct spi_nor *nor, u8 sr, loff_t *ofs, static void spi_nor_get_locked_range_sr(struct spi_nor *nor, u8 sr, loff_t *ofs,
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
#define S3AN_INFO(_jedec_id, _n_sectors, _page_size) \ #define S3AN_INFO(_jedec_id, _n_sectors, _page_size) \
SPI_NOR_ID(_jedec_id, 0), \ SPI_NOR_ID(_jedec_id, 0), \
.size = 8 * (_page_size) * (_n_sectors), \
.sector_size = (8 * (_page_size)), \ .sector_size = (8 * (_page_size)), \
.n_sectors = (_n_sectors), \
.page_size = (_page_size), \ .page_size = (_page_size), \
.n_banks = 1, \ .n_banks = 1, \
.flags = SPI_NOR_NO_FR .flags = SPI_NOR_NO_FR
...@@ -138,7 +138,7 @@ static int xilinx_nor_setup(struct spi_nor *nor, ...@@ -138,7 +138,7 @@ static int xilinx_nor_setup(struct spi_nor *nor,
page_size = (nor->params->page_size == 264) ? 256 : 512; page_size = (nor->params->page_size == 264) ? 256 : 512;
nor->params->page_size = page_size; nor->params->page_size = page_size;
nor->mtd.writebufsize = page_size; nor->mtd.writebufsize = page_size;
nor->params->size = 8 * page_size * nor->info->n_sectors; nor->params->size = nor->info->size;
nor->mtd.erasesize = 8 * page_size; nor->mtd.erasesize = 8 * page_size;
} else { } else {
/* Flash in Default addressing mode */ /* Flash in Default addressing mode */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment