fsl/deepsleep: avoid the DDR restore from being optimized out
authorTang Yuantian <Yuantian.Tang@freescale.com>
Mon, 20 Apr 2015 03:16:56 +0000 (11:16 +0800)
committerYork Sun <yorksun@freescale.com>
Mon, 4 May 2015 16:25:06 +0000 (09:25 -0700)
Function dp_ddr_restore is to restore the first 128-byte space
of DDR. However those codes may be optimized out by compiler
since the destination address is at 0x0. In order to avoid
compiler optimization, we restore the space from high address,
which is not at 0x0, to low address.

Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
Reviewed-by: York Sun <yorksun@freescale.com>
board/freescale/common/mpc85xx_sleep.c

index 9e4132c64edc21437f59056b7c2ca4b8ba606071..e9cbd515a152cfd530c28a0e91b6e9ed384149a0 100644 (file)
@@ -43,16 +43,16 @@ void fsl_dp_disable_console(void)
  */
 static void dp_ddr_restore(void)
 {
-       volatile u64 *src, *dst;
+       u64 *src, *dst;
        int i;
        struct ccsr_scfg __iomem *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG;
 
        /* get the address of ddr date from SPARECR3 */
-       src = (u64 *)in_be32(&scfg->sparecr[2]);
-       dst = (u64 *)CONFIG_SYS_SDRAM_BASE;
+       src = (u64 *)(in_be32(&scfg->sparecr[2]) + DDR_BUFF_LEN - 8);
+       dst = (u64 *)(CONFIG_SYS_SDRAM_BASE + DDR_BUFF_LEN - 8);
 
        for (i = 0; i < DDR_BUFF_LEN / 8; i++)
-               *dst++ = *src++;
+               *dst-- = *src--;
 
        flush_dcache();
 }