diff options
Diffstat (limited to 'arch/mips/mm/c-r4k.c')
-rw-r--r-- | arch/mips/mm/c-r4k.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index df04a315d830..be96231dccb6 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -335,6 +335,10 @@ static void r4k_flush_cache_all(void) | |||
335 | 335 | ||
336 | static inline void local_r4k___flush_cache_all(void * args) | 336 | static inline void local_r4k___flush_cache_all(void * args) |
337 | { | 337 | { |
338 | #if defined(CONFIG_CPU_LOONGSON2) | ||
339 | r4k_blast_scache(); | ||
340 | return; | ||
341 | #endif | ||
338 | r4k_blast_dcache(); | 342 | r4k_blast_dcache(); |
339 | r4k_blast_icache(); | 343 | r4k_blast_icache(); |
340 | 344 | ||
@@ -848,6 +852,24 @@ static void __init probe_pcache(void) | |||
848 | c->options |= MIPS_CPU_PREFETCH; | 852 | c->options |= MIPS_CPU_PREFETCH; |
849 | break; | 853 | break; |
850 | 854 | ||
855 | case CPU_LOONGSON2: | ||
856 | icache_size = 1 << (12 + ((config & CONF_IC) >> 9)); | ||
857 | c->icache.linesz = 16 << ((config & CONF_IB) >> 5); | ||
858 | if (prid & 0x3) | ||
859 | c->icache.ways = 4; | ||
860 | else | ||
861 | c->icache.ways = 2; | ||
862 | c->icache.waybit = 0; | ||
863 | |||
864 | dcache_size = 1 << (12 + ((config & CONF_DC) >> 6)); | ||
865 | c->dcache.linesz = 16 << ((config & CONF_DB) >> 4); | ||
866 | if (prid & 0x3) | ||
867 | c->dcache.ways = 4; | ||
868 | else | ||
869 | c->dcache.ways = 2; | ||
870 | c->dcache.waybit = 0; | ||
871 | break; | ||
872 | |||
851 | default: | 873 | default: |
852 | if (!(config & MIPS_CONF_M)) | 874 | if (!(config & MIPS_CONF_M)) |
853 | panic("Don't know how to probe P-caches on this cpu."); | 875 | panic("Don't know how to probe P-caches on this cpu."); |
@@ -963,6 +985,14 @@ static void __init probe_pcache(void) | |||
963 | break; | 985 | break; |
964 | } | 986 | } |
965 | 987 | ||
988 | #ifdef CONFIG_CPU_LOONGSON2 | ||
989 | /* | ||
990 | * LOONGSON2 has 4 way icache, but when using indexed cache op, | ||
991 | * one op will act on all 4 ways | ||
992 | */ | ||
993 | c->icache.ways = 1; | ||
994 | #endif | ||
995 | |||
966 | printk("Primary instruction cache %ldkB, %s, %s, linesize %d bytes.\n", | 996 | printk("Primary instruction cache %ldkB, %s, %s, linesize %d bytes.\n", |
967 | icache_size >> 10, | 997 | icache_size >> 10, |
968 | cpu_has_vtag_icache ? "virtually tagged" : "physically tagged", | 998 | cpu_has_vtag_icache ? "virtually tagged" : "physically tagged", |
@@ -1036,6 +1066,24 @@ static int __init probe_scache(void) | |||
1036 | return 1; | 1066 | return 1; |
1037 | } | 1067 | } |
1038 | 1068 | ||
1069 | #if defined(CONFIG_CPU_LOONGSON2) | ||
1070 | static void __init loongson2_sc_init(void) | ||
1071 | { | ||
1072 | struct cpuinfo_mips *c = ¤t_cpu_data; | ||
1073 | |||
1074 | scache_size = 512*1024; | ||
1075 | c->scache.linesz = 32; | ||
1076 | c->scache.ways = 4; | ||
1077 | c->scache.waybit = 0; | ||
1078 | c->scache.waysize = scache_size / (c->scache.ways); | ||
1079 | c->scache.sets = scache_size / (c->scache.linesz * c->scache.ways); | ||
1080 | pr_info("Unified secondary cache %ldkB %s, linesize %d bytes.\n", | ||
1081 | scache_size >> 10, way_string[c->scache.ways], c->scache.linesz); | ||
1082 | |||
1083 | c->options |= MIPS_CPU_INCLUSIVE_CACHES; | ||
1084 | } | ||
1085 | #endif | ||
1086 | |||
1039 | extern int r5k_sc_init(void); | 1087 | extern int r5k_sc_init(void); |
1040 | extern int rm7k_sc_init(void); | 1088 | extern int rm7k_sc_init(void); |
1041 | extern int mips_sc_init(void); | 1089 | extern int mips_sc_init(void); |
@@ -1085,6 +1133,12 @@ static void __init setup_scache(void) | |||
1085 | #endif | 1133 | #endif |
1086 | return; | 1134 | return; |
1087 | 1135 | ||
1136 | #if defined(CONFIG_CPU_LOONGSON2) | ||
1137 | case CPU_LOONGSON2: | ||
1138 | loongson2_sc_init(); | ||
1139 | return; | ||
1140 | #endif | ||
1141 | |||
1088 | default: | 1142 | default: |
1089 | if (c->isa_level == MIPS_CPU_ISA_M32R1 || | 1143 | if (c->isa_level == MIPS_CPU_ISA_M32R1 || |
1090 | c->isa_level == MIPS_CPU_ISA_M32R2 || | 1144 | c->isa_level == MIPS_CPU_ISA_M32R2 || |