Skip to content

Commit c27bb13

Browse files
committed
mtd: spi-nor: fix erase_type array to indicate current map conf
BFPT advertises all the erase types supported by all the possible map configurations. Mask out the erase types that are not supported by the current map configuration. Backward compatibility test done on sst26vf064b. Fixes: b038e8e ("mtd: spi-nor: parse SFDP Sector Map Parameter Table") Reported-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> (cherry picked from commit dc92843) Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
1 parent 3011fe9 commit c27bb13

1 file changed

Lines changed: 29 additions & 2 deletions

File tree

drivers/mtd/spi-nor/spi-nor.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,12 +2943,13 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
29432943
const u32 *smpt)
29442944
{
29452945
struct spi_nor_erase_map *map = &nor->erase_map;
2946-
const struct spi_nor_erase_type *erase = map->erase_type;
2946+
struct spi_nor_erase_type *erase = map->erase_type;
29472947
struct spi_nor_erase_region *region;
29482948
u64 offset;
29492949
u32 region_count;
29502950
int i, j;
2951-
u8 erase_type, uniform_erase_type;
2951+
u8 uniform_erase_type, save_uniform_erase_type;
2952+
u8 erase_type, regions_erase_type;
29522953

29532954
region_count = SMPT_MAP_REGION_COUNT(*smpt);
29542955
/*
@@ -2962,6 +2963,7 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
29622963
map->regions = region;
29632964

29642965
uniform_erase_type = 0xff;
2966+
regions_erase_type = 0;
29652967
offset = 0;
29662968
/* Populate regions. */
29672969
for (i = 0; i < region_count; i++) {
@@ -2978,13 +2980,38 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
29782980
*/
29792981
uniform_erase_type &= erase_type;
29802982

2983+
/*
2984+
* regions_erase_type mask will indicate all the erase types
2985+
* supported in this configuration map.
2986+
*/
2987+
regions_erase_type |= erase_type;
2988+
29812989
offset = (region[i].offset & ~SNOR_ERASE_FLAGS_MASK) +
29822990
region[i].size;
29832991
}
29842992

2993+
save_uniform_erase_type = map->uniform_erase_type;
29852994
map->uniform_erase_type = spi_nor_sort_erase_mask(map,
29862995
uniform_erase_type);
29872996

2997+
if (!regions_erase_type) {
2998+
/*
2999+
* Roll back to the previous uniform_erase_type mask, SMPT is
3000+
* broken.
3001+
*/
3002+
map->uniform_erase_type = save_uniform_erase_type;
3003+
return -EINVAL;
3004+
}
3005+
3006+
/*
3007+
* BFPT advertises all the erase types supported by all the possible
3008+
* map configurations. Mask out the erase types that are not supported
3009+
* by the current map configuration.
3010+
*/
3011+
for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++)
3012+
if (!(regions_erase_type & BIT(erase[i].idx)))
3013+
spi_nor_set_erase_type(&erase[i], 0, 0xFF);
3014+
29883015
spi_nor_region_mark_end(&region[i - 1]);
29893016

29903017
return 0;

0 commit comments

Comments
 (0)