diff options
Diffstat (limited to 'arch/mips/mm/cache.c')
| -rw-r--r-- | arch/mips/mm/cache.c | 106 |
1 files changed, 51 insertions, 55 deletions
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 1d95cdb77bed..314701a66b13 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
| @@ -23,8 +23,10 @@ void (*__flush_cache_all)(void); | |||
| 23 | void (*flush_cache_mm)(struct mm_struct *mm); | 23 | void (*flush_cache_mm)(struct mm_struct *mm); |
| 24 | void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, | 24 | void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, |
| 25 | unsigned long end); | 25 | unsigned long end); |
| 26 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn); | 26 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, |
| 27 | void (*flush_icache_range)(unsigned long start, unsigned long end); | 27 | unsigned long pfn); |
| 28 | void (*flush_icache_range)(unsigned long __user start, | ||
| 29 | unsigned long __user end); | ||
| 28 | void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page); | 30 | void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page); |
| 29 | 31 | ||
| 30 | /* MIPS specific cache operations */ | 32 | /* MIPS specific cache operations */ |
| @@ -32,6 +34,8 @@ void (*flush_cache_sigtramp)(unsigned long addr); | |||
| 32 | void (*flush_data_cache_page)(unsigned long addr); | 34 | void (*flush_data_cache_page)(unsigned long addr); |
| 33 | void (*flush_icache_all)(void); | 35 | void (*flush_icache_all)(void); |
| 34 | 36 | ||
| 37 | EXPORT_SYMBOL(flush_data_cache_page); | ||
| 38 | |||
| 35 | #ifdef CONFIG_DMA_NONCOHERENT | 39 | #ifdef CONFIG_DMA_NONCOHERENT |
| 36 | 40 | ||
| 37 | /* DMA cache operations. */ | 41 | /* DMA cache operations. */ |
| @@ -49,10 +53,12 @@ EXPORT_SYMBOL(_dma_cache_inv); | |||
| 49 | * We could optimize the case where the cache argument is not BCACHE but | 53 | * We could optimize the case where the cache argument is not BCACHE but |
| 50 | * that seems very atypical use ... | 54 | * that seems very atypical use ... |
| 51 | */ | 55 | */ |
| 52 | asmlinkage int sys_cacheflush(unsigned long addr, unsigned long int bytes, | 56 | asmlinkage int sys_cacheflush(unsigned long __user addr, |
| 53 | unsigned int cache) | 57 | unsigned long bytes, unsigned int cache) |
| 54 | { | 58 | { |
| 55 | if (!access_ok(VERIFY_WRITE, (void *) addr, bytes)) | 59 | if (bytes == 0) |
| 60 | return 0; | ||
| 61 | if (!access_ok(VERIFY_WRITE, (void __user *) addr, bytes)) | ||
| 56 | return -EFAULT; | 62 | return -EFAULT; |
| 57 | 63 | ||
| 58 | flush_icache_range(addr, addr + bytes); | 64 | flush_icache_range(addr, addr + bytes); |
| @@ -100,58 +106,48 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, | |||
| 100 | } | 106 | } |
| 101 | } | 107 | } |
| 102 | 108 | ||
| 103 | extern void ld_mmu_r23000(void); | 109 | #define __weak __attribute__((weak)) |
| 104 | extern void ld_mmu_r4xx0(void); | 110 | |
| 105 | extern void ld_mmu_tx39(void); | 111 | static char cache_panic[] __initdata = "Yeee, unsupported cache architecture."; |
| 106 | extern void ld_mmu_r6000(void); | ||
| 107 | extern void ld_mmu_tfp(void); | ||
| 108 | extern void ld_mmu_andes(void); | ||
| 109 | extern void ld_mmu_sb1(void); | ||
| 110 | 112 | ||
| 111 | void __init cpu_cache_init(void) | 113 | void __init cpu_cache_init(void) |
| 112 | { | 114 | { |
| 113 | if (cpu_has_4ktlb) { | 115 | if (cpu_has_3k_cache) { |
| 114 | #if defined(CONFIG_CPU_R4X00) || defined(CONFIG_CPU_VR41XX) || \ | 116 | extern void __weak r3k_cache_init(void); |
| 115 | defined(CONFIG_CPU_R4300) || defined(CONFIG_CPU_R5000) || \ | 117 | |
| 116 | defined(CONFIG_CPU_NEVADA) || defined(CONFIG_CPU_R5432) || \ | 118 | r3k_cache_init(); |
| 117 | defined(CONFIG_CPU_R5500) || defined(CONFIG_CPU_MIPS32) || \ | 119 | return; |
| 118 | defined(CONFIG_CPU_MIPS64) || defined(CONFIG_CPU_TX49XX) || \ | 120 | } |
| 119 | defined(CONFIG_CPU_RM7000) || defined(CONFIG_CPU_RM9000) | 121 | if (cpu_has_6k_cache) { |
| 120 | ld_mmu_r4xx0(); | 122 | extern void __weak r6k_cache_init(void); |
| 121 | #endif | 123 | |
| 122 | } else switch (current_cpu_data.cputype) { | 124 | r6k_cache_init(); |
| 123 | #ifdef CONFIG_CPU_R3000 | 125 | return; |
| 124 | case CPU_R2000: | 126 | } |
| 125 | case CPU_R3000: | 127 | if (cpu_has_4k_cache) { |
| 126 | case CPU_R3000A: | 128 | extern void __weak r4k_cache_init(void); |
| 127 | case CPU_R3081E: | 129 | |
| 128 | ld_mmu_r23000(); | 130 | r4k_cache_init(); |
| 129 | break; | 131 | return; |
| 130 | #endif | ||
| 131 | #ifdef CONFIG_CPU_TX39XX | ||
| 132 | case CPU_TX3912: | ||
| 133 | case CPU_TX3922: | ||
| 134 | case CPU_TX3927: | ||
| 135 | ld_mmu_tx39(); | ||
| 136 | break; | ||
| 137 | #endif | ||
| 138 | #ifdef CONFIG_CPU_R10000 | ||
| 139 | case CPU_R10000: | ||
| 140 | case CPU_R12000: | ||
| 141 | ld_mmu_r4xx0(); | ||
| 142 | break; | ||
| 143 | #endif | ||
| 144 | #ifdef CONFIG_CPU_SB1 | ||
| 145 | case CPU_SB1: | ||
| 146 | ld_mmu_sb1(); | ||
| 147 | break; | ||
| 148 | #endif | ||
| 149 | |||
| 150 | case CPU_R8000: | ||
| 151 | panic("R8000 is unsupported"); | ||
| 152 | break; | ||
| 153 | |||
| 154 | default: | ||
| 155 | panic("Yeee, unsupported cache architecture."); | ||
| 156 | } | 132 | } |
| 133 | if (cpu_has_8k_cache) { | ||
| 134 | extern void __weak r8k_cache_init(void); | ||
| 135 | |||
| 136 | r8k_cache_init(); | ||
| 137 | return; | ||
| 138 | } | ||
| 139 | if (cpu_has_tx39_cache) { | ||
| 140 | extern void __weak tx39_cache_init(void); | ||
| 141 | |||
| 142 | tx39_cache_init(); | ||
| 143 | return; | ||
| 144 | } | ||
| 145 | if (cpu_has_sb1_cache) { | ||
| 146 | extern void __weak sb1_cache_init(void); | ||
| 147 | |||
| 148 | sb1_cache_init(); | ||
| 149 | return; | ||
| 150 | } | ||
| 151 | |||
| 152 | panic(cache_panic); | ||
| 157 | } | 153 | } |
