]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm64: zynqmp: Add new command for TCM initialization
authorSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Fri, 5 Oct 2018 09:39:05 +0000 (15:09 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 5 Oct 2018 12:41:13 +0000 (14:41 +0200)
This patch adds new zynqmp command "zynqmp tcminit mode" to
initialize TCM. TCM needs to be initialized before accessing
to avoid ECC errors. This new command helps to perform
the same. It also makes tcm_init() as global and uses it for
doing the TCM initialization.

Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv8/zynqmp/cpu.c
arch/arm/include/asm/arch-zynqmp/sys_proto.h
board/xilinx/zynqmp/cmds.c

index 57c6d17a66b532d8973a66a7ceff138091982867..55b7c55e07918096513ee6254ec0a82f0e3e4b44 100644 (file)
@@ -105,14 +105,16 @@ u64 get_page_table_size(void)
        return 0x14000;
 }
 
-#ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU
-static void tcm_init(u8 mode)
+#if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU) || defined(CONFIG_DEFINE_TCM_OCM_MMAP)
+void tcm_init(u8 mode)
 {
        puts("WARNING: Initializing TCM overwrites TCM content\n");
        initialize_tcm(mode);
        memset((void *)ZYNQMP_TCM_BASE_ADDR, 0, ZYNQMP_TCM_SIZE);
 }
+#endif
 
+#ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU
 int reserve_mmu(void)
 {
        tcm_init(TCM_LOCK);
index cd86e6e8334f4399130fd48b1207344e4fd037b4..856b08faad0abff9f97c0cb6ea0b7acb827de4e3 100644 (file)
@@ -71,5 +71,8 @@ int invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
 void initialize_tcm(bool mode);
 void mem_map_fill(void);
 int chip_id(unsigned char id);
+#if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU) || defined(CONFIG_DEFINE_TCM_OCM_MMAP)
+void tcm_init(u8 mode);
+#endif
 
 #endif /* _ASM_ARCH_SYS_PROTO_H */
index 7351c4ec0c65bb26df8b75ffbb55bf8292b1085f..83e46e73fc4e3ee6a503f6fbb76029a1c415b5a0 100644 (file)
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <memalign.h>
+#include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
 
@@ -175,11 +176,37 @@ static int do_zynqmp_aes(cmd_tbl_t *cmdtp, int flag, int argc,
        return ret;
 }
 
+#ifdef CONFIG_DEFINE_TCM_OCM_MMAP
+static int do_zynqmp_tcm_init(cmd_tbl_t *cmdtp, int flag, int argc,
+                             char * const argv[])
+{
+       u8 mode;
+
+       if (argc != cmdtp->maxargs)
+               return CMD_RET_USAGE;
+
+       mode = simple_strtoul(argv[2], NULL, 16);
+       if (mode != TCM_LOCK && mode != TCM_SPLIT) {
+               printf("Mode should be either 0(lock)/1(split)\n");
+               return CMD_RET_FAILURE;
+       }
+
+       dcache_disable();
+       tcm_init(mode);
+       dcache_enable();
+
+       return CMD_RET_SUCCESS;
+}
+#endif
+
 static cmd_tbl_t cmd_zynqmp_sub[] = {
        U_BOOT_CMD_MKENT(secure, 5, 0, do_zynqmp_verify_secure, "", ""),
        U_BOOT_CMD_MKENT(mmio_read, 3, 0, do_zynqmp_mmio_read, "", ""),
        U_BOOT_CMD_MKENT(mmio_write, 5, 0, do_zynqmp_mmio_write, "", ""),
        U_BOOT_CMD_MKENT(aes, 9, 0, do_zynqmp_aes, "", ""),
+#ifdef CONFIG_DEFINE_TCM_OCM_MMAP
+       U_BOOT_CMD_MKENT(tcminit, 3, 0, do_zynqmp_tcm_init, "", ""),
+#endif
 };
 
 /**
@@ -227,7 +254,15 @@ static char zynqmp_help_text[] =
        "       has to be used, it can be User/Device/PUF key. A value of 0\n"
        "       for KUP(user key),1 for DeviceKey and 2 for PUF key. The\n"
        "       aesop value specifies the operation which can be 0 for\n"
-       "       decrypt and 1 for encrypt operation\n";
+       "       decrypt and 1 for encrypt operation\n"
+#ifdef CONFIG_DEFINE_TCM_OCM_MMAP
+       "zynqmp tcminit  mode - Initialize the TCM with zeros. TCM needs to be\n"
+       "                       initialized before accessing to avoid ECC\n"
+       "                       errors. mode specifies in which mode TCM has\n"
+       "                       to be initialized. Supported modes will be\n"
+       "                       lock(0)/split(1)\n"
+#endif
+       ;
 #endif
 
 U_BOOT_CMD(