diff options
Diffstat (limited to 'arch/sparc/mm/highmem.c')
| -rw-r--r-- | arch/sparc/mm/highmem.c | 47 | 
1 files changed, 24 insertions, 23 deletions
diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 4730eac0747..449f864f0ce 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -22,14 +22,33 @@   * shared by CPUs, and so precious, and establishing them requires IPI.   * Atomic kmaps are lightweight and we may have NCPUS more of them.   */ -#include <linux/mm.h>  #include <linux/highmem.h> -#include <asm/pgalloc.h> +#include <linux/export.h> +#include <linux/mm.h> +  #include <asm/cacheflush.h>  #include <asm/tlbflush.h> -#include <asm/fixmap.h> +#include <asm/pgalloc.h> +#include <asm/vaddrs.h> + +pgprot_t kmap_prot; -void *__kmap_atomic(struct page *page) +static pte_t *kmap_pte; + +void __init kmap_init(void) +{ +	unsigned long address; +	pmd_t *dir; + +	address = __fix_to_virt(FIX_KMAP_BEGIN); +	dir = pmd_offset(pgd_offset_k(address), address); + +        /* cache the first kmap pte */ +        kmap_pte = pte_offset_kernel(dir, address); +        kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); +} + +void *kmap_atomic(struct page *page)  {  	unsigned long vaddr;  	long idx, type; @@ -63,7 +82,7 @@ void *__kmap_atomic(struct page *page)  	return (void*) vaddr;  } -EXPORT_SYMBOL(__kmap_atomic); +EXPORT_SYMBOL(kmap_atomic);  void __kunmap_atomic(void *kvaddr)  { @@ -109,21 +128,3 @@ void __kunmap_atomic(void *kvaddr)  	pagefault_enable();  }  EXPORT_SYMBOL(__kunmap_atomic); - -/* We may be fed a pagetable here by ptep_to_xxx and others. */ -struct page *kmap_atomic_to_page(void *ptr) -{ -	unsigned long idx, vaddr = (unsigned long)ptr; -	pte_t *pte; - -	if (vaddr < SRMMU_NOCACHE_VADDR) -		return virt_to_page(ptr); -	if (vaddr < PKMAP_BASE) -		return pfn_to_page(__nocache_pa(vaddr) >> PAGE_SHIFT); -	BUG_ON(vaddr < FIXADDR_START); -	BUG_ON(vaddr > FIXADDR_TOP); - -	idx = virt_to_fix(vaddr); -	pte = kmap_pte - (idx - FIX_KMAP_BEGIN); -	return pte_page(*pte); -}  | 
