[PATCH] sparc: convert IO remapping to VM_PFNMAP
Here are the Sparc bits. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
6aab341e0a
commit
5cd9194a1b
|
@ -32,9 +32,7 @@ static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte, unsigne
|
||||||
if (end > PMD_SIZE)
|
if (end > PMD_SIZE)
|
||||||
end = PMD_SIZE;
|
end = PMD_SIZE;
|
||||||
do {
|
do {
|
||||||
pte_t oldpage = *pte;
|
set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space));
|
||||||
pte_clear(mm, address, pte);
|
|
||||||
set_pte(pte, mk_pte_io(offset, prot, space));
|
|
||||||
address += PAGE_SIZE;
|
address += PAGE_SIZE;
|
||||||
offset += PAGE_SIZE;
|
offset += PAGE_SIZE;
|
||||||
pte++;
|
pte++;
|
||||||
|
@ -63,7 +61,7 @@ static inline int io_remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned
|
||||||
}
|
}
|
||||||
|
|
||||||
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
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;
|
int error = 0;
|
||||||
pgd_t * dir;
|
pgd_t * dir;
|
||||||
|
@ -74,7 +72,9 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
||||||
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
||||||
|
|
||||||
/* See comment in mm/memory.c remap_pfn_range */
|
/* 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);
|
prot = __pgprot(pg_iobits);
|
||||||
offset -= from;
|
offset -= from;
|
||||||
|
|
|
@ -15,6 +15,15 @@
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/tlbflush.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
|
/* Remap IO memory, the same way as remap_pfn_range(), but use
|
||||||
* the obio memory space.
|
* the obio memory space.
|
||||||
*
|
*
|
||||||
|
@ -126,9 +135,13 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
||||||
struct mm_struct *mm = vma->vm_mm;
|
struct mm_struct *mm = vma->vm_mm;
|
||||||
int space = GET_IOSPACE(pfn);
|
int space = GET_IOSPACE(pfn);
|
||||||
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
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 */
|
/* 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);
|
prot = __pgprot(pg_iobits);
|
||||||
offset -= from;
|
offset -= from;
|
||||||
|
|
|
@ -348,16 +348,6 @@ extern unsigned long find_ecache_flush_span(unsigned long size);
|
||||||
struct vm_area_struct;
|
struct vm_area_struct;
|
||||||
extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
|
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 */
|
/* Encode and de-code a swap entry */
|
||||||
#define __swp_type(entry) (((entry).val >> PAGE_SHIFT) & 0xffUL)
|
#define __swp_type(entry) (((entry).val >> PAGE_SHIFT) & 0xffUL)
|
||||||
#define __swp_offset(entry) ((entry).val >> (PAGE_SHIFT + 8UL))
|
#define __swp_offset(entry) ((entry).val >> (PAGE_SHIFT + 8UL))
|
||||||
|
|
Loading…
Reference in New Issue