diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-08 04:32:56 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-08 04:32:56 -0400 |
commit | 896395c290f902576270d84291c1f7f8bfbe339d (patch) | |
tree | 650114bff3a5f808ee1d713ecc443b0eaab2e1c3 /arch/mips/mm | |
parent | af1cf204ba2fd8135933a2e4df523fb1112dc0e2 (diff) | |
parent | 1b40a895df6c7d5a80e71f65674060b03d84bbef (diff) |
Merge branch 'linus' into tmp.x86.mpparse.new
Diffstat (limited to 'arch/mips/mm')
-rw-r--r-- | arch/mips/mm/c-r4k.c | 33 | ||||
-rw-r--r-- | arch/mips/mm/init.c | 1 | ||||
-rw-r--r-- | arch/mips/mm/page.c | 10 | ||||
-rw-r--r-- | arch/mips/mm/tlbex.c | 3 |
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 | |||
1239 | static 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 | |||
1229 | static int __cpuinitdata cca = -1; | 1254 | static int __cpuinitdata cca = -1; |
1230 | 1255 | ||
1231 | static int __init cca_setup(char *str) | 1256 | static 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 | */ |
73 | unsigned long empty_zero_page, zero_page_mask; | 73 | unsigned long empty_zero_page, zero_page_mask; |
74 | EXPORT_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; | |||
224 | static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p) | 224 | static 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: |