mtd: cfi: respect reg address length

flash_get_size() will get the flash size from the device itself and go
through all erase regions to read protection status. However, the device
mappable region (eg: devicetree reg property) might be lower than the
device full size which means that the above cycle will result in a data
bus exception. This change fixes it by reading the 'addr_size' during
probe() and also use that as one possible upper limit.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
This commit is contained in:
Nuno Sá 2023-05-11 13:19:50 +02:00 committed by Stefan Roese
parent 177e506952
commit 43bacbe6ab
2 changed files with 10 additions and 1 deletions

View file

@ -2196,6 +2196,12 @@ ulong flash_get_size(phys_addr_t base, int banknum)
/* multiply the size by the number of chips */ /* multiply the size by the number of chips */
info->size *= size_ratio; info->size *= size_ratio;
max_size = cfi_flash_bank_size(banknum); max_size = cfi_flash_bank_size(banknum);
#ifdef CONFIG_CFI_FLASH
if (max_size)
max_size = min((unsigned long)info->addr_size, max_size);
else
max_size = info->addr_size;
#endif
if (max_size && info->size > max_size) { if (max_size && info->size > max_size) {
debug("[truncated from %ldMiB]", info->size >> 20); debug("[truncated from %ldMiB]", info->size >> 20);
info->size = max_size; info->size = max_size;
@ -2492,15 +2498,17 @@ unsigned long flash_init(void)
static int cfi_flash_probe(struct udevice *dev) static int cfi_flash_probe(struct udevice *dev)
{ {
fdt_addr_t addr; fdt_addr_t addr;
fdt_size_t size;
int idx; int idx;
for (idx = 0; idx < CFI_MAX_FLASH_BANKS; idx++) { for (idx = 0; idx < CFI_MAX_FLASH_BANKS; idx++) {
addr = dev_read_addr_index(dev, idx); addr = dev_read_addr_size_index(dev, idx, &size);
if (addr == FDT_ADDR_T_NONE) if (addr == FDT_ADDR_T_NONE)
break; break;
flash_info[cfi_flash_num_flash_banks].dev = dev; flash_info[cfi_flash_num_flash_banks].dev = dev;
flash_info[cfi_flash_num_flash_banks].base = addr; flash_info[cfi_flash_num_flash_banks].base = addr;
flash_info[cfi_flash_num_flash_banks].addr_size = size;
cfi_flash_num_flash_banks++; cfi_flash_num_flash_banks++;
} }
gd->bd->bi_flashstart = flash_info[0].base; gd->bd->bi_flashstart = flash_info[0].base;

View file

@ -46,6 +46,7 @@ typedef struct {
#ifdef CONFIG_CFI_FLASH /* DM-specific parts */ #ifdef CONFIG_CFI_FLASH /* DM-specific parts */
struct udevice *dev; struct udevice *dev;
phys_addr_t base; phys_addr_t base;
phys_size_t addr_size;
#endif #endif
} flash_info_t; } flash_info_t;