Commit b94342e7 authored by Will Deacon's avatar Will Deacon Committed by Greg Kroah-Hartman

ARM: 7161/1: errata: no automatic store buffer drain

commit 11ed0ba1 upstream.

This patch implements a workaround for PL310 erratum 769419. On
revisions of the PL310 prior to r3p2, the Store Buffer does not
automatically drain. This can cause normal, non-cacheable writes to be
retained when the memory system is idle, leading to suboptimal I/O
performance for drivers using coherent DMA.

This patch adds an optional wmb() call to the cpu_idle loop. On systems
with an outer cache, this causes an explicit flush of the store buffer.
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Tested-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f8b35bff
...@@ -1332,6 +1332,18 @@ config ATAGS_PROC ...@@ -1332,6 +1332,18 @@ config ATAGS_PROC
Should the atags used to boot the kernel be exported in an "atags" Should the atags used to boot the kernel be exported in an "atags"
file in procfs. Useful with kexec. file in procfs. Useful with kexec.
config PL310_ERRATA_769419
bool "PL310 errata: no automatic Store Buffer drain"
depends on CACHE_L2X0
help
On revisions of the PL310 prior to r3p2, the Store Buffer does
not automatically drain. This can cause normal, non-cacheable
writes to be retained when the memory system is idle, leading
to suboptimal I/O performance for drivers using coherent DMA.
This option adds a write barrier to the cpu_idle loop so that,
on systems with an outer cache, the store buffer is drained
explicitly.
endmenu endmenu
menu "CPU Power Management" menu "CPU Power Management"
......
...@@ -156,6 +156,9 @@ void cpu_idle(void) ...@@ -156,6 +156,9 @@ void cpu_idle(void)
#endif #endif
local_irq_disable(); local_irq_disable();
#ifdef CONFIG_PL310_ERRATA_769419
wmb();
#endif
if (hlt_counter) { if (hlt_counter) {
local_irq_enable(); local_irq_enable();
cpu_relax(); cpu_relax();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment