|
|
@@ -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();
|