Commit 6d5068f4 authored by Catalin Marinas's avatar Catalin Marinas

Only allow safe cache configurations on ARMv6 and later

Currently, Linux doesn't generate correct page tables for ARMv6 and
later cores if the cache policy is different from the default one (it
may lead to strongly ordered or shared device mappings). This patch
disallows cache policies other than writeback and the
CPU_[ID]CACHE_DISABLE options only affect the CP15 system control
register rather than the page tables.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent bd46bbe7
...@@ -627,7 +627,7 @@ config CPU_DCACHE_SIZE ...@@ -627,7 +627,7 @@ config CPU_DCACHE_SIZE
config CPU_DCACHE_WRITETHROUGH config CPU_DCACHE_WRITETHROUGH
bool "Force write through D-cache" bool "Force write through D-cache"
depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_V6) && !CPU_DCACHE_DISABLE depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020) && !CPU_DCACHE_DISABLE
default y if CPU_ARM925T default y if CPU_ARM925T
help help
Say Y here to use the data cache in writethrough mode. Unless you Say Y here to use the data cache in writethrough mode. Unless you
......
...@@ -114,6 +114,10 @@ static void __init early_cachepolicy(char **p) ...@@ -114,6 +114,10 @@ static void __init early_cachepolicy(char **p)
} }
if (i == ARRAY_SIZE(cache_policies)) if (i == ARRAY_SIZE(cache_policies))
printk(KERN_ERR "ERROR: unknown or unsupported cache policy\n"); printk(KERN_ERR "ERROR: unknown or unsupported cache policy\n");
if (cpu_architecture() >= CPU_ARCH_ARMv6) {
printk(KERN_WARNING "Only cachepolicy=writeback supported on ARMv6 and later\n");
cachepolicy = CPOLICY_WRITEBACK;
}
flush_cache_all(); flush_cache_all();
set_cr(cr_alignment); set_cr(cr_alignment);
} }
...@@ -248,13 +252,15 @@ static void __init build_mem_type_table(void) ...@@ -248,13 +252,15 @@ static void __init build_mem_type_table(void)
int cpu_arch = cpu_architecture(); int cpu_arch = cpu_architecture();
int i; int i;
if (cpu_arch < CPU_ARCH_ARMv6) {
#if defined(CONFIG_CPU_DCACHE_DISABLE) #if defined(CONFIG_CPU_DCACHE_DISABLE)
if (cachepolicy > CPOLICY_BUFFERED) if (cachepolicy > CPOLICY_BUFFERED)
cachepolicy = CPOLICY_BUFFERED; cachepolicy = CPOLICY_BUFFERED;
#elif defined(CONFIG_CPU_DCACHE_WRITETHROUGH) #elif defined(CONFIG_CPU_DCACHE_WRITETHROUGH)
if (cachepolicy > CPOLICY_WRITETHROUGH) if (cachepolicy > CPOLICY_WRITETHROUGH)
cachepolicy = CPOLICY_WRITETHROUGH; cachepolicy = CPOLICY_WRITETHROUGH;
#endif #endif
}
if (cpu_arch < CPU_ARCH_ARMv5) { if (cpu_arch < CPU_ARCH_ARMv5) {
if (cachepolicy >= CPOLICY_WRITEALLOC) if (cachepolicy >= CPOLICY_WRITEALLOC)
cachepolicy = CPOLICY_WRITEBACK; cachepolicy = CPOLICY_WRITEBACK;
......
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