aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/mm
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-07-08 04:32:56 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-08 04:32:56 -0400
commit896395c290f902576270d84291c1f7f8bfbe339d (patch)
tree650114bff3a5f808ee1d713ecc443b0eaab2e1c3 /arch/mips/mm
parentaf1cf204ba2fd8135933a2e4df523fb1112dc0e2 (diff)
parent1b40a895df6c7d5a80e71f65674060b03d84bbef (diff)
Merge branch 'linus' into tmp.x86.mpparse.new
Diffstat (limited to 'arch/mips/mm')
-rw-r--r--arch/mips/mm/c-r4k.c33
-rw-r--r--arch/mips/mm/init.c1
-rw-r--r--arch/mips/mm/page.c10
-rw-r--r--arch/mips/mm/tlbex.c3
4 files changed, 40 insertions, 7 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 643c8bcffff3..27096751ddce 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -446,6 +446,7 @@ static inline void local_r4k_flush_cache_page(void *args)
446 struct page *page = pfn_to_page(fcp_args->pfn); 446 struct page *page = pfn_to_page(fcp_args->pfn);
447 int exec = vma->vm_flags & VM_EXEC; 447 int exec = vma->vm_flags & VM_EXEC;
448 struct mm_struct *mm = vma->vm_mm; 448 struct mm_struct *mm = vma->vm_mm;
449 int map_coherent = 0;
449 pgd_t *pgdp; 450 pgd_t *pgdp;
450 pud_t *pudp; 451 pud_t *pudp;
451 pmd_t *pmdp; 452 pmd_t *pmdp;
@@ -479,7 +480,9 @@ static inline void local_r4k_flush_cache_page(void *args)
479 * Use kmap_coherent or kmap_atomic to do flushes for 480 * Use kmap_coherent or kmap_atomic to do flushes for
480 * another ASID than the current one. 481 * another ASID than the current one.
481 */ 482 */
482 if (cpu_has_dc_aliases) 483 map_coherent = (cpu_has_dc_aliases &&
484 page_mapped(page) && !Page_dcache_dirty(page));
485 if (map_coherent)
483 vaddr = kmap_coherent(page, addr); 486 vaddr = kmap_coherent(page, addr);
484 else 487 else
485 vaddr = kmap_atomic(page, KM_USER0); 488 vaddr = kmap_atomic(page, KM_USER0);
@@ -502,7 +505,7 @@ static inline void local_r4k_flush_cache_page(void *args)
502 } 505 }
503 506
504 if (vaddr) { 507 if (vaddr) {
505 if (cpu_has_dc_aliases) 508 if (map_coherent)
506 kunmap_coherent(); 509 kunmap_coherent();
507 else 510 else
508 kunmap_atomic(vaddr, KM_USER0); 511 kunmap_atomic(vaddr, KM_USER0);
@@ -1226,6 +1229,28 @@ void au1x00_fixup_config_od(void)
1226 } 1229 }
1227} 1230}
1228 1231
1232/* CP0 hazard avoidance. */
1233#define NXP_BARRIER() \
1234 __asm__ __volatile__( \
1235 ".set noreorder\n\t" \
1236 "nop; nop; nop; nop; nop; nop;\n\t" \
1237 ".set reorder\n\t")
1238
1239static void nxp_pr4450_fixup_config(void)
1240{
1241 unsigned long config0;
1242
1243 config0 = read_c0_config();
1244
1245 /* clear all three cache coherency fields */
1246 config0 &= ~(0x7 | (7 << 25) | (7 << 28));
1247 config0 |= (((_page_cachable_default >> _CACHE_SHIFT) << 0) |
1248 ((_page_cachable_default >> _CACHE_SHIFT) << 25) |
1249 ((_page_cachable_default >> _CACHE_SHIFT) << 28));
1250 write_c0_config(config0);
1251 NXP_BARRIER();
1252}
1253
1229static int __cpuinitdata cca = -1; 1254static int __cpuinitdata cca = -1;
1230 1255
1231static int __init cca_setup(char *str) 1256static int __init cca_setup(char *str)
@@ -1271,6 +1296,10 @@ static void __cpuinit coherency_setup(void)
1271 case CPU_AU1500: /* rev. AB */ 1296 case CPU_AU1500: /* rev. AB */
1272 au1x00_fixup_config_od(); 1297 au1x00_fixup_config_od();
1273 break; 1298 break;
1299
1300 case PRID_IMP_PR4450:
1301 nxp_pr4450_fixup_config();
1302 break;
1274 } 1303 }
1275} 1304}
1276 1305
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index ecd562d2c348..137c14bafd6b 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -71,6 +71,7 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
71 * don't have to care about aliases on other CPUs. 71 * don't have to care about aliases on other CPUs.
72 */ 72 */
73unsigned long empty_zero_page, zero_page_mask; 73unsigned long empty_zero_page, zero_page_mask;
74EXPORT_SYMBOL_GPL(empty_zero_page);
74 75
75/* 76/*
76 * Not static inline because used by IP27 special magic initialization code 77 * Not static inline because used by IP27 special magic initialization code
diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c
index d827d6144369..1edf0cbbeede 100644
--- a/arch/mips/mm/page.c
+++ b/arch/mips/mm/page.c
@@ -310,8 +310,8 @@ void __cpuinit build_clear_page(void)
310 if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) 310 if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
311 uasm_i_lui(&buf, AT, 0xa000); 311 uasm_i_lui(&buf, AT, 0xa000);
312 312
313 off = min(8, pref_bias_clear_store / cache_line_size) * 313 off = cache_line_size ? min(8, pref_bias_clear_store / cache_line_size)
314 cache_line_size; 314 * cache_line_size : 0;
315 while (off) { 315 while (off) {
316 build_clear_pref(&buf, -off); 316 build_clear_pref(&buf, -off);
317 off -= cache_line_size; 317 off -= cache_line_size;
@@ -454,12 +454,14 @@ void __cpuinit build_copy_page(void)
454 if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) 454 if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
455 uasm_i_lui(&buf, AT, 0xa000); 455 uasm_i_lui(&buf, AT, 0xa000);
456 456
457 off = min(8, pref_bias_copy_load / cache_line_size) * cache_line_size; 457 off = cache_line_size ? min(8, pref_bias_copy_load / cache_line_size) *
458 cache_line_size : 0;
458 while (off) { 459 while (off) {
459 build_copy_load_pref(&buf, -off); 460 build_copy_load_pref(&buf, -off);
460 off -= cache_line_size; 461 off -= cache_line_size;
461 } 462 }
462 off = min(8, pref_bias_copy_store / cache_line_size) * cache_line_size; 463 off = cache_line_size ? min(8, pref_bias_copy_store / cache_line_size) *
464 cache_line_size : 0;
463 while (off) { 465 while (off) {
464 build_copy_store_pref(&buf, -off); 466 build_copy_store_pref(&buf, -off);
465 off -= cache_line_size; 467 off -= cache_line_size;
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index 382738ca8a0b..76da73a5ab3c 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -224,8 +224,9 @@ static u32 final_handler[64] __cpuinitdata;
224static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p) 224static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p)
225{ 225{
226 switch (current_cpu_type()) { 226 switch (current_cpu_type()) {
227 /* Found by experiment: R4600 v2.0 needs this, too. */ 227 /* Found by experiment: R4600 v2.0/R4700 needs this, too. */
228 case CPU_R4600: 228 case CPU_R4600:
229 case CPU_R4700:
229 case CPU_R5000: 230 case CPU_R5000:
230 case CPU_R5000A: 231 case CPU_R5000A:
231 case CPU_NEVADA: 232 case CPU_NEVADA: