]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
xilinx: zynqmp: Add support for runtime dfu_alt_info setup
authorMichal Simek <michal.simek@xilinx.com>
Tue, 27 Jul 2021 14:19:18 +0000 (16:19 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 6 Aug 2021 07:32:02 +0000 (09:32 +0200)
The main reason for this to be implemented is capsule update.
Two memories are supported and tested which is MMC FAT based and QSPI
based.

For creating capsule these commands are used:
./tools/mkeficapsule --raw spl/boot.bin --index 1 capsule1.bin
./tools/mkeficapsule --raw u-boot.itb --index 2 capsule2.bin

Then transfer to SD card where these commands run:
load mmc 0 10000000 capsule1.bin
efidebug capsule update -v 10000000
load mmc 0 10000000 capsule2.bin
efidebug capsule update -v 10000000

Depends on the boot device used are binaries loaded to qspi or mmc fat
partition.
Also multiboot register is handled to make sure that the same location(id)
is used as image which is upgraded.

Two locations are used by purpose for SPL flow. If only boot.bin is used
create only one capsule.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
board/xilinx/zynqmp/zynqmp.c
configs/xilinx_zynqmp_virt_defconfig

index 1b0356c84c5c524e876bf8b180dfec6313a3b593..27bb2b056c588d3a552a4092827903e5821311b9 100644 (file)
@@ -8,6 +8,7 @@
 #include <command.h>
 #include <cpu_func.h>
 #include <debug_uart.h>
+#include <dfu.h>
 #include <env.h>
 #include <env_internal.h>
 #include <init.h>
@@ -19,6 +20,7 @@
 #include <ahci.h>
 #include <scsi.h>
 #include <malloc.h>
+#include <memalign.h>
 #include <wdt.h>
 #include <asm/arch/clk.h>
 #include <asm/arch/hardware.h>
@@ -818,3 +820,55 @@ enum env_location env_get_location(enum env_operation op, int prio)
                return ENVL_NOWHERE;
        }
 }
+
+#if defined(CONFIG_SET_DFU_ALT_INFO)
+
+#define DFU_ALT_BUF_LEN                SZ_1K
+
+void set_dfu_alt_info(char *interface, char *devstr)
+{
+       u8 multiboot;
+       int bootseq = 0;
+
+       ALLOC_CACHE_ALIGN_BUFFER(char, buf, DFU_ALT_BUF_LEN);
+
+       if (env_get("dfu_alt_info"))
+               return;
+
+       memset(buf, 0, sizeof(buf));
+
+       multiboot = multi_boot();
+       debug("Multiboot: %d\n", multiboot);
+
+       switch (zynqmp_get_bootmode()) {
+       case EMMC_MODE:
+       case SD_MODE:
+       case SD1_LSHFT_MODE:
+       case SD_MODE1:
+               bootseq = mmc_get_env_dev();
+               if (!multiboot)
+                       snprintf(buf, DFU_ALT_BUF_LEN,
+                                "mmc %d:1=boot.bin fat %d 1;"
+                                "u-boot.itb fat %d 1",
+                                bootseq, bootseq, bootseq);
+               else
+                       snprintf(buf, DFU_ALT_BUF_LEN,
+                                "mmc %d:1=boot%04d.bin fat %d 1;"
+                                "u-boot.itb fat %d 1",
+                                bootseq, multiboot, bootseq, bootseq);
+               break;
+       case QSPI_MODE_24BIT:
+       case QSPI_MODE_32BIT:
+               snprintf(buf, DFU_ALT_BUF_LEN,
+                        "sf 0:0=boot.bin raw %x 0x1500000;"
+                        "u-boot.itb raw 0x%x 0x500000",
+                        multiboot * SZ_32K, CONFIG_SYS_SPI_U_BOOT_OFFS);
+               break;
+       default:
+               return;
+       }
+
+       env_set("dfu_alt_info", buf);
+       puts("DFU alt info setting: done\n");
+}
+#endif
index 73972a0dc9a2ce21701f8e6ff27c7b89868d69c8..40a87ca9044a4285117f57bb7a87949c994cfef3 100644 (file)
@@ -94,6 +94,7 @@ CONFIG_DFU_NAND=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
 CONFIG_DFU_MTD=y
+CONFIG_SET_DFU_ALT_INFO=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x1800000
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_FLASH=y