Commit 91dfc423 authored by Guenter Roeck's avatar Guenter Roeck Committed by Ralf Baechle

MIPS: 64-bit: Detect virtual memory size

Linux kernel 2.6.32 and later allocate address space from the top of the
kernel virtual memory address space.

This patch implements virtual memory size detection for 64 bit MIPS CPUs
to avoid resulting crashes.
Signed-off-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
Cc: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/935/Reviewed-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent ba284b1f
...@@ -191,6 +191,9 @@ ...@@ -191,6 +191,9 @@
# ifndef cpu_has_64bit_addresses # ifndef cpu_has_64bit_addresses
# define cpu_has_64bit_addresses 0 # define cpu_has_64bit_addresses 0
# endif # endif
# ifndef cpu_vmbits
# define cpu_vmbits 31
# endif
#endif #endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
...@@ -209,6 +212,10 @@ ...@@ -209,6 +212,10 @@
# ifndef cpu_has_64bit_addresses # ifndef cpu_has_64bit_addresses
# define cpu_has_64bit_addresses 1 # define cpu_has_64bit_addresses 1
# endif # endif
# ifndef cpu_vmbits
# define cpu_vmbits cpu_data[0].vmbits
# define __NEED_VMBITS_PROBE
# endif
#endif #endif
#if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint) #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
......
...@@ -58,6 +58,9 @@ struct cpuinfo_mips { ...@@ -58,6 +58,9 @@ struct cpuinfo_mips {
struct cache_desc tcache; /* Tertiary/split secondary cache */ struct cache_desc tcache; /* Tertiary/split secondary cache */
int srsets; /* Shadow register sets */ int srsets; /* Shadow register sets */
int core; /* physical core number */ int core; /* physical core number */
#ifdef CONFIG_64BIT
int vmbits; /* Virtual memory size in bits */
#endif
#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC) #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
/* /*
* In the MIPS MT "SMTC" model, each TC is considered * In the MIPS MT "SMTC" model, each TC is considered
......
...@@ -110,7 +110,9 @@ ...@@ -110,7 +110,9 @@
#define VMALLOC_START MAP_BASE #define VMALLOC_START MAP_BASE
#define VMALLOC_END \ #define VMALLOC_END \
(VMALLOC_START + \ (VMALLOC_START + \
PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32)) min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
(1UL << cpu_vmbits)) - (1UL << 32))
#if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \ #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
VMALLOC_START != CKSSEG VMALLOC_START != CKSSEG
/* Load modules into 32bit-compatible segment. */ /* Load modules into 32bit-compatible segment. */
......
...@@ -284,6 +284,15 @@ static inline int __cpu_has_fpu(void) ...@@ -284,6 +284,15 @@ static inline int __cpu_has_fpu(void)
return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
} }
static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
{
#ifdef __NEED_VMBITS_PROBE
write_c0_entryhi(0x3ffffffffffff000ULL);
back_to_back_c0_hazard();
c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
#endif
}
#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
| MIPS_CPU_COUNTER) | MIPS_CPU_COUNTER)
...@@ -969,6 +978,8 @@ __cpuinit void cpu_probe(void) ...@@ -969,6 +978,8 @@ __cpuinit void cpu_probe(void)
c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
else else
c->srsets = 1; c->srsets = 1;
cpu_probe_vmbits(c);
} }
__cpuinit void cpu_report(void) __cpuinit void cpu_report(void)
......
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