Here are the Sparc bits.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
        if (end > PMD_SIZE)
                end = PMD_SIZE;
        do {
-               pte_t oldpage = *pte;
-               pte_clear(mm, address, pte);
-               set_pte(pte, mk_pte_io(offset, prot, space));
+               set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space));
                address += PAGE_SIZE;
                offset += PAGE_SIZE;
                pte++;
 }
 
 int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
-                       unsigned long pfn, unsigned long size, pgprot_t prot)
+                      unsigned long pfn, unsigned long size, pgprot_t prot)
 {
        int error = 0;
        pgd_t * dir;
        unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
 
        /* See comment in mm/memory.c remap_pfn_range */
-       vma->vm_flags |= VM_IO | VM_RESERVED | VM_UNPAGED;
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
+       vma->vm_pgoff = (offset >> PAGE_SHIFT) |
+               ((unsigned long)space << 28UL);
 
        prot = __pgprot(pg_iobits);
        offset -= from;
 
 #include <asm/page.h>
 #include <asm/tlbflush.h>
 
+static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space)
+{
+       pte_t pte;
+       pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) &
+                       ~(unsigned long)_PAGE_CACHE);
+       pte_val(pte) |= (((unsigned long)space) << 32);
+       return pte;
+}
+
 /* Remap IO memory, the same way as remap_pfn_range(), but use
  * the obio memory space.
  *
        struct mm_struct *mm = vma->vm_mm;
        int space = GET_IOSPACE(pfn);
        unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
+       unsigned long phys_base;
+
+       phys_base = offset | (((unsigned long) space) << 32UL);
 
        /* See comment in mm/memory.c remap_pfn_range */
-       vma->vm_flags |= VM_IO | VM_RESERVED | VM_UNPAGED;
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
+       vma->vm_pgoff = phys_base >> PAGE_SHIFT;
 
        prot = __pgprot(pg_iobits);
        offset -= from;
 
 struct vm_area_struct;
 extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
 
-/* Make a non-present pseudo-TTE. */
-static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space)
-{
-       pte_t pte;
-       pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) &
-                       ~(unsigned long)_PAGE_CACHE);
-       pte_val(pte) |= (((unsigned long)space) << 32);
-       return pte;
-}
-
 /* Encode and de-code a swap entry */
 #define __swp_type(entry)      (((entry).val >> PAGE_SHIFT) & 0xffUL)
 #define __swp_offset(entry)    ((entry).val >> (PAGE_SHIFT + 8UL))