1 #ifndef _ASM_HIGHMEM_H
2 #define _ASM_HIGHMEM_H
3 
4 #include <asm/cacheflush.h>
5 #include <asm/kmap_types.h>
6 #include <asm/fixmap.h>
7 
8 /*
9  * Right now we initialize only a single pte table. It can be extended
10  * easily, subsequent pte tables have to be allocated in one physical
11  * chunk of RAM.
12  */
13 /*
14  * Ordering is (from lower to higher memory addresses):
15  *
16  * high_memory
17  *			Persistent kmap area
18  * PKMAP_BASE
19  *			fixed_addresses
20  * FIXADDR_START
21  * FIXADDR_TOP
22  *			Vmalloc area
23  * VMALLOC_START
24  * VMALLOC_END
25  */
26 #define PKMAP_BASE		(FIXADDR_START - PMD_SIZE)
27 #define LAST_PKMAP		PTRS_PER_PTE
28 #define LAST_PKMAP_MASK		(LAST_PKMAP - 1)
29 #define PKMAP_NR(virt)		(((virt) - PKMAP_BASE) >> PAGE_SHIFT)
30 #define PKMAP_ADDR(nr)		(PKMAP_BASE + ((nr) << PAGE_SHIFT))
31 
32 #define kmap_prot		PAGE_KERNEL
33 
flush_cache_kmaps(void)34 static inline void flush_cache_kmaps(void)
35 {
36 	flush_cache_all();
37 }
38 
39 /* declarations for highmem.c */
40 extern unsigned long highstart_pfn, highend_pfn;
41 
42 extern pte_t *pkmap_page_table;
43 
44 extern void *kmap_high(struct page *page);
45 extern void kunmap_high(struct page *page);
46 
47 extern void kmap_init(void);
48 
49 /*
50  * The following functions are already defined by <linux/highmem.h>
51  * when CONFIG_HIGHMEM is not set.
52  */
53 #ifdef CONFIG_HIGHMEM
54 extern void *kmap(struct page *page);
55 extern void kunmap(struct page *page);
56 extern void *kmap_atomic(struct page *page);
57 extern void __kunmap_atomic(void *kvaddr);
58 extern void *kmap_atomic_pfn(unsigned long pfn);
59 #endif
60 
61 #endif
62