From: Peng Fan Date: Tue, 22 Nov 2016 11:41:09 +0000 (+0800) Subject: armv7: psci: cpu_off: flush D-Cache before disable D-Cache X-Git-Tag: v2017.01-rc1~159 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=fea7452c15081127e07b77e286a89d2c296f6b05;p=u-boot armv7: psci: cpu_off: flush D-Cache before disable D-Cache Before disable cache, need to first flush cache. There maybe dirty data in D-Cache before disable D-Cache. After disable D-Cache, the first store instructions in psci_v7_flush_dcache_all will directly store registers {r4-r5, r7, r9-r11, lr} to memory. If there is dirty data before disable D-Cache, psci_v7_flush_dcache_all will flush data to memory, and may overwrite the memory that hold the registers {r4-r5, r7, r9-r11, lr}. So before disable cache, first flush D-Cache. Signed-off-by: Peng Fan Cc: Albert Aribaud Cc: Chen-Yu Tsai Cc: Hans de Goede Cc: Hongbo Zhang Cc: York Sun Cc: Marc Zyngier Cc: Tom Rini --- diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S index 6a362085a6..95b962dadf 100644 --- a/arch/arm/cpu/armv7/psci.S +++ b/arch/arm/cpu/armv7/psci.S @@ -258,6 +258,10 @@ ENDPROC(psci_enable_smp) ENTRY(psci_cpu_off_common) push {lr} + bl psci_v7_flush_dcache_all + + clrex @ Why??? + mrc p15, 0, r0, c1, c0, 0 @ SCTLR bic r0, r0, #(1 << 2) @ Clear C bit mcr p15, 0, r0, c1, c0, 0 @ SCTLR