162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  arch/arm/include/asm/page.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1995-2003 Russell King
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef _ASMARM_PAGE_H
862306a36Sopenharmony_ci#define _ASMARM_PAGE_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* PAGE_SHIFT determines the page size */
1162306a36Sopenharmony_ci#define PAGE_SHIFT		12
1262306a36Sopenharmony_ci#define PAGE_SIZE		(_AC(1,UL) << PAGE_SHIFT)
1362306a36Sopenharmony_ci#define PAGE_MASK		(~((1 << PAGE_SHIFT) - 1))
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef __ASSEMBLY__
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef CONFIG_MMU
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <asm/page-nommu.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#else
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include <asm/glue.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci *	User Space Model
2762306a36Sopenharmony_ci *	================
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci *	This section selects the correct set of functions for dealing with
3062306a36Sopenharmony_ci *	page-based copying and clearing for user space for the particular
3162306a36Sopenharmony_ci *	processor(s) we're building for.
3262306a36Sopenharmony_ci *
3362306a36Sopenharmony_ci *	We have the following to choose from:
3462306a36Sopenharmony_ci *	  v4wt		- ARMv4 with writethrough cache, without minicache
3562306a36Sopenharmony_ci *	  v4wb		- ARMv4 with writeback cache, without minicache
3662306a36Sopenharmony_ci *	  v4_mc		- ARMv4 with minicache
3762306a36Sopenharmony_ci *	  xscale	- Xscale
3862306a36Sopenharmony_ci *	  xsc3		- XScalev3
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci#undef _USER
4162306a36Sopenharmony_ci#undef MULTI_USER
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WT
4462306a36Sopenharmony_ci# ifdef _USER
4562306a36Sopenharmony_ci#  define MULTI_USER 1
4662306a36Sopenharmony_ci# else
4762306a36Sopenharmony_ci#  define _USER v4wt
4862306a36Sopenharmony_ci# endif
4962306a36Sopenharmony_ci#endif
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WB
5262306a36Sopenharmony_ci# ifdef _USER
5362306a36Sopenharmony_ci#  define MULTI_USER 1
5462306a36Sopenharmony_ci# else
5562306a36Sopenharmony_ci#  define _USER v4wb
5662306a36Sopenharmony_ci# endif
5762306a36Sopenharmony_ci#endif
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FEROCEON
6062306a36Sopenharmony_ci# ifdef _USER
6162306a36Sopenharmony_ci#  define MULTI_USER 1
6262306a36Sopenharmony_ci# else
6362306a36Sopenharmony_ci#  define _USER feroceon
6462306a36Sopenharmony_ci# endif
6562306a36Sopenharmony_ci#endif
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FA
6862306a36Sopenharmony_ci# ifdef _USER
6962306a36Sopenharmony_ci#  define MULTI_USER 1
7062306a36Sopenharmony_ci# else
7162306a36Sopenharmony_ci#  define _USER fa
7262306a36Sopenharmony_ci# endif
7362306a36Sopenharmony_ci#endif
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#ifdef CONFIG_CPU_SA1100
7662306a36Sopenharmony_ci# ifdef _USER
7762306a36Sopenharmony_ci#  define MULTI_USER 1
7862306a36Sopenharmony_ci# else
7962306a36Sopenharmony_ci#  define _USER v4_mc
8062306a36Sopenharmony_ci# endif
8162306a36Sopenharmony_ci#endif
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#ifdef CONFIG_CPU_XSCALE
8462306a36Sopenharmony_ci# ifdef _USER
8562306a36Sopenharmony_ci#  define MULTI_USER 1
8662306a36Sopenharmony_ci# else
8762306a36Sopenharmony_ci#  define _USER xscale_mc
8862306a36Sopenharmony_ci# endif
8962306a36Sopenharmony_ci#endif
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci#ifdef CONFIG_CPU_XSC3
9262306a36Sopenharmony_ci# ifdef _USER
9362306a36Sopenharmony_ci#  define MULTI_USER 1
9462306a36Sopenharmony_ci# else
9562306a36Sopenharmony_ci#  define _USER xsc3_mc
9662306a36Sopenharmony_ci# endif
9762306a36Sopenharmony_ci#endif
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V6
10062306a36Sopenharmony_ci# define MULTI_USER 1
10162306a36Sopenharmony_ci#endif
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#if !defined(_USER) && !defined(MULTI_USER)
10462306a36Sopenharmony_ci#error Unknown user operations model
10562306a36Sopenharmony_ci#endif
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct page;
10862306a36Sopenharmony_cistruct vm_area_struct;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct cpu_user_fns {
11162306a36Sopenharmony_ci	void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr);
11262306a36Sopenharmony_ci	void (*cpu_copy_user_highpage)(struct page *to, struct page *from,
11362306a36Sopenharmony_ci			unsigned long vaddr, struct vm_area_struct *vma);
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_civoid fa_copy_user_highpage(struct page *to, struct page *from,
11762306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
11862306a36Sopenharmony_civoid fa_clear_user_highpage(struct page *page, unsigned long vaddr);
11962306a36Sopenharmony_civoid feroceon_copy_user_highpage(struct page *to, struct page *from,
12062306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
12162306a36Sopenharmony_civoid feroceon_clear_user_highpage(struct page *page, unsigned long vaddr);
12262306a36Sopenharmony_civoid v4_mc_copy_user_highpage(struct page *to, struct page *from,
12362306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
12462306a36Sopenharmony_civoid v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr);
12562306a36Sopenharmony_civoid v4wb_copy_user_highpage(struct page *to, struct page *from,
12662306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
12762306a36Sopenharmony_civoid v4wb_clear_user_highpage(struct page *page, unsigned long vaddr);
12862306a36Sopenharmony_civoid v4wt_copy_user_highpage(struct page *to, struct page *from,
12962306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
13062306a36Sopenharmony_civoid v4wt_clear_user_highpage(struct page *page, unsigned long vaddr);
13162306a36Sopenharmony_civoid xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
13262306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
13362306a36Sopenharmony_civoid xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr);
13462306a36Sopenharmony_civoid xscale_mc_copy_user_highpage(struct page *to, struct page *from,
13562306a36Sopenharmony_ci	unsigned long vaddr, struct vm_area_struct *vma);
13662306a36Sopenharmony_civoid xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr);
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#ifdef MULTI_USER
13962306a36Sopenharmony_ciextern struct cpu_user_fns cpu_user;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#define __cpu_clear_user_highpage	cpu_user.cpu_clear_user_highpage
14262306a36Sopenharmony_ci#define __cpu_copy_user_highpage	cpu_user.cpu_copy_user_highpage
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#else
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#define __cpu_clear_user_highpage	__glue(_USER,_clear_user_highpage)
14762306a36Sopenharmony_ci#define __cpu_copy_user_highpage	__glue(_USER,_copy_user_highpage)
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciextern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr);
15062306a36Sopenharmony_ciextern void __cpu_copy_user_highpage(struct page *to, struct page *from,
15162306a36Sopenharmony_ci			unsigned long vaddr, struct vm_area_struct *vma);
15262306a36Sopenharmony_ci#endif
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci#define clear_user_highpage(page,vaddr)		\
15562306a36Sopenharmony_ci	 __cpu_clear_user_highpage(page, vaddr)
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE
15862306a36Sopenharmony_ci#define copy_user_highpage(to,from,vaddr,vma)	\
15962306a36Sopenharmony_ci	__cpu_copy_user_highpage(to, from, vaddr, vma)
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci#define clear_page(page)	memset((void *)(page), 0, PAGE_SIZE)
16262306a36Sopenharmony_ciextern void copy_page(void *to, const void *from);
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci#ifdef CONFIG_KUSER_HELPERS
16562306a36Sopenharmony_ci#define __HAVE_ARCH_GATE_AREA 1
16662306a36Sopenharmony_ci#endif
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#ifdef CONFIG_ARM_LPAE
16962306a36Sopenharmony_ci#include <asm/pgtable-3level-types.h>
17062306a36Sopenharmony_ci#else
17162306a36Sopenharmony_ci#include <asm/pgtable-2level-types.h>
17262306a36Sopenharmony_ci#ifdef CONFIG_VMAP_STACK
17362306a36Sopenharmony_ci#define ARCH_PAGE_TABLE_SYNC_MASK	PGTBL_PMD_MODIFIED
17462306a36Sopenharmony_ci#endif
17562306a36Sopenharmony_ci#endif
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#endif /* CONFIG_MMU */
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_citypedef struct page *pgtable_t;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci#ifdef CONFIG_HAVE_ARCH_PFN_VALID
18262306a36Sopenharmony_ciextern int pfn_valid(unsigned long);
18362306a36Sopenharmony_ci#define pfn_valid pfn_valid
18462306a36Sopenharmony_ci#endif
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci#include <asm/memory.h>
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_TSK_EXEC
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci#include <asm-generic/getorder.h>
19362306a36Sopenharmony_ci#include <asm-generic/memory_model.h>
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci#endif
196