Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Cleanup the mess in cpu_cache_init. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

+101 -87
+18 -7
arch/mips/kernel/cpu-probe.c
··· 191 191 return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); 192 192 } 193 193 194 - #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4KTLB \ 194 + #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ 195 195 | MIPS_CPU_COUNTER) 196 196 197 197 static inline void cpu_probe_legacy(struct cpuinfo_mips *c) ··· 200 200 case PRID_IMP_R2000: 201 201 c->cputype = CPU_R2000; 202 202 c->isa_level = MIPS_CPU_ISA_I; 203 - c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX; 203 + c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | 204 + MIPS_CPU_NOFPUEX; 204 205 if (__cpu_has_fpu()) 205 206 c->options |= MIPS_CPU_FPU; 206 207 c->tlbsize = 64; ··· 215 214 else 216 215 c->cputype = CPU_R3000; 217 216 c->isa_level = MIPS_CPU_ISA_I; 218 - c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX; 217 + c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | 218 + MIPS_CPU_NOFPUEX; 219 219 if (__cpu_has_fpu()) 220 220 c->options |= MIPS_CPU_FPU; 221 221 c->tlbsize = 64; ··· 299 297 #endif 300 298 case PRID_IMP_TX39: 301 299 c->isa_level = MIPS_CPU_ISA_I; 302 - c->options = MIPS_CPU_TLB; 300 + c->options = MIPS_CPU_TLB | MIPS_CPU_TX39_CACHE; 303 301 304 302 if ((c->processor_id & 0xf0) == (PRID_REV_TX3927 & 0xf0)) { 305 303 c->cputype = CPU_TX3927; ··· 443 441 config0 = read_c0_config(); 444 442 445 443 if (((config0 & MIPS_CONF_MT) >> 7) == 1) 446 - c->options |= MIPS_CPU_TLB | MIPS_CPU_4KTLB; 444 + c->options |= MIPS_CPU_TLB; 447 445 isa = (config0 & MIPS_CONF_AT) >> 13; 448 446 switch (isa) { 449 447 case 0: ··· 518 516 static inline void decode_configs(struct cpuinfo_mips *c) 519 517 { 520 518 /* MIPS32 or MIPS64 compliant CPU. */ 521 - c->options = MIPS_CPU_4KEX | MIPS_CPU_COUNTER | MIPS_CPU_DIVEC | 522 - MIPS_CPU_LLSC | MIPS_CPU_MCHECK; 519 + c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | 520 + MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK; 523 521 524 522 c->scache.flags = MIPS_CACHE_NOT_PRESENT; 525 523 ··· 605 603 static inline void cpu_probe_sibyte(struct cpuinfo_mips *c) 606 604 { 607 605 decode_configs(c); 606 + 607 + /* 608 + * For historical reasons the SB1 comes with it's own variant of 609 + * cache code which eventually will be folded into c-r4k.c. Until 610 + * then we pretend it's got it's own cache architecture. 611 + */ 612 + c->options &= MIPS_CPU_4K_CACHE; 613 + c->options |= MIPS_CPU_SB1_CACHE; 614 + 608 615 switch (c->processor_id & 0xff00) { 609 616 case PRID_IMP_SB1: 610 617 c->cputype = CPU_SB1;
+1 -1
arch/mips/mm/c-r3k.c
··· 319 319 r3k_flush_dcache_range(start, start + size); 320 320 } 321 321 322 - void __init ld_mmu_r23000(void) 322 + void __init r3k_cache_init(void) 323 323 { 324 324 extern void build_clear_page(void); 325 325 extern void build_copy_page(void);
+1 -1
arch/mips/mm/c-r4k.c
··· 1221 1221 } 1222 1222 } 1223 1223 1224 - void __init ld_mmu_r4xx0(void) 1224 + void __init r4k_cache_init(void) 1225 1225 { 1226 1226 extern void build_clear_page(void); 1227 1227 extern void build_copy_page(void);
+1 -1
arch/mips/mm/c-sb1.c
··· 496 496 * memory management function pointers, as well as initialize 497 497 * the caches and tlbs 498 498 */ 499 - void ld_mmu_sb1(void) 499 + void sb1_cache_init(void) 500 500 { 501 501 extern char except_vec2_sb1; 502 502 extern char handle_vec2_sb1;
+1 -1
arch/mips/mm/c-tx39.c
··· 410 410 } 411 411 } 412 412 413 - void __init ld_mmu_tx39(void) 413 + void __init tx39_cache_init(void) 414 414 { 415 415 extern void build_clear_page(void); 416 416 extern void build_copy_page(void);
+39 -49
arch/mips/mm/cache.c
··· 104 104 } 105 105 } 106 106 107 - extern void ld_mmu_r23000(void); 108 - extern void ld_mmu_r4xx0(void); 109 - extern void ld_mmu_tx39(void); 110 - extern void ld_mmu_r6000(void); 111 - extern void ld_mmu_tfp(void); 112 - extern void ld_mmu_andes(void); 113 - extern void ld_mmu_sb1(void); 107 + #define __weak __attribute__((weak)) 108 + 109 + static char cache_panic[] __initdata = "Yeee, unsupported cache architecture."; 114 110 115 111 void __init cpu_cache_init(void) 116 112 { 117 - if (cpu_has_4ktlb) { 118 - #if defined(CONFIG_CPU_R4X00) || defined(CONFIG_CPU_VR41XX) || \ 119 - defined(CONFIG_CPU_R4300) || defined(CONFIG_CPU_R5000) || \ 120 - defined(CONFIG_CPU_NEVADA) || defined(CONFIG_CPU_R5432) || \ 121 - defined(CONFIG_CPU_R5500) || defined(CONFIG_CPU_MIPS32_R1) || \ 122 - defined(CONFIG_CPU_MIPS64_R1) || defined(CONFIG_CPU_TX49XX) || \ 123 - defined(CONFIG_CPU_RM7000) || defined(CONFIG_CPU_RM9000) 124 - ld_mmu_r4xx0(); 125 - #endif 126 - } else switch (current_cpu_data.cputype) { 127 - #ifdef CONFIG_CPU_R3000 128 - case CPU_R2000: 129 - case CPU_R3000: 130 - case CPU_R3000A: 131 - case CPU_R3081E: 132 - ld_mmu_r23000(); 133 - break; 134 - #endif 135 - #ifdef CONFIG_CPU_TX39XX 136 - case CPU_TX3912: 137 - case CPU_TX3922: 138 - case CPU_TX3927: 139 - ld_mmu_tx39(); 140 - break; 141 - #endif 142 - #ifdef CONFIG_CPU_R10000 143 - case CPU_R10000: 144 - case CPU_R12000: 145 - ld_mmu_r4xx0(); 146 - break; 147 - #endif 148 - #ifdef CONFIG_CPU_SB1 149 - case CPU_SB1: 150 - ld_mmu_sb1(); 151 - break; 152 - #endif 113 + if (cpu_has_3k_cache) { 114 + extern void __weak r3k_cache_init(void); 153 115 154 - case CPU_R8000: 155 - panic("R8000 is unsupported"); 156 - break; 157 - 158 - default: 159 - panic("Yeee, unsupported cache architecture."); 116 + r3k_cache_init(); 117 + return; 160 118 } 119 + if (cpu_has_6k_cache) { 120 + extern void __weak r6k_cache_init(void); 121 + 122 + r6k_cache_init(); 123 + return; 124 + } 125 + if (cpu_has_4k_cache) { 126 + extern void __weak r4k_cache_init(void); 127 + 128 + r4k_cache_init(); 129 + return; 130 + } 131 + if (cpu_has_8k_cache) { 132 + extern void __weak r8k_cache_init(void); 133 + 134 + r8k_cache_init(); 135 + return; 136 + } 137 + if (cpu_has_tx39_cache) { 138 + extern void __weak tx39_cache_init(void); 139 + 140 + tx39_cache_init(); 141 + return; 142 + } 143 + if (cpu_has_sb1_cache) { 144 + extern void __weak sb1_cache_init(void); 145 + 146 + sb1_cache_init(); 147 + return; 148 + } 149 + 150 + panic(cache_panic); 161 151 }
+13 -2
include/asm-mips/cpu-features.h
··· 25 25 #ifndef cpu_has_4kex 26 26 #define cpu_has_4kex (cpu_data[0].options & MIPS_CPU_4KEX) 27 27 #endif 28 - #ifndef cpu_has_4ktlb 29 - #define cpu_has_4ktlb (cpu_data[0].options & MIPS_CPU_4KTLB) 28 + #ifndef cpu_has_3k_cache 29 + #define cpu_has_3k_cache (cpu_data[0].options & MIPS_CPU_3K_CACHE) 30 + #endif 31 + #define cpu_has_6k_cache 0 32 + #define cpu_has_8k_cache 0 33 + #ifndef cpu_has_4k_cache 34 + #define cpu_has_4k_cache (cpu_data[0].options & MIPS_CPU_4K_CACHE) 35 + #endif 36 + #ifndef cpu_has_tx39_cache 37 + #define cpu_has_tx39_cache (cpu_data[0].options & MIPS_CPU_TX39_CACHE) 38 + #endif 39 + #ifndef cpu_has_sb1_cache 40 + #define cpu_has_sb1_cache (cpu_data[0].options & MIPS_CPU_SB1_CACHE) 30 41 #endif 31 42 #ifndef cpu_has_fpu 32 43 #define cpu_has_fpu (cpu_data[0].options & MIPS_CPU_FPU)
+21 -19
include/asm-mips/cpu.h
··· 217 217 * CPU Option encodings 218 218 */ 219 219 #define MIPS_CPU_TLB 0x00000001 /* CPU has TLB */ 220 - /* Leave a spare bit for variant MMU types... */ 221 - #define MIPS_CPU_4KEX 0x00000004 /* "R4K" exception model */ 222 - #define MIPS_CPU_4KTLB 0x00000008 /* "R4K" TLB handler */ 223 - #define MIPS_CPU_FPU 0x00000010 /* CPU has FPU */ 224 - #define MIPS_CPU_32FPR 0x00000020 /* 32 dbl. prec. FP registers */ 225 - #define MIPS_CPU_COUNTER 0x00000040 /* Cycle count/compare */ 226 - #define MIPS_CPU_WATCH 0x00000080 /* watchpoint registers */ 227 - #define MIPS_CPU_DIVEC 0x00000200 /* dedicated interrupt vector */ 228 - #define MIPS_CPU_VCE 0x00000400 /* virt. coherence conflict possible */ 229 - #define MIPS_CPU_CACHE_CDEX_P 0x00000800 /* Create_Dirty_Exclusive CACHE op */ 230 - #define MIPS_CPU_CACHE_CDEX_S 0x00001000 /* ... same for seconary cache ... */ 231 - #define MIPS_CPU_MCHECK 0x00002000 /* Machine check exception */ 232 - #define MIPS_CPU_EJTAG 0x00004000 /* EJTAG exception */ 233 - #define MIPS_CPU_NOFPUEX 0x00008000 /* no FPU exception */ 234 - #define MIPS_CPU_LLSC 0x00010000 /* CPU has ll/sc instructions */ 235 - #define MIPS_CPU_SUBSET_CACHES 0x00020000 /* P-cache subset enforced */ 236 - #define MIPS_CPU_PREFETCH 0x00040000 /* CPU has usable prefetch */ 237 - #define MIPS_CPU_VINT 0x00080000 /* CPU supports MIPSR2 vectored interrupts */ 238 - #define MIPS_CPU_VEIC 0x00100000 /* CPU supports MIPSR2 external interrupt controller mode */ 220 + #define MIPS_CPU_4KEX 0x00000002 /* "R4K" exception model */ 221 + #define MIPS_CPU_3K_CACHE 0x00000004 /* R3000-style caches */ 222 + #define MIPS_CPU_4K_CACHE 0x00000008 /* R4000-style caches */ 223 + #define MIPS_CPU_TX39_CACHE 0x00000010 /* TX3900-style caches */ 224 + #define MIPS_CPU_SB1_CACHE 0x00000020 /* SB1-style caches */ 225 + #define MIPS_CPU_FPU 0x00000040 /* CPU has FPU */ 226 + #define MIPS_CPU_32FPR 0x00000080 /* 32 dbl. prec. FP registers */ 227 + #define MIPS_CPU_COUNTER 0x00000100 /* Cycle count/compare */ 228 + #define MIPS_CPU_WATCH 0x00000200 /* watchpoint registers */ 229 + #define MIPS_CPU_DIVEC 0x00000400 /* dedicated interrupt vector */ 230 + #define MIPS_CPU_VCE 0x00000800 /* virt. coherence conflict possible */ 231 + #define MIPS_CPU_CACHE_CDEX_P 0x00001000 /* Create_Dirty_Exclusive CACHE op */ 232 + #define MIPS_CPU_CACHE_CDEX_S 0x00002000 /* ... same for seconary cache ... */ 233 + #define MIPS_CPU_MCHECK 0x00004000 /* Machine check exception */ 234 + #define MIPS_CPU_EJTAG 0x00008000 /* EJTAG exception */ 235 + #define MIPS_CPU_NOFPUEX 0x00010000 /* no FPU exception */ 236 + #define MIPS_CPU_LLSC 0x00020000 /* CPU has ll/sc instructions */ 237 + #define MIPS_CPU_SUBSET_CACHES 0x00040000 /* P-cache subset enforced */ 238 + #define MIPS_CPU_PREFETCH 0x00080000 /* CPU has usable prefetch */ 239 + #define MIPS_CPU_VINT 0x00100000 /* CPU supports MIPSR2 vectored interrupts */ 240 + #define MIPS_CPU_VEIC 0x00200000 /* CPU supports MIPSR2 external interrupt controller mode */ 239 241 240 242 /* 241 243 * CPU ASE encodings
+1 -1
include/asm-mips/mach-ip22/cpu-feature-overrides.h
··· 13 13 */ 14 14 #define cpu_has_tlb 1 15 15 #define cpu_has_4kex 1 16 - #define cpu_has_4ktlb 1 16 + #define cpu_has_4kcache 1 17 17 #define cpu_has_fpu 1 18 18 #define cpu_has_32fpr 1 19 19 #define cpu_has_counter 1
+2 -2
include/asm-mips/mach-mips/cpu-feature-overrides.h
··· 17 17 #ifdef CONFIG_CPU_MIPS32_R1 18 18 #define cpu_has_tlb 1 19 19 #define cpu_has_4kex 1 20 - #define cpu_has_4ktlb 1 20 + #define cpu_has_4kcache 1 21 21 /* #define cpu_has_fpu ? */ 22 22 /* #define cpu_has_32fpr ? */ 23 23 #define cpu_has_counter 1 ··· 43 43 #ifdef CONFIG_CPU_MIPS64_R1 44 44 #define cpu_has_tlb 1 45 45 #define cpu_has_4kex 1 46 - #define cpu_has_4ktlb 1 46 + #define cpu_has_4kcache 1 47 47 /* #define cpu_has_fpu ? */ 48 48 /* #define cpu_has_32fpr ? */ 49 49 #define cpu_has_counter 1
+1 -1
include/asm-mips/mach-rm200/cpu-feature-overrides.h
··· 14 14 15 15 #define cpu_has_tlb 1 16 16 #define cpu_has_4kex 1 17 - #define cpu_has_4ktlb 1 17 + #define cpu_has_4kcache 1 18 18 #define cpu_has_fpu 1 19 19 #define cpu_has_32fpr 1 20 20 #define cpu_has_counter 1
+2 -2
include/asm-mips/mach-sim/cpu-feature-overrides.h
··· 16 16 #ifdef CONFIG_CPU_MIPS32 17 17 #define cpu_has_tlb 1 18 18 #define cpu_has_4kex 1 19 - #define cpu_has_4ktlb 1 19 + #define cpu_has_4kcache 1 20 20 #define cpu_has_fpu 0 21 21 /* #define cpu_has_32fpr ? */ 22 22 #define cpu_has_counter 1 ··· 41 41 #ifdef CONFIG_CPU_MIPS64 42 42 #define cpu_has_tlb 1 43 43 #define cpu_has_4kex 1 44 - #define cpu_has_4ktlb 1 44 + #define cpu_has_4kcache 1 45 45 /* #define cpu_has_fpu ? */ 46 46 /* #define cpu_has_32fpr ? */ 47 47 #define cpu_has_counter 1