On Wed, Apr 16, 2003 at 09:54:28AM +0200, Hartvig Ekner wrote: > It seems much of the r4k cache code assumes the presence of SD - which > breaks on all MIPS32 CPU's? Nothing a soldering iron and some patience couldn't fix ;) Try below patch, Ralf Index: arch/mips/mm/c-r4k.c =================================================================== RCS file: /home/cvs/linux/arch/mips/mm/c-r4k.c,v retrieving revision 1.3.2.43 diff -u -r1.3.2.43 c-r4k.c --- arch/mips/mm/c-r4k.c 16 Apr 2003 12:41:18 -0000 1.3.2.43 +++ arch/mips/mm/c-r4k.c 16 Apr 2003 14:56:03 -0000 @@ -34,6 +34,8 @@ #include <asm/cacheops.h> #include <asm/r4kcache.h> +extern void r4k_clear_page32_d16(void * page); +extern void r4k_clear_page32_d32(void * page); extern void r4k_clear_page_d16(void * page); extern void r4k_clear_page_d32(void * page); extern void r4k_clear_page_r4600_v1(void * page); @@ -877,7 +879,10 @@ switch (current_cpu_data.dcache.linesz) { case 16: - _clear_page = r4k_clear_page_d16; + if (cpu_has_64bits) + _clear_page = r4k_clear_page_d16; + else + _clear_page = r4k_clear_page32_d16; _copy_page = r4k_copy_page_d16; break; @@ -890,7 +895,10 @@ _clear_page = r4k_clear_page_r4600_v2; _copy_page = r4k_copy_page_r4600_v2; } else { - _clear_page = r4k_clear_page_d32; + if (cpu_has_64bits) + _clear_page = r4k_clear_page_d32; + else + _clear_page = r4k_clear_page32_d32; _copy_page = r4k_copy_page_d32; } break; Index: arch/mips/mm/pg-r4k.S =================================================================== RCS file: /home/cvs/linux/arch/mips/mm/pg-r4k.S,v retrieving revision 1.2.2.3 diff -u -r1.2.2.3 pg-r4k.S --- arch/mips/mm/pg-r4k.S 5 Aug 2002 23:53:35 -0000 1.2.2.3 +++ arch/mips/mm/pg-r4k.S 16 Apr 2003 14:56:07 -0000 @@ -39,6 +39,39 @@ * versions of R4000 and R4400. */ +LEAF(r4k_clear_page32_d16) + addiu AT, a0, _PAGE_SIZE +1: cache Create_Dirty_Excl_D, (a0) + sw zero, (a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + addiu a0, 32 + cache Create_Dirty_Excl_D, -16(a0) + sw zero, -16(a0) + sw zero, -12(a0) + sw zero, -8(a0) + sw zero, -4(a0) + bne AT, a0, 1b + jr ra + END(r4k_clear_page32_d16) + +LEAF(r4k_clear_page32_d32) + addiu AT, a0, _PAGE_SIZE +1: cache Create_Dirty_Excl_D, (a0) + sw zero, (a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + addiu a0, 64 + sw zero, -16(a0) + sw zero, -12(a0) + sw zero, -8(a0) + sw zero, -4(a0) + bne AT, a0, 1b + jr ra + END(r4k_clear_page32_d32) + LEAF(r4k_clear_page_d16) addiu AT, a0, _PAGE_SIZE 1: cache Create_Dirty_Excl_D, (a0) Index: include/asm-mips/cpu.h =================================================================== RCS file: /home/cvs/linux/include/asm-mips/cpu.h,v retrieving revision 1.24.2.18 diff -u -r1.24.2.18 cpu.h --- include/asm-mips/cpu.h 15 Apr 2003 14:19:14 -0000 1.24.2.18 +++ include/asm-mips/cpu.h 16 Apr 2003 14:56:33 -0000 @@ -162,14 +162,20 @@ /* * ISA Level encodings + * */ #define MIPS_CPU_ISA_I 0x00000001 #define MIPS_CPU_ISA_II 0x00000002 -#define MIPS_CPU_ISA_III 0x00000003 -#define MIPS_CPU_ISA_IV 0x00000004 -#define MIPS_CPU_ISA_V 0x00000005 +#define MIPS_CPU_ISA_III 0x00008003 +#define MIPS_CPU_ISA_IV 0x00008004 +#define MIPS_CPU_ISA_V 0x00008005 #define MIPS_CPU_ISA_M32 0x00000020 -#define MIPS_CPU_ISA_M64 0x00000040 +#define MIPS_CPU_ISA_M64 0x00008040 + +/* + * Bit 15 encodes if an ISA level supports 64-bit operations. + */ +#define MIPS_CPU_ISA_64BIT 0x00008000 /* * CPU Option encodings Index: include/asm-mips/processor.h =================================================================== RCS file: /home/cvs/linux/include/asm-mips/processor.h,v retrieving revision 1.43.2.18 diff -u -r1.43.2.18 processor.h --- include/asm-mips/processor.h 15 Apr 2003 14:19:14 -0000 1.43.2.18 +++ include/asm-mips/processor.h 16 Apr 2003 14:56:46 -0000 @@ -93,6 +93,7 @@ #define cpu_has_vtag_icache (cpu_data[0].icache.flags & MIPS_CACHE_VTAG) #define cpu_has_dc_aliases (cpu_data[0].dcache.flags & MIPS_CACHE_ALIASES) #define cpu_has_ic_fills_f_dc (cpu_data[0].dcache.flags & MIPS_CACHE_IC_F_DC) +#define cpu_has_64bits (cpu_data[0].isa_level & MIPS_CPU_ISA_64BIT) extern struct cpuinfo_mips cpu_data[]; #define current_cpu_data cpu_data[smp_processor_id()]