arm64: zynqmp: Changed zynqmp command to handle subcommands with U_BOOT_CMD_MKENT

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>
This commit is contained in:
Vipul Kumar 2018-07-11 15:18:28 +05:30 committed by Michal Simek
parent 10441ec922
commit 8c258e6245

View File

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