Commit 35133692 authored by Chris Dearman's avatar Chris Dearman Committed by Ralf Baechle

[MIPS] Allow setting of the cache attribute at run time.

Slightly tacky, but there is a precedent in the sparc archirecture code.
Signed-off-by: default avatarChris Dearman <chris@mips.com>
Signed-off-by: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent bec50527
...@@ -73,14 +73,4 @@ config RUNTIME_DEBUG ...@@ -73,14 +73,4 @@ config RUNTIME_DEBUG
include/asm-mips/debug.h for debuging macros. include/asm-mips/debug.h for debuging macros.
If unsure, say N. If unsure, say N.
config MIPS_UNCACHED
bool "Run uncached"
depends on DEBUG_KERNEL && !SMP && !SGI_IP27
help
If you say Y here there kernel will disable all CPU caches. This will
reduce the system's performance dramatically but can help finding
otherwise hard to track bugs. It can also useful if you're doing
hardware debugging with a logic analyzer and need to see all traffic
on the bus.
endmenu endmenu
...@@ -641,7 +641,6 @@ CONFIG_CROSSCOMPILE=y ...@@ -641,7 +641,6 @@ CONFIG_CROSSCOMPILE=y
CONFIG_CMDLINE="nfsroot=192.168.192.169:/u1/mipsel,timeo=20 ip=dhcp" CONFIG_CMDLINE="nfsroot=192.168.192.169:/u1/mipsel,timeo=20 ip=dhcp"
# CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_RUNTIME_DEBUG is not set # CONFIG_RUNTIME_DEBUG is not set
# CONFIG_MIPS_UNCACHED is not set
# #
# Security options # Security options
......
...@@ -1223,7 +1223,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp" ...@@ -1223,7 +1223,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
# CONFIG_KGDB is not set # CONFIG_KGDB is not set
CONFIG_SYS_SUPPORTS_KGDB=y CONFIG_SYS_SUPPORTS_KGDB=y
# CONFIG_RUNTIME_DEBUG is not set # CONFIG_RUNTIME_DEBUG is not set
# CONFIG_MIPS_UNCACHED is not set
# #
# Security options # Security options
......
...@@ -1213,7 +1213,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp" ...@@ -1213,7 +1213,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
# CONFIG_KGDB is not set # CONFIG_KGDB is not set
CONFIG_SYS_SUPPORTS_KGDB=y CONFIG_SYS_SUPPORTS_KGDB=y
# CONFIG_RUNTIME_DEBUG is not set # CONFIG_RUNTIME_DEBUG is not set
# CONFIG_MIPS_UNCACHED is not set
# #
# Security options # Security options
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/module.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <asm/bcache.h> #include <asm/bcache.h>
...@@ -1216,9 +1217,25 @@ void au1x00_fixup_config_od(void) ...@@ -1216,9 +1217,25 @@ void au1x00_fixup_config_od(void)
} }
} }
static int __cpuinitdata cca = -1;
static int __init cca_setup(char *str)
{
get_option(&str, &cca);
return 1;
}
__setup("cca=", cca_setup);
static void __cpuinit coherency_setup(void) static void __cpuinit coherency_setup(void)
{ {
change_c0_config(CONF_CM_CMASK, CONF_CM_DEFAULT); if (cca < 0 || cca > 7)
cca = read_c0_config() & CONF_CM_CMASK;
_page_cachable_default = cca << _CACHE_SHIFT;
pr_debug("Using cache attribute %d\n", cca);
change_c0_config(CONF_CM_CMASK, cca);
/* /*
* c0_status.cu=0 specifies that updates by the sc instruction use * c0_status.cu=0 specifies that updates by the sc instruction use
......
...@@ -130,8 +130,28 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, ...@@ -130,8 +130,28 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address,
} }
} }
static char cache_panic[] __cpuinitdata = unsigned long _page_cachable_default;
"Yeee, unsupported cache architecture."; EXPORT_SYMBOL_GPL(_page_cachable_default);
static inline void setup_protection_map(void)
{
protection_map[0] = PAGE_NONE;
protection_map[1] = PAGE_READONLY;
protection_map[2] = PAGE_COPY;
protection_map[3] = PAGE_COPY;
protection_map[4] = PAGE_READONLY;
protection_map[5] = PAGE_READONLY;
protection_map[6] = PAGE_COPY;
protection_map[7] = PAGE_COPY;
protection_map[8] = PAGE_NONE;
protection_map[9] = PAGE_READONLY;
protection_map[10] = PAGE_SHARED;
protection_map[11] = PAGE_SHARED;
protection_map[12] = PAGE_READONLY;
protection_map[13] = PAGE_READONLY;
protection_map[14] = PAGE_SHARED;
protection_map[15] = PAGE_SHARED;
}
void __devinit cpu_cache_init(void) void __devinit cpu_cache_init(void)
{ {
...@@ -139,34 +159,29 @@ void __devinit cpu_cache_init(void) ...@@ -139,34 +159,29 @@ void __devinit cpu_cache_init(void)
extern void __weak r3k_cache_init(void); extern void __weak r3k_cache_init(void);
r3k_cache_init(); r3k_cache_init();
return;
} }
if (cpu_has_6k_cache) { if (cpu_has_6k_cache) {
extern void __weak r6k_cache_init(void); extern void __weak r6k_cache_init(void);
r6k_cache_init(); r6k_cache_init();
return;
} }
if (cpu_has_4k_cache) { if (cpu_has_4k_cache) {
extern void __weak r4k_cache_init(void); extern void __weak r4k_cache_init(void);
r4k_cache_init(); r4k_cache_init();
return;
} }
if (cpu_has_8k_cache) { if (cpu_has_8k_cache) {
extern void __weak r8k_cache_init(void); extern void __weak r8k_cache_init(void);
r8k_cache_init(); r8k_cache_init();
return;
} }
if (cpu_has_tx39_cache) { if (cpu_has_tx39_cache) {
extern void __weak tx39_cache_init(void); extern void __weak tx39_cache_init(void);
tx39_cache_init(); tx39_cache_init();
return;
} }
panic(cache_panic); setup_protection_map();
} }
int __weak __uncached_access(struct file *file, unsigned long addr) int __weak __uncached_access(struct file *file, unsigned long addr)
......
...@@ -53,8 +53,8 @@ void __init board_setup(void) ...@@ -53,8 +53,8 @@ void __init board_setup(void)
/* clear all three cache coherency fields */ /* clear all three cache coherency fields */
config0 &= ~(0x7 | (7<<25) | (7<<28)); config0 &= ~(0x7 | (7<<25) | (7<<28));
config0 |= (CONF_CM_DEFAULT | (CONF_CM_DEFAULT<<25) | config0 |= (_page_cachable_default >> _CACHE_SHIFT) |
(CONF_CM_DEFAULT<<28)); (CONF_CM_DEFAULT << 25) | (CONF_CM_DEFAULT << 28);
write_c0_config(config0); write_c0_config(config0);
BARRIER; BARRIER;
......
...@@ -39,8 +39,8 @@ void __init board_setup(void) ...@@ -39,8 +39,8 @@ void __init board_setup(void)
/* clear all three cache coherency fields */ /* clear all three cache coherency fields */
config0 &= ~(0x7 | (7<<25) | (7<<28)); config0 &= ~(0x7 | (7<<25) | (7<<28));
config0 |= (CONF_CM_DEFAULT | (CONF_CM_DEFAULT<<25) | config0 |= (_page_cachable_default >> _CACHE_SHIFT) |
(CONF_CM_DEFAULT<<28)); (CONF_CM_DEFAULT << 25) | (CONF_CM_DEFAULT << 28);
write_c0_config(config0); write_c0_config(config0);
configpr = read_c0_config7(); configpr = read_c0_config7();
......
...@@ -273,7 +273,7 @@ static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size, ...@@ -273,7 +273,7 @@ static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size,
* memory-like regions on I/O busses. * memory-like regions on I/O busses.
*/ */
#define ioremap_cachable(offset, size) \ #define ioremap_cachable(offset, size) \
__ioremap_mode((offset), (size), PAGE_CACHABLE_DEFAULT) __ioremap_mode((offset), (size), _page_cachable_default)
/* /*
* These two are MIPS specific ioremap variant. ioremap_cacheable_cow * These two are MIPS specific ioremap variant. ioremap_cacheable_cow
......
...@@ -134,18 +134,6 @@ ...@@ -134,18 +134,6 @@
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED | _CACHE_MASK) #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED | _CACHE_MASK)
#ifdef CONFIG_MIPS_UNCACHED
#define PAGE_CACHABLE_DEFAULT _CACHE_UNCACHED
#elif defined(CONFIG_DMA_NONCOHERENT)
#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
#elif defined(CONFIG_CPU_RM9000)
#define PAGE_CACHABLE_DEFAULT _CACHE_CWB
#elif defined(CONFIG_SOC_AU1X00)
#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
#else
#define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_COW
#endif
#define CONF_CM_DEFAULT (PAGE_CACHABLE_DEFAULT>>_CACHE_SHIFT) #define CONF_CM_DEFAULT (PAGE_CACHABLE_DEFAULT>>_CACHE_SHIFT)
#endif /* _ASM_PGTABLE_BITS_H */ #endif /* _ASM_PGTABLE_BITS_H */
...@@ -23,15 +23,15 @@ struct vm_area_struct; ...@@ -23,15 +23,15 @@ struct vm_area_struct;
#define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT)
#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
PAGE_CACHABLE_DEFAULT) _page_cachable_default)
#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | \ #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | \
PAGE_CACHABLE_DEFAULT) _page_cachable_default)
#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | \ #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | \
PAGE_CACHABLE_DEFAULT) _page_cachable_default)
#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
_PAGE_GLOBAL | PAGE_CACHABLE_DEFAULT) _PAGE_GLOBAL | _page_cachable_default)
#define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ #define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
PAGE_CACHABLE_DEFAULT) _page_cachable_default)
#define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \
__WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED) __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED)
...@@ -40,23 +40,30 @@ struct vm_area_struct; ...@@ -40,23 +40,30 @@ struct vm_area_struct;
* read. Also, write permissions imply read permissions. This is the closest * read. Also, write permissions imply read permissions. This is the closest
* we can get by reasonable means.. * we can get by reasonable means..
*/ */
#define __P000 PAGE_NONE
#define __P001 PAGE_READONLY /*
#define __P010 PAGE_COPY * Dummy values to fill the table in mmap.c
#define __P011 PAGE_COPY * The real values will be generated at runtime
#define __P100 PAGE_READONLY */
#define __P101 PAGE_READONLY #define __P000 __pgprot(0)
#define __P110 PAGE_COPY #define __P001 __pgprot(0)
#define __P111 PAGE_COPY #define __P010 __pgprot(0)
#define __P011 __pgprot(0)
#define __S000 PAGE_NONE #define __P100 __pgprot(0)
#define __S001 PAGE_READONLY #define __P101 __pgprot(0)
#define __S010 PAGE_SHARED #define __P110 __pgprot(0)
#define __S011 PAGE_SHARED #define __P111 __pgprot(0)
#define __S100 PAGE_READONLY
#define __S101 PAGE_READONLY #define __S000 __pgprot(0)
#define __S110 PAGE_SHARED #define __S001 __pgprot(0)
#define __S111 PAGE_SHARED #define __S010 __pgprot(0)
#define __S011 __pgprot(0)
#define __S100 __pgprot(0)
#define __S101 __pgprot(0)
#define __S110 __pgprot(0)
#define __S111 __pgprot(0)
extern unsigned long _page_cachable_default;
/* /*
* ZERO_PAGE is a global shared page that is always zero; used * ZERO_PAGE is a global shared page that is always zero; used
......
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