diff options
Diffstat (limited to 'arch/mips/mm/c-r4k.c')
-rw-r--r-- | arch/mips/mm/c-r4k.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 3d3e53651341..643c8bcffff3 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -54,6 +54,12 @@ static inline void r4k_on_each_cpu(void (*func) (void *info), void *info, | |||
54 | preempt_enable(); | 54 | preempt_enable(); |
55 | } | 55 | } |
56 | 56 | ||
57 | #if defined(CONFIG_MIPS_CMP) | ||
58 | #define cpu_has_safe_index_cacheops 0 | ||
59 | #else | ||
60 | #define cpu_has_safe_index_cacheops 1 | ||
61 | #endif | ||
62 | |||
57 | /* | 63 | /* |
58 | * Must die. | 64 | * Must die. |
59 | */ | 65 | */ |
@@ -482,6 +488,8 @@ static inline void local_r4k_flush_cache_page(void *args) | |||
482 | 488 | ||
483 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { | 489 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { |
484 | r4k_blast_dcache_page(addr); | 490 | r4k_blast_dcache_page(addr); |
491 | if (exec && !cpu_icache_snoops_remote_store) | ||
492 | r4k_blast_scache_page(addr); | ||
485 | } | 493 | } |
486 | if (exec) { | 494 | if (exec) { |
487 | if (vaddr && cpu_has_vtag_icache && mm == current->active_mm) { | 495 | if (vaddr && cpu_has_vtag_icache && mm == current->active_mm) { |
@@ -584,7 +592,7 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size) | |||
584 | * subset property so we have to flush the primary caches | 592 | * subset property so we have to flush the primary caches |
585 | * explicitly | 593 | * explicitly |
586 | */ | 594 | */ |
587 | if (size >= dcache_size) { | 595 | if (cpu_has_safe_index_cacheops && size >= dcache_size) { |
588 | r4k_blast_dcache(); | 596 | r4k_blast_dcache(); |
589 | } else { | 597 | } else { |
590 | R4600_HIT_CACHEOP_WAR_IMPL; | 598 | R4600_HIT_CACHEOP_WAR_IMPL; |
@@ -607,7 +615,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size) | |||
607 | return; | 615 | return; |
608 | } | 616 | } |
609 | 617 | ||
610 | if (size >= dcache_size) { | 618 | if (cpu_has_safe_index_cacheops && size >= dcache_size) { |
611 | r4k_blast_dcache(); | 619 | r4k_blast_dcache(); |
612 | } else { | 620 | } else { |
613 | R4600_HIT_CACHEOP_WAR_IMPL; | 621 | R4600_HIT_CACHEOP_WAR_IMPL; |
@@ -969,6 +977,7 @@ static void __cpuinit probe_pcache(void) | |||
969 | case CPU_24K: | 977 | case CPU_24K: |
970 | case CPU_34K: | 978 | case CPU_34K: |
971 | case CPU_74K: | 979 | case CPU_74K: |
980 | case CPU_1004K: | ||
972 | if ((read_c0_config7() & (1 << 16))) { | 981 | if ((read_c0_config7() & (1 << 16))) { |
973 | /* effectively physically indexed dcache, | 982 | /* effectively physically indexed dcache, |
974 | thus no virtual aliases. */ | 983 | thus no virtual aliases. */ |
@@ -1265,6 +1274,20 @@ static void __cpuinit coherency_setup(void) | |||
1265 | } | 1274 | } |
1266 | } | 1275 | } |
1267 | 1276 | ||
1277 | #if defined(CONFIG_DMA_NONCOHERENT) | ||
1278 | |||
1279 | static int __cpuinitdata coherentio; | ||
1280 | |||
1281 | static int __init setcoherentio(char *str) | ||
1282 | { | ||
1283 | coherentio = 1; | ||
1284 | |||
1285 | return 1; | ||
1286 | } | ||
1287 | |||
1288 | __setup("coherentio", setcoherentio); | ||
1289 | #endif | ||
1290 | |||
1268 | void __cpuinit r4k_cache_init(void) | 1291 | void __cpuinit r4k_cache_init(void) |
1269 | { | 1292 | { |
1270 | extern void build_clear_page(void); | 1293 | extern void build_clear_page(void); |
@@ -1324,14 +1347,22 @@ void __cpuinit r4k_cache_init(void) | |||
1324 | flush_data_cache_page = r4k_flush_data_cache_page; | 1347 | flush_data_cache_page = r4k_flush_data_cache_page; |
1325 | flush_icache_range = r4k_flush_icache_range; | 1348 | flush_icache_range = r4k_flush_icache_range; |
1326 | 1349 | ||
1327 | #ifdef CONFIG_DMA_NONCOHERENT | 1350 | #if defined(CONFIG_DMA_NONCOHERENT) |
1328 | _dma_cache_wback_inv = r4k_dma_cache_wback_inv; | 1351 | if (coherentio) { |
1329 | _dma_cache_wback = r4k_dma_cache_wback_inv; | 1352 | _dma_cache_wback_inv = (void *)cache_noop; |
1330 | _dma_cache_inv = r4k_dma_cache_inv; | 1353 | _dma_cache_wback = (void *)cache_noop; |
1354 | _dma_cache_inv = (void *)cache_noop; | ||
1355 | } else { | ||
1356 | _dma_cache_wback_inv = r4k_dma_cache_wback_inv; | ||
1357 | _dma_cache_wback = r4k_dma_cache_wback_inv; | ||
1358 | _dma_cache_inv = r4k_dma_cache_inv; | ||
1359 | } | ||
1331 | #endif | 1360 | #endif |
1332 | 1361 | ||
1333 | build_clear_page(); | 1362 | build_clear_page(); |
1334 | build_copy_page(); | 1363 | build_copy_page(); |
1364 | #if !defined(CONFIG_MIPS_CMP) | ||
1335 | local_r4k___flush_cache_all(NULL); | 1365 | local_r4k___flush_cache_all(NULL); |
1366 | #endif | ||
1336 | coherency_setup(); | 1367 | coherency_setup(); |
1337 | } | 1368 | } |