mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
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:
parent
177e506952
commit
43bacbe6ab
2 changed files with 10 additions and 1 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue