All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] mtd: cfi_flash: read device tree correctly
@ 2020-07-21  2:51 Heinrich Schuchardt
  2020-07-22  6:21 ` Stefan Roese
       [not found] ` <752D002CFF5D0F4FA35C0100F1D73F3FA472AD72@ATCPCS16.andestech.com>
  0 siblings, 2 replies; 7+ messages in thread
From: Heinrich Schuchardt @ 2020-07-21  2:51 UTC (permalink / raw)
  To: u-boot

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.glpk@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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-07-26 14:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-21  2:51 [PATCH 1/1] mtd: cfi_flash: read device tree correctly Heinrich Schuchardt
2020-07-22  6:21 ` Stefan Roese
2020-07-22  7:34   ` Heinrich Schuchardt
     [not found] ` <752D002CFF5D0F4FA35C0100F1D73F3FA472AD72@ATCPCS16.andestech.com>
2020-07-24  9:14   ` Rick Chen
2020-07-24 16:34     ` Heinrich Schuchardt
2020-07-25 11:46       ` Stefan Roese
2020-07-26 14:54         ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.