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

[SPARC]: Respect vm_page_prot in io_remap_page_range().

Make sure the callers do a pgprot_noncached() on
vma->vm_page_prot.

Pointed out by Hugh Dickens.

Signed-off-by: David S. Miller <davem@davemloft.net>

+29 -21
-1
arch/sparc/mm/generic.c
··· 76 76 vma->vm_pgoff = (offset >> PAGE_SHIFT) | 77 77 ((unsigned long)space << 28UL); 78 78 79 - prot = __pgprot(pg_iobits); 80 79 offset -= from; 81 80 dir = pgd_offset(mm, from); 82 81 flush_cache_range(vma, beg, end);
-2
arch/sparc/mm/loadmmu.c
··· 22 22 struct ctx_list ctx_free; 23 23 struct ctx_list ctx_used; 24 24 25 - unsigned int pg_iobits; 26 - 27 25 extern void ld_mmu_sun4c(void); 28 26 extern void ld_mmu_srmmu(void); 29 27
+8 -1
arch/sparc/mm/srmmu.c
··· 2130 2130 return pte_val(pte) >> SRMMU_PTE_FILE_SHIFT; 2131 2131 } 2132 2132 2133 + static pgprot_t srmmu_pgprot_noncached(pgprot_t prot) 2134 + { 2135 + prot &= ~__pgprot(SRMMU_CACHE); 2136 + 2137 + return prot; 2138 + } 2139 + 2133 2140 /* Load up routines and constants for sun4m and sun4d mmu */ 2134 2141 void __init ld_mmu_srmmu(void) 2135 2142 { ··· 2157 2150 BTFIXUPSET_INT(page_readonly, pgprot_val(SRMMU_PAGE_RDONLY)); 2158 2151 BTFIXUPSET_INT(page_kernel, pgprot_val(SRMMU_PAGE_KERNEL)); 2159 2152 page_kernel = pgprot_val(SRMMU_PAGE_KERNEL); 2160 - pg_iobits = SRMMU_VALID | SRMMU_WRITE | SRMMU_REF; 2161 2153 2162 2154 /* Functions */ 2155 + BTFIXUPSET_CALL(pgprot_noncached, srmmu_pgprot_noncached, BTFIXUPCALL_NORM); 2163 2156 #ifndef CONFIG_SMP 2164 2157 BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4md, BTFIXUPCALL_SWAPG1G2); 2165 2158 #endif
+12 -3
arch/sparc/mm/sun4c.c
··· 1589 1589 1590 1590 static inline void sun4c_mapioaddr(unsigned long physaddr, unsigned long virt_addr) 1591 1591 { 1592 - unsigned long page_entry; 1592 + unsigned long page_entry, pg_iobits; 1593 + 1594 + pg_iobits = _SUN4C_PAGE_PRESENT | _SUN4C_READABLE | _SUN4C_WRITEABLE | 1595 + _SUN4C_PAGE_IO | _SUN4C_PAGE_NOCACHE; 1593 1596 1594 1597 page_entry = ((physaddr >> PAGE_SHIFT) & SUN4C_PFN_MASK); 1595 1598 page_entry |= ((pg_iobits | _SUN4C_PAGE_PRIV) & ~(_SUN4C_PAGE_PRESENT)); ··· 2137 2134 printk("SUN4C: %d mmu entries for the kernel\n", cnt); 2138 2135 } 2139 2136 2137 + static pgprot_t sun4c_pgprot_noncached(pgprot_t prot) 2138 + { 2139 + prot |= __pgprot(_SUN4C_PAGE_IO | _SUN4C_PAGE_NOCACHE); 2140 + 2141 + return prot; 2142 + } 2143 + 2140 2144 /* Load up routines and constants for sun4c mmu */ 2141 2145 void __init ld_mmu_sun4c(void) 2142 2146 { ··· 2166 2156 BTFIXUPSET_INT(page_readonly, pgprot_val(SUN4C_PAGE_READONLY)); 2167 2157 BTFIXUPSET_INT(page_kernel, pgprot_val(SUN4C_PAGE_KERNEL)); 2168 2158 page_kernel = pgprot_val(SUN4C_PAGE_KERNEL); 2169 - pg_iobits = _SUN4C_PAGE_PRESENT | _SUN4C_READABLE | _SUN4C_WRITEABLE | 2170 - _SUN4C_PAGE_IO | _SUN4C_PAGE_NOCACHE; 2171 2159 2172 2160 /* Functions */ 2161 + BTFIXUPSET_CALL(pgprot_noncached, sun4c_pgprot_noncached, BTFIXUPCALL_NORM); 2173 2162 BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4c, BTFIXUPCALL_NORM); 2174 2163 BTFIXUPSET_CALL(do_check_pgt_cache, sun4c_check_pgt_cache, BTFIXUPCALL_NORM); 2175 2164
+1 -1
arch/sparc64/kernel/pci.c
··· 656 656 __pci_mmap_set_flags(dev, vma, mmap_state); 657 657 __pci_mmap_set_pgprot(dev, vma, mmap_state); 658 658 659 + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 659 660 ret = io_remap_pfn_range(vma, vma->vm_start, 660 661 vma->vm_pgoff, 661 662 vma->vm_end - vma->vm_start, ··· 664 663 if (ret) 665 664 return ret; 666 665 667 - vma->vm_flags |= VM_IO; 668 666 return 0; 669 667 } 670 668
-1
arch/sparc64/mm/generic.c
··· 140 140 vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; 141 141 vma->vm_pgoff = phys_base >> PAGE_SHIFT; 142 142 143 - prot = __pgprot(pg_iobits); 144 143 offset -= from; 145 144 dir = pgd_offset(mm, from); 146 145 flush_cache_range(vma, beg, end);
+1
drivers/char/drm/drm_vm.c
··· 619 619 #endif 620 620 offset = dev->driver->get_reg_ofs(dev); 621 621 #ifdef __sparc__ 622 + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 622 623 if (io_remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, 623 624 (map->offset + offset) >> PAGE_SHIFT, 624 625 vma->vm_end - vma->vm_start,
+1 -2
drivers/sbus/char/flash.c
··· 71 71 if (vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)) > size) 72 72 size = vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)); 73 73 74 - pgprot_val(vma->vm_page_prot) &= ~(_PAGE_CACHE); 75 - pgprot_val(vma->vm_page_prot) |= _PAGE_E; 76 74 vma->vm_flags |= (VM_SHM | VM_LOCKED); 75 + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 77 76 78 77 if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) 79 78 return -EAGAIN;
+1 -7
drivers/video/fbmem.c
··· 1169 1169 vma->vm_pgoff = off >> PAGE_SHIFT; 1170 1170 /* This is an IO map - tell maydump to skip this VMA */ 1171 1171 vma->vm_flags |= VM_IO | VM_RESERVED; 1172 - #if defined(__sparc_v9__) 1173 - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, 1174 - vma->vm_end - vma->vm_start, vma->vm_page_prot)) 1175 - return -EAGAIN; 1176 - #else 1177 1172 #if defined(__mc68000__) 1178 1173 #if defined(CONFIG_SUN3) 1179 1174 pgprot_val(vma->vm_page_prot) |= SUN3_PAGE_NOCACHE; ··· 1190 1195 #elif defined(__i386__) || defined(__x86_64__) 1191 1196 if (boot_cpu_data.x86 > 3) 1192 1197 pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; 1193 - #elif defined(__mips__) 1198 + #elif defined(__mips__) || defined(__sparc_v9__) 1194 1199 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1195 1200 #elif defined(__hppa__) 1196 1201 pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; ··· 1207 1212 if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, 1208 1213 vma->vm_end - vma->vm_start, vma->vm_page_prot)) 1209 1214 return -EAGAIN; 1210 - #endif /* !__sparc_v9__ */ 1211 1215 return 0; 1212 1216 #endif /* !sparc32 */ 1213 1217 }
+2
drivers/video/sbuslib.c
··· 58 58 /* To stop the swapper from even considering these pages */ 59 59 vma->vm_flags |= (VM_IO | VM_RESERVED); 60 60 61 + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 62 + 61 63 /* Each page, see which map applies */ 62 64 for (page = 0; page < size; ){ 63 65 map_size = 0;
+3 -3
include/asm-sparc/pgtable.h
··· 269 269 270 270 BTFIXUPDEF_CALL_CONST(pte_t, mk_pte_phys, unsigned long, pgprot_t) 271 271 BTFIXUPDEF_CALL_CONST(pte_t, mk_pte_io, unsigned long, pgprot_t, int) 272 + BTFIXUPDEF_CALL_CONST(pgprot_t, pgprot_noncached, pgprot_t) 272 273 273 274 #define mk_pte(page,pgprot) BTFIXUP_CALL(mk_pte)(page,pgprot) 274 275 #define mk_pte_phys(page,pgprot) BTFIXUP_CALL(mk_pte_phys)(page,pgprot) 275 276 #define mk_pte_io(page,pgprot,space) BTFIXUP_CALL(mk_pte_io)(page,pgprot,space) 277 + 278 + #define pgprot_noncached(pgprot) BTFIXUP_CALL(pgprot_noncached)(pgprot) 276 279 277 280 BTFIXUPDEF_INT(pte_modify_mask) 278 281 ··· 311 308 312 309 #define pte_unmap(pte) do{}while(0) 313 310 #define pte_unmap_nested(pte) do{}while(0) 314 - 315 - /* The permissions for pgprot_val to make a page mapped on the obio space */ 316 - extern unsigned int pg_iobits; 317 311 318 312 /* Certain architectures need to do special things when pte's 319 313 * within a page table are directly modified. Thus, the following