Ralf, Here are some bits to synchronize c-r4k.c across ports. There are no functional changes, at least no intended ones. OK to apply? I can't see any need for flush_cache_l1() and flush_cache_l2(). I'd like to remove them. A single flush_cache_all() seems sufficient for our needs. Any objections? Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.20-pre6-20030107-mips-c-r4k-sync-0 diff -up --recursive --new-file linux-mips-2.4.20-pre6-20030107.macro/arch/mips/mm/c-r4k.c linux-mips-2.4.20-pre6-20030107/arch/mips/mm/c-r4k.c --- linux-mips-2.4.20-pre6-20030107.macro/arch/mips/mm/c-r4k.c 2002-12-20 03:56:50.000000000 +0000 +++ linux-mips-2.4.20-pre6-20030107/arch/mips/mm/c-r4k.c 2003-01-09 22:23:33.000000000 +0000 @@ -948,12 +948,13 @@ static void r4k_flush_icache_page_p(stru static void r4k_dma_cache_wback_inv_pc(unsigned long addr, unsigned long size) { unsigned long end, a; - unsigned int flags; if (size >= dcache_size) { flush_cache_all(); } else { #ifdef R4600_V2_HIT_CACHEOP_WAR + unsigned long flags; + /* Workaround for R4600 bug. See comment in <asm/war>. */ local_irq_save(flags); *(volatile unsigned long *)KSEG1; @@ -962,7 +963,7 @@ static void r4k_dma_cache_wback_inv_pc(u a = addr & ~(dc_lsize - 1); end = (addr + size - 1) & ~(dc_lsize - 1); while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ if (a == end) break; a += dc_lsize; } @@ -970,6 +971,7 @@ static void r4k_dma_cache_wback_inv_pc(u local_irq_restore(flags); #endif } + bc_wback_inv(addr, size); } @@ -994,12 +996,13 @@ static void r4k_dma_cache_wback_inv_sc(u static void r4k_dma_cache_inv_pc(unsigned long addr, unsigned long size) { unsigned long end, a; - unsigned int flags; if (size >= dcache_size) { flush_cache_all(); } else { #ifdef R4600_V2_HIT_CACHEOP_WAR + unsigned long flags; + /* Workaround for R4600 bug. See comment in <asm/war>. */ local_irq_save(flags); *(volatile unsigned long *)KSEG1; @@ -1008,7 +1011,7 @@ static void r4k_dma_cache_inv_pc(unsigne a = addr & ~(dc_lsize - 1); end = (addr + size - 1) & ~(dc_lsize - 1); while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ if (a == end) break; a += dc_lsize; } @@ -1016,6 +1019,7 @@ static void r4k_dma_cache_inv_pc(unsigne local_irq_restore(flags); #endif } + bc_inv(addr, size); } @@ -1031,7 +1035,7 @@ static void r4k_dma_cache_inv_sc(unsigne a = addr & ~(sc_lsize - 1); end = (addr + size - 1) & ~(sc_lsize - 1); while (1) { - flush_scache_line(a); /* Hit_Writeback_Inv_SD */ + flush_scache_line(a); /* Hit_Writeback_Inv_SD */ if (a == end) break; a += sc_lsize; } @@ -1232,10 +1236,10 @@ static void __init setup_noscache_funcs( _flush_cache_page = r4k_flush_cache_page_d32i32; break; } - ___flush_cache_all = _flush_cache_all; - _flush_icache_page = r4k_flush_icache_page_p; + ___flush_cache_all = _flush_cache_all; + _dma_cache_wback_inv = r4k_dma_cache_wback_inv_pc; _dma_cache_wback = r4k_dma_cache_wback_inv_pc; _dma_cache_inv = r4k_dma_cache_inv_pc; @@ -1317,8 +1321,10 @@ static void __init setup_scache_funcs(vo _copy_page = r4k_copy_page_s128; break; } - ___flush_cache_all = _flush_cache_all; _flush_icache_page = r4k_flush_icache_page_s; + + ___flush_cache_all = _flush_cache_all; + _dma_cache_wback_inv = r4k_dma_cache_wback_inv_sc; _dma_cache_wback = r4k_dma_cache_wback_inv_sc; _dma_cache_inv = r4k_dma_cache_inv_sc; @@ -1373,10 +1379,10 @@ void __init ld_mmu_r4xx0(void) } _flush_cache_sigtramp = r4k_flush_cache_sigtramp; - _flush_icache_range = r4k_flush_icache_range; /* Ouch */ if ((read_c0_prid() & 0xfff0) == 0x2020) { _flush_cache_sigtramp = r4600v20k_flush_cache_sigtramp; } + _flush_icache_range = r4k_flush_icache_range; /* Ouch */ __flush_cache_all(); } diff -up --recursive --new-file linux-mips-2.4.20-pre6-20030107.macro/arch/mips64/mm/c-r4k.c linux-mips-2.4.20-pre6-20030107/arch/mips64/mm/c-r4k.c --- linux-mips-2.4.20-pre6-20030107.macro/arch/mips64/mm/c-r4k.c 2002-12-20 03:56:52.000000000 +0000 +++ linux-mips-2.4.20-pre6-20030107/arch/mips64/mm/c-r4k.c 2003-01-09 23:21:39.000000000 +0000 @@ -950,7 +950,7 @@ static void r4k_dma_cache_wback_inv_pc(u unsigned long end, a; if (size >= dcache_size) { - flush_cache_l1(); + flush_cache_all(); } else { #ifdef R4600_V2_HIT_CACHEOP_WAR unsigned long flags; @@ -963,7 +963,7 @@ static void r4k_dma_cache_wback_inv_pc(u a = addr & ~(dc_lsize - 1); end = (addr + size - 1) & ~(dc_lsize - 1); while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ if (a == end) break; a += dc_lsize; } @@ -971,6 +971,7 @@ static void r4k_dma_cache_wback_inv_pc(u local_irq_restore(flags); #endif } + bc_wback_inv(addr, size); } @@ -979,7 +980,7 @@ static void r4k_dma_cache_wback_inv_sc(u unsigned long end, a; if (size >= scache_size) { - flush_cache_l1(); + flush_cache_all(); return; } @@ -997,7 +998,7 @@ static void r4k_dma_cache_inv_pc(unsigne unsigned long end, a; if (size >= dcache_size) { - flush_cache_l1(); + flush_cache_all(); } else { #ifdef R4600_V2_HIT_CACHEOP_WAR unsigned long flags; @@ -1010,7 +1011,7 @@ static void r4k_dma_cache_inv_pc(unsigne a = addr & ~(dc_lsize - 1); end = (addr + size - 1) & ~(dc_lsize - 1); while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ if (a == end) break; a += dc_lsize; } @@ -1027,14 +1028,14 @@ static void r4k_dma_cache_inv_sc(unsigne unsigned long end, a; if (size >= scache_size) { - flush_cache_l1(); + flush_cache_all(); return; } a = addr & ~(sc_lsize - 1); end = (addr + size - 1) & ~(sc_lsize - 1); while (1) { - flush_scache_line(a); /* Hit_Writeback_Inv_SD */ + flush_scache_line(a); /* Hit_Writeback_Inv_SD */ if (a == end) break; a += sc_lsize; } @@ -1241,9 +1242,10 @@ static void __init setup_noscache_funcs( _flush_cache_page = r4k_flush_cache_page_d32i32; break; } - _flush_icache_page = r4k_flush_icache_page_p; + ___flush_cache_all = _flush_cache_all; + _dma_cache_wback_inv = r4k_dma_cache_wback_inv_pc; _dma_cache_wback = r4k_dma_cache_wback_inv_pc; _dma_cache_inv = r4k_dma_cache_inv_pc; @@ -1333,6 +1335,9 @@ static void __init setup_scache_funcs(vo break; } _flush_icache_page = r4k_flush_icache_page_s; + + ___flush_cache_all = _flush_cache_all; + _dma_cache_wback_inv = r4k_dma_cache_wback_inv_sc; _dma_cache_wback = r4k_dma_cache_wback_inv_sc; _dma_cache_inv = r4k_dma_cache_inv_sc; @@ -1394,5 +1399,5 @@ void __init ld_mmu_r4xx0(void) _flush_cache_l2 = r4k_flush_cache_l2; - flush_cache_l1(); + __flush_cache_all(); }