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