aboutsummaryrefslogtreecommitdiff
path: root/arch/mips/mm/highmem.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-05-14 19:19:43 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-05-14 19:19:43 -0700
commitc48f2295a96d12c1c57d4655890af9984d3c061c (patch)
tree9d7e96fd4307a896763b4658f33640423f3d244c /arch/mips/mm/highmem.c
parent5732c468495effd3089c1c893f3eba9a8a1d373c (diff)
parent5d81b83d03eb32085c569854695e102dde7af544 (diff)
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (38 commits) MIPS: Sibyte: Fix locking in set_irq_affinity MIPS: Use force_sig when handling address errors. MIPS: Cavium: Add struct clocksource * argument to octeon_cvmcount_read() MIPS: Rewrite <asm/div64.h> to work with gcc 4.4.0. MIPS: Fix highmem. MIPS: Fix sign-extension bug in 32-bit kernel on 32-bit hardware. MIPS: MSP71xx: Remove the RAMROOT functions MIPS: Use -mno-check-zero-division MIPS: Set compiler options only after the compiler prefix has ben set. MIPS: IP27: Get rid of #ident. Gcc 4.4.0 doesn't like it. MIPS: uaccess: Switch lock annotations to might_fault(). MIPS: MSP71xx: Resolve use of non-existent GPIO routines in msp71xx reset MIPS: MSP71xx: Resolve multiple definition of plat_timer_setup MIPS: Make uaccess.h slightly more sparse friendly. MIPS: Make access_ok() sideeffect proof. MIPS: IP27: Fix clash with NMI_OFFSET from hardirq.h MIPS: Alchemy: Timer build fix MIPS: Kconfig: Delete duplicate definition of RWSEM_GENERIC_SPINLOCK. MIPS: Cavium: Add support for 8k and 32k page sizes. MIPS: TXx9: Fix possible overflow in clock calculations ...
Diffstat (limited to 'arch/mips/mm/highmem.c')
-rw-r--r--arch/mips/mm/highmem.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c
index 4481656d106..2b1309b2580 100644
--- a/arch/mips/mm/highmem.c
+++ b/arch/mips/mm/highmem.c
@@ -1,7 +1,12 @@
#include <linux/module.h>
#include <linux/highmem.h>
+#include <asm/fixmap.h>
#include <asm/tlbflush.h>
+static pte_t *kmap_pte;
+
+unsigned long highstart_pfn, highend_pfn;
+
void *__kmap(struct page *page)
{
void *addr;
@@ -14,6 +19,7 @@ void *__kmap(struct page *page)
return addr;
}
+EXPORT_SYMBOL(__kmap);
void __kunmap(struct page *page)
{
@@ -22,6 +28,7 @@ void __kunmap(struct page *page)
return;
kunmap_high(page);
}
+EXPORT_SYMBOL(__kunmap);
/*
* kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because
@@ -48,11 +55,12 @@ void *__kmap_atomic(struct page *page, enum km_type type)
#ifdef CONFIG_DEBUG_HIGHMEM
BUG_ON(!pte_none(*(kmap_pte - idx)));
#endif
- set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
+ set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL));
local_flush_tlb_one((unsigned long)vaddr);
return (void*) vaddr;
}
+EXPORT_SYMBOL(__kmap_atomic);
void __kunmap_atomic(void *kvaddr, enum km_type type)
{
@@ -77,6 +85,7 @@ void __kunmap_atomic(void *kvaddr, enum km_type type)
pagefault_enable();
}
+EXPORT_SYMBOL(__kunmap_atomic);
/*
* This is the same as kmap_atomic() but can map memory that doesn't
@@ -92,7 +101,7 @@ void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
debug_kmap_atomic(type);
idx = type + KM_TYPE_NR*smp_processor_id();
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
- set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
+ set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
flush_tlb_one(vaddr);
return (void*) vaddr;
@@ -111,7 +120,11 @@ struct page *__kmap_atomic_to_page(void *ptr)
return pte_page(*pte);
}
-EXPORT_SYMBOL(__kmap);
-EXPORT_SYMBOL(__kunmap);
-EXPORT_SYMBOL(__kmap_atomic);
-EXPORT_SYMBOL(__kunmap_atomic);
+void __init kmap_init(void)
+{
+ unsigned long kmap_vstart;
+
+ /* cache the first kmap pte */
+ kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
+ kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
+}