arm64: zynqmp: Changed zynqmp command to handle subcommands with U_BOOT_CMD_MKENT
authorVipul Kumar <vipul.kumar@xilinx.com>
Wed, 11 Jul 2018 09:48:28 +0000 (15:18 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 19 Jul 2018 08:49:55 +0000 (10:49 +0200)
This patch changed zynqmp command to handle subcommands with
U_BOOT_CMD_MKENT.

Signed-off-by: Vipul Kumar <vipul.kumar@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
board/xilinx/zynqmp/cmds.c

index d9146532380fe54ba584bae4d9b7d48254477989..1f6a5dee1ff15a25a85e5885766de64367d78125 100644 (file)
@@ -9,24 +9,37 @@
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
 
-static int zynqmp_verify_secure(u8 *key_ptr, u8 *src_ptr, u32 len)
+static int do_zynqmp_verify_secure(cmd_tbl_t *cmdtp, int flag, int argc,
+                                  char * const argv[])
 {
+       u64 src_addr, addr;
+       u32 len, src_lo, src_hi;
+       u8 *key_ptr = NULL;
        int ret;
-       u32 src_lo, src_hi;
        u32 key_lo = 0;
        u32 key_hi = 0;
        u32 ret_payload[PAYLOAD_ARG_CNT];
-       u64 addr;
 
-       if ((ulong)src_ptr != ALIGN((ulong)src_ptr,
-                                   CONFIG_SYS_CACHELINE_SIZE)) {
-               printf("Failed: source address not aligned:%p\n", src_ptr);
+       if (argc < 4)
+               return CMD_RET_USAGE;
+
+       src_addr = simple_strtoull(argv[2], NULL, 16);
+       len = simple_strtoul(argv[3], NULL, 16);
+
+       if (argc == 5)
+               key_ptr = (uint8_t *)(uintptr_t)simple_strtoull(argv[4],
+                                                               NULL, 16);
+
+       if ((ulong)src_addr != ALIGN((ulong)src_addr,
+                                    CONFIG_SYS_CACHELINE_SIZE)) {
+               printf("Failed: source address not aligned:%lx\n",
+                      (ulong)src_addr);
                return -EINVAL;
        }
 
-       src_lo = lower_32_bits((ulong)src_ptr);
-       src_hi = upper_32_bits((ulong)src_ptr);
-       flush_dcache_range((ulong)src_ptr, (ulong)(src_ptr + len));
+       src_lo = lower_32_bits((ulong)src_addr);
+       src_hi = upper_32_bits((ulong)src_addr);
+       flush_dcache_range((ulong)src_addr, (ulong)(src_addr + len));
 
        if (key_ptr) {
                key_lo = lower_32_bits((ulong)key_ptr);
@@ -48,6 +61,10 @@ static int zynqmp_verify_secure(u8 *key_ptr, u8 *src_ptr, u32 len)
        return ret;
 }
 
+static cmd_tbl_t cmd_zynqmp_sub[] = {
+       U_BOOT_CMD_MKENT(secure, 5, 0, do_zynqmp_verify_secure, "", ""),
+};
+
 /**
  * do_zynqmp - Handle the "zynqmp" command-line command
  * @cmdtp:     Command data struct pointer
@@ -62,30 +79,18 @@ static int zynqmp_verify_secure(u8 *key_ptr, u8 *src_ptr, u32 len)
 static int do_zynqmp(cmd_tbl_t *cmdtp, int flag, int argc,
                     char *const argv[])
 {
-       u64 src_addr;
-       u32 len;
-       u8 *key_ptr = NULL;
-       u8 *src_ptr;
-       int ret;
+       cmd_tbl_t *c;
 
-       if (argc > 5 || argc < 4 || strncmp(argv[1], "secure", 6))
+       if (argc < 2)
                return CMD_RET_USAGE;
 
-       src_addr = simple_strtoull(argv[2], NULL, 16);
-
-       len = simple_strtoul(argv[3], NULL, 16);
-
-       if (argc > 4)
-               key_ptr = (uint8_t *)(uintptr_t)simple_strtoull(argv[4],
-                                                               NULL, 16);
-
-       src_ptr = (uint8_t *)(uintptr_t)src_addr;
+       c = find_cmd_tbl(argv[1], &cmd_zynqmp_sub[0],
+                        ARRAY_SIZE(cmd_zynqmp_sub));
 
-       ret = zynqmp_verify_secure(key_ptr, src_ptr, len);
-       if (ret)
-               return CMD_RET_FAILURE;
-
-       return CMD_RET_SUCCESS;
+       if (c)
+               return c->cmd(c, flag, argc, argv);
+       else
+               return CMD_RET_USAGE;
 }
 
 /***************************************************/
@@ -99,6 +104,6 @@ static char zynqmp_help_text[] =
 
 U_BOOT_CMD(
        zynqmp, 5, 1, do_zynqmp,
-       "Verify and load secure images",
+       "ZynqMP sub-system",
        zynqmp_help_text
 )