11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for more details. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6641e97f318870921d048154af6807e46e43c307aRalf Baechle * Copyright (C) 1994 - 2003, 06, 07 by Ralf Baechle (ralf@linux-mips.org) 77575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle * Copyright (C) 2007 MIPS Technologies, Inc. 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 924e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle#include <linux/fs.h> 1024e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle#include <linux/fcntl.h> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 12641e97f318870921d048154af6807e46e43c307aRalf Baechle#include <linux/linkage.h> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h> 15dbda6ac0897603f6c6dfadbbc37f9882177ec7acRalf Baechle#include <linux/syscalls.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h> 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/cacheflush.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/cpu.h> 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/cpu-features.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Cache operations. */ 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_cache_all)(void); 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*__flush_cache_all)(void); 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_cache_mm)(struct mm_struct *mm); 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long end); 2953de0d471fe8ddbbeca938cffedb4cc94e04da10Ralf Baechlevoid (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, 3053de0d471fe8ddbbeca938cffedb4cc94e04da10Ralf Baechle unsigned long pfn); 31d4264f183967db9c2dae4275abb98eb1f79facb2Atsushi Nemotovoid (*flush_icache_range)(unsigned long start, unsigned long end); 328229f1a044894f84324292608c149f0b4563532bKees CookEXPORT_SYMBOL_GPL(flush_icache_range); 33e0cee3eea7875800451739ae38f99edcf11c133dThomas Bogendoerfervoid (*local_flush_icache_range)(unsigned long start, unsigned long end); 3490f91356c7d67ddd98d817838df69335cb831eaaJames HoganEXPORT_SYMBOL_GPL(local_flush_icache_range); 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 369c5a3d729cf430609d091ff610a7db363aafcd47Ralf Baechlevoid (*__flush_cache_vmap)(void); 379c5a3d729cf430609d091ff610a7db363aafcd47Ralf Baechlevoid (*__flush_cache_vunmap)(void); 389c5a3d729cf430609d091ff610a7db363aafcd47Ralf Baechle 39d9cdc901af0f92da7f90c750d8c187f5500be067Ralf Baechlevoid (*__flush_kernel_vmap_range)(unsigned long vaddr, int size); 40d9cdc901af0f92da7f90c750d8c187f5500be067Ralf BaechleEXPORT_SYMBOL_GPL(__flush_kernel_vmap_range); 418229f1a044894f84324292608c149f0b4563532bKees Cookvoid (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size); 42d9cdc901af0f92da7f90c750d8c187f5500be067Ralf Baechle 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* MIPS specific cache operations */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_cache_sigtramp)(unsigned long addr); 457e3bfc7cfc402458b0386086ab650ce811720927Ralf Baechlevoid (*local_flush_data_cache_page)(void * addr); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_data_cache_page)(unsigned long addr); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*flush_icache_all)(void); 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 499202f32558601c2c99ddc438eb3218131d00d413Ralf BaechleEXPORT_SYMBOL_GPL(local_flush_data_cache_page); 509ff77c469ed16221c6a4e882e48e4f0dcf451bdaRalf BaechleEXPORT_SYMBOL(flush_data_cache_page); 51f2e3656d23b7e2465da22966feef6170e9b28b2bSanjay LalEXPORT_SYMBOL(flush_icache_all); 529ff77c469ed16221c6a4e882e48e4f0dcf451bdaRalf Baechle 538005711c8d80e452748e9572bead54493818f042Manuel Lauss#if defined(CONFIG_DMA_NONCOHERENT) || defined(CONFIG_DMA_MAYBE_COHERENT) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DMA cache operations. */ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*_dma_cache_wback_inv)(unsigned long start, unsigned long size); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*_dma_cache_wback)(unsigned long start, unsigned long size); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid (*_dma_cache_inv)(unsigned long start, unsigned long size); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(_dma_cache_wback_inv); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 628005711c8d80e452748e9572bead54493818f042Manuel Lauss#endif /* CONFIG_DMA_NONCOHERENT || CONFIG_DMA_MAYBE_COHERENT */ 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We could optimize the case where the cache argument is not BCACHE but 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that seems very atypical use ... 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 68dbda6ac0897603f6c6dfadbbc37f9882177ec7acRalf BaechleSYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes, 69dbda6ac0897603f6c6dfadbbc37f9882177ec7acRalf Baechle unsigned int, cache) 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 71750ccf687ff9adbf2a16066a3a2757d0f761384cAtsushi Nemoto if (bytes == 0) 72750ccf687ff9adbf2a16066a3a2757d0f761384cAtsushi Nemoto return 0; 73fe00f943e0ef98b4057abcc2940d631a975b43cdRalf Baechle if (!access_ok(VERIFY_WRITE, (void __user *) addr, bytes)) 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EFAULT; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds flush_icache_range(addr, addr + bytes); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __flush_dcache_page(struct page *page) 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct address_space *mapping = page_mapping(page); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long addr; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 86585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle if (PageHighMem(page)) 87585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle return; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (mapping && !mapping_mapped(mapping)) { 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SetPageDcacheDirty(page); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We could delay the flush for the !page_mapping case too. But that 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * case is for exec env/arg pages and those are %99 certainly going to 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * get faulted into the tlb (and thus flushed) anyways. 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds addr = (unsigned long) page_address(page); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds flush_data_cache_page(addr); 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(__flush_dcache_page); 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1047575a49f209190ca640e0da792565a1bcb641f3eRalf Baechlevoid __flush_anon_page(struct page *page, unsigned long vmaddr) 1057575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle{ 1069a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle unsigned long addr = (unsigned long) page_address(page); 1077575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle 1089a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle if (pages_do_alias(addr, vmaddr)) { 1099a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle if (page_mapped(page) && !Page_dcache_dirty(page)) { 1109a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle void *kaddr; 1119a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle 1129a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle kaddr = kmap_coherent(page, vmaddr); 1139a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle flush_data_cache_page((unsigned long)kaddr); 1149a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle kunmap_coherent(); 1159a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle } else 1169a74b3eb22f2d67a5681301f52aca5b7703382c8Ralf Baechle flush_data_cache_page(addr); 1177575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle } 1187575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle} 1197575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle 1207575a49f209190ca640e0da792565a1bcb641f3eRalf BaechleEXPORT_SYMBOL(__flush_anon_page); 1217575a49f209190ca640e0da792565a1bcb641f3eRalf Baechle 1222a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Perssonstatic void mips_flush_dcache_from_pte(pte_t pteval, unsigned long address) 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct page *page; 1252a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson unsigned long pfn = pte_pfn(pteval); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 127585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle if (unlikely(!pfn_valid(pfn))) 128585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle return; 1292a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson 130585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle page = pfn_to_page(pfn); 131585fa72493edd7d5acb308806e7bb609412c6228Ralf Baechle if (page_mapping(page) && Page_dcache_dirty(page)) { 1322a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson unsigned long page_addr = (unsigned long) page_address(page); 1332a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson 1342a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson if (!cpu_has_ic_fills_f_dc || 1352a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson pages_do_alias(page_addr, address & PAGE_MASK)) 1362a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson flush_data_cache_page(page_addr); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ClearPageDcacheDirty(page); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1412a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Perssonvoid set_pte_at(struct mm_struct *mm, unsigned long addr, 1422a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson pte_t *ptep, pte_t pteval) 1432a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson{ 1442a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) { 1452a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson if (pte_present(pteval)) 1462a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson mips_flush_dcache_from_pte(pteval, addr); 1472a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson } 1482a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson 1492a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson set_pte(ptep, pteval); 1502a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson} 1512a4a8b1e5d9d343e13ff22e19af7b353f7b52d6fLars Persson 152351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearmanunsigned long _page_cachable_default; 1537b3e543ddb39b69b75c9c24bb54180eca152f541Anton AltaparmakovEXPORT_SYMBOL(_page_cachable_default); 154351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearman 155351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearmanstatic inline void setup_protection_map(void) 156351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearman{ 15705857c64ecf897209c16ffad9bb3e8d359dd5dcaSteven J. Hill if (cpu_has_rixi) { 1586dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[0] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); 1596dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[1] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); 1606dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[2] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); 1616dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[3] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); 1626dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[4] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); 1636dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[5] = __pgprot(_page_cachable_default | _PAGE_PRESENT); 1646dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[6] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); 1656dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[7] = __pgprot(_page_cachable_default | _PAGE_PRESENT); 1666dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney 1676dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[8] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); 1686dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[9] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC); 1696dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[10] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | _PAGE_NO_READ); 1706dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[11] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE); 1716dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[12] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ); 1726dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[13] = __pgprot(_page_cachable_default | _PAGE_PRESENT); 1736dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[14] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE | _PAGE_NO_READ); 1746dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[15] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE); 1756dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney 1766dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney } else { 1776dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[0] = PAGE_NONE; 1786dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[1] = PAGE_READONLY; 1796dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[2] = PAGE_COPY; 1806dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[3] = PAGE_COPY; 1816dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[4] = PAGE_READONLY; 1826dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[5] = PAGE_READONLY; 1836dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[6] = PAGE_COPY; 1846dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[7] = PAGE_COPY; 1856dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[8] = PAGE_NONE; 1866dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[9] = PAGE_READONLY; 1876dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[10] = PAGE_SHARED; 1886dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[11] = PAGE_SHARED; 1896dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[12] = PAGE_READONLY; 1906dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[13] = PAGE_READONLY; 1916dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[14] = PAGE_SHARED; 1926dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney protection_map[15] = PAGE_SHARED; 1936dd9344cfc41bcc60a01cdc828cb278be7a10e01David Daney } 194351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearman} 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 196078a55fc824c1633b3a507e4ad48b4637c1dfc18Paul Gortmakervoid cpu_cache_init(void) 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 19802cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle if (cpu_has_3k_cache) { 19902cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle extern void __weak r3k_cache_init(void); 20002cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 20102cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle r3k_cache_init(); 20202cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle } 20302cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle if (cpu_has_6k_cache) { 20402cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle extern void __weak r6k_cache_init(void); 20502cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 20602cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle r6k_cache_init(); 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 20802cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle if (cpu_has_4k_cache) { 20902cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle extern void __weak r4k_cache_init(void); 21002cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 21102cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle r4k_cache_init(); 21202cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle } 21302cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle if (cpu_has_8k_cache) { 21402cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle extern void __weak r8k_cache_init(void); 21502cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 21602cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle r8k_cache_init(); 21702cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle } 21802cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle if (cpu_has_tx39_cache) { 21902cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle extern void __weak tx39_cache_init(void); 22002cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 22102cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle tx39_cache_init(); 22202cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle } 22302cf2119684e52e97a8a90bd7630386e0f1a250aRalf Baechle 22447d979eca33f8df49bfead2d5efa23a70b413882David Daney if (cpu_has_octeon_cache) { 22547d979eca33f8df49bfead2d5efa23a70b413882David Daney extern void __weak octeon_cache_init(void); 22647d979eca33f8df49bfead2d5efa23a70b413882David Daney 22747d979eca33f8df49bfead2d5efa23a70b413882David Daney octeon_cache_init(); 22847d979eca33f8df49bfead2d5efa23a70b413882David Daney } 22947d979eca33f8df49bfead2d5efa23a70b413882David Daney 230351336929ccf222ae38ff0cb7a8dd5fd5c6236a0Chris Dearman setup_protection_map(); 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 23224e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle 23324e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechleint __weak __uncached_access(struct file *file, unsigned long addr) 23424e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle{ 2356b2f3d1f769be5779b479c37800229d9a4809fc3Christoph Hellwig if (file->f_flags & O_DSYNC) 23624e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle return 1; 23724e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle 23824e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle return addr >= __pa(high_memory); 23924e9d0b96dac5503c0b6f034d553030c604228a7Ralf Baechle} 240