Generate dfu_alt_info generation based on information from MTD partitions.
mtd_found_part() is trying to identify MTD partition which code is running
from. If partitions are not defined and location is not found it is going
to previous behavior.

Signed-off-by: Michal Simek <michal.si...@amd.com>
---

 board/xilinx/zynqmp/zynqmp.c | 52 +++++++++++++++++++++++++++++++-----
 1 file changed, 45 insertions(+), 7 deletions(-)

diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index ba49eb7be229..eee89284de9d 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -626,6 +626,31 @@ enum env_location env_get_location(enum env_operation op, 
int prio)
 
 #define DFU_ALT_BUF_LEN                SZ_1K
 
+static void mtd_found_part(u32 *base, u32 *size)
+{
+       struct mtd_info *part, *mtd;
+
+       mtd_probe_devices();
+
+       mtd = get_mtd_device_nm("nor0");
+       if (!IS_ERR_OR_NULL(mtd)) {
+               list_for_each_entry(part, &mtd->partitions, node) {
+                       debug("0x%012llx-0x%012llx : \"%s\"\n",
+                             part->offset, part->offset + part->size,
+                             part->name);
+
+                       if (*base >= part->offset &&
+                           *base < part->offset + part->size) {
+                               debug("Found my partition: %d/%s\n",
+                                     part->index, part->name);
+                               *base = part->offset;
+                               *size = part->size;
+                               break;
+                       }
+               }
+       }
+}
+
 void set_dfu_alt_info(char *interface, char *devstr)
 {
        int multiboot, bootseq = 0, len = 0;
@@ -667,15 +692,28 @@ void set_dfu_alt_info(char *interface, char *devstr)
                break;
        case QSPI_MODE_24BIT:
        case QSPI_MODE_32BIT:
-               len += snprintf(buf + len, DFU_ALT_BUF_LEN,
-                              "sf 0:0=boot.bin raw %x 0x1500000",
-                              multiboot * SZ_32K);
+               {
+                       u32 base = multiboot * SZ_32K;
+                       u32 size = 0x1500000;
+                       u32 limit = size;
+
+                       mtd_found_part(&base, &limit);
+
+#if defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
+                       size = limit;
+                       limit = CONFIG_SYS_SPI_U_BOOT_OFFS;
+#endif
+
+                       len += snprintf(buf + len, DFU_ALT_BUF_LEN,
+                                       "sf 0:0=boot.bin raw 0x%x 0x%x",
+                                       base, limit);
 #if defined(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME) && 
defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
-               len += snprintf(buf + len, DFU_ALT_BUF_LEN,
-                              ";%s raw 0x%x 0x500000",
-                              CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
-                              multiboot * SZ_32K + CONFIG_SYS_SPI_U_BOOT_OFFS);
+                       len += snprintf(buf + len, DFU_ALT_BUF_LEN,
+                                       ";%s raw 0x%x 0x%x",
+                                       CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
+                                       base + limit, size - limit);
 #endif
+               }
                break;
        default:
                return;
-- 
2.36.1

Reply via email to