18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  arch/arm/include/asm/page.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Copyright (C) 1995-2003 Russell King
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#ifndef _ASMARM_PAGE_H
88c2ecf20Sopenharmony_ci#define _ASMARM_PAGE_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/* PAGE_SHIFT determines the page size */
118c2ecf20Sopenharmony_ci#define PAGE_SHIFT		12
128c2ecf20Sopenharmony_ci#define PAGE_SIZE		(_AC(1,UL) << PAGE_SHIFT)
138c2ecf20Sopenharmony_ci#define PAGE_MASK		(~((1 << PAGE_SHIFT) - 1))
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#ifndef CONFIG_MMU
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <asm/page-nommu.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#else
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#include <asm/glue.h>
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci/*
268c2ecf20Sopenharmony_ci *	User Space Model
278c2ecf20Sopenharmony_ci *	================
288c2ecf20Sopenharmony_ci *
298c2ecf20Sopenharmony_ci *	This section selects the correct set of functions for dealing with
308c2ecf20Sopenharmony_ci *	page-based copying and clearing for user space for the particular
318c2ecf20Sopenharmony_ci *	processor(s) we're building for.
328c2ecf20Sopenharmony_ci *
338c2ecf20Sopenharmony_ci *	We have the following to choose from:
348c2ecf20Sopenharmony_ci *	  v4wt		- ARMv4 with writethrough cache, without minicache
358c2ecf20Sopenharmony_ci *	  v4wb		- ARMv4 with writeback cache, without minicache
368c2ecf20Sopenharmony_ci *	  v4_mc		- ARMv4 with minicache
378c2ecf20Sopenharmony_ci *	  xscale	- Xscale
388c2ecf20Sopenharmony_ci *	  xsc3		- XScalev3
398c2ecf20Sopenharmony_ci */
408c2ecf20Sopenharmony_ci#undef _USER
418c2ecf20Sopenharmony_ci#undef MULTI_USER
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WT
448c2ecf20Sopenharmony_ci# ifdef _USER
458c2ecf20Sopenharmony_ci#  define MULTI_USER 1
468c2ecf20Sopenharmony_ci# else
478c2ecf20Sopenharmony_ci#  define _USER v4wt
488c2ecf20Sopenharmony_ci# endif
498c2ecf20Sopenharmony_ci#endif
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WB
528c2ecf20Sopenharmony_ci# ifdef _USER
538c2ecf20Sopenharmony_ci#  define MULTI_USER 1
548c2ecf20Sopenharmony_ci# else
558c2ecf20Sopenharmony_ci#  define _USER v4wb
568c2ecf20Sopenharmony_ci# endif
578c2ecf20Sopenharmony_ci#endif
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FEROCEON
608c2ecf20Sopenharmony_ci# ifdef _USER
618c2ecf20Sopenharmony_ci#  define MULTI_USER 1
628c2ecf20Sopenharmony_ci# else
638c2ecf20Sopenharmony_ci#  define _USER feroceon
648c2ecf20Sopenharmony_ci# endif
658c2ecf20Sopenharmony_ci#endif
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FA
688c2ecf20Sopenharmony_ci# ifdef _USER
698c2ecf20Sopenharmony_ci#  define MULTI_USER 1
708c2ecf20Sopenharmony_ci# else
718c2ecf20Sopenharmony_ci#  define _USER fa
728c2ecf20Sopenharmony_ci# endif
738c2ecf20Sopenharmony_ci#endif
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_SA1100
768c2ecf20Sopenharmony_ci# ifdef _USER
778c2ecf20Sopenharmony_ci#  define MULTI_USER 1
788c2ecf20Sopenharmony_ci# else
798c2ecf20Sopenharmony_ci#  define _USER v4_mc
808c2ecf20Sopenharmony_ci# endif
818c2ecf20Sopenharmony_ci#endif
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_XSCALE
848c2ecf20Sopenharmony_ci# ifdef _USER
858c2ecf20Sopenharmony_ci#  define MULTI_USER 1
868c2ecf20Sopenharmony_ci# else
878c2ecf20Sopenharmony_ci#  define _USER xscale_mc
888c2ecf20Sopenharmony_ci# endif
898c2ecf20Sopenharmony_ci#endif
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_XSC3
928c2ecf20Sopenharmony_ci# ifdef _USER
938c2ecf20Sopenharmony_ci#  define MULTI_USER 1
948c2ecf20Sopenharmony_ci# else
958c2ecf20Sopenharmony_ci#  define _USER xsc3_mc
968c2ecf20Sopenharmony_ci# endif
978c2ecf20Sopenharmony_ci#endif
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V6
1008c2ecf20Sopenharmony_ci# define MULTI_USER 1
1018c2ecf20Sopenharmony_ci#endif
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci#if !defined(_USER) && !defined(MULTI_USER)
1048c2ecf20Sopenharmony_ci#error Unknown user operations model
1058c2ecf20Sopenharmony_ci#endif
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cistruct page;
1088c2ecf20Sopenharmony_cistruct vm_area_struct;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistruct cpu_user_fns {
1118c2ecf20Sopenharmony_ci	void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr);
1128c2ecf20Sopenharmony_ci	void (*cpu_copy_user_highpage)(struct page *to, struct page *from,
1138c2ecf20Sopenharmony_ci			unsigned long vaddr, struct vm_area_struct *vma);
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci#ifdef MULTI_USER
1178c2ecf20Sopenharmony_ciextern struct cpu_user_fns cpu_user;
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci#define __cpu_clear_user_highpage	cpu_user.cpu_clear_user_highpage
1208c2ecf20Sopenharmony_ci#define __cpu_copy_user_highpage	cpu_user.cpu_copy_user_highpage
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci#else
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci#define __cpu_clear_user_highpage	__glue(_USER,_clear_user_highpage)
1258c2ecf20Sopenharmony_ci#define __cpu_copy_user_highpage	__glue(_USER,_copy_user_highpage)
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ciextern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr);
1288c2ecf20Sopenharmony_ciextern void __cpu_copy_user_highpage(struct page *to, struct page *from,
1298c2ecf20Sopenharmony_ci			unsigned long vaddr, struct vm_area_struct *vma);
1308c2ecf20Sopenharmony_ci#endif
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci#define clear_user_highpage(page,vaddr)		\
1338c2ecf20Sopenharmony_ci	 __cpu_clear_user_highpage(page, vaddr)
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE
1368c2ecf20Sopenharmony_ci#define copy_user_highpage(to,from,vaddr,vma)	\
1378c2ecf20Sopenharmony_ci	__cpu_copy_user_highpage(to, from, vaddr, vma)
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci#define clear_page(page)	memset((void *)(page), 0, PAGE_SIZE)
1408c2ecf20Sopenharmony_ciextern void copy_page(void *to, const void *from);
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci#ifdef CONFIG_KUSER_HELPERS
1438c2ecf20Sopenharmony_ci#define __HAVE_ARCH_GATE_AREA 1
1448c2ecf20Sopenharmony_ci#endif
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci#ifdef CONFIG_ARM_LPAE
1478c2ecf20Sopenharmony_ci#include <asm/pgtable-3level-types.h>
1488c2ecf20Sopenharmony_ci#else
1498c2ecf20Sopenharmony_ci#include <asm/pgtable-2level-types.h>
1508c2ecf20Sopenharmony_ci#endif
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#endif /* CONFIG_MMU */
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_citypedef struct page *pgtable_t;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_ARCH_PFN_VALID
1578c2ecf20Sopenharmony_ciextern int pfn_valid(unsigned long);
1588c2ecf20Sopenharmony_ci#endif
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci#include <asm/memory.h>
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci#endif /* !__ASSEMBLY__ */
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_TSK_EXEC
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci#include <asm-generic/getorder.h>
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci#endif
169