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

[PATCH] sparc: convert IO remapping to VM_PFNMAP

Here are the Sparc bits.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

David S. Miller and committed by
Linus Torvalds
5cd9194a 6aab341e

+19 -16
+5 -5
arch/sparc/mm/generic.c
··· 32 32 if (end > PMD_SIZE) 33 33 end = PMD_SIZE; 34 34 do { 35 - pte_t oldpage = *pte; 36 - pte_clear(mm, address, pte); 37 - set_pte(pte, mk_pte_io(offset, prot, space)); 35 + set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space)); 38 36 address += PAGE_SIZE; 39 37 offset += PAGE_SIZE; 40 38 pte++; ··· 61 63 } 62 64 63 65 int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from, 64 - unsigned long pfn, unsigned long size, pgprot_t prot) 66 + unsigned long pfn, unsigned long size, pgprot_t prot) 65 67 { 66 68 int error = 0; 67 69 pgd_t * dir; ··· 72 74 unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; 73 75 74 76 /* See comment in mm/memory.c remap_pfn_range */ 75 - vma->vm_flags |= VM_IO | VM_RESERVED | VM_UNPAGED; 77 + vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; 78 + vma->vm_pgoff = (offset >> PAGE_SHIFT) | 79 + ((unsigned long)space << 28UL); 76 80 77 81 prot = __pgprot(pg_iobits); 78 82 offset -= from;
+14 -1
arch/sparc64/mm/generic.c
··· 15 15 #include <asm/page.h> 16 16 #include <asm/tlbflush.h> 17 17 18 + static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space) 19 + { 20 + pte_t pte; 21 + pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) & 22 + ~(unsigned long)_PAGE_CACHE); 23 + pte_val(pte) |= (((unsigned long)space) << 32); 24 + return pte; 25 + } 26 + 18 27 /* Remap IO memory, the same way as remap_pfn_range(), but use 19 28 * the obio memory space. 20 29 * ··· 135 126 struct mm_struct *mm = vma->vm_mm; 136 127 int space = GET_IOSPACE(pfn); 137 128 unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; 129 + unsigned long phys_base; 130 + 131 + phys_base = offset | (((unsigned long) space) << 32UL); 138 132 139 133 /* See comment in mm/memory.c remap_pfn_range */ 140 - vma->vm_flags |= VM_IO | VM_RESERVED | VM_UNPAGED; 134 + vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; 135 + vma->vm_pgoff = phys_base >> PAGE_SHIFT; 141 136 142 137 prot = __pgprot(pg_iobits); 143 138 offset -= from;
-10
include/asm-sparc64/pgtable.h
··· 348 348 struct vm_area_struct; 349 349 extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t); 350 350 351 - /* Make a non-present pseudo-TTE. */ 352 - static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space) 353 - { 354 - pte_t pte; 355 - pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) & 356 - ~(unsigned long)_PAGE_CACHE); 357 - pte_val(pte) |= (((unsigned long)space) << 32); 358 - return pte; 359 - } 360 - 361 351 /* Encode and de-code a swap entry */ 362 352 #define __swp_type(entry) (((entry).val >> PAGE_SHIFT) & 0xffUL) 363 353 #define __swp_offset(entry) ((entry).val >> (PAGE_SHIFT + 8UL))