diff options
Diffstat (limited to 'arch/mips/mm/pg-r4k.c')
-rw-r--r-- | arch/mips/mm/pg-r4k.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/arch/mips/mm/pg-r4k.c b/arch/mips/mm/pg-r4k.c index 9f8b16541577..f51e180072e3 100644 --- a/arch/mips/mm/pg-r4k.c +++ b/arch/mips/mm/pg-r4k.c | |||
@@ -25,7 +25,10 @@ | |||
25 | #include <asm/cpu.h> | 25 | #include <asm/cpu.h> |
26 | #include <asm/war.h> | 26 | #include <asm/war.h> |
27 | 27 | ||
28 | #define half_scache_line_size() (cpu_scache_line_size() >> 1) | 28 | #define half_scache_line_size() (cpu_scache_line_size() >> 1) |
29 | #define cpu_is_r4600_v1_x() ((read_c0_prid() & 0xfffffff0) == 0x00002010) | ||
30 | #define cpu_is_r4600_v2_x() ((read_c0_prid() & 0xfffffff0) == 0x00002020) | ||
31 | |||
29 | 32 | ||
30 | /* | 33 | /* |
31 | * Maximum sizes: | 34 | * Maximum sizes: |
@@ -198,15 +201,15 @@ static inline void build_cdex_p(void) | |||
198 | if (store_offset & (cpu_dcache_line_size() - 1)) | 201 | if (store_offset & (cpu_dcache_line_size() - 1)) |
199 | return; | 202 | return; |
200 | 203 | ||
201 | if (R4600_V1_HIT_CACHEOP_WAR && ((read_c0_prid() & 0xfff0) == 0x2010)) { | 204 | if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) { |
202 | build_nop(); | 205 | build_nop(); |
203 | build_nop(); | 206 | build_nop(); |
204 | build_nop(); | 207 | build_nop(); |
205 | build_nop(); | 208 | build_nop(); |
206 | } | 209 | } |
207 | 210 | ||
208 | if (R4600_V2_HIT_CACHEOP_WAR && ((read_c0_prid() & 0xfff0) == 0x2020)) | 211 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
209 | build_insn_word(0x8c200000); /* lw $zero, ($at) */ | 212 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ |
210 | 213 | ||
211 | mi.c_format.opcode = cache_op; | 214 | mi.c_format.opcode = cache_op; |
212 | mi.c_format.rs = 4; /* $a0 */ | 215 | mi.c_format.rs = 4; /* $a0 */ |
@@ -361,7 +364,7 @@ void __init build_clear_page(void) | |||
361 | 364 | ||
362 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_clear : 0)); | 365 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_clear : 0)); |
363 | 366 | ||
364 | if (R4600_V2_HIT_CACHEOP_WAR && ((read_c0_prid() & 0xfff0) == 0x2020)) | 367 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
365 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ | 368 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ |
366 | 369 | ||
367 | dest = label(); | 370 | dest = label(); |
@@ -404,9 +407,6 @@ dest = label(); | |||
404 | 407 | ||
405 | build_jr_ra(); | 408 | build_jr_ra(); |
406 | 409 | ||
407 | flush_icache_range((unsigned long)&clear_page_array, | ||
408 | (unsigned long) epc); | ||
409 | |||
410 | BUG_ON(epc > clear_page_array + ARRAY_SIZE(clear_page_array)); | 410 | BUG_ON(epc > clear_page_array + ARRAY_SIZE(clear_page_array)); |
411 | } | 411 | } |
412 | 412 | ||
@@ -420,7 +420,7 @@ void __init build_copy_page(void) | |||
420 | 420 | ||
421 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_copy : 0)); | 421 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_copy : 0)); |
422 | 422 | ||
423 | if (R4600_V2_HIT_CACHEOP_WAR && ((read_c0_prid() & 0xfff0) == 0x2020)) | 423 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
424 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ | 424 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ |
425 | 425 | ||
426 | dest = label(); | 426 | dest = label(); |
@@ -482,8 +482,5 @@ dest = label(); | |||
482 | 482 | ||
483 | build_jr_ra(); | 483 | build_jr_ra(); |
484 | 484 | ||
485 | flush_icache_range((unsigned long)©_page_array, | ||
486 | (unsigned long) epc); | ||
487 | |||
488 | BUG_ON(epc > copy_page_array + ARRAY_SIZE(copy_page_array)); | 485 | BUG_ON(epc > copy_page_array + ARRAY_SIZE(copy_page_array)); |
489 | } | 486 | } |