MIPS: c-r4k: Add r4k_blast_scache_node for Loongson-3
For multi-node Loongson-3 (NUMA configuration), r4k_blast_scache() can only flush Node-0's scache. So we add r4k_blast_scache_node() by using (CAC_BASE | (node_id << NODE_ADDRSPACE_SHIFT)) instead of CKSEG0 as the start address. Signed-off-by: Huacai Chen <chenhc@lemote.com> [paul.burton@mips.com: Include asm/mmzone.h from asm/r4kcache.h for nid_to_addrbase(). Add asm/mach-generic/mmzone.h to allow inclusion for all platforms.] Signed-off-by: Paul Burton <paul.burton@mips.com> Patchwork: https://patchwork.linux-mips.org/patch/21129/ Cc: Ralf Baechle <ralf@linux-mips.org> Cc: James Hogan <james.hogan@mips.com> Cc: Steven J . Hill <Steven.Hill@cavium.com> Cc: linux-mips@linux-mips.org Cc: Fuxin Zhang <zhangfx@lemote.com> Cc: Zhangjin Wu <wuzhangjin@gmail.com> Cc: <stable@vger.kernel.org> # 3.15+
This commit is contained in:

gecommit door
Paul Burton

bovenliggende
1e35918ad9
commit
bb53fdf395
@@ -459,11 +459,28 @@ static void r4k_blast_scache_setup(void)
|
||||
r4k_blast_scache = blast_scache128;
|
||||
}
|
||||
|
||||
static void (*r4k_blast_scache_node)(long node);
|
||||
|
||||
static void r4k_blast_scache_node_setup(void)
|
||||
{
|
||||
unsigned long sc_lsize = cpu_scache_line_size();
|
||||
|
||||
if (current_cpu_type() != CPU_LOONGSON3)
|
||||
r4k_blast_scache_node = (void *)cache_noop;
|
||||
else if (sc_lsize == 16)
|
||||
r4k_blast_scache_node = blast_scache16_node;
|
||||
else if (sc_lsize == 32)
|
||||
r4k_blast_scache_node = blast_scache32_node;
|
||||
else if (sc_lsize == 64)
|
||||
r4k_blast_scache_node = blast_scache64_node;
|
||||
else if (sc_lsize == 128)
|
||||
r4k_blast_scache_node = blast_scache128_node;
|
||||
}
|
||||
|
||||
static inline void local_r4k___flush_cache_all(void * args)
|
||||
{
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_LOONGSON2:
|
||||
case CPU_LOONGSON3:
|
||||
case CPU_R4000SC:
|
||||
case CPU_R4000MC:
|
||||
case CPU_R4400SC:
|
||||
@@ -480,6 +497,11 @@ static inline void local_r4k___flush_cache_all(void * args)
|
||||
r4k_blast_scache();
|
||||
break;
|
||||
|
||||
case CPU_LOONGSON3:
|
||||
/* Use get_ebase_cpunum() for both NUMA=y/n */
|
||||
r4k_blast_scache_node(get_ebase_cpunum() >> 2);
|
||||
break;
|
||||
|
||||
case CPU_BMIPS5000:
|
||||
r4k_blast_scache();
|
||||
__sync();
|
||||
@@ -840,10 +862,14 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
|
||||
|
||||
preempt_disable();
|
||||
if (cpu_has_inclusive_pcaches) {
|
||||
if (size >= scache_size)
|
||||
r4k_blast_scache();
|
||||
else
|
||||
if (size >= scache_size) {
|
||||
if (current_cpu_type() != CPU_LOONGSON3)
|
||||
r4k_blast_scache();
|
||||
else
|
||||
r4k_blast_scache_node(pa_to_nid(addr));
|
||||
} else {
|
||||
blast_scache_range(addr, addr + size);
|
||||
}
|
||||
preempt_enable();
|
||||
__sync();
|
||||
return;
|
||||
@@ -877,9 +903,12 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
|
||||
|
||||
preempt_disable();
|
||||
if (cpu_has_inclusive_pcaches) {
|
||||
if (size >= scache_size)
|
||||
r4k_blast_scache();
|
||||
else {
|
||||
if (size >= scache_size) {
|
||||
if (current_cpu_type() != CPU_LOONGSON3)
|
||||
r4k_blast_scache();
|
||||
else
|
||||
r4k_blast_scache_node(pa_to_nid(addr));
|
||||
} else {
|
||||
/*
|
||||
* There is no clearly documented alignment requirement
|
||||
* for the cache instruction on MIPS processors and
|
||||
@@ -1918,6 +1947,7 @@ void r4k_cache_init(void)
|
||||
r4k_blast_scache_page_setup();
|
||||
r4k_blast_scache_page_indexed_setup();
|
||||
r4k_blast_scache_setup();
|
||||
r4k_blast_scache_node_setup();
|
||||
#ifdef CONFIG_EVA
|
||||
r4k_blast_dcache_user_page_setup();
|
||||
r4k_blast_icache_user_page_setup();
|
||||
|
Verwijs in nieuw issue
Block a user