162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * include/asm-xtensa/highmem.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General 562306a36Sopenharmony_ci * Public License. See the file "COPYING" in the main directory of 662306a36Sopenharmony_ci * this archive for more details. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 2003 - 2005 Tensilica Inc. 962306a36Sopenharmony_ci * Copyright (C) 2014 Cadence Design Systems Inc. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef _XTENSA_HIGHMEM_H 1362306a36Sopenharmony_ci#define _XTENSA_HIGHMEM_H 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifdef CONFIG_HIGHMEM 1662306a36Sopenharmony_ci#include <linux/wait.h> 1762306a36Sopenharmony_ci#include <linux/pgtable.h> 1862306a36Sopenharmony_ci#include <asm/cacheflush.h> 1962306a36Sopenharmony_ci#include <asm/fixmap.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define PKMAP_BASE ((FIXADDR_START - \ 2262306a36Sopenharmony_ci (LAST_PKMAP + 1) * PAGE_SIZE) & PMD_MASK) 2362306a36Sopenharmony_ci#define LAST_PKMAP (PTRS_PER_PTE * DCACHE_N_COLORS) 2462306a36Sopenharmony_ci#define LAST_PKMAP_MASK (LAST_PKMAP - 1) 2562306a36Sopenharmony_ci#define PKMAP_NR(virt) (((virt) - PKMAP_BASE) >> PAGE_SHIFT) 2662306a36Sopenharmony_ci#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define kmap_prot PAGE_KERNEL_EXEC 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#if DCACHE_WAY_SIZE > PAGE_SIZE 3162306a36Sopenharmony_ci#define get_pkmap_color get_pkmap_color 3262306a36Sopenharmony_cistatic inline int get_pkmap_color(struct page *page) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci return DCACHE_ALIAS(page_to_phys(page)); 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciextern unsigned int last_pkmap_nr_arr[]; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic inline unsigned int get_next_pkmap_nr(unsigned int color) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci last_pkmap_nr_arr[color] = 4262306a36Sopenharmony_ci (last_pkmap_nr_arr[color] + DCACHE_N_COLORS) & LAST_PKMAP_MASK; 4362306a36Sopenharmony_ci return last_pkmap_nr_arr[color] + color; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic inline int no_more_pkmaps(unsigned int pkmap_nr, unsigned int color) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return pkmap_nr < DCACHE_N_COLORS; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline int get_pkmap_entries_count(unsigned int color) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci return LAST_PKMAP / DCACHE_N_COLORS; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciextern wait_queue_head_t pkmap_map_wait_arr[]; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci return pkmap_map_wait_arr + color; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cienum fixed_addresses kmap_local_map_idx(int type, unsigned long pfn); 6462306a36Sopenharmony_ci#define arch_kmap_local_map_idx kmap_local_map_idx 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cienum fixed_addresses kmap_local_unmap_idx(int type, unsigned long addr); 6762306a36Sopenharmony_ci#define arch_kmap_local_unmap_idx kmap_local_unmap_idx 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciextern pte_t *pkmap_page_table; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic inline void flush_cache_kmaps(void) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci flush_cache_all(); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define arch_kmap_local_post_unmap(vaddr) \ 7962306a36Sopenharmony_ci local_flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid kmap_init(void); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* CONFIG_HIGHMEM */ 8462306a36Sopenharmony_ci#endif 85