Hi Heinrich > From: U-Boot [mailto:u-boot-boun...@lists.denx.de] On Behalf Of Heinrich > Schuchardt > Sent: Tuesday, July 21, 2020 10:51 AM > To: Stefan Roese > Cc: Simon Glass; u-boot@lists.denx.de; Heinrich Schuchardt > Subject: [PATCH 1/1] mtd: cfi_flash: read device tree correctly > > dev_read_size_cells() and dev_read_addr_cells() do not walk up the device > tree to find the number of cells. On error they return 1 and 2 respectively. > On qemu_arm64_defconfig this leads to the incorrect detection of address of > the second flash bank as 0x400000000000000 instead of 0x4000000. > > When running > > qemu-system-aarch64 -machine virt -bios u-boot.bin \ > -cpu cortex-a53 -nographic \ > -drive if=pflash,format=raw,index=1,file=envstore.img > > the command 'saveenv' fails with > > Saving Environment to Flash... Error: start and/or end address not on > sector boundary > Error: start and/or end address not on sector boundary > Failed (1) > > due to this incorrect address. > > Use function fdtdec_get_addr_size_auto_noparent() to read the array of flash > banks from the device tree. > > Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de> > --- > drivers/mtd/cfi_flash.c | 20 ++++++++------------ > 1 file changed, 8 insertions(+), 12 deletions(-) > > diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index > b7289ba539..dfa104bcf0 100644 > --- a/drivers/mtd/cfi_flash.c > +++ b/drivers/mtd/cfi_flash.c > @@ -2469,28 +2469,24 @@ unsigned long flash_init(void) static int > cfi_flash_probe(struct udevice *dev) { > const fdt32_t *cell; > - int addrc, sizec; > - int len, idx; > - > - addrc = dev_read_addr_cells(dev); > - sizec = dev_read_size_cells(dev); > + int len; > > /* decode regs; there may be multiple reg tuples. */ > cell = dev_read_prop(dev, "reg", &len); > if (!cell) > return -ENOENT; > - idx = 0; > - len /= sizeof(fdt32_t); > - while (idx < len) { > + > + for (cfi_flash_num_flash_banks = 0; ; ++cfi_flash_num_flash_banks) { > phys_addr_t addr; > > - addr = dev_translate_address(dev, cell + idx); > + addr = fdtdec_get_addr_size_auto_noparent( > + gd->fdt_blob, dev_of_offset(dev), "reg", > + cfi_flash_num_flash_banks, NULL, false); > + if (addr == FDT_ADDR_T_NONE) > + break; > > flash_info[cfi_flash_num_flash_banks].dev = dev; > flash_info[cfi_flash_num_flash_banks].base = addr; > - cfi_flash_num_flash_banks++; > - > - idx += addrc + sizec; > } > gd->bd->bi_flashstart = flash_info[0].base; > > -- > 2.27.0 >
This patch remind me that I have encounter flash bank detection problem on AE350 platform a period time ago. And have commit a patch to work around this problem as below: commit cca8b1e5b20cdab7299a5ee7139e70783f73ccdf riscv: dts: Add #address-cells and #size-cells in nor node Those are required for cfi-flash driver to get correct address information. Also modify size description correctly. With this patch, there is unnecessary to re-declaration address-cells and size-cells in nor node indeed. Tested-by: Rick Chen <r...@andestech.com> Thanks, Rick