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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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