xref: /OK3568_Linux_fs/kernel/arch/xtensa/include/asm/highmem.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * include/asm-xtensa/highmem.h
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * This file is subject to the terms and conditions of the GNU General
5*4882a593Smuzhiyun  * Public License.  See the file "COPYING" in the main directory of
6*4882a593Smuzhiyun  * this archive for more details.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 2003 - 2005 Tensilica Inc.
9*4882a593Smuzhiyun  * Copyright (C) 2014 Cadence Design Systems Inc.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef _XTENSA_HIGHMEM_H
13*4882a593Smuzhiyun #define _XTENSA_HIGHMEM_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/wait.h>
16*4882a593Smuzhiyun #include <linux/pgtable.h>
17*4882a593Smuzhiyun #include <asm/cacheflush.h>
18*4882a593Smuzhiyun #include <asm/fixmap.h>
19*4882a593Smuzhiyun #include <asm/kmap_types.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define PKMAP_BASE		((FIXADDR_START - \
22*4882a593Smuzhiyun 				  (LAST_PKMAP + 1) * PAGE_SIZE) & PMD_MASK)
23*4882a593Smuzhiyun #define LAST_PKMAP		(PTRS_PER_PTE * DCACHE_N_COLORS)
24*4882a593Smuzhiyun #define LAST_PKMAP_MASK		(LAST_PKMAP - 1)
25*4882a593Smuzhiyun #define PKMAP_NR(virt)		(((virt) - PKMAP_BASE) >> PAGE_SHIFT)
26*4882a593Smuzhiyun #define PKMAP_ADDR(nr)		(PKMAP_BASE + ((nr) << PAGE_SHIFT))
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define kmap_prot		PAGE_KERNEL_EXEC
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #if DCACHE_WAY_SIZE > PAGE_SIZE
31*4882a593Smuzhiyun #define get_pkmap_color get_pkmap_color
get_pkmap_color(struct page * page)32*4882a593Smuzhiyun static inline int get_pkmap_color(struct page *page)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	return DCACHE_ALIAS(page_to_phys(page));
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun extern unsigned int last_pkmap_nr_arr[];
38*4882a593Smuzhiyun 
get_next_pkmap_nr(unsigned int color)39*4882a593Smuzhiyun static inline unsigned int get_next_pkmap_nr(unsigned int color)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	last_pkmap_nr_arr[color] =
42*4882a593Smuzhiyun 		(last_pkmap_nr_arr[color] + DCACHE_N_COLORS) & LAST_PKMAP_MASK;
43*4882a593Smuzhiyun 	return last_pkmap_nr_arr[color] + color;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
no_more_pkmaps(unsigned int pkmap_nr,unsigned int color)46*4882a593Smuzhiyun static inline int no_more_pkmaps(unsigned int pkmap_nr, unsigned int color)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	return pkmap_nr < DCACHE_N_COLORS;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
get_pkmap_entries_count(unsigned int color)51*4882a593Smuzhiyun static inline int get_pkmap_entries_count(unsigned int color)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	return LAST_PKMAP / DCACHE_N_COLORS;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun extern wait_queue_head_t pkmap_map_wait_arr[];
57*4882a593Smuzhiyun 
get_pkmap_wait_queue_head(unsigned int color)58*4882a593Smuzhiyun static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	return pkmap_map_wait_arr + color;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun extern pte_t *pkmap_page_table;
65*4882a593Smuzhiyun 
flush_cache_kmaps(void)66*4882a593Smuzhiyun static inline void flush_cache_kmaps(void)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	flush_cache_all();
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun void kmap_init(void);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #endif
74