提交 f322ad60 编写于 作者: S Siva Durga Prasad Paladugu 提交者: Michal Simek

arm64: zynqmp: mp: Correct the R5 release sequence

This patch corrects the R5 release sequence by adding the
below steps.
1. Flush dcache to ensure that image loaded into memory.
2. Keep R5 reset just to ensure R5 in reset.
3. Disable caches before accessing TCM as with out this
   A53 can do speculative and may result in ECC failures
   if TCM's are not initialized. So, it is always better
   to disable dcaches before accessing TCM and enable back.
Signed-off-by: NSiva Durga Prasad Paladugu <sivadur@xilinx.com>
Reported-by: NJohn Linn <linnj@xilinx.com>
Signed-off-by: NMichal Simek <michal.simek@xilinx.com>
上级 62e950fa
...@@ -257,22 +257,36 @@ int cpu_release(int nr, int argc, char * const argv[]) ...@@ -257,22 +257,36 @@ int cpu_release(int nr, int argc, char * const argv[])
boot_addr = ZYNQMP_R5_LOVEC_ADDR; boot_addr = ZYNQMP_R5_LOVEC_ADDR;
} }
/*
* Since we don't know where the user may have loaded the image
* for an R5 we have to flush all the data cache to ensure
* the R5 sees it.
*/
flush_dcache_all();
if (!strncmp(argv[1], "lockstep", 8)) { if (!strncmp(argv[1], "lockstep", 8)) {
printf("R5 lockstep mode\n"); printf("R5 lockstep mode\n");
set_r5_reset(LOCK);
set_r5_tcm_mode(LOCK); set_r5_tcm_mode(LOCK);
set_r5_halt_mode(HALT, LOCK); set_r5_halt_mode(HALT, LOCK);
set_r5_start(boot_addr); set_r5_start(boot_addr);
enable_clock_r5(); enable_clock_r5();
release_r5_reset(LOCK); release_r5_reset(LOCK);
dcache_disable();
write_tcm_boot_trampoline(boot_addr_uniq); write_tcm_boot_trampoline(boot_addr_uniq);
dcache_enable();
set_r5_halt_mode(RELEASE, LOCK); set_r5_halt_mode(RELEASE, LOCK);
} else if (!strncmp(argv[1], "split", 5)) { } else if (!strncmp(argv[1], "split", 5)) {
printf("R5 split mode\n"); printf("R5 split mode\n");
set_r5_reset(SPLIT);
set_r5_tcm_mode(SPLIT); set_r5_tcm_mode(SPLIT);
set_r5_halt_mode(HALT, SPLIT); set_r5_halt_mode(HALT, SPLIT);
set_r5_start(boot_addr);
enable_clock_r5(); enable_clock_r5();
release_r5_reset(SPLIT); release_r5_reset(SPLIT);
dcache_disable();
write_tcm_boot_trampoline(boot_addr_uniq); write_tcm_boot_trampoline(boot_addr_uniq);
dcache_enable();
set_r5_halt_mode(RELEASE, SPLIT); set_r5_halt_mode(RELEASE, SPLIT);
} else { } else {
printf("Unsupported mode\n"); printf("Unsupported mode\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册